/ Hex Artifact Content
Login

Artifact 5934a9f5a328488cca392766bb841ff41c9083a9:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 20 65 78 74 65  mplements a exte
0190: 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65 64  rnal (disk-based
01a0: 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  ) database using
01b0: 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65 20   BTrees..** See 
01c0: 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
01d0: 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74 2e  nt on "btreeInt.
01e0: 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  h" for additiona
01f0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
0200: 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64 65  * Including a de
0210: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69 6c  scription of fil
0220: 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e 20  e format and an 
0230: 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65 72  overview of oper
0240: 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  ation..*/.#inclu
0250: 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22 0a  de "btreeInt.h".
0260: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64 65  ./*.** The heade
0270: 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61 70  r string that ap
0280: 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65 67  pears at the beg
0290: 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79 0a  inning of every.
02a0: 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ** SQLite databa
02b0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  se..*/.static co
02c0: 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63 48  nst char zMagicH
02d0: 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54 45  eader[] = SQLITE
02e0: 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a 2f  _FILE_HEADER;../
02f0: 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67 6c  *.** Set this gl
0300: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74 6f  obal variable to
0310: 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72 61   1 to enable tra
0320: 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20 54  cing using the T
0330: 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a 2a  RACE.** macro..*
0340: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
0350: 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31 3b  te3BtreeTrace=1;
0360: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
0370: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
0380: 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58 29   define TRACE(X)
0390: 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72 65    if(sqlite3Btre
03a0: 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20 58  eTrace){printf X
03b0: 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b  ;fflush(stdout);
03c0: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
03d0: 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66   TRACE(X).#endif
03e0: 0a 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ....#ifndef SQLI
03f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0400: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0410: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0420: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0430: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0440: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0450: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0460: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0470: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0480: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0490: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
04a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
04b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
04c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
04d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
04e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
04f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0500: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0510: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0520: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0530: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0540: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0550: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0560: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0570: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0580: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0590: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
05a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
05b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
05c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
05d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
05e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
05f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0600: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0610: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0620: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0630: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0640: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0650: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0660: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0670: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0680: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0690: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
06a0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
06b0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
06c0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
06d0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
06e0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
06f0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0700: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0710: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0720: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0730: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0740: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0750: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0760: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0770: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0780: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0790: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
07a0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
07b0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
07c0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
07d0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
07e0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
07f0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0800: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0810: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0820: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0830: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0840: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0850: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0860: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0870: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0880: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0890: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
08a0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
08b0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
08c0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
08d0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
08e0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
08f0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0900: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0910: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0920: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0930: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0940: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0950: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0960: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0970: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0980: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0990: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
09a0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
09b0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
09c0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
09d0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
09e0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
09f0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0a00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0a10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0a20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0a30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0a40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0a50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0a60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0a70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0a80: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0a90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0aa0: 44 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20  D_CACHE..#ifdef 
0ab0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
0ac0: 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  **** This functi
0ad0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
0ae0: 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73  as part of an as
0af0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
0b00: 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63  . ***.**.** Chec
0b10: 6b 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72  k to see if pBtr
0b20: 65 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71  ee holds the req
0b30: 75 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72  uired locks to r
0b40: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20  ead or write to 
0b50: 74 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69  the .** table wi
0b60: 74 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f  th root page iRo
0b70: 6f 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69  ot.   Return 1 i
0b80: 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20  f it does and 0 
0b90: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  if not..**.** Fo
0ba0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
0bb0: 77 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62  writing to a tab
0bc0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
0bd0: 65 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20  e iRoot via .** 
0be0: 42 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  Btree connection
0bf0: 20 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20   pBtree:.**.**  
0c00: 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
0c10: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0c20: 6b 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c  k(pBtree, iRoot,
0c30: 20 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20   0, WRITE_LOCK) 
0c40: 29 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72  );.**.** When wr
0c50: 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65  iting to an inde
0c60: 78 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69  x that resides i
0c70: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74  n a sharable dat
0c80: 61 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63  abase, the .** c
0c90: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76  aller should hav
0ca0: 65 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64  e first obtained
0cb0: 20 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69   a lock specifyi
0cc0: 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ng the root page
0cd0: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   of.** the corre
0ce0: 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20  sponding table. 
0cf0: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67  This makes thing
0d00: 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d  s a bit more com
0d10: 70 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20  plicated,.** as 
0d20: 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61  this module trea
0d30: 74 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73  ts each table as
0d40: 20 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75   a separate stru
0d50: 63 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d  cture. To determ
0d60: 69 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ine.** the table
0d70: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
0d80: 6f 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  o the index bein
0d90: 67 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a  g written, this.
0da0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
0db0: 74 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67  to search throug
0dc0: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  h the database s
0dd0: 63 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73  chema..**.** Ins
0de0: 74 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f  tead of a lock o
0df0: 6e 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  n the table/inde
0e00: 78 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  x rooted at page
0e10: 20 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c   iRoot, the call
0e20: 65 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61  er may.** hold a
0e30: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
0e40: 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20  he schema table 
0e50: 28 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54  (root page 1). T
0e60: 68 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61  his is also.** a
0e70: 63 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  cceptable..*/.st
0e80: 61 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72  atic int hasShar
0e90: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0ea0: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
0eb0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61  e,         /* Ha
0ec0: 6e 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68  ndle that must h
0ed0: 6f 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67  old lock */.  Pg
0ee0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
0ef0: 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
0f00: 65 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20  e of b-tree */. 
0f10: 20 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20   int isIndex,   
0f20: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
0f30: 69 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20  if iRoot is the 
0f40: 72 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  root of an index
0f50: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
0f60: 20 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20   eLockType      
0f70: 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
0f80: 6c 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f  lock type (READ_
0f90: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
0fa0: 43 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65  CK) */.){.  Sche
0fb0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53  ma *pSchema = (S
0fc0: 63 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e  chema *)pBtree->
0fd0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  pBt->pSchema;.  
0fe0: 50 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20  Pgno iTab = 0;. 
0ff0: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
1000: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
1010: 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68  tabase is not sh
1020: 61 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74  areable, or if t
1030: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1040: 64 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61  ding.  ** and ha
1050: 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  s the read-uncom
1060: 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c  mitted flag set,
1070: 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73   then no lock is
1080: 20 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a   required. .  **
1090: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d   Return true imm
10a0: 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
10b0: 20 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68   if( (pBtree->sh
10c0: 61 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c  arable==0).   ||
10d0: 20 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41   (eLockType==REA
10e0: 44 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65  D_LOCK && (pBtre
10f0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1100: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1110: 69 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20  itted)).  ){.   
1120: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
1130: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65    /* If the clie
1140: 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f  nt is reading  o
1150: 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64  r writing an ind
1160: 65 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d  ex and the schem
1170: 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f  a is.  ** not lo
1180: 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73  aded, then it is
1190: 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74   too difficult t
11a0: 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b  o actually check
11b0: 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20   to see if.  ** 
11c0: 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
11d0: 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20  s are held.  So 
11e0: 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20  do not bother - 
11f0: 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65  just return true
1200: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65  ..  ** This case
1210: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75   does not come u
1220: 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79  p very often any
1230: 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  how..  */.  if( 
1240: 69 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63  isIndex && (!pSc
1250: 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61  hema || (pSchema
1260: 2d 3e 66 6c 61 67 73 26 44 42 5f 53 63 68 65 6d  ->flags&DB_Schem
1270: 61 4c 6f 61 64 65 64 29 3d 3d 30 29 20 29 7b 0a  aLoaded)==0) ){.
1280: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1290: 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  }..  /* Figure o
12a0: 75 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  ut the root-page
12b0: 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b 20 73   that the lock s
12c0: 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 6f 6e  hould be held on
12d0: 2e 20 46 6f 72 20 74 61 62 6c 65 0a 20 20 2a 2a  . For table.  **
12e0: 20 62 2d 74 72 65 65 73 2c 20 74 68 69 73 20 69   b-trees, this i
12f0: 73 20 6a 75 73 74 20 74 68 65 20 72 6f 6f 74 20  s just the root 
1300: 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72  page of the b-tr
1310: 65 65 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72  ee being read or
1320: 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 2e 20 46  .  ** written. F
1330: 6f 72 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73  or index b-trees
1340: 2c 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74  , it is the root
1350: 20 70 61 67 65 20 6f 66 20 74 68 65 20 61 73 73   page of the ass
1360: 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 74 61 62  ociated.  ** tab
1370: 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  le.  */.  if( is
1380: 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 48 61 73  Index ){.    Has
1390: 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 66 6f  hElem *p;.    fo
13a0: 72 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(p=sqliteHashFi
13b0: 72 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 69 64  rst(&pSchema->id
13c0: 78 48 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c  xHash); p; p=sql
13d0: 69 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b  iteHashNext(p)){
13e0: 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49  .      Index *pI
13f0: 64 78 20 3d 20 28 49 6e 64 65 78 20 2a 29 73 71  dx = (Index *)sq
1400: 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 29 3b  liteHashData(p);
1410: 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
1420: 3e 74 6e 75 6d 3d 3d 28 69 6e 74 29 69 52 6f 6f  >tnum==(int)iRoo
1430: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54 61  t ){.        iTa
1440: 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  b = pIdx->pTable
1450: 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a  ->tnum;.      }.
1460: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1470: 20 20 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b     iTab = iRoot;
1480: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63  .  }..  /* Searc
1490: 68 20 66 6f 72 20 74 68 65 20 72 65 71 75 69 72  h for the requir
14a0: 65 64 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20  ed lock. Either 
14b0: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
14c0: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20  root-page iTab, 
14d0: 61 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f  a .  ** write-lo
14e0: 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61  ck on the schema
14f0: 20 74 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74   table, or (if t
1500: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1510: 64 69 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61  ding) a.  ** rea
1520: 64 2d 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77  d-lock on iTab w
1530: 69 6c 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74  ill suffice. Ret
1540: 75 72 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20  urn 1 if any of 
1550: 74 68 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e  these are found.
1560: 20 20 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b    */.  for(pLock
1570: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c  =pBtree->pBt->pL
1580: 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63  ock; pLock; pLoc
1590: 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b  k=pLock->pNext){
15a0: 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e  .    if( pLock->
15b0: 70 42 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a  pBtree==pBtree .
15c0: 20 20 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e       && (pLock->
15d0: 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20  iTable==iTab || 
15e0: 28 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57  (pLock->eLock==W
15f0: 52 49 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f  RITE_LOCK && pLo
1600: 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a  ck->iTable==1)).
1610: 20 20 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65       && pLock->e
1620: 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20  Lock>=eLockType 
1630: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
1640: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1650: 7d 0a 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74  }..  /* Failed t
1660: 6f 20 66 69 6e 64 20 74 68 65 20 72 65 71 75 69  o find the requi
1670: 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72  red lock. */.  r
1680: 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
1690: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
16a0: 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  G */..#ifdef SQL
16b0: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a  ITE_DEBUG./*.***
16c0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
16d0: 6d 61 79 20 62 65 20 75 73 65 64 20 61 73 20 70  may be used as p
16e0: 61 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20  art of assert() 
16f0: 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e  statements only.
1700: 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75   ****.**.** Retu
1710: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 77 6f  rn true if it wo
1720: 75 6c 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66  uld be illegal f
1730: 6f 72 20 70 42 74 72 65 65 20 74 6f 20 77 72 69  or pBtree to wri
1740: 74 65 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74  te into the.** t
1750: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f  able or index ro
1760: 6f 74 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65  oted at iRoot be
1770: 63 61 75 73 65 20 6f 74 68 65 72 20 73 68 61 72  cause other shar
1780: 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  ed connections a
1790: 72 65 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f  re.** simultaneo
17a0: 75 73 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61  usly reading tha
17b0: 74 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20  t same table or 
17c0: 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  index..**.** It 
17d0: 69 73 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70  is illegal for p
17e0: 42 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69  Btree to write i
17f0: 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72  f some other Btr
1800: 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a  ee object that.*
1810: 2a 20 73 68 61 72 65 73 20 74 68 65 20 73 61 6d  * shares the sam
1820: 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  e BtShared objec
1830: 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72  t is currently r
1840: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
1850: 67 0a 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74  g.** the iRoot t
1860: 61 62 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69  able.  Except, i
1870: 66 20 74 68 65 20 6f 74 68 65 72 20 42 74 72 65  f the other Btre
1880: 65 20 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65  e object has the
1890: 0a 2a 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69  .** read-uncommi
18a0: 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74  tted flag set, t
18b0: 68 65 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72  hen it is OK for
18c0: 20 74 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63   the other objec
18d0: 74 20 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72  t to.** have a r
18e0: 65 61 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  ead cursor..**.*
18f0: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62  * For example, b
1900: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f  efore writing to
1910: 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65   any part of the
1920: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a   table or index.
1930: 2a 2a 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67  ** rooted at pag
1940: 65 20 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f  e iRoot, one sho
1950: 75 6c 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20  uld call:.**.** 
1960: 20 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52     assert( !hasR
1970: 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74  eadConflicts(pBt
1980: 72 65 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a  ree, iRoot) );.*
1990: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73  /.static int has
19a0: 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74  ReadConflicts(Bt
19b0: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e  ree *pBtree, Pgn
19c0: 6f 20 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75  o iRoot){.  BtCu
19d0: 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70  rsor *p;.  for(p
19e0: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43  =pBtree->pBt->pC
19f0: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
1a00: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
1a10: 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f  ->pgnoRoot==iRoo
1a20: 74 20 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42  t .     && p->pB
1a30: 74 72 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20  tree!=pBtree.   
1a40: 20 20 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72    && 0==(p->pBtr
1a50: 65 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  ee->db->flags & 
1a60: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
1a70: 6d 69 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20  mitted).    ){. 
1a80: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1a90: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1aa0: 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20  n 0;.}.#endif   
1ab0: 20 2f 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54   /* #ifdef SQLIT
1ac0: 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a  E_DEBUG */../*.*
1ad0: 2a 20 51 75 65 72 79 20 74 6f 20 73 65 65 20 69  * Query to see i
1ae0: 66 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70  f Btree handle p
1af0: 20 6d 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f   may obtain a lo
1b00: 63 6b 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b  ck of type eLock
1b10: 20 0a 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20   .** (READ_LOCK 
1b20: 6f 72 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f  or WRITE_LOCK) o
1b30: 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  n the table with
1b40: 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e   root-page iTab.
1b50: 20 52 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54   Return.** SQLIT
1b60: 45 5f 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b  E_OK if the lock
1b70: 20 6d 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64   may be obtained
1b80: 20 28 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   (by calling.** 
1b90: 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61  setSharedCacheTa
1ba0: 62 6c 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53  bleLock()), or S
1bb0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20  QLITE_LOCKED if 
1bc0: 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  not..*/.static i
1bd0: 6e 74 20 71 75 65 72 79 53 68 61 72 65 64 43 61  nt querySharedCa
1be0: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72  cheTableLock(Btr
1bf0: 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62  ee *p, Pgno iTab
1c00: 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42  , u8 eLock){.  B
1c10: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1c20: 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20  ->pBt;.  BtLock 
1c30: 2a 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72  *pIter;..  asser
1c40: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
1c50: 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
1c60: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
1c70: 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  =READ_LOCK || eL
1c80: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
1c90: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
1ca0: 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  db!=0 );.  asser
1cb0: 74 28 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67  t( !(p->db->flag
1cc0: 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63  s&SQLITE_ReadUnc
1cd0: 6f 6d 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b  ommitted)||eLock
1ce0: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54  ==WRITE_LOCK||iT
1cf0: 61 62 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a  ab==1 );.  .  /*
1d00: 20 49 66 20 72 65 71 75 65 73 74 69 6e 67 20 61   If requesting a
1d10: 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65   write-lock, the
1d20: 6e 20 74 68 65 20 42 74 72 65 65 20 6d 75 73 74  n the Btree must
1d30: 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72   have an open wr
1d40: 69 74 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63  ite.  ** transac
1d50: 74 69 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c  tion on this fil
1d60: 65 2e 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c  e. And, obviousl
1d70: 79 2c 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62  y, for this to b
1d80: 65 20 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a  e so there .  **
1d90: 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e   must be an open
1da0: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
1db0: 6f 6e 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69  on on the file i
1dc0: 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73  tself..  */.  as
1dd0: 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41  sert( eLock==REA
1de0: 44 5f 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42  D_LOCK || (p==pB
1df0: 74 2d 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d  t->pWriter && p-
1e00: 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1e10: 57 52 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65  WRITE) );.  asse
1e20: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
1e30: 4c 4f 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54  LOCK || pBt->inT
1e40: 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
1e50: 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20  S_WRITE );.  .  
1e60: 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
1e70: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
1e80: 65 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 69  e shared-cache i
1e90: 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f  s not enabled */
1ea0: 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61  .  if( !p->shara
1eb0: 62 6c 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ble ){.    retur
1ec0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1ed0: 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f  ..  /* If some o
1ee0: 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
1ef0: 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78  is holding an ex
1f00: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68  clusive lock, th
1f10: 65 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64  e.  ** requested
1f20: 20 6c 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65   lock may not be
1f30: 20 6f 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a   obtained..  */.
1f40: 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74    if( pBt->pWrit
1f50: 65 72 21 3d 70 20 26 26 20 70 42 74 2d 3e 69 73  er!=p && pBt->is
1f60: 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20  Exclusive ){.   
1f70: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
1f80: 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
1f90: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
1fa0: 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  b);.    return S
1fb0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
1fc0: 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20  REDCACHE;.  }.. 
1fd0: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
1fe0: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
1ff0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
2000: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ){.    /* The co
2010: 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d 3e  ndition (pIter->
2020: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e  eLock!=eLock) in
2030: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
2040: 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20 73  f(...) .    ** s
2050: 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73 69  tatement is a si
2060: 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66 3a  mplification of:
2070: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2080: 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c   (eLock==WRITE_L
2090: 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c  OCK || pIter->eL
20a0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 29  ock==WRITE_LOCK)
20b0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73  .    **.    ** s
20c0: 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61  ince we know tha
20d0: 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  t if eLock==WRIT
20e0: 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f 20  E_LOCK, then no 
20f0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2100: 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c 64  .    ** may hold
2110: 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e   a WRITE_LOCK on
2120: 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74 68   any table in th
2130: 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20 74  is file (since t
2140: 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a 20  here can.    ** 
2150: 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65  only be a single
2160: 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a 2f   writer)..    */
2170: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
2180: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  er->eLock==READ_
2190: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
21a0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
21b0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
21c0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
21d0: 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72 65   || pIter->pBtre
21e0: 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e 65  e==p || pIter->e
21f0: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29  Lock==READ_LOCK)
2200: 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
2210: 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49  >pBtree!=p && pI
2220: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
2230: 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f 63  b && pIter->eLoc
2240: 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k!=eLock ){.    
2250: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2260: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
2270: 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  , pIter->pBtree-
2280: 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
2290: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
22a0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
22b0: 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57 72  ert( p==pBt->pWr
22c0: 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20  iter );.        
22d0: 70 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 3d  pBt->isPending =
22e0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
22f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2300: 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43  LOCKED_SHAREDCAC
2310: 48 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  HE;.    }.  }.  
2320: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2330: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53  ;.}.#endif /* !S
2340: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
2350: 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e  D_CACHE */..#ifn
2360: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2370: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a  SHARED_CACHE./*.
2380: 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20 6f 6e  ** Add a lock on
2390: 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
23a0: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65  root-page iTable
23b0: 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62   to the shared-b
23c0: 74 72 65 65 20 75 73 65 64 0a 2a 2a 20 62 79 20  tree used.** by 
23d0: 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 2e 20  Btree handle p. 
23e0: 50 61 72 61 6d 65 74 65 72 20 65 4c 6f 63 6b 20  Parameter eLock 
23f0: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 52  must be either R
2400: 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a 2a 20  EAD_LOCK or .** 
2410: 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  WRITE_LOCK..**.*
2420: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2430: 61 73 73 75 6d 65 73 20 74 68 65 20 66 6f 6c 6c  assumes the foll
2440: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 28  owing:.**.**   (
2450: 61 29 20 54 68 65 20 73 70 65 63 69 66 69 65 64  a) The specified
2460: 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 70 20   Btree object p 
2470: 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20  is connected to 
2480: 61 20 73 68 61 72 61 62 6c 65 0a 2a 2a 20 20 20  a sharable.**   
2490: 20 20 20 20 64 61 74 61 62 61 73 65 20 28 6f 6e      database (on
24a0: 65 20 77 69 74 68 20 74 68 65 20 42 74 53 68 61  e with the BtSha
24b0: 72 65 64 2e 73 68 61 72 61 62 6c 65 20 66 6c 61  red.sharable fla
24c0: 67 20 73 65 74 29 2c 20 61 6e 64 0a 2a 2a 0a 2a  g set), and.**.*
24d0: 2a 20 20 20 28 62 29 20 4e 6f 20 6f 74 68 65 72  *   (b) No other
24e0: 20 42 74 72 65 65 20 6f 62 6a 65 63 74 73 20 68   Btree objects h
24f0: 6f 6c 64 20 61 20 6c 6f 63 6b 20 74 68 61 74 20  old a lock that 
2500: 63 6f 6e 66 6c 69 63 74 73 0a 2a 2a 20 20 20 20  conflicts.**    
2510: 20 20 20 77 69 74 68 20 74 68 65 20 72 65 71 75     with the requ
2520: 65 73 74 65 64 20 6c 6f 63 6b 20 28 69 2e 65 2e  ested lock (i.e.
2530: 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68   querySharedCach
2540: 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20 68 61 73  eTableLock() has
2550: 0a 2a 2a 20 20 20 20 20 20 20 61 6c 72 65 61 64  .**       alread
2560: 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 61 6e  y been called an
2570: 64 20 72 65 74 75 72 6e 65 64 20 53 51 4c 49 54  d returned SQLIT
2580: 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  E_OK)..**.** SQL
2590: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
25a0: 65 64 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69  ed if the lock i
25b0: 73 20 61 64 64 65 64 20 73 75 63 63 65 73 73 66  s added successf
25c0: 75 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 4e 4f 4d  ully. SQLITE_NOM
25d0: 45 4d 20 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  EM .** is return
25e0: 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 61  ed if a malloc a
25f0: 74 74 65 6d 70 74 20 66 61 69 6c 73 2e 0a 2a 2f  ttempt fails..*/
2600: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74 53  .static int setS
2610: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
2620: 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67  ock(Btree *p, Pg
2630: 6e 6f 20 69 54 61 62 6c 65 2c 20 75 38 20 65 4c  no iTable, u8 eL
2640: 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64  ock){.  BtShared
2650: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
2660: 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20    BtLock *pLock 
2670: 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  = 0;.  BtLock *p
2680: 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Iter;..  assert(
2690: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
26a0: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
26b0: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
26c0: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  EAD_LOCK || eLoc
26d0: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
26e0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
26f0: 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 63  !=0 );..  /* A c
2700: 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 74  onnection with t
2710: 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74  he read-uncommit
2720: 74 65 64 20 66 6c 61 67 20 73 65 74 20 77 69 6c  ted flag set wil
2730: 6c 20 6e 65 76 65 72 20 74 72 79 20 74 6f 0a 20  l never try to. 
2740: 20 2a 2a 20 6f 62 74 61 69 6e 20 61 20 72 65 61   ** obtain a rea
2750: 64 2d 6c 6f 63 6b 20 75 73 69 6e 67 20 74 68 69  d-lock using thi
2760: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20  s function. The 
2770: 6f 6e 6c 79 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  only read-lock o
2780: 62 74 61 69 6e 65 64 0a 20 20 2a 2a 20 62 79 20  btained.  ** by 
2790: 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20  a connection in 
27a0: 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64  read-uncommitted
27b0: 20 6d 6f 64 65 20 69 73 20 6f 6e 20 74 68 65 20   mode is on the 
27c0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 0a 20  sqlite_master . 
27d0: 20 2a 2a 20 74 61 62 6c 65 2c 20 61 6e 64 20 74   ** table, and t
27e0: 68 61 74 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61  hat lock is obta
27f0: 69 6e 65 64 20 69 6e 20 42 74 72 65 65 42 65 67  ined in BtreeBeg
2800: 69 6e 54 72 61 6e 73 28 29 2e 20 20 2a 2f 0a 20  inTrans().  */. 
2810: 20 61 73 73 65 72 74 28 20 30 3d 3d 28 70 2d 3e   assert( 0==(p->
2820: 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  db->flags&SQLITE
2830: 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64  _ReadUncommitted
2840: 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  ) || eLock==WRIT
2850: 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20  E_LOCK );..  /* 
2860: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  This function sh
2870: 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c  ould only be cal
2880: 6c 65 64 20 6f 6e 20 61 20 73 68 61 72 61 62 6c  led on a sharabl
2890: 65 20 62 2d 74 72 65 65 20 61 66 74 65 72 20 69  e b-tree after i
28a0: 74 20 0a 20 20 2a 2a 20 68 61 73 20 62 65 65 6e  t .  ** has been
28b0: 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74   determined that
28c0: 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74 72 65 65   no other b-tree
28d0: 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66 6c 69 63   holds a conflic
28e0: 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20  ting lock.  */. 
28f0: 20 61 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72   assert( p->shar
2900: 61 62 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74  able );.  assert
2910: 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71 75 65  ( SQLITE_OK==que
2920: 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62  rySharedCacheTab
2930: 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65  leLock(p, iTable
2940: 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20 20 2f  , eLock) );..  /
2950: 2a 20 46 69 72 73 74 20 73 65 61 72 63 68 20 74  * First search t
2960: 68 65 20 6c 69 73 74 20 66 6f 72 20 61 6e 20 65  he list for an e
2970: 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20 6f 6e 20  xisting lock on 
2980: 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20  this table. */. 
2990: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
29a0: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
29b0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
29c0: 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  ){.    if( pIter
29d0: 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65  ->iTable==iTable
29e0: 20 26 26 20 70 49 74 65 72 2d 3e 70 42 74 72 65   && pIter->pBtre
29f0: 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 70 4c  e==p ){.      pL
2a00: 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a 20 20 20  ock = pIter;.   
2a10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2a20: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
2a30: 20 61 62 6f 76 65 20 73 65 61 72 63 68 20 64 69   above search di
2a40: 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 42 74 4c  d not find a BtL
2a50: 6f 63 6b 20 73 74 72 75 63 74 20 61 73 73 6f 63  ock struct assoc
2a60: 69 61 74 69 6e 67 20 42 74 72 65 65 20 70 0a 20  iating Btree p. 
2a70: 20 2a 2a 20 77 69 74 68 20 74 61 62 6c 65 20 69   ** with table i
2a80: 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61 74 65 20  Table, allocate 
2a90: 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20 69 74 20  one and link it 
2aa0: 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e 0a 20  into the list.. 
2ab0: 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c 6f 63 6b   */.  if( !pLock
2ac0: 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20 3d 20   ){.    pLock = 
2ad0: 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c 69 74 65  (BtLock *)sqlite
2ae0: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65  3MallocZero(size
2af0: 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20 20 20  of(BtLock));.   
2b00: 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20   if( !pLock ){. 
2b10: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2b20: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
2b30: 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c      pLock->iTabl
2b40: 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20  e = iTable;.    
2b50: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 3d 20  pLock->pBtree = 
2b60: 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e  p;.    pLock->pN
2b70: 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b  ext = pBt->pLock
2b80: 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b  ;.    pBt->pLock
2b90: 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20   = pLock;.  }.. 
2ba0: 20 2f 2a 20 53 65 74 20 74 68 65 20 42 74 4c 6f   /* Set the BtLo
2bb0: 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c  ck.eLock variabl
2bc0: 65 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d  e to the maximum
2bd0: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
2be0: 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 74 68  lock.  ** and th
2bf0: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
2c00: 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20  . This means if 
2c10: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 61 73  a write-lock was
2c20: 20 61 6c 72 65 61 64 79 20 68 65 6c 64 0a 20 20   already held.  
2c30: 2a 2a 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f  ** and a read-lo
2c40: 63 6b 20 72 65 71 75 65 73 74 65 64 2c 20 77 65  ck requested, we
2c50: 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63 74   don't incorrect
2c60: 6c 79 20 64 6f 77 6e 67 72 61 64 65 20 74 68 65  ly downgrade the
2c70: 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73   lock..  */.  as
2c80: 73 65 72 74 28 20 57 52 49 54 45 5f 4c 4f 43 4b  sert( WRITE_LOCK
2c90: 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  >READ_LOCK );.  
2ca0: 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d  if( eLock>pLock-
2cb0: 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c  >eLock ){.    pL
2cc0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f  ock->eLock = eLo
2cd0: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ck;.  }..  retur
2ce0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
2cf0: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
2d00: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
2d10: 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  HE */..#ifndef S
2d20: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
2d30: 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65  D_CACHE./*.** Re
2d40: 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20 74 61  lease all the ta
2d50: 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73  ble locks (locks
2d60: 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20 63 61   obtained via ca
2d70: 6c 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20 73 65  lls to.** the se
2d80: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2d90: 65 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64 75 72  eLock() procedur
2da0: 65 29 20 68 65 6c 64 20 62 79 20 42 74 72 65 65  e) held by Btree
2db0: 20 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a 0a 2a 2a   object p..**.**
2dc0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
2dd0: 73 73 75 6d 65 73 20 74 68 61 74 20 42 74 72 65  ssumes that Btre
2de0: 65 20 70 20 68 61 73 20 61 6e 20 6f 70 65 6e 20  e p has an open 
2df0: 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 0a 2a  read or write .*
2e00: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49  * transaction. I
2e10: 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c 20 74  f it does not, t
2e20: 68 65 6e 20 74 68 65 20 42 74 53 68 61 72 65 64  hen the BtShared
2e30: 2e 69 73 50 65 6e 64 69 6e 67 20 76 61 72 69 61  .isPending varia
2e40: 62 6c 65 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e  ble.** may be in
2e50: 63 6f 72 72 65 63 74 6c 79 20 63 6c 65 61 72 65  correctly cleare
2e60: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
2e70: 64 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64  d clearAllShared
2e80: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28  CacheTableLocks(
2e90: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
2ea0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2eb0: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a  pBt;.  BtLock **
2ec0: 70 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70  ppIter = &pBt->p
2ed0: 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28  Lock;..  assert(
2ee0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2ef0: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
2f00: 61 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61  assert( p->shara
2f10: 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65  ble || 0==*ppIte
2f20: 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
2f30: 2d 3e 69 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a  ->inTrans>0 );..
2f40: 20 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72    while( *ppIter
2f50: 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a   ){.    BtLock *
2f60: 70 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b  pLock = *ppIter;
2f70: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
2f80: 2d 3e 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30  ->isExclusive==0
2f90: 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72   || pBt->pWriter
2fa0: 3d 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20  ==pLock->pBtree 
2fb0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2fc0: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e  Lock->pBtree->in
2fd0: 54 72 61 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c  Trans>=pLock->eL
2fe0: 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ock );.    if( p
2ff0: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Lock->pBtree==p 
3000: 29 7b 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72  ){.      *ppIter
3010: 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b   = pLock->pNext;
3020: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
3030: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20  Lock->iTable!=1 
3040: 7c 7c 20 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f  || pLock==&p->lo
3050: 63 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ck );.      if( 
3060: 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31  pLock->iTable!=1
3070: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
3080: 74 65 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b  te3_free(pLock);
3090: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
30a0: 73 65 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72  se{.      ppIter
30b0: 20 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74   = &pLock->pNext
30c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  ;.    }.  }..  a
30d0: 73 73 65 72 74 28 20 70 42 74 2d 3e 69 73 50 65  ssert( pBt->isPe
30e0: 6e 64 69 6e 67 3d 3d 30 20 7c 7c 20 70 42 74 2d  nding==0 || pBt-
30f0: 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20 69 66  >pWriter );.  if
3100: 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d  ( pBt->pWriter==
3110: 70 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57  p ){.    pBt->pW
3120: 72 69 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70  riter = 0;.    p
3130: 42 74 2d 3e 69 73 45 78 63 6c 75 73 69 76 65 20  Bt->isExclusive 
3140: 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 73  = 0;.    pBt->is
3150: 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 7d  Pending = 0;.  }
3160: 65 6c 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54  else if( pBt->nT
3170: 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b  ransaction==2 ){
3180: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  .    /* This fun
3190: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
31a0: 77 68 65 6e 20 42 74 72 65 65 20 70 20 69 73 20  when Btree p is 
31b0: 63 6f 6e 63 6c 75 64 69 6e 67 20 69 74 73 20 0a  concluding its .
31c0: 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
31d0: 6f 6e 2e 20 49 66 20 74 68 65 72 65 20 63 75 72  on. If there cur
31e0: 72 65 6e 74 6c 79 20 65 78 69 73 74 73 20 61 20  rently exists a 
31f0: 77 72 69 74 65 72 2c 20 61 6e 64 20 70 20 69 73  writer, and p is
3200: 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 74 68 61 74   not.    ** that
3210: 20 77 72 69 74 65 72 2c 20 74 68 65 6e 20 74 68   writer, then th
3220: 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b  e number of lock
3230: 73 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63  s held by connec
3240: 74 69 6f 6e 73 20 6f 74 68 65 72 0a 20 20 20 20  tions other.    
3250: 2a 2a 20 74 68 61 6e 20 74 68 65 20 77 72 69 74  ** than the writ
3260: 65 72 20 6d 75 73 74 20 62 65 20 61 62 6f 75 74  er must be about
3270: 20 74 6f 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f   to drop to zero
3280: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 20  . In this case. 
3290: 20 20 20 2a 2a 20 73 65 74 20 74 68 65 20 69 73     ** set the is
32a0: 50 65 6e 64 69 6e 67 20 66 6c 61 67 20 74 6f 20  Pending flag to 
32b0: 30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  0..    **.    **
32c0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74   If there is not
32d0: 20 63 75 72 72 65 6e 74 6c 79 20 61 20 77 72 69   currently a wri
32e0: 74 65 72 2c 20 74 68 65 6e 20 42 74 53 68 61 72  ter, then BtShar
32f0: 65 64 2e 69 73 50 65 6e 64 69 6e 67 20 6d 75 73  ed.isPending mus
3300: 74 0a 20 20 20 20 2a 2a 20 62 65 20 7a 65 72 6f  t.    ** be zero
3310: 20 61 6c 72 65 61 64 79 2e 20 53 6f 20 74 68 69   already. So thi
3320: 73 20 6e 65 78 74 20 6c 69 6e 65 20 69 73 20 68  s next line is h
3330: 61 72 6d 6c 65 73 73 20 69 6e 20 74 68 61 74 20  armless in that 
3340: 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  case..    */.   
3350: 20 70 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20   pBt->isPending 
3360: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
3370: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
3380: 63 68 61 6e 67 65 73 20 61 6c 6c 20 77 72 69 74  changes all writ
3390: 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  e-locks held by 
33a0: 42 74 72 65 65 20 70 20 69 6e 74 6f 20 72 65 61  Btree p into rea
33b0: 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74  d-locks..*/.stat
33c0: 69 63 20 76 6f 69 64 20 64 6f 77 6e 67 72 61 64  ic void downgrad
33d0: 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54  eAllSharedCacheT
33e0: 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72 65 65 20  ableLocks(Btree 
33f0: 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
3400: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
3410: 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65   if( pBt->pWrite
3420: 72 3d 3d 70 20 29 7b 0a 20 20 20 20 42 74 4c 6f  r==p ){.    BtLo
3430: 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20 20 20 20 70  ck *pLock;.    p
3440: 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30 3b  Bt->pWriter = 0;
3450: 0a 20 20 20 20 70 42 74 2d 3e 69 73 45 78 63 6c  .    pBt->isExcl
3460: 75 73 69 76 65 20 3d 20 30 3b 0a 20 20 20 20 70  usive = 0;.    p
3470: 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 3d 20  Bt->isPending = 
3480: 30 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f 63 6b  0;.    for(pLock
3490: 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f  =pBt->pLock; pLo
34a0: 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d  ck; pLock=pLock-
34b0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61  >pNext){.      a
34c0: 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 65 4c  ssert( pLock->eL
34d0: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
34e0: 7c 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d  | pLock->pBtree=
34f0: 3d 70 20 29 3b 0a 20 20 20 20 20 20 70 4c 6f 63  =p );.      pLoc
3500: 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f  k->eLock = READ_
3510: 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  LOCK;.    }.  }.
3520: 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  }..#endif /* SQL
3530: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
3540: 43 41 43 48 45 20 2a 2f 0a 0a 73 74 61 74 69 63  CACHE */..static
3550: 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67   void releasePag
3560: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
3570: 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72 64 20 72  );  /* Forward r
3580: 65 66 65 72 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a  eference */../*.
3590: 2a 2a 2a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  ***** This routi
35a0: 6e 65 20 69 73 20 75 73 65 64 20 69 6e 73 69 64  ne is used insid
35b0: 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 6f 6e  e of assert() on
35c0: 6c 79 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65  ly ****.**.** Ve
35d0: 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63 75  rify that the cu
35e0: 72 73 6f 72 20 68 6f 6c 64 73 20 74 68 65 20 6d  rsor holds the m
35f0: 75 74 65 78 20 6f 6e 20 69 74 73 20 42 74 53 68  utex on its BtSh
3600: 61 72 65 64 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ared.*/.#ifdef S
3610: 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74  QLITE_DEBUG.stat
3620: 69 63 20 69 6e 74 20 63 75 72 73 6f 72 48 6f 6c  ic int cursorHol
3630: 64 73 4d 75 74 65 78 28 42 74 43 75 72 73 6f 72  dsMutex(BtCursor
3640: 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 73   *p){.  return s
3650: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
3660: 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  d(p->pBt->mutex)
3670: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66  ;.}.#endif...#if
3680: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
3690: 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20  _INCRBLOB./*.** 
36a0: 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f  Invalidate the o
36b0: 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
36c0: 74 20 63 61 63 68 65 20 66 6f 72 20 63 75 72 73  t cache for curs
36d0: 6f 72 20 70 43 75 72 2c 20 69 66 20 61 6e 79 2e  or pCur, if any.
36e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
36f0: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
3700: 6f 77 43 61 63 68 65 28 42 74 43 75 72 73 6f 72  owCache(BtCursor
3710: 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72   *pCur){.  asser
3720: 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
3730: 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 73  tex(pCur) );.  s
3740: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
3750: 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20  ->aOverflow);.  
3760: 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
3770: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  = 0;.}../*.** In
3780: 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65  validate the ove
3790: 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
37a0: 63 61 63 68 65 20 66 6f 72 20 61 6c 6c 20 63 75  cache for all cu
37b0: 72 73 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20  rsors opened.** 
37c0: 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20 62 74  on the shared bt
37d0: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 70 42  ree structure pB
37e0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
37f0: 64 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f  d invalidateAllO
3800: 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42 74 53  verflowCache(BtS
3810: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42  hared *pBt){.  B
3820: 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73  tCursor *p;.  as
3830: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
3840: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
3850: 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d  tex) );.  for(p=
3860: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
3870: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
3880: 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72    invalidateOver
3890: 66 6c 6f 77 43 61 63 68 65 28 70 29 3b 0a 20 20  flowCache(p);.  
38a0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
38b0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
38c0: 65 64 20 62 65 66 6f 72 65 20 6d 6f 64 69 66 79  ed before modify
38d0: 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ing the contents
38e0: 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2a 20 74   of a table.** t
38f0: 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79  o invalidate any
3900: 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72   incrblob cursor
3910: 73 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20  s that are open 
3920: 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77 20 6f 72  on the.** row or
3930: 20 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 77 73   one of the rows
3940: 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64 2e   being modified.
3950: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65  .**.** If argume
3960: 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20  nt isClearTable 
3970: 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
3980: 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  e entire content
3990: 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61 62 6c  s of the.** tabl
39a0: 65 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65  e is about to be
39b0: 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69   deleted. In thi
39c0: 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74  s case invalidat
39d0: 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f 62 0a 2a  e all incrblob.*
39e0: 2a 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  * cursors open o
39f0: 6e 20 61 6e 79 20 72 6f 77 20 77 69 74 68 69 6e  n any row within
3a00: 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
3a10: 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e 6f 52 6f  root-page pgnoRo
3a20: 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  ot..**.** Otherw
3a30: 69 73 65 2c 20 69 66 20 61 72 67 75 6d 65 6e 74  ise, if argument
3a40: 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 69 73   isClearTable is
3a50: 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 74 68 65   false, then the
3a60: 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20 72 6f 77   row with.** row
3a70: 69 64 20 69 52 6f 77 20 69 73 20 62 65 69 6e 67  id iRow is being
3a80: 20 72 65 70 6c 61 63 65 64 20 6f 72 20 64 65 6c   replaced or del
3a90: 65 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  eted. In this ca
3aa0: 73 65 20 69 6e 76 61 6c 69 64 61 74 65 0a 2a 2a  se invalidate.**
3ab0: 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69 6e 63 72   only those incr
3ac0: 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f 70 65  blob cursors ope
3ad0: 6e 20 6f 6e 20 74 68 61 74 20 73 70 65 63 69 66  n on that specif
3ae0: 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69  ic row..*/.stati
3af0: 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74  c void invalidat
3b00: 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73  eIncrblobCursors
3b10: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
3b20: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
3b30: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
3b40: 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69   to check */.  i
3b50: 36 34 20 69 52 6f 77 2c 20 20 20 20 20 20 20 20  64 iRow,        
3b60: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f         /* The ro
3b70: 77 69 64 20 74 68 61 74 20 6d 69 67 68 74 20 62  wid that might b
3b80: 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f 0a 20 20  e changing */.  
3b90: 69 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65  int isClearTable
3ba0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3bb0: 69 66 20 61 6c 6c 20 72 6f 77 73 20 61 72 65 20  if all rows are 
3bc0: 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f  being deleted */
3bd0: 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  .){.  BtCursor *
3be0: 70 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  p;.  BtShared *p
3bf0: 42 74 20 3d 20 70 42 74 72 65 65 2d 3e 70 42 74  Bt = pBtree->pBt
3c00: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
3c10: 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
3c20: 65 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20  ex(pBtree) );.  
3c30: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
3c40: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
3c50: 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  t){.    if( p->i
3c60: 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20  sIncrblobHandle 
3c70: 26 26 20 28 69 73 43 6c 65 61 72 54 61 62 6c 65  && (isClearTable
3c80: 20 7c 7c 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   || p->info.nKey
3c90: 3d 3d 69 52 6f 77 29 20 29 7b 0a 20 20 20 20 20  ==iRow) ){.     
3ca0: 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52   p->eState = CUR
3cb0: 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
3cc0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a   }.  }.}..#else.
3cd0: 20 20 2f 2a 20 53 74 75 62 20 66 75 6e 63 74 69    /* Stub functi
3ce0: 6f 6e 73 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f  ons when INCRBLO
3cf0: 42 20 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a  B is omitted */.
3d00: 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69    #define invali
3d10: 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
3d20: 65 28 78 29 0a 20 20 23 64 65 66 69 6e 65 20 69  e(x).  #define i
3d30: 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
3d40: 66 6c 6f 77 43 61 63 68 65 28 78 29 0a 20 20 23  flowCache(x).  #
3d50: 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74  define invalidat
3d60: 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73  eIncrblobCursors
3d70: 28 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f  (x,y,z).#endif /
3d80: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  * SQLITE_OMIT_IN
3d90: 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  CRBLOB */../*.**
3da0: 20 53 65 74 20 62 69 74 20 70 67 6e 6f 20 6f 66   Set bit pgno of
3db0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48   the BtShared.pH
3dc0: 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63  asContent bitvec
3dd0: 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64  . This is called
3de0: 20 0a 2a 2a 20 77 68 65 6e 20 61 20 70 61 67 65   .** when a page
3df0: 20 74 68 61 74 20 70 72 65 76 69 6f 75 73 6c 79   that previously
3e00: 20 63 6f 6e 74 61 69 6e 65 64 20 64 61 74 61 20   contained data 
3e10: 62 65 63 6f 6d 65 73 20 61 20 66 72 65 65 2d 6c  becomes a free-l
3e20: 69 73 74 20 6c 65 61 66 20 0a 2a 2a 20 70 61 67  ist leaf .** pag
3e30: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 74 53  e..**.** The BtS
3e40: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
3e50: 74 20 62 69 74 76 65 63 20 65 78 69 73 74 73 20  t bitvec exists 
3e60: 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61  to work around a
3e70: 6e 20 6f 62 73 63 75 72 65 0a 2a 2a 20 62 75 67  n obscure.** bug
3e80: 20 63 61 75 73 65 64 20 62 79 20 74 68 65 20 69   caused by the i
3e90: 6e 74 65 72 61 63 74 69 6f 6e 20 6f 66 20 74 77  nteraction of tw
3ea0: 6f 20 75 73 65 66 75 6c 20 49 4f 20 6f 70 74 69  o useful IO opti
3eb0: 6d 69 7a 61 74 69 6f 6e 73 20 73 75 72 72 6f 75  mizations surrou
3ec0: 6e 64 69 6e 67 0a 2a 2a 20 66 72 65 65 2d 6c 69  nding.** free-li
3ed0: 73 74 20 6c 65 61 66 20 70 61 67 65 73 3a 0a 2a  st leaf pages:.*
3ee0: 2a 0a 2a 2a 20 20 20 31 29 20 57 68 65 6e 20 61  *.**   1) When a
3ef0: 6c 6c 20 64 61 74 61 20 69 73 20 64 65 6c 65 74  ll data is delet
3f00: 65 64 20 66 72 6f 6d 20 61 20 70 61 67 65 20 61  ed from a page a
3f10: 6e 64 20 74 68 65 20 70 61 67 65 20 62 65 63 6f  nd the page beco
3f20: 6d 65 73 0a 2a 2a 20 20 20 20 20 20 61 20 66 72  mes.**      a fr
3f30: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
3f40: 65 2c 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  e, the page is n
3f50: 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  ot written to th
3f60: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
3f70: 20 20 20 28 61 73 20 66 72 65 65 2d 6c 69 73 74     (as free-list
3f80: 20 6c 65 61 66 20 70 61 67 65 73 20 63 6f 6e 74   leaf pages cont
3f90: 61 69 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67 66 75  ain no meaningfu
3fa0: 6c 20 64 61 74 61 29 2e 20 53 6f 6d 65 74 69 6d  l data). Sometim
3fb0: 65 73 0a 2a 2a 20 20 20 20 20 20 73 75 63 68 20  es.**      such 
3fc0: 61 20 70 61 67 65 20 69 73 20 6e 6f 74 20 65 76  a page is not ev
3fd0: 65 6e 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 28 61  en journalled (a
3fe0: 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65  s it will not be
3ff0: 20 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a 20 20 20   modified,.**   
4000: 20 20 20 77 68 79 20 62 6f 74 68 65 72 20 6a 6f     why bother jo
4010: 75 72 6e 61 6c 6c 69 6e 67 20 69 74 3f 29 2e 0a  urnalling it?)..
4020: 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e 20  **.**   2) When 
4030: 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
4040: 20 70 61 67 65 20 69 73 20 72 65 75 73 65 64 2c   page is reused,
4050: 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 69 73 20   its content is 
4060: 6e 6f 74 20 72 65 61 64 0a 2a 2a 20 20 20 20 20  not read.**     
4070: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
4080: 73 65 20 6f 72 20 77 72 69 74 74 65 6e 20 74 6f  se or written to
4090: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
40a0: 65 20 28 77 68 79 20 73 68 6f 75 6c 64 20 69 74  e (why should it
40b0: 0a 2a 2a 20 20 20 20 20 20 62 65 2c 20 69 66 20  .**      be, if 
40c0: 69 74 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c  it is not at all
40d0: 20 6d 65 61 6e 69 6e 67 66 75 6c 3f 29 2e 0a 2a   meaningful?)..*
40e0: 2a 0a 2a 2a 20 42 79 20 74 68 65 6d 73 65 6c 76  *.** By themselv
40f0: 65 73 2c 20 74 68 65 73 65 20 6f 70 74 69 6d 69  es, these optimi
4100: 7a 61 74 69 6f 6e 73 20 77 6f 72 6b 20 66 69 6e  zations work fin
4110: 65 20 61 6e 64 20 70 72 6f 76 69 64 65 20 61 20  e and provide a 
4120: 68 61 6e 64 79 0a 2a 2a 20 70 65 72 66 6f 72 6d  handy.** perform
4130: 61 6e 63 65 20 62 6f 6f 73 74 20 74 6f 20 62 75  ance boost to bu
4140: 6c 6b 20 64 65 6c 65 74 65 20 6f 72 20 69 6e 73  lk delete or ins
4150: 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20  ert operations. 
4160: 48 6f 77 65 76 65 72 2c 20 69 66 0a 2a 2a 20 61  However, if.** a
4170: 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20 74   page is moved t
4180: 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  o the free-list 
4190: 61 6e 64 20 74 68 65 6e 20 72 65 75 73 65 64 20  and then reused 
41a0: 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65 0a  within the same.
41b0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  ** transaction, 
41c0: 61 20 70 72 6f 62 6c 65 6d 20 63 6f 6d 65 73 20  a problem comes 
41d0: 75 70 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  up. If the page 
41e0: 69 73 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65  is not journalle
41f0: 64 20 77 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20  d when.** it is 
4200: 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65  moved to the fre
4210: 65 2d 6c 69 73 74 20 61 6e 64 20 69 74 20 69 73  e-list and it is
4220: 20 61 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72 6e 61   also not journa
4230: 6c 6c 65 64 20 77 68 65 6e 20 69 74 0a 2a 2a 20  lled when it.** 
4240: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
4250: 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  m the free-list 
4260: 61 6e 64 20 72 65 75 73 65 64 2c 20 74 68 65 6e  and reused, then
4270: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
4280: 74 61 0a 2a 2a 20 6d 61 79 20 62 65 20 6c 6f 73  ta.** may be los
4290: 74 2e 20 49 6e 20 74 68 65 20 65 76 65 6e 74 20  t. In the event 
42a0: 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 69  of a rollback, i
42b0: 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 70 6f 73  t may not be pos
42c0: 73 69 62 6c 65 0a 2a 2a 20 74 6f 20 72 65 73 74  sible.** to rest
42d0: 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
42e0: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
42f0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a   configuration..
4300: 2a 2a 0a 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69  **.** The soluti
4310: 6f 6e 20 69 73 20 74 68 65 20 42 74 53 68 61 72  on is the BtShar
4320: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
4330: 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20  itvec. Whenever 
4340: 61 20 70 61 67 65 20 69 73 20 0a 2a 2a 20 6d 6f  a page is .** mo
4350: 76 65 64 20 74 6f 20 62 65 63 6f 6d 65 20 61 20  ved to become a 
4360: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
4370: 61 67 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70  age, the corresp
4380: 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 0a 2a 2a  onding bit is.**
4390: 20 73 65 74 20 69 6e 20 74 68 65 20 62 69 74 76   set in the bitv
43a0: 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20 6c  ec. Whenever a l
43b0: 65 61 66 20 70 61 67 65 20 69 73 20 65 78 74 72  eaf page is extr
43c0: 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66  acted from the f
43d0: 72 65 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f 70 74  ree-list,.** opt
43e0: 69 6d 69 7a 61 74 69 6f 6e 20 32 20 61 62 6f 76  imization 2 abov
43f0: 65 20 69 73 20 6f 6d 69 74 74 65 64 20 69 66 20  e is omitted if 
4400: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
4410: 67 20 62 69 74 20 69 73 20 61 6c 72 65 61 64 79  g bit is already
4420: 0a 2a 2a 20 73 65 74 20 69 6e 20 42 74 53 68 61  .** set in BtSha
4430: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 2e  red.pHasContent.
4440: 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   The contents of
4450: 20 74 68 65 20 62 69 74 76 65 63 20 61 72 65 20   the bitvec are 
4460: 63 6c 65 61 72 65 64 0a 2a 2a 20 61 74 20 74 68  cleared.** at th
4470: 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 74  e end of every t
4480: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
4490: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 53  tatic int btreeS
44a0: 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53  etHasContent(BtS
44b0: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
44c0: 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63   pgno){.  int rc
44d0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
44e0: 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f  if( !pBt->pHasCo
44f0: 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 61 73 73  ntent ){.    ass
4500: 65 72 74 28 20 70 67 6e 6f 3c 3d 70 42 74 2d 3e  ert( pgno<=pBt->
4510: 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 70 42 74  nPage );.    pBt
4520: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20  ->pHasContent = 
4530: 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65  sqlite3BitvecCre
4540: 61 74 65 28 70 42 74 2d 3e 6e 50 61 67 65 29 3b  ate(pBt->nPage);
4550: 0a 20 20 20 20 69 66 28 20 21 70 42 74 2d 3e 70  .    if( !pBt->p
4560: 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  HasContent ){.  
4570: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
4580: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
4590: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
45a0: 45 5f 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d 73 71  E_OK && pgno<=sq
45b0: 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a 65 28  lite3BitvecSize(
45c0: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
45d0: 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ) ){.    rc = sq
45e0: 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
45f0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 2c  Bt->pHasContent,
4600: 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65   pgno);.  }.  re
4610: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
4620: 2a 20 51 75 65 72 79 20 74 68 65 20 42 74 53 68  * Query the BtSh
4630: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
4640: 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54   vector..**.** T
4650: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
4660: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 66 72  called when a fr
4670: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4680: 65 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f  e is removed fro
4690: 6d 20 74 68 65 0a 2a 2a 20 66 72 65 65 2d 6c 69  m the.** free-li
46a0: 73 74 20 66 6f 72 20 72 65 75 73 65 2e 20 49 74  st for reuse. It
46b0: 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20 69   returns false i
46c0: 66 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20  f it is safe to 
46d0: 72 65 74 72 69 65 76 65 20 74 68 65 0a 2a 2a 20  retrieve the.** 
46e0: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
46f0: 67 65 72 20 6c 61 79 65 72 20 77 69 74 68 20 74  ger layer with t
4700: 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20  he 'no-content' 
4710: 66 6c 61 67 20 73 65 74 2e 20 54 72 75 65 20 6f  flag set. True o
4720: 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
4730: 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65 74  tic int btreeGet
4740: 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61  HasContent(BtSha
4750: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
4760: 67 6e 6f 29 7b 0a 20 20 42 69 74 76 65 63 20 2a  gno){.  Bitvec *
4770: 70 20 3d 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e  p = pBt->pHasCon
4780: 74 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20 28  tent;.  return (
4790: 70 20 26 26 20 28 70 67 6e 6f 3e 73 71 6c 69 74  p && (pgno>sqlit
47a0: 65 33 42 69 74 76 65 63 53 69 7a 65 28 70 29 20  e3BitvecSize(p) 
47b0: 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  || sqlite3Bitvec
47c0: 54 65 73 74 28 70 2c 20 70 67 6e 6f 29 29 29 3b  Test(p, pgno)));
47d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  .}../*.** Clear 
47e0: 28 64 65 73 74 72 6f 79 29 20 74 68 65 20 42 74  (destroy) the Bt
47f0: 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65  Shared.pHasConte
4800: 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69 73 20  nt bitvec. This 
4810: 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 6e 76  should be.** inv
4820: 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63  oked at the conc
4830: 6c 75 73 69 6f 6e 20 6f 66 20 65 61 63 68 20 77  lusion of each w
4840: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
4850: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4860: 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f   btreeClearHasCo
4870: 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a  ntent(BtShared *
4880: 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 42  pBt){.  sqlite3B
4890: 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 42 74  itvecDestroy(pBt
48a0: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 3b 0a  ->pHasContent);.
48b0: 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65    pBt->pHasConte
48c0: 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nt = 0;.}../*.**
48d0: 20 53 61 76 65 20 74 68 65 20 63 75 72 72 65 6e   Save the curren
48e0: 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  t cursor positio
48f0: 6e 20 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c  n in the variabl
4900: 65 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79  es BtCursor.nKey
4910: 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f   .** and BtCurso
4920: 72 2e 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73  r.pKey. The curs
4930: 6f 72 27 73 20 73 74 61 74 65 20 69 73 20 73 65  or's state is se
4940: 74 20 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55  t to CURSOR_REQU
4950: 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54  IRESEEK..**.** T
4960: 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65  he caller must e
4970: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 63  nsure that the c
4980: 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 20 28  ursor is valid (
4990: 68 61 73 20 65 53 74 61 74 65 3d 3d 43 55 52 53  has eState==CURS
49a0: 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69  OR_VALID).** pri
49b0: 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68  or to calling th
49c0: 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f  is routine.  .*/
49d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
49e0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42  CursorPosition(B
49f0: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
4a00: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
4a10: 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49  ert( CURSOR_VALI
4a20: 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
4a30: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d  );.  assert( 0==
4a40: 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20  pCur->pKey );.  
4a50: 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
4a60: 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
4a70: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
4a80: 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43  3BtreeKeySize(pC
4a90: 75 72 2c 20 26 70 43 75 72 2d 3e 6e 4b 65 79 29  ur, &pCur->nKey)
4aa0: 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
4ab0: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 2f 2a  SQLITE_OK );  /*
4ac0: 20 4b 65 79 53 69 7a 65 28 29 20 63 61 6e 6e 6f   KeySize() canno
4ad0: 74 20 66 61 69 6c 20 2a 2f 0a 0a 20 20 2f 2a 20  t fail */..  /* 
4ae0: 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e  If this is an in
4af0: 74 4b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e  tKey table, then
4b00: 20 74 68 65 20 61 62 6f 76 65 20 63 61 6c 6c 20   the above call 
4b10: 74 6f 20 42 74 72 65 65 4b 65 79 53 69 7a 65 28  to BtreeKeySize(
4b20: 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68  ).  ** stores th
4b30: 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 69 6e  e integer key in
4b40: 20 70 43 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20   pCur->nKey. In 
4b50: 74 68 69 73 20 63 61 73 65 20 74 68 69 73 20 76  this case this v
4b60: 61 6c 75 65 20 69 73 0a 20 20 2a 2a 20 61 6c 6c  alue is.  ** all
4b70: 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65   that is require
4b80: 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  d. Otherwise, if
4b90: 20 70 43 75 72 20 69 73 20 6e 6f 74 20 6f 70 65   pCur is not ope
4ba0: 6e 20 6f 6e 20 61 6e 20 69 6e 74 4b 65 79 0a 20  n on an intKey. 
4bb0: 20 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e 20   ** table, then 
4bc0: 6d 61 6c 6c 6f 63 20 73 70 61 63 65 20 66 6f 72  malloc space for
4bd0: 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 70   and store the p
4be0: 43 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20  Cur->nKey bytes 
4bf0: 6f 66 20 6b 65 79 20 0a 20 20 2a 2a 20 64 61 74  of key .  ** dat
4c00: 61 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d  a..  */.  if( 0=
4c10: 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d  =pCur->apPage[0]
4c20: 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
4c30: 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20 73 71 6c  void *pKey = sql
4c40: 69 74 65 33 4d 61 6c 6c 6f 63 28 20 28 69 6e 74  ite3Malloc( (int
4c50: 29 70 43 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20  )pCur->nKey );. 
4c60: 20 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20     if( pKey ){. 
4c70: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
4c80: 33 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20  3BtreeKey(pCur, 
4c90: 30 2c 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b  0, (int)pCur->nK
4ca0: 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 20  ey, pKey);.     
4cb0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
4cc0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  OK ){.        pC
4cd0: 75 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b  ur->pKey = pKey;
4ce0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
4cf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
4d00: 65 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20  ee(pKey);.      
4d10: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
4d20: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
4d30: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OMEM;.    }.  }.
4d40: 20 20 61 73 73 65 72 74 28 20 21 70 43 75 72 2d    assert( !pCur-
4d50: 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b  >apPage[0]->intK
4d60: 65 79 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65  ey || !pCur->pKe
4d70: 79 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d  y );..  if( rc==
4d80: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
4d90: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
4da0: 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50  i=0; i<=pCur->iP
4db0: 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  age; i++){.     
4dc0: 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
4dd0: 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20  r->apPage[i]);. 
4de0: 20 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67       pCur->apPag
4df0: 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  e[i] = 0;.    }.
4e00: 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20      pCur->iPage 
4e10: 3d 20 2d 31 3b 0a 20 20 20 20 70 43 75 72 2d 3e  = -1;.    pCur->
4e20: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
4e30: 52 45 51 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d  REQUIRESEEK;.  }
4e40: 0a 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76  ..  invalidateOv
4e50: 65 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72  erflowCache(pCur
4e60: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
4e70: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68  }../*.** Save th
4e80: 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61  e positions of a
4e90: 6c 6c 20 63 75 72 73 6f 72 73 20 28 65 78 63 65  ll cursors (exce
4ea0: 70 74 20 70 45 78 63 65 70 74 29 20 74 68 61 74  pt pExcept) that
4eb0: 20 61 72 65 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20   are open on.** 
4ec0: 74 68 65 20 74 61 62 6c 65 20 20 77 69 74 68 20  the table  with 
4ed0: 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e  root-page iRoot.
4ee0: 20 55 73 75 61 6c 6c 79 2c 20 74 68 69 73 20 69   Usually, this i
4ef0: 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65  s called just be
4f00: 66 6f 72 65 20 63 75 72 73 6f 72 0a 2a 2a 20 70  fore cursor.** p
4f10: 45 78 63 65 70 74 20 69 73 20 75 73 65 64 20 74  Except is used t
4f20: 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 74 61 62  o modify the tab
4f30: 6c 65 20 28 42 74 72 65 65 44 65 6c 65 74 65 28  le (BtreeDelete(
4f40: 29 20 6f 72 20 42 74 72 65 65 49 6e 73 65 72 74  ) or BtreeInsert
4f50: 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ())..*/.static i
4f60: 6e 74 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72  nt saveAllCursor
4f70: 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  s(BtShared *pBt,
4f80: 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74 43   Pgno iRoot, BtC
4f90: 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74 29 7b  ursor *pExcept){
4fa0: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
4fb0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
4fc0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
4fd0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
4fe0: 73 65 72 74 28 20 70 45 78 63 65 70 74 3d 3d 30  sert( pExcept==0
4ff0: 20 7c 7c 20 70 45 78 63 65 70 74 2d 3e 70 42 74   || pExcept->pBt
5000: 3d 3d 70 42 74 20 29 3b 0a 20 20 66 6f 72 28 70  ==pBt );.  for(p
5010: 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
5020: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
5030: 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65 70     if( p!=pExcep
5040: 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c  t && (0==iRoot |
5050: 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69  | p->pgnoRoot==i
5060: 52 6f 6f 74 29 20 26 26 20 0a 20 20 20 20 20 20  Root) && .      
5070: 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52    p->eState==CUR
5080: 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
5090: 20 20 20 69 6e 74 20 72 63 20 3d 20 73 61 76 65     int rc = save
50a0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
50b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  );.      if( SQL
50c0: 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20  ITE_OK!=rc ){.  
50d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
50e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
50f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
5100: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
5110: 43 6c 65 61 72 20 74 68 65 20 63 75 72 72 65 6e  Clear the curren
5120: 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  t cursor positio
5130: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
5140: 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73  e3BtreeClearCurs
5150: 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  or(BtCursor *pCu
5160: 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  r){.  assert( cu
5170: 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
5180: 43 75 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  Cur) );.  sqlite
5190: 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65  3_free(pCur->pKe
51a0: 79 29 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79  y);.  pCur->pKey
51b0: 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 65 53   = 0;.  pCur->eS
51c0: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
51d0: 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  VALID;.}../*.** 
51e0: 49 6e 20 74 68 69 73 20 76 65 72 73 69 6f 6e 20  In this version 
51f0: 6f 66 20 42 74 72 65 65 4d 6f 76 65 74 6f 2c 20  of BtreeMoveto, 
5200: 70 4b 65 79 20 69 73 20 61 20 70 61 63 6b 65 64  pKey is a packed
5210: 20 69 6e 64 65 78 20 72 65 63 6f 72 64 0a 2a 2a   index record.**
5220: 20 73 75 63 68 20 61 73 20 69 73 20 67 65 6e 65   such as is gene
5230: 72 61 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f  rated by the OP_
5240: 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64  MakeRecord opcod
5250: 65 2e 20 20 55 6e 70 61 63 6b 20 74 68 65 0a 2a  e.  Unpack the.*
5260: 2a 20 72 65 63 6f 72 64 20 61 6e 64 20 74 68 65  * record and the
5270: 6e 20 63 61 6c 6c 20 42 74 72 65 65 4d 6f 76 65  n call BtreeMove
5280: 74 6f 55 6e 70 61 63 6b 65 64 28 29 20 74 6f 20  toUnpacked() to 
5290: 64 6f 20 74 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a  do the work..*/.
52a0: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
52b0: 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43 75 72 73  Moveto(.  BtCurs
52c0: 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a  or *pCur,     /*
52d0: 20 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20   Cursor open on 
52e0: 74 68 65 20 62 74 72 65 65 20 74 6f 20 62 65 20  the btree to be 
52f0: 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 63 6f  searched */.  co
5300: 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
5310: 20 20 2f 2a 20 50 61 63 6b 65 64 20 6b 65 79 20    /* Packed key 
5320: 69 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20  if the btree is 
5330: 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 36  an index */.  i6
5340: 34 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20  4 nKey,         
5350: 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 6b 65 79    /* Integer key
5360: 20 66 6f 72 20 74 61 62 6c 65 73 2e 20 20 53 69   for tables.  Si
5370: 7a 65 20 6f 66 20 70 4b 65 79 20 66 6f 72 20 69  ze of pKey for i
5380: 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ndices */.  int 
5390: 62 69 61 73 2c 20 20 20 20 20 20 20 20 20 20 20  bias,           
53a0: 2f 2a 20 42 69 61 73 20 73 65 61 72 63 68 20 74  /* Bias search t
53b0: 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a  o the high end *
53c0: 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20  /.  int *pRes   
53d0: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
53e0: 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73 20   search results 
53f0: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
5400: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
5410: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75          /* Statu
5420: 73 20 63 6f 64 65 20 2a 2f 0a 20 20 55 6e 70 61  s code */.  Unpa
5430: 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78  ckedRecord *pIdx
5440: 4b 65 79 3b 20 20 20 2f 2a 20 55 6e 70 61 63 6b  Key;   /* Unpack
5450: 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a  ed index key */.
5460: 20 20 63 68 61 72 20 61 53 70 61 63 65 5b 31 35    char aSpace[15
5470: 30 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0];          /* 
5480: 54 65 6d 70 20 73 70 61 63 65 20 66 6f 72 20 70  Temp space for p
5490: 49 64 78 4b 65 79 20 2d 20 74 6f 20 61 76 6f 69  IdxKey - to avoi
54a0: 64 20 61 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a 20  d a malloc */.. 
54b0: 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20   if( pKey ){.   
54c0: 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28   assert( nKey==(
54d0: 69 36 34 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b  i64)(int)nKey );
54e0: 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 73  .    pIdxKey = s
54f0: 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
5500: 55 6e 70 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65  Unpack(pCur->pKe
5510: 79 49 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b 65 79  yInfo, (int)nKey
5520: 2c 20 70 4b 65 79 2c 0a 20 20 20 20 20 20 20 20  , pKey,.        
5530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53                aS
5550: 70 61 63 65 2c 20 73 69 7a 65 6f 66 28 61 53 70  pace, sizeof(aSp
5560: 61 63 65 29 29 3b 0a 20 20 20 20 69 66 28 20 70  ace));.    if( p
5570: 49 64 78 4b 65 79 3d 3d 30 20 29 20 72 65 74 75  IdxKey==0 ) retu
5580: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
5590: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
55a0: 64 78 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20  dxKey = 0;.  }. 
55b0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
55c0: 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
55d0: 28 70 43 75 72 2c 20 70 49 64 78 4b 65 79 2c 20  (pCur, pIdxKey, 
55e0: 6e 4b 65 79 2c 20 62 69 61 73 2c 20 70 52 65 73  nKey, bias, pRes
55f0: 29 3b 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b  );.  if( pKey ){
5600: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5610: 44 65 6c 65 74 65 55 6e 70 61 63 6b 65 64 52 65  DeleteUnpackedRe
5620: 63 6f 72 64 28 70 49 64 78 4b 65 79 29 3b 0a 20  cord(pIdxKey);. 
5630: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
5640: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65  }../*.** Restore
5650: 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
5660: 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77  he position it w
5670: 61 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f  as in (or as clo
5680: 73 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c  se to as possibl
5690: 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43  e).** when saveC
56a0: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20  ursorPosition() 
56b0: 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65  was called. Note
56c0: 20 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20   that this call 
56d0: 64 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20  deletes the .** 
56e0: 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69  saved position i
56f0: 6e 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61  nfo stored by sa
5700: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
5710: 28 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e  (), so there can
5720: 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f   be.** at most o
5730: 6e 65 20 65 66 66 65 63 74 69 76 65 20 72 65 73  ne effective res
5740: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
5750: 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20  on() call after 
5760: 65 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72  each .** saveCur
5770: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a  sorPosition()..*
5780: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
5790: 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50  eeRestoreCursorP
57a0: 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72  osition(BtCursor
57b0: 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72   *pCur){.  int r
57c0: 63 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  c;.  assert( cur
57d0: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
57e0: 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
57f0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43   pCur->eState>=C
5800: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
5810: 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  K );.  if( pCur-
5820: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
5830: 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74  FAULT ){.    ret
5840: 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  urn pCur->skipNe
5850: 78 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  xt;.  }.  pCur->
5860: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
5870: 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20  INVALID;.  rc = 
5880: 62 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72  btreeMoveto(pCur
5890: 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43  , pCur->pKey, pC
58a0: 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 70 43  ur->nKey, 0, &pC
58b0: 75 72 2d 3e 73 6b 69 70 4e 65 78 74 29 3b 0a 20  ur->skipNext);. 
58c0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
58d0: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
58e0: 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65  3_free(pCur->pKe
58f0: 79 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b  y);.    pCur->pK
5900: 65 79 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65  ey = 0;.    asse
5910: 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
5920: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c  ==CURSOR_VALID |
5930: 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  | pCur->eState==
5940: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
5950: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
5960: 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65  c;.}..#define re
5970: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
5980: 69 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65  ion(p) \.  (p->e
5990: 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45  State>=CURSOR_RE
59a0: 51 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20  QUIRESEEK ? \.  
59b0: 20 20 20 20 20 20 20 62 74 72 65 65 52 65 73 74         btreeRest
59c0: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
59d0: 6e 28 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20  n(p) : \.       
59e0: 20 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a    SQLITE_OK)../*
59f0: 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68  .** Determine wh
5a00: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63  ether or not a c
5a10: 75 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20  ursor has moved 
5a20: 66 72 6f 6d 20 74 68 65 20 70 6f 73 69 74 69 6f  from the positio
5a30: 6e 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74  n it.** was last
5a40: 20 70 6c 61 63 65 64 20 61 74 2e 20 20 43 75 72   placed at.  Cur
5a50: 73 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68  sors can move wh
5a60: 65 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20  en the row they 
5a70: 61 72 65 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20  are pointing.** 
5a80: 61 74 20 69 73 20 64 65 6c 65 74 65 64 20 6f 75  at is deleted ou
5a90: 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  t from under the
5aa0: 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  m..**.** This ro
5ab0: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 61 6e  utine returns an
5ac0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 73   error code if s
5ad0: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
5ae0: 6f 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 74  ong.  The.** int
5af0: 65 67 65 72 20 2a 70 48 61 73 4d 6f 76 65 64 20  eger *pHasMoved 
5b00: 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 69 66  is set to one if
5b10: 20 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20   the cursor has 
5b20: 6d 6f 76 65 64 20 61 6e 64 20 30 20 69 66 20 6e  moved and 0 if n
5b30: 6f 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ot..*/.int sqlit
5b40: 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73  e3BtreeCursorHas
5b50: 4d 6f 76 65 64 28 42 74 43 75 72 73 6f 72 20 2a  Moved(BtCursor *
5b60: 70 43 75 72 2c 20 69 6e 74 20 2a 70 48 61 73 4d  pCur, int *pHasM
5b70: 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b  oved){.  int rc;
5b80: 0a 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65  ..  rc = restore
5b90: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
5ba0: 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Cur);.  if( rc )
5bb0: 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64  {.    *pHasMoved
5bc0: 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
5bd0: 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70   rc;.  }.  if( p
5be0: 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
5bf0: 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75  SOR_VALID || pCu
5c00: 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 30 20 29  r->skipNext!=0 )
5c10: 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64  {.    *pHasMoved
5c20: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
5c30: 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20     *pHasMoved = 
5c40: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
5c50: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
5c60: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
5c70: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a  T_AUTOVACUUM./*.
5c80: 2a 2a 20 47 69 76 65 6e 20 61 20 70 61 67 65 20  ** Given a page 
5c90: 6e 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67 75  number of a regu
5ca0: 6c 61 72 20 64 61 74 61 62 61 73 65 20 70 61 67  lar database pag
5cb0: 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70 61  e, return the pa
5cc0: 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72  ge.** number for
5cd0: 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
5ce0: 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
5cf0: 69 6e 73 20 74 68 65 20 65 6e 74 72 79 20 66 6f  ins the entry fo
5d00: 72 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70  r the.** input p
5d10: 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73  age number..*/.s
5d20: 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61  tatic Pgno ptrma
5d30: 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64  pPageno(BtShared
5d40: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
5d50: 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50  ){.  int nPagesP
5d60: 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e  erMapPage;.  Pgn
5d70: 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a  o iPtrMap, ret;.
5d80: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
5d90: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
5da0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 6e 50  ->mutex) );.  nP
5db0: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 20 3d  agesPerMapPage =
5dc0: 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a   (pBt->usableSiz
5dd0: 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61  e/5)+1;.  iPtrMa
5de0: 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61  p = (pgno-2)/nPa
5df0: 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20  gesPerMapPage;. 
5e00: 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70 2a   ret = (iPtrMap*
5e10: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
5e20: 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72 65  ) + 2; .  if( re
5e30: 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  t==PENDING_BYTE_
5e40: 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
5e50: 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65   ret++;.  }.  re
5e60: 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a  turn ret;.}../*.
5e70: 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74 72  ** Write an entr
5e80: 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  y into the point
5e90: 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  er map..**.** Th
5ea0: 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61 74  is routine updat
5eb0: 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  es the pointer m
5ec0: 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67  ap entry for pag
5ed0: 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a  e number 'key'.*
5ee0: 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61 70  * so that it map
5ef0: 73 20 74 6f 20 74 79 70 65 20 27 65 54 79 70 65  s to type 'eType
5f00: 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67  ' and parent pag
5f10: 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e  e number 'pgno'.
5f20: 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 43 20 69  .**.** If *pRC i
5f30: 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d  s initially non-
5f40: 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54 45  zero (non-SQLITE
5f50: 5f 4f 4b 29 20 74 68 65 6e 20 74 68 69 73 20 72  _OK) then this r
5f60: 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 61 20 6e  outine is.** a n
5f70: 6f 2d 6f 70 2e 20 20 49 66 20 61 6e 20 65 72 72  o-op.  If an err
5f80: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 61  or occurs, the a
5f90: 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
5fa0: 20 63 6f 64 65 20 69 73 20 77 72 69 74 74 65 6e   code is written
5fb0: 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52 43 2e 0a 2a  .** into *pRC..*
5fc0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 74  /.static void pt
5fd0: 72 6d 61 70 50 75 74 28 42 74 53 68 61 72 65 64  rmapPut(BtShared
5fe0: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c   *pBt, Pgno key,
5ff0: 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e 6f 20   u8 eType, Pgno 
6000: 70 61 72 65 6e 74 2c 20 69 6e 74 20 2a 70 52 43  parent, int *pRC
6010: 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  ){.  DbPage *pDb
6020: 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f  Page;  /* The po
6030: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
6040: 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b  /.  u8 *pPtrmap;
6050: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69        /* The poi
6060: 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a 2f  nter map data */
6070: 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b  .  Pgno iPtrmap;
6080: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e       /* The poin
6090: 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75 6d  ter map page num
60a0: 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66  ber */.  int off
60b0: 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66  set;       /* Of
60c0: 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72 20  fset in pointer 
60d0: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  map page */.  in
60e0: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
60f0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66  /* Return code f
6100: 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73  rom subfunctions
6110: 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20   */..  if( *pRC 
6120: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73  ) return;..  ass
6130: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
6140: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
6150: 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20  ex) );.  /* The 
6160: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70  master-journal p
6170: 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20  age number must 
6180: 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 61 73  never be used as
6190: 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70   a pointer map p
61a0: 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  age */.  assert(
61b0: 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41 47   0==PTRMAP_ISPAG
61c0: 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42  E(pBt, PENDING_B
61d0: 59 54 45 5f 50 41 47 45 28 70 42 74 29 29 20 29  YTE_PAGE(pBt)) )
61e0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  ;..  assert( pBt
61f0: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a  ->autoVacuum );.
6200: 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a    if( key==0 ){.
6210: 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54      *pRC = SQLIT
6220: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
6230: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
6240: 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d    iPtrmap = PTRM
6250: 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b  AP_PAGENO(pBt, k
6260: 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ey);.  rc = sqli
6270: 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d  te3PagerGet(pBt-
6280: 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70  >pPager, iPtrmap
6290: 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69  , &pDbPage);.  i
62a0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
62b0: 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72   ){.    *pRC = r
62c0: 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  c;.    return;. 
62d0: 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54   }.  offset = PT
62e0: 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69  RMAP_PTROFFSET(i
62f0: 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20  Ptrmap, key);.  
6300: 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a  if( offset<0 ){.
6310: 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54      *pRC = SQLIT
6320: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
6330: 20 20 20 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f      goto ptrmap_
6340: 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70 50 74 72  exit;.  }.  pPtr
6350: 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69  map = (u8 *)sqli
6360: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
6370: 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28  pDbPage);..  if(
6380: 20 65 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b   eType!=pPtrmap[
6390: 6f 66 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62  offset] || get4b
63a0: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
63b0: 73 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20  set+1])!=parent 
63c0: 29 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22 50  ){.    TRACE(("P
63d0: 54 52 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64  TRMAP_UPDATE: %d
63e0: 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65  ->(%d,%d)\n", ke
63f0: 79 2c 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74  y, eType, parent
6400: 29 29 3b 0a 20 20 20 20 2a 70 52 43 3d 20 72 63  ));.    *pRC= rc
6410: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
6420: 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20  rite(pDbPage);. 
6430: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
6440: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
6450: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20  trmap[offset] = 
6460: 65 54 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74  eType;.      put
6470: 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f  4byte(&pPtrmap[o
6480: 66 66 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74  ffset+1], parent
6490: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 70 74  );.    }.  }..pt
64a0: 72 6d 61 70 5f 65 78 69 74 3a 0a 20 20 73 71 6c  rmap_exit:.  sql
64b0: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
64c0: 44 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  DbPage);.}../*.*
64d0: 2a 20 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20  * Read an entry 
64e0: 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72  from the pointer
64f0: 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   map..**.** This
6500: 20 72 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76   routine retriev
6510: 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  es the pointer m
6520: 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67  ap entry for pag
6530: 65 20 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67  e 'key', writing
6540: 0a 2a 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64  .** the type and
6550: 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d   parent page num
6560: 62 65 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61  ber to *pEType a
6570: 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63  nd *pPgno respec
6580: 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72  tively..** An er
6590: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
65a0: 72 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e  rned if somethin
65b0: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74  g goes wrong, ot
65c0: 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f  herwise SQLITE_O
65d0: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
65e0: 20 70 74 72 6d 61 70 47 65 74 28 42 74 53 68 61   ptrmapGet(BtSha
65f0: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b  red *pBt, Pgno k
6600: 65 79 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20  ey, u8 *pEType, 
6610: 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20  Pgno *pPgno){.  
6620: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
6630: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
6640: 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  r map page */.  
6650: 69 6e 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20  int iPtrmap;    
6660: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
6670: 70 20 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a  p page index */.
6680: 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20    u8 *pPtrmap;  
6690: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
66a0: 6d 61 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f  map page data */
66b0: 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20  .  int offset;  
66c0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
66d0: 6f 66 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e  of entry in poin
66e0: 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74  ter map */.  int
66f0: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
6700: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
6710: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
6720: 3b 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50  ;..  iPtrmap = P
6730: 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
6740: 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73  , key);.  rc = s
6750: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
6760: 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72  Bt->pPager, iPtr
6770: 6d 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a  map, &pDbPage);.
6780: 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
6790: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
67a0: 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75  }.  pPtrmap = (u
67b0: 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  8 *)sqlite3Pager
67c0: 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
67d0: 3b 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54  ;..  offset = PT
67e0: 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69  RMAP_PTROFFSET(i
67f0: 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20  Ptrmap, key);.  
6800: 61 73 73 65 72 74 28 20 70 45 54 79 70 65 21 3d  assert( pEType!=
6810: 30 20 29 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d  0 );.  *pEType =
6820: 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d   pPtrmap[offset]
6830: 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f 20 29 20  ;.  if( pPgno ) 
6840: 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  *pPgno = get4byt
6850: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
6860: 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65  t+1]);..  sqlite
6870: 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
6880: 61 67 65 29 3b 0a 20 20 69 66 28 20 2a 70 45 54  age);.  if( *pET
6890: 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65  ype<1 || *pEType
68a0: 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  >5 ) return SQLI
68b0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
68c0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
68d0: 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a  _OK;.}..#else /*
68e0: 20 69 66 20 64 65 66 69 6e 65 64 20 53 51 4c 49   if defined SQLI
68f0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
6900: 55 4d 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  UM */.  #define 
6910: 70 74 72 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c  ptrmapPut(w,x,y,
6920: 7a 2c 72 63 29 0a 20 20 23 64 65 66 69 6e 65 20  z,rc).  #define 
6930: 70 74 72 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c  ptrmapGet(w,x,y,
6940: 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23  z) SQLITE_OK.  #
6950: 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74  define ptrmapPut
6960: 4f 76 66 6c 50 74 72 28 78 2c 20 79 2c 20 72 63  OvflPtr(x, y, rc
6970: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
6980: 47 69 76 65 6e 20 61 20 62 74 72 65 65 20 70 61  Given a btree pa
6990: 67 65 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e  ge and a cell in
69a0: 64 65 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65  dex (0 means the
69b0: 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a   first cell on.*
69c0: 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65  * the page, 1 me
69d0: 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63  ans the second c
69e0: 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74  ell, and so fort
69f0: 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  h) return a poin
6a00: 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65  ter.** to the ce
6a10: 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a  ll content..**.*
6a20: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
6a30: 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61  orks only for pa
6a40: 67 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20  ges that do not 
6a50: 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77  contain overflow
6a60: 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69   cells..*/.#defi
6a70: 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29  ne findCell(P,I)
6a80: 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61   \.  ((P)->aData
6a90: 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67   + ((P)->maskPag
6aa0: 65 20 26 20 67 65 74 32 62 79 74 65 28 26 28 50  e & get2byte(&(P
6ab0: 29 2d 3e 61 44 61 74 61 5b 28 50 29 2d 3e 63 65  )->aData[(P)->ce
6ac0: 6c 6c 4f 66 66 73 65 74 2b 32 2a 28 49 29 5d 29  llOffset+2*(I)])
6ad0: 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61  ))../*.** This a
6ae0: 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76 65   more complex ve
6af0: 72 73 69 6f 6e 20 6f 66 20 66 69 6e 64 43 65 6c  rsion of findCel
6b00: 6c 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66  l() that works f
6b10: 6f 72 0a 2a 2a 20 70 61 67 65 73 20 74 68 61 74  or.** pages that
6b20: 20 64 6f 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72   do contain over
6b30: 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73  flow cells..*/.s
6b40: 74 61 74 69 63 20 75 38 20 2a 66 69 6e 64 4f 76  tatic u8 *findOv
6b50: 65 72 66 6c 6f 77 43 65 6c 6c 28 4d 65 6d 50 61  erflowCell(MemPa
6b60: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69  ge *pPage, int i
6b70: 43 65 6c 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Cell){.  int i;.
6b80: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
6b90: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
6ba0: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
6bb0: 29 3b 0a 20 20 66 6f 72 28 69 3d 70 50 61 67 65  );.  for(i=pPage
6bc0: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d 31 3b 20 69  ->nOverflow-1; i
6bd0: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69  >=0; i--){.    i
6be0: 6e 74 20 6b 3b 0a 20 20 20 20 73 74 72 75 63 74  nt k;.    struct
6bf0: 20 5f 4f 76 66 6c 43 65 6c 6c 20 2a 70 4f 76 66   _OvflCell *pOvf
6c00: 6c 3b 0a 20 20 20 20 70 4f 76 66 6c 20 3d 20 26  l;.    pOvfl = &
6c10: 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 69 5d 3b  pPage->aOvfl[i];
6c20: 0a 20 20 20 20 6b 20 3d 20 70 4f 76 66 6c 2d 3e  .    k = pOvfl->
6c30: 69 64 78 3b 0a 20 20 20 20 69 66 28 20 6b 3c 3d  idx;.    if( k<=
6c40: 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69  iCell ){.      i
6c50: 66 28 20 6b 3d 3d 69 43 65 6c 6c 20 29 7b 0a 20  f( k==iCell ){. 
6c60: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 4f         return pO
6c70: 76 66 6c 2d 3e 70 43 65 6c 6c 3b 0a 20 20 20 20  vfl->pCell;.    
6c80: 20 20 7d 0a 20 20 20 20 20 20 69 43 65 6c 6c 2d    }.      iCell-
6c90: 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  -;.    }.  }.  r
6ca0: 65 74 75 72 6e 20 66 69 6e 64 43 65 6c 6c 28 70  eturn findCell(p
6cb0: 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a  Page, iCell);.}.
6cc0: 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20 63  ./*.** Parse a c
6cd0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63  ell content bloc
6ce0: 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68  k and fill in th
6cf0: 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63  e CellInfo struc
6d00: 74 75 72 65 2e 20 20 54 68 65 72 65 0a 2a 2a 20  ture.  There.** 
6d10: 61 72 65 20 74 77 6f 20 76 65 72 73 69 6f 6e 73  are two versions
6d20: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
6d30: 6e 2e 20 20 62 74 72 65 65 50 61 72 73 65 43 65  n.  btreeParseCe
6d40: 6c 6c 28 29 20 74 61 6b 65 73 20 61 20 0a 2a 2a  ll() takes a .**
6d50: 20 63 65 6c 6c 20 69 6e 64 65 78 20 61 73 20 74   cell index as t
6d60: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
6d70: 6e 74 20 61 6e 64 20 62 74 72 65 65 50 61 72 73  nt and btreePars
6d80: 65 43 65 6c 6c 50 74 72 28 29 20 0a 2a 2a 20 74  eCellPtr() .** t
6d90: 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74  akes a pointer t
6da0: 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68  o the body of th
6db0: 65 20 63 65 6c 6c 20 61 73 20 69 74 73 20 73 65  e cell as its se
6dc0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
6dd0: 2a 0a 2a 2a 20 57 69 74 68 69 6e 20 74 68 69 73  *.** Within this
6de0: 20 66 69 6c 65 2c 20 74 68 65 20 70 61 72 73 65   file, the parse
6df0: 43 65 6c 6c 28 29 20 6d 61 63 72 6f 20 63 61 6e  Cell() macro can
6e00: 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 73 74 65   be called inste
6e10: 61 64 20 6f 66 0a 2a 2a 20 62 74 72 65 65 50 61  ad of.** btreePa
6e20: 72 73 65 43 65 6c 6c 50 74 72 28 29 2e 20 55 73  rseCellPtr(). Us
6e30: 69 6e 67 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65  ing some compile
6e40: 72 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65  rs, this will be
6e50: 20 66 61 73 74 65 72 2e 0a 2a 2f 0a 73 74 61 74   faster..*/.stat
6e60: 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72  ic void btreePar
6e70: 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d  seCellPtr(.  Mem
6e80: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
6e90: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
6ea0: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
6eb0: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
6ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6ed0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
6ee0: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
6ef0: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
6f00: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
6f10: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
6f20: 65 20 2a 2f 0a 29 7b 0a 20 20 75 31 36 20 6e 3b  e */.){.  u16 n;
6f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f40: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 62 79 74 65    /* Number byte
6f50: 73 20 69 6e 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  s in cell conten
6f60: 74 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33  t header */.  u3
6f70: 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20  2 nPayload;     
6f80: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6f90: 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c  of bytes of cell
6fa0: 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61   payload */..  a
6fb0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
6fc0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
6fd0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
6fe0: 0a 20 20 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c 20  .  pInfo->pCell 
6ff0: 3d 20 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  = pCell;.  asser
7000: 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  t( pPage->leaf==
7010: 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66  0 || pPage->leaf
7020: 3d 3d 31 20 29 3b 0a 20 20 6e 20 3d 20 70 50 61  ==1 );.  n = pPa
7030: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
7040: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 34  ;.  assert( n==4
7050: 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  -4*pPage->leaf )
7060: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
7070: 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 69 66 28  ntKey ){.    if(
7080: 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
7090: 29 7b 0a 20 20 20 20 20 20 6e 20 2b 3d 20 67 65  ){.      n += ge
70a0: 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c  tVarint32(&pCell
70b0: 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a  [n], nPayload);.
70c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
70d0: 20 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20   nPayload = 0;. 
70e0: 20 20 20 7d 0a 20 20 20 20 6e 20 2b 3d 20 67 65     }.    n += ge
70f0: 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e  tVarint(&pCell[n
7100: 5d 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d  ], (u64*)&pInfo-
7110: 3e 6e 4b 65 79 29 3b 0a 20 20 20 20 70 49 6e 66  >nKey);.    pInf
7120: 6f 2d 3e 6e 44 61 74 61 20 3d 20 6e 50 61 79 6c  o->nData = nPayl
7130: 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  oad;.  }else{.  
7140: 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d    pInfo->nData =
7150: 20 30 3b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74   0;.    n += get
7160: 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b  Varint32(&pCell[
7170: 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20  n], nPayload);. 
7180: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d     pInfo->nKey =
7190: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20   nPayload;.  }. 
71a0: 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64   pInfo->nPayload
71b0: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70   = nPayload;.  p
71c0: 49 6e 66 6f 2d 3e 6e 48 65 61 64 65 72 20 3d 20  Info->nHeader = 
71d0: 6e 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  n;.  testcase( n
71e0: 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e  Payload==pPage->
71f0: 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65  maxLocal );.  te
7200: 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64  stcase( nPayload
7210: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
7220: 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6c 69 6b  l+1 );.  if( lik
7230: 65 6c 79 28 6e 50 61 79 6c 6f 61 64 3c 3d 70 50  ely(nPayload<=pP
7240: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 29 20 29  age->maxLocal) )
7250: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  {.    /* This is
7260: 20 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d   the (easy) comm
7270: 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68  on case where th
7280: 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64  e entire payload
7290: 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20   fits.    ** on 
72a0: 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20  the local page. 
72b0: 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20   No overflow is 
72c0: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
72d0: 0a 20 20 20 20 69 6e 74 20 6e 53 69 7a 65 3b 20  .    int nSize; 
72e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
72f0: 6c 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 20 63  l size of cell c
7300: 6f 6e 74 65 6e 74 20 69 6e 20 62 79 74 65 73 20  ontent in bytes 
7310: 2a 2f 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 6e  */.    nSize = n
7320: 50 61 79 6c 6f 61 64 20 2b 20 6e 3b 0a 20 20 20  Payload + n;.   
7330: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
7340: 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a   (u16)nPayload;.
7350: 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72      pInfo->iOver
7360: 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 69 66  flow = 0;.    if
7370: 28 20 28 6e 53 69 7a 65 20 26 20 7e 33 29 3d 3d  ( (nSize & ~3)==
7380: 30 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65  0 ){.      nSize
7390: 20 3d 20 34 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 4;        /* 
73a0: 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a  Minimum cell siz
73b0: 65 20 69 73 20 34 20 2a 2f 0a 20 20 20 20 7d 0a  e is 4 */.    }.
73c0: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65      pInfo->nSize
73d0: 20 3d 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a 20   = (u16)nSize;. 
73e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
73f0: 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69  f the payload wi
7400: 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c  ll not fit compl
7410: 65 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63  etely on the loc
7420: 61 6c 20 70 61 67 65 2c 20 77 65 20 68 61 76 65  al page, we have
7430: 0a 20 20 20 20 2a 2a 20 74 6f 20 64 65 63 69 64  .    ** to decid
7440: 65 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74  e how much to st
7450: 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20  ore locally and 
7460: 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c  how much to spil
7470: 6c 20 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20 6f 76  l onto.    ** ov
7480: 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54  erflow pages.  T
7490: 68 65 20 73 74 72 61 74 65 67 79 20 69 73 20 74  he strategy is t
74a0: 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61  o minimize the a
74b0: 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a  mount of unused.
74c0: 20 20 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20      ** space on 
74d0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77  overflow pages w
74e0: 68 69 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65  hile keeping the
74f0: 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c   amount of local
7500: 20 73 74 6f 72 61 67 65 0a 20 20 20 20 2a 2a 20   storage.    ** 
7510: 69 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f  in between minLo
7520: 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c  cal and maxLocal
7530: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
7540: 57 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69  Warning:  changi
7550: 6e 67 20 74 68 65 20 77 61 79 20 6f 76 65 72 66  ng the way overf
7560: 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64  low payload is d
7570: 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e  istributed in an
7580: 79 0a 20 20 20 20 2a 2a 20 77 61 79 20 77 69 6c  y.    ** way wil
7590: 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69  l result in an i
75a0: 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65  ncompatible file
75b0: 20 66 6f 72 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a   format..    */.
75c0: 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c      int minLocal
75d0: 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d  ;  /* Minimum am
75e0: 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
75f0: 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a  held locally */.
7600: 20 20 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c      int maxLocal
7610: 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d  ;  /* Maximum am
7620: 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
7630: 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a  held locally */.
7640: 20 20 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b      int surplus;
7650: 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70     /* Overflow p
7660: 61 79 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65  ayload available
7670: 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61   for local stora
7680: 67 65 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f  ge */..    minLo
7690: 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e  cal = pPage->min
76a0: 4c 6f 63 61 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f  Local;.    maxLo
76b0: 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78  cal = pPage->max
76c0: 4c 6f 63 61 6c 3b 0a 20 20 20 20 73 75 72 70 6c  Local;.    surpl
76d0: 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20  us = minLocal + 
76e0: 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c  (nPayload - minL
76f0: 6f 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70 42  ocal)%(pPage->pB
7700: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
7710: 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  4);.    testcase
7720: 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f  ( surplus==maxLo
7730: 63 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63  cal );.    testc
7740: 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61  ase( surplus==ma
7750: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20  xLocal+1 );.    
7760: 69 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d  if( surplus <= m
7770: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20  axLocal ){.     
7780: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
7790: 20 28 75 31 36 29 73 75 72 70 6c 75 73 3b 0a 20   (u16)surplus;. 
77a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
77b0: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
77c0: 28 75 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  (u16)minLocal;. 
77d0: 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e     }.    pInfo->
77e0: 69 4f 76 65 72 66 6c 6f 77 20 3d 20 28 75 31 36  iOverflow = (u16
77f0: 29 28 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20  )(pInfo->nLocal 
7800: 2b 20 6e 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  + n);.    pInfo-
7810: 3e 6e 53 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e  >nSize = pInfo->
7820: 69 4f 76 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 20  iOverflow + 4;. 
7830: 20 7d 0a 7d 0a 23 64 65 66 69 6e 65 20 70 61 72   }.}.#define par
7840: 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  seCell(pPage, iC
7850: 65 6c 6c 2c 20 70 49 6e 66 6f 29 20 5c 0a 20 20  ell, pInfo) \.  
7860: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
7870: 72 28 28 70 50 61 67 65 29 2c 20 66 69 6e 64 43  r((pPage), findC
7880: 65 6c 6c 28 28 70 50 61 67 65 29 2c 20 28 69 43  ell((pPage), (iC
7890: 65 6c 6c 29 29 2c 20 28 70 49 6e 66 6f 29 29 0a  ell)), (pInfo)).
78a0: 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
78b0: 65 50 61 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65  eParseCell(.  Me
78c0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
78d0: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
78e0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c  ntaining the cel
78f0: 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c  l */.  int iCell
7900: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
7910: 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64 65 78  * The cell index
7920: 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20 69 73  .  First cell is
7930: 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f   0 */.  CellInfo
7940: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
7950: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
7960: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
7970: 20 20 70 61 72 73 65 43 65 6c 6c 28 70 50 61 67    parseCell(pPag
7980: 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29  e, iCell, pInfo)
7990: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  ;.}../*.** Compu
79a0: 74 65 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  te the total num
79b0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 68 61  ber of bytes tha
79c0: 74 20 61 20 43 65 6c 6c 20 6e 65 65 64 73 20 69  t a Cell needs i
79d0: 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61  n the cell.** da
79e0: 74 61 20 61 72 65 61 20 6f 66 20 74 68 65 20 62  ta area of the b
79f0: 74 72 65 65 2d 70 61 67 65 2e 20 20 54 68 65 20  tree-page.  The 
7a00: 72 65 74 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e  return number in
7a10: 63 6c 75 64 65 73 20 74 68 65 20 63 65 6c 6c 0a  cludes the cell.
7a20: 2a 2a 20 64 61 74 61 20 68 65 61 64 65 72 20 61  ** data header a
7a30: 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 79  nd the local pay
7a40: 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e  load, but not an
7a50: 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  y overflow page 
7a60: 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61 63 65 20  or.** the space 
7a70: 75 73 65 64 20 62 79 20 74 68 65 20 63 65 6c 6c  used by the cell
7a80: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61   pointer..*/.sta
7a90: 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65  tic u16 cellSize
7aa0: 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  Ptr(MemPage *pPa
7ab0: 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a  ge, u8 *pCell){.
7ac0: 20 20 75 38 20 2a 70 49 74 65 72 20 3d 20 26 70    u8 *pIter = &p
7ad0: 43 65 6c 6c 5b 70 50 61 67 65 2d 3e 63 68 69 6c  Cell[pPage->chil
7ae0: 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 75 33 32  dPtrSize];.  u32
7af0: 20 6e 53 69 7a 65 3b 0a 0a 23 69 66 64 65 66 20   nSize;..#ifdef 
7b00: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
7b10: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
7b20: 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rned by this fun
7b30: 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77  ction should alw
7b40: 61 79 73 20 62 65 20 74 68 65 20 73 61 6d 65 20  ays be the same 
7b50: 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c  as.  ** the (Cel
7b60: 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c  lInfo.nSize) val
7b70: 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e  ue found by doin
7b80: 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f  g a full parse o
7b90: 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e  f the.  ** cell.
7ba0: 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47   If SQLITE_DEBUG
7bb0: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20   is defined, an 
7bc0: 61 73 73 65 72 74 28 29 20 61 74 20 74 68 65 20  assert() at the 
7bd0: 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74  bottom of.  ** t
7be0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72  his function ver
7bf0: 69 66 69 65 73 20 74 68 61 74 20 74 68 69 73 20  ifies that this 
7c00: 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74  invariant is not
7c10: 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20   violated. */.  
7c20: 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e  CellInfo debugin
7c30: 66 6f 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65  fo;.  btreeParse
7c40: 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
7c50: 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f  Cell, &debuginfo
7c60: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  );.#endif..  if(
7c70: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
7c80: 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 3b 0a  {.    u8 *pEnd;.
7c90: 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68      if( pPage->h
7ca0: 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  asData ){.      
7cb0: 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69  pIter += getVari
7cc0: 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 53 69 7a  nt32(pIter, nSiz
7cd0: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
7ce0: 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 30 3b 0a       nSize = 0;.
7cf0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 70 49      }..    /* pI
7d00: 74 65 72 20 6e 6f 77 20 70 6f 69 6e 74 73 20 61  ter now points a
7d10: 74 20 74 68 65 20 36 34 2d 62 69 74 20 69 6e 74  t the 64-bit int
7d20: 65 67 65 72 20 6b 65 79 20 76 61 6c 75 65 2c 20  eger key value, 
7d30: 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  a variable lengt
7d40: 68 20 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65  h .    ** intege
7d50: 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  r. The following
7d60: 20 62 6c 6f 63 6b 20 6d 6f 76 65 73 20 70 49 74   block moves pIt
7d70: 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74  er to point at t
7d80: 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 20 20  he first byte.  
7d90: 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e    ** past the en
7da0: 64 20 6f 66 20 74 68 65 20 6b 65 79 20 76 61 6c  d of the key val
7db0: 75 65 2e 20 2a 2f 0a 20 20 20 20 70 45 6e 64 20  ue. */.    pEnd 
7dc0: 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20 20  = &pIter[9];.   
7dd0: 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b   while( (*pIter+
7de0: 2b 29 26 30 78 38 30 20 26 26 20 70 49 74 65 72  +)&0x80 && pIter
7df0: 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 65 6c 73 65  <pEnd );.  }else
7e00: 7b 0a 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67  {.    pIter += g
7e10: 65 74 56 61 72 69 6e 74 33 32 28 70 49 74 65 72  etVarint32(pIter
7e20: 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20  , nSize);.  }.. 
7e30: 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65   testcase( nSize
7e40: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
7e50: 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  l );.  testcase(
7e60: 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d   nSize==pPage->m
7e70: 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69  axLocal+1 );.  i
7e80: 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e  f( nSize>pPage->
7e90: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
7ea0: 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70  int minLocal = p
7eb0: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a  Page->minLocal;.
7ec0: 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c      nSize = minL
7ed0: 6f 63 61 6c 20 2b 20 28 6e 53 69 7a 65 20 2d 20  ocal + (nSize - 
7ee0: 6d 69 6e 4c 6f 63 61 6c 29 20 25 20 28 70 50 61  minLocal) % (pPa
7ef0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
7f00: 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65  ize - 4);.    te
7f10: 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70  stcase( nSize==p
7f20: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
7f30: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
7f40: 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61  nSize==pPage->ma
7f50: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20  xLocal+1 );.    
7f60: 69 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d  if( nSize>pPage-
7f70: 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >maxLocal ){.   
7f80: 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f     nSize = minLo
7f90: 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  cal;.    }.    n
7fa0: 53 69 7a 65 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20  Size += 4;.  }. 
7fb0: 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32 29 28   nSize += (u32)(
7fc0: 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a  pIter - pCell);.
7fd0: 0a 20 20 2f 2a 20 54 68 65 20 6d 69 6e 69 6d 75  .  /* The minimu
7fe0: 6d 20 73 69 7a 65 20 6f 66 20 61 6e 79 20 63 65  m size of any ce
7ff0: 6c 6c 20 69 73 20 34 20 62 79 74 65 73 2e 20 2a  ll is 4 bytes. *
8000: 2f 0a 20 20 69 66 28 20 6e 53 69 7a 65 3c 34 20  /.  if( nSize<4 
8010: 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 34  ){.    nSize = 4
8020: 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
8030: 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67 69 6e 66   nSize==debuginf
8040: 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 72 65 74  o.nSize );.  ret
8050: 75 72 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a  urn (u16)nSize;.
8060: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
8070: 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 76  _DEBUG./* This v
8080: 61 72 69 61 74 69 6f 6e 20 6f 6e 20 63 65 6c 6c  ariation on cell
8090: 53 69 7a 65 50 74 72 28 29 20 69 73 20 75 73 65  SizePtr() is use
80a0: 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65  d inside of asse
80b0: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 0a  rt() statements.
80c0: 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61 74  ** only. */.stat
80d0: 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 28  ic u16 cellSize(
80e0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
80f0: 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72 65  int iCell){.  re
8100: 74 75 72 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72  turn cellSizePtr
8110: 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c  (pPage, findCell
8120: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 29 3b  (pPage, iCell));
8130: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
8140: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
8150: 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  UTOVACUUM./*.** 
8160: 49 66 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c  If the cell pCel
8170: 6c 2c 20 70 61 72 74 20 6f 66 20 70 61 67 65 20  l, part of page 
8180: 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61  pPage contains a
8190: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61   pointer.** to a
81a0: 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  n overflow page,
81b0: 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79   insert an entry
81c0: 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65   into the pointe
81d0: 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65  r-map.** for the
81e0: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a   overflow page..
81f0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
8200: 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
8210: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
8220: 75 38 20 2a 70 43 65 6c 6c 2c 20 69 6e 74 20 2a  u8 *pCell, int *
8230: 70 52 43 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f  pRC){.  CellInfo
8240: 20 69 6e 66 6f 3b 0a 20 20 69 66 28 20 2a 70 52   info;.  if( *pR
8250: 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  C ) return;.  as
8260: 73 65 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29  sert( pCell!=0 )
8270: 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65  ;.  btreeParseCe
8280: 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
8290: 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73  ll, &info);.  as
82a0: 73 65 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74  sert( (info.nDat
82b0: 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  a+(pPage->intKey
82c0: 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d  ?0:info.nKey))==
82d0: 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b  info.nPayload );
82e0: 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65  .  if( info.iOve
82f0: 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 50 67 6e  rflow ){.    Pgn
8300: 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  o ovfl = get4byt
8310: 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
8320: 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 70  verflow]);.    p
8330: 74 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e  trmapPut(pPage->
8340: 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41  pBt, ovfl, PTRMA
8350: 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61  P_OVERFLOW1, pPa
8360: 67 65 2d 3e 70 67 6e 6f 2c 20 70 52 43 29 3b 0a  ge->pgno, pRC);.
8370: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f    }.}.#endif.../
8380: 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20  *.** Defragment 
8390: 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20  the page given. 
83a0: 20 41 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20 6d   All Cells are m
83b0: 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 65  oved to the.** e
83c0: 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 20 61  nd of the page a
83d0: 6e 64 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63  nd all free spac
83e0: 65 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69  e is collected i
83f0: 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20 46  nto one.** big F
8400: 72 65 65 42 6c 6b 20 74 68 61 74 20 6f 63 63 75  reeBlk that occu
8410: 72 73 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  rs in between th
8420: 65 20 68 65 61 64 65 72 20 61 6e 64 20 63 65 6c  e header and cel
8430: 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72 72  l.** pointer arr
8440: 61 79 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20  ay and the cell 
8450: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a 2f  content area..*/
8460: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 66 72  .static int defr
8470: 61 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61  agmentPage(MemPa
8480: 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e  ge *pPage){.  in
8490: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
84a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
84b0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
84c0: 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20  t pc;           
84d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
84e0: 65 73 73 20 6f 66 20 61 20 69 2d 74 68 20 63 65  ess of a i-th ce
84f0: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b  ll */.  int hdr;
8500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8510: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
8520: 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20  the page header 
8530: 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20  */.  int size;  
8540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8550: 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c  /* Size of a cel
8560: 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c  l */.  int usabl
8570: 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  eSize;          
8580: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75    /* Number of u
8590: 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61  sable bytes on a
85a0: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63   page */.  int c
85b0: 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20  ellOffset;      
85c0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
85d0: 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  to the cell poin
85e0: 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69  ter array */.  i
85f0: 6e 74 20 63 62 72 6b 3b 20 20 20 20 20 20 20 20  nt cbrk;        
8600: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
8610: 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
8620: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
8630: 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20    int nCell;    
8640: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8650: 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
8660: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
8670: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
8680: 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54  data;       /* T
8690: 68 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  he page data */.
86a0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
86b0: 2a 74 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20  *temp;       /* 
86c0: 54 65 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65  Temp area for ce
86d0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ll content */.  
86e0: 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20  int iCellFirst; 
86f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
8700: 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65  rst allowable ce
8710: 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  ll index */.  in
8720: 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20  t iCellLast;    
8730: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74           /* Last
8740: 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 69   possible cell i
8750: 6e 64 65 78 20 2a 2f 0a 0a 0a 20 20 61 73 73 65  ndex */...  asse
8760: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
8770: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
8780: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
8790: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
87a0: 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
87b0: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  rt( pPage->pBt->
87c0: 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51  usableSize <= SQ
87d0: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
87e0: 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ZE );.  assert( 
87f0: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
8800: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
8810: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
8820: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
8830: 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65 6d 70  mutex) );.  temp
8840: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54   = sqlite3PagerT
8850: 65 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d 3e  empSpace(pPage->
8860: 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
8870: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
8880: 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  ata;.  hdr = pPa
8890: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
88a0: 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50   cellOffset = pP
88b0: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b  age->cellOffset;
88c0: 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65  .  nCell = pPage
88d0: 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  ->nCell;.  asser
88e0: 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79  t( nCell==get2by
88f0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29  te(&data[hdr+3])
8900: 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65   );.  usableSize
8910: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   = pPage->pBt->u
8920: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63 62 72  sableSize;.  cbr
8930: 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  k = get2byte(&da
8940: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65  ta[hdr+5]);.  me
8950: 6d 63 70 79 28 26 74 65 6d 70 5b 63 62 72 6b 5d  mcpy(&temp[cbrk]
8960: 2c 20 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 75  , &data[cbrk], u
8970: 73 61 62 6c 65 53 69 7a 65 20 2d 20 63 62 72 6b  sableSize - cbrk
8980: 29 3b 0a 20 20 63 62 72 6b 20 3d 20 75 73 61 62  );.  cbrk = usab
8990: 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 46  leSize;.  iCellF
89a0: 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65  irst = cellOffse
89b0: 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 69  t + 2*nCell;.  i
89c0: 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c  CellLast = usabl
89d0: 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72  eSize - 4;.  for
89e0: 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
89f0: 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64  ++){.    u8 *pAd
8a00: 64 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69  dr;     /* The i
8a10: 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  -th cell pointer
8a20: 20 2a 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20   */.    pAddr = 
8a30: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
8a40: 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20   + i*2];.    pc 
8a50: 3d 20 67 65 74 32 62 79 74 65 28 70 41 64 64 72  = get2byte(pAddr
8a60: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
8a70: 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc==iCellFirst 
8a80: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
8a90: 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29   pc==iCellLast )
8aa0: 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ;.#if !defined(S
8ab0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45  QLITE_ENABLE_OVE
8ac0: 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b  RSIZE_CELL_CHECK
8ad0: 29 0a 20 20 20 20 2f 2a 20 54 68 65 73 65 20 63  ).    /* These c
8ae0: 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76 65 20 61  onditions have a
8af0: 6c 72 65 61 64 79 20 62 65 65 6e 20 76 65 72 69  lready been veri
8b00: 66 69 65 64 20 69 6e 20 62 74 72 65 65 49 6e 69  fied in btreeIni
8b10: 74 50 61 67 65 28 29 0a 20 20 20 20 2a 2a 20 69  tPage().    ** i
8b20: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
8b30: 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48  OVERSIZE_CELL_CH
8b40: 45 43 4b 20 69 73 20 64 65 66 69 6e 65 64 20 0a  ECK is defined .
8b50: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
8b60: 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20  c<iCellFirst || 
8b70: 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
8b80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
8b90: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
8ba0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
8bb0: 20 20 20 61 73 73 65 72 74 28 20 70 63 3e 3d 69     assert( pc>=i
8bc0: 43 65 6c 6c 46 69 72 73 74 20 26 26 20 70 63 3c  CellFirst && pc<
8bd0: 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20  =iCellLast );.  
8be0: 20 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a    size = cellSiz
8bf0: 65 50 74 72 28 70 50 61 67 65 2c 20 26 74 65 6d  ePtr(pPage, &tem
8c00: 70 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b  p[pc]);.    cbrk
8c10: 20 2d 3d 20 73 69 7a 65 3b 0a 23 69 66 20 64 65   -= size;.#if de
8c20: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
8c30: 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c  BLE_OVERSIZE_CEL
8c40: 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 69 66 28  L_CHECK).    if(
8c50: 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74   cbrk<iCellFirst
8c60: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
8c70: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
8c80: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6c 73  BKPT;.    }.#els
8c90: 65 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69  e.    if( cbrk<i
8ca0: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b  CellFirst || pc+
8cb0: 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20  size>usableSize 
8cc0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
8cd0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
8ce0: 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  KPT;.    }.#endi
8cf0: 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 62  f.    assert( cb
8d00: 72 6b 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53  rk+size<=usableS
8d10: 69 7a 65 20 26 26 20 63 62 72 6b 3e 3d 69 43 65  ize && cbrk>=iCe
8d20: 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74  llFirst );.    t
8d30: 65 73 74 63 61 73 65 28 20 63 62 72 6b 2b 73 69  estcase( cbrk+si
8d40: 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29  ze==usableSize )
8d50: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
8d60: 70 63 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53  pc+size==usableS
8d70: 69 7a 65 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70  ize );.    memcp
8d80: 79 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26  y(&data[cbrk], &
8d90: 74 65 6d 70 5b 70 63 5d 2c 20 73 69 7a 65 29 3b  temp[pc], size);
8da0: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70 41  .    put2byte(pA
8db0: 64 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20 7d 0a  ddr, cbrk);.  }.
8dc0: 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 3e 3d    assert( cbrk>=
8dd0: 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20  iCellFirst );.  
8de0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
8df0: 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20 20  dr+5], cbrk);.  
8e00: 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b  data[hdr+1] = 0;
8e10: 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d  .  data[hdr+2] =
8e20: 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37   0;.  data[hdr+7
8e30: 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28  ] = 0;.  memset(
8e40: 26 64 61 74 61 5b 69 43 65 6c 6c 46 69 72 73 74  &data[iCellFirst
8e50: 5d 2c 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c 6c  ], 0, cbrk-iCell
8e60: 46 69 72 73 74 29 3b 0a 20 20 61 73 73 65 72 74  First);.  assert
8e70: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
8e80: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
8e90: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69  >pDbPage) );.  i
8ea0: 66 28 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72  f( cbrk-iCellFir
8eb0: 73 74 21 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65  st!=pPage->nFree
8ec0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
8ed0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
8ee0: 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
8ef0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
8f00: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42  *.** Allocate nB
8f10: 79 74 65 20 62 79 74 65 73 20 6f 66 20 73 70 61  yte bytes of spa
8f20: 63 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74  ce from within t
8f30: 68 65 20 42 2d 54 72 65 65 20 70 61 67 65 20 70  he B-Tree page p
8f40: 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20  assed.** as the 
8f50: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20  first argument. 
8f60: 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 49 64 78  Write into *pIdx
8f70: 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20   the index into 
8f80: 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a  pPage->aData[].*
8f90: 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 62  * of the first b
8fa0: 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64  yte of allocated
8fb0: 20 73 70 61 63 65 2e 20 52 65 74 75 72 6e 20 65   space. Return e
8fc0: 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20  ither SQLITE_OK 
8fd0: 6f 72 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63  or.** an error c
8fe0: 6f 64 65 20 28 75 73 75 61 6c 6c 79 20 53 51 4c  ode (usually SQL
8ff0: 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a  ITE_CORRUPT)..**
9000: 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 67  .** The caller g
9010: 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 74  uarantees that t
9020: 68 65 72 65 20 69 73 20 73 75 66 66 69 63 69 65  here is sufficie
9030: 6e 74 20 73 70 61 63 65 20 74 6f 20 6d 61 6b 65  nt space to make
9040: 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69   the.** allocati
9050: 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  on.  This routin
9060: 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20  e might need to 
9070: 64 65 66 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72  defragment in or
9080: 64 65 72 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20  der to bring.** 
9090: 61 6c 6c 20 74 68 65 20 73 70 61 63 65 20 74 6f  all the space to
90a0: 67 65 74 68 65 72 2c 20 68 6f 77 65 76 65 72 2e  gether, however.
90b0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77    This routine w
90c0: 69 6c 6c 20 61 76 6f 69 64 20 75 73 69 6e 67 0a  ill avoid using.
90d0: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74 77 6f  ** the first two
90e0: 20 62 79 74 65 73 20 70 61 73 74 20 74 68 65 20   bytes past the 
90f0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 65  cell pointer are
9100: 61 20 73 69 6e 63 65 20 70 72 65 73 75 6d 61 62  a since presumab
9110: 6c 79 20 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63  ly this.** alloc
9120: 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d  ation is being m
9130: 61 64 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ade in order to 
9140: 69 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c  insert a new cel
9150: 6c 2c 20 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a  l, so we will.**
9160: 20 61 6c 73 6f 20 65 6e 64 20 75 70 20 6e 65 65   also end up nee
9170: 64 69 6e 67 20 61 20 6e 65 77 20 63 65 6c 6c 20  ding a new cell 
9180: 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74  pointer..*/.stat
9190: 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53  ic int allocateS
91a0: 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  pace(MemPage *pP
91b0: 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20  age, int nByte, 
91c0: 69 6e 74 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f  int *pIdx){.  co
91d0: 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50  nst int hdr = pP
91e0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20  age->hdrOffset; 
91f0: 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68     /* Local cach
9200: 65 20 6f 66 20 70 50 61 67 65 2d 3e 68 64 72 4f  e of pPage->hdrO
9210: 66 66 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20  ffset */.  u8 * 
9220: 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61  const data = pPa
9230: 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20  ge->aData;      
9240: 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
9250: 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  f pPage->aData *
9260: 2f 0a 20 20 69 6e 74 20 6e 46 72 61 67 3b 20 20  /.  int nFrag;  
9270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9280: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
9290: 65 72 20 6f 66 20 66 72 61 67 6d 65 6e 74 65 64  er of fragmented
92a0: 20 62 79 74 65 73 20 6f 6e 20 70 50 61 67 65 20   bytes on pPage 
92b0: 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20  */.  int top;   
92c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
92e0: 73 74 20 62 79 74 65 20 6f 66 20 63 65 6c 6c 20  st byte of cell 
92f0: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
9300: 20 20 69 6e 74 20 67 61 70 3b 20 20 20 20 20 20    int gap;      
9310: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
9320: 6f 66 20 67 61 70 20 62 65 74 77 65 65 6e 20 63  of gap between c
9330: 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e 64  ell pointers and
9340: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f   cell content */
9350: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
9360: 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 72 65     /* Integer re
9370: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
9380: 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 2f  nt usableSize; /
9390: 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20 6f 66  * Usable size of
93a0: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 0a   the page */.  .
93b0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
93c0: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
93d0: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
93e0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
93f0: 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61  Page->pBt );.  a
9400: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
9410: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
9420: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
9430: 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 3e    assert( nByte>
9440: 3d 30 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75  =0 );  /* Minimu
9450: 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34  m cell size is 4
9460: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
9470: 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74  age->nFree>=nByt
9480: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
9490: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
94a0: 3d 30 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69  =0 );.  usableSi
94b0: 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  ze = pPage->pBt-
94c0: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 61  >usableSize;.  a
94d0: 73 73 65 72 74 28 20 6e 42 79 74 65 20 3c 20 75  ssert( nByte < u
94e0: 73 61 62 6c 65 53 69 7a 65 2d 38 20 29 3b 0a 0a  sableSize-8 );..
94f0: 20 20 6e 46 72 61 67 20 3d 20 64 61 74 61 5b 68    nFrag = data[h
9500: 64 72 2b 37 5d 3b 0a 20 20 61 73 73 65 72 74 28  dr+7];.  assert(
9510: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
9520: 65 74 20 3d 3d 20 68 64 72 20 2b 20 31 32 20 2d  et == hdr + 12 -
9530: 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29   4*pPage->leaf )
9540: 3b 0a 20 20 67 61 70 20 3d 20 70 50 61 67 65 2d  ;.  gap = pPage-
9550: 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a  >cellOffset + 2*
9560: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
9570: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
9580: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
9590: 69 66 28 20 67 61 70 3e 74 6f 70 20 29 20 72 65  if( gap>top ) re
95a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
95b0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 74 65 73 74  UPT_BKPT;.  test
95c0: 63 61 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70  case( gap+2==top
95d0: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
95e0: 67 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20  gap+1==top );.  
95f0: 74 65 73 74 63 61 73 65 28 20 67 61 70 3d 3d 74  testcase( gap==t
9600: 6f 70 20 29 3b 0a 0a 20 20 69 66 28 20 6e 46 72  op );..  if( nFr
9610: 61 67 3e 3d 36 30 20 29 7b 0a 20 20 20 20 2f 2a  ag>=60 ){.    /*
9620: 20 41 6c 77 61 79 73 20 64 65 66 72 61 67 6d 65   Always defragme
9630: 6e 74 20 68 69 67 68 6c 79 20 66 72 61 67 6d 65  nt highly fragme
9640: 6e 74 65 64 20 70 61 67 65 73 20 2a 2f 0a 20 20  nted pages */.  
9650: 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e    rc = defragmen
9660: 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
9670: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
9680: 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20  n rc;.    top = 
9690: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
96a0: 64 72 2b 35 5d 29 3b 0a 20 20 7d 65 6c 73 65 20  dr+5]);.  }else 
96b0: 69 66 28 20 67 61 70 2b 32 3c 3d 74 6f 70 20 29  if( gap+2<=top )
96c0: 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20  {.    /* Search 
96d0: 74 68 65 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f  the freelist loo
96e0: 6b 69 6e 67 20 66 6f 72 20 61 20 66 72 65 65 20  king for a free 
96f0: 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 20  slot big enough 
9700: 74 6f 20 73 61 74 69 73 66 79 20 0a 20 20 20 20  to satisfy .    
9710: 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 2e 20  ** the request. 
9720: 54 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  The allocation i
9730: 73 20 6d 61 64 65 20 66 72 6f 6d 20 74 68 65 20  s made from the 
9740: 66 69 72 73 74 20 66 72 65 65 20 73 6c 6f 74 20  first free slot 
9750: 69 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c  in .    ** the l
9760: 69 73 74 20 74 68 61 74 20 69 73 20 6c 61 72 67  ist that is larg
9770: 65 20 65 6e 6f 75 67 68 20 74 6f 20 61 63 63 6f  e enough to acco
9780: 6d 61 64 61 74 65 20 69 74 2e 0a 20 20 20 20 2a  madate it..    *
9790: 2f 0a 20 20 20 20 69 6e 74 20 70 63 2c 20 61 64  /.    int pc, ad
97a0: 64 72 3b 0a 20 20 20 20 66 6f 72 28 61 64 64 72  dr;.    for(addr
97b0: 3d 68 64 72 2b 31 3b 20 28 70 63 20 3d 20 67 65  =hdr+1; (pc = ge
97c0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64  t2byte(&data[add
97d0: 72 5d 29 29 3e 30 3b 20 61 64 64 72 3d 70 63 29  r]))>0; addr=pc)
97e0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65  {.      int size
97f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
9800: 53 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65  Size of the free
9810: 20 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69   slot */.      i
9820: 66 28 20 70 63 3e 75 73 61 62 6c 65 53 69 7a 65  f( pc>usableSize
9830: 2d 34 20 7c 7c 20 70 63 3c 61 64 64 72 2b 34 20  -4 || pc<addr+4 
9840: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
9850: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
9860: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  _BKPT;.      }. 
9870: 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32       size = get2
9880: 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d  byte(&data[pc+2]
9890: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a  );.      if( siz
98a0: 65 3e 3d 6e 42 79 74 65 20 29 7b 0a 20 20 20 20  e>=nByte ){.    
98b0: 20 20 20 20 69 6e 74 20 78 20 3d 20 73 69 7a 65      int x = size
98c0: 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20   - nByte;.      
98d0: 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 34    testcase( x==4
98e0: 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
98f0: 63 61 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20  case( x==3 );.  
9900: 20 20 20 20 20 20 69 66 28 20 78 3c 34 20 29 7b        if( x<4 ){
9910: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  .          /* Re
9920: 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74 20 66 72  move the slot fr
9930: 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  om the free-list
9940: 2e 20 55 70 64 61 74 65 20 74 68 65 20 6e 75 6d  . Update the num
9950: 62 65 72 20 6f 66 0a 20 20 20 20 20 20 20 20 20  ber of.         
9960: 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65 64 20 62   ** fragmented b
9970: 79 74 65 73 20 77 69 74 68 69 6e 20 74 68 65 20  ytes within the 
9980: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  page. */.       
9990: 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
99a0: 61 64 64 72 5d 2c 20 26 64 61 74 61 5b 70 63 5d  addr], &data[pc]
99b0: 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 2);.          
99c0: 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 28 75  data[hdr+7] = (u
99d0: 38 29 28 6e 46 72 61 67 20 2b 20 78 29 3b 0a 20  8)(nFrag + x);. 
99e0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
99f0: 20 73 69 7a 65 2b 70 63 20 3e 20 75 73 61 62 6c   size+pc > usabl
9a00: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
9a10: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9a20: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
9a30: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
9a40: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
9a50: 6c 6f 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74  lot remains on t
9a60: 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 52 65  he free-list. Re
9a70: 64 75 63 65 20 69 74 73 20 73 69 7a 65 20 74 6f  duce its size to
9a80: 20 61 63 63 6f 75 6e 74 0a 20 20 20 20 20 20 20   account.       
9a90: 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f     ** for the po
9aa0: 72 74 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68  rtion used by th
9ab0: 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e  e new allocation
9ac0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70  . */.          p
9ad0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  ut2byte(&data[pc
9ae0: 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 20  +2], x);.       
9af0: 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 49 64 78   }.        *pIdx
9b00: 20 3d 20 70 63 20 2b 20 78 3b 0a 20 20 20 20 20   = pc + x;.     
9b10: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9b20: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
9b30: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65   }.  }..  /* Che
9b40: 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ck to make sure 
9b50: 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20  there is enough 
9b60: 73 70 61 63 65 20 69 6e 20 74 68 65 20 67 61 70  space in the gap
9b70: 20 74 6f 20 73 61 74 69 73 66 79 0a 20 20 2a 2a   to satisfy.  **
9b80: 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e   the allocation.
9b90: 20 20 49 66 20 6e 6f 74 2c 20 64 65 66 72 61 67    If not, defrag
9ba0: 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 74 65 73  ment..  */.  tes
9bb0: 74 63 61 73 65 28 20 67 61 70 2b 32 2b 6e 42 79  tcase( gap+2+nBy
9bc0: 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28  te==top );.  if(
9bd0: 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e 74 6f 70   gap+2+nByte>top
9be0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 64 65 66   ){.    rc = def
9bf0: 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67  ragmentPage(pPag
9c00: 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
9c10: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
9c20: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
9c30: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
9c40: 20 20 61 73 73 65 72 74 28 20 67 61 70 2b 6e 42    assert( gap+nB
9c50: 79 74 65 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a  yte<=top );.  }.
9c60: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
9c70: 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20  memory from the 
9c80: 67 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74  gap in between t
9c90: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
9ca0: 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74  array.  ** and t
9cb0: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
9cc0: 61 72 65 61 2e 20 20 54 68 65 20 62 74 72 65 65  area.  The btree
9cd0: 49 6e 69 74 50 61 67 65 28 29 20 63 61 6c 6c 20  InitPage() call 
9ce0: 68 61 73 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  has already.  **
9cf0: 20 76 61 6c 69 64 61 74 65 64 20 74 68 65 20 66   validated the f
9d00: 72 65 65 6c 69 73 74 2e 20 20 47 69 76 65 6e 20  reelist.  Given 
9d10: 74 68 61 74 20 74 68 65 20 66 72 65 65 6c 69 73  that the freelis
9d20: 74 20 69 73 20 76 61 6c 69 64 2c 20 74 68 65 72  t is valid, ther
9d30: 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 61 79  e.  ** is no way
9d40: 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61   that the alloca
9d50: 74 69 6f 6e 20 63 61 6e 20 65 78 74 65 6e 64 20  tion can extend 
9d60: 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74  off the end of t
9d70: 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20 54 68  he page..  ** Th
9d80: 65 20 61 73 73 65 72 74 28 29 20 62 65 6c 6f 77  e assert() below
9d90: 20 76 65 72 69 66 69 65 73 20 74 68 65 20 70 72   verifies the pr
9da0: 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 2e  evious sentence.
9db0: 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e  .  */.  top -= n
9dc0: 42 79 74 65 3b 0a 20 20 70 75 74 32 62 79 74 65  Byte;.  put2byte
9dd0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74  (&data[hdr+5], t
9de0: 6f 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74  op);.  assert( t
9df0: 6f 70 2b 6e 42 79 74 65 20 3c 3d 20 70 50 61 67  op+nByte <= pPag
9e00: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
9e10: 7a 65 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20  ze );.  *pIdx = 
9e20: 74 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  top;.  return SQ
9e30: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
9e40: 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63 74 69  * Return a secti
9e50: 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67 65 2d  on of the pPage-
9e60: 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20 66 72  >aData to the fr
9e70: 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66  eelist..** The f
9e80: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
9e90: 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63 6b 20   new free block 
9ea0: 69 73 20 70 50 61 67 65 2d 3e 61 44 69 73 6b 5b  is pPage->aDisk[
9eb0: 73 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68  start].** and th
9ec0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c  e size of the bl
9ed0: 6f 63 6b 20 69 73 20 22 73 69 7a 65 22 20 62 79  ock is "size" by
9ee0: 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20  tes..**.** Most 
9ef0: 6f 66 20 74 68 65 20 65 66 66 6f 72 74 20 68 65  of the effort he
9f00: 72 65 20 69 73 20 69 6e 76 6f 6c 76 65 64 20 69  re is involved i
9f10: 6e 20 63 6f 61 6c 65 73 69 6e 67 20 61 64 6a 61  n coalesing adja
9f20: 63 65 6e 74 0a 2a 2a 20 66 72 65 65 20 62 6c 6f  cent.** free blo
9f30: 63 6b 73 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c  cks into a singl
9f40: 65 20 62 69 67 20 66 72 65 65 20 62 6c 6f 63 6b  e big free block
9f50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9f60: 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50 61 67  freeSpace(MemPag
9f70: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 73 74  e *pPage, int st
9f80: 61 72 74 2c 20 69 6e 74 20 73 69 7a 65 29 7b 0a  art, int size){.
9f90: 20 20 69 6e 74 20 61 64 64 72 2c 20 70 62 65 67    int addr, pbeg
9fa0: 69 6e 2c 20 68 64 72 3b 0a 20 20 69 6e 74 20 69  in, hdr;.  int i
9fb0: 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  Last;           
9fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9fd0: 4c 61 72 67 65 73 74 20 70 6f 73 73 69 62 6c 65  Largest possible
9fe0: 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65   freeblock offse
9ff0: 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  t */.  unsigned 
a000: 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61  char *data = pPa
a010: 67 65 2d 3e 61 44 61 74 61 3b 0a 0a 20 20 61 73  ge->aData;..  as
a020: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
a030: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
a040: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
a050: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
a060: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
a070: 73 65 72 74 28 20 73 74 61 72 74 3e 3d 70 50 61  sert( start>=pPa
a080: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b  ge->hdrOffset+6+
a090: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
a0a0: 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ize );.  assert(
a0b0: 20 28 73 74 61 72 74 20 2b 20 73 69 7a 65 29 3c   (start + size)<
a0c0: 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  =pPage->pBt->usa
a0d0: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73  bleSize );.  ass
a0e0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
a0f0: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
a100: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
a110: 61 73 73 65 72 74 28 20 73 69 7a 65 3e 3d 30 20  assert( size>=0 
a120: 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20  );   /* Minimum 
a130: 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a  cell size is 4 *
a140: 2f 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  /..  if( pPage->
a150: 70 42 74 2d 3e 73 65 63 75 72 65 44 65 6c 65 74  pBt->secureDelet
a160: 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 76 65 72  e ){.    /* Over
a170: 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e  write deleted in
a180: 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a  formation with z
a190: 65 72 6f 73 20 77 68 65 6e 20 74 68 65 20 73 65  eros when the se
a1a0: 63 75 72 65 5f 64 65 6c 65 74 65 0a 20 20 20 20  cure_delete.    
a1b0: 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61  ** option is ena
a1c0: 62 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  bled */.    mems
a1d0: 65 74 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c  et(&data[start],
a1e0: 20 30 2c 20 73 69 7a 65 29 3b 0a 20 20 7d 0a 0a   0, size);.  }..
a1f0: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 73 70 61    /* Add the spa
a200: 63 65 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  ce back into the
a210: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
a220: 66 72 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 74  freeblocks.  Not
a230: 65 20 74 68 61 74 0a 20 20 2a 2a 20 65 76 65 6e  e that.  ** even
a240: 20 74 68 6f 75 67 68 20 74 68 65 20 66 72 65 65   though the free
a250: 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73 20 63  block list was c
a260: 68 65 63 6b 65 64 20 62 79 20 62 74 72 65 65 49  hecked by btreeI
a270: 6e 69 74 50 61 67 65 28 29 2c 0a 20 20 2a 2a 20  nitPage(),.  ** 
a280: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
a290: 64 69 64 20 6e 6f 74 20 64 65 74 65 63 74 20 6f  did not detect o
a2a0: 76 65 72 6c 61 70 70 69 6e 67 20 63 65 6c 6c 73  verlapping cells
a2b0: 20 6f 72 0a 20 20 2a 2a 20 66 72 65 65 62 6c 6f   or.  ** freeblo
a2c0: 63 6b 73 20 74 68 61 74 20 6f 76 65 72 6c 61 70  cks that overlap
a2d0: 70 65 64 20 63 65 6c 6c 73 2e 20 20 20 4e 6f 72  ped cells.   Nor
a2e0: 20 64 6f 65 73 20 69 74 20 64 65 74 65 63 74 20   does it detect 
a2f0: 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 63 65  when the.  ** ce
a300: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
a310: 65 78 63 65 65 64 73 20 74 68 65 20 76 61 6c 75  exceeds the valu
a320: 65 20 69 6e 20 74 68 65 20 70 61 67 65 20 68 65  e in the page he
a330: 61 64 65 72 2e 20 20 49 66 20 74 68 65 73 65 0a  ader.  If these.
a340: 20 20 2a 2a 20 73 69 74 75 61 74 69 6f 6e 73 20    ** situations 
a350: 61 72 69 73 65 2c 20 74 68 65 6e 20 73 75 62 73  arise, then subs
a360: 65 71 75 65 6e 74 20 69 6e 73 65 72 74 20 6f 70  equent insert op
a370: 65 72 61 74 69 6f 6e 73 20 6d 69 67 68 74 20 63  erations might c
a380: 6f 72 72 75 70 74 0a 20 20 2a 2a 20 74 68 65 20  orrupt.  ** the 
a390: 66 72 65 65 6c 69 73 74 2e 20 20 53 6f 20 77 65  freelist.  So we
a3a0: 20 64 6f 20 6e 65 65 64 20 74 6f 20 63 68 65 63   do need to chec
a3b0: 6b 20 66 6f 72 20 63 6f 72 72 75 70 74 69 6f 6e  k for corruption
a3c0: 20 77 68 69 6c 65 20 73 63 61 6e 6e 69 6e 67 0a   while scanning.
a3d0: 20 20 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73    ** the freelis
a3e0: 74 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20  t..  */.  hdr = 
a3f0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
a400: 3b 0a 20 20 61 64 64 72 20 3d 20 68 64 72 20 2b  ;.  addr = hdr +
a410: 20 31 3b 0a 20 20 69 4c 61 73 74 20 3d 20 70 50   1;.  iLast = pP
a420: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
a430: 53 69 7a 65 20 2d 20 34 3b 0a 20 20 61 73 73 65  Size - 4;.  asse
a440: 72 74 28 20 73 74 61 72 74 3c 3d 69 4c 61 73 74  rt( start<=iLast
a450: 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62   );.  while( (pb
a460: 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28  egin = get2byte(
a470: 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3c 73 74  &data[addr]))<st
a480: 61 72 74 20 26 26 20 70 62 65 67 69 6e 3e 30 20  art && pbegin>0 
a490: 29 7b 0a 20 20 20 20 69 66 28 20 70 62 65 67 69  ){.    if( pbegi
a4a0: 6e 3c 61 64 64 72 2b 34 20 29 7b 0a 20 20 20 20  n<addr+4 ){.    
a4b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a4c0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
a4d0: 20 20 7d 0a 20 20 20 20 61 64 64 72 20 3d 20 70    }.    addr = p
a4e0: 62 65 67 69 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  begin;.  }.  if(
a4f0: 20 70 62 65 67 69 6e 3e 69 4c 61 73 74 20 29 7b   pbegin>iLast ){
a500: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
a510: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
a520: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
a530: 62 65 67 69 6e 3e 61 64 64 72 20 7c 7c 20 70 62  begin>addr || pb
a540: 65 67 69 6e 3d 3d 30 20 29 3b 0a 20 20 70 75 74  egin==0 );.  put
a550: 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72  2byte(&data[addr
a560: 5d 2c 20 73 74 61 72 74 29 3b 0a 20 20 70 75 74  ], start);.  put
a570: 32 62 79 74 65 28 26 64 61 74 61 5b 73 74 61 72  2byte(&data[star
a580: 74 5d 2c 20 70 62 65 67 69 6e 29 3b 0a 20 20 70  t], pbegin);.  p
a590: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 73 74  ut2byte(&data[st
a5a0: 61 72 74 2b 32 5d 2c 20 73 69 7a 65 29 3b 0a 20  art+2], size);. 
a5b0: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20   pPage->nFree = 
a5c0: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 20 28  pPage->nFree + (
a5d0: 75 31 36 29 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20  u16)size;..  /* 
a5e0: 43 6f 61 6c 65 73 63 65 20 61 64 6a 61 63 65 6e  Coalesce adjacen
a5f0: 74 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 2a 2f  t free blocks */
a600: 0a 20 20 61 64 64 72 20 3d 20 68 64 72 20 2b 20  .  addr = hdr + 
a610: 31 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65  1;.  while( (pbe
a620: 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26  gin = get2byte(&
a630: 64 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29  data[addr]))>0 )
a640: 7b 0a 20 20 20 20 69 6e 74 20 70 6e 65 78 74 2c  {.    int pnext,
a650: 20 70 73 69 7a 65 2c 20 78 3b 0a 20 20 20 20 61   psize, x;.    a
a660: 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64  ssert( pbegin>ad
a670: 64 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  dr );.    assert
a680: 28 20 70 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d  ( pbegin<=pPage-
a690: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
a6a0: 2d 34 20 29 3b 0a 20 20 20 20 70 6e 65 78 74 20  -4 );.    pnext 
a6b0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
a6c0: 5b 70 62 65 67 69 6e 5d 29 3b 0a 20 20 20 20 70  [pbegin]);.    p
a6d0: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
a6e0: 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29  &data[pbegin+2])
a6f0: 3b 0a 20 20 20 20 69 66 28 20 70 62 65 67 69 6e  ;.    if( pbegin
a700: 20 2b 20 70 73 69 7a 65 20 2b 20 33 20 3e 3d 20   + psize + 3 >= 
a710: 70 6e 65 78 74 20 26 26 20 70 6e 65 78 74 3e 30  pnext && pnext>0
a720: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 72   ){.      int fr
a730: 61 67 20 3d 20 70 6e 65 78 74 20 2d 20 28 70 62  ag = pnext - (pb
a740: 65 67 69 6e 2b 70 73 69 7a 65 29 3b 0a 20 20 20  egin+psize);.   
a750: 20 20 20 69 66 28 20 28 66 72 61 67 3c 30 29 20     if( (frag<0) 
a760: 7c 7c 20 28 66 72 61 67 3e 28 69 6e 74 29 64 61  || (frag>(int)da
a770: 74 61 5b 68 64 72 2b 37 5d 29 20 29 7b 0a 20 20  ta[hdr+7]) ){.  
a780: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
a790: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
a7a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a7b0: 64 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 28  data[hdr+7] -= (
a7c0: 75 38 29 66 72 61 67 3b 0a 20 20 20 20 20 20 78  u8)frag;.      x
a7d0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
a7e0: 61 5b 70 6e 65 78 74 5d 29 3b 0a 20 20 20 20 20  a[pnext]);.     
a7f0: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
a800: 70 62 65 67 69 6e 5d 2c 20 78 29 3b 0a 20 20 20  pbegin], x);.   
a810: 20 20 20 78 20 3d 20 70 6e 65 78 74 20 2b 20 67     x = pnext + g
a820: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e  et2byte(&data[pn
a830: 65 78 74 2b 32 5d 29 20 2d 20 70 62 65 67 69 6e  ext+2]) - pbegin
a840: 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65  ;.      put2byte
a850: 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d  (&data[pbegin+2]
a860: 2c 20 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , x);.    }else{
a870: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 70 62  .      addr = pb
a880: 65 67 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  egin;.    }.  }.
a890: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c  .  /* If the cel
a8a0: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 62  l content area b
a8b0: 65 67 69 6e 73 20 77 69 74 68 20 61 20 66 72 65  egins with a fre
a8c0: 65 62 6c 6f 63 6b 2c 20 72 65 6d 6f 76 65 20 69  eblock, remove i
a8d0: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 64 61 74 61  t. */.  if( data
a8e0: 5b 68 64 72 2b 31 5d 3d 3d 64 61 74 61 5b 68 64  [hdr+1]==data[hd
a8f0: 72 2b 35 5d 20 26 26 20 64 61 74 61 5b 68 64 72  r+5] && data[hdr
a900: 2b 32 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 36 5d  +2]==data[hdr+6]
a910: 20 29 7b 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b   ){.    int top;
a920: 0a 20 20 20 20 70 62 65 67 69 6e 20 3d 20 67 65  .    pbegin = ge
a930: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
a940: 2b 31 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  +1]);.    memcpy
a950: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 26  (&data[hdr+1], &
a960: 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 32 29  data[pbegin], 2)
a970: 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
a980: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
a990: 5d 29 20 2b 20 67 65 74 32 62 79 74 65 28 26 64  ]) + get2byte(&d
a9a0: 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a  ata[pbegin+2]);.
a9b0: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
a9c0: 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b  ta[hdr+5], top);
a9d0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73  .  }.  assert( s
a9e0: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
a9f0: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
aa00: 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75  bPage) );.  retu
aa10: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
aa20: 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68  ./*.** Decode th
aa30: 65 20 66 6c 61 67 73 20 62 79 74 65 20 28 74 68  e flags byte (th
aa40: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
aa50: 74 68 65 20 68 65 61 64 65 72 29 20 66 6f 72 20  the header) for 
aa60: 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e  a page.** and in
aa70: 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20  itialize fields 
aa80: 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73  of the MemPage s
aa90: 74 72 75 63 74 75 72 65 20 61 63 63 6f 72 64 69  tructure accordi
aaa0: 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  ngly..**.** Only
aab0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
aac0: 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20  ombinations are 
aad0: 73 75 70 70 6f 72 74 65 64 2e 20 20 41 6e 79 74  supported.  Anyt
aae0: 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a  hing different.*
aaf0: 2a 20 69 6e 64 69 63 61 74 65 73 20 61 20 63 6f  * indicates a co
ab00: 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66  rrupt database f
ab10: 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  iles:.**.**     
ab20: 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41      PTF_ZERODATA
ab30: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
ab40: 5a 45 52 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c  ZERODATA | PTF_L
ab50: 45 41 46 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  EAF.**         P
ab60: 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54  TF_LEAFDATA | PT
ab70: 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20  F_INTKEY.**     
ab80: 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41      PTF_LEAFDATA
ab90: 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20   | PTF_INTKEY | 
aba0: 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74  PTF_LEAF.*/.stat
abb0: 69 63 20 69 6e 74 20 64 65 63 6f 64 65 46 6c 61  ic int decodeFla
abc0: 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  gs(MemPage *pPag
abd0: 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29  e, int flagByte)
abe0: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
abf0: 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79  t;     /* A copy
ac00: 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a   of pPage->pBt *
ac10: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
ac20: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28  ge->hdrOffset==(
ac30: 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f  pPage->pgno==1 ?
ac40: 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61   100 : 0) );.  a
ac50: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
ac60: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
ac70: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
ac80: 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20    pPage->leaf = 
ac90: 28 75 38 29 28 66 6c 61 67 42 79 74 65 3e 3e 33  (u8)(flagByte>>3
aca0: 29 3b 20 20 61 73 73 65 72 74 28 20 50 54 46 5f  );  assert( PTF_
acb0: 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a  LEAF == 1<<3 );.
acc0: 20 20 66 6c 61 67 42 79 74 65 20 26 3d 20 7e 50    flagByte &= ~P
acd0: 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67 65  TF_LEAF;.  pPage
ace0: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d  ->childPtrSize =
acf0: 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   4-4*pPage->leaf
ad00: 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d  ;.  pBt = pPage-
ad10: 3e 70 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67  >pBt;.  if( flag
ad20: 42 79 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44  Byte==(PTF_LEAFD
ad30: 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59  ATA | PTF_INTKEY
ad40: 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) ){.    pPage->
ad50: 69 6e 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20  intKey = 1;.    
ad60: 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d  pPage->hasData =
ad70: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20   pPage->leaf;.  
ad80: 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61    pPage->maxLoca
ad90: 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  l = pBt->maxLeaf
ada0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e  ;.    pPage->min
adb0: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e  Local = pBt->min
adc0: 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Leaf;.  }else if
add0: 28 20 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f  ( flagByte==PTF_
ade0: 5a 45 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20  ZERODATA ){.    
adf0: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20  pPage->intKey = 
ae00: 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 61  0;.    pPage->ha
ae10: 73 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 70  sData = 0;.    p
ae20: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d  Page->maxLocal =
ae30: 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a   pBt->maxLocal;.
ae40: 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f      pPage->minLo
ae50: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f  cal = pBt->minLo
ae60: 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  cal;.  }else{.  
ae70: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ae80: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
ae90: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
aea0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
aeb0: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61 75  nitialize the au
aec0: 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61 74  xiliary informat
aed0: 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b 20 62  ion for a disk b
aee0: 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  lock..**.** Retu
aef0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
af00: 73 75 63 63 65 73 73 2e 20 20 49 66 20 77 65 20  success.  If we 
af10: 73 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67  see that the pag
af20: 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f  e does.** not co
af30: 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72  ntain a well-for
af40: 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61 67  med database pag
af50: 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a  e, then return .
af60: 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ** SQLITE_CORRUP
af70: 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 61 20  T.  Note that a 
af80: 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45  return of SQLITE
af90: 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  _OK does not.** 
afa0: 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 74  guarantee that t
afb0: 68 65 20 70 61 67 65 20 69 73 20 77 65 6c 6c 2d  he page is well-
afc0: 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79  formed.  It only
afd0: 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77   shows that.** w
afe0: 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65  e failed to dete
aff0: 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74 69 6f  ct any corruptio
b000: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
b010: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 4d   btreeInitPage(M
b020: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
b030: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
b040: 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73  ->pBt!=0 );.  as
b050: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
b060: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
b070: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
b080: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
b090: 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67  pgno==sqlite3Pag
b0a0: 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61  erPagenumber(pPa
b0b0: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
b0c0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20    assert( pPage 
b0d0: 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  == sqlite3PagerG
b0e0: 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
b0f0: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
b100: 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
b110: 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65  a == sqlite3Page
b120: 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
b130: 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 69  pDbPage) );..  i
b140: 66 28 20 21 70 50 61 67 65 2d 3e 69 73 49 6e 69  f( !pPage->isIni
b150: 74 20 29 7b 0a 20 20 20 20 75 31 36 20 70 63 3b  t ){.    u16 pc;
b160: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
b170: 64 64 72 65 73 73 20 6f 66 20 61 20 66 72 65 65  ddress of a free
b180: 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61  block within pPa
b190: 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20  ge->aData[] */. 
b1a0: 20 20 20 75 38 20 68 64 72 3b 20 20 20 20 20 20     u8 hdr;      
b1b0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
b1c0: 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  to beginning of 
b1d0: 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  page header */. 
b1e0: 20 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20     u8 *data;    
b1f0: 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20 74        /* Equal t
b200: 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  o pPage->aData *
b210: 2f 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  /.    BtShared *
b220: 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  pBt;        /* T
b230: 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73 74  he main btree st
b240: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 75  ructure */.    u
b250: 31 36 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20  16 usableSize;  
b260: 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75    /* Amount of u
b270: 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20 65  sable space on e
b280: 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ach page */.    
b290: 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20  u16 cellOffset; 
b2a0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f     /* Offset fro
b2b0: 6d 20 73 74 61 72 74 20 6f 66 20 70 61 67 65 20  m start of page 
b2c0: 74 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f  to first cell po
b2d0: 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 31 36  inter */.    u16
b2e0: 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20   nFree;         
b2f0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75  /* Number of unu
b300: 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65  sed bytes on the
b310: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 75 31 36   page */.    u16
b320: 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20   top;           
b330: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
b340: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
b350: 74 20 61 72 65 61 20 2a 2f 0a 20 20 20 20 69 6e  t area */.    in
b360: 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20  t iCellFirst;   
b370: 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61   /* First allowa
b380: 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65  ble cell or free
b390: 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a  block offset */.
b3a0: 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73      int iCellLas
b3b0: 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70  t;     /* Last p
b3c0: 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72 20  ossible cell or 
b3d0: 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74  freeblock offset
b3e0: 20 2a 2f 0a 0a 20 20 20 20 70 42 74 20 3d 20 70   */..    pBt = p
b3f0: 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 20 20  Page->pBt;..    
b400: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
b410: 4f 66 66 73 65 74 3b 0a 20 20 20 20 64 61 74 61  Offset;.    data
b420: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
b430: 0a 20 20 20 20 69 66 28 20 64 65 63 6f 64 65 46  .    if( decodeF
b440: 6c 61 67 73 28 70 50 61 67 65 2c 20 64 61 74 61  lags(pPage, data
b450: 5b 68 64 72 5d 29 20 29 20 72 65 74 75 72 6e 20  [hdr]) ) return 
b460: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
b470: 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28  KPT;.    assert(
b480: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d   pBt->pageSize>=
b490: 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65  512 && pBt->page
b4a0: 53 69 7a 65 3c 3d 33 32 37 36 38 20 29 3b 0a 20  Size<=32768 );. 
b4b0: 20 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61     pPage->maskPa
b4c0: 67 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  ge = pBt->pageSi
b4d0: 7a 65 20 2d 20 31 3b 0a 20 20 20 20 70 50 61 67  ze - 1;.    pPag
b4e0: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  e->nOverflow = 0
b4f0: 3b 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65  ;.    usableSize
b500: 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
b510: 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 63  ze;.    pPage->c
b520: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c  ellOffset = cell
b530: 4f 66 66 73 65 74 20 3d 20 68 64 72 20 2b 20 31  Offset = hdr + 1
b540: 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61  2 - 4*pPage->lea
b550: 66 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74  f;.    top = get
b560: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
b570: 35 5d 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  5]);.    pPage->
b580: 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65  nCell = get2byte
b590: 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a  (&data[hdr+3]);.
b5a0: 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e      if( pPage->n
b5b0: 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74  Cell>MX_CELL(pBt
b5c0: 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 6f  ) ){.      /* To
b5d0: 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20   many cells for 
b5e0: 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2e 20 20  a single page.  
b5f0: 54 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 65  The page must be
b600: 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20   corrupt */.    
b610: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b620: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
b630: 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65    }.    testcase
b640: 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  ( pPage->nCell==
b650: 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 3b 0a  MX_CELL(pBt) );.
b660: 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c 66 6f 72  .    /* A malfor
b670: 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61 67  med database pag
b680: 65 20 6d 69 67 68 74 20 63 61 75 73 65 20 75 73  e might cause us
b690: 20 74 6f 20 72 65 61 64 20 70 61 73 74 20 74 68   to read past th
b6a0: 65 20 65 6e 64 0a 20 20 20 20 2a 2a 20 6f 66 20  e end.    ** of 
b6b0: 70 61 67 65 20 77 68 65 6e 20 70 61 72 73 69 6e  page when parsin
b6c0: 67 20 61 20 63 65 6c 6c 2e 20 20 0a 20 20 20 20  g a cell.  .    
b6d0: 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f  **.    ** The fo
b6e0: 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f 66  llowing block of
b6f0: 20 63 6f 64 65 20 63 68 65 63 6b 73 20 65 61 72   code checks ear
b700: 6c 79 20 74 6f 20 73 65 65 20 69 66 20 61 20 63  ly to see if a c
b710: 65 6c 6c 20 65 78 74 65 6e 64 73 0a 20 20 20 20  ell extends.    
b720: 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  ** past the end 
b730: 6f 66 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  of a page bounda
b740: 72 79 20 61 6e 64 20 63 61 75 73 65 73 20 53 51  ry and causes SQ
b750: 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 74 6f 20  LITE_CORRUPT to 
b760: 62 65 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72  be .    ** retur
b770: 6e 65 64 20 69 66 20 69 74 20 64 6f 65 73 2e 0a  ned if it does..
b780: 20 20 20 20 2a 2f 0a 20 20 20 20 69 43 65 6c 6c      */.    iCell
b790: 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73  First = cellOffs
b7a0: 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43  et + 2*pPage->nC
b7b0: 65 6c 6c 3b 0a 20 20 20 20 69 43 65 6c 6c 4c 61  ell;.    iCellLa
b7c0: 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20  st = usableSize 
b7d0: 2d 20 34 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  - 4;.#if defined
b7e0: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f  (SQLITE_ENABLE_O
b7f0: 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45  VERSIZE_CELL_CHE
b800: 43 4b 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  CK).    {.      
b810: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
b820: 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20    /* Index into 
b830: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
b840: 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 20 20   array */.      
b850: 69 6e 74 20 73 7a 3b 20 20 20 20 20 20 20 20 20  int sz;         
b860: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63    /* Size of a c
b870: 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66  ell */..      if
b880: 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
b890: 20 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20   iCellLast--;.  
b8a0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
b8b0: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b  Page->nCell; i++
b8c0: 29 7b 0a 20 20 20 20 20 20 20 20 70 63 20 3d 20  ){.        pc = 
b8d0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 63  get2byte(&data[c
b8e0: 65 6c 6c 4f 66 66 73 65 74 2b 69 2a 32 5d 29 3b  ellOffset+i*2]);
b8f0: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
b900: 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73  e( pc==iCellFirs
b910: 74 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  t );.        tes
b920: 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c  tcase( pc==iCell
b930: 4c 61 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Last );.        
b940: 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73  if( pc<iCellFirs
b950: 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73  t || pc>iCellLas
b960: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  t ){.          r
b970: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
b980: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
b990: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 7a 20     }.        sz 
b9a0: 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
b9b0: 61 67 65 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b  age, &data[pc]);
b9c0: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
b9d0: 65 28 20 70 63 2b 73 7a 3d 3d 75 73 61 62 6c 65  e( pc+sz==usable
b9e0: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Size );.        
b9f0: 69 66 28 20 70 63 2b 73 7a 3e 75 73 61 62 6c 65  if( pc+sz>usable
ba00: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
ba10: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ba20: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
ba30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
ba40: 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
ba50: 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61  ->leaf ) iCellLa
ba60: 73 74 2b 2b 3b 0a 20 20 20 20 7d 20 20 0a 23 65  st++;.    }  .#e
ba70: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d  ndif..    /* Com
ba80: 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 66  pute the total f
ba90: 72 65 65 20 73 70 61 63 65 20 6f 6e 20 74 68 65  ree space on the
baa0: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 70 63 20   page */.    pc 
bab0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
bac0: 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6e 46  [hdr+1]);.    nF
bad0: 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b 37  ree = data[hdr+7
bae0: 5d 20 2b 20 74 6f 70 3b 0a 20 20 20 20 77 68 69  ] + top;.    whi
baf0: 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20  le( pc>0 ){.    
bb00: 20 20 75 31 36 20 6e 65 78 74 2c 20 73 69 7a 65    u16 next, size
bb10: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 63 3c 69  ;.      if( pc<i
bb20: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e  CellFirst || pc>
bb30: 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20  iCellLast ){.   
bb40: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66       /* Start of
bb50: 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 6f   free block is o
bb60: 66 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  ff the page */. 
bb70: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
bb80: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
bb90: 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  T; .      }.    
bba0: 20 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74    next = get2byt
bbb0: 65 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20  e(&data[pc]);.  
bbc0: 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62      size = get2b
bbd0: 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29  yte(&data[pc+2])
bbe0: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6e 65 78  ;.      if( (nex
bbf0: 74 3e 30 20 26 26 20 6e 65 78 74 3c 3d 70 63 2b  t>0 && next<=pc+
bc00: 73 69 7a 65 2b 33 29 20 7c 7c 20 70 63 2b 73 69  size+3) || pc+si
bc10: 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  ze>usableSize ){
bc20: 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65  .        /* Free
bc30: 20 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20   blocks must be 
bc40: 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
bc50: 65 72 2e 20 41 6e 64 20 74 68 65 20 6c 61 73 74  er. And the last
bc60: 20 62 79 74 65 20 6f 66 0a 09 2a 2a 20 74 68 65   byte of..** the
bc70: 20 66 72 65 65 2d 62 6c 6f 63 6b 20 6d 75 73 74   free-block must
bc80: 20 6c 69 65 20 6f 6e 20 74 68 65 20 64 61 74 61   lie on the data
bc90: 62 61 73 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20  base page.  */. 
bca0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
bcb0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
bcc0: 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  T; .      }.    
bcd0: 20 20 6e 46 72 65 65 20 3d 20 6e 46 72 65 65 20    nFree = nFree 
bce0: 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 63  + size;.      pc
bcf0: 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a   = next;.    }..
bd00: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
bd10: 6f 69 6e 74 2c 20 6e 46 72 65 65 20 63 6f 6e 74  oint, nFree cont
bd20: 61 69 6e 73 20 74 68 65 20 73 75 6d 20 6f 66 20  ains the sum of 
bd30: 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68  the offset to th
bd40: 65 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 6f  e start.    ** o
bd50: 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65  f the cell-conte
bd60: 6e 74 20 61 72 65 61 20 70 6c 75 73 20 74 68 65  nt area plus the
bd70: 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20   number of free 
bd80: 62 79 74 65 73 20 77 69 74 68 69 6e 0a 20 20 20  bytes within.   
bd90: 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e   ** the cell-con
bda0: 74 65 6e 74 20 61 72 65 61 2e 20 49 66 20 74 68  tent area. If th
bdb0: 69 73 20 69 73 20 67 72 65 61 74 65 72 20 74 68  is is greater th
bdc0: 61 6e 20 74 68 65 20 75 73 61 62 6c 65 2d 73 69  an the usable-si
bdd0: 7a 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ze.    ** of the
bde0: 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20   page, then the 
bdf0: 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72  page must be cor
be00: 72 75 70 74 65 64 2e 20 54 68 69 73 20 63 68 65  rupted. This che
be10: 63 6b 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 73  ck also.    ** s
be20: 65 72 76 65 73 20 74 6f 20 76 65 72 69 66 79 20  erves to verify 
be30: 74 68 61 74 20 74 68 65 20 6f 66 66 73 65 74 20  that the offset 
be40: 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
be50: 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74  the cell-content
be60: 0a 20 20 20 20 2a 2a 20 61 72 65 61 2c 20 61 63  .    ** area, ac
be70: 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 70  cording to the p
be80: 61 67 65 20 68 65 61 64 65 72 2c 20 6c 69 65 73  age header, lies
be90: 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65   within the page
bea0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
beb0: 20 6e 46 72 65 65 3e 75 73 61 62 6c 65 53 69 7a   nFree>usableSiz
bec0: 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
bed0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
bee0: 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20  _BKPT; .    }.  
bef0: 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d    pPage->nFree =
bf00: 20 28 75 31 36 29 28 6e 46 72 65 65 20 2d 20 69   (u16)(nFree - i
bf10: 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20 20 20  CellFirst);.    
bf20: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
bf30: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
bf40: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
bf50: 0a 2a 2a 20 53 65 74 20 75 70 20 61 20 72 61 77  .** Set up a raw
bf60: 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 69 74   page so that it
bf70: 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61   looks like a da
bf80: 74 61 62 61 73 65 20 70 61 67 65 20 68 6f 6c 64  tabase page hold
bf90: 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65  ing.** no entrie
bfa0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
bfb0: 64 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50 61  d zeroPage(MemPa
bfc0: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66  ge *pPage, int f
bfd0: 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65  lags){.  unsigne
bfe0: 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70  d char *data = p
bff0: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42  Page->aData;.  B
c000: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
c010: 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20  Page->pBt;.  u8 
c020: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
c030: 4f 66 66 73 65 74 3b 0a 20 20 75 31 36 20 66 69  Offset;.  u16 fi
c040: 72 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  rst;..  assert( 
c050: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
c060: 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44  number(pPage->pD
c070: 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70  bPage)==pPage->p
c080: 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  gno );.  assert(
c090: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
c0a0: 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
c0b0: 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29  Page) == (void*)
c0c0: 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
c0d0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
c0e0: 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
c0f0: 62 50 61 67 65 29 20 3d 3d 20 64 61 74 61 20 29  bPage) == data )
c100: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
c110: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
c120: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
c130: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
c140: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
c150: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
c160: 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 73 65  );.  if( pBt->se
c170: 63 75 72 65 44 65 6c 65 74 65 20 29 7b 0a 20 20  cureDelete ){.  
c180: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68    memset(&data[h
c190: 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61  dr], 0, pBt->usa
c1a0: 62 6c 65 53 69 7a 65 20 2d 20 68 64 72 29 3b 0a  bleSize - hdr);.
c1b0: 20 20 7d 0a 20 20 64 61 74 61 5b 68 64 72 5d 20    }.  data[hdr] 
c1c0: 3d 20 28 63 68 61 72 29 66 6c 61 67 73 3b 0a 20  = (char)flags;. 
c1d0: 20 66 69 72 73 74 20 3d 20 68 64 72 20 2b 20 38   first = hdr + 8
c1e0: 20 2b 20 34 2a 28 28 66 6c 61 67 73 26 50 54 46   + 4*((flags&PTF
c1f0: 5f 4c 45 41 46 29 3d 3d 30 20 3f 31 3a 30 29 3b  _LEAF)==0 ?1:0);
c200: 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
c210: 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20  hdr+1], 0, 4);. 
c220: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30   data[hdr+7] = 0
c230: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
c240: 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e  ta[hdr+5], pBt->
c250: 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70  usableSize);.  p
c260: 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 42  Page->nFree = pB
c270: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
c280: 66 69 72 73 74 3b 0a 20 20 64 65 63 6f 64 65 46  first;.  decodeF
c290: 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67  lags(pPage, flag
c2a0: 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72  s);.  pPage->hdr
c2b0: 4f 66 66 73 65 74 20 3d 20 68 64 72 3b 0a 20 20  Offset = hdr;.  
c2c0: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
c2d0: 74 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61  t = first;.  pPa
c2e0: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  ge->nOverflow = 
c2f0: 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  0;.  assert( pBt
c300: 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ->pageSize>=512 
c310: 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  && pBt->pageSize
c320: 3c 3d 33 32 37 36 38 20 29 3b 0a 20 20 70 50 61  <=32768 );.  pPa
c330: 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 70  ge->maskPage = p
c340: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31  Bt->pageSize - 1
c350: 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ;.  pPage->nCell
c360: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69   = 0;.  pPage->i
c370: 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f  sInit = 1;.}.../
c380: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 44  *.** Convert a D
c390: 62 50 61 67 65 20 6f 62 74 61 69 6e 65 64 20 66  bPage obtained f
c3a0: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 69 6e  rom the pager in
c3b0: 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 75 73 65  to a MemPage use
c3c0: 64 20 62 79 0a 2a 2a 20 74 68 65 20 62 74 72 65  d by.** the btre
c3d0: 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74  e layer..*/.stat
c3e0: 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65  ic MemPage *btre
c3f0: 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28  ePageFromDbPage(
c400: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c  DbPage *pDbPage,
c410: 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53 68   Pgno pgno, BtSh
c420: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65  ared *pBt){.  Me
c430: 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 28  mPage *pPage = (
c440: 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33  MemPage*)sqlite3
c450: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44  PagerGetExtra(pD
c460: 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d  bPage);.  pPage-
c470: 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33  >aData = sqlite3
c480: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
c490: 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e  Page);.  pPage->
c4a0: 70 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67  pDbPage = pDbPag
c4b0: 65 3b 0a 20 20 70 50 61 67 65 2d 3e 70 42 74 20  e;.  pPage->pBt 
c4c0: 3d 20 70 42 74 3b 0a 20 20 70 50 61 67 65 2d 3e  = pBt;.  pPage->
c4d0: 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70  pgno = pgno;.  p
c4e0: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20  Page->hdrOffset 
c4f0: 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31  = pPage->pgno==1
c500: 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20 72 65   ? 100 : 0;.  re
c510: 74 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a  turn pPage; .}..
c520: 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65  /*.** Get a page
c530: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e   from the pager.
c540: 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65    Initialize the
c550: 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64   MemPage.pBt and
c560: 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74  .** MemPage.aDat
c570: 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65  a elements if ne
c580: 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  eded..**.** If t
c590: 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c 61  he noContent fla
c5a0: 67 20 69 73 20 73 65 74 2c 20 69 74 20 6d 65 61  g is set, it mea
c5b0: 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ns that we do no
c5c0: 74 20 63 61 72 65 20 61 62 6f 75 74 0a 2a 2a 20  t care about.** 
c5d0: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
c5e0: 68 65 20 70 61 67 65 20 61 74 20 74 68 69 73 20  he page at this 
c5f0: 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74  time.  So do not
c600: 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 0a   go to the disk.
c610: 2a 2a 20 74 6f 20 66 65 74 63 68 20 74 68 65 20  ** to fetch the 
c620: 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20 66  content.  Just f
c630: 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74 65  ill in the conte
c640: 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 20 66 6f  nt with zeros fo
c650: 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20  r now..** If in 
c660: 74 68 65 20 66 75 74 75 72 65 20 77 65 20 63 61  the future we ca
c670: 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  ll sqlite3PagerW
c680: 72 69 74 65 28 29 20 6f 6e 20 74 68 69 73 20 70  rite() on this p
c690: 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61  age, that.** mea
c6a0: 6e 73 20 77 65 20 68 61 76 65 20 73 74 61 72 74  ns we have start
c6b0: 65 64 20 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e  ed to be concern
c6c0: 65 64 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74  ed about content
c6d0: 20 61 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a   and the disk.**
c6e0: 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63   read should occ
c6f0: 75 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74  ur at that point
c700: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c710: 62 74 72 65 65 47 65 74 50 61 67 65 28 0a 20 20  btreeGetPage(.  
c720: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
c730: 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
c740: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
c750: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ,           /* N
c760: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
c770: 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20  e to fetch */.  
c780: 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
c790: 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74  ,    /* Return t
c7a0: 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  he page in this 
c7b0: 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69  parameter */.  i
c7c0: 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20  nt noContent    
c7d0: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f      /* Do not lo
c7e0: 61 64 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  ad page content 
c7f0: 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  if true */.){.  
c800: 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65  int rc;.  DbPage
c810: 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73   *pDbPage;..  as
c820: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
c830: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
c840: 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  tex) );.  rc = s
c850: 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69  qlite3PagerAcqui
c860: 72 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  re(pBt->pPager, 
c870: 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29  pgno, (DbPage**)
c880: 26 70 44 62 50 61 67 65 2c 20 6e 6f 43 6f 6e 74  &pDbPage, noCont
c890: 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ent);.  if( rc )
c8a0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70   return rc;.  *p
c8b0: 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67  pPage = btreePag
c8c0: 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50  eFromDbPage(pDbP
c8d0: 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b  age, pgno, pBt);
c8e0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
c8f0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
c900: 74 72 69 65 76 65 20 61 20 70 61 67 65 20 66 72  trieve a page fr
c910: 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63 61 63  om the pager cac
c920: 68 65 2e 20 49 66 20 74 68 65 20 72 65 71 75 65  he. If the reque
c930: 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74  sted page is not
c940: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74  .** already in t
c950: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 72  he pager cache r
c960: 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74  eturn NULL. Init
c970: 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61  ialize the MemPa
c980: 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65  ge.pBt and.** Me
c990: 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d  mPage.aData elem
c9a0: 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a  ents if needed..
c9b0: 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67  */.static MemPag
c9c0: 65 20 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b  e *btreePageLook
c9d0: 75 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  up(BtShared *pBt
c9e0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
c9f0: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
ca00: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
ca10: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
ca20: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
ca30: 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33  DbPage = sqlite3
ca40: 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d  PagerLookup(pBt-
ca50: 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  >pPager, pgno);.
ca60: 20 20 69 66 28 20 70 44 62 50 61 67 65 20 29 7b    if( pDbPage ){
ca70: 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65  .    return btre
ca80: 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28  ePageFromDbPage(
ca90: 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70  pDbPage, pgno, p
caa0: 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Bt);.  }.  retur
cab0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
cac0: 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  turn the size of
cad0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
cae0: 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20  le in pages. If 
caf0: 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e  there is any kin
cb00: 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72  d of.** error, r
cb10: 65 74 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64  eturn ((unsigned
cb20: 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61   int)-1)..*/.sta
cb30: 74 69 63 20 50 67 6e 6f 20 62 74 72 65 65 50 61  tic Pgno btreePa
cb40: 67 65 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64  gecount(BtShared
cb50: 20 2a 70 42 74 29 7b 0a 20 20 72 65 74 75 72 6e   *pBt){.  return
cb60: 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75   pBt->nPage;.}.u
cb70: 33 32 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  32 sqlite3BtreeL
cb80: 61 73 74 50 61 67 65 28 42 74 72 65 65 20 2a 70  astPage(Btree *p
cb90: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
cba0: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
cbb0: 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
cbc0: 72 74 28 20 28 28 70 2d 3e 70 42 74 2d 3e 6e 50  rt( ((p->pBt->nP
cbd0: 61 67 65 29 26 30 78 38 30 30 30 30 30 30 29 3d  age)&0x8000000)=
cbe0: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  =0 );.  return (
cbf0: 69 6e 74 29 62 74 72 65 65 50 61 67 65 63 6f 75  int)btreePagecou
cc00: 6e 74 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f  nt(p->pBt);.}../
cc10: 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20  *.** Get a page 
cc20: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 61  from the pager a
cc30: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74  nd initialize it
cc40: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
cc50: 69 73 20 6a 75 73 74 20 61 0a 2a 2a 20 63 6f 6e  is just a.** con
cc60: 76 65 6e 69 65 6e 63 65 20 77 72 61 70 70 65 72  venience wrapper
cc70: 20 61 72 6f 75 6e 64 20 73 65 70 61 72 61 74 65   around separate
cc80: 20 63 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 47   calls to btreeG
cc90: 65 74 50 61 67 65 28 29 20 61 6e 64 20 0a 2a 2a  etPage() and .**
cca0: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
ccb0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
ccc0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  ror occurs, then
ccd0: 20 74 68 65 20 76 61 6c 75 65 20 2a 70 70 50 61   the value *ppPa
cce0: 67 65 20 69 73 20 73 65 74 20 74 6f 20 69 73 20  ge is set to is 
ccf0: 75 6e 64 65 66 69 6e 65 64 2e 20 49 74 0a 2a 2a  undefined. It.**
cd00: 20 6d 61 79 20 72 65 6d 61 69 6e 20 75 6e 63 68   may remain unch
cd10: 61 6e 67 65 64 2c 20 6f 72 20 69 74 20 6d 61 79  anged, or it may
cd20: 20 62 65 20 73 65 74 20 74 6f 20 61 6e 20 69 6e   be set to an in
cd30: 76 61 6c 69 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a  valid value..*/.
cd40: 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 41 6e  static int getAn
cd50: 64 49 6e 69 74 50 61 67 65 28 0a 20 20 42 74 53  dInitPage(.  BtS
cd60: 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
cd70: 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
cd80: 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50  base file */.  P
cd90: 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
cda0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
cdb0: 20 74 68 65 20 70 61 67 65 20 74 6f 20 67 65 74   the page to get
cdc0: 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
cdd0: 70 70 50 61 67 65 20 20 20 20 20 2f 2a 20 57 72  ppPage     /* Wr
cde0: 69 74 65 20 74 68 65 20 70 61 67 65 20 70 6f 69  ite the page poi
cdf0: 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  nter here */.){.
ce00: 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
ce10: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
ce20: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
ce30: 78 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e  x) );..  if( pgn
ce40: 6f 3c 3d 30 20 7c 7c 20 70 67 6e 6f 3e 62 74 72  o<=0 || pgno>btr
ce50: 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
ce60: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
ce70: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
ce80: 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 62  PT;.  }.  rc = b
ce90: 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
cea0: 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30   pgno, ppPage, 0
ceb0: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
cec0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
ced0: 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67 65   = btreeInitPage
cee0: 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 69  (*ppPage);.    i
cef0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
cf00: 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
cf10: 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
cf20: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
cf30: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
cf40: 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50 61 67  Release a MemPag
cf50: 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20  e.  This should 
cf60: 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66  be called once f
cf70: 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a  or each prior.**
cf80: 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 47 65   call to btreeGe
cf90: 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  tPage..*/.static
cfa0: 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67   void releasePag
cfb0: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
cfc0: 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 20 29  ){.  if( pPage )
cfd0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
cfe0: 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20  age->aData );.  
cff0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
d000: 3e 70 42 74 20 29 3b 0a 20 20 20 20 61 73 73 65  >pBt );.    asse
d010: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
d020: 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e  GetExtra(pPage->
d030: 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69  pDbPage) == (voi
d040: 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 20 20  d*)pPage );.    
d050: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
d060: 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
d070: 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61  e->pDbPage)==pPa
d080: 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20  ge->aData );.   
d090: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
d0a0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
d0b0: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
d0c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
d0d0: 65 72 55 6e 72 65 66 28 70 50 61 67 65 2d 3e 70  erUnref(pPage->p
d0e0: 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a  DbPage);.  }.}..
d0f0: 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72  /*.** During a r
d100: 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68  ollback, when th
d110: 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20  e pager reloads 
d120: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f  information into
d130: 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f   the cache.** so
d140: 20 74 68 61 74 20 74 68 65 20 63 61 63 68 65 20   that the cache 
d150: 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  is restored to i
d160: 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  ts original stat
d170: 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
d180: 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63  f.** the transac
d190: 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70  tion, for each p
d1a0: 61 67 65 20 72 65 73 74 6f 72 65 64 20 74 68 69  age restored thi
d1b0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
d1c0: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  led..**.** This 
d1d0: 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f  routine needs to
d1e0: 20 72 65 73 65 74 20 74 68 65 20 65 78 74 72 61   reset the extra
d1f0: 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74   data section at
d200: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
d210: 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65 65  ** page to agree
d220: 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72   with the restor
d230: 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74  ed data..*/.stat
d240: 69 63 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e  ic void pageRein
d250: 69 74 28 44 62 50 61 67 65 20 2a 70 44 61 74 61  it(DbPage *pData
d260: 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
d270: 61 67 65 3b 0a 20 20 70 50 61 67 65 20 3d 20 28  age;.  pPage = (
d280: 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65  MemPage *)sqlite
d290: 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
d2a0: 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28  Data);.  assert(
d2b0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
d2c0: 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29  eRefcount(pData)
d2d0: 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  >0 );.  if( pPag
d2e0: 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20  e->isInit ){.   
d2f0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
d300: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
d310: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
d320: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  ;.    pPage->isI
d330: 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  nit = 0;.    if(
d340: 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
d350: 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29  eRefcount(pData)
d360: 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70  >1 ){.      /* p
d370: 50 61 67 65 20 6d 69 67 68 74 20 6e 6f 74 20 62  Page might not b
d380: 65 20 61 20 62 74 72 65 65 20 70 61 67 65 3b 20  e a btree page; 
d390: 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 6e 20   it might be an 
d3a0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20  overflow page.  
d3b0: 20 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70      ** or ptrmap
d3c0: 20 70 61 67 65 20 6f 72 20 61 20 66 72 65 65 20   page or a free 
d3d0: 70 61 67 65 2e 20 20 49 6e 20 74 68 6f 73 65 20  page.  In those 
d3e0: 63 61 73 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f  cases, the follo
d3f0: 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63 61  wing.      ** ca
d400: 6c 6c 20 74 6f 20 62 74 72 65 65 49 6e 69 74 50  ll to btreeInitP
d410: 61 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b 65 6c  age() will likel
d420: 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
d430: 43 4f 52 52 55 50 54 2e 0a 20 20 20 20 20 20 2a  CORRUPT..      *
d440: 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d 20 69 73  * But no harm is
d450: 20 64 6f 6e 65 20 62 79 20 74 68 69 73 2e 20 20   done by this.  
d460: 41 6e 64 20 69 74 20 69 73 20 76 65 72 79 20 69  And it is very i
d470: 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 0a 20 20  mportant that.  
d480: 20 20 20 20 2a 2a 20 62 74 72 65 65 49 6e 69 74      ** btreeInit
d490: 50 61 67 65 28 29 20 62 65 20 63 61 6c 6c 65 64  Page() be called
d4a0: 20 6f 6e 20 65 76 65 72 79 20 62 74 72 65 65 20   on every btree 
d4b0: 70 61 67 65 20 73 6f 20 77 65 20 6d 61 6b 65 0a  page so we make.
d4c0: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c        ** the cal
d4d0: 6c 20 66 6f 72 20 65 76 65 72 79 20 70 61 67 65  l for every page
d4e0: 20 74 68 61 74 20 63 6f 6d 65 73 20 69 6e 20 66   that comes in f
d4f0: 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20 2a  or re-initing. *
d500: 2f 0a 20 20 20 20 20 20 62 74 72 65 65 49 6e 69  /.      btreeIni
d510: 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
d520: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
d530: 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   Invoke the busy
d540: 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 62   handler for a b
d550: 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tree..*/.static 
d560: 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b 65 42  int btreeInvokeB
d570: 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20  usyHandler(void 
d580: 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68 61 72  *pArg){.  BtShar
d590: 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68 61  ed *pBt = (BtSha
d5a0: 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73 73  red*)pArg;.  ass
d5b0: 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a  ert( pBt->db );.
d5c0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
d5d0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
d5e0: 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
d5f0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
d600: 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
d610: 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79  r(&pBt->db->busy
d620: 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  Handler);.}../*.
d630: 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61  ** Open a databa
d640: 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  se file..** .** 
d650: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65  zFilename is the
d660: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
d670: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
d680: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
d690: 4c 0a 2a 2a 20 61 20 6e 65 77 20 64 61 74 61 62  L.** a new datab
d6a0: 61 73 65 20 77 69 74 68 20 61 20 72 61 6e 64 6f  ase with a rando
d6b0: 6d 20 6e 61 6d 65 20 69 73 20 63 72 65 61 74 65  m name is create
d6c0: 64 2e 20 20 54 68 69 73 20 72 61 6e 64 6f 6d 6c  d.  This randoml
d6d0: 79 20 6e 61 6d 65 64 0a 2a 2a 20 64 61 74 61 62  y named.** datab
d6e0: 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  ase file will be
d6f0: 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 73 71   deleted when sq
d700: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
d710: 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20  ) is called..** 
d720: 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
d730: 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20  ":memory:" then 
d740: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
d750: 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64  abase is created
d760: 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f  .** that is auto
d770: 6d 61 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f  matically destro
d780: 79 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 63  yed when it is c
d790: 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  losed..**.** If 
d7a0: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
d7b0: 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69  already opened i
d7c0: 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
d7d0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
d7e0: 2a 20 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20  * and we are in 
d7f0: 73 68 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64  shared cache mod
d800: 65 2c 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e  e, then the open
d810: 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20   will fail with 
d820: 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e  an.** SQLITE_CON
d830: 53 54 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20  STRAINT error.  
d840: 57 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20  We cannot allow 
d850: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68  two or more BtSh
d860: 61 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20  ared.** objects 
d870: 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  in the same data
d880: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
d890: 73 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77  since doing so w
d8a0: 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70  ill lead.** to p
d8b0: 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63  roblems with loc
d8c0: 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  king..*/.int sql
d8d0: 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20  ite3BtreeOpen(. 
d8e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
d8f0: 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65  lename,  /* Name
d900: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e   of the file con
d910: 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65  taining the BTre
d920: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
d930: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
d940: 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63          /* Assoc
d950: 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20 68  iated database h
d960: 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65  andle */.  Btree
d970: 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20   **ppBtree,     
d980: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
d990: 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63   new Btree objec
d9a0: 74 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a  t written here *
d9b0: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
d9c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
d9d0: 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ptions */.  int 
d9e0: 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20  vfsFlags        
d9f0: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
da00: 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73  sed through to s
da10: 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e  qlite3_vfs.xOpen
da20: 28 29 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  () */.){.  sqlit
da30: 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20  e3_vfs *pVfs;   
da40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
da50: 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72 20   VFS to use for 
da60: 74 68 69 73 20 62 74 72 65 65 20 2a 2f 0a 20 20  this btree */.  
da70: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
da80: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
da90: 2a 20 53 68 61 72 65 64 20 70 61 72 74 20 6f 66  * Shared part of
daa0: 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
dab0: 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b 20   */.  Btree *p; 
dac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dad0: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74       /* Handle t
dae0: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71  o return */.  sq
daf0: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
db00: 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20  exOpen = 0;  /* 
db10: 50 72 65 76 65 6e 74 73 20 61 20 72 61 63 65 20  Prevents a race 
db20: 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65  condition. Ticke
db30: 74 20 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74  t #3537 */.  int
db40: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
db50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
db60: 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20  esult code from 
db70: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
db80: 0a 20 20 75 38 20 6e 52 65 73 65 72 76 65 3b 20  .  u8 nReserve; 
db90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dba0: 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e 75    /* Byte of unu
dbb0: 73 65 64 20 73 70 61 63 65 20 6f 6e 20 65 61 63  sed space on eac
dbc0: 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69  h page */.  unsi
dbd0: 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48 65 61  gned char zDbHea
dbe0: 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61  der[100];  /* Da
dbf0: 74 61 62 61 73 65 20 68 65 61 64 65 72 20 63 6f  tabase header co
dc00: 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 53  ntent */..  /* S
dc10: 65 74 20 74 68 65 20 76 61 72 69 61 62 6c 65 20  et the variable 
dc20: 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20  isMemdb to true 
dc30: 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  for an in-memory
dc40: 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20   database, or . 
dc50: 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20   ** false for a 
dc60: 66 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62  file-based datab
dc70: 61 73 65 2e 20 54 68 69 73 20 73 79 6d 62 6f 6c  ase. This symbol
dc80: 20 69 73 20 6f 6e 6c 79 20 72 65 71 75 69 72 65   is only require
dc90: 64 20 69 66 0a 20 20 2a 2a 20 65 69 74 68 65 72  d if.  ** either
dca0: 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 2d 64   of the shared-d
dcb0: 61 74 61 20 6f 72 20 61 75 74 6f 76 61 63 75 75  ata or autovacuu
dcc0: 6d 20 66 65 61 74 75 72 65 73 20 61 72 65 20 63  m features are c
dcd0: 6f 6d 70 69 6c 65 64 20 0a 20 20 2a 2a 20 69 6e  ompiled .  ** in
dce0: 74 6f 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a  to the library..
dcf0: 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65    */.#if !define
dd00: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
dd10: 41 52 45 44 5f 43 41 43 48 45 29 20 7c 7c 20 21  ARED_CACHE) || !
dd20: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
dd30: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 29 0a  MIT_AUTOVACUUM).
dd40: 20 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f    #ifdef SQLITE_
dd50: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20  OMIT_MEMORYDB.  
dd60: 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65    const int isMe
dd70: 6d 64 62 20 3d 20 30 3b 0a 20 20 23 65 6c 73 65  mdb = 0;.  #else
dd80: 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  .    const int i
dd90: 73 4d 65 6d 64 62 20 3d 20 7a 46 69 6c 65 6e 61  sMemdb = zFilena
dda0: 6d 65 20 26 26 20 21 73 74 72 63 6d 70 28 7a 46  me && !strcmp(zF
ddb0: 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72  ilename, ":memor
ddc0: 79 3a 22 29 3b 0a 20 20 23 65 6e 64 69 66 0a 23  y:");.  #endif.#
ddd0: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
dde0: 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   db!=0 );.  asse
ddf0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
de00: 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
de10: 29 20 29 3b 0a 0a 20 20 70 56 66 73 20 3d 20 64  ) );..  pVfs = d
de20: 62 2d 3e 70 56 66 73 3b 0a 20 20 70 20 3d 20 73  b->pVfs;.  p = s
de30: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
de40: 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29 3b  (sizeof(Btree));
de50: 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20  .  if( !p ){.   
de60: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
de70: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69  OMEM;.  }.  p->i
de80: 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e  nTrans = TRANS_N
de90: 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64  ONE;.  p->db = d
dea0: 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  b;.#ifndef SQLIT
deb0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
dec0: 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42  CHE.  p->lock.pB
ded0: 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c  tree = p;.  p->l
dee0: 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b 0a  ock.iTable = 1;.
def0: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
df00: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
df10: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
df20: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
df30: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
df40: 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73   /*.  ** If this
df50: 20 42 74 72 65 65 20 69 73 20 61 20 63 61 6e 64   Btree is a cand
df60: 69 64 61 74 65 20 66 6f 72 20 73 68 61 72 65 64  idate for shared
df70: 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20 66   cache, try to f
df80: 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73  ind an.  ** exis
df90: 74 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f 62  ting BtShared ob
dfa0: 6a 65 63 74 20 74 68 61 74 20 77 65 20 63 61 6e  ject that we can
dfb0: 20 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a 2f   share with.  */
dfc0: 0a 20 20 69 66 28 20 69 73 4d 65 6d 64 62 3d 3d  .  if( isMemdb==
dfd0: 30 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 20 26  0 && zFilename &
dfe0: 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29  & zFilename[0] )
dff0: 7b 0a 20 20 20 20 69 66 28 20 76 66 73 46 6c 61  {.    if( vfsFla
e000: 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
e010: 5f 53 48 41 52 45 44 43 41 43 48 45 20 29 7b 0a  _SHAREDCACHE ){.
e020: 20 20 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50        int nFullP
e030: 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e  athname = pVfs->
e040: 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20  mxPathname+1;.  
e050: 20 20 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50      char *zFullP
e060: 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
e070: 33 4d 61 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61 74  3Malloc(nFullPat
e080: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71  hname);.      sq
e090: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
e0a0: 65 78 53 68 61 72 65 64 3b 0a 20 20 20 20 20 20  exShared;.      
e0b0: 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b  p->sharable = 1;
e0c0: 0a 20 20 20 20 20 20 69 66 28 20 21 7a 46 75 6c  .      if( !zFul
e0d0: 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  lPathname ){.   
e0e0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
e0f0: 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65  e(p);.        re
e100: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
e110: 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  M;.      }.     
e120: 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61   sqlite3OsFullPa
e130: 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69  thname(pVfs, zFi
e140: 6c 65 6e 61 6d 65 2c 20 6e 46 75 6c 6c 50 61 74  lename, nFullPat
e150: 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68  hname, zFullPath
e160: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 6d 75 74  name);.      mut
e170: 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65 33  exOpen = sqlite3
e180: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
e190: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4f  E_MUTEX_STATIC_O
e1a0: 50 45 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  PEN);.      sqli
e1b0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
e1c0: 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20  mutexOpen);.    
e1d0: 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20    mutexShared = 
e1e0: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
e1f0: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
e200: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20  TATIC_MASTER);. 
e210: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
e220: 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68  ex_enter(mutexSh
e230: 61 72 65 64 29 3b 0a 20 20 20 20 20 20 66 6f 72  ared);.      for
e240: 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68  (pBt=GLOBAL(BtSh
e250: 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
e260: 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 20 70  redCacheList); p
e270: 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65  Bt; pBt=pBt->pNe
e280: 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  xt){.        ass
e290: 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30  ert( pBt->nRef>0
e2a0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
e2b0: 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50  0==strcmp(zFullP
e2c0: 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33  athname, sqlite3
e2d0: 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42  PagerFilename(pB
e2e0: 74 2d 3e 70 50 61 67 65 72 29 29 0a 20 20 20 20  t->pPager)).    
e2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
e300: 73 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28  sqlite3PagerVfs(
e310: 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56  pBt->pPager)==pV
e320: 66 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  fs ){.          
e330: 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20  int iDb;.       
e340: 20 20 20 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e     for(iDb=db->n
e350: 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44  Db-1; iDb>=0; iD
e360: 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20  b--){.          
e370: 20 20 42 74 72 65 65 20 2a 70 45 78 69 73 74 69    Btree *pExisti
e380: 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  ng = db->aDb[iDb
e390: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20  ].pBt;.         
e3a0: 20 20 20 69 66 28 20 70 45 78 69 73 74 69 6e 67     if( pExisting
e3b0: 20 26 26 20 70 45 78 69 73 74 69 6e 67 2d 3e 70   && pExisting->p
e3c0: 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20  Bt==pBt ){.     
e3d0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e3e0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
e3f0: 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  exShared);.     
e400: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e410: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
e420: 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20  exOpen);.       
e430: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
e440: 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
e450: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
e460: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
e470: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
e480: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
e490: 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20  ONSTRAINT;.     
e4a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e4b0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
e4c0: 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20  ->pBt = pBt;.   
e4d0: 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66         pBt->nRef
e4e0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  ++;.          br
e4f0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
e500: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
e510: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
e520: 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
e530: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
e540: 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
e550: 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
e560: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
e570: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49  else{.      /* I
e580: 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65  n debug mode, we
e590: 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73   mark all persis
e5a0: 74 65 6e 74 20 64 61 74 61 62 61 73 65 73 20 61  tent databases a
e5b0: 73 20 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20  s sharable.     
e5c0: 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68   ** even when th
e5d0: 65 79 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69  ey are not.  Thi
e5e0: 73 20 65 78 65 72 63 69 73 65 73 20 74 68 65 20  s exercises the 
e5f0: 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64  locking code and
e600: 0a 20 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20  .      ** gives 
e610: 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79  more opportunity
e620: 20 66 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c   for asserts(sql
e630: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
e640: 29 29 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  )).      ** stat
e650: 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c  ements to find l
e660: 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e  ocking problems.
e670: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
e680: 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b  p->sharable = 1;
e690: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
e6a0: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
e6b0: 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a  Bt==0 ){.    /*.
e6c0: 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f      ** The follo
e6d0: 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b  wing asserts mak
e6e0: 65 20 73 75 72 65 20 74 68 61 74 20 73 74 72 75  e sure that stru
e6f0: 63 74 75 72 65 73 20 75 73 65 64 20 62 79 20 74  ctures used by t
e700: 68 65 20 62 74 72 65 65 20 61 72 65 0a 20 20 20  he btree are.   
e710: 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73 69   ** the right si
e720: 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20  ze.  This is to 
e730: 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 73 69  guard against si
e740: 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61 74 20  ze changes that 
e750: 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68  result.    ** wh
e760: 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20  en compiling on 
e770: 61 20 64 69 66 66 65 72 65 6e 74 20 61 72 63 68  a different arch
e780: 69 74 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f  itecture..    */
e790: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
e7a0: 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c 7c 20 73  eof(i64)==8 || s
e7b0: 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34 20 29 3b  izeof(i64)==4 );
e7c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
e7d0: 65 6f 66 28 75 36 34 29 3d 3d 38 20 7c 7c 20 73  eof(u64)==8 || s
e7e0: 69 7a 65 6f 66 28 75 36 34 29 3d 3d 34 20 29 3b  izeof(u64)==4 );
e7f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
e800: 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20  eof(u32)==4 );. 
e810: 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
e820: 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20  f(u16)==2 );.   
e830: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
e840: 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20  Pgno)==4 );.  . 
e850: 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33     pBt = sqlite3
e860: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65  MallocZero( size
e870: 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20 20  of(*pBt) );.    
e880: 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20  if( pBt==0 ){.  
e890: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
e8a0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
e8b0: 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
e8c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
e8d0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
e8e0: 6e 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70 50  n(pVfs, &pBt->pP
e8f0: 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  ager, zFilename,
e900: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e910: 20 20 20 20 20 20 20 20 20 20 20 45 58 54 52 41             EXTRA
e920: 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20 76 66  _SIZE, flags, vf
e930: 73 46 6c 61 67 73 2c 20 70 61 67 65 52 65 69 6e  sFlags, pageRein
e940: 69 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  it);.    if( rc=
e950: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
e960: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e970: 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61  PagerReadFilehea
e980: 64 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  der(pBt->pPager,
e990: 73 69 7a 65 6f 66 28 7a 44 62 48 65 61 64 65 72  sizeof(zDbHeader
e9a0: 29 2c 7a 44 62 48 65 61 64 65 72 29 3b 0a 20 20  ),zDbHeader);.  
e9b0: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
e9c0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
e9d0: 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70     goto btree_op
e9e0: 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  en_out;.    }.  
e9f0: 20 20 70 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a    pBt->db = db;.
ea00: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
ea10: 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 70  SetBusyhandler(p
ea20: 42 74 2d 3e 70 50 61 67 65 72 2c 20 62 74 72 65  Bt->pPager, btre
ea30: 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  eInvokeBusyHandl
ea40: 65 72 2c 20 70 42 74 29 3b 0a 20 20 20 20 70 2d  er, pBt);.    p-
ea50: 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20  >pBt = pBt;.  . 
ea60: 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20     pBt->pCursor 
ea70: 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50  = 0;.    pBt->pP
ea80: 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 70 42  age1 = 0;.    pB
ea90: 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 73 71  t->readOnly = sq
eaa0: 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64  lite3PagerIsread
eab0: 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72  only(pBt->pPager
eac0: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
ead0: 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20  _SECURE_DELETE. 
eae0: 20 20 20 70 42 74 2d 3e 73 65 63 75 72 65 44 65     pBt->secureDe
eaf0: 6c 65 74 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66  lete = 1;.#endif
eb00: 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69  .    pBt->pageSi
eb10: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 7a  ze = get2byte(&z
eb20: 44 62 48 65 61 64 65 72 5b 31 36 5d 29 3b 0a 20  DbHeader[16]);. 
eb30: 20 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65     if( pBt->page
eb40: 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d  Size<512 || pBt-
eb50: 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45  >pageSize>SQLITE
eb60: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20  _MAX_PAGE_SIZE. 
eb70: 20 20 20 20 20 20 20 20 7c 7c 20 28 28 70 42 74          || ((pBt
eb80: 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 26 70 42  ->pageSize-1)&pB
eb90: 74 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d 30 20  t->pageSize)!=0 
eba0: 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61  ){.      pBt->pa
ebb0: 67 65 53 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e  geSize = 0;.#ifn
ebc0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ebd0: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
ebe0: 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63   /* If the magic
ebf0: 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22   name ":memory:"
ec00: 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20   will create an 
ec10: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
ec20: 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a  se, then.      *
ec30: 2a 20 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f  * leave the auto
ec40: 56 61 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30  Vacuum mode at 0
ec50: 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61   (do not auto-va
ec60: 63 75 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20  cuum), even if. 
ec70: 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44       ** SQLITE_D
ec80: 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
ec90: 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68  M is true. On th
eca0: 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66  e other hand, if
ecb0: 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  .      ** SQLITE
ecc0: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68  _OMIT_MEMORYDB h
ecd0: 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c  as been defined,
ece0: 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22   then ":memory:"
ecf0: 20 69 73 20 6a 75 73 74 20 61 0a 20 20 20 20 20   is just a.     
ed00: 20 2a 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65   ** regular file
ed10: 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63  -name. In this c
ed20: 61 73 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63  ase the auto-vac
ed30: 75 75 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70  uum applies as p
ed40: 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20  er normal..     
ed50: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 46   */.      if( zF
ed60: 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65  ilename && !isMe
ed70: 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70  mdb ){.        p
ed80: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
ed90: 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54   (SQLITE_DEFAULT
eda0: 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20  _AUTOVACUUM ? 1 
edb0: 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42  : 0);.        pB
edc0: 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
edd0: 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
ede0: 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20  AUTOVACUUM==2 ? 
edf0: 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  1 : 0);.      }.
ee00: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e 52 65  #endif.      nRe
ee10: 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d  serve = 0;.    }
ee20: 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 52 65 73  else{.      nRes
ee30: 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72  erve = zDbHeader
ee40: 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d  [20];.      pBt-
ee50: 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d  >pageSizeFixed =
ee60: 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   1;.#ifndef SQLI
ee70: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
ee80: 55 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75  UM.      pBt->au
ee90: 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  toVacuum = (get4
eea0: 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b  byte(&zDbHeader[
eeb0: 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 4*4])?1:0);
eec0: 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72  .      pBt->incr
eed0: 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
eee0: 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36  te(&zDbHeader[36
eef0: 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23   + 7*4])?1:0);.#
ef00: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
ef10: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
ef20: 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74  rSetPagesize(pBt
ef30: 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e  ->pPager, &pBt->
ef40: 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72  pageSize, nReser
ef50: 76 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ve);.    if( rc 
ef60: 29 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65  ) goto btree_ope
ef70: 6e 5f 6f 75 74 3b 0a 20 20 20 20 70 42 74 2d 3e  n_out;.    pBt->
ef80: 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
ef90: 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65  ->pageSize - nRe
efa0: 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72  serve;.    asser
efb0: 74 28 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  t( (pBt->pageSiz
efc0: 65 20 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a  e & 7)==0 );  /*
efd0: 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e   8-byte alignmen
efe0: 74 20 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f  t of pageSize */
eff0: 0a 20 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65  .   .#if !define
f000: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
f010: 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21  ARED_CACHE) && !
f020: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
f030: 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20  MIT_DISKIO).    
f040: 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20 42  /* Add the new B
f050: 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74  tShared object t
f060: 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  o the linked lis
f070: 74 20 73 68 61 72 61 62 6c 65 20 42 74 53 68 61  t sharable BtSha
f080: 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  reds..    */.   
f090: 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65   if( p->sharable
f0a0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
f0b0: 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68  3_mutex *mutexSh
f0c0: 61 72 65 64 3b 0a 20 20 20 20 20 20 70 42 74 2d  ared;.      pBt-
f0d0: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20  >nRef = 1;.     
f0e0: 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73   mutexShared = s
f0f0: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
f100: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
f110: 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20  ATIC_MASTER);.  
f120: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54      if( SQLITE_T
f130: 48 52 45 41 44 53 41 46 45 20 26 26 20 73 71 6c  HREADSAFE && sql
f140: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
f150: 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20  .bCoreMutex ){. 
f160: 20 20 20 20 20 20 20 70 42 74 2d 3e 6d 75 74 65         pBt->mute
f170: 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  x = sqlite3Mutex
f180: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
f190: 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20  EX_FAST);.      
f1a0: 20 20 69 66 28 20 70 42 74 2d 3e 6d 75 74 65 78    if( pBt->mutex
f1b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
f1c0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
f1d0: 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62  EM;.          db
f1e0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
f1f0: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   0;.          go
f200: 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
f210: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
f220: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
f230: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d  e3_mutex_enter(m
f240: 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
f250: 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20     pBt->pNext = 
f260: 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
f270: 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
f280: 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  cheList);.      
f290: 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
f2a0: 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
f2b0: 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a  cheList) = pBt;.
f2c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
f2d0: 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53  tex_leave(mutexS
f2e0: 68 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65  hared);.    }.#e
f2f0: 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64  ndif.  }..#if !d
f300: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
f310: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
f320: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
f330: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29  ITE_OMIT_DISKIO)
f340: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77  .  /* If the new
f350: 20 42 74 72 65 65 20 75 73 65 73 20 61 20 73 68   Btree uses a sh
f360: 61 72 61 62 6c 65 20 70 42 74 53 68 61 72 65 64  arable pBtShared
f370: 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20  , then link the 
f380: 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69  new.  ** Btree i
f390: 6e 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20  nto the list of 
f3a0: 61 6c 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72  all sharable Btr
f3b0: 65 65 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65  ees for the same
f3c0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a   connection..  *
f3d0: 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65  * The list is ke
f3e0: 70 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  pt in ascending 
f3f0: 6f 72 64 65 72 20 62 79 20 70 42 74 20 61 64 64  order by pBt add
f400: 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ress..  */.  if(
f410: 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a   p->sharable ){.
f420: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42      int i;.    B
f430: 74 72 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20  tree *pSib;.    
f440: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
f450: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
f460: 69 66 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e  if( (pSib = db->
f470: 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26  aDb[i].pBt)!=0 &
f480: 26 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65  & pSib->sharable
f490: 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   ){.        whil
f4a0: 65 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29  e( pSib->pPrev )
f4b0: 7b 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70  { pSib = pSib->p
f4c0: 50 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20  Prev; }.        
f4d0: 69 66 28 20 70 2d 3e 70 42 74 3c 70 53 69 62 2d  if( p->pBt<pSib-
f4e0: 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  >pBt ){.        
f4f0: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69    p->pNext = pSi
f500: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  b;.          p->
f510: 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20  pPrev = 0;.     
f520: 20 20 20 20 20 70 53 69 62 2d 3e 70 50 72 65 76       pSib->pPrev
f530: 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 65   = p;.        }e
f540: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77  lse{.          w
f550: 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65 78  hile( pSib->pNex
f560: 74 20 26 26 20 70 53 69 62 2d 3e 70 4e 65 78 74  t && pSib->pNext
f570: 2d 3e 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b 0a  ->pBt<p->pBt ){.
f580: 20 20 20 20 20 20 20 20 20 20 20 20 70 53 69 62              pSib
f590: 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a   = pSib->pNext;.
f5a0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
f5b0: 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d        p->pNext =
f5c0: 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20   pSib->pNext;.  
f5d0: 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76          p->pPrev
f5e0: 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20   = pSib;.       
f5f0: 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20     if( p->pNext 
f600: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
f610: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
f620: 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   p;.          }.
f630: 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e            pSib->
f640: 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20  pNext = p;.     
f650: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65     }.        bre
f660: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
f670: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a  }.  }.#endif.  *
f680: 70 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74  ppBtree = p;..bt
f690: 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20  ree_open_out:.  
f6a0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
f6b0: 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74  K ){.    if( pBt
f6c0: 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20   && pBt->pPager 
f6d0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
f6e0: 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e  PagerClose(pBt->
f6f0: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
f700: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
f710: 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
f720: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 2a  3_free(p);.    *
f730: 70 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d  ppBtree = 0;.  }
f740: 0a 20 20 69 66 28 20 6d 75 74 65 78 4f 70 65 6e  .  if( mutexOpen
f750: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
f760: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
f770: 6c 64 28 6d 75 74 65 78 4f 70 65 6e 29 20 29 3b  ld(mutexOpen) );
f780: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
f790: 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70  ex_leave(mutexOp
f7a0: 65 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  en);.  }.  retur
f7b0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n rc;.}../*.** D
f7c0: 65 63 72 65 6d 65 6e 74 20 74 68 65 20 42 74 53  ecrement the BtS
f7d0: 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74  hared.nRef count
f7e0: 65 72 2e 20 20 57 68 65 6e 20 69 74 20 72 65 61  er.  When it rea
f7f0: 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65  ches zero,.** re
f800: 6d 6f 76 65 20 74 68 65 20 42 74 53 68 61 72 65  move the BtShare
f810: 64 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d  d structure from
f820: 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73   the sharing lis
f830: 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72  t.  Return.** tr
f840: 75 65 20 69 66 20 74 68 65 20 42 74 53 68 61 72  ue if the BtShar
f850: 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 20  ed.nRef counter 
f860: 72 65 61 63 68 65 73 20 7a 65 72 6f 20 61 6e 64  reaches zero and
f870: 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65   return.** false
f880: 20 69 66 20 69 74 20 69 73 20 73 74 69 6c 6c 20   if it is still 
f890: 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61  positive..*/.sta
f8a0: 74 69 63 20 69 6e 74 20 72 65 6d 6f 76 65 46 72  tic int removeFr
f8b0: 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 42 74  omSharingList(Bt
f8c0: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 23 69  Shared *pBt){.#i
f8d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f8e0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
f8f0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
f900: 70 4d 61 73 74 65 72 3b 0a 20 20 42 74 53 68 61  pMaster;.  BtSha
f910: 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e  red *pList;.  in
f920: 74 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a  t removed = 0;..
f930: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
f940: 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28  3_mutex_notheld(
f950: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
f960: 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74   pMaster = sqlit
f970: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
f980: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
f990: 5f 4d 41 53 54 45 52 29 3b 0a 20 20 73 71 6c 69  _MASTER);.  sqli
f9a0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
f9b0: 70 4d 61 73 74 65 72 29 3b 0a 20 20 70 42 74 2d  pMaster);.  pBt-
f9c0: 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70  >nRef--;.  if( p
f9d0: 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20  Bt->nRef<=0 ){. 
f9e0: 20 20 20 69 66 28 20 47 4c 4f 42 41 4c 28 42 74     if( GLOBAL(Bt
f9f0: 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
fa00: 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3d  haredCacheList)=
fa10: 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 47 4c  =pBt ){.      GL
fa20: 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
fa30: 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
fa40: 65 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e  eList) = pBt->pN
fa50: 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ext;.    }else{.
fa60: 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 47 4c        pList = GL
fa70: 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
fa80: 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
fa90: 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68  eList);.      wh
faa0: 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4c 69 73  ile( ALWAYS(pLis
fab0: 74 29 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65  t) && pList->pNe
fac0: 78 74 21 3d 70 42 74 20 29 7b 0a 20 20 20 20 20  xt!=pBt ){.     
fad0: 20 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e     pList=pList->
fae0: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
faf0: 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
fb00: 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20  pList) ){.      
fb10: 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d    pList->pNext =
fb20: 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pBt->pNext;.   
fb30: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
fb40: 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  f( SQLITE_THREAD
fb50: 53 41 46 45 20 29 7b 0a 20 20 20 20 20 20 73 71  SAFE ){.      sq
fb60: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65  lite3_mutex_free
fb70: 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  (pBt->mutex);.  
fb80: 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64 20    }.    removed 
fb90: 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 1;.  }.  sqlit
fba0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
fbb0: 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72  Master);.  retur
fbc0: 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65  n removed;.#else
fbd0: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e  .  return 1;.#en
fbe0: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  dif.}../*.** Mak
fbf0: 65 20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d 70  e sure pBt->pTmp
fc00: 53 70 61 63 65 20 70 6f 69 6e 74 73 20 74 6f 20  Space points to 
fc10: 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66  an allocation of
fc20: 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a   .** MX_CELL_SIZ
fc30: 45 28 70 42 74 29 20 62 79 74 65 73 2e 0a 2a 2f  E(pBt) bytes..*/
fc40: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 6c 6c  .static void all
fc50: 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 42  ocateTempSpace(B
fc60: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
fc70: 20 69 66 28 20 21 70 42 74 2d 3e 70 54 6d 70 53   if( !pBt->pTmpS
fc80: 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d  pace ){.    pBt-
fc90: 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c  >pTmpSpace = sql
fca0: 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20  ite3PageMalloc( 
fcb0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b  pBt->pageSize );
fcc0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  .  }.}../*.** Fr
fcd0: 65 65 20 74 68 65 20 70 42 74 2d 3e 70 54 6d 70  ee the pBt->pTmp
fce0: 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  Space allocation
fcf0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
fd00: 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 42 74  freeTempSpace(Bt
fd10: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
fd20: 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
fd30: 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29   pBt->pTmpSpace)
fd40: 3b 0a 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  ;.  pBt->pTmpSpa
fd50: 63 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ce = 0;.}../*.**
fd60: 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64   Close an open d
fd70: 61 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61  atabase and inva
fd80: 6c 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f  lidate all curso
fd90: 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
fda0: 65 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72  e3BtreeClose(Btr
fdb0: 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
fdc0: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
fdd0: 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  ;.  BtCursor *pC
fde0: 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20  ur;..  /* Close 
fdf0: 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
fe00: 65 64 20 76 69 61 20 74 68 69 73 20 68 61 6e 64  ed via this hand
fe10: 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  le.  */.  assert
fe20: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
fe30: 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
fe40: 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
fe50: 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
fe60: 70 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72  pCur = pBt->pCur
fe70: 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43  sor;.  while( pC
fe80: 75 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73  ur ){.    BtCurs
fe90: 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b  or *pTmp = pCur;
fea0: 0a 20 20 20 20 70 43 75 72 20 3d 20 70 43 75 72  .    pCur = pCur
feb0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28  ->pNext;.    if(
fec0: 20 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70   pTmp->pBtree==p
fed0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
fee0: 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  3BtreeCloseCurso
fef0: 72 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20  r(pTmp);.    }. 
ff00: 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63   }..  /* Rollbac
ff10: 6b 20 61 6e 79 20 61 63 74 69 76 65 20 74 72 61  k any active tra
ff20: 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65  nsaction and fre
ff30: 65 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72  e the handle str
ff40: 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65  ucture..  ** The
ff50: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
ff60: 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20  BtreeRollback() 
ff70: 64 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d  drops any table-
ff80: 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20  locks held by.  
ff90: 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a  ** this handle..
ffa0: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74    */.  sqlite3Bt
ffb0: 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a  reeRollback(p);.
ffc0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
ffd0: 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  ave(p);..  /* If
ffe0: 20 74 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c   there are still
fff0: 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e 64 69   other outstandi
10000 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ng references to
10010 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
10020 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65  e.  ** structure
10030 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68  , return now. Th
10040 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74  e remainder of t
10050 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c  his procedure cl
10060 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74 68  eans .  ** up th
10070 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e 0a  e shared-btree..
10080 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
10090 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20  ->wantToLock==0 
100a0 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20  && p->locked==0 
100b0 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61  );.  if( !p->sha
100c0 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46  rable || removeF
100d0 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 70  romSharingList(p
100e0 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  Bt) ){.    /* Th
100f0 65 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67  e pBt is no long
10100 65 72 20 6f 6e 20 74 68 65 20 73 68 61 72 69 6e  er on the sharin
10110 67 20 6c 69 73 74 2c 20 73 6f 20 77 65 20 63 61  g list, so we ca
10120 6e 20 61 63 63 65 73 73 0a 20 20 20 20 2a 2a 20  n access.    ** 
10130 69 74 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  it without havin
10140 67 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75  g to hold the mu
10150 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  tex..    **.    
10160 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64  ** Clean out and
10170 20 64 65 6c 65 74 65 20 74 68 65 20 42 74 53 68   delete the BtSh
10180 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20  ared object..   
10190 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
101a0 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b  !pBt->pCursor );
101b0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
101c0 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67  rClose(pBt->pPag
101d0 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  er);.    if( pBt
101e0 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20 26 26  ->xFreeSchema &&
101f0 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b   pBt->pSchema ){
10200 0a 20 20 20 20 20 20 70 42 74 2d 3e 78 46 72 65  .      pBt->xFre
10210 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 70 53 63  eSchema(pBt->pSc
10220 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20  hema);.    }.   
10230 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42   sqlite3_free(pB
10240 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  t->pSchema);.   
10250 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70   freeTempSpace(p
10260 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
10270 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a  _free(pBt);.  }.
10280 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10290 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
102a0 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77  E.  assert( p->w
102b0 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  antToLock==0 );.
102c0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63    assert( p->loc
102d0 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ked==0 );.  if( 
102e0 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50  p->pPrev ) p->pP
102f0 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e  rev->pNext = p->
10300 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e  pNext;.  if( p->
10310 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74  pNext ) p->pNext
10320 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72  ->pPrev = p->pPr
10330 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71  ev;.#endif..  sq
10340 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
10350 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10360 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  K;.}../*.** Chan
10370 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20  ge the limit on 
10380 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
10390 67 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74  ges allowed in t
103a0 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  he cache..**.** 
103b0 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  The maximum numb
103c0 65 72 20 6f 66 20 63 61 63 68 65 20 70 61 67 65  er of cache page
103d0 73 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  s is set to the 
103e0 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75  absolute.** valu
103f0 65 20 6f 66 20 6d 78 50 61 67 65 2e 20 20 49 66  e of mxPage.  If
10400 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61 74   mxPage is negat
10410 69 76 65 2c 20 74 68 65 20 70 61 67 65 72 20 77  ive, the pager w
10420 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61  ill.** operate a
10430 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20  synchronously - 
10440 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70  it will not stop
10450 20 74 6f 20 64 6f 20 66 73 79 6e 63 28 29 73 0a   to do fsync()s.
10460 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20 64 61 74  ** to insure dat
10470 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  a is written to 
10480 74 68 65 20 64 69 73 6b 20 73 75 72 66 61 63 65  the disk surface
10490 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69   before.** conti
104a0 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73 61 63 74  nuing.  Transact
104b0 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20  ions still work 
104c0 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69  if synchronous i
104d0 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68  s off,.** and th
104e0 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f  e database canno
104f0 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 69  t be corrupted i
10500 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a  f this program.*
10510 2a 20 63 72 61 73 68 65 73 2e 20 20 42 75 74 20  * crashes.  But 
10520 69 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  if the operating
10530 20 73 79 73 74 65 6d 20 63 72 61 73 68 65 73 20   system crashes 
10540 6f 72 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61  or there is.** a
10550 6e 20 61 62 72 75 70 74 20 70 6f 77 65 72 20 66  n abrupt power f
10560 61 69 6c 75 72 65 20 77 68 65 6e 20 73 79 6e 63  ailure when sync
10570 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20  hronous is off, 
10580 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
10590 63 6f 75 6c 64 20 62 65 20 6c 65 66 74 20 69 6e  could be left in
105a0 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
105b0 20 61 6e 64 20 75 6e 72 65 63 6f 76 65 72 61 62   and unrecoverab
105c0 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e  le state..** Syn
105d0 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62  chronous is on b
105e0 79 20 64 65 66 61 75 6c 74 20 73 6f 20 64 61 74  y default so dat
105f0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
10600 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61   is not.** norma
10610 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a  lly a worry..*/.
10620 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
10630 53 65 74 43 61 63 68 65 53 69 7a 65 28 42 74 72  SetCacheSize(Btr
10640 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67  ee *p, int mxPag
10650 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
10660 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
10670 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
10680 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
10690 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
106a0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
106b0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  p);.  sqlite3Pag
106c0 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70  erSetCachesize(p
106d0 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61  Bt->pPager, mxPa
106e0 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ge);.  sqlite3Bt
106f0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
10700 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10710 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
10720 20 74 68 65 20 77 61 79 20 64 61 74 61 20 69 73   the way data is
10730 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20   synced to disk 
10740 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72  in order to incr
10750 65 61 73 65 20 6f 72 20 64 65 63 72 65 61 73 65  ease or decrease
10760 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65  .** how well the
10770 20 64 61 74 61 62 61 73 65 20 72 65 73 69 73 74   database resist
10780 73 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20  s damage due to 
10790 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64 20 70  OS crashes and p
107a0 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73  ower.** failures
107b0 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68  .  Level 1 is th
107c0 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68  e same as asynch
107d0 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73  ronous (no syncs
107e0 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20  () occur and.** 
107f0 74 68 65 72 65 20 69 73 20 61 20 68 69 67 68 20  there is a high 
10800 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
10810 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20  amage)  Level 2 
10820 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20  is the default. 
10830 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76   There.** is a v
10840 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d  ery low but non-
10850 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79  zero probability
10860 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76   of damage.  Lev
10870 65 6c 20 33 20 72 65 64 75 63 65 73 20 74 68 65  el 3 reduces the
10880 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20  .** probability 
10890 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61  of damage to nea
108a0 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20  r zero but with 
108b0 61 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61  a write performa
108c0 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a  nce reduction..*
108d0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
108e0 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
108f0 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  MAS.int sqlite3B
10900 74 72 65 65 53 65 74 53 61 66 65 74 79 4c 65 76  treeSetSafetyLev
10910 65 6c 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  el(Btree *p, int
10920 20 6c 65 76 65 6c 2c 20 69 6e 74 20 66 75 6c 6c   level, int full
10930 53 79 6e 63 29 7b 0a 20 20 42 74 53 68 61 72 65  Sync){.  BtShare
10940 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
10950 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
10960 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
10970 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
10980 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
10990 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  er(p);.  sqlite3
109a0 50 61 67 65 72 53 65 74 53 61 66 65 74 79 4c 65  PagerSetSafetyLe
109b0 76 65 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  vel(pBt->pPager,
109c0 20 6c 65 76 65 6c 2c 20 66 75 6c 6c 53 79 6e 63   level, fullSync
109d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
109e0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
109f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
10a00 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
10a10 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
10a20 65 20 67 69 76 65 6e 20 62 74 72 65 65 20 69 73  e given btree is
10a30 20 73 65 74 20 74 6f 20 73 61 66 65 74 79 20 6c   set to safety l
10a40 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f 74 68 65  evel 1.  In othe
10a50 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72 65 74 75  r.** words, retu
10a60 72 6e 20 54 52 55 45 20 69 66 20 6e 6f 20 73 79  rn TRUE if no sy
10a70 6e 63 28 29 20 6f 63 63 75 72 73 20 6f 6e 20 74  nc() occurs on t
10a80 68 65 20 64 69 73 6b 20 66 69 6c 65 73 2e 0a 2a  he disk files..*
10a90 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
10aa0 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28 42  eeSyncDisabled(B
10ab0 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
10ac0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
10ad0 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  Bt;.  int rc;.  
10ae0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
10af0 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
10b00 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20 0a 20 20  ->mutex) );  .  
10b10 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
10b20 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r(p);.  assert( 
10b30 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67  pBt && pBt->pPag
10b40 65 72 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  er );.  rc = sql
10b50 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28  ite3PagerNosync(
10b60 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
10b70 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
10b80 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
10b90 63 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  c;.}..#if !defin
10ba0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ed(SQLITE_OMIT_P
10bb0 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c  AGER_PRAGMAS) ||
10bc0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
10bd0 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 0a 2f 2a  _OMIT_VACUUM)./*
10be0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 64  .** Change the d
10bf0 65 66 61 75 6c 74 20 70 61 67 65 73 20 73 69 7a  efault pages siz
10c00 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72  e and the number
10c10 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79 74   of reserved byt
10c20 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a 20  es per page..** 
10c30 4f 72 2c 20 69 66 20 74 68 65 20 70 61 67 65 20  Or, if the page 
10c40 73 69 7a 65 20 68 61 73 20 61 6c 72 65 61 64 79  size has already
10c50 20 62 65 65 6e 20 66 69 78 65 64 2c 20 72 65 74   been fixed, ret
10c60 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
10c70 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74 20  NLY .** without 
10c80 63 68 61 6e 67 69 6e 67 20 61 6e 79 74 68 69 6e  changing anythin
10c90 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  g..**.** The pag
10ca0 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20 61  e size must be a
10cb0 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65 74 77   power of 2 betw
10cc0 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33  een 512 and 6553
10cd0 36 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 0a  6.  If the page.
10ce0 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69 65 64  ** size supplied
10cf0 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20 74   does not meet t
10d00 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  his constraint t
10d10 68 65 6e 20 74 68 65 20 70 61 67 65 20 73 69 7a  hen the page siz
10d20 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e  e is not.** chan
10d30 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20  ged..**.** Page 
10d40 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73 74 72  sizes are constr
10d50 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f  ained to be a po
10d60 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20 74 68  wer of two so th
10d70 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a  at the region.**
10d80 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
10d90 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 6c   file used for l
10da0 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e  ocking (beginnin
10db0 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42 59 54  g at PENDING_BYT
10dc0 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  E,.** the first 
10dd0 62 79 74 65 20 70 61 73 74 20 74 68 65 20 31 47  byte past the 1G
10de0 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78 34 30  B boundary, 0x40
10df0 30 30 30 30 30 30 29 20 6e 65 65 64 73 20 74 6f  000000) needs to
10e00 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74 68 65   occur.** at the
10e10 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20   beginning of a 
10e20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  page..**.** If p
10e30 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65 72 76  arameter nReserv
10e40 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a  e is less than z
10e50 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e 75  ero, then the nu
10e60 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64  mber of reserved
10e70 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20 70 61  .** bytes per pa
10e80 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61  ge is left uncha
10e90 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  nged..**.** If t
10ea0 68 65 20 69 46 69 78 21 3d 30 20 74 68 65 6e 20  he iFix!=0 then 
10eb0 74 68 65 20 70 61 67 65 53 69 7a 65 46 69 78 65  the pageSizeFixe
10ec0 64 20 66 6c 61 67 20 69 73 20 73 65 74 20 73 6f  d flag is set so
10ed0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 73   that the page s
10ee0 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f 76  ize.** and autov
10ef0 61 63 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20 6e  acuum mode can n
10f00 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63 68 61 6e  o longer be chan
10f10 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ged..*/.int sqli
10f20 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53  te3BtreeSetPageS
10f30 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ize(Btree *p, in
10f40 74 20 70 61 67 65 53 69 7a 65 2c 20 69 6e 74 20  t pageSize, int 
10f50 6e 52 65 73 65 72 76 65 2c 20 69 6e 74 20 69 46  nReserve, int iF
10f60 69 78 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ix){.  int rc = 
10f70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53  SQLITE_OK;.  BtS
10f80 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
10f90 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  pBt;.  assert( n
10fa0 52 65 73 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e  Reserve>=-1 && n
10fb0 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a  Reserve<=255 );.
10fc0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
10fd0 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70 42  ter(p);.  if( pB
10fe0 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64  t->pageSizeFixed
10ff0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
11000 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
11010 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11020 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20  READONLY;.  }.  
11030 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29  if( nReserve<0 )
11040 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d  {.    nReserve =
11050 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
11060 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
11070 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
11080 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e  nReserve>=0 && n
11090 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a  Reserve<=255 );.
110a0 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d    if( pageSize>=
110b0 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c  512 && pageSize<
110c0 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  =SQLITE_MAX_PAGE
110d0 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20  _SIZE &&.       
110e0 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70   ((pageSize-1)&p
110f0 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20  ageSize)==0 ){. 
11100 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65     assert( (page
11110 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a  Size & 7)==0 );.
11120 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
11130 2d 3e 70 50 61 67 65 31 20 26 26 20 21 70 42 74  ->pPage1 && !pBt
11140 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20  ->pCursor );.   
11150 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
11160 20 28 75 31 36 29 70 61 67 65 53 69 7a 65 3b 0a   (u16)pageSize;.
11170 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63      freeTempSpac
11180 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 63  e(pBt);.  }.  rc
11190 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
111a0 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
111b0 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
111c0 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65  geSize, nReserve
111d0 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c 65  );.  pBt->usable
111e0 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  Size = pBt->page
111f0 53 69 7a 65 20 2d 20 28 75 31 36 29 6e 52 65 73  Size - (u16)nRes
11200 65 72 76 65 3b 0a 20 20 69 66 28 20 69 46 69 78  erve;.  if( iFix
11210 20 29 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   ) pBt->pageSize
11220 46 69 78 65 64 20 3d 20 31 3b 0a 20 20 73 71 6c  Fixed = 1;.  sql
11230 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
11240 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
11250 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
11260 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65  the currently de
11270 66 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 0a  fined page size.
11280 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
11290 72 65 65 47 65 74 50 61 67 65 53 69 7a 65 28 42  reeGetPageSize(B
112a0 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75  tree *p){.  retu
112b0 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53  rn p->pBt->pageS
112c0 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ize;.}../*.** Re
112d0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
112e0 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  of bytes of spac
112f0 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  e at the end of 
11300 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74 0a  every page that.
11310 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74 75 61 6c  ** are intentual
11320 6c 79 20 6c 65 66 74 20 75 6e 75 73 65 64 2e 20  ly left unused. 
11330 20 54 68 69 73 20 69 73 20 74 68 65 20 22 72 65   This is the "re
11340 73 65 72 76 65 64 22 20 73 70 61 63 65 20 74 68  served" space th
11350 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d  at is.** sometim
11360 65 73 20 75 73 65 64 20 62 79 20 65 78 74 65 6e  es used by exten
11370 73 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  sions..*/.int sq
11380 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73  lite3BtreeGetRes
11390 65 72 76 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  erve(Btree *p){.
113a0 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74    int n;.  sqlit
113b0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
113c0 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70  .  n = p->pBt->p
113d0 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74  ageSize - p->pBt
113e0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
113f0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
11400 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e  e(p);.  return n
11410 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
11420 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
11430 63 6f 75 6e 74 20 66 6f 72 20 61 20 64 61 74 61  count for a data
11440 62 61 73 65 20 69 66 20 6d 78 50 61 67 65 20 69  base if mxPage i
11450 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e  s positive..** N
11460 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  o changes are ma
11470 64 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  de if mxPage is 
11480 30 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a  0 or negative..*
11490 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  * Regardless of 
114a0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 78 50  the value of mxP
114b0 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  age, return the 
114c0 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
114d0 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
114e0 65 33 42 74 72 65 65 4d 61 78 50 61 67 65 43 6f  e3BtreeMaxPageCo
114f0 75 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  unt(Btree *p, in
11500 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e 74  t mxPage){.  int
11510 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   n;.  sqlite3Btr
11520 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20  eeEnter(p);.  n 
11530 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61  = sqlite3PagerMa
11540 78 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42  xPageCount(p->pB
11550 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67  t->pPager, mxPag
11560 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  e);.  sqlite3Btr
11570 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
11580 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
11590 20 53 65 74 20 74 68 65 20 73 65 63 75 72 65 44   Set the secureD
115a0 65 6c 65 74 65 20 66 6c 61 67 20 69 66 20 6e 65  elete flag if ne
115b0 77 46 6c 61 67 20 69 73 20 30 20 6f 72 20 31 2e  wFlag is 0 or 1.
115c0 20 20 49 66 20 6e 65 77 46 6c 61 67 20 69 73 20    If newFlag is 
115d0 2d 31 2c 0a 2a 2a 20 74 68 65 6e 20 6d 61 6b 65  -1,.** then make
115e0 20 6e 6f 20 63 68 61 6e 67 65 73 2e 20 20 41 6c   no changes.  Al
115f0 77 61 79 73 20 72 65 74 75 72 6e 20 74 68 65 20  ways return the 
11600 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 65 63  value of the sec
11610 75 72 65 44 65 6c 65 74 65 0a 2a 2a 20 73 65 74  ureDelete.** set
11620 74 69 6e 67 20 61 66 74 65 72 20 74 68 65 20 63  ting after the c
11630 68 61 6e 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  hange..*/.int sq
11640 6c 69 74 65 33 42 74 72 65 65 53 65 63 75 72 65  lite3BtreeSecure
11650 44 65 6c 65 74 65 28 42 74 72 65 65 20 2a 70 2c  Delete(Btree *p,
11660 20 69 6e 74 20 6e 65 77 46 6c 61 67 29 7b 0a 20   int newFlag){. 
11670 20 69 6e 74 20 62 3b 0a 20 20 69 66 28 20 70 3d   int b;.  if( p=
11680 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
11690 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
116a0 65 72 28 70 29 3b 0a 20 20 69 66 28 20 6e 65 77  er(p);.  if( new
116b0 46 6c 61 67 3e 3d 30 20 29 7b 0a 20 20 20 20 70  Flag>=0 ){.    p
116c0 2d 3e 70 42 74 2d 3e 73 65 63 75 72 65 44 65 6c  ->pBt->secureDel
116d0 65 74 65 20 3d 20 28 6e 65 77 46 6c 61 67 21 3d  ete = (newFlag!=
116e0 30 29 20 3f 20 31 20 3a 20 30 3b 0a 20 20 7d 20  0) ? 1 : 0;.  } 
116f0 0a 20 20 62 20 3d 20 70 2d 3e 70 42 74 2d 3e 73  .  b = p->pBt->s
11700 65 63 75 72 65 44 65 6c 65 74 65 3b 0a 20 20 73  ecureDelete;.  s
11710 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
11720 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 3b  (p);.  return b;
11730 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
11740 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
11750 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29  T_PAGER_PRAGMAS)
11760 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
11770 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29  ITE_OMIT_VACUUM)
11780 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67   */../*.** Chang
11790 65 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75  e the 'auto-vacu
117a0 75 6d 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20  um' property of 
117b0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66  the database. If
117c0 20 74 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d   the 'autoVacuum
117d0 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  '.** parameter i
117e0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
117f0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64   auto-vacuum mod
11800 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66  e is enabled. If
11810 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20   zero, it.** is 
11820 64 69 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65  disabled. The de
11830 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20  fault value for 
11840 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  the auto-vacuum 
11850 70 72 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20  property is .** 
11860 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
11870 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  e SQLITE_DEFAULT
11880 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72  _AUTOVACUUM macr
11890 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  o..*/.int sqlite
118a0 33 42 74 72 65 65 53 65 74 41 75 74 6f 56 61 63  3BtreeSetAutoVac
118b0 75 75 6d 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  uum(Btree *p, in
118c0 74 20 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23  t autoVacuum){.#
118d0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
118e0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72  T_AUTOVACUUM.  r
118f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
11900 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42  DONLY;.#else.  B
11910 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
11920 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20  ->pBt;.  int rc 
11930 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
11940 38 20 61 76 20 3d 20 28 75 38 29 61 75 74 6f 56  8 av = (u8)autoV
11950 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65  acuum;..  sqlite
11960 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
11970 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53    if( pBt->pageS
11980 69 7a 65 46 69 78 65 64 20 26 26 20 28 61 76 20  izeFixed && (av 
11990 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f  ?1:0)!=pBt->auto
119a0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63  Vacuum ){.    rc
119b0 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
119c0 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LY;.  }else{.   
119d0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
119e0 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20   = av ?1:0;.    
119f0 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
11a00 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20  = av==2 ?1:0;.  
11a10 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
11a20 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
11a30 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a  rn rc;.#endif.}.
11a40 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
11a50 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 27  e value of the '
11a60 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f  auto-vacuum' pro
11a70 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f 2d 76  perty. If auto-v
11a80 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61  acuum is .** ena
11a90 62 6c 65 64 20 31 20 69 73 20 72 65 74 75 72 6e  bled 1 is return
11aa0 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e  ed. Otherwise 0.
11ab0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
11ac0 74 72 65 65 47 65 74 41 75 74 6f 56 61 63 75 75  treeGetAutoVacuu
11ad0 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23 69 66  m(Btree *p){.#if
11ae0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11af0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74  AUTOVACUUM.  ret
11b00 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f 56 41  urn BTREE_AUTOVA
11b10 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65  CUUM_NONE;.#else
11b20 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
11b30 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
11b40 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20 20 20  );.  rc = (.    
11b50 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61  (!p->pBt->autoVa
11b60 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f  cuum)?BTREE_AUTO
11b70 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20  VACUUM_NONE:.   
11b80 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56   (!p->pBt->incrV
11b90 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54  acuum)?BTREE_AUT
11ba0 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20  OVACUUM_FULL:.  
11bb0 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55    BTREE_AUTOVACU
11bc0 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73  UM_INCR.  );.  s
11bd0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
11be0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
11bf0 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a  ;.#endif.}.../*.
11c00 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72 65 6e  ** Get a referen
11c10 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f 66 20  ce to pPage1 of 
11c20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
11c30 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a  e.  This will.**
11c40 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20 61 20   also acquire a 
11c50 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74  readlock on that
11c60 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c   file..**.** SQL
11c70 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
11c80 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ed on success.  
11c90 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e  If the file is n
11ca0 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72  ot a.** well-for
11cb0 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  med database fil
11cc0 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 43  e, then SQLITE_C
11cd0 4f 52 52 55 50 54 20 69 73 20 72 65 74 75 72 6e  ORRUPT is return
11ce0 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55  ed..** SQLITE_BU
11cf0 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  SY is returned i
11d00 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
11d10 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54  s locked.  SQLIT
11d20 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65  E_NOMEM.** is re
11d30 74 75 72 6e 65 64 20 69 66 20 77 65 20 72 75 6e  turned if we run
11d40 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20   out of memory. 
11d50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .*/.static int l
11d60 6f 63 6b 42 74 72 65 65 28 42 74 53 68 61 72 65  ockBtree(BtShare
11d70 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72  d *pBt){.  int r
11d80 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
11d90 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66  /* Result code f
11da0 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73  rom subfunctions
11db0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
11dc0 50 61 67 65 31 3b 20 20 20 20 20 2f 2a 20 50 61  Page1;     /* Pa
11dd0 67 65 20 31 20 6f 66 20 74 68 65 20 64 61 74 61  ge 1 of the data
11de0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
11df0 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  nt nPage;       
11e00 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
11e10 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
11e20 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
11e30 6e 50 61 67 65 46 69 6c 65 20 3d 20 30 3b 20 20  nPageFile = 0;  
11e40 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
11e50 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
11e60 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ase file */.  in
11e70 74 20 6e 50 61 67 65 48 65 61 64 65 72 3b 20 20  t nPageHeader;  
11e80 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
11e90 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
11ea0 61 62 61 73 65 20 61 63 63 6f 72 64 69 6e 67 20  abase according 
11eb0 74 6f 20 68 64 72 20 2a 2f 0a 0a 20 20 61 73 73  to hdr */..  ass
11ec0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
11ed0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
11ee0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
11ef0 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
11f00 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
11f10 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b  3PagerSharedLock
11f20 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
11f30 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11f40 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
11f50 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
11f60 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61  age(pBt, 1, &pPa
11f70 67 65 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ge1, 0);.  if( r
11f80 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
11f90 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20  eturn rc;..  /* 
11fa0 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67  Do some checking
11fb0 20 74 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20   to help insure 
11fc0 74 68 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e  the file we open
11fd0 65 64 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a  ed really is.  *
11fe0 2a 20 61 20 76 61 6c 69 64 20 64 61 74 61 62 61  * a valid databa
11ff0 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20  se file. .  */. 
12000 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 48 65   nPage = nPageHe
12010 61 64 65 72 20 3d 20 67 65 74 34 62 79 74 65 28  ader = get4byte(
12020 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e  28+(u8*)pPage1->
12030 61 44 61 74 61 29 3b 0a 20 20 69 66 28 20 28 72  aData);.  if( (r
12040 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
12050 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
12060 50 61 67 65 72 2c 20 26 6e 50 61 67 65 46 69 6c  Pager, &nPageFil
12070 65 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  e))!=SQLITE_OK )
12080 7b 3b 0a 20 20 20 20 67 6f 74 6f 20 70 61 67 65  {;.    goto page
12090 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
120a0 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d   }.  if( nPage==
120b0 30 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d  0 ){.    nPage =
120c0 20 6e 50 61 67 65 46 69 6c 65 3b 0a 20 20 7d 0a   nPageFile;.  }.
120d0 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b    if( nPage>0 ){
120e0 0a 20 20 20 20 69 6e 74 20 70 61 67 65 53 69 7a  .    int pageSiz
120f0 65 3b 0a 20 20 20 20 69 6e 74 20 75 73 61 62 6c  e;.    int usabl
12100 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70  eSize;.    u8 *p
12110 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e 61  age1 = pPage1->a
12120 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 53  Data;.    rc = S
12130 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20  QLITE_NOTADB;.  
12140 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67    if( memcmp(pag
12150 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72  e1, zMagicHeader
12160 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20  , 16)!=0 ){.    
12170 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
12180 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
12190 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
121a0 4d 49 54 5f 57 41 4c 0a 20 20 20 20 69 66 28 20  MIT_WAL.    if( 
121b0 70 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20  page1[18]>1 ){. 
121c0 20 20 20 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e       pBt->readOn
121d0 6c 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ly = 1;.    }.  
121e0 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e    if( page1[19]>
121f0 31 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  1 ){.      goto 
12200 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
12210 64 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20  d;.    }.#else. 
12220 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d     if( page1[18]
12230 3e 32 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  >2 ){.      pBt-
12240 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20  >readOnly = 1;. 
12250 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67     }.    if( pag
12260 65 31 5b 31 39 5d 3e 32 20 29 7b 0a 20 20 20 20  e1[19]>2 ){.    
12270 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
12280 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
12290 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 77  .    /* If the w
122a0 72 69 74 65 20 76 65 72 73 69 6f 6e 20 69 73 20  rite version is 
122b0 73 65 74 20 74 6f 20 32 2c 20 74 68 69 73 20 64  set to 2, this d
122c0 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20 62  atabase should b
122d0 65 20 61 63 63 65 73 73 65 64 0a 20 20 20 20 2a  e accessed.    *
122e0 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 49  * in WAL mode. I
122f0 66 20 74 68 65 20 6c 6f 67 20 69 73 20 6e 6f 74  f the log is not
12300 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 6f   already open, o
12310 70 65 6e 20 69 74 20 6e 6f 77 2e 20 54 68 65 6e  pen it now. Then
12320 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20   .    ** return 
12330 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65  SQLITE_OK and re
12340 74 75 72 6e 20 77 69 74 68 6f 75 74 20 70 6f 70  turn without pop
12350 75 6c 61 74 69 6e 67 20 42 74 53 68 61 72 65 64  ulating BtShared
12360 2e 70 50 61 67 65 31 2e 0a 20 20 20 20 2a 2a 20  .pPage1..    ** 
12370 54 68 65 20 63 61 6c 6c 65 72 20 64 65 74 65 63  The caller detec
12380 74 73 20 74 68 69 73 20 61 6e 64 20 63 61 6c 6c  ts this and call
12390 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
123a0 61 67 61 69 6e 2e 20 54 68 69 73 20 69 73 0a 20  again. This is. 
123b0 20 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 61     ** required a
123c0 73 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6f 66  s the version of
123d0 20 70 61 67 65 20 31 20 63 75 72 72 65 6e 74 6c   page 1 currentl
123e0 79 20 69 6e 20 74 68 65 20 70 61 67 65 31 20 62  y in the page1 b
123f0 75 66 66 65 72 0a 20 20 20 20 2a 2a 20 6d 61 79  uffer.    ** may
12400 20 6e 6f 74 20 62 65 20 74 68 65 20 6c 61 74 65   not be the late
12410 73 74 20 76 65 72 73 69 6f 6e 20 2d 20 74 68 65  st version - the
12420 72 65 20 6d 61 79 20 62 65 20 61 20 6e 65 77 65  re may be a newe
12430 72 20 6f 6e 65 20 69 6e 20 74 68 65 20 6c 6f 67  r one in the log
12440 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20  .    ** file..  
12450 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 61 67    */.    if( pag
12460 65 31 5b 31 39 5d 3d 3d 32 20 26 26 20 70 42 74  e1[19]==2 && pBt
12470 2d 3e 64 6f 4e 6f 74 55 73 65 57 41 4c 3d 3d 30  ->doNotUseWAL==0
12480 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73   ){.      int is
12490 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  Open = 0;.      
124a0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
124b0 72 4f 70 65 6e 57 61 6c 28 70 42 74 2d 3e 70 50  rOpenWal(pBt->pP
124c0 61 67 65 72 2c 20 26 69 73 4f 70 65 6e 29 3b 0a  ager, &isOpen);.
124d0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
124e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
124f0 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
12500 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  it_failed;.     
12510 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4f 70 65   }else if( isOpe
12520 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
12530 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
12540 65 31 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  e1);.        ret
12550 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
12560 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
12570 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b  = SQLITE_NOTADB;
12580 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
12590 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75     /* The maximu
125a0 6d 20 65 6d 62 65 64 64 65 64 20 66 72 61 63 74  m embedded fract
125b0 69 6f 6e 20 6d 75 73 74 20 62 65 20 65 78 61 63  ion must be exac
125c0 74 6c 79 20 32 35 25 2e 20 20 41 6e 64 20 74 68  tly 25%.  And th
125d0 65 20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a  e minimum.    **
125e0 20 65 6d 62 65 64 64 65 64 20 66 72 61 63 74 69   embedded fracti
125f0 6f 6e 20 6d 75 73 74 20 62 65 20 31 32 2e 35 25  on must be 12.5%
12600 20 66 6f 72 20 62 6f 74 68 20 6c 65 61 66 2d 64   for both leaf-d
12610 61 74 61 20 61 6e 64 20 6e 6f 6e 2d 6c 65 61 66  ata and non-leaf
12620 2d 64 61 74 61 2e 0a 20 20 20 20 2a 2a 20 54 68  -data..    ** Th
12630 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67  e original desig
12640 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65 73 65 20  n allowed these 
12650 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72 79 2c  amounts to vary,
12660 20 62 75 74 20 61 73 20 6f 66 0a 20 20 20 20 2a   but as of.    *
12670 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c  * version 3.6.0,
12680 20 77 65 20 72 65 71 75 69 72 65 20 74 68 65 6d   we require them
12690 20 74 6f 20 62 65 20 66 69 78 65 64 2e 0a 20 20   to be fixed..  
126a0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d    */.    if( mem
126b0 63 6d 70 28 26 70 61 67 65 31 5b 32 31 5d 2c 20  cmp(&page1[21], 
126c0 22 5c 31 30 30 5c 30 34 30 5c 30 34 30 22 2c 33  "\100\040\040",3
126d0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  )!=0 ){.      go
126e0 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
126f0 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
12700 70 61 67 65 53 69 7a 65 20 3d 20 67 65 74 32 62  pageSize = get2b
12710 79 74 65 28 26 70 61 67 65 31 5b 31 36 5d 29 3b  yte(&page1[16]);
12720 0a 20 20 20 20 69 66 28 20 28 28 70 61 67 65 53  .    if( ((pageS
12730 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29  ize-1)&pageSize)
12740 21 3d 30 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c  !=0 || pageSize<
12750 35 31 32 20 7c 7c 0a 20 20 20 20 20 20 20 20 28  512 ||.        (
12760 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
12770 53 49 5a 45 3c 33 32 37 36 38 20 26 26 20 70 61  SIZE<32768 && pa
12780 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  geSize>SQLITE_MA
12790 58 5f 50 41 47 45 5f 53 49 5a 45 29 0a 20 20 20  X_PAGE_SIZE).   
127a0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
127b0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
127c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
127d0 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20  rt( (pageSize & 
127e0 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 75 73 61  7)==0 );.    usa
127f0 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  bleSize = pageSi
12800 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a  ze - page1[20];.
12810 20 20 20 20 69 66 28 20 70 61 67 65 53 69 7a 65      if( pageSize
12820 21 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  !=pBt->pageSize 
12830 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66 74 65  ){.      /* Afte
12840 72 20 72 65 61 64 69 6e 67 20 74 68 65 20 66 69  r reading the fi
12850 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
12860 64 61 74 61 62 61 73 65 20 61 73 73 75 6d 69 6e  database assumin
12870 67 20 61 20 70 61 67 65 20 73 69 7a 65 0a 20 20  g a page size.  
12880 20 20 20 20 2a 2a 20 6f 66 20 42 74 53 68 61 72      ** of BtShar
12890 65 64 2e 70 61 67 65 53 69 7a 65 2c 20 77 65 20  ed.pageSize, we 
128a0 68 61 76 65 20 64 69 73 63 6f 76 65 72 65 64 20  have discovered 
128b0 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69  that the page-si
128c0 7a 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61  ze is.      ** a
128d0 63 74 75 61 6c 6c 79 20 70 61 67 65 53 69 7a 65  ctually pageSize
128e0 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  . Unlock the dat
128f0 61 62 61 73 65 2c 20 6c 65 61 76 65 20 70 42 74  abase, leave pBt
12900 2d 3e 70 50 61 67 65 31 20 61 74 0a 20 20 20 20  ->pPage1 at.    
12910 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65    ** zero and re
12920 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
12930 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  The caller will 
12940 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69  call this functi
12950 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69  on.      ** agai
12960 6e 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65  n with the corre
12970 63 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20  ct page-size..  
12980 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c      */.      rel
12990 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29  easePage(pPage1)
129a0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 75 73 61  ;.      pBt->usa
129b0 62 6c 65 53 69 7a 65 20 3d 20 28 75 31 36 29 75  bleSize = (u16)u
129c0 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20  sableSize;.     
129d0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
129e0 20 28 75 31 36 29 70 61 67 65 53 69 7a 65 3b 0a   (u16)pageSize;.
129f0 20 20 20 20 20 20 66 72 65 65 54 65 6d 70 53 70        freeTempSp
12a00 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ace(pBt);.      
12a10 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
12a20 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74  rSetPagesize(pBt
12a30 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e  ->pPager, &pBt->
12a40 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20  pageSize,.      
12a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a60 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67               pag
12a70 65 53 69 7a 65 2d 75 73 61 62 6c 65 53 69 7a 65  eSize-usableSize
12a80 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
12a90 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
12aa0 28 20 6e 50 61 67 65 48 65 61 64 65 72 3e 6e 50  ( nPageHeader>nP
12ab0 61 67 65 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  ageFile ){.     
12ac0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
12ad0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
12ae0 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
12af0 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
12b00 20 20 20 69 66 28 20 75 73 61 62 6c 65 53 69 7a     if( usableSiz
12b10 65 3c 34 38 30 20 29 7b 0a 20 20 20 20 20 20 67  e<480 ){.      g
12b20 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
12b30 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
12b40 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
12b50 20 28 75 31 36 29 70 61 67 65 53 69 7a 65 3b 0a   (u16)pageSize;.
12b60 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53      pBt->usableS
12b70 69 7a 65 20 3d 20 28 75 31 36 29 75 73 61 62 6c  ize = (u16)usabl
12b80 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53  eSize;.#ifndef S
12b90 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
12ba0 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61  ACUUM.    pBt->a
12bb0 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74  utoVacuum = (get
12bc0 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20  4byte(&page1[36 
12bd0 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20  + 4*4])?1:0);.  
12be0 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
12bf0 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70  m = (get4byte(&p
12c00 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f  age1[36 + 7*4])?
12c10 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  1:0);.#endif.  }
12c20 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20  ..  /* maxLocal 
12c30 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  is the maximum a
12c40 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64  mount of payload
12c50 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c   to store locall
12c60 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c  y for.  ** a cel
12c70 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74  l.  Make sure it
12c80 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68   is small enough
12c90 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73   so that at leas
12ca0 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a  t minFanout.  **
12cb0 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20   cells can will 
12cc0 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e  fit on one page.
12cd0 20 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 30    We assume a 10
12ce0 2d 62 79 74 65 20 70 61 67 65 20 68 65 61 64 65  -byte page heade
12cf0 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20  r..  ** Besides 
12d00 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65  the payload, the
12d10 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65   cell must store
12d20 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74  :.  **     2-byt
12d30 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
12d40 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34   cell.  **     4
12d50 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e  -byte child poin
12d60 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62  ter.  **     9-b
12d70 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20  yte nKey value. 
12d80 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e   **     4-byte n
12d90 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20  Data value.  ** 
12da0 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66      4-byte overf
12db0 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72  low page pointer
12dc0 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20  .  ** So a cell 
12dd0 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d  consists of a 2-
12de0 62 79 74 65 20 70 6f 69 6e 65 72 2c 20 61 20 68  byte poiner, a h
12df0 65 61 64 65 72 20 77 68 69 63 68 20 69 73 20 61  eader which is a
12e00 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20 31  s much as.  ** 1
12e10 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20  7 bytes long, 0 
12e20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70 61  to N bytes of pa
12e30 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70  yload, and an op
12e40 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f 76  tional 4 byte ov
12e50 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65  erflow.  ** page
12e60 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20   pointer..  */. 
12e70 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d   pBt->maxLocal =
12e80 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a   (pBt->usableSiz
12e90 65 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d 20 32  e-12)*64/255 - 2
12ea0 33 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63  3;.  pBt->minLoc
12eb0 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c  al = (pBt->usabl
12ec0 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35  eSize-12)*32/255
12ed0 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d 61   - 23;.  pBt->ma
12ee0 78 4c 65 61 66 20 3d 20 70 42 74 2d 3e 75 73 61  xLeaf = pBt->usa
12ef0 62 6c 65 53 69 7a 65 20 2d 20 33 35 3b 0a 20 20  bleSize - 35;.  
12f00 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28  pBt->minLeaf = (
12f10 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
12f20 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 3b  12)*32/255 - 23;
12f30 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
12f40 6d 61 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20  maxLeaf + 23 <= 
12f50 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74  MX_CELL_SIZE(pBt
12f60 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67  ) );.  pBt->pPag
12f70 65 31 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 70  e1 = pPage1;.  p
12f80 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67  Bt->nPage = nPag
12f90 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
12fa0 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e  TE_OK;..page1_in
12fb0 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c  it_failed:.  rel
12fc0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29  easePage(pPage1)
12fd0 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ;.  pBt->pPage1 
12fe0 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
12ff0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
13000 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74  ere are no outst
13010 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 20 61  anding cursors a
13020 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e  nd we are not in
13030 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f   the middle.** o
13040 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
13050 62 75 74 20 74 68 65 72 65 20 69 73 20 61 20 72  but there is a r
13060 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead lock on the 
13070 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a  database, then.*
13080 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75  * this routine u
13090 6e 72 65 66 73 20 74 68 65 20 66 69 72 73 74 20  nrefs the first 
130a0 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
130b0 62 61 73 65 20 66 69 6c 65 20 77 68 69 63 68 20  base file which 
130c0 0a 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66 65  .** has the effe
130d0 63 74 20 6f 66 20 72 65 6c 65 61 73 69 6e 67 20  ct of releasing 
130e0 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a  the read lock..*
130f0 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73  *.** If there is
13100 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
13110 6e 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73  n progress, this
13120 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
13130 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
13140 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  oid unlockBtreeI
13150 66 55 6e 75 73 65 64 28 42 74 53 68 61 72 65 64  fUnused(BtShared
13160 20 2a 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74   *pBt){.  assert
13170 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
13180 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
13190 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
131a0 74 2d 3e 70 43 75 72 73 6f 72 3d 3d 30 20 7c 7c  t->pCursor==0 ||
131b0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
131c0 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ion>TRANS_NONE )
131d0 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54  ;.  if( pBt->inT
131e0 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
131f0 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70  S_NONE && pBt->p
13200 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20 20  Page1!=0 ){.    
13210 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61  assert( pBt->pPa
13220 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20  ge1->aData );.  
13230 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
13240 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
13250 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20 29  Bt->pPager)==1 )
13260 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
13270 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
13280 20 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50   );.    releaseP
13290 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 31 29  age(pBt->pPage1)
132a0 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65  ;.    pBt->pPage
132b0 31 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  1 = 0;.  }.}../*
132c0 0a 2a 2a 20 49 66 20 70 42 74 20 70 6f 69 6e 74  .** If pBt point
132d0 73 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 66 69  s to an empty fi
132e0 6c 65 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20  le then convert 
132f0 74 68 61 74 20 65 6d 70 74 79 20 66 69 6c 65 0a  that empty file.
13300 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77 20 65 6d  ** into a new em
13310 70 74 79 20 64 61 74 61 62 61 73 65 20 62 79 20  pty database by 
13320 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
13330 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 0a 2a   first page of.*
13340 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  * the database..
13350 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65  */.static int ne
13360 77 44 61 74 61 62 61 73 65 28 42 74 53 68 61 72  wDatabase(BtShar
13370 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50  ed *pBt){.  MemP
13380 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69  age *pP1;.  unsi
13390 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b  gned char *data;
133a0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
133b0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
133c0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
133d0 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42  tex) );.  if( pB
133e0 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20  t->nPage>0 ){.  
133f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13400 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20  OK;.  }.  pP1 = 
13410 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61  pBt->pPage1;.  a
13420 73 73 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b  ssert( pP1!=0 );
13430 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61  .  data = pP1->a
13440 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Data;.  rc = sql
13450 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
13460 50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  P1->pDbPage);.  
13470 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
13480 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74  rc;.  memcpy(dat
13490 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c  a, zMagicHeader,
134a0 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65   sizeof(zMagicHe
134b0 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74  ader));.  assert
134c0 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48  ( sizeof(zMagicH
134d0 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20  eader)==16 );.  
134e0 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 31  put2byte(&data[1
134f0 36 5d 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  6], pBt->pageSiz
13500 65 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d  e);.  data[18] =
13510 20 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d   1;.  data[19] =
13520 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   1;.  assert( pB
13530 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70  t->usableSize<=p
13540 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 26 20  Bt->pageSize && 
13550 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b  pBt->usableSize+
13560 32 35 35 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69  255>=pBt->pageSi
13570 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20  ze);.  data[20] 
13580 3d 20 28 75 38 29 28 70 42 74 2d 3e 70 61 67 65  = (u8)(pBt->page
13590 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62  Size - pBt->usab
135a0 6c 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b  leSize);.  data[
135b0 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74 61  21] = 64;.  data
135c0 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74  [22] = 32;.  dat
135d0 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65  a[23] = 32;.  me
135e0 6d 73 65 74 28 26 64 61 74 61 5b 32 34 5d 2c 20  mset(&data[24], 
135f0 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65  0, 100-24);.  ze
13600 72 6f 50 61 67 65 28 70 50 31 2c 20 50 54 46 5f  roPage(pP1, PTF_
13610 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c  INTKEY|PTF_LEAF|
13620 50 54 46 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a  PTF_LEAFDATA );.
13630 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46    pBt->pageSizeF
13640 69 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65  ixed = 1;.#ifnde
13650 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
13660 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72  TOVACUUM.  asser
13670 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  t( pBt->autoVacu
13680 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75  um==1 || pBt->au
13690 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20  toVacuum==0 );. 
136a0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
136b0 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70  crVacuum==1 || p
136c0 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d  Bt->incrVacuum==
136d0 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  0 );.  put4byte(
136e0 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c  &data[36 + 4*4],
136f0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
13700 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64  );.  put4byte(&d
13710 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70  ata[36 + 7*4], p
13720 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b  Bt->incrVacuum);
13730 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e 6e  .#endif.  pBt->n
13740 50 61 67 65 20 3d 20 31 3b 0a 20 20 64 61 74 61  Page = 1;.  data
13750 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75  [31] = 1;.  retu
13760 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
13770 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
13780 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 74 72  o start a new tr
13790 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72 69  ansaction. A wri
137a0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  te-transaction.*
137b0 2a 20 69 73 20 73 74 61 72 74 65 64 20 69 66 20  * is started if 
137c0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
137d0 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20  ent is nonzero, 
137e0 6f 74 68 65 72 77 69 73 65 20 61 20 72 65 61 64  otherwise a read
137f0 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  -.** transaction
13800 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  .  If the second
13810 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20 6f   argument is 2 o
13820 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c 75  r more and exclu
13830 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  sive.** transact
13840 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20  ion is started, 
13850 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20  meaning that no 
13860 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
13870 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61   allowed.** to a
13880 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61  ccess the databa
13890 73 65 2e 20 20 41 20 70 72 65 65 78 69 73 74 69  se.  A preexisti
138a0 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  ng transaction m
138b0 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67  ay not be.** upg
138c0 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73 69  raded to exclusi
138d0 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68  ve by calling th
138e0 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65 63  is routine a sec
138f0 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a  ond time - the.*
13900 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20 66 6c  * exclusivity fl
13910 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f  ag only works fo
13920 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  r a new transact
13930 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69  ion..**.** A wri
13940 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te-transaction m
13950 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20 62  ust be started b
13960 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
13970 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73   any .** changes
13980 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
13990 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66  .  None of the f
139a0 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
139b0 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20  s .** will work 
139c0 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63  unless a transac
139d0 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20  tion is started 
139e0 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  first:.**.**    
139f0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72    sqlite3BtreeCr
13a00 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20  eateTable().**  
13a10 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
13a20 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a  CreateIndex().**
13a30 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
13a40 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a  eeClearTable().*
13a50 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
13a60 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a  reeDropTable().*
13a70 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
13a80 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20  reeInsert().**  
13a90 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
13aa0 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20 20  Delete().**     
13ab0 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64   sqlite3BtreeUpd
13ac0 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20  ateMeta().**.** 
13ad0 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61 74  If an initial at
13ae0 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65  tempt to acquire
13af0 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20   the lock fails 
13b00 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20  because of lock 
13b10 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e  contention.** an
13b20 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  d the database w
13b30 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e  as previously un
13b40 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76  locked, then inv
13b50 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
13b60 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72 65  dler.** if there
13b70 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69 66   is one.  But if
13b80 20 74 68 65 72 65 20 77 61 73 20 70 72 65 76 69   there was previ
13b90 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63  ously a read-loc
13ba0 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76  k, do not.** inv
13bb0 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
13bc0 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75  dler - just retu
13bd0 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  rn SQLITE_BUSY. 
13be0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
13bf0 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68 65  .** returned whe
13c00 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  n there is alrea
13c10 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69  dy a read-lock i
13c20 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64  n order to avoid
13c30 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a   a deadlock..**.
13c40 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72 65  ** Suppose there
13c50 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73 73   are two process
13c60 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20 68  es A and B.  A h
13c70 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61  as a read lock a
13c80 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72 65  nd B has.** a re
13c90 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20  served lock.  B 
13ca0 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65  tries to promote
13cb0 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 75   to exclusive bu
13cc0 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65 63  t is blocked bec
13cd0 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72  ause.** of A's r
13ce0 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69  ead lock.  A tri
13cf0 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f  es to promote to
13d00 20 72 65 73 65 72 76 65 64 20 62 75 74 20 69 73   reserved but is
13d10 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a   blocked by B..*
13d20 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74 68  * One or the oth
13d30 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72  er of the two pr
13d40 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67 69 76  ocesses must giv
13d50 65 20 77 61 79 20 6f 72 20 74 68 65 72 65 20 63  e way or there c
13d60 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67  an be.** no prog
13d70 72 65 73 73 2e 20 20 42 79 20 72 65 74 75 72 6e  ress.  By return
13d80 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ing SQLITE_BUSY 
13d90 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67  and not invoking
13da0 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
13db0 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72  ck.** when A alr
13dc0 65 61 64 79 20 68 61 73 20 61 20 72 65 61 64 20  eady has a read 
13dd0 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61  lock, we encoura
13de0 67 65 20 41 20 74 6f 20 67 69 76 65 20 75 70 20  ge A to give up 
13df0 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f  and let B.** pro
13e00 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ceed..*/.int sql
13e10 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72  ite3BtreeBeginTr
13e20 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ans(Btree *p, in
13e30 74 20 77 72 66 6c 61 67 29 7b 0a 20 20 73 71 6c  t wrflag){.  sql
13e40 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30  ite3 *pBlock = 0
13e50 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
13e60 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e  t = p->pBt;.  in
13e70 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
13e80 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
13e90 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72  eEnter(p);.  btr
13ea0 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
13eb0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72  .  /* If the btr
13ec0 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ee is already in
13ed0 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
13ee0 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a  tion, or it.  **
13ef0 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61   is already in a
13f00 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
13f10 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61  n and a read-tra
13f20 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  nsaction.  ** is
13f30 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 69 73   requested, this
13f40 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a   is a no-op..  *
13f50 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  /.  if( p->inTra
13f60 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
13f70 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  || (p->inTrans==
13f80 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77  TRANS_READ && !w
13f90 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f  rflag) ){.    go
13fa0 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a  to trans_begun;.
13fb0 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20    }..  /* Write 
13fc0 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
13fd0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e   not possible on
13fe0 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74   a read-only dat
13ff0 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 70  abase */.  if( p
14000 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 26 26 20  Bt->readOnly && 
14010 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63  wrflag ){.    rc
14020 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
14030 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61  LY;.    goto tra
14040 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23  ns_begun;.  }..#
14050 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14060 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
14070 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20    /* If another 
14080 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
14090 68 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  has already open
140a0 65 64 20 61 20 77 72 69 74 65 20 74 72 61 6e 73  ed a write trans
140b0 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20  action .  ** on 
140c0 74 68 69 73 20 73 68 61 72 65 64 2d 62 74 72 65  this shared-btre
140d0 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  e structure and 
140e0 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74  a second write t
140f0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20  ransaction is.  
14100 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20 72 65  ** requested, re
14110 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  turn SQLITE_LOCK
14120 45 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  ED..  */.  if( (
14130 77 72 66 6c 61 67 20 26 26 20 70 42 74 2d 3e 69  wrflag && pBt->i
14140 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
14150 41 4e 53 5f 57 52 49 54 45 29 20 7c 7c 20 70 42  ANS_WRITE) || pB
14160 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 29 7b 0a  t->isPending ){.
14170 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 42 74      pBlock = pBt
14180 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 3b 0a 20  ->pWriter->db;. 
14190 20 7d 65 6c 73 65 20 69 66 28 20 77 72 66 6c 61   }else if( wrfla
141a0 67 3e 31 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63  g>1 ){.    BtLoc
141b0 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 66 6f  k *pIter;.    fo
141c0 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f  r(pIter=pBt->pLo
141d0 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72  ck; pIter; pIter
141e0 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a  =pIter->pNext){.
141f0 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
14200 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a 20 20  >pBtree!=p ){.  
14210 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70        pBlock = p
14220 49 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  Iter->pBtree->db
14230 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
14240 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14250 20 7d 0a 20 20 69 66 28 20 70 42 6c 6f 63 6b 20   }.  if( pBlock 
14260 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  ){.    sqlite3Co
14270 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28  nnectionBlocked(
14280 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a  p->db, pBlock);.
14290 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
142a0 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43  LOCKED_SHAREDCAC
142b0 48 45 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61  HE;.    goto tra
142c0 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 23 65  ns_begun;.  }.#e
142d0 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 79 20 72  ndif..  /* Any r
142e0 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 72 65 61 64  ead-only or read
142f0 2d 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69  -write transacti
14300 6f 6e 20 69 6d 70 6c 69 65 73 20 61 20 72 65 61  on implies a rea
14310 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20  d-lock on .  ** 
14320 70 61 67 65 20 31 2e 20 53 6f 20 69 66 20 73 6f  page 1. So if so
14330 6d 65 20 6f 74 68 65 72 20 73 68 61 72 65 64 2d  me other shared-
14340 63 61 63 68 65 20 63 6c 69 65 6e 74 20 61 6c 72  cache client alr
14350 65 61 64 79 20 68 61 73 20 61 20 77 72 69 74 65  eady has a write
14360 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70  -lock .  ** on p
14370 61 67 65 20 31 2c 20 74 68 65 20 74 72 61 6e 73  age 1, the trans
14380 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65  action cannot be
14390 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 72 63   opened. */.  rc
143a0 20 3d 20 71 75 65 72 79 53 68 61 72 65 64 43 61   = querySharedCa
143b0 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20  cheTableLock(p, 
143c0 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41  MASTER_ROOT, REA
143d0 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 53  D_LOCK);.  if( S
143e0 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 20 67  QLITE_OK!=rc ) g
143f0 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
14400 0a 0a 20 20 70 42 74 2d 3e 69 6e 69 74 69 61 6c  ..  pBt->initial
14410 6c 79 45 6d 70 74 79 20 3d 20 70 42 74 2d 3e 6e  lyEmpty = pBt->n
14420 50 61 67 65 3d 3d 30 3b 0a 20 20 64 6f 20 7b 0a  Page==0;.  do {.
14430 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63 6b      /* Call lock
14440 42 74 72 65 65 28 29 20 75 6e 74 69 6c 20 65 69  Btree() until ei
14450 74 68 65 72 20 70 42 74 2d 3e 70 50 61 67 65 31  ther pBt->pPage1
14460 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 6f 72   is populated or
14470 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74 72 65  .    ** lockBtre
14480 65 28 29 20 72 65 74 75 72 6e 73 20 73 6f 6d 65  e() returns some
14490 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  thing other than
144a0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63 6b   SQLITE_OK. lock
144b0 42 74 72 65 65 28 29 0a 20 20 20 20 2a 2a 20 6d  Btree().    ** m
144c0 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ay return SQLITE
144d0 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 20 70 42  _OK but leave pB
144e0 74 2d 3e 70 50 61 67 65 31 20 73 65 74 20 74 6f  t->pPage1 set to
144f0 20 30 20 69 66 20 61 66 74 65 72 0a 20 20 20 20   0 if after.    
14500 2a 2a 20 72 65 61 64 69 6e 67 20 70 61 67 65 20  ** reading page 
14510 31 20 69 74 20 64 69 73 63 6f 76 65 72 73 20 74  1 it discovers t
14520 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a  hat the page-siz
14530 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
14540 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 69  e .    ** file i
14550 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67 65 53  s not pBt->pageS
14560 69 7a 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ize. In this cas
14570 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 77 69  e lockBtree() wi
14580 6c 6c 20 75 70 64 61 74 65 0a 20 20 20 20 2a 2a  ll update.    **
14590 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 74   pBt->pageSize t
145a0 6f 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  o the page-size 
145b0 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64  of the file on d
145c0 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  isk..    */.    
145d0 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 50 61 67  while( pBt->pPag
145e0 65 31 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f  e1==0 && SQLITE_
145f0 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b 42 74  OK==(rc = lockBt
14600 72 65 65 28 70 42 74 29 29 20 29 3b 0a 0a 20 20  ree(pBt)) );..  
14610 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
14620 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b  _OK && wrflag ){
14630 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
14640 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
14650 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
14660 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20  READONLY;.      
14670 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
14680 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
14690 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65  Begin(pBt->pPage
146a0 72 2c 77 72 66 6c 61 67 3e 31 2c 73 71 6c 69 74  r,wrflag>1,sqlit
146b0 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 70  e3TempInMemory(p
146c0 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20  ->db));.        
146d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
146e0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
146f0 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28  c = newDatabase(
14700 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  pBt);.        }.
14710 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
14720 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
14730 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
14740 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
14750 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a  sed(pBt);.    }.
14760 20 20 7d 77 68 69 6c 65 28 20 28 72 63 26 30 78    }while( (rc&0x
14770 46 46 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59  FF)==SQLITE_BUSY
14780 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73   && pBt->inTrans
14790 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f  action==TRANS_NO
147a0 4e 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  NE &&.          
147b0 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48  btreeInvokeBusyH
147c0 61 6e 64 6c 65 72 28 70 42 74 29 20 29 3b 0a 0a  andler(pBt) );..
147d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
147e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
147f0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
14800 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70  _NONE ){.      p
14810 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
14820 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ++;.#ifndef SQLI
14830 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
14840 41 43 48 45 0a 20 20 20 20 20 20 69 66 28 20 70  ACHE.      if( p
14850 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 09 61  ->sharable ){..a
14860 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70  ssert( p->lock.p
14870 42 74 72 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c  Btree==p && p->l
14880 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b  ock.iTable==1 );
14890 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b  .        p->lock
148a0 2e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f  .eLock = READ_LO
148b0 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c  CK;.        p->l
148c0 6f 63 6b 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d  ock.pNext = pBt-
148d0 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20  >pLock;.        
148e0 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d  pBt->pLock = &p-
148f0 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23  >lock;.      }.#
14900 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
14910 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72  p->inTrans = (wr
14920 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45  flag?TRANS_WRITE
14930 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20  :TRANS_READ);.  
14940 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
14950 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74  >pBt->inTransact
14960 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ion ){.      pBt
14970 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
14980 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20  = p->inTrans;.  
14990 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
149a0 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
149b0 41 43 48 45 0a 20 20 20 20 69 66 28 20 77 72 66  ACHE.    if( wrf
149c0 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 61 73 73  lag ){.      ass
149d0 65 72 74 28 20 21 70 42 74 2d 3e 70 57 72 69 74  ert( !pBt->pWrit
149e0 65 72 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  er );.      pBt-
149f0 3e 70 57 72 69 74 65 72 20 3d 20 70 3b 0a 20 20  >pWriter = p;.  
14a00 20 20 20 20 70 42 74 2d 3e 69 73 45 78 63 6c 75      pBt->isExclu
14a10 73 69 76 65 20 3d 20 28 75 38 29 28 77 72 66 6c  sive = (u8)(wrfl
14a20 61 67 3e 31 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  ag>1);.    }.#en
14a30 64 69 66 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f  dif.  }...trans_
14a40 62 65 67 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d  begun:.  if( rc=
14a50 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72  =SQLITE_OK && wr
14a60 66 6c 61 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54  flag ){.    /* T
14a70 68 69 73 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73  his call makes s
14a80 75 72 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ure that the pag
14a90 65 72 20 68 61 73 20 74 68 65 20 63 6f 72 72 65  er has the corre
14aa0 63 74 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20  ct number of.   
14ab0 20 2a 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f 69   ** open savepoi
14ac0 6e 74 73 2e 20 49 66 20 74 68 65 20 73 65 63 6f  nts. If the seco
14ad0 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
14ae0 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 61  greater than 0 a
14af0 6e 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75  nd.    ** the su
14b00 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74  b-journal is not
14b10 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74   already open, t
14b20 68 65 6e 20 69 74 20 77 69 6c 6c 20 62 65 20 6f  hen it will be o
14b30 70 65 6e 65 64 20 68 65 72 65 2e 0a 20 20 20 20  pened here..    
14b40 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
14b50 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65  te3PagerOpenSave
14b60 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  point(pBt->pPage
14b70 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70  r, p->db->nSavep
14b80 6f 69 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74  oint);.  }..  bt
14b90 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
14ba0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
14bb0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
14bc0 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
14bd0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
14be0 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53  OVACUUM../*.** S
14bf0 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  et the pointer-m
14c00 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61  ap entries for a
14c10 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70  ll children of p
14c20 61 67 65 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c  age pPage. Also,
14c30 20 69 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e   if.** pPage con
14c40 74 61 69 6e 73 20 63 65 6c 6c 73 20 74 68 61 74  tains cells that
14c50 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c   point to overfl
14c60 6f 77 20 70 61 67 65 73 2c 20 73 65 74 20 74 68  ow pages, set th
14c70 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70  e pointer.** map
14c80 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65   entries for the
14c90 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
14ca0 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  as well..*/.stat
14cb0 69 63 20 69 6e 74 20 73 65 74 43 68 69 6c 64 50  ic int setChildP
14cc0 74 72 6d 61 70 73 28 4d 65 6d 50 61 67 65 20 2a  trmaps(MemPage *
14cd0 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b  pPage){.  int i;
14ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14d00 43 6f 75 6e 74 65 72 20 76 61 72 69 61 62 6c 65  Counter variable
14d10 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b   */.  int nCell;
14d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d30 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
14d40 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70  er of cells in p
14d50 61 67 65 20 70 50 61 67 65 20 2a 2f 0a 20 20 69  age pPage */.  i
14d60 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
14d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d80 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
14d90 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
14da0 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
14db0 3b 0a 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69  ;.  u8 isInitOri
14dc0 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  g = pPage->isIni
14dd0 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  t;.  Pgno pgno =
14de0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20   pPage->pgno;.. 
14df0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
14e00 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
14e10 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
14e20 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e  ;.  rc = btreeIn
14e30 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
14e40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
14e50 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73  OK ){.    goto s
14e60 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73  et_child_ptrmaps
14e70 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c  _out;.  }.  nCel
14e80 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
14e90 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
14ea0 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
14eb0 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e   u8 *pCell = fin
14ec0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b  dCell(pPage, i);
14ed0 0a 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f  ..    ptrmapPutO
14ee0 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  vflPtr(pPage, pC
14ef0 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20  ell, &rc);..    
14f00 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
14f10 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63   ){.      Pgno c
14f20 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62  hildPgno = get4b
14f30 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20  yte(pCell);.    
14f40 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
14f50 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d   childPgno, PTRM
14f60 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20  AP_BTREE, pgno, 
14f70 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  &rc);.    }.  }.
14f80 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
14f90 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  eaf ){.    Pgno 
14fa0 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34  childPgno = get4
14fb0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
14fc0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
14fd0 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 74 72  set+8]);.    ptr
14fe0 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c  mapPut(pBt, chil
14ff0 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54  dPgno, PTRMAP_BT
15000 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b  REE, pgno, &rc);
15010 0a 20 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f  .  }..set_child_
15020 70 74 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70  ptrmaps_out:.  p
15030 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69  Page->isInit = i
15040 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65 74  sInitOrig;.  ret
15050 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
15060 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50   Somewhere on pP
15070 61 67 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  age is a pointer
15080 20 74 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e 20   to page iFrom. 
15090 20 4d 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69   Modify this poi
150a0 6e 74 65 72 20 73 6f 0a 2a 2a 20 74 68 61 74 20  nter so.** that 
150b0 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 69 54 6f  it points to iTo
150c0 2e 20 50 61 72 61 6d 65 74 65 72 20 65 54 79 70  . Parameter eTyp
150d0 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  e describes the 
150e0 74 79 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20  type of pointer 
150f0 74 6f 0a 2a 2a 20 62 65 20 6d 6f 64 69 66 69 65  to.** be modifie
15100 64 2c 20 61 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a  d, as  follows:.
15110 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52  **.** PTRMAP_BTR
15120 45 45 3a 20 20 20 20 20 70 50 61 67 65 20 69 73  EE:     pPage is
15130 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54   a btree-page. T
15140 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  he pointer point
15150 73 20 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a  s at a child .**
15160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15170 20 20 20 70 61 67 65 20 6f 66 20 70 50 61 67 65     page of pPage
15180 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f  ..**.** PTRMAP_O
15190 56 45 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20  VERFLOW1: pPage 
151a0 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e  is a btree-page.
151b0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
151c0 6e 74 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c  nts at an overfl
151d0 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ow.**           
151e0 20 20 20 20 20 20 20 20 70 61 67 65 20 70 6f 69          page poi
151f0 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f  nted to by one o
15200 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70  f the cells on p
15210 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  Page..**.** PTRM
15220 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50  AP_OVERFLOW2: pP
15230 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c  age is an overfl
15240 6f 77 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ow-page. The poi
15250 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74  nter points at t
15260 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20  he next.**      
15270 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 76 65               ove
15280 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
15290 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  e list..*/.stati
152a0 63 20 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65  c int modifyPage
152b0 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20  Pointer(MemPage 
152c0 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72  *pPage, Pgno iFr
152d0 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38  om, Pgno iTo, u8
152e0 20 65 54 79 70 65 29 7b 0a 20 20 61 73 73 65 72   eType){.  asser
152f0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
15300 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
15310 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
15320 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
15330 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
15340 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
15350 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54  .  if( eType==PT
15360 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29  RMAP_OVERFLOW2 )
15370 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  {.    /* The poi
15380 6e 74 65 72 20 69 73 20 61 6c 77 61 79 73 20 74  nter is always t
15390 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  he first 4 bytes
153a0 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e 20   of the page in 
153b0 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20  this case.  */. 
153c0 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28     if( get4byte(
153d0 70 50 61 67 65 2d 3e 61 44 61 74 61 29 21 3d 69  pPage->aData)!=i
153e0 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72 65  From ){.      re
153f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
15400 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
15410 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50 61      put4byte(pPa
15420 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b  ge->aData, iTo);
15430 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38  .  }else{.    u8
15440 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50   isInitOrig = pP
15450 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20  age->isInit;.   
15460 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
15470 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 62 74 72 65  nCell;..    btre
15480 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29  eInitPage(pPage)
15490 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50  ;.    nCell = pP
154a0 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20  age->nCell;..   
154b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
154c0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75  l; i++){.      u
154d0 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43  8 *pCell = findC
154e0 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20  ell(pPage, i);. 
154f0 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d       if( eType==
15500 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
15510 20 29 7b 0a 20 20 20 20 20 20 20 20 43 65 6c 6c   ){.        Cell
15520 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20  Info info;.     
15530 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
15540 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
15550 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20  l, &info);.     
15560 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65     if( info.iOve
15570 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20  rflow ){.       
15580 20 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d 67 65     if( iFrom==ge
15590 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
155a0 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 20 29  fo.iOverflow]) )
155b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  {.            pu
155c0 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
155d0 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69  fo.iOverflow], i
155e0 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  To);.           
155f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
15600 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
15610 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15620 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28     if( get4byte(
15630 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b  pCell)==iFrom ){
15640 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
15650 79 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b  yte(pCell, iTo);
15660 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
15670 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15680 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
15690 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b   if( i==nCell ){
156a0 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
156b0 21 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c  !=PTRMAP_BTREE |
156c0 7c 20 0a 20 20 20 20 20 20 20 20 20 20 67 65 74  | .          get
156d0 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
156e0 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
156f0 66 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20  fset+8])!=iFrom 
15700 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
15710 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
15720 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  _BKPT;.      }. 
15730 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
15740 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
15750 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  e->hdrOffset+8],
15760 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20   iTo);.    }..  
15770 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
15780 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20  = isInitOrig;.  
15790 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
157a0 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
157b0 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61  Move the open da
157c0 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50  tabase page pDbP
157d0 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20  age to location 
157e0 69 46 72 65 65 50 61 67 65 20 69 6e 20 74 68 65  iFreePage in the
157f0 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54   .** database. T
15800 68 65 20 70 44 62 50 61 67 65 20 72 65 66 65 72  he pDbPage refer
15810 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c  ence remains val
15820 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73  id..**.** The is
15830 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 6e 64 69  Commit flag indi
15840 63 61 74 65 73 20 74 68 61 74 20 74 68 65 72 65  cates that there
15850 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72   is no need to r
15860 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 2a 2a 20  emember that.** 
15870 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64  the journal need
15880 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64  s to be sync()ed
15890 20 62 65 66 6f 72 65 20 64 61 74 61 62 61 73 65   before database
158a0 20 70 61 67 65 20 70 44 62 50 61 67 65 2d 3e 70   page pDbPage->p
158b0 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62 65 20 77  gno .** can be w
158c0 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63  ritten to. The c
158d0 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64  aller has alread
158e0 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74  y promised not t
158f0 6f 20 77 72 69 74 65 20 74 6f 20 74 68 61 74 0a  o write to that.
15900 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  ** page..*/.stat
15910 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50  ic int relocateP
15920 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
15930 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20  *pBt,           
15940 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65  /* Btree */.  Me
15950 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20  mPage *pDbPage, 
15960 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70         /* Open p
15970 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20  age to move */. 
15980 20 75 38 20 65 54 79 70 65 2c 20 20 20 20 20 20   u8 eType,      
15990 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
159a0 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65 27 20  nter map 'type' 
159b0 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67  entry for pDbPag
159c0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72  e */.  Pgno iPtr
159d0 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
159e0 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27  /* Pointer map '
159f0 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66  page-no' entry f
15a00 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  or pDbPage */.  
15a10 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65 2c 20  Pgno iFreePage, 
15a20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
15a30 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65  location to move
15a40 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20   pDbPage to */. 
15a50 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20   int isCommit   
15a60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 73 43            /* isC
15a70 6f 6d 6d 69 74 20 66 6c 61 67 20 70 61 73 73 65  ommit flag passe
15a80 64 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  d to sqlite3Page
15a90 72 4d 6f 76 65 70 61 67 65 20 2a 2f 0a 29 7b 0a  rMovepage */.){.
15aa0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72 50    MemPage *pPtrP
15ab0 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 61  age;   /* The pa
15ac0 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
15ad0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 44   a pointer to pD
15ae0 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
15af0 69 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67  iDbPage = pDbPag
15b00 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72  e->pgno;.  Pager
15b10 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e   *pPager = pBt->
15b20 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
15b30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54 79  ;..  assert( eTy
15b40 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
15b50 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50  LOW2 || eType==P
15b60 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20  TRMAP_OVERFLOW1 
15b70 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65 3d  || .      eType=
15b80 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
15b90 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
15ba0 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73 73  OOTPAGE );.  ass
15bb0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
15bc0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
15bd0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
15be0 20 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70   pDbPage->pBt==p
15bf0 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65  Bt );..  /* Move
15c00 20 70 61 67 65 20 69 44 62 50 61 67 65 20 66 72   page iDbPage fr
15c10 6f 6d 20 69 74 73 20 63 75 72 72 65 6e 74 20 6c  om its current l
15c20 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65 20  ocation to page 
15c30 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61 67 65  number iFreePage
15c40 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41 55   */.  TRACE(("AU
15c50 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67  TOVACUUM: Moving
15c60 20 25 64 20 74 6f 20 66 72 65 65 20 70 61 67 65   %d to free page
15c70 20 25 64 20 28 70 74 72 20 70 61 67 65 20 25 64   %d (ptr page %d
15c80 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20   type %d)\n", . 
15c90 20 20 20 20 20 69 44 62 50 61 67 65 2c 20 69 46       iDbPage, iF
15ca0 72 65 65 50 61 67 65 2c 20 69 50 74 72 50 61 67  reePage, iPtrPag
15cb0 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72 63  e, eType));.  rc
15cc0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d   = sqlite3PagerM
15cd0 6f 76 65 70 61 67 65 28 70 50 61 67 65 72 2c 20  ovepage(pPager, 
15ce0 70 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67 65  pDbPage->pDbPage
15cf0 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 73 43  , iFreePage, isC
15d00 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63  ommit);.  if( rc
15d10 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
15d20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
15d30 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67 6e  }.  pDbPage->pgn
15d40 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a 0a  o = iFreePage;..
15d50 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65 20    /* If pDbPage 
15d60 77 61 73 20 61 20 62 74 72 65 65 2d 70 61 67 65  was a btree-page
15d70 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68 61  , then it may ha
15d80 76 65 20 63 68 69 6c 64 20 70 61 67 65 73 20 61  ve child pages a
15d90 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a  nd/or cells.  **
15da0 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f   that point to o
15db0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54  verflow pages. T
15dc0 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
15dd0 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74  ntries for all t
15de0 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20  hese.  ** pages 
15df0 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67  need to be chang
15e00 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ed..  **.  ** If
15e10 20 70 44 62 50 61 67 65 20 69 73 20 61 6e 20 6f   pDbPage is an o
15e20 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68  verflow page, th
15e30 65 6e 20 74 68 65 20 66 69 72 73 74 20 34 20 62  en the first 4 b
15e40 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20 61  ytes may store a
15e50 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f  .  ** pointer to
15e60 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76   a subsequent ov
15e70 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20  erflow page. If 
15e80 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
15e90 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20  , then.  ** the 
15ea0 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65 64  pointer map need
15eb0 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20  s to be updated 
15ec0 66 6f 72 20 74 68 65 20 73 75 62 73 65 71 75 65  for the subseque
15ed0 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  nt overflow page
15ee0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
15ef0 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45  pe==PTRMAP_BTREE
15f00 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
15f10 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20  P_ROOTPAGE ){.  
15f20 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50    rc = setChildP
15f30 74 72 6d 61 70 73 28 70 44 62 50 61 67 65 29 3b  trmaps(pDbPage);
15f40 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
15f50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
15f60 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
15f70 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67  .  }else{.    Pg
15f80 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65  no nextOvfl = ge
15f90 74 34 62 79 74 65 28 70 44 62 50 61 67 65 2d 3e  t4byte(pDbPage->
15fa0 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20  aData);.    if( 
15fb0 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20  nextOvfl!=0 ){. 
15fc0 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
15fd0 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54  Bt, nextOvfl, PT
15fe0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20  RMAP_OVERFLOW2, 
15ff0 69 46 72 65 65 50 61 67 65 2c 20 26 72 63 29 3b  iFreePage, &rc);
16000 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
16010 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16020 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
16030 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
16040 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20 64  ..  /* Fix the d
16050 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72 20  atabase pointer 
16060 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61 67 65  on page iPtrPage
16070 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61 74   that pointed at
16080 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a   iDbPage so.  **
16090 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
160a0 61 74 20 69 46 72 65 65 50 61 67 65 2e 20 41 6c  at iFreePage. Al
160b0 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e 74  so fix the point
160c0 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er map entry for
160d0 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a  .  ** iPtrPage..
160e0 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65    */.  if( eType
160f0 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  !=PTRMAP_ROOTPAG
16100 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74  E ){.    rc = bt
16110 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
16120 69 50 74 72 50 61 67 65 2c 20 26 70 50 74 72 50  iPtrPage, &pPtrP
16130 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  age, 0);.    if(
16140 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
16150 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
16160 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
16170 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
16180 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44  ite(pPtrPage->pD
16190 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
161a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
161b0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
161c0 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20  ge(pPtrPage);.  
161d0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
161e0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f     }.    rc = mo
161f0 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28  difyPagePointer(
16200 70 50 74 72 50 61 67 65 2c 20 69 44 62 50 61 67  pPtrPage, iDbPag
16210 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54  e, iFreePage, eT
16220 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  ype);.    releas
16230 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b  ePage(pPtrPage);
16240 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
16250 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16260 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69  ptrmapPut(pBt, i
16270 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c  FreePage, eType,
16280 20 69 50 74 72 50 61 67 65 2c 20 26 72 63 29 3b   iPtrPage, &rc);
16290 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
162a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  urn rc;.}../* Fo
162b0 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
162c0 6e 20 72 65 71 75 69 72 65 64 20 62 79 20 69 6e  n required by in
162d0 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20  crVacuumStep(). 
162e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
162f0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
16300 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50  BtShared *, MemP
16310 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20  age **, Pgno *, 
16320 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a  Pgno, u8);../*.*
16330 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67  * Perform a sing
16340 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e  le step of an in
16350 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d  cremental-vacuum
16360 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
16370 0a 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54  .** return SQLIT
16380 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69  E_OK. If there i
16390 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20  s no work to do 
163a0 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e  (and therefore n
163b0 6f 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 63 61  o.** point in ca
163c0 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
163d0 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75  ion again), retu
163e0 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a  rn SQLITE_DONE..
163f0 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69  **.** More speci
16400 66 69 63 6c 79 2c 20 74 68 69 73 20 66 75 6e 63  ficly, this func
16410 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
16420 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65   re-organize the
16430 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 73 6f   .** database so
16440 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70   that the last p
16450 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  age of the file 
16460 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65  currently in use
16470 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  .** is no longer
16480 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 49   in use..**.** I
16490 66 20 74 68 65 20 6e 46 69 6e 20 70 61 72 61 6d  f the nFin param
164a0 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  eter is non-zero
164b0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
164c0 61 73 73 75 6d 65 73 0a 2a 2a 20 74 68 61 74 20  assumes.** that 
164d0 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  the caller will 
164e0 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63  keep calling inc
164f0 72 56 61 63 75 75 6d 53 74 65 70 28 29 20 75 6e  rVacuumStep() un
16500 74 69 6c 0a 2a 2a 20 69 74 20 72 65 74 75 72 6e  til.** it return
16510 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72  s SQLITE_DONE or
16520 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20 74   an error, and t
16530 68 61 74 20 6e 46 69 6e 20 69 73 20 74 68 65 0a  hat nFin is the.
16540 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  ** number of pag
16550 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  es the database 
16560 66 69 6c 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69  file will contai
16570 6e 20 61 66 74 65 72 20 74 68 69 73 20 0a 2a 2a  n after this .**
16580 20 70 72 6f 63 65 73 73 20 69 73 20 63 6f 6d 70   process is comp
16590 6c 65 74 65 2e 20 20 49 66 20 6e 46 69 6e 20 69  lete.  If nFin i
165a0 73 20 7a 65 72 6f 2c 20 69 74 20 69 73 20 61 73  s zero, it is as
165b0 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 69 6e  sumed that.** in
165c0 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 20 77  crVacuumStep() w
165d0 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 61 20  ill be called a 
165e0 66 69 6e 69 74 65 20 61 6d 6f 75 6e 74 20 6f 66  finite amount of
165f0 20 74 69 6d 65 73 0a 2a 2a 20 77 68 69 63 68 20   times.** which 
16600 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 65  may or may not e
16610 6d 70 74 79 20 74 68 65 20 66 72 65 65 6c 69 73  mpty the freelis
16620 74 2e 20 20 41 20 66 75 6c 6c 20 61 75 74 6f 76  t.  A full autov
16630 61 63 75 75 6d 0a 2a 2a 20 68 61 73 20 6e 46 69  acuum.** has nFi
16640 6e 3e 30 2e 20 20 41 20 22 50 52 41 47 4d 41 20  n>0.  A "PRAGMA 
16650 69 6e 63 72 65 6d 65 6e 74 61 6c 5f 76 61 63 75  incremental_vacu
16660 75 6d 22 20 68 61 73 20 6e 46 69 6e 3d 3d 30 2e  um" has nFin==0.
16670 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
16680 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 42 74  ncrVacuumStep(Bt
16690 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
166a0 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61  o nFin, Pgno iLa
166b0 73 74 50 67 29 7b 0a 20 20 50 67 6e 6f 20 6e 46  stPg){.  Pgno nF
166c0 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20 20  reeList;        
166d0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
166e0 70 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74  pages still on t
166f0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a  he free-list */.
16700 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
16710 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
16720 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
16730 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
16740 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e 20 29 3b   iLastPg>nFin );
16750 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50 5f  ..  if( !PTRMAP_
16760 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73  ISPAGE(pBt, iLas
16770 74 50 67 29 20 26 26 20 69 4c 61 73 74 50 67 21  tPg) && iLastPg!
16780 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
16790 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 75  GE(pBt) ){.    u
167a0 38 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67 6e  8 eType;.    Pgn
167b0 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20  o iPtrPage;..   
167c0 20 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65 74   nFreeList = get
167d0 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
167e0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
167f0 20 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69 73      if( nFreeLis
16800 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  t==0 ){.      re
16810 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
16820 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20  ;.    }..    rc 
16830 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
16840 20 69 4c 61 73 74 50 67 2c 20 26 65 54 79 70 65   iLastPg, &eType
16850 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20  , &iPtrPage);.  
16860 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16870 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
16880 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
16890 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
168a0 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
168b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
168c0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
168d0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
168e0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46   eType==PTRMAP_F
168f0 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20  REEPAGE ){.     
16900 20 69 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a   if( nFin==0 ){.
16910 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76          /* Remov
16920 65 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  e the page from 
16930 74 68 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c  the files free-l
16940 69 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  ist. This is not
16950 20 72 65 71 75 69 72 65 64 0a 20 20 20 20 20 20   required.      
16960 20 20 2a 2a 20 69 66 20 6e 46 69 6e 20 69 73 20    ** if nFin is 
16970 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61  non-zero. In tha
16980 74 20 63 61 73 65 2c 20 74 68 65 20 66 72 65 65  t case, the free
16990 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a 20 20  -list will be.  
169a0 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63 61 74        ** truncat
169b0 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74 65 72  ed to zero after
169c0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
169d0 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f  eturns, so it do
169e0 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20 20 2a  esn't .        *
169f0 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74 20 73  * matter if it s
16a00 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f  till contains so
16a10 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74 72 69  me garbage entri
16a20 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
16a30 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65         Pgno iFre
16a40 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d  ePg;.        Mem
16a50 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20  Page *pFreePg;. 
16a60 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f         rc = allo
16a70 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
16a80 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46  t, &pFreePg, &iF
16a90 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67 2c 20  reePg, iLastPg, 
16aa0 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
16ab0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
16ac0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
16ad0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
16ae0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
16af0 69 46 72 65 65 50 67 3d 3d 69 4c 61 73 74 50 67  iFreePg==iLastPg
16b00 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   );.        rele
16b10 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29  asePage(pFreePg)
16b20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  ;.      }.    } 
16b30 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 50 67 6e  else {.      Pgn
16b40 6f 20 69 46 72 65 65 50 67 3b 20 20 20 20 20 20  o iFreePg;      
16b50 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
16b60 6f 66 20 66 72 65 65 20 70 61 67 65 20 74 6f 20  of free page to 
16b70 6d 6f 76 65 20 70 4c 61 73 74 50 67 20 74 6f 20  move pLastPg to 
16b80 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65  */.      MemPage
16b90 20 2a 70 4c 61 73 74 50 67 3b 0a 0a 20 20 20 20   *pLastPg;..    
16ba0 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
16bb0 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67  age(pBt, iLastPg
16bc0 2c 20 26 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a  , &pLastPg, 0);.
16bd0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
16be0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
16bf0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
16c00 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
16c10 49 66 20 6e 46 69 6e 20 69 73 20 7a 65 72 6f 2c  If nFin is zero,
16c20 20 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20   this loop runs 
16c30 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64  exactly once and
16c40 20 70 61 67 65 20 70 4c 61 73 74 50 67 0a 20 20   page pLastPg.  
16c50 20 20 20 20 2a 2a 20 69 73 20 73 77 61 70 70 65      ** is swappe
16c60 64 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74  d with the first
16c70 20 66 72 65 65 20 70 61 67 65 20 70 75 6c 6c 65   free page pulle
16c80 64 20 6f 66 66 20 74 68 65 20 66 72 65 65 20 6c  d off the free l
16c90 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ist..      **.  
16ca0 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74      ** On the ot
16cb0 68 65 72 20 68 61 6e 64 2c 20 69 66 20 6e 46 69  her hand, if nFi
16cc0 6e 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  n is greater tha
16cd0 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65  n zero, then kee
16ce0 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69  p.      ** loopi
16cf0 6e 67 20 75 6e 74 69 6c 20 61 20 66 72 65 65 2d  ng until a free-
16d00 70 61 67 65 20 6c 6f 63 61 74 65 64 20 77 69 74  page located wit
16d10 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e 46  hin the first nF
16d20 69 6e 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a  in pages.      *
16d30 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73  * of the file is
16d40 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f   found..      */
16d50 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  .      do {.    
16d60 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72      MemPage *pFr
16d70 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63  eePg;.        rc
16d80 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
16d90 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65  Page(pBt, &pFree
16da0 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 30 2c  Pg, &iFreePg, 0,
16db0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
16dc0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
16dd0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65  {.          rele
16de0 61 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29  asePage(pLastPg)
16df0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
16e00 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
16e10 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
16e20 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20  Page(pFreePg);. 
16e30 20 20 20 20 20 7d 77 68 69 6c 65 28 20 6e 46 69       }while( nFi
16e40 6e 21 3d 30 20 26 26 20 69 46 72 65 65 50 67 3e  n!=0 && iFreePg>
16e50 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20 20 61 73  nFin );.      as
16e60 73 65 72 74 28 20 69 46 72 65 65 50 67 3c 69 4c  sert( iFreePg<iL
16e70 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 0a  astPg );.      .
16e80 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
16e90 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4c 61  e3PagerWrite(pLa
16ea0 73 74 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a  stPg->pDbPage);.
16eb0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
16ec0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
16ed0 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65     rc = relocate
16ee0 50 61 67 65 28 70 42 74 2c 20 70 4c 61 73 74 50  Page(pBt, pLastP
16ef0 67 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61  g, eType, iPtrPa
16f00 67 65 2c 20 69 46 72 65 65 50 67 2c 20 6e 46 69  ge, iFreePg, nFi
16f10 6e 21 3d 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  n!=0);.      }. 
16f20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
16f30 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20  (pLastPg);.     
16f40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
16f50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
16f60 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
16f70 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
16f80 28 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20 20  ( nFin==0 ){.   
16f90 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20   iLastPg--;.    
16fa0 77 68 69 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d  while( iLastPg==
16fb0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
16fc0 45 28 70 42 74 29 7c 7c 50 54 52 4d 41 50 5f 49  E(pBt)||PTRMAP_I
16fd0 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74  SPAGE(pBt, iLast
16fe0 50 67 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  Pg) ){.      if(
16ff0 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
17000 42 74 2c 20 69 4c 61 73 74 50 67 29 20 29 7b 0a  Bt, iLastPg) ){.
17010 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
17020 2a 70 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63  *pPg;.        rc
17030 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
17040 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70  pBt, iLastPg, &p
17050 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  Pg, 0);.        
17060 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
17070 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
17080 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
17090 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
170a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
170b0 74 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29  te(pPg->pDbPage)
170c0 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
170d0 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  ePage(pPg);.    
170e0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
170f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
17100 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
17110 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
17120 20 20 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b        iLastPg--;
17130 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
17140 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49  e3PagerTruncateI
17150 6d 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72  mage(pBt->pPager
17160 2c 20 69 4c 61 73 74 50 67 29 3b 0a 20 20 20 20  , iLastPg);.    
17170 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 69 4c 61  pBt->nPage = iLa
17180 73 74 50 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75  stPg;.  }.  retu
17190 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
171a0 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74  ./*.** A write-t
171b0 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
171c0 62 65 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65  be opened before
171d0 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75   calling this fu
171e0 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65  nction..** It pe
171f0 72 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65 20  rforms a single 
17200 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77  unit of work tow
17210 61 72 64 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e  ards an incremen
17220 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a  tal vacuum..**.*
17230 2a 20 49 66 20 74 68 65 20 69 6e 63 72 65 6d 65  * If the increme
17240 6e 74 61 6c 20 76 61 63 75 75 6d 20 69 73 20 66  ntal vacuum is f
17250 69 6e 69 73 68 65 64 20 61 66 74 65 72 20 74 68  inished after th
17260 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  is function has 
17270 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44  run,.** SQLITE_D
17280 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ONE is returned.
17290 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 66 69   If it is not fi
172a0 6e 69 73 68 65 64 2c 20 62 75 74 20 6e 6f 20 65  nished, but no e
172b0 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a  rror occurred,.*
172c0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
172d0 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
172e0 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  se an SQLite err
172f0 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74  or code. .*/.int
17300 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63   sqlite3BtreeInc
17310 72 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70  rVacuum(Btree *p
17320 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
17330 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
17340 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65  ->pBt;..  sqlite
17350 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
17360 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
17370 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
17380 41 4e 53 5f 57 52 49 54 45 20 26 26 20 70 2d 3e  ANS_WRITE && p->
17390 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
173a0 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20 21 70  RITE );.  if( !p
173b0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
173c0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
173d0 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b  E_DONE;.  }else{
173e0 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41  .    invalidateA
173f0 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
17400 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 69  pBt);.    rc = i
17410 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42  ncrVacuumStep(pB
17420 74 2c 20 30 2c 20 62 74 72 65 65 50 61 67 65 63  t, 0, btreePagec
17430 6f 75 6e 74 28 70 42 74 29 29 3b 0a 20 20 20 20  ount(pBt));.    
17440 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
17450 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
17460 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
17470 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70  e(pBt->pPage1->p
17480 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 70  DbPage);.      p
17490 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
174a0 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c  age1->aData[28],
174b0 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20   pBt->nPage);.  
174c0 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
174d0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
174e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
174f0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
17500 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72 69  ne is called pri
17510 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  or to sqlite3Pag
17520 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20  erCommit when a 
17530 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
17540 73 20 63 6f 6d 6d 69 74 65 64 20 66 6f 72 20 61  s commited for a
17550 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
17560 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  tabase..**.** If
17570 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
17580 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e  turned, then *pn
17590 54 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f 20  Trunc is set to 
175a0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
175b0 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ges.** the datab
175c0 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20  ase file should 
175d0 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  be truncated to 
175e0 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69  during the commi
175f0 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69  t process. .** i
17600 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61 73 65  .e. the database
17610 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67 61   has been reorga
17620 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f 6e  nized so that on
17630 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a 70 6e  ly the first *pn
17640 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61  Trunc.** pages a
17650 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74  re in use..*/.st
17660 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61 63  atic int autoVac
17670 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61 72  uumCommit(BtShar
17680 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20  ed *pBt){.  int 
17690 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
176a0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
176b0 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20  = pBt->pPager;. 
176c0 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e   VVA_ONLY( int n
176d0 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67  Ref = sqlite3Pag
176e0 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65  erRefcount(pPage
176f0 72 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  r) );..  assert(
17700 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
17710 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
17720 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 41  );.  invalidateA
17730 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
17740 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74 28 70  pBt);.  assert(p
17750 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b  Bt->autoVacuum);
17760 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69 6e 63  .  if( !pBt->inc
17770 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50  rVacuum ){.    P
17780 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20  gno nFin;       
17790 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
177a0 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65  ages in database
177b0 20 61 66 74 65 72 20 61 75 74 6f 76 61 63 75 75   after autovacuu
177c0 6d 69 6e 67 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  ming */.    Pgno
177d0 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f   nFree;        /
177e0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
177f0 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
17800 74 20 69 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a 20  t initially */. 
17810 20 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b     Pgno nPtrmap;
17820 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
17830 6f 66 20 50 74 72 4d 61 70 20 70 61 67 65 73 20  of PtrMap pages 
17840 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20  to be freed */. 
17850 20 20 20 50 67 6e 6f 20 69 46 72 65 65 3b 20 20     Pgno iFree;  
17860 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78        /* The nex
17870 74 20 70 61 67 65 20 74 6f 20 62 65 20 66 72 65  t page to be fre
17880 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45  ed */.    int nE
17890 6e 74 72 79 3b 20 20 20 20 20 20 20 20 2f 2a 20  ntry;        /* 
178a0 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
178b0 73 20 6f 6e 20 6f 6e 65 20 70 74 72 6d 61 70 20  s on one ptrmap 
178c0 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  page */.    Pgno
178d0 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 2f   nOrig;        /
178e0 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a 65 20  * Database size 
178f0 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67 20 2a  before freeing *
17900 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d 20 62  /..    nOrig = b
17910 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
17920 74 29 3b 0a 20 20 20 20 69 66 28 20 50 54 52 4d  t);.    if( PTRM
17930 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e  AP_ISPAGE(pBt, n
17940 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d  Orig) || nOrig==
17950 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
17960 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
17970 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  /* It is not pos
17980 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20  sible to create 
17990 61 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 77  a database for w
179a0 68 69 63 68 20 74 68 65 20 66 69 6e 61 6c 20 70  hich the final p
179b0 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  age.      ** is 
179c0 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72  either a pointer
179d0 2d 6d 61 70 20 70 61 67 65 20 6f 72 20 74 68 65  -map page or the
179e0 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61   pending-byte pa
179f0 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20 20  ge. If one.     
17a00 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72   ** is encounter
17a10 65 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74  ed, this indicat
17a20 65 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  es corruption.. 
17a30 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
17a40 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
17a50 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
17a60 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74  .    nFree = get
17a70 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
17a80 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
17a90 20 20 20 20 6e 45 6e 74 72 79 20 3d 20 70 42 74      nEntry = pBt
17aa0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 3b 0a  ->usableSize/5;.
17ab0 20 20 20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e      nPtrmap = (n
17ac0 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41  Free-nOrig+PTRMA
17ad0 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f  P_PAGENO(pBt, nO
17ae0 72 69 67 29 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e  rig)+nEntry)/nEn
17af0 74 72 79 3b 0a 20 20 20 20 6e 46 69 6e 20 3d 20  try;.    nFin = 
17b00 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d 20  nOrig - nFree - 
17b10 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20 69 66 28  nPtrmap;.    if(
17b20 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42   nOrig>PENDING_B
17b30 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 26 26  YTE_PAGE(pBt) &&
17b40 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42 59   nFin<PENDING_BY
17b50 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
17b60 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20        nFin--;.  
17b70 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 50    }.    while( P
17b80 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
17b90 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d  , nFin) || nFin=
17ba0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
17bb0 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
17bc0 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20   nFin--;.    }. 
17bd0 20 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72 69     if( nFin>nOri
17be0 67 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  g ) return SQLIT
17bf0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
17c00 0a 20 20 20 20 66 6f 72 28 69 46 72 65 65 3d 6e  .    for(iFree=n
17c10 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e  Orig; iFree>nFin
17c20 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
17c30 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20  K; iFree--){.   
17c40 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75     rc = incrVacu
17c50 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e  umStep(pBt, nFin
17c60 2c 20 69 46 72 65 65 29 3b 0a 20 20 20 20 7d 0a  , iFree);.    }.
17c70 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c      if( (rc==SQL
17c80 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d  ITE_DONE || rc==
17c90 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46  SQLITE_OK) && nF
17ca0 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72  ree>0 ){.      r
17cb0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
17cc0 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
17cd0 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
17ce0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
17cf0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
17d00 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  32], 0);.      p
17d10 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
17d20 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
17d30 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62   0);.      put4b
17d40 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
17d50 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 6e 46 69  ->aData[28], nFi
17d60 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
17d70 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d  3PagerTruncateIm
17d80 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  age(pBt->pPager,
17d90 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20 70 42   nFin);.      pB
17da0 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 46 69 6e 3b  t->nPage = nFin;
17db0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
17dc0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
17dd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
17de0 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  erRollback(pPage
17df0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  r);.    }.  }.. 
17e00 20 61 73 73 65 72 74 28 20 6e 52 65 66 3d 3d 73   assert( nRef==s
17e10 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
17e20 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20  unt(pPager) );. 
17e30 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
17e40 65 6c 73 65 20 2f 2a 20 69 66 6e 64 65 66 20 53  else /* ifndef S
17e50 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
17e60 41 43 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e  ACUUM */.# defin
17e70 65 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  e setChildPtrmap
17e80 73 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23  s(x) SQLITE_OK.#
17e90 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
17ea0 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  s routine does t
17eb0 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20 6f  he first phase o
17ec0 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f  f a two-phase co
17ed0 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74  mmit.  This rout
17ee0 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61 20  ine.** causes a 
17ef0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
17f00 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 28   to be created (
17f10 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61  if it does not a
17f20 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a 2a  lready exist).**
17f30 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77   and populated w
17f40 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72  ith enough infor
17f50 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 69  mation so that i
17f60 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f  f a power loss o
17f70 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61 74  ccurs.** the dat
17f80 61 62 61 73 65 20 63 61 6e 20 62 65 20 72 65 73  abase can be res
17f90 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
17fa0 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20 70  ginal state by p
17fb0 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74  laying back.** t
17fc0 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  he journal.  The
17fd0 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  n the contents o
17fe0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72  f the journal ar
17ff0 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74 6f  e flushed out to
18000 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20 41  .** the disk.  A
18010 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  fter the journal
18020 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78   is safely on ox
18030 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65 73  ide, the changes
18040 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   to the.** datab
18050 61 73 65 20 61 72 65 20 77 72 69 74 74 65 6e 20  ase are written 
18060 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
18070 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73 68  e file and flush
18080 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20  ed to oxide..** 
18090 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  At the end of th
180a0 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c  is call, the rol
180b0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74  lback journal st
180c0 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74 68  ill exists on th
180d0 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77 65  e.** disk and we
180e0 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69   are still holdi
180f0 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f  ng all locks, so
18100 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
18110 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d   has not.** comm
18120 69 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c 69  itted.  See sqli
18130 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
18140 61 73 65 54 77 6f 28 29 20 66 6f 72 20 74 68 65  aseTwo() for the
18150 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66   second phase of
18160 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70   the.** commit p
18170 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  rocess..**.** Th
18180 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  is call is a no-
18190 6f 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74  op if no write-t
181a0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75  ransaction is cu
181b0 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f  rrently active o
181c0 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  n pBt..**.** Oth
181d0 65 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65  erwise, sync the
181e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
181f0 6f 72 20 74 68 65 20 62 74 72 65 65 20 70 42 74  or the btree pBt
18200 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73  . zMaster points
18210 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20   to.** the name 
18220 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
18230 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68  nal file that sh
18240 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20  ould be written 
18250 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69  into the.** indi
18260 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66  vidual journal f
18270 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c  ile, or is NULL,
18280 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d   indicating no m
18290 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
182a0 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64  le .** (single d
182b0 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
182c0 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ion)..**.** When
182d0 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c   this is called,
182e0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
182f0 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  nal should alrea
18300 64 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20  dy have been.** 
18310 63 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74  created, populat
18320 65 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75  ed with this jou
18330 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64  rnal pointer and
18340 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
18350 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73  .**.** Once this
18360 20 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20   is routine has 
18370 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e  returned, the on
18380 6c 79 20 74 68 69 6e 67 20 72 65 71 75 69 72 65  ly thing require
18390 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74  d to commit.** t
183a0 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  he write-transac
183b0 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61  tion for this da
183c0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 74  tabase file is t
183d0 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  o delete the jou
183e0 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rnal..*/.int sql
183f0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
18400 68 61 73 65 4f 6e 65 28 42 74 72 65 65 20 2a 70  haseOne(Btree *p
18410 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
18420 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
18430 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
18440 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
18450 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
18460 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
18470 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73   = p->pBt;.    s
18480 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
18490 28 70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  (p);.#ifndef SQL
184a0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
184b0 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d  UUM.    if( pBt-
184c0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
184d0 20 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56 61       rc = autoVa
184e0 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b  cuumCommit(pBt);
184f0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
18500 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18510 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
18520 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
18530 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
18540 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
18550 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  f.    rc = sqlit
18560 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
18570 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67 65  seOne(pBt->pPage
18580 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  r, zMaster, 0);.
18590 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
185a0 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Leave(p);.  }.  
185b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
185c0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
185d0 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d  n is called from
185e0 20 62 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d 69   both BtreeCommi
185f0 74 50 68 61 73 65 54 77 6f 28 29 20 61 6e 64 20  tPhaseTwo() and 
18600 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 0a  BtreeRollback().
18610 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ** at the conclu
18620 73 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73 61  sion of a transa
18630 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
18640 20 76 6f 69 64 20 62 74 72 65 65 45 6e 64 54 72   void btreeEndTr
18650 61 6e 73 61 63 74 69 6f 6e 28 42 74 72 65 65 20  ansaction(Btree 
18660 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
18670 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
18680 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
18690 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
186a0 70 29 20 29 3b 0a 0a 20 20 62 74 72 65 65 43 6c  p) );..  btreeCl
186b0 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42  earHasContent(pB
186c0 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  t);.  if( p->inT
186d0 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20  rans>TRANS_NONE 
186e0 26 26 20 70 2d 3e 64 62 2d 3e 61 63 74 69 76 65  && p->db->active
186f0 56 64 62 65 43 6e 74 3e 31 20 29 7b 0a 20 20 20  VdbeCnt>1 ){.   
18700 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
18710 20 6f 74 68 65 72 20 61 63 74 69 76 65 20 73 74   other active st
18720 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 62 65  atements that be
18730 6c 6f 6e 67 20 74 6f 20 74 68 69 73 20 64 61 74  long to this dat
18740 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 68 61 6e  abase.    ** han
18750 64 6c 65 2c 20 64 6f 77 6e 67 72 61 64 65 20 74  dle, downgrade t
18760 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72  o a read-only tr
18770 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 6f  ansaction. The o
18780 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73 0a  ther statements.
18790 20 20 20 20 2a 2a 20 6d 61 79 20 73 74 69 6c 6c      ** may still
187a0 20 62 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d   be reading from
187b0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
187c0 2a 2f 0a 20 20 20 20 64 6f 77 6e 67 72 61 64 65  */.    downgrade
187d0 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61  AllSharedCacheTa
187e0 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20  bleLocks(p);.   
187f0 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
18800 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73  ANS_READ;.  }els
18810 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  e{.    /* If the
18820 20 68 61 6e 64 6c 65 20 68 61 64 20 61 6e 79 20   handle had any 
18830 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63 74  kind of transact
18840 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d  ion open, decrem
18850 65 6e 74 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ent the .    ** 
18860 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
18870 74 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 20  t of the shared 
18880 62 74 72 65 65 2e 20 49 66 20 74 68 65 20 74 72  btree. If the tr
18890 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20  ansaction count 
188a0 0a 20 20 20 20 2a 2a 20 72 65 61 63 68 65 73 20  .    ** reaches 
188b0 30 2c 20 73 65 74 20 74 68 65 20 73 68 61 72 65  0, set the share
188c0 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53  d state to TRANS
188d0 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63  _NONE. The unloc
188e0 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 29  kBtreeIfUnused()
188f0 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 65 6c  .    ** call bel
18900 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74  ow will unlock t
18910 68 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a 20 20  he pager.  */.  
18920 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
18930 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  !=TRANS_NONE ){.
18940 20 20 20 20 20 20 63 6c 65 61 72 41 6c 6c 53 68        clearAllSh
18950 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
18960 63 6b 73 28 70 29 3b 0a 20 20 20 20 20 20 70 42  cks(p);.      pB
18970 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d  t->nTransaction-
18980 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  -;.      if( 0==
18990 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
189a0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  n ){.        pBt
189b0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
189c0 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
189d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
189e0 20 2f 2a 20 53 65 74 20 74 68 65 20 63 75 72 72   /* Set the curr
189f0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
18a00 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e  state to TRANS_N
18a10 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ONE and unlock t
18a20 68 65 20 0a 20 20 20 20 2a 2a 20 70 61 67 65 72  he .    ** pager
18a30 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63 6c   if this call cl
18a40 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72 65  osed the only re
18a50 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e  ad or write tran
18a60 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20  saction.  */.   
18a70 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
18a80 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e  ANS_NONE;.    un
18a90 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
18aa0 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62  d(pBt);.  }..  b
18ab0 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
18ac0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  ;.}../*.** Commi
18ad0 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
18ae0 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70  n currently in p
18af0 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54  rogress..**.** T
18b00 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c  his routine impl
18b10 65 6d 65 6e 74 73 20 74 68 65 20 73 65 63 6f 6e  ements the secon
18b20 64 20 70 68 61 73 65 20 6f 66 20 61 20 32 2d 70  d phase of a 2-p
18b30 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68  hase commit.  Th
18b40 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65  e.** sqlite3Btre
18b50 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
18b60 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  ) routine does t
18b70 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20 61  he first phase a
18b80 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  nd should.** be 
18b90 69 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f  invoked prior to
18ba0 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
18bb0 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c 69  utine.  The sqli
18bc0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
18bd0 61 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74  aseOne().** rout
18be0 69 6e 65 20 64 69 64 20 61 6c 6c 20 74 68 65 20  ine did all the 
18bf0 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67 20  work of writing 
18c00 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20  information out 
18c10 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75 73  to disk and flus
18c20 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  hing the.** cont
18c30 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68 65  ents so that the
18c40 79 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f 6e  y are written on
18c50 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61 74  to the disk plat
18c60 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a  ter.  All this.*
18c70 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74 6f  * routine has to
18c80 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f 72   do is delete or
18c90 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72   truncate or zer
18ca0 6f 20 74 68 65 20 68 65 61 64 65 72 20 69 6e 20  o the header in 
18cb0 74 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62  the.** the rollb
18cc0 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69  ack journal (whi
18cd0 63 68 20 63 61 75 73 65 73 20 74 68 65 20 74 72  ch causes the tr
18ce0 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d  ansaction to com
18cf0 6d 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70  mit) and.** drop
18d00 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   locks..**.** Th
18d10 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20  is will release 
18d20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  the write lock o
18d30 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
18d40 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a  ile.  If there.*
18d50 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  * are no active 
18d60 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f  cursors, it also
18d70 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65   releases the re
18d80 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20  ad lock..*/.int 
18d90 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
18da0 69 74 50 68 61 73 65 54 77 6f 28 42 74 72 65 65  itPhaseTwo(Btree
18db0 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
18dc0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
18dd0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
18de0 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65  nter(p);.  btree
18df0 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20  Integrity(p);.. 
18e00 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c   /* If the handl
18e10 65 20 68 61 73 20 61 20 77 72 69 74 65 2d 74 72  e has a write-tr
18e20 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20  ansaction open, 
18e30 63 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65  commit the share
18e40 64 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74  d-btrees .  ** t
18e50 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73  ransaction and s
18e60 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74  et the shared st
18e70 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41  ate to TRANS_REA
18e80 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  D..  */.  if( p-
18e90 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
18ea0 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74  WRITE ){.    int
18eb0 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28   rc;.    assert(
18ec0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
18ed0 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
18ee0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
18ef0 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
18f00 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  n>0 );.    rc = 
18f10 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
18f20 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e  itPhaseTwo(pBt->
18f30 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
18f40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18f50 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
18f60 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
18f70 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
18f80 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 69 6e     }.    pBt->in
18f90 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
18fa0 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20  ANS_READ;.  }.. 
18fb0 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63   btreeEndTransac
18fc0 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74  tion(p);.  sqlit
18fd0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
18fe0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
18ff0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f  _OK;.}../*.** Do
19000 20 62 6f 74 68 20 70 68 61 73 65 73 20 6f 66 20   both phases of 
19010 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74  a commit..*/.int
19020 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
19030 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  mit(Btree *p){. 
19040 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
19050 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
19060 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
19070 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
19080 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20  ne(p, 0);.  if( 
19090 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
190a0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
190b0 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
190c0 65 54 77 6f 28 70 29 3b 0a 20 20 7d 0a 20 20 73  eTwo(p);.  }.  s
190d0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
190e0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
190f0 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  ;.}..#ifndef NDE
19100 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  BUG./*.** Return
19110 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 77   the number of w
19120 72 69 74 65 2d 63 75 72 73 6f 72 73 20 6f 70 65  rite-cursors ope
19130 6e 20 6f 6e 20 74 68 69 73 20 68 61 6e 64 6c 65  n on this handle
19140 2e 20 54 68 69 73 20 69 73 20 66 6f 72 20 75 73  . This is for us
19150 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29  e.** in assert()
19160 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f   expressions, so
19170 20 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70   it is only comp
19180 69 6c 65 64 20 69 66 20 4e 44 45 42 55 47 20 69  iled if NDEBUG i
19190 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64  s not.** defined
191a0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
191b0 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73  purposes of this
191c0 20 72 6f 75 74 69 6e 65 2c 20 61 20 77 72 69 74   routine, a writ
191d0 65 2d 63 75 72 73 6f 72 20 69 73 20 61 6e 79 20  e-cursor is any 
191e0 63 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69  cursor that.** i
191f0 73 20 63 61 70 61 62 6c 65 20 6f 66 20 77 72 69  s capable of wri
19200 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
19210 62 73 65 2e 20 20 54 68 61 74 20 6d 65 61 6e 73  bse.  That means
19220 20 74 68 65 20 63 75 72 73 6f 72 20 77 61 73 0a   the cursor was.
19230 2a 2a 20 6f 72 69 67 69 6e 61 6c 6c 79 20 6f 70  ** originally op
19240 65 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67  ened for writing
19250 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20   and the cursor 
19260 68 61 73 20 6e 6f 74 20 62 65 20 64 69 73 61 62  has not be disab
19270 6c 65 64 0a 2a 2a 20 62 79 20 68 61 76 69 6e 67  led.** by having
19280 20 69 74 73 20 73 74 61 74 65 20 63 68 61 6e 67   its state chang
19290 65 64 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55  ed to CURSOR_FAU
192a0 4c 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  LT..*/.static in
192b0 74 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73  t countWriteCurs
192c0 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42  ors(BtShared *pB
192d0 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  t){.  BtCursor *
192e0 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20  pCur;.  int r = 
192f0 30 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42  0;.  for(pCur=pB
19300 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72  t->pCursor; pCur
19310 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65  ; pCur=pCur->pNe
19320 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75  xt){.    if( pCu
19330 72 2d 3e 77 72 46 6c 61 67 20 26 26 20 70 43 75  r->wrFlag && pCu
19340 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
19350 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a  R_FAULT ) r++; .
19360 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a    }.  return r;.
19370 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
19380 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
19390 73 20 74 68 65 20 73 74 61 74 65 20 74 6f 20 43  s the state to C
193a0 55 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20  URSOR_FAULT and 
193b0 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  the error.** cod
193c0 65 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f 72  e to errCode for
193d0 20 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f 6e   every cursor on
193e0 20 42 74 53 68 61 72 65 64 20 74 68 61 74 20 70   BtShared that p
193f0 42 74 72 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e  Btree.** referen
19400 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79  ces..**.** Every
19410 20 63 75 72 73 6f 72 20 69 73 20 74 72 69 70 70   cursor is tripp
19420 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75  ed, including cu
19430 72 73 6f 72 73 20 74 68 61 74 20 62 65 6c 6f 6e  rsors that belon
19440 67 0a 2a 2a 20 74 6f 20 6f 74 68 65 72 20 64 61  g.** to other da
19450 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
19460 6e 73 20 74 68 61 74 20 68 61 70 70 65 6e 20 74  ns that happen t
19470 6f 20 62 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20  o be sharing.** 
19480 74 68 65 20 63 61 63 68 65 20 77 69 74 68 20 70  the cache with p
19490 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  Btree..**.** Thi
194a0 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63  s routine gets c
194b0 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c  alled when a rol
194c0 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 0a 2a 2a  lback occurs..**
194d0 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 75 73 69   All cursors usi
194e0 6e 67 20 74 68 65 20 73 61 6d 65 20 63 61 63 68  ng the same cach
194f0 65 20 6d 75 73 74 20 62 65 20 74 72 69 70 70 65  e must be trippe
19500 64 0a 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74 20  d.** to prevent 
19510 74 68 65 6d 20 66 72 6f 6d 20 74 72 79 69 6e 67  them from trying
19520 20 74 6f 20 75 73 65 20 74 68 65 20 62 74 72 65   to use the btre
19530 65 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 72  e after.** the r
19540 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 72 6f  ollback.  The ro
19550 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20  llback may have 
19560 64 65 6c 65 74 65 64 20 74 61 62 6c 65 73 0a 2a  deleted tables.*
19570 2a 20 6f 72 20 6d 6f 76 65 64 20 72 6f 6f 74 20  * or moved root 
19580 70 61 67 65 73 2c 20 73 6f 20 69 74 20 69 73 20  pages, so it is 
19590 6e 6f 74 20 73 75 66 66 69 63 69 65 6e 74 20 74  not sufficient t
195a0 6f 0a 2a 2a 20 73 61 76 65 20 74 68 65 20 73 74  o.** save the st
195b0 61 74 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f  ate of the curso
195c0 72 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d  r.  The cursor m
195d0 75 73 74 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69  ust be.** invali
195e0 64 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  dated..*/.void s
195f0 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41  qlite3BtreeTripA
19600 6c 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65 20  llCursors(Btree 
19610 2a 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72 72  *pBtree, int err
19620 43 6f 64 65 29 7b 0a 20 20 42 74 43 75 72 73 6f  Code){.  BtCurso
19630 72 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 42  r *p;.  sqlite3B
19640 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65  treeEnter(pBtree
19650 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65  );.  for(p=pBtre
19660 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  e->pBt->pCursor;
19670 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
19680 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
19690 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
196a0 72 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20 20  rCursor(p);.    
196b0 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  p->eState = CURS
196c0 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 70 2d  OR_FAULT;.    p-
196d0 3e 73 6b 69 70 4e 65 78 74 20 3d 20 65 72 72 43  >skipNext = errC
196e0 6f 64 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ode;.    for(i=0
196f0 3b 20 69 3c 3d 70 2d 3e 69 50 61 67 65 3b 20 69  ; i<=p->iPage; i
19700 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  ++){.      relea
19710 73 65 50 61 67 65 28 70 2d 3e 61 70 50 61 67 65  sePage(p->apPage
19720 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  [i]);.      p->a
19730 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20  pPage[i] = 0;.  
19740 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
19750 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72  3BtreeLeave(pBtr
19760 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  ee);.}../*.** Ro
19770 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73  llback the trans
19780 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65  action in progre
19790 73 73 2e 20 20 41 6c 6c 20 63 75 72 73 6f 72 73  ss.  All cursors
197a0 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 6e 76 61   will be.** inva
197b0 6c 69 64 65 64 20 62 79 20 74 68 69 73 20 6f 70  lided by this op
197c0 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74  eration.  Any at
197d0 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 63  tempt to use a c
197e0 75 72 73 6f 72 0a 2a 2a 20 74 68 61 74 20 77 61  ursor.** that wa
197f0 73 20 6f 70 65 6e 20 61 74 20 74 68 65 20 62 65  s open at the be
19800 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73 20  ginning of this 
19810 6f 70 65 72 61 74 69 6f 6e 20 77 69 6c 6c 20 72  operation will r
19820 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20 65  esult.** in an e
19830 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rror..**.** This
19840 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68   will release th
19850 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
19860 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
19870 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  e.  If there.** 
19880 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75  are no active cu
19890 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72  rsors, it also r
198a0 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64  eleases the read
198b0 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   lock..*/.int sq
198c0 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
198d0 63 6b 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ck(Btree *p){.  
198e0 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
198f0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
19900 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
19910 67 65 31 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  ge1;..  sqlite3B
19920 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
19930 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
19940 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a  ors(pBt, 0, 0);.
19950 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
19960 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
19970 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
19980 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54  E_OK ){.    /* T
19990 68 69 73 20 69 73 20 61 20 68 6f 72 72 69 62 6c  his is a horribl
199a0 65 20 73 69 74 75 61 74 69 6f 6e 2e 20 41 6e 20  e situation. An 
199b0 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65  IO or malloc() e
199c0 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 77 68  rror occurred wh
199d0 69 6c 73 74 0a 20 20 20 20 2a 2a 20 74 72 79 69  ilst.    ** tryi
199e0 6e 67 20 74 6f 20 73 61 76 65 20 63 75 72 73 6f  ng to save curso
199f0 72 20 70 6f 73 69 74 69 6f 6e 73 2e 20 49 66 20  r positions. If 
19a00 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 6d  this is an autom
19a10 61 74 69 63 20 72 6f 6c 6c 62 61 63 6b 20 28 61  atic rollback (a
19a20 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 65 73  s.    ** the res
19a30 75 6c 74 20 6f 66 20 61 20 63 6f 6e 73 74 72 61  ult of a constra
19a40 69 6e 74 2c 20 6d 61 6c 6c 6f 63 28 29 20 66 61  int, malloc() fa
19a50 69 6c 75 72 65 20 6f 72 20 49 4f 20 65 72 72 6f  ilure or IO erro
19a60 72 29 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20  r) then .    ** 
19a70 74 68 65 20 63 61 63 68 65 20 6d 61 79 20 62 65  the cache may be
19a80 20 69 6e 74 65 72 6e 61 6c 6c 79 20 69 6e 63 6f   internally inco
19a90 6e 73 69 73 74 65 6e 74 20 28 6e 6f 74 20 63 6f  nsistent (not co
19aa0 6e 74 61 69 6e 20 76 61 6c 69 64 20 74 72 65 65  ntain valid tree
19ab0 73 29 20 73 6f 0a 20 20 20 20 2a 2a 20 77 65 20  s) so.    ** we 
19ac0 63 61 6e 6e 6f 74 20 73 69 6d 70 6c 79 20 72 65  cannot simply re
19ad0 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 74  turn the error t
19ae0 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 49 6e  o the caller. In
19af0 73 74 65 61 64 2c 20 61 62 6f 72 74 20 0a 20 20  stead, abort .  
19b00 20 20 2a 2a 20 61 6c 6c 20 71 75 65 72 69 65 73    ** all queries
19b10 20 74 68 61 74 20 6d 61 79 20 62 65 20 75 73 69   that may be usi
19b20 6e 67 20 61 6e 79 20 6f 66 20 74 68 65 20 63 75  ng any of the cu
19b30 72 73 6f 72 73 20 74 68 61 74 20 66 61 69 6c 65  rsors that faile
19b40 64 20 74 6f 20 73 61 76 65 2e 0a 20 20 20 20 2a  d to save..    *
19b50 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  /.    sqlite3Btr
19b60 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
19b70 28 70 2c 20 72 63 29 3b 0a 20 20 7d 0a 23 65 6e  (p, rc);.  }.#en
19b80 64 69 66 0a 20 20 62 74 72 65 65 49 6e 74 65 67  dif.  btreeInteg
19b90 72 69 74 79 28 70 29 3b 0a 0a 20 20 69 66 28 20  rity(p);..  if( 
19ba0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
19bb0 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69  S_WRITE ){.    i
19bc0 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20 61 73 73  nt rc2;..    ass
19bd0 65 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54 45  ert( TRANS_WRITE
19be0 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ==pBt->inTransac
19bf0 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32 20  tion );.    rc2 
19c00 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  = sqlite3PagerRo
19c10 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67  llback(pBt->pPag
19c20 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32  er);.    if( rc2
19c30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
19c40 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20       rc = rc2;. 
19c50 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65     }..    /* The
19c60 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61   rollback may ha
19c70 76 65 20 64 65 73 74 72 6f 79 65 64 20 74 68 65  ve destroyed the
19c80 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 76   pPage1->aData v
19c90 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a  alue.  So.    **
19ca0 20 63 61 6c 6c 20 62 74 72 65 65 47 65 74 50 61   call btreeGetPa
19cb0 67 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20 61  ge() on page 1 a
19cc0 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20  gain to make.   
19cd0 20 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31 2d   ** sure pPage1-
19ce0 3e 61 44 61 74 61 20 69 73 20 73 65 74 20 63 6f  >aData is set co
19cf0 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20  rrectly. */.    
19d00 69 66 28 20 62 74 72 65 65 47 65 74 50 61 67 65  if( btreeGetPage
19d10 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31  (pBt, 1, &pPage1
19d20 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  , 0)==SQLITE_OK 
19d30 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61  ){.      int nPa
19d40 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 32 38  ge = get4byte(28
19d50 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44  +(u8*)pPage1->aD
19d60 61 74 61 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ata);.      test
19d70 63 61 73 65 28 20 6e 50 61 67 65 3d 3d 30 20 29  case( nPage==0 )
19d80 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61 67  ;.      if( nPag
19d90 65 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 50 61  e==0 ) sqlite3Pa
19da0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
19db0 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  ->pPager, &nPage
19dc0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
19dd0 65 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 6e  e( pBt->nPage!=n
19de0 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 70 42  Page );.      pB
19df0 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65  t->nPage = nPage
19e00 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  ;.      releaseP
19e10 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20  age(pPage1);.   
19e20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63   }.    assert( c
19e30 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73  ountWriteCursors
19e40 28 70 42 74 29 3d 3d 30 20 29 3b 0a 20 20 20 20  (pBt)==0 );.    
19e50 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
19e60 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b  on = TRANS_READ;
19e70 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64  .  }..  btreeEnd
19e80 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a  Transaction(p);.
19e90 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
19ea0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
19eb0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74   rc;.}../*.** St
19ec0 61 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20  art a statement 
19ed0 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  subtransaction. 
19ee0 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69  The subtransacti
19ef0 6f 6e 20 63 61 6e 20 63 61 6e 20 62 65 20 72 6f  on can can be ro
19f00 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64  lled.** back ind
19f10 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68  ependently of th
19f20 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69  e main transacti
19f30 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73 74 61  on. You must sta
19f40 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  rt a transaction
19f50 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74 61 72   .** before star
19f60 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61  ting a subtransa
19f70 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72  ction. The subtr
19f80 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64  ansaction is end
19f90 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
19fa0 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61 69 6e   .** if the main
19fb0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d   transaction com
19fc0 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61  mits or rolls ba
19fd0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d  ck..**.** Statem
19fe0 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69  ent subtransacti
19ff0 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61 72 6f  ons are used aro
1a000 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53  und individual S
1a010 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a  QL statements.**
1a020 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69   that are contai
1a030 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42 45 47  ned within a BEG
1a040 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63  IN...COMMIT bloc
1a050 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61  k.  If a constra
1a060 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63  int.** error occ
1a070 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 73  urs within the s
1a080 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66  tatement, the ef
1a090 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65  fect of that one
1a0a0 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61   statement.** ca
1a0b0 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n be rolled back
1a0c0 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
1a0d0 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
1a0e0 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69  entire transacti
1a0f0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74  on..**.** A stat
1a100 65 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e 73 61  ement sub-transa
1a110 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65  ction is impleme
1a120 6e 74 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79  nted as an anony
1a130 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2e 20  mous savepoint. 
1a140 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73  The.** value pas
1a150 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
1a160 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  d parameter is t
1a170 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
1a180 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a  of savepoints,.*
1a190 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  * including the 
1a1a0 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61  new anonymous sa
1a1b0 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e  vepoint, open on
1a1c0 20 74 68 65 20 42 2d 54 72 65 65 2e 20 69 2e 65   the B-Tree. i.e
1a1d0 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72  . if there.** ar
1a1e0 65 20 6e 6f 20 61 63 74 69 76 65 20 73 61 76 65  e no active save
1a1f0 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74  points and no ot
1a200 68 65 72 20 73 74 61 74 65 6d 65 6e 74 2d 74 72  her statement-tr
1a210 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c  ansactions open,
1a220 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74 20 69  .** iStatement i
1a230 73 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d  s 1. This anonym
1a240 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 20 63 61  ous savepoint ca
1a250 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20 6f 72  n be released or
1a260 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20   rolled back.** 
1a270 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  using the sqlite
1a280 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28  3BtreeSavepoint(
1a290 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  ) function..*/.i
1a2a0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42  nt sqlite3BtreeB
1a2b0 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a  eginStmt(Btree *
1a2c0 70 2c 20 69 6e 74 20 69 53 74 61 74 65 6d 65 6e  p, int iStatemen
1a2d0 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  t){.  int rc;.  
1a2e0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1a2f0 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65  p->pBt;.  sqlite
1a300 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1a310 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54    assert( p->inT
1a320 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
1a330 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
1a340 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20  Bt->readOnly==0 
1a350 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  );.  assert( iSt
1a360 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61  atement>0 );.  a
1a370 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e  ssert( iStatemen
1a380 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f  t>p->db->nSavepo
1a390 69 6e 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  int );.  assert(
1a3a0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1a3b0 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
1a3c0 20 29 3b 0a 20 20 2f 2a 20 41 74 20 74 68 65 20   );.  /* At the 
1a3d0 70 61 67 65 72 20 6c 65 76 65 6c 2c 20 61 20 73  pager level, a s
1a3e0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
1a3f0 74 69 6f 6e 20 69 73 20 61 20 73 61 76 65 70 6f  tion is a savepo
1a400 69 6e 74 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e  int with.  ** an
1a410 20 69 6e 64 65 78 20 67 72 65 61 74 65 72 20 74   index greater t
1a420 68 61 6e 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e  han all savepoin
1a430 74 73 20 63 72 65 61 74 65 64 20 65 78 70 6c 69  ts created expli
1a440 63 69 74 6c 79 20 75 73 69 6e 67 0a 20 20 2a 2a  citly using.  **
1a450 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e   SQL statements.
1a460 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74   It is illegal t
1a470 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65 20  o open, release 
1a480 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a  or rollback any.
1a490 20 20 2a 2a 20 73 75 63 68 20 73 61 76 65 70 6f    ** such savepo
1a4a0 69 6e 74 73 20 77 68 69 6c 65 20 74 68 65 20 73  ints while the s
1a4b0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
1a4c0 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69  tion savepoint i
1a4d0 73 20 61 63 74 69 76 65 2e 0a 20 20 2a 2f 0a 20  s active..  */. 
1a4e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1a4f0 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28  erOpenSavepoint(
1a500 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 53 74  pBt->pPager, iSt
1a510 61 74 65 6d 65 6e 74 29 3b 0a 20 20 73 71 6c 69  atement);.  sqli
1a520 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1a530 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1a540 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f  ../*.** The seco
1a550 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
1a560 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70  his function, op
1a570 2c 20 69 73 20 61 6c 77 61 79 73 20 53 41 56 45  , is always SAVE
1a580 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a  POINT_ROLLBACK.*
1a590 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f 52  * or SAVEPOINT_R
1a5a0 45 4c 45 41 53 45 2e 20 54 68 69 73 20 66 75 6e  ELEASE. This fun
1a5b0 63 74 69 6f 6e 20 65 69 74 68 65 72 20 72 65 6c  ction either rel
1a5c0 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62  eases or rolls b
1a5d0 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76 65 70  ack the.** savep
1a5e0 6f 69 6e 74 20 69 64 65 6e 74 69 66 69 65 64 20  oint identified 
1a5f0 62 79 20 70 61 72 61 6d 65 74 65 72 20 69 53 61  by parameter iSa
1a600 76 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69  vepoint, dependi
1a610 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20  ng on the value 
1a620 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a  .** of op..**.**
1a630 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65   Normally, iSave
1a640 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74 65 72  point is greater
1a650 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
1a660 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c  o zero. However,
1a670 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56   if op is.** SAV
1a680 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c  EPOINT_ROLLBACK,
1a690 20 74 68 65 6e 20 69 53 61 76 65 70 6f 69 6e 74   then iSavepoint
1a6a0 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e   may also be -1.
1a6b0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
1a6c0 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f  e .** contents o
1a6d0 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61  f the entire tra
1a6e0 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c  nsaction are rol
1a6f0 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20 69  led back. This i
1a700 73 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66  s different.** f
1a710 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61  rom a normal tra
1a720 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63  nsaction rollbac
1a730 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61  k, as no locks a
1a740 72 65 20 72 65 6c 65 61 73 65 64 20 61 6e 64 20  re released and 
1a750 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  the.** transacti
1a760 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e  on remains open.
1a770 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1a780 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 42 74  treeSavepoint(Bt
1a790 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20  ree *p, int op, 
1a7a0 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29 7b  int iSavepoint){
1a7b0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1a7c0 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26  TE_OK;.  if( p &
1a7d0 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  & p->inTrans==TR
1a7e0 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
1a7f0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1a800 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73   p->pBt;.    ass
1a810 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49  ert( op==SAVEPOI
1a820 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70  NT_RELEASE || op
1a830 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
1a840 42 41 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65  BACK );.    asse
1a850 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d  rt( iSavepoint>=
1a860 30 20 7c 7c 20 28 69 53 61 76 65 70 6f 69 6e 74  0 || (iSavepoint
1a870 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56 45  ==-1 && op==SAVE
1a880 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20  POINT_ROLLBACK) 
1a890 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
1a8a0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20  reeEnter(p);.   
1a8b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1a8c0 65 72 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d  erSavepoint(pBt-
1a8d0 3e 70 50 61 67 65 72 2c 20 6f 70 2c 20 69 53 61  >pPager, op, iSa
1a8e0 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 69 66  vepoint);.    if
1a8f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1a900 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 53 61  ){.      if( iSa
1a910 76 65 70 6f 69 6e 74 3c 30 20 26 26 20 70 42 74  vepoint<0 && pBt
1a920 2d 3e 69 6e 69 74 69 61 6c 6c 79 45 6d 70 74 79  ->initiallyEmpty
1a930 20 29 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20   ) pBt->nPage = 
1a940 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 65  0;.      rc = ne
1a950 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a  wDatabase(pBt);.
1a960 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
1a970 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 20 2b   = get4byte(28 +
1a980 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
1a990 61 74 61 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ata);.      if( 
1a9a0 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 30 20 29 7b  pBt->nPage==0 ){
1a9b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1a9c0 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
1a9d0 42 74 2d 3e 70 50 61 67 65 72 2c 20 28 69 6e 74  Bt->pPager, (int
1a9e0 2a 29 26 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a  *)&pBt->nPage);.
1a9f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1aa00 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1aa10 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65  ave(p);.  }.  re
1aa20 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1aa30 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63  * Create a new c
1aa40 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 42 54  ursor for the BT
1aa50 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 69  ree whose root i
1aa60 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a  s on the page.**
1aa70 20 69 54 61 62 6c 65 2e 20 49 66 20 61 20 72 65   iTable. If a re
1aa80 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20 69  ad-only cursor i
1aa90 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20  s requested, it 
1aaa0 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a  is assumed that.
1aab0 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6c  ** the caller al
1aac0 72 65 61 64 79 20 68 61 73 20 61 74 20 6c 65 61  ready has at lea
1aad0 73 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74  st a read-only t
1aae0 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 0a  ransaction open.
1aaf0 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ** on the databa
1ab00 73 65 20 61 6c 72 65 61 64 79 2e 20 49 66 20 61  se already. If a
1ab10 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20 69 73   write-cursor is
1ab20 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 65 6e   requested, then
1ab30 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 69  .** the caller i
1ab40 73 20 61 73 73 75 6d 65 64 20 74 6f 20 68 61 76  s assumed to hav
1ab50 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20  e an open write 
1ab60 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
1ab70 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 30 2c  ** If wrFlag==0,
1ab80 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
1ab90 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65   can only be use
1aba0 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 2a  d for reading..*
1abb0 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 31 2c 20  * If wrFlag==1, 
1abc0 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
1abd0 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20  can be used for 
1abe0 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72 0a 2a  reading or for.*
1abf0 2a 20 77 72 69 74 69 6e 67 20 69 66 20 6f 74 68  * writing if oth
1ac00 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f  er conditions fo
1ac10 72 20 77 72 69 74 69 6e 67 20 61 72 65 20 61 6c  r writing are al
1ac20 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65 0a 2a  so met.  These.*
1ac30 2a 20 61 72 65 20 74 68 65 20 63 6f 6e 64 69 74  * are the condit
1ac40 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20 62  ions that must b
1ac50 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72 20 66  e met in order f
1ac60 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a  or writing to.**
1ac70 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a   be allowed:.**.
1ac80 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72 73 6f  ** 1:  The curso
1ac90 72 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  r must have been
1aca0 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72 46   opened with wrF
1acb0 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20  lag==1.**.** 2: 
1acc0 20 4f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   Other database 
1acd0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74  connections that
1ace0 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20   share the same 
1acf0 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a 20 20  pager cache.**  
1ad00 20 20 20 62 75 74 20 77 68 69 63 68 20 61 72 65     but which are
1ad10 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45 41 44   not in the READ
1ad20 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74 61  _UNCOMMITTED sta
1ad30 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a  te may not have.
1ad40 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73 20 6f  **     cursors o
1ad50 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61 67 3d  pen with wrFlag=
1ad60 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74  =0 on the same t
1ad70 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65  able.  Otherwise
1ad80 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68 61 6e  .**     the chan
1ad90 67 65 73 20 6d 61 64 65 20 62 79 20 74 68 69 73  ges made by this
1ada0 20 77 72 69 74 65 20 63 75 72 73 6f 72 20 77 6f   write cursor wo
1adb0 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65 20 74  uld be visible t
1adc0 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72 65 61  o.**     the rea
1add0 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65  d cursors in the
1ade0 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
1adf0 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  connection..**.*
1ae00 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61 62 61  * 3:  The databa
1ae10 73 65 20 6d 75 73 74 20 62 65 20 77 72 69 74 61  se must be writa
1ae20 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64  ble (not on read
1ae30 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a  -only media).**.
1ae40 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d 75 73  ** 4:  There mus
1ae50 74 20 62 65 20 61 6e 20 61 63 74 69 76 65 20 74  t be an active t
1ae60 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
1ae70 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69 73  * No checking is
1ae80 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75   done to make su
1ae90 72 65 20 74 68 61 74 20 70 61 67 65 20 69 54 61  re that page iTa
1aea0 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20 74 68  ble really is th
1aeb0 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f  e.** root page o
1aec0 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49 66 20  f a b-tree.  If 
1aed0 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20  it is not, then 
1aee0 74 68 65 20 63 75 72 73 6f 72 20 61 63 71 75 69  the cursor acqui
1aef0 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  red.** will not 
1af00 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a  work correctly..
1af10 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75  **.** It is assu
1af20 6d 65 64 20 74 68 61 74 20 74 68 65 20 73 71 6c  med that the sql
1af30 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a  ite3BtreeCursorZ
1af40 65 72 6f 28 29 20 68 61 73 20 62 65 65 6e 20 63  ero() has been c
1af50 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20 70 43 75 72  alled.** on pCur
1af60 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74   to initialize t
1af70 68 65 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20  he memory space 
1af80 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e  prior to invokin
1af90 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  g this routine..
1afa0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
1afb0 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72  reeCursor(.  Btr
1afc0 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ee *p,          
1afd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1afe0 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
1aff0 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
1b000 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1b010 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b020 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62  Root page of tab
1b030 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
1b040 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20  int wrFlag,     
1b050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b060 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77         /* 1 to w
1b070 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c  rite. 0 read-onl
1b080 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65  y */.  struct Ke
1b090 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
1b0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b0b0 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 63 6f   First arg to co
1b0c0 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f  mparison functio
1b0d0 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  n */.  BtCursor 
1b0e0 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20  *pCur           
1b0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b100 20 53 70 61 63 65 20 66 6f 72 20 6e 65 77 20 63   Space for new c
1b110 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 42 74  ursor */.){.  Bt
1b120 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1b130 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20  >pBt;           
1b140 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 62       /* Shared b
1b150 2d 74 72 65 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  -tree handle */.
1b160 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1b170 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
1b180 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
1b190 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 77  ( wrFlag==0 || w
1b1a0 72 46 6c 61 67 3d 3d 31 20 29 3b 0a 0a 20 20 2f  rFlag==1 );..  /
1b1b0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1b1c0 61 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74  assert statement
1b1d0 73 20 76 65 72 69 66 79 20 74 68 61 74 20 69 66  s verify that if
1b1e0 20 74 68 69 73 20 69 73 20 61 20 73 68 61 72 61   this is a shara
1b1f0 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74 72 65 65  ble .  ** b-tree
1b200 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 63   database, the c
1b210 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c  onnection is hol
1b220 64 69 6e 67 20 74 68 65 20 72 65 71 75 69 72 65  ding the require
1b230 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a  d table locks, .
1b240 20 20 2a 2a 20 61 6e 64 20 74 68 61 74 20 6e 6f    ** and that no
1b250 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
1b260 6e 20 68 61 73 20 61 6e 79 20 6f 70 65 6e 20 63  n has any open c
1b270 75 72 73 6f 72 20 74 68 61 74 20 63 6f 6e 66 6c  ursor that confl
1b280 69 63 74 73 20 77 69 74 68 20 0a 20 20 2a 2a 20  icts with .  ** 
1b290 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20  this lock.  */. 
1b2a0 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61 72   assert( hasShar
1b2b0 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
1b2c0 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 4b 65 79  (p, iTable, pKey
1b2d0 49 6e 66 6f 21 3d 30 2c 20 77 72 46 6c 61 67 2b  Info!=0, wrFlag+
1b2e0 31 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  1) );.  assert( 
1b2f0 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 21 68 61  wrFlag==0 || !ha
1b300 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70  sReadConflicts(p
1b310 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a 0a 20 20  , iTable) );..  
1b320 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74  /* Assert that t
1b330 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 70  he caller has op
1b340 65 6e 65 64 20 74 68 65 20 72 65 71 75 69 72 65  ened the require
1b350 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a  d transaction. *
1b360 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  /.  assert( p->i
1b370 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e  nTrans>TRANS_NON
1b380 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77  E );.  assert( w
1b390 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69  rFlag==0 || p->i
1b3a0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
1b3b0 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ITE );.  assert(
1b3c0 20 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20   pBt->pPage1 && 
1b3d0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
1b3e0 74 61 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56  ta );..  if( NEV
1b3f0 45 52 28 77 72 46 6c 61 67 20 26 26 20 70 42 74  ER(wrFlag && pBt
1b400 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20  ->readOnly) ){. 
1b410 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1b420 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20  _READONLY;.  }. 
1b430 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 31 20 26   if( iTable==1 &
1b440 26 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  & btreePagecount
1b450 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20  (pBt)==0 ){.    
1b460 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 4d  return SQLITE_EM
1b470 50 54 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  PTY;.  }..  /* N
1b480 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ow that no other
1b490 20 65 72 72 6f 72 73 20 63 61 6e 20 6f 63 63 75   errors can occu
1b4a0 72 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e  r, finish fillin
1b4b0 67 20 69 6e 20 74 68 65 20 42 74 43 75 72 73 6f  g in the BtCurso
1b4c0 72 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73  r.  ** variables
1b4d0 20 61 6e 64 20 6c 69 6e 6b 20 74 68 65 20 63 75   and link the cu
1b4e0 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20 42 74  rsor into the Bt
1b4f0 53 68 61 72 65 64 20 6c 69 73 74 2e 20 20 2a 2f  Shared list.  */
1b500 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  .  pCur->pgnoRoo
1b510 74 20 3d 20 28 50 67 6e 6f 29 69 54 61 62 6c 65  t = (Pgno)iTable
1b520 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20  ;.  pCur->iPage 
1b530 3d 20 2d 31 3b 0a 20 20 70 43 75 72 2d 3e 70 4b  = -1;.  pCur->pK
1b540 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66  eyInfo = pKeyInf
1b550 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 72 65  o;.  pCur->pBtre
1b560 65 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70  e = p;.  pCur->p
1b570 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 43 75 72  Bt = pBt;.  pCur
1b580 2d 3e 77 72 46 6c 61 67 20 3d 20 28 75 38 29 77  ->wrFlag = (u8)w
1b590 72 46 6c 61 67 3b 0a 20 20 70 43 75 72 2d 3e 70  rFlag;.  pCur->p
1b5a0 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 43 75 72  Next = pBt->pCur
1b5b0 73 6f 72 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  sor;.  if( pCur-
1b5c0 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 43  >pNext ){.    pC
1b5d0 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76  ur->pNext->pPrev
1b5e0 20 3d 20 70 43 75 72 3b 0a 20 20 7d 0a 20 20 70   = pCur;.  }.  p
1b5f0 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43  Bt->pCursor = pC
1b600 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61  ur;.  pCur->eSta
1b610 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
1b620 4c 49 44 3b 0a 20 20 70 43 75 72 2d 3e 63 61 63  LID;.  pCur->cac
1b630 68 65 64 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20  hedRowid = 0;.  
1b640 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1b650 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  ;.}.int sqlite3B
1b660 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74  treeCursor(.  Bt
1b670 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ree *p,         
1b680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b690 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1b6a0 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20   btree */.  int 
1b6b0 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
1b6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6d0 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
1b6e0 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f  page of table to
1b6f0 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77   open */.  int w
1b700 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20  rFlag,          
1b710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b720 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77         /* 1 to w
1b730 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c  rite. 0 read-onl
1b740 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65  y */.  struct Ke
1b750 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
1b760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b770 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20     /* First arg 
1b780 74 6f 20 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f  to xCompare() */
1b790 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
1b7a0 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
1b7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b7c0 2a 20 57 72 69 74 65 20 6e 65 77 20 63 75 72 73  * Write new curs
1b7d0 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  or here */.){.  
1b7e0 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
1b7f0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1b800 20 20 72 63 20 3d 20 62 74 72 65 65 43 75 72 73    rc = btreeCurs
1b810 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c 20 77 72  or(p, iTable, wr
1b820 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20  Flag, pKeyInfo, 
1b830 70 43 75 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  pCur);.  sqlite3
1b840 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1b850 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1b860 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1b870 73 69 7a 65 20 6f 66 20 61 20 42 74 43 75 72 73  size of a BtCurs
1b880 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20 62 79 74  or object in byt
1b890 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  es..**.** This i
1b8a0 6e 74 65 72 66 61 63 65 73 20 69 73 20 6e 65 65  nterfaces is nee
1b8b0 64 65 64 20 73 6f 20 74 68 61 74 20 75 73 65 72  ded so that user
1b8c0 73 20 6f 66 20 63 75 72 73 6f 72 73 20 63 61 6e  s of cursors can
1b8d0 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20   preallocate.** 
1b8e0 73 75 66 66 69 63 69 65 6e 74 20 73 74 6f 72 61  sufficient stora
1b8f0 67 65 20 74 6f 20 68 6f 6c 64 20 61 20 63 75 72  ge to hold a cur
1b900 73 6f 72 2e 20 20 54 68 65 20 42 74 43 75 72 73  sor.  The BtCurs
1b910 6f 72 20 6f 62 6a 65 63 74 20 69 73 20 6f 70 61  or object is opa
1b920 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65 72 73 20  que.** to users 
1b930 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 64  so they cannot d
1b940 6f 20 74 68 65 20 73 69 7a 65 6f 66 28 29 20 74  o the sizeof() t
1b950 68 65 6d 73 65 6c 76 65 73 20 2d 20 74 68 65 79  hemselves - they
1b960 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a 20 74 68   must call.** th
1b970 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69  is routine..*/.i
1b980 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
1b990 75 72 73 6f 72 53 69 7a 65 28 76 6f 69 64 29 7b  ursorSize(void){
1b9a0 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38  .  return ROUND8
1b9b0 28 73 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72  (sizeof(BtCursor
1b9c0 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  ));.}../*.** Ini
1b9d0 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 74  tialize memory t
1b9e0 68 61 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76  hat will be conv
1b9f0 65 72 74 65 64 20 69 6e 74 6f 20 61 20 42 74 43  erted into a BtC
1ba00 75 72 73 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a  ursor object..**
1ba10 0a 2a 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 61  .** The simple a
1ba20 70 70 72 6f 61 63 68 20 68 65 72 65 20 77 6f 75  pproach here wou
1ba30 6c 64 20 62 65 20 74 6f 20 6d 65 6d 73 65 74 28  ld be to memset(
1ba40 29 20 74 68 65 20 65 6e 74 69 72 65 20 6f 62 6a  ) the entire obj
1ba50 65 63 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f 2e 20  ect.** to zero. 
1ba60 20 42 75 74 20 69 74 20 74 75 72 6e 73 20 6f 75   But it turns ou
1ba70 74 20 74 68 61 74 20 74 68 65 20 61 70 50 61 67  t that the apPag
1ba80 65 5b 5d 20 61 6e 64 20 61 69 49 64 78 5b 5d 20  e[] and aiIdx[] 
1ba90 61 72 72 61 79 73 0a 2a 2a 20 64 6f 20 6e 6f 74  arrays.** do not
1baa0 20 6e 65 65 64 20 74 6f 20 62 65 20 7a 65 72 6f   need to be zero
1bab0 65 64 20 61 6e 64 20 74 68 65 79 20 61 72 65 20  ed and they are 
1bac0 6c 61 72 67 65 2c 20 73 6f 20 77 65 20 63 61 6e  large, so we can
1bad0 20 73 61 76 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f   save a lot.** o
1bae0 66 20 72 75 6e 2d 74 69 6d 65 20 62 79 20 73 6b  f run-time by sk
1baf0 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69  ipping the initi
1bb00 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 6f  alization of tho
1bb10 73 65 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a  se elements..*/.
1bb20 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
1bb30 65 43 75 72 73 6f 72 5a 65 72 6f 28 42 74 43 75  eCursorZero(BtCu
1bb40 72 73 6f 72 20 2a 70 29 7b 0a 20 20 6d 65 6d 73  rsor *p){.  mems
1bb50 65 74 28 70 2c 20 30 2c 20 6f 66 66 73 65 74 6f  et(p, 0, offseto
1bb60 66 28 42 74 43 75 72 73 6f 72 2c 20 69 50 61 67  f(BtCursor, iPag
1bb70 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  e));.}../*.** Se
1bb80 74 20 74 68 65 20 63 61 63 68 65 64 20 72 6f 77  t the cached row
1bb90 69 64 20 76 61 6c 75 65 20 6f 66 20 65 76 65 72  id value of ever
1bba0 79 20 63 75 72 73 6f 72 20 69 6e 20 74 68 65 20  y cursor in the 
1bbb0 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69  same database fi
1bbc0 6c 65 0a 2a 2a 20 61 73 20 70 43 75 72 20 61 6e  le.** as pCur an
1bbd0 64 20 68 61 76 69 6e 67 20 74 68 65 20 73 61 6d  d having the sam
1bbe0 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
1bbf0 65 72 20 61 73 20 70 43 75 72 2e 20 20 54 68 65  er as pCur.  The
1bc00 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 73 65 74   value is.** set
1bc10 20 74 6f 20 69 52 6f 77 69 64 2e 0a 2a 2a 0a 2a   to iRowid..**.*
1bc20 2a 20 4f 6e 6c 79 20 70 6f 73 69 74 69 76 65 20  * Only positive 
1bc30 72 6f 77 69 64 20 76 61 6c 75 65 73 20 61 72 65  rowid values are
1bc40 20 63 6f 6e 73 69 64 65 72 65 64 20 76 61 6c 69   considered vali
1bc50 64 20 66 6f 72 20 74 68 69 73 20 63 61 63 68 65  d for this cache
1bc60 2e 0a 2a 2a 20 54 68 65 20 63 61 63 68 65 20 69  ..** The cache i
1bc70 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
1bc80 20 7a 65 72 6f 2c 20 69 6e 64 69 63 61 74 69 6e   zero, indicatin
1bc90 67 20 61 6e 20 69 6e 76 61 6c 69 64 20 63 61 63  g an invalid cac
1bca0 68 65 2e 0a 2a 2a 20 41 20 62 74 72 65 65 20 77  he..** A btree w
1bcb0 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 20 77 69  ill work fine wi
1bcc0 74 68 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74  th zero or negat
1bcd0 69 76 65 20 72 6f 77 69 64 73 2e 20 20 57 65 20  ive rowids.  We 
1bce0 6a 75 73 74 20 63 61 6e 6e 6f 74 0a 2a 2a 20 63  just cannot.** c
1bcf0 61 63 68 65 20 7a 65 72 6f 20 6f 72 20 6e 65 67  ache zero or neg
1bd00 61 74 69 76 65 20 72 6f 77 69 64 73 2c 20 77 68  ative rowids, wh
1bd10 69 63 68 20 6d 65 61 6e 73 20 74 61 62 6c 65 73  ich means tables
1bd20 20 74 68 61 74 20 75 73 65 20 7a 65 72 6f 20 6f   that use zero o
1bd30 72 0a 2a 2a 20 6e 65 67 61 74 69 76 65 20 72 6f  r.** negative ro
1bd40 77 69 64 73 20 6d 69 67 68 74 20 72 75 6e 20 61  wids might run a
1bd50 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20   little slower. 
1bd60 20 42 75 74 20 69 6e 20 70 72 61 63 74 69 63 65   But in practice
1bd70 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 6e 65 67  , zero.** or neg
1bd80 61 74 69 76 65 20 72 6f 77 69 64 73 20 61 72 65  ative rowids are
1bd90 20 76 65 72 79 20 75 6e 63 6f 6d 6d 6f 6e 20 73   very uncommon s
1bda0 6f 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f  o this should no
1bdb0 74 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a  t be a problem..
1bdc0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
1bdd0 74 72 65 65 53 65 74 43 61 63 68 65 64 52 6f 77  treeSetCachedRow
1bde0 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  id(BtCursor *pCu
1bdf0 72 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  r, sqlite3_int64
1be00 20 69 52 6f 77 69 64 29 7b 0a 20 20 42 74 43 75   iRowid){.  BtCu
1be10 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70  rsor *p;.  for(p
1be20 3d 70 43 75 72 2d 3e 70 42 74 2d 3e 70 43 75 72  =pCur->pBt->pCur
1be30 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
1be40 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  xt){.    if( p->
1be50 70 67 6e 6f 52 6f 6f 74 3d 3d 70 43 75 72 2d 3e  pgnoRoot==pCur->
1be60 70 67 6e 6f 52 6f 6f 74 20 29 20 70 2d 3e 63 61  pgnoRoot ) p->ca
1be70 63 68 65 64 52 6f 77 69 64 20 3d 20 69 52 6f 77  chedRowid = iRow
1be80 69 64 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  id;.  }.  assert
1be90 28 20 70 43 75 72 2d 3e 63 61 63 68 65 64 52 6f  ( pCur->cachedRo
1bea0 77 69 64 3d 3d 69 52 6f 77 69 64 20 29 3b 0a 7d  wid==iRowid );.}
1beb0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1bec0 68 65 20 63 61 63 68 65 64 20 72 6f 77 69 64 20  he cached rowid 
1bed0 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 63 75  for the given cu
1bee0 72 73 6f 72 2e 20 20 41 20 6e 65 67 61 74 69 76  rsor.  A negativ
1bef0 65 20 6f 72 20 7a 65 72 6f 0a 2a 2a 20 72 65 74  e or zero.** ret
1bf00 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61  urn value indica
1bf10 74 65 73 20 74 68 61 74 20 74 68 65 20 72 6f 77  tes that the row
1bf20 69 64 20 63 61 63 68 65 20 69 73 20 69 6e 76 61  id cache is inva
1bf30 6c 69 64 20 61 6e 64 20 73 68 6f 75 6c 64 20 62  lid and should b
1bf40 65 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20 49  e.** ignored.  I
1bf50 66 20 74 68 65 20 72 6f 77 69 64 20 63 61 63 68  f the rowid cach
1bf60 65 20 68 61 73 20 6e 65 76 65 72 20 62 65 66 6f  e has never befo
1bf70 72 65 20 62 65 65 6e 20 73 65 74 2c 20 74 68 65  re been set, the
1bf80 6e 20 61 0a 2a 2a 20 7a 65 72 6f 20 69 73 20 72  n a.** zero is r
1bf90 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69  eturned..*/.sqli
1bfa0 74 65 33 5f 69 6e 74 36 34 20 73 71 6c 69 74 65  te3_int64 sqlite
1bfb0 33 42 74 72 65 65 47 65 74 43 61 63 68 65 64 52  3BtreeGetCachedR
1bfc0 6f 77 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70  owid(BtCursor *p
1bfd0 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  Cur){.  return p
1bfe0 43 75 72 2d 3e 63 61 63 68 65 64 52 6f 77 69 64  Cur->cachedRowid
1bff0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
1c000 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20   a cursor.  The 
1c010 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  read lock on the
1c020 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
1c030 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68  s released.** wh
1c040 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72 73  en the last curs
1c050 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f  or is closed..*/
1c060 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1c070 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74 43  eCloseCursor(BtC
1c080 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
1c090 42 74 72 65 65 20 2a 70 42 74 72 65 65 20 3d 20  Btree *pBtree = 
1c0a0 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20  pCur->pBtree;.  
1c0b0 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20  if( pBtree ){.  
1c0c0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 53    int i;.    BtS
1c0d0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75  hared *pBt = pCu
1c0e0 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69  r->pBt;.    sqli
1c0f0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42  te3BtreeEnter(pB
1c100 74 72 65 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  tree);.    sqlit
1c110 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73  e3BtreeClearCurs
1c120 6f 72 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66  or(pCur);.    if
1c130 28 20 70 43 75 72 2d 3e 70 50 72 65 76 20 29 7b  ( pCur->pPrev ){
1c140 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70 50 72  .      pCur->pPr
1c150 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75 72  ev->pNext = pCur
1c160 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c  ->pNext;.    }el
1c170 73 65 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  se{.      pBt->p
1c180 43 75 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70  Cursor = pCur->p
1c190 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Next;.    }.    
1c1a0 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20  if( pCur->pNext 
1c1b0 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70  ){.      pCur->p
1c1c0 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43  Next->pPrev = pC
1c1d0 75 72 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 7d  ur->pPrev;.    }
1c1e0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1c1f0 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b  =pCur->iPage; i+
1c200 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  +){.      releas
1c210 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61  ePage(pCur->apPa
1c220 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  ge[i]);.    }.  
1c230 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
1c240 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20  nused(pBt);.    
1c250 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
1c260 6f 77 43 61 63 68 65 28 70 43 75 72 29 3b 0a 20  owCache(pCur);. 
1c270 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72     /* sqlite3_fr
1c280 65 65 28 70 43 75 72 29 3b 20 2a 2f 0a 20 20 20  ee(pCur); */.   
1c290 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1c2a0 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a  ve(pBtree);.  }.
1c2b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c2c0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  OK;.}../*.** Mak
1c2d0 65 20 73 75 72 65 20 74 68 65 20 42 74 43 75 72  e sure the BtCur
1c2e0 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20 74 68  sor* given in th
1c2f0 65 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61  e argument has a
1c300 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73   valid.** BtCurs
1c310 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63 74 75 72  or.info structur
1c320 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74  e.  If it is not
1c330 20 61 6c 72 65 61 64 79 20 76 61 6c 69 64 2c 20   already valid, 
1c340 63 61 6c 6c 0a 2a 2a 20 62 74 72 65 65 50 61 72  call.** btreePar
1c350 73 65 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c  seCell() to fill
1c360 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74   it in..**.** Bt
1c370 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61  Cursor.info is a
1c380 20 63 61 63 68 65 20 6f 66 20 74 68 65 20 69 6e   cache of the in
1c390 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65  formation in the
1c3a0 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a   current cell..*
1c3b0 2a 20 55 73 69 6e 67 20 74 68 69 73 20 63 61 63  * Using this cac
1c3c0 68 65 20 72 65 64 75 63 65 73 20 74 68 65 20 6e  he reduces the n
1c3d0 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 74  umber of calls t
1c3e0 6f 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  o btreeParseCell
1c3f0 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 37 2d 30  ()..**.** 2007-0
1c400 36 2d 32 35 3a 20 20 54 68 65 72 65 20 69 73 20  6-25:  There is 
1c410 61 20 62 75 67 20 69 6e 20 73 6f 6d 65 20 76 65  a bug in some ve
1c420 72 73 69 6f 6e 73 20 6f 66 20 4d 53 56 43 20 74  rsions of MSVC t
1c430 68 61 74 20 63 61 75 73 65 20 74 68 65 0a 2a 2a  hat cause the.**
1c440 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20 63 72 61   compiler to cra
1c450 73 68 20 77 68 65 6e 20 67 65 74 43 65 6c 6c 49  sh when getCellI
1c460 6e 66 6f 28 29 20 69 73 20 69 6d 70 6c 65 6d 65  nfo() is impleme
1c470 6e 74 65 64 20 61 73 20 61 20 6d 61 63 72 6f 2e  nted as a macro.
1c480 0a 2a 2a 20 42 75 74 20 74 68 65 72 65 20 69 73  .** But there is
1c490 20 61 20 6d 65 61 73 75 72 65 61 62 6c 65 20 73   a measureable s
1c4a0 70 65 65 64 20 61 64 76 61 6e 74 61 67 65 20 74  peed advantage t
1c4b0 6f 20 75 73 69 6e 67 20 74 68 65 20 6d 61 63 72  o using the macr
1c4c0 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20 28 77 68 65  o on gcc.** (whe
1c4d0 6e 20 6c 65 73 73 20 63 6f 6d 70 69 6c 65 72 20  n less compiler 
1c4e0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 6c 69  optimizations li
1c4f0 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f 30 20 61 72  ke -Os or -O0 ar
1c500 65 20 75 73 65 64 20 61 6e 64 20 74 68 65 0a 2a  e used and the.*
1c510 2a 20 63 6f 6d 70 69 6c 65 72 20 69 73 20 6e 6f  * compiler is no
1c520 74 20 64 6f 69 6e 67 20 61 67 72 65 73 73 69 76  t doing agressiv
1c530 65 20 69 6e 6c 69 6e 69 6e 67 2e 29 20 20 53 6f  e inlining.)  So
1c540 20 77 65 20 75 73 65 20 61 20 72 65 61 6c 20 66   we use a real f
1c550 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 4d  unction.** for M
1c560 53 56 43 20 61 6e 64 20 61 20 6d 61 63 72 6f 20  SVC and a macro 
1c570 66 6f 72 20 65 76 65 72 79 74 68 69 6e 67 20 65  for everything e
1c580 6c 73 65 2e 20 20 54 69 63 6b 65 74 20 23 32 34  lse.  Ticket #24
1c590 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  57..*/.#ifndef N
1c5a0 44 45 42 55 47 0a 20 20 73 74 61 74 69 63 20 76  DEBUG.  static v
1c5b0 6f 69 64 20 61 73 73 65 72 74 43 65 6c 6c 49 6e  oid assertCellIn
1c5c0 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  fo(BtCursor *pCu
1c5d0 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f  r){.    CellInfo
1c5e0 20 69 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20 69   info;.    int i
1c5f0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61  Page = pCur->iPa
1c600 67 65 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  ge;.    memset(&
1c610 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  info, 0, sizeof(
1c620 69 6e 66 6f 29 29 3b 0a 20 20 20 20 62 74 72 65  info));.    btre
1c630 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d  eParseCell(pCur-
1c640 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 20  >apPage[iPage], 
1c650 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67  pCur->aiIdx[iPag
1c660 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  e], &info);.    
1c670 61 73 73 65 72 74 28 20 6d 65 6d 63 6d 70 28 26  assert( memcmp(&
1c680 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66  info, &pCur->inf
1c690 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29  o, sizeof(info))
1c6a0 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65  ==0 );.  }.#else
1c6b0 0a 20 20 23 64 65 66 69 6e 65 20 61 73 73 65 72  .  #define asser
1c6c0 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e  tCellInfo(x).#en
1c6d0 64 69 66 0a 23 69 66 64 65 66 20 5f 4d 53 43 5f  dif.#ifdef _MSC_
1c6e0 56 45 52 0a 20 20 2f 2a 20 55 73 65 20 61 20 72  VER.  /* Use a r
1c6f0 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20  eal function in 
1c700 4d 53 56 43 20 74 6f 20 77 6f 72 6b 20 61 72 6f  MSVC to work aro
1c710 75 6e 64 20 62 75 67 73 20 69 6e 20 74 68 61 74  und bugs in that
1c720 20 63 6f 6d 70 69 6c 65 72 2e 20 2a 2f 0a 20 20   compiler. */.  
1c730 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 74 43  static void getC
1c740 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72  ellInfo(BtCursor
1c750 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 69 66 28   *pCur){.    if(
1c760 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
1c770 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  e==0 ){.      in
1c780 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  t iPage = pCur->
1c790 69 50 61 67 65 3b 0a 20 20 20 20 20 20 62 74 72  iPage;.      btr
1c7a0 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72  eeParseCell(pCur
1c7b0 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c  ->apPage[iPage],
1c7c0 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67  pCur->aiIdx[iPag
1c7d0 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b  e],&pCur->info);
1c7e0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 76 61 6c  .      pCur->val
1c7f0 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20  idNKey = 1;.    
1c800 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
1c810 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  ertCellInfo(pCur
1c820 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c  );.    }.  }.#el
1c830 73 65 20 2f 2a 20 69 66 20 6e 6f 74 20 5f 4d 53  se /* if not _MS
1c840 43 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a 20 55 73  C_VER */.  /* Us
1c850 65 20 61 20 6d 61 63 72 6f 20 69 6e 20 61 6c 6c  e a macro in all
1c860 20 6f 74 68 65 72 20 63 6f 6d 70 69 6c 65 72 73   other compilers
1c870 20 73 6f 20 74 68 61 74 20 74 68 65 20 66 75 6e   so that the fun
1c880 63 74 69 6f 6e 20 69 73 20 69 6e 6c 69 6e 65 64  ction is inlined
1c890 20 2a 2f 0a 23 64 65 66 69 6e 65 20 67 65 74 43   */.#define getC
1c8a0 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 20 20 20  ellInfo(pCur)   
1c8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c8e0 20 20 20 5c 0a 20 20 69 66 28 20 70 43 75 72 2d     \.  if( pCur-
1c8f0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29  >info.nSize==0 )
1c900 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
1c910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c930 20 20 20 20 5c 0a 20 20 20 20 69 6e 74 20 69 50      \.    int iP
1c940 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67  age = pCur->iPag
1c950 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1c960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c980 20 20 20 20 20 5c 0a 20 20 20 20 62 74 72 65 65       \.    btree
1c990 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e  ParseCell(pCur->
1c9a0 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43  apPage[iPage],pC
1c9b0 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d  ur->aiIdx[iPage]
1c9c0 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 20 5c  ,&pCur->info); \
1c9d0 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  .    pCur->valid
1c9e0 4e 4b 65 79 20 3d 20 31 3b 20 20 20 20 20 20 20  NKey = 1;       
1c9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca20 5c 0a 20 20 7d 65 6c 73 65 7b 20 20 20 20 20 20  \.  }else{      
1ca30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca70 20 5c 0a 20 20 20 20 61 73 73 65 72 74 43 65 6c   \.    assertCel
1ca80 6c 49 6e 66 6f 28 70 43 75 72 29 3b 20 20 20 20  lInfo(pCur);    
1ca90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1caa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cac0 20 20 5c 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    \.  }.#endif /
1cad0 2a 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 0a 23  * _MSC_VER */..#
1cae0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 20 2f  ifndef NDEBUG  /
1caf0 2a 20 54 68 65 20 6e 65 78 74 20 72 6f 75 74 69  * The next routi
1cb00 6e 65 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74  ne used only wit
1cb10 68 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61  hin assert() sta
1cb20 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a  tements */./*.**
1cb30 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
1cb40 74 68 65 20 67 69 76 65 6e 20 42 74 43 75 72 73  the given BtCurs
1cb50 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20 41 20  or is valid.  A 
1cb60 76 61 6c 69 64 20 63 75 72 73 6f 72 20 69 73 20  valid cursor is 
1cb70 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 69 73 20 63  one.** that is c
1cb80 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
1cb90 67 20 74 6f 20 61 20 72 6f 77 20 69 6e 20 61 20  g to a row in a 
1cba0 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74 61 62 6c  (non-empty) tabl
1cbb0 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  e..** This is a 
1cbc0 76 65 72 69 66 69 63 61 74 69 6f 6e 20 72 6f 75  verification rou
1cbd0 74 69 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c  tine is used onl
1cbe0 79 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28  y within assert(
1cbf0 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f  ) statements..*/
1cc00 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1cc10 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 42  eCursorIsValid(B
1cc20 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
1cc30 20 20 72 65 74 75 72 6e 20 70 43 75 72 20 26 26    return pCur &&
1cc40 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1cc50 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 23  URSOR_VALID;.}.#
1cc60 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42 55 47 20  endif /* NDEBUG 
1cc70 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70  */../*.** Set *p
1cc80 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65  Size to the size
1cc90 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6e   of the buffer n
1cca0 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 74 68  eeded to hold th
1ccb0 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68  e value of.** th
1ccc0 65 20 6b 65 79 20 66 6f 72 20 74 68 65 20 63 75  e key for the cu
1ccd0 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 20 49 66  rrent entry.  If
1cce0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e   the cursor is n
1ccf0 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74  ot pointing.** t
1cd00 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2c  o a valid entry,
1cd10 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20 74   *pSize is set t
1cd20 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  o 0. .**.** For 
1cd30 61 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  a table with the
1cd40 20 49 4e 54 4b 45 59 20 66 6c 61 67 20 73 65 74   INTKEY flag set
1cd50 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
1cd60 65 74 75 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a  eturns the key.*
1cd70 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68  * itself, not th
1cd80 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1cd90 73 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2a  s in the key..**
1cda0 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  .** The caller m
1cdb0 75 73 74 20 70 6f 73 69 74 69 6f 6e 20 74 68 65  ust position the
1cdc0 20 63 75 72 73 6f 72 20 70 72 69 6f 72 20 74 6f   cursor prior to
1cdd0 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72   invoking this r
1cde0 6f 75 74 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20 54  outine..** .** T
1cdf0 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e  his routine cann
1ce00 6f 74 20 66 61 69 6c 2e 20 20 49 74 20 61 6c 77  ot fail.  It alw
1ce10 61 79 73 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ays returns SQLI
1ce20 54 45 5f 4f 4b 2e 20 20 0a 2a 2f 0a 69 6e 74 20  TE_OK.  .*/.int 
1ce30 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53  sqlite3BtreeKeyS
1ce40 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ize(BtCursor *pC
1ce50 75 72 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b  ur, i64 *pSize){
1ce60 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1ce70 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1ce80 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
1ce90 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1cea0 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70  SOR_INVALID || p
1ceb0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1cec0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 69  SOR_VALID );.  i
1ced0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  f( pCur->eState!
1cee0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
1cef0 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b  .    *pSize = 0;
1cf00 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 67 65  .  }else{.    ge
1cf10 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
1cf20 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 70 43  .    *pSize = pC
1cf30 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20  ur->info.nKey;. 
1cf40 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1cf50 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1cf60 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68  Set *pSize to th
1cf70 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1cf80 73 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68 65  s of data in the
1cf90 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a 20 63 75   entry the.** cu
1cfa0 72 73 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70  rsor currently p
1cfb0 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20  oints to..**.** 
1cfc0 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  The caller must 
1cfd0 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 74  guarantee that t
1cfe0 68 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69  he cursor is poi
1cff0 6e 74 69 6e 67 20 74 6f 20 61 20 6e 6f 6e 2d 4e  nting to a non-N
1d000 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64 20 65 6e 74  ULL.** valid ent
1d010 72 79 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ry.  In other wo
1d020 72 64 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67  rds, the calling
1d030 20 70 72 6f 63 65 64 75 72 65 20 6d 75 73 74 20   procedure must 
1d040 67 75 61 72 61 6e 74 65 65 0a 2a 2a 20 74 68 61  guarantee.** tha
1d050 74 20 74 68 65 20 63 75 72 73 6f 72 20 68 61 73  t the cursor has
1d060 20 43 75 72 73 6f 72 2e 65 53 74 61 74 65 3d 3d   Cursor.eState==
1d070 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a  CURSOR_VALID..**
1d080 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69 73 20 6e  .** Failure is n
1d090 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20 20 54 68  ot possible.  Th
1d0a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61  is function alwa
1d0b0 79 73 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ys returns SQLIT
1d0c0 45 5f 4f 4b 2e 0a 2a 2a 20 49 74 20 6d 69 67 68  E_OK..** It migh
1d0d0 74 20 6a 75 73 74 20 61 73 20 77 65 6c 6c 20 62  t just as well b
1d0e0 65 20 61 20 70 72 6f 63 65 64 75 72 65 20 28 72  e a procedure (r
1d0f0 65 74 75 72 6e 69 6e 67 20 76 6f 69 64 29 20 62  eturning void) b
1d100 75 74 20 77 65 20 63 6f 6e 74 69 6e 75 65 0a 2a  ut we continue.*
1d110 2a 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 69  * to return an i
1d120 6e 74 65 67 65 72 20 72 65 73 75 6c 74 20 63 6f  nteger result co
1d130 64 65 20 66 6f 72 20 68 69 73 74 6f 72 69 63 61  de for historica
1d140 6c 20 72 65 61 73 6f 6e 73 2e 0a 2a 2f 0a 69 6e  l reasons..*/.in
1d150 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61  t sqlite3BtreeDa
1d160 74 61 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20  taSize(BtCursor 
1d170 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 53 69 7a  *pCur, u32 *pSiz
1d180 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  e){.  assert( cu
1d190 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1d1a0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
1d1b0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1d1c0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
1d1d0 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
1d1e0 75 72 29 3b 0a 20 20 2a 70 53 69 7a 65 20 3d 20  ur);.  *pSize = 
1d1f0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61  pCur->info.nData
1d200 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1d210 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  E_OK;.}../*.** G
1d220 69 76 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75  iven the page nu
1d230 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66  mber of an overf
1d240 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
1d250 64 61 74 61 62 61 73 65 20 28 70 61 72 61 6d 65  database (parame
1d260 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68  ter.** ovfl), th
1d270 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64  is function find
1d280 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  s the page numbe
1d290 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61  r of the next pa
1d2a0 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69  ge in the .** li
1d2b0 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65  nked list of ove
1d2c0 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20  rflow pages. If 
1d2d0 70 6f 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65  possible, it use
1d2e0 73 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  s the auto-vacuu
1d2f0 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70  m.** pointer-map
1d300 20 64 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66   data instead of
1d310 20 72 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e   reading the con
1d320 74 65 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66  tent of page ovf
1d330 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a  l to do so. .**.
1d340 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
1d350 63 63 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20  ccurs an SQLite 
1d360 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
1d370 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
1d380 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  e:.**.** The pag
1d390 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
1d3a0 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  next overflow pa
1d3b0 67 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64  ge in the linked
1d3c0 20 6c 69 73 74 20 69 73 20 0a 2a 2a 20 77 72 69   list is .** wri
1d3d0 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65  tten to *pPgnoNe
1d3e0 78 74 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c  xt. If page ovfl
1d3f0 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67   is the last pag
1d400 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20  e in its linked 
1d410 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f  .** list, *pPgno
1d420 4e 65 78 74 20 69 73 20 73 65 74 20 74 6f 20 7a  Next is set to z
1d430 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70  ero. .**.** If p
1d440 70 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c  pPage is not NUL
1d450 4c 2c 20 61 6e 64 20 61 20 72 65 66 65 72 65 6e  L, and a referen
1d460 63 65 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67  ce to the MemPag
1d470 65 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70  e object corresp
1d480 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67  onding.** to pag
1d490 65 20 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20 77  e number pOvfl w
1d4a0 61 73 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65  as obtained, the
1d4b0 6e 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  n *ppPage is set
1d4c0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61   to point to tha
1d4d0 74 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e 20  t.** reference. 
1d4e0 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  It is the respon
1d4f0 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
1d500 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72  caller to call r
1d510 65 6c 65 61 73 65 50 61 67 65 28 29 0a 2a 2a 20  eleasePage().** 
1d520 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f 20 66 72  on *ppPage to fr
1d530 65 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  ee the reference
1d540 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63  . In no referenc
1d550 65 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 28  e was obtained (
1d560 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 70  because.** the p
1d570 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61 73 20 75  ointer-map was u
1d580 73 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68  sed to obtain th
1d590 65 20 76 61 6c 75 65 20 66 6f 72 20 2a 70 50 67  e value for *pPg
1d5a0 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a  noNext), then.**
1d5b0 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
1d5c0 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74  to zero..*/.stat
1d5d0 69 63 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c  ic int getOverfl
1d5e0 6f 77 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  owPage(.  BtShar
1d5f0 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
1d600 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
1d610 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
1d620 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20   Pgno ovfl,     
1d630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d640 20 43 75 72 72 65 6e 74 20 6f 76 65 72 66 6c 6f   Current overflo
1d650 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  w page number */
1d660 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
1d670 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  age,            
1d680 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20  /* OUT: MemPage 
1d690 68 61 6e 64 6c 65 20 28 6d 61 79 20 62 65 20 4e  handle (may be N
1d6a0 55 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a  ULL) */.  Pgno *
1d6b0 70 50 67 6e 6f 4e 65 78 74 20 20 20 20 20 20 20  pPgnoNext       
1d6c0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e         /* OUT: N
1d6d0 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ext overflow pag
1d6e0 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20  e number */.){. 
1d6f0 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a   Pgno next = 0;.
1d700 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1d710 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d   = 0;.  int rc =
1d720 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
1d730 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1d740 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
1d750 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
1d760 74 28 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23  t(pPgnoNext);..#
1d770 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1d780 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1d790 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 74  /* Try to find t
1d7a0 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
1d7b0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73  the overflow lis
1d7c0 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a  t using the.  **
1d7d0 20 61 75 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e   autovacuum poin
1d7e0 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 20 47  ter-map pages. G
1d7f0 75 65 73 73 20 74 68 61 74 20 74 68 65 20 6e 65  uess that the ne
1d800 78 74 20 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a  xt page in .  **
1d810 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69   the overflow li
1d820 73 74 20 69 73 20 70 61 67 65 20 6e 75 6d 62 65  st is page numbe
1d830 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74  r (ovfl+1). If t
1d840 68 61 74 20 67 75 65 73 73 20 74 75 72 6e 73 20  hat guess turns 
1d850 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20  .  ** out to be 
1d860 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b  wrong, fall back
1d870 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65 20   to loading the 
1d880 64 61 74 61 20 6f 66 20 70 61 67 65 20 0a 20 20  data of page .  
1d890 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74  ** number ovfl t
1d8a0 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
1d8b0 6e 65 78 74 20 70 61 67 65 20 6e 75 6d 62 65 72  next page number
1d8c0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ..  */.  if( pBt
1d8d0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
1d8e0 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20      Pgno pgno;. 
1d8f0 20 20 20 50 67 6e 6f 20 69 47 75 65 73 73 20 3d     Pgno iGuess =
1d900 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20   ovfl+1;.    u8 
1d910 65 54 79 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c  eType;..    whil
1d920 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  e( PTRMAP_ISPAGE
1d930 28 70 42 74 2c 20 69 47 75 65 73 73 29 20 7c 7c  (pBt, iGuess) ||
1d940 20 69 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47   iGuess==PENDING
1d950 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1d960 29 7b 0a 20 20 20 20 20 20 69 47 75 65 73 73 2b  ){.      iGuess+
1d970 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  +;.    }..    if
1d980 28 20 69 47 75 65 73 73 3c 3d 62 74 72 65 65 50  ( iGuess<=btreeP
1d990 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b  agecount(pBt) ){
1d9a0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
1d9b0 61 70 47 65 74 28 70 42 74 2c 20 69 47 75 65 73  apGet(pBt, iGues
1d9c0 73 2c 20 26 65 54 79 70 65 2c 20 26 70 67 6e 6f  s, &eType, &pgno
1d9d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
1d9e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 54  =SQLITE_OK && eT
1d9f0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
1da00 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f  FLOW2 && pgno==o
1da10 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  vfl ){.        n
1da20 65 78 74 20 3d 20 69 47 75 65 73 73 3b 0a 20 20  ext = iGuess;.  
1da30 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1da40 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a  E_DONE;.      }.
1da50 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
1da60 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 65 78 74  ..  assert( next
1da70 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  ==0 || rc==SQLIT
1da80 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20  E_DONE );.  if( 
1da90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1daa0 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47  .    rc = btreeG
1dab0 65 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c  etPage(pBt, ovfl
1dac0 2c 20 26 70 50 61 67 65 2c 20 30 29 3b 0a 20 20  , &pPage, 0);.  
1dad0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
1dae0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
1daf0 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72  ==0 );.    if( r
1db00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1db10 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74        next = get
1db20 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
1db30 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ta);.    }.  }..
1db40 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e    *pPgnoNext = n
1db50 65 78 74 3b 0a 20 20 69 66 28 20 70 70 50 61 67  ext;.  if( ppPag
1db60 65 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65  e ){.    *ppPage
1db70 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73   = pPage;.  }els
1db80 65 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  e{.    releasePa
1db90 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20  ge(pPage);.  }. 
1dba0 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c   return (rc==SQL
1dbb0 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54  ITE_DONE ? SQLIT
1dbc0 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f  E_OK : rc);.}../
1dbd0 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 66  *.** Copy data f
1dbe0 72 6f 6d 20 61 20 62 75 66 66 65 72 20 74 6f 20  rom a buffer to 
1dbf0 61 20 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20  a page, or from 
1dc00 61 20 70 61 67 65 20 74 6f 20 61 20 62 75 66 66  a page to a buff
1dc10 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f  er..**.** pPaylo
1dc20 61 64 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ad is a pointer 
1dc30 74 6f 20 64 61 74 61 20 73 74 6f 72 65 64 20 6f  to data stored o
1dc40 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  n database page 
1dc50 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61  pDbPage..** If a
1dc60 72 67 75 6d 65 6e 74 20 65 4f 70 20 69 73 20 66  rgument eOp is f
1dc70 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79 74 65  alse, then nByte
1dc80 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 61   bytes of data a
1dc90 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f  re copied.** fro
1dca0 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f 20 74 68  m pPayload to th
1dcb0 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  e buffer pointed
1dcc0 20 61 74 20 62 79 20 70 42 75 66 2e 20 49 66 20   at by pBuf. If 
1dcd0 65 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20  eOp is true,.** 
1dce0 74 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67 65  then sqlite3Page
1dcf0 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c  rWrite() is call
1dd00 65 64 20 6f 6e 20 70 44 62 50 61 67 65 20 61 6e  ed on pDbPage an
1dd10 64 20 6e 42 79 74 65 20 62 79 74 65 73 0a 2a 2a  d nByte bytes.**
1dd20 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70   of data are cop
1dd30 69 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75 66  ied from the buf
1dd40 66 65 72 20 70 42 75 66 20 74 6f 20 70 50 61 79  fer pBuf to pPay
1dd50 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  load..**.** SQLI
1dd60 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1dd70 64 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 74  d on success, ot
1dd80 68 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72  herwise an error
1dd90 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
1dda0 20 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61 64   int copyPayload
1ddb0 28 0a 20 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f  (.  void *pPaylo
1ddc0 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ad,           /*
1ddd0 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   Pointer to page
1dde0 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20   data */.  void 
1ddf0 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
1de00 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1de10 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69  to buffer */.  i
1de20 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20  nt nByte,       
1de30 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1de40 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 63  er of bytes to c
1de50 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70  opy */.  int eOp
1de60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1de70 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20     /* 0 -> copy 
1de80 66 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20  from page, 1 -> 
1de90 63 6f 70 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a  copy to page */.
1dea0 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
1deb0 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e           /* P
1dec0 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70  age containing p
1ded0 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20  Payload */.){.  
1dee0 69 66 28 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f  if( eOp ){.    /
1def0 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
1df00 20 62 75 66 66 65 72 20 74 6f 20 70 61 67 65 20   buffer to page 
1df10 28 61 20 77 72 69 74 65 20 6f 70 65 72 61 74 69  (a write operati
1df20 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  on) */.    int r
1df30 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1df40 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a  Write(pDbPage);.
1df50 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1df60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1df70 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1df80 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c      memcpy(pPayl
1df90 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42 79 74 65  oad, pBuf, nByte
1dfa0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1dfb0 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f  /* Copy data fro
1dfc0 6d 20 70 61 67 65 20 74 6f 20 62 75 66 66 65 72  m page to buffer
1dfd0 20 28 61 20 72 65 61 64 20 6f 70 65 72 61 74 69   (a read operati
1dfe0 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70  on) */.    memcp
1dff0 79 28 70 42 75 66 2c 20 70 50 61 79 6c 6f 61 64  y(pBuf, pPayload
1e000 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20  , nByte);.  }.  
1e010 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1e020 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1e030 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
1e040 20 74 6f 20 72 65 61 64 20 6f 72 20 6f 76 65 72   to read or over
1e050 77 72 69 74 65 20 70 61 79 6c 6f 61 64 20 69 6e  write payload in
1e060 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72  formation.** for
1e070 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
1e080 74 68 65 20 70 43 75 72 20 63 75 72 73 6f 72 20  the pCur cursor 
1e090 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  is pointing to. 
1e0a0 49 66 20 74 68 65 20 65 4f 70 0a 2a 2a 20 70 61  If the eOp.** pa
1e0b0 72 61 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68  rameter is 0, th
1e0c0 69 73 20 69 73 20 61 20 72 65 61 64 20 6f 70 65  is is a read ope
1e0d0 72 61 74 69 6f 6e 20 28 64 61 74 61 20 63 6f 70  ration (data cop
1e0e0 69 65 64 20 69 6e 74 6f 0a 2a 2a 20 62 75 66 66  ied into.** buff
1e0f0 65 72 20 70 42 75 66 29 2e 20 49 66 20 69 74 20  er pBuf). If it 
1e100 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 20 77  is non-zero, a w
1e110 72 69 74 65 20 28 64 61 74 61 20 63 6f 70 69 65  rite (data copie
1e120 64 20 66 72 6f 6d 0a 2a 2a 20 62 75 66 66 65 72  d from.** buffer
1e130 20 70 42 75 66 29 2e 0a 2a 2a 0a 2a 2a 20 41 20   pBuf)..**.** A 
1e140 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62  total of "amt" b
1e150 79 74 65 73 20 61 72 65 20 72 65 61 64 20 6f 72  ytes are read or
1e160 20 77 72 69 74 74 65 6e 20 62 65 67 69 6e 6e 69   written beginni
1e170 6e 67 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a  ng at "offset"..
1e180 2a 2a 20 44 61 74 61 20 69 73 20 72 65 61 64 20  ** Data is read 
1e190 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 62  to or from the b
1e1a0 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a  uffer pBuf..**.*
1e1b0 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 62 65  * The content be
1e1c0 69 6e 67 20 72 65 61 64 20 6f 72 20 77 72 69 74  ing read or writ
1e1d0 74 65 6e 20 6d 69 67 68 74 20 61 70 70 65 61 72  ten might appear
1e1e0 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70 61 67   on the main pag
1e1f0 65 0a 2a 2a 20 6f 72 20 62 65 20 73 63 61 74 74  e.** or be scatt
1e200 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74  ered out on mult
1e210 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  iple overflow pa
1e220 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ges..**.** If th
1e230 65 20 42 74 43 75 72 73 6f 72 2e 69 73 49 6e 63  e BtCursor.isInc
1e240 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67  rblobHandle flag
1e250 20 69 73 20 73 65 74 2c 20 61 6e 64 20 74 68 65   is set, and the
1e260 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 75 72 73   current.** curs
1e270 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20 6f 6e  or entry uses on
1e280 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c  e or more overfl
1e290 6f 77 20 70 61 67 65 73 2c 20 74 68 69 73 20 66  ow pages, this f
1e2a0 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63  unction.** alloc
1e2b0 61 74 65 73 20 73 70 61 63 65 20 66 6f 72 20 61  ates space for a
1e2c0 6e 64 20 6c 61 7a 69 6c 79 20 70 6f 70 6c 75 61  nd lazily poplua
1e2d0 74 65 73 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  tes the overflow
1e2e0 20 70 61 67 65 2d 6c 69 73 74 20 0a 2a 2a 20 63   page-list .** c
1e2f0 61 63 68 65 20 61 72 72 61 79 20 28 42 74 43 75  ache array (BtCu
1e300 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e  rsor.aOverflow).
1e310 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   Subsequent call
1e320 73 20 75 73 65 20 74 68 69 73 0a 2a 2a 20 63 61  s use this.** ca
1e330 63 68 65 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b  che to make seek
1e340 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c  ing to the suppl
1e350 69 65 64 20 6f 66 66 73 65 74 20 6d 6f 72 65 20  ied offset more 
1e360 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a  efficient..**.**
1e370 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f   Once an overflo
1e380 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
1e390 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
1e3a0 61 74 65 64 2c 20 69 74 20 6d 61 79 20 62 65 0a  ated, it may be.
1e3b0 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 20 69  ** invalidated i
1e3c0 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 75 72  f some other cur
1e3d0 73 6f 72 20 77 72 69 74 65 73 20 74 6f 20 74 68  sor writes to th
1e3e0 65 20 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72  e same table, or
1e3f0 20 69 66 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f   if.** the curso
1e400 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 61 20  r is moved to a 
1e410 64 69 66 66 65 72 65 6e 74 20 72 6f 77 2e 20 41  different row. A
1e420 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20  dditionally, in 
1e430 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d  auto-vacuum.** m
1e440 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ode, the followi
1e450 6e 67 20 65 76 65 6e 74 73 20 6d 61 79 20 69 6e  ng events may in
1e460 76 61 6c 69 64 61 74 65 20 61 6e 20 6f 76 65 72  validate an over
1e470 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
1e480 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  ache..**.**   * 
1e490 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  An incremental v
1e4a0 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20  acuum,.**   * A 
1e4b0 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76  commit in auto_v
1e4c0 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64  acuum="full" mod
1e4d0 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74 69  e,.**   * Creati
1e4e0 6e 67 20 61 20 74 61 62 6c 65 20 28 6d 61 79 20  ng a table (may 
1e4f0 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61  require moving a
1e500 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 29  n overflow page)
1e510 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e520 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 0a 20  accessPayload(. 
1e530 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
1e540 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
1e550 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72  pointing to entr
1e560 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  y to read from *
1e570 2f 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c 20  /.  u32 offset, 
1e580 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69           /* Begi
1e590 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73 20 66  n reading this f
1e5a0 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20  ar into payload 
1e5b0 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20 20 20  */.  u32 amt,   
1e5c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61            /* Rea
1e5d0 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  d this many byte
1e5e0 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  s */.  unsigned 
1e5f0 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57  char *pBuf, /* W
1e600 72 69 74 65 20 74 68 65 20 62 79 74 65 73 20 69  rite the bytes i
1e610 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20  nto this buffer 
1e620 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20 20 20  */ .  int eOp   
1e630 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 65             /* ze
1e640 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d  ro to read. non-
1e650 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a  zero to write. *
1e660 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  /.){.  unsigned 
1e670 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a  char *aPayload;.
1e680 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1e690 45 5f 4f 4b 3b 0a 20 20 75 33 32 20 6e 4b 65 79  E_OK;.  u32 nKey
1e6a0 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30  ;.  int iIdx = 0
1e6b0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
1e6c0 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
1e6d0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 20  e[pCur->iPage]; 
1e6e0 2f 2a 20 42 74 72 65 65 20 70 61 67 65 20 6f 66  /* Btree page of
1e6f0 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20 2a   current entry *
1e700 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
1e710 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 20 20  t = pCur->pBt;  
1e720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e730 2f 2a 20 42 74 72 65 65 20 74 68 69 73 20 63 75  /* Btree this cu
1e740 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20  rsor belongs to 
1e750 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
1e760 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
1e770 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1e780 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
1e790 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
1e7a0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
1e7b0 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ]<pPage->nCell )
1e7c0 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
1e7d0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1e7e0 72 29 20 29 3b 0a 0a 20 20 67 65 74 43 65 6c 6c  r) );..  getCell
1e7f0 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50  Info(pCur);.  aP
1e800 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69  ayload = pCur->i
1e810 6e 66 6f 2e 70 43 65 6c 6c 20 2b 20 70 43 75 72  nfo.pCell + pCur
1e820 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a  ->info.nHeader;.
1e830 20 20 6e 4b 65 79 20 3d 20 28 70 50 61 67 65 2d    nKey = (pPage-
1e840 3e 69 6e 74 4b 65 79 20 3f 20 30 20 3a 20 28 69  >intKey ? 0 : (i
1e850 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  nt)pCur->info.nK
1e860 65 79 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45  ey);..  if( NEVE
1e870 52 28 6f 66 66 73 65 74 2b 61 6d 74 20 3e 20 6e  R(offset+amt > n
1e880 4b 65 79 2b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  Key+pCur->info.n
1e890 44 61 74 61 29 20 0a 20 20 20 7c 7c 20 26 61 50  Data) .   || &aP
1e8a0 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66  ayload[pCur->inf
1e8b0 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61  o.nLocal] > &pPa
1e8c0 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75  ge->aData[pBt->u
1e8d0 73 61 62 6c 65 53 69 7a 65 5d 0a 20 20 29 7b 0a  sableSize].  ){.
1e8e0 20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f      /* Trying to
1e8f0 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 70   read or write p
1e900 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
1e910 68 65 20 64 61 74 61 20 69 73 20 61 6e 20 65 72  he data is an er
1e920 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ror */.    retur
1e930 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1e940 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
1e950 20 43 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d   Check if data m
1e960 75 73 74 20 62 65 20 72 65 61 64 2f 77 72 69 74  ust be read/writ
1e970 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20  ten to/from the 
1e980 62 74 72 65 65 20 70 61 67 65 20 69 74 73 65 6c  btree page itsel
1e990 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73  f. */.  if( offs
1e9a0 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  et<pCur->info.nL
1e9b0 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  ocal ){.    int 
1e9c0 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28  a = amt;.    if(
1e9d0 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e   a+offset>pCur->
1e9e0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20  info.nLocal ){. 
1e9f0 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69       a = pCur->i
1ea00 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66  nfo.nLocal - off
1ea10 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  set;.    }.    r
1ea20 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  c = copyPayload(
1ea30 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74  &aPayload[offset
1ea40 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c  ], pBuf, a, eOp,
1ea50 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29   pPage->pDbPage)
1ea60 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30  ;.    offset = 0
1ea70 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b  ;.    pBuf += a;
1ea80 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20  .    amt -= a;. 
1ea90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73   }else{.    offs
1eaa0 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  et -= pCur->info
1eab0 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20 20  .nLocal;.  }..  
1eac0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1ead0 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20  K && amt>0 ){.  
1eae0 20 20 63 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c    const u32 ovfl
1eaf0 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Size = pBt->usab
1eb00 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20  leSize - 4;  /* 
1eb10 42 79 74 65 73 20 63 6f 6e 74 65 6e 74 20 70 65  Bytes content pe
1eb20 72 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20  r ovfl page */. 
1eb30 20 20 20 50 67 6e 6f 20 6e 65 78 74 50 61 67 65     Pgno nextPage
1eb40 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61 67 65 20  ;..    nextPage 
1eb50 3d 20 67 65 74 34 62 79 74 65 28 26 61 50 61 79  = get4byte(&aPay
1eb60 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e  load[pCur->info.
1eb70 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 23 69 66 6e 64  nLocal]);..#ifnd
1eb80 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
1eb90 4e 43 52 42 4c 4f 42 0a 20 20 20 20 2f 2a 20 49  NCRBLOB.    /* I
1eba0 66 20 74 68 65 20 69 73 49 6e 63 72 62 6c 6f 62  f the isIncrblob
1ebb0 48 61 6e 64 6c 65 20 66 6c 61 67 20 69 73 20 73  Handle flag is s
1ebc0 65 74 20 61 6e 64 20 74 68 65 20 42 74 43 75 72  et and the BtCur
1ebd0 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 0a  sor.aOverflow[].
1ebe0 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62      ** has not b
1ebf0 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61  een allocated, a
1ec00 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e 20  llocate it now. 
1ec10 54 68 65 20 61 72 72 61 79 20 69 73 20 73 69 7a  The array is siz
1ec20 65 64 20 61 74 0a 20 20 20 20 2a 2a 20 6f 6e 65  ed at.    ** one
1ec30 20 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20   entry for each 
1ec40 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
1ec50 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68   the overflow ch
1ec60 61 69 6e 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20  ain. The.    ** 
1ec70 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
1ec80 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f  he first overflo
1ec90 77 20 70 61 67 65 20 69 73 20 73 74 6f 72 65 64  w page is stored
1eca0 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d   in aOverflow[0]
1ecb0 2c 0a 20 20 20 20 2a 2a 20 65 74 63 2e 20 41 20  ,.    ** etc. A 
1ecc0 76 61 6c 75 65 20 6f 66 20 30 20 69 6e 20 74 68  value of 0 in th
1ecd0 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72  e aOverflow[] ar
1ece0 72 61 79 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79  ray means "not y
1ecf0 65 74 20 6b 6e 6f 77 6e 22 0a 20 20 20 20 2a 2a  et known".    **
1ed00 20 28 74 68 65 20 63 61 63 68 65 20 69 73 20 6c   (the cache is l
1ed10 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 64 29  azily populated)
1ed20 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1ed30 20 70 43 75 72 2d 3e 69 73 49 6e 63 72 62 6c 6f   pCur->isIncrblo
1ed40 62 48 61 6e 64 6c 65 20 26 26 20 21 70 43 75 72  bHandle && !pCur
1ed50 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ->aOverflow ){. 
1ed60 20 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d       int nOvfl =
1ed70 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61   (pCur->info.nPa
1ed80 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f  yload-pCur->info
1ed90 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65  .nLocal+ovflSize
1eda0 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20  -1)/ovflSize;.  
1edb0 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66      pCur->aOverf
1edc0 6c 6f 77 20 3d 20 28 50 67 6e 6f 20 2a 29 73 71  low = (Pgno *)sq
1edd0 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
1ede0 73 69 7a 65 6f 66 28 50 67 6e 6f 29 2a 6e 4f 76  sizeof(Pgno)*nOv
1edf0 66 6c 29 3b 0a 20 20 20 20 20 20 2f 2a 20 6e 4f  fl);.      /* nO
1ee00 76 66 6c 20 69 73 20 61 6c 77 61 79 73 20 70 6f  vfl is always po
1ee10 73 69 74 69 76 65 2e 20 20 49 66 20 69 74 20 77  sitive.  If it w
1ee20 65 72 65 20 7a 65 72 6f 2c 20 66 65 74 63 68 50  ere zero, fetchP
1ee30 61 79 6c 6f 61 64 20 77 6f 75 6c 64 20 68 61 76  ayload would hav
1ee40 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 65 6e 20  e.      ** been 
1ee50 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20  used instead of 
1ee60 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 2a 2f  this routine. */
1ee70 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59  .      if( ALWAY
1ee80 53 28 6e 4f 76 66 6c 29 20 26 26 20 21 70 43 75  S(nOvfl) && !pCu
1ee90 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  r->aOverflow ){.
1eea0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1eeb0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
1eec0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1eed0 20 49 66 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   If the overflow
1eee0 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
1eef0 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
1ef00 74 65 64 20 61 6e 64 20 74 68 65 0a 20 20 20 20  ted and the.    
1ef10 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ** entry for the
1ef20 20 66 69 72 73 74 20 72 65 71 75 69 72 65 64 20   first required 
1ef30 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73  overflow page is
1ef40 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20   valid, skip.   
1ef50 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20   ** directly to 
1ef60 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  it..    */.    i
1ef70 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  f( pCur->aOverfl
1ef80 6f 77 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65  ow && pCur->aOve
1ef90 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66  rflow[offset/ovf
1efa0 6c 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20  lSize] ){.      
1efb0 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f  iIdx = (offset/o
1efc0 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  vflSize);.      
1efd0 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d  nextPage = pCur-
1efe0 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
1eff0 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d  ;.      offset =
1f000 20 28 6f 66 66 73 65 74 25 6f 76 66 6c 53 69 7a   (offset%ovflSiz
1f010 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  e);.    }.#endif
1f020 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20 72 63 3d  ..    for( ; rc=
1f030 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d  =SQLITE_OK && am
1f040 74 3e 30 20 26 26 20 6e 65 78 74 50 61 67 65 3b  t>0 && nextPage;
1f050 20 69 49 64 78 2b 2b 29 7b 0a 0a 23 69 66 6e 64   iIdx++){..#ifnd
1f060 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
1f070 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 20 2f 2a  NCRBLOB.      /*
1f080 20 49 66 20 72 65 71 75 69 72 65 64 2c 20 70 6f   If required, po
1f090 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66  pulate the overf
1f0a0 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
1f0b0 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  che. */.      if
1f0c0 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  ( pCur->aOverflo
1f0d0 77 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  w ){.        ass
1f0e0 65 72 74 28 21 70 43 75 72 2d 3e 61 4f 76 65 72  ert(!pCur->aOver
1f0f0 66 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c 20 70 43  flow[iIdx] || pC
1f100 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
1f110 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65 29 3b 0a  dx]==nextPage);.
1f120 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f          pCur->aO
1f130 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20  verflow[iIdx] = 
1f140 6e 65 78 74 50 61 67 65 3b 0a 20 20 20 20 20 20  nextPage;.      
1f150 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  }.#endif..      
1f160 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c  if( offset>=ovfl
1f170 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
1f180 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73  /* The only reas
1f190 6f 6e 20 74 6f 20 72 65 61 64 20 74 68 69 73 20  on to read this 
1f1a0 70 61 67 65 20 69 73 20 74 6f 20 6f 62 74 61 69  page is to obtai
1f1b0 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  n the page.     
1f1c0 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72     ** number for
1f1d0 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
1f1e0 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  n the overflow c
1f1f0 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65 0a 20  hain. The page. 
1f200 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 69         ** data i
1f210 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 20  s not required. 
1f220 53 6f 20 66 69 72 73 74 20 74 72 79 20 74 6f 20  So first try to 
1f230 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65 72 66  lookup the overf
1f240 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  low.        ** p
1f250 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2c 20  age-list cache, 
1f260 69 66 20 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c  if any, then fal
1f270 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20 67 65  l back to the ge
1f280 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 29 0a  tOverflowPage().
1f290 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74          ** funct
1f2a0 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ion..        */.
1f2b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1f2c0 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20  MIT_INCRBLOB.   
1f2d0 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61       if( pCur->a
1f2e0 4f 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75 72  Overflow && pCur
1f2f0 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
1f300 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  +1] ){.         
1f310 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72   nextPage = pCur
1f320 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
1f330 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d 20 65  +1];.        } e
1f340 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20 20 20 20  lse .#endif.    
1f350 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76        rc = getOv
1f360 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20  erflowPage(pBt, 
1f370 6e 65 78 74 50 61 67 65 2c 20 30 2c 20 26 6e 65  nextPage, 0, &ne
1f380 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  xtPage);.       
1f390 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53   offset -= ovflS
1f3a0 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ize;.      }else
1f3b0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65  {.        /* Nee
1f3c0 64 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70  d to read this p
1f3d0 61 67 65 20 70 72 6f 70 65 72 6c 79 2e 20 49 74  age properly. It
1f3e0 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f   contains some o
1f3f0 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  f the.        **
1f400 20 72 61 6e 67 65 20 6f 66 20 64 61 74 61 20 74   range of data t
1f410 68 61 74 20 69 73 20 62 65 69 6e 67 20 72 65 61  hat is being rea
1f420 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72  d (eOp==0) or wr
1f430 69 74 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a  itten (eOp!=0)..
1f440 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1f450 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61     DbPage *pDbPa
1f460 67 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ge;.        int 
1f470 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20 20  a = amt;.       
1f480 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1f490 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
1f4a0 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70 44  r, nextPage, &pD
1f4b0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
1f4c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1f4d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  K ){.          a
1f4e0 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65  Payload = sqlite
1f4f0 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
1f500 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
1f510 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74    nextPage = get
1f520 34 62 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b  4byte(aPayload);
1f530 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61  .          if( a
1f540 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c   + offset > ovfl
1f550 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
1f560 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65      a = ovflSize
1f570 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20   - offset;.     
1f580 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1f590 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61   rc = copyPayloa
1f5a0 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73  d(&aPayload[offs
1f5b0 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20  et+4], pBuf, a, 
1f5c0 65 4f 70 2c 20 70 44 62 50 61 67 65 29 3b 0a 20  eOp, pDbPage);. 
1f5d0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1f5e0 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
1f5f0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f  ge);.          o
1f600 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
1f610 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20       amt -= a;. 
1f620 20 20 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d           pBuf +=
1f630 20 61 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   a;.        }.  
1f640 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1f650 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1f660 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b  E_OK && amt>0 ){
1f670 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1f680 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1f690 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1f6a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
1f6b0 70 61 72 74 20 6f 66 20 74 68 65 20 6b 65 79 20  part of the key 
1f6c0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1f6d0 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78  cursor pCur.  Ex
1f6e0 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62  actly.** "amt" b
1f6f0 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61  ytes will be tra
1f700 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75  nsfered into pBu
1f710 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66  f[].  The transf
1f720 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20  er.** begins at 
1f730 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20  "offset"..**.** 
1f740 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  The caller must 
1f750 65 6e 73 75 72 65 20 74 68 61 74 20 70 43 75 72  ensure that pCur
1f760 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20   is pointing to 
1f770 61 20 76 61 6c 69 64 20 72 6f 77 0a 2a 2a 20 69  a valid row.** i
1f780 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a  n the table..**.
1f790 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
1f7a0 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
1f7b0 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
1f7c0 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
1f7d0 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65  .** wrong.  An e
1f7e0 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
1f7f0 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22   if "offset+amt"
1f800 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a   is larger than.
1f810 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65  ** the available
1f820 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74   payload..*/.int
1f830 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
1f840 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
1f850 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32   u32 offset, u32
1f860 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66   amt, void *pBuf
1f870 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
1f880 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1f890 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
1f8a0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1f8b0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
1f8c0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
1f8d0 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d  Page>=0 && pCur-
1f8e0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1f8f0 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74  age] );.  assert
1f900 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
1f910 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d  ur->iPage]<pCur-
1f920 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1f930 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  age]->nCell );. 
1f940 20 72 65 74 75 72 6e 20 61 63 63 65 73 73 50 61   return accessPa
1f950 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73  yload(pCur, offs
1f960 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e  et, amt, (unsign
1f970 65 64 20 63 68 61 72 2a 29 70 42 75 66 2c 20 30  ed char*)pBuf, 0
1f980 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  );.}../*.** Read
1f990 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
1f9a0 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  a associated wit
1f9b0 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20  h cursor pCur.  
1f9c0 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22  Exactly.** "amt"
1f9d0 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74   bytes will be t
1f9e0 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70  ransfered into p
1f9f0 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e  Buf[].  The tran
1fa00 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61  sfer.** begins a
1fa10 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a  t "offset"..**.*
1fa20 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
1fa30 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  OK on success or
1fa40 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
1fa50 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a  f anything goes.
1fa60 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72  ** wrong.  An er
1fa70 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20  ror is returned 
1fa80 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20  if "offset+amt" 
1fa90 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a  is larger than.*
1faa0 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20  * the available 
1fab0 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20  payload..*/.int 
1fac0 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61  sqlite3BtreeData
1fad0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
1fae0 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32   u32 offset, u32
1faf0 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66   amt, void *pBuf
1fb00 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69  ){.  int rc;..#i
1fb10 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1fb20 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 69 66 20  T_INCRBLOB.  if 
1fb30 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1fb40 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
1fb50 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1fb60 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 23  ITE_ABORT;.  }.#
1fb70 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
1fb80 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1fb90 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  x(pCur) );.  rc 
1fba0 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
1fbb0 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
1fbc0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1fbd0 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
1fbe0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1fbf0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
1fc00 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
1fc10 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43  ->iPage>=0 && pC
1fc20 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
1fc30 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 20 20 61  >iPage] );.    a
1fc40 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
1fc50 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
1fc60 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
1fc70 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
1fc80 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 63 63   );.    rc = acc
1fc90 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  essPayload(pCur,
1fca0 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42   offset, amt, pB
1fcb0 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  uf, 0);.  }.  re
1fcc0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1fcd0 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
1fce0 65 72 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e  er to payload in
1fcf0 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
1fd00 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68  he entry that th
1fd10 65 20 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f  e .** pCur curso
1fd20 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
1fd30 2e 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69  .  The pointer i
1fd40 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  s to the beginni
1fd50 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79  ng of.** the key
1fd60 20 69 66 20 73 6b 69 70 4b 65 79 3d 3d 30 20 61   if skipKey==0 a
1fd70 6e 64 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  nd it points to 
1fd80 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
1fd90 20 64 61 74 61 20 69 66 0a 2a 2a 20 73 6b 69 70   data if.** skip
1fda0 4b 65 79 3d 3d 31 2e 20 20 54 68 65 20 6e 75 6d  Key==1.  The num
1fdb0 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
1fdc0 61 76 61 69 6c 61 62 6c 65 20 6b 65 79 2f 64 61  available key/da
1fdd0 74 61 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a  ta is written.**
1fde0 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66   into *pAmt.  If
1fdf0 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20   *pAmt==0, then 
1fe00 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
1fe10 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 0a 2a  ed will not be.*
1fe20 2a 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65  * a valid pointe
1fe30 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  r..**.** This ro
1fe40 75 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69  utine is an opti
1fe50 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73  mization.  It is
1fe60 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20   common for the 
1fe70 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e  entire key.** an
1fe80 64 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e  d data to fit on
1fe90 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20   the local page 
1fea0 61 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f  and for there to
1feb0 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a   be no overflow.
1fec0 2a 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20  ** pages.  When 
1fed0 74 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73  that is so, this
1fee0 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20   routine can be 
1fef0 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 74  used to access t
1ff00 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61  he.** key and da
1ff10 74 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e  ta without makin
1ff20 67 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68  g a copy.  If th
1ff30 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74  e key and/or dat
1ff40 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f  a spills.** onto
1ff50 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c   overflow pages,
1ff60 20 74 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c   then accessPayl
1ff70 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20 75 73  oad() must be us
1ff80 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 65  ed to reassemble
1ff90 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61  .** the key/data
1ffa0 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74   and copy it int
1ffb0 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64  o a preallocated
1ffc0 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54   buffer..**.** T
1ffd0 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
1ffe0 6e 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74  ned by this rout
1fff0 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74  ine looks direct
20000 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  ly into the cach
20010 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68  ed.** page of th
20020 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65  e database.  The
20030 20 64 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e   data might chan
20040 67 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e  ge or move the n
20050 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20  ext time.** any 
20060 62 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73  btree routine is
20070 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74   called..*/.stat
20080 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
20090 64 20 63 68 61 72 20 2a 66 65 74 63 68 50 61 79  d char *fetchPay
200a0 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72  load(.  BtCursor
200b0 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20   *pCur,      /* 
200c0 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  Cursor pointing 
200d0 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64  to entry to read
200e0 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a   from */.  int *
200f0 70 41 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20  pAmt,           
20100 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d  /* Write the num
20110 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  ber of available
20120 20 62 79 74 65 73 20 68 65 72 65 20 2a 2f 0a 20   bytes here */. 
20130 20 69 6e 74 20 73 6b 69 70 4b 65 79 20 20 20 20   int skipKey    
20140 20 20 20 20 20 20 2f 2a 20 72 65 61 64 20 62 65        /* read be
20150 67 69 6e 6e 69 6e 67 20 61 74 20 64 61 74 61 20  ginning at data 
20160 69 66 20 74 68 69 73 20 69 73 20 74 72 75 65 20  if this is true 
20170 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  */.){.  unsigned
20180 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b   char *aPayload;
20190 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
201a0 65 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20  e;.  u32 nKey;. 
201b0 20 75 33 32 20 6e 4c 6f 63 61 6c 3b 0a 0a 20 20   u32 nLocal;..  
201c0 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20  assert( pCur!=0 
201d0 26 26 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  && pCur->iPage>=
201e0 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67  0 && pCur->apPag
201f0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b  e[pCur->iPage]);
20200 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
20210 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
20220 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
20230 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
20240 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 70  tex(pCur) );.  p
20250 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
20260 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
20270 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
20280 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
20290 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  age]<pPage->nCel
202a0 6c 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  l );.  if( NEVER
202b0 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a  (pCur->info.nSiz
202c0 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 62 74 72  e==0) ){.    btr
202d0 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72  eeParseCell(pCur
202e0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
202f0 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49  Page], pCur->aiI
20300 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2c  dx[pCur->iPage],
20310 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20320 20 20 20 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29      &pCur->info)
20330 3b 0a 20 20 7d 0a 20 20 61 50 61 79 6c 6f 61 64  ;.  }.  aPayload
20340 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43   = pCur->info.pC
20350 65 6c 6c 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20  ell;.  aPayload 
20360 2b 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48  += pCur->info.nH
20370 65 61 64 65 72 3b 0a 20 20 69 66 28 20 70 50 61  eader;.  if( pPa
20380 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
20390 20 20 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 65    nKey = 0;.  }e
203a0 6c 73 65 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20  lse{.    nKey = 
203b0 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e  (int)pCur->info.
203c0 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20  nKey;.  }.  if( 
203d0 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20 20 61  skipKey ){.    a
203e0 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b  Payload += nKey;
203f0 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43  .    nLocal = pC
20400 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
20410 2d 20 6e 4b 65 79 3b 0a 20 20 7d 65 6c 73 65 7b  - nKey;.  }else{
20420 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43  .    nLocal = pC
20430 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b  ur->info.nLocal;
20440 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4c 6f  .    assert( nLo
20450 63 61 6c 3c 3d 6e 4b 65 79 20 29 3b 0a 20 20 7d  cal<=nKey );.  }
20460 0a 20 20 2a 70 41 6d 74 20 3d 20 6e 4c 6f 63 61  .  *pAmt = nLoca
20470 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 50 61 79  l;.  return aPay
20480 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  load;.}.../*.** 
20490 46 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68  For the entry th
204a0 61 74 20 63 75 72 73 6f 72 20 70 43 75 72 20 69  at cursor pCur i
204b0 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75  s point to, retu
204c0 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79  rn as.** many by
204d0 74 65 73 20 6f 66 20 74 68 65 20 6b 65 79 20 6f  tes of the key o
204e0 72 20 64 61 74 61 20 61 73 20 61 72 65 20 61 76  r data as are av
204f0 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c  ailable on the l
20500 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70  ocal.** b-tree p
20510 61 67 65 2e 20 20 57 72 69 74 65 20 74 68 65 20  age.  Write the 
20520 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61  number of availa
20530 62 6c 65 20 62 79 74 65 73 20 69 6e 74 6f 20 2a  ble bytes into *
20540 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  pAmt..**.** The 
20550 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64  pointer returned
20560 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20   is ephemeral.  
20570 54 68 65 20 6b 65 79 2f 64 61 74 61 20 6d 61 79  The key/data may
20580 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64   move.** or be d
20590 65 73 74 72 6f 79 65 64 20 6f 6e 20 74 68 65 20  estroyed on the 
205a0 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79  next call to any
205b0 20 42 74 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a   Btree routine,.
205c0 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c  ** including cal
205d0 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 74 68  ls from other th
205e0 72 65 61 64 73 20 61 67 61 69 6e 73 74 20 74 68  reads against th
205f0 65 20 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a  e same cache..**
20600 20 48 65 6e 63 65 2c 20 61 20 6d 75 74 65 78 20   Hence, a mutex 
20610 6f 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 20  on the BtShared 
20620 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 70  should be held p
20630 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a  rior to calling.
20640 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ** this routine.
20650 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75  .**.** These rou
20660 74 69 6e 65 73 20 69 73 20 75 73 65 64 20 74 6f  tines is used to
20670 20 67 65 74 20 71 75 69 63 6b 20 61 63 63 65 73   get quick acces
20680 73 20 74 6f 20 6b 65 79 20 61 6e 64 20 64 61 74  s to key and dat
20690 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d  a.** in the comm
206a0 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 6e 6f  on case where no
206b0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
206c0 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e  are used..*/.con
206d0 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  st void *sqlite3
206e0 42 74 72 65 65 4b 65 79 46 65 74 63 68 28 42 74  BtreeKeyFetch(Bt
206f0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
20700 74 20 2a 70 41 6d 74 29 7b 0a 20 20 63 6f 6e 73  t *pAmt){.  cons
20710 74 20 76 6f 69 64 20 2a 70 20 3d 20 30 3b 0a 20  t void *p = 0;. 
20720 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
20730 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
20740 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
20750 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
20760 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
20770 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69 66  ex(pCur) );.  if
20780 28 20 41 4c 57 41 59 53 28 70 43 75 72 2d 3e 65  ( ALWAYS(pCur->e
20790 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
207a0 4c 49 44 29 20 29 7b 0a 20 20 20 20 70 20 3d 20  LID) ){.    p = 
207b0 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65 74  (const void*)fet
207c0 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  chPayload(pCur, 
207d0 70 41 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  pAmt, 0);.  }.  
207e0 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 63 6f 6e 73  return p;.}.cons
207f0 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42  t void *sqlite3B
20800 74 72 65 65 44 61 74 61 46 65 74 63 68 28 42 74  treeDataFetch(Bt
20810 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
20820 74 20 2a 70 41 6d 74 29 7b 0a 20 20 63 6f 6e 73  t *pAmt){.  cons
20830 74 20 76 6f 69 64 20 2a 70 20 3d 20 30 3b 0a 20  t void *p = 0;. 
20840 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
20850 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
20860 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
20870 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
20880 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
20890 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69 66  ex(pCur) );.  if
208a0 28 20 41 4c 57 41 59 53 28 70 43 75 72 2d 3e 65  ( ALWAYS(pCur->e
208b0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
208c0 4c 49 44 29 20 29 7b 0a 20 20 20 20 70 20 3d 20  LID) ){.    p = 
208d0 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65 74  (const void*)fet
208e0 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  chPayload(pCur, 
208f0 70 41 6d 74 2c 20 31 29 3b 0a 20 20 7d 0a 20 20  pAmt, 1);.  }.  
20900 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 0a 2f 2a  return p;.}.../*
20910 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
20920 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65  sor down to a ne
20930 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54  w child page.  T
20940 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d  he newPgno argum
20950 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 70 61  ent is the.** pa
20960 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
20970 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20 6d   child page to m
20980 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68  ove to..**.** Th
20990 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
209a0 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  rns SQLITE_CORRU
209b0 50 54 20 69 66 20 74 68 65 20 70 61 67 65 2d 68  PT if the page-h
209c0 65 61 64 65 72 20 66 6c 61 67 73 20 66 69 65 6c  eader flags fiel
209d0 64 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20  d of.** the new 
209e0 63 68 69 6c 64 20 70 61 67 65 20 64 6f 65 73 20  child page does 
209f0 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 66 6c  not match the fl
20a00 61 67 73 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ags field of the
20a10 20 70 61 72 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a   parent (i.e..**
20a20 20 69 66 20 61 6e 20 69 6e 74 6b 65 79 20 70 61   if an intkey pa
20a30 67 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  ge appears to be
20a40 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 61   the parent of a
20a50 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70 61 67 65   non-intkey page
20a60 2c 20 6f 72 0a 2a 2a 20 76 69 63 65 2d 76 65 72  , or.** vice-ver
20a70 73 61 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  sa)..*/.static i
20a80 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42  nt moveToChild(B
20a90 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
20aa0 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 69  32 newPgno){.  i
20ab0 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 20 3d  nt rc;.  int i =
20ac0 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20   pCur->iPage;.  
20ad0 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 50 61 67  MemPage *pNewPag
20ae0 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e;.  BtShared *p
20af0 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a  Bt = pCur->pBt;.
20b00 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
20b10 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
20b20 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
20b30 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
20b40 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
20b50 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
20b60 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f  ge<BTCURSOR_MAX_
20b70 44 45 50 54 48 20 29 3b 0a 20 20 69 66 28 20 70  DEPTH );.  if( p
20b80 43 75 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43  Cur->iPage>=(BTC
20b90 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d  URSOR_MAX_DEPTH-
20ba0 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  1) ){.    return
20bb0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
20bc0 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  BKPT;.  }.  rc =
20bd0 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
20be0 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70  pBt, newPgno, &p
20bf0 4e 65 77 50 61 67 65 29 3b 0a 20 20 69 66 28 20  NewPage);.  if( 
20c00 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
20c10 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69    pCur->apPage[i
20c20 2b 31 5d 20 3d 20 70 4e 65 77 50 61 67 65 3b 0a  +1] = pNewPage;.
20c30 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 2b    pCur->aiIdx[i+
20c40 31 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  1] = 0;.  pCur->
20c50 69 50 61 67 65 2b 2b 3b 0a 0a 20 20 70 43 75 72  iPage++;..  pCur
20c60 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
20c70 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e  ;.  pCur->validN
20c80 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Key = 0;.  if( p
20c90 4e 65 77 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31  NewPage->nCell<1
20ca0 20 7c 7c 20 70 4e 65 77 50 61 67 65 2d 3e 69 6e   || pNewPage->in
20cb0 74 4b 65 79 21 3d 70 43 75 72 2d 3e 61 70 50 61  tKey!=pCur->apPa
20cc0 67 65 5b 69 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b  ge[i]->intKey ){
20cd0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
20ce0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
20cf0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
20d00 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e  LITE_OK;.}..#ifn
20d10 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a  def NDEBUG./*.**
20d20 20 50 61 67 65 20 70 50 61 72 65 6e 74 20 69 73   Page pParent is
20d30 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28 6e 6f   an internal (no
20d40 6e 2d 6c 65 61 66 29 20 74 72 65 65 20 70 61 67  n-leaf) tree pag
20d50 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
20d60 20 0a 2a 2a 20 61 73 73 65 72 74 73 20 74 68 61   .** asserts tha
20d70 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43  t page number iC
20d80 68 69 6c 64 20 69 73 20 74 68 65 20 6c 65 66 74  hild is the left
20d90 2d 63 68 69 6c 64 20 69 66 20 74 68 65 20 69 49  -child if the iI
20da0 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e  dx'th.** cell in
20db0 20 70 61 67 65 20 70 50 61 72 65 6e 74 2e 20 4f   page pParent. O
20dc0 72 2c 20 69 66 20 69 49 64 78 20 69 73 20 65 71  r, if iIdx is eq
20dd0 75 61 6c 20 74 6f 20 74 68 65 20 74 6f 74 61 6c  ual to the total
20de0 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65   number of.** ce
20df0 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 2c 20  lls in pParent, 
20e00 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72  that page number
20e10 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 72   iChild is the r
20e20 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a  ight-child of.**
20e30 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74   the page..*/.st
20e40 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74  atic void assert
20e50 50 61 72 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50  ParentIndex(MemP
20e60 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e  age *pParent, in
20e70 74 20 69 49 64 78 2c 20 50 67 6e 6f 20 69 43 68  t iIdx, Pgno iCh
20e80 69 6c 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ild){.  assert( 
20e90 69 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e  iIdx<=pParent->n
20ea0 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 69 49  Cell );.  if( iI
20eb0 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65  dx==pParent->nCe
20ec0 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ll ){.    assert
20ed0 28 20 67 65 74 34 62 79 74 65 28 26 70 50 61 72  ( get4byte(&pPar
20ee0 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65  ent->aData[pPare
20ef0 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  nt->hdrOffset+8]
20f00 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d  )==iChild );.  }
20f10 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
20f20 28 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  ( get4byte(findC
20f30 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 49 64  ell(pParent, iId
20f40 78 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20  x))==iChild );. 
20f50 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65   }.}.#else.#  de
20f60 66 69 6e 65 20 61 73 73 65 72 74 50 61 72 65 6e  fine assertParen
20f70 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23  tIndex(x,y,z) .#
20f80 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  endif../*.** Mov
20f90 65 20 74 68 65 20 63 75 72 73 6f 72 20 75 70 20  e the cursor up 
20fa0 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  to the parent pa
20fb0 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e  ge..**.** pCur->
20fc0 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 74 68  idx is set to th
20fd0 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61  e cell index tha
20fe0 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70  t contains the p
20ff0 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
21000 20 70 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d   page we are com
21010 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65  ing from.  If we
21020 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d   are coming from
21030 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f   the.** right-mo
21040 73 74 20 63 68 69 6c 64 20 70 61 67 65 20 74 68  st child page th
21050 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20  en pCur->idx is 
21060 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20  set to one more 
21070 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67  than.** the larg
21080 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a  est cell index..
21090 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
210a0 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74 43 75  oveToParent(BtCu
210b0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
210c0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
210d0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
210e0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
210f0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
21100 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
21110 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30  t( pCur->iPage>0
21120 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
21130 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
21140 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73  >iPage] );.  ass
21150 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 0a  ertParentIndex(.
21160 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65      pCur->apPage
21170 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c  [pCur->iPage-1],
21180 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64   .    pCur->aiId
21190 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  x[pCur->iPage-1]
211a0 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50  , .    pCur->apP
211b0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
211c0 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20 20 72 65  ->pgno.  );.  re
211d0 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
211e0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
211f0 67 65 5d 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50  ge]);.  pCur->iP
21200 61 67 65 2d 2d 3b 0a 20 20 70 43 75 72 2d 3e 69  age--;.  pCur->i
21210 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
21220 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
21230 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d   = 0;.}../*.** M
21240 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
21250 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72  o point to the r
21260 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 74 73 20  oot page of its 
21270 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
21280 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74  ..**.** If the t
21290 61 62 6c 65 20 68 61 73 20 61 20 76 69 72 74 75  able has a virtu
212a0 61 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68  al root page, th
212b0 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  en the cursor is
212c0 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74 0a   moved to point.
212d0 2a 2a 20 74 6f 20 74 68 65 20 76 69 72 74 75 61  ** to the virtua
212e0 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 73 74  l root page inst
212f0 65 61 64 20 6f 66 20 74 68 65 20 61 63 74 75 61  ead of the actua
21300 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 41 20 74  l root page. A t
21310 61 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76 69  able has a.** vi
21320 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  rtual root page 
21330 77 68 65 6e 20 74 68 65 20 61 63 74 75 61 6c 20  when the actual 
21340 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74 61 69  root page contai
21350 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64 20  ns no cells and 
21360 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68 69  a .** single chi
21370 6c 64 20 70 61 67 65 2e 20 54 68 69 73 20 63 61  ld page. This ca
21380 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77 69  n only happen wi
21390 74 68 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f  th the table roo
213a0 74 65 64 20 61 74 20 70 61 67 65 20 31 2e 0a 2a  ted at page 1..*
213b0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d 74 72  *.** If the b-tr
213c0 65 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ee structure is 
213d0 65 6d 70 74 79 2c 20 74 68 65 20 63 75 72 73 6f  empty, the curso
213e0 72 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74  r state is set t
213f0 6f 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e 56  o .** CURSOR_INV
21400 41 4c 49 44 2e 20 4f 74 68 65 72 77 69 73 65 2c  ALID. Otherwise,
21410 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 73   the cursor is s
21420 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  et to point to t
21430 68 65 20 66 69 72 73 74 0a 2a 2a 20 63 65 6c 6c  he first.** cell
21440 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20   located on the 
21450 72 6f 6f 74 20 28 6f 72 20 76 69 72 74 75 61 6c  root (or virtual
21460 20 72 6f 6f 74 29 20 70 61 67 65 20 61 6e 64 20   root) page and 
21470 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65  the cursor state
21480 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 43 55  .** is set to CU
21490 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a  RSOR_VALID..**.*
214a0 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69  * If this functi
214b0 6f 6e 20 72 65 74 75 72 6e 73 20 73 75 63 63 65  on returns succe
214c0 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d 61 79 20  ssfully, it may 
214d0 62 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  be assumed that 
214e0 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68 65 61 64  the.** page-head
214f0 65 72 20 66 6c 61 67 73 20 69 6e 64 69 63 61 74  er flags indicat
21500 65 20 74 68 61 74 20 74 68 65 20 5b 76 69 72 74  e that the [virt
21510 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67 65 20 69  ual] root-page i
21520 73 20 74 68 65 20 65 78 70 65 63 74 65 64 20 0a  s the expected .
21530 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d 74 72 65  ** kind of b-tre
21540 65 20 70 61 67 65 20 28 69 2e 65 2e 20 69 66 20  e page (i.e. if 
21550 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65  when opening the
21560 20 63 75 72 73 6f 72 20 74 68 65 20 63 61 6c 6c   cursor the call
21570 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a 20 73 70  er did not.** sp
21580 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20  ecify a KeyInfo 
21590 73 74 72 75 63 74 75 72 65 20 74 68 65 20 66 6c  structure the fl
215a0 61 67 73 20 62 79 74 65 20 69 73 20 73 65 74 20  ags byte is set 
215b0 74 6f 20 30 78 30 35 20 6f 72 20 30 78 30 44 2c  to 0x05 or 0x0D,
215c0 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 61  .** indicating a
215d0 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 20 6f   table b-tree, o
215e0 72 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72 20  r if the caller 
215f0 64 69 64 20 73 70 65 63 69 66 79 20 61 20 4b 65  did specify a Ke
21600 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74  yInfo .** struct
21610 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62 79  ure the flags by
21620 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78 30  te is set to 0x0
21630 32 20 6f 72 20 30 78 30 41 2c 20 69 6e 64 69 63  2 or 0x0A, indic
21640 61 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 0a 2a  ating an index.*
21650 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73 74  * b-tree)..*/.st
21660 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52  atic int moveToR
21670 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  oot(BtCursor *pC
21680 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ur){.  MemPage *
21690 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20  pRoot;.  int rc 
216a0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42  = SQLITE_OK;.  B
216b0 74 72 65 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e  tree *p = pCur->
216c0 70 42 74 72 65 65 3b 0a 20 20 42 74 53 68 61 72  pBtree;.  BtShar
216d0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
216e0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
216f0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
21700 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
21710 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20   CURSOR_INVALID 
21720 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  < CURSOR_REQUIRE
21730 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  SEEK );.  assert
21740 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 20  ( CURSOR_VALID  
21750 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   < CURSOR_REQUIR
21760 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72  ESEEK );.  asser
21770 74 28 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  t( CURSOR_FAULT 
21780 20 20 3e 20 43 55 52 53 4f 52 5f 52 45 51 55 49    > CURSOR_REQUI
21790 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20  RESEEK );.  if( 
217a0 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55  pCur->eState>=CU
217b0 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
217c0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72   ){.    if( pCur
217d0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
217e0 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 20 20  _FAULT ){.      
217f0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b  assert( pCur->sk
21800 69 70 4e 65 78 74 21 3d 53 51 4c 49 54 45 5f 4f  ipNext!=SQLITE_O
21810 4b 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  K );.      retur
21820 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  n pCur->skipNext
21830 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
21840 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72  te3BtreeClearCur
21850 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 7d 0a 0a  sor(pCur);.  }..
21860 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
21870 65 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  e>=0 ){.    int 
21880 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  i;.    for(i=1; 
21890 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20  i<=pCur->iPage; 
218a0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  i++){.      rele
218b0 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70  asePage(pCur->ap
218c0 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  Page[i]);.    }.
218d0 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20      pCur->iPage 
218e0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
218f0 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69    rc = getAndIni
21900 74 50 61 67 65 28 70 42 74 2c 20 70 43 75 72 2d  tPage(pBt, pCur-
21910 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72  >pgnoRoot, &pCur
21920 2d 3e 61 70 50 61 67 65 5b 30 5d 29 3b 0a 20 20  ->apPage[0]);.  
21930 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
21940 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 43 75  _OK ){.      pCu
21950 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
21960 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
21970 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
21980 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61   }.    pCur->iPa
21990 67 65 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  ge = 0;..    /* 
219a0 49 66 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  If pCur->pKeyInf
219b0 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  o is not NULL, t
219c0 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 74  hen the caller t
219d0 68 61 74 20 6f 70 65 6e 65 64 20 74 68 69 73 20  hat opened this 
219e0 63 75 72 73 6f 72 0a 20 20 20 20 2a 2a 20 65 78  cursor.    ** ex
219f0 70 65 63 74 65 64 20 74 6f 20 6f 70 65 6e 20 69  pected to open i
21a00 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d  t on an index b-
21a10 74 72 65 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  tree. Otherwise,
21a20 20 69 66 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a   if pKeyInfo is.
21a30 20 20 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65      ** NULL, the
21a40 20 63 61 6c 6c 65 72 20 65 78 70 65 63 74 73 20   caller expects 
21a50 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2e 20  a table b-tree. 
21a60 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74  If this is not t
21a70 68 65 20 63 61 73 65 2c 0a 20 20 20 20 2a 2a 20  he case,.    ** 
21a80 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45  return an SQLITE
21a90 5f 43 4f 52 52 55 50 54 20 65 72 72 6f 72 2e 20  _CORRUPT error. 
21aa0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
21ab0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d  pCur->apPage[0]-
21ac0 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20 70 43  >intKey==1 || pC
21ad0 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69  ur->apPage[0]->i
21ae0 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 20 20  ntKey==0 );.    
21af0 69 66 28 20 28 70 43 75 72 2d 3e 70 4b 65 79 49  if( (pCur->pKeyI
21b00 6e 66 6f 3d 3d 30 29 21 3d 70 43 75 72 2d 3e 61  nfo==0)!=pCur->a
21b10 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
21b20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
21b30 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
21b40 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  BKPT;.    }.  }.
21b50 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61  .  /* Assert tha
21b60 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  t the root page 
21b70 69 73 20 6f 66 20 74 68 65 20 63 6f 72 72 65 63  is of the correc
21b80 74 20 74 79 70 65 2e 20 54 68 69 73 20 6d 75 73  t type. This mus
21b90 74 20 62 65 20 74 68 65 0a 20 20 2a 2a 20 63 61  t be the.  ** ca
21ba0 73 65 20 61 73 20 74 68 65 20 63 61 6c 6c 20 74  se as the call t
21bb0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
21bc0 74 68 61 74 20 6c 6f 61 64 65 64 20 74 68 65 20  that loaded the 
21bd0 72 6f 6f 74 2d 70 61 67 65 20 28 65 69 74 68 65  root-page (eithe
21be0 72 0a 20 20 2a 2a 20 74 68 69 73 20 63 61 6c 6c  r.  ** this call
21bf0 20 6f 72 20 61 20 70 72 65 76 69 6f 75 73 20 69   or a previous i
21c00 6e 76 6f 63 61 74 69 6f 6e 29 20 77 6f 75 6c 64  nvocation) would
21c10 20 68 61 76 65 20 64 65 74 65 63 74 65 64 20 63   have detected c
21c20 6f 72 72 75 70 74 69 6f 6e 20 0a 20 20 2a 2a 20  orruption .  ** 
21c30 69 66 20 74 68 65 20 61 73 73 75 6d 70 74 69 6f  if the assumptio
21c40 6e 20 77 65 72 65 20 6e 6f 74 20 74 72 75 65 2c  n were not true,
21c50 20 61 6e 64 20 69 74 20 69 73 20 6e 6f 74 20 70   and it is not p
21c60 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20  ossible for the 
21c70 66 6c 61 67 73 20 0a 20 20 2a 2a 20 62 79 74 65  flags .  ** byte
21c80 20 74 6f 20 68 61 76 65 20 62 65 65 6e 20 6d 6f   to have been mo
21c90 64 69 66 69 65 64 20 77 68 69 6c 65 20 74 68 69  dified while thi
21ca0 73 20 63 75 72 73 6f 72 20 69 73 20 68 6f 6c 64  s cursor is hold
21cb0 69 6e 67 20 61 20 72 65 66 65 72 65 6e 63 65 0a  ing a reference.
21cc0 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65    ** to the page
21cd0 2e 20 20 2a 2f 0a 20 20 70 52 6f 6f 74 20 3d 20  .  */.  pRoot = 
21ce0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b  pCur->apPage[0];
21cf0 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74  .  assert( pRoot
21d00 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67  ->pgno==pCur->pg
21d10 6e 6f 52 6f 6f 74 20 29 3b 0a 20 20 61 73 73 65  noRoot );.  asse
21d20 72 74 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69  rt( pRoot->isIni
21d30 74 20 26 26 20 28 70 43 75 72 2d 3e 70 4b 65 79  t && (pCur->pKey
21d40 49 6e 66 6f 3d 3d 30 29 3d 3d 70 52 6f 6f 74 2d  Info==0)==pRoot-
21d50 3e 69 6e 74 4b 65 79 20 29 3b 0a 0a 20 20 70 43  >intKey );..  pC
21d60 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30  ur->aiIdx[0] = 0
21d70 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
21d80 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
21d90 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20  ->atLast = 0;.  
21da0 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
21db0 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 52 6f 6f  = 0;..  if( pRoo
21dc0 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 21  t->nCell==0 && !
21dd0 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20  pRoot->leaf ){. 
21de0 20 20 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b     Pgno subpage;
21df0 0a 20 20 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e  .    if( pRoot->
21e00 70 67 6e 6f 21 3d 31 20 29 20 72 65 74 75 72 6e  pgno!=1 ) return
21e10 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
21e20 42 4b 50 54 3b 0a 20 20 20 20 73 75 62 70 61 67  BKPT;.    subpag
21e30 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 52  e = get4byte(&pR
21e40 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74  oot->aData[pRoot
21e50 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
21e60 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
21e70 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  e = CURSOR_VALID
21e80 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
21e90 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62  oChild(pCur, sub
21ea0 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  page);.  }else{.
21eb0 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
21ec0 20 3d 20 28 28 70 52 6f 6f 74 2d 3e 6e 43 65 6c   = ((pRoot->nCel
21ed0 6c 3e 30 29 3f 43 55 52 53 4f 52 5f 56 41 4c 49  l>0)?CURSOR_VALI
21ee0 44 3a 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  D:CURSOR_INVALID
21ef0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
21f00 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  rc;.}../*.** Mov
21f10 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77  e the cursor dow
21f20 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f  n to the left-mo
21f30 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65  st leaf entry be
21f40 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74  neath the.** ent
21f50 72 79 20 74 6f 20 77 68 69 63 68 20 69 74 20 69  ry to which it i
21f60 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
21f70 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ting..**.** The 
21f80 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69  left-most leaf i
21f90 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74  s the one with t
21fa0 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20  he smallest key 
21fb0 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69  - the first.** i
21fc0 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
21fd0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
21fe0 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
21ff0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
22000 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20  .  Pgno pgno;.  
22010 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
22020 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  OK;.  MemPage *p
22030 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
22040 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
22050 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
22060 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
22070 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
22080 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  );.  while( rc==
22090 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70  SQLITE_OK && !(p
220a0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
220b0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
220c0 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 61  )->leaf ){.    a
220d0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
220e0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
220f0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
22100 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
22110 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
22120 67 65 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  ge, pCur->aiIdx[
22130 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 29 3b 0a  pCur->iPage]));.
22140 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
22150 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29  hild(pCur, pgno)
22160 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
22170 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  c;.}../*.** Move
22180 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
22190 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   to the right-mo
221a0 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65  st leaf entry be
221b0 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67  neath the.** pag
221c0 65 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73  e to which it is
221d0 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
221e0 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65  ing.  Notice the
221f0 20 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62   difference.** b
22200 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66  etween moveToLef
22210 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65  tmost() and move
22220 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20  ToRightmost().  
22230 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29  moveToLeftmost()
22240 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65  .** finds the le
22250 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65  ft-most entry be
22260 6e 65 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79  neath the *entry
22270 2a 20 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f  * whereas moveTo
22280 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66  Rightmost().** f
22290 69 6e 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d  inds the right-m
222a0 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74  ost entry beneat
222b0 68 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a  h the *page*..**
222c0 0a 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  .** The right-mo
222d0 73 74 20 65 6e 74 72 79 20 69 73 20 74 68 65 20  st entry is the 
222e0 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6c 61 72  one with the lar
222f0 67 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c  gest key - the l
22300 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73  ast.** key in as
22310 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a  cending order..*
22320 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
22330 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43  eToRightmost(BtC
22340 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
22350 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74  Pgno pgno;.  int
22360 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
22370 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
22380 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  e = 0;..  assert
22390 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
223a0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
223b0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
223c0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
223d0 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   );.  while( rc=
223e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28  =SQLITE_OK && !(
223f0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
22400 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
22410 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ])->leaf ){.    
22420 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
22430 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
22440 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
22450 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69  ]);.    pCur->ai
22460 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
22470 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
22480 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
22490 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f  Child(pCur, pgno
224a0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
224b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
224c0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
224d0 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61  ur->iPage] = pPa
224e0 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20  ge->nCell-1;.   
224f0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
22500 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d  e = 0;.    pCur-
22510 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a  >validNKey = 0;.
22520 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
22530 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
22540 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69  cursor to the fi
22550 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  rst entry in the
22560 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
22570 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
22580 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70  success.  Set *p
22590 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20  Res to 0 if the 
225a0 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20  cursor actually 
225b0 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68  points to someth
225c0 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70  ing.** or set *p
225d0 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20  Res to 1 if the 
225e0 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
225f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
22600 72 65 65 46 69 72 73 74 28 42 74 43 75 72 73 6f  reeFirst(BtCurso
22610 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
22620 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  es){.  int rc;..
22630 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
22640 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
22650 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
22660 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
22670 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
22680 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  b->mutex) );.  r
22690 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
226a0 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
226b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
226c0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
226d0 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
226e0 44 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  D ){.      asser
226f0 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
22700 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
22710 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ell==0 );.      
22720 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
22730 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
22740 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
22750 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
22760 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
22770 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a  ge]->nCell>0 );.
22780 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
22790 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
227a0 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
227b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
227c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d  turn rc;.}../* M
227d0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
227e0 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
227f0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
22800 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
22810 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  .** on success. 
22820 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20   Set *pRes to 0 
22830 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  if the cursor ac
22840 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f  tually points to
22850 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72   something.** or
22860 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20   set *pRes to 1 
22870 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
22880 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
22890 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 42  lite3BtreeLast(B
228a0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
228b0 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
228c0 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74 28   rc;. .  assert(
228d0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
228e0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
228f0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
22900 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
22910 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
22920 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
22930 20 63 75 72 73 6f 72 20 61 6c 72 65 61 64 79 20   cursor already 
22940 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c 61  points to the la
22950 73 74 20 65 6e 74 72 79 2c 20 74 68 69 73 20 69  st entry, this i
22960 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20  s a no-op. */.  
22970 69 66 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  if( CURSOR_VALID
22980 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 26  ==pCur->eState &
22990 26 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 29  & pCur->atLast )
229a0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
229b0 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 69  DEBUG.    /* Thi
229c0 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 74  s block serves t
229d0 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74 20  o assert() that 
229e0 74 68 65 20 63 75 72 73 6f 72 20 72 65 61 6c 6c  the cursor reall
229f0 79 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20  y does point .  
22a00 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73 74    ** to the last
22a10 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 62 2d   entry in the b-
22a20 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  tree. */.    int
22a30 20 69 69 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d   ii;.    for(ii=
22a40 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50 61 67  0; ii<pCur->iPag
22a50 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  e; ii++){.      
22a60 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
22a70 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61  Idx[ii]==pCur->a
22a80 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c  pPage[ii]->nCell
22a90 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73   );.    }.    as
22aa0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
22ab0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d  x[pCur->iPage]==
22ac0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
22ad0 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
22ae0 2d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  -1 );.    assert
22af0 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
22b00 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61  Cur->iPage]->lea
22b10 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  f );.#endif.    
22b20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
22b30 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f  ;.  }..  rc = mo
22b40 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
22b50 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
22b60 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 43  _OK ){.    if( C
22b70 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
22b80 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
22b90 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
22ba0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
22bb0 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30  iPage]->nCell==0
22bc0 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
22bd0 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
22be0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
22bf0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
22c00 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  OR_VALID );.    
22c10 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
22c20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69     rc = moveToRi
22c30 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  ghtmost(pCur);. 
22c40 20 20 20 20 20 70 43 75 72 2d 3e 61 74 4c 61 73       pCur->atLas
22c50 74 20 3d 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  t = rc==SQLITE_O
22c60 4b 20 3f 31 3a 30 3b 0a 20 20 20 20 7d 0a 20 20  K ?1:0;.    }.  
22c70 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
22c80 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  ../* Move the cu
22c90 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20  rsor so that it 
22ca0 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74  points to an ent
22cb0 72 79 20 6e 65 61 72 20 74 68 65 20 6b 65 79 20  ry near the key 
22cc0 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79  .** specified by
22cd0 20 70 49 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b   pIdxKey or intK
22ce0 65 79 2e 20 20 20 52 65 74 75 72 6e 20 61 20 73  ey.   Return a s
22cf0 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a  uccess code..**.
22d00 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61  ** For INTKEY ta
22d10 62 6c 65 73 2c 20 74 68 65 20 69 6e 74 4b 65 79  bles, the intKey
22d20 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 75 73   parameter is us
22d30 65 64 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a  ed.  pIdxKey .**
22d40 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20   must be NULL.  
22d50 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73  For index tables
22d60 2c 20 70 49 64 78 4b 65 79 20 69 73 20 75 73 65  , pIdxKey is use
22d70 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20  d and intKey.** 
22d80 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a  is ignored..**.*
22d90 2a 20 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61  * If an exact ma
22da0 74 63 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64  tch is not found
22db0 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
22dc0 72 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c  r is always.** l
22dd0 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
22de0 61 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63  a leaf page whic
22df0 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65  h would hold the
22e00 20 65 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20   entry if it.** 
22e10 77 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54  were present.  T
22e20 68 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20  he cursor might 
22e30 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72  point to an entr
22e40 79 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20  y that comes.** 
22e50 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20  before or after 
22e60 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41  the key..**.** A
22e70 6e 20 69 6e 74 65 67 65 72 20 69 73 20 77 72 69  n integer is wri
22e80 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20  tten into *pRes 
22e90 77 68 69 63 68 20 69 73 20 74 68 65 20 72 65 73  which is the res
22ea0 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72  ult of.** compar
22eb0 69 6e 67 20 74 68 65 20 6b 65 79 20 77 69 74 68  ing the key with
22ec0 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68   the entry to wh
22ed0 69 63 68 20 74 68 65 20 63 75 72 73 6f 72 20 69  ich the cursor i
22ee0 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20  s .** pointing. 
22ef0 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20   The meaning of 
22f00 74 68 65 20 69 6e 74 65 67 65 72 20 77 72 69 74  the integer writ
22f10 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65  ten into.** *pRe
22f20 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  s is as follows:
22f30 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73  .**.**     *pRes
22f40 3c 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73  <0      The curs
22f50 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
22f60 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
22f70 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
22f80 20 20 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c           is smal
22f90 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f  ler than intKey/
22fa0 70 49 64 78 4b 65 79 20 6f 72 20 69 66 20 74 68  pIdxKey or if th
22fb0 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
22fc0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
22fd0 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 75 72       and the cur
22fe0 73 6f 72 20 69 73 20 74 68 65 72 65 66 6f 72 65  sor is therefore
22ff0 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e   left point to n
23000 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20  othing..**.**   
23010 20 20 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54    *pRes==0     T
23020 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
23030 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
23040 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
23050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23060 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20  exactly matches 
23070 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a  intKey/pIdxKey..
23080 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e  **.**     *pRes>
23090 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  0      The curso
230a0 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
230b0 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
230c0 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
230d0 20 20 20 20 20 20 20 20 69 73 20 6c 61 72 67 65          is large
230e0 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49  r than intKey/pI
230f0 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74  dxKey..**.*/.int
23100 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
23110 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20 42  etoUnpacked(.  B
23120 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
23130 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
23140 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65  ursor to be move
23150 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  d */.  UnpackedR
23160 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c 20  ecord *pIdxKey, 
23170 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65  /* Unpacked inde
23180 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20 69  x key */.  i64 i
23190 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20  ntKey,          
231a0 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
231b0 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69   key */.  int bi
231c0 61 73 52 69 67 68 74 2c 20 20 20 20 20 20 20 20  asRight,        
231d0 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 62     /* If true, b
231e0 69 61 73 20 74 68 65 20 73 65 61 72 63 68 20 74  ias the search t
231f0 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a  o the high end *
23200 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20  /.  int *pRes   
23210 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23220 57 72 69 74 65 20 73 65 61 72 63 68 20 72 65 73  Write search res
23230 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ults here */.){.
23240 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
23250 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
23260 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
23270 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
23280 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
23290 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
232a0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
232b0 28 20 70 52 65 73 20 29 3b 0a 20 20 61 73 73 65  ( pRes );.  asse
232c0 72 74 28 20 28 70 49 64 78 4b 65 79 3d 3d 30 29  rt( (pIdxKey==0)
232d0 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  ==(pCur->pKeyInf
232e0 6f 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  o==0) );..  /* I
232f0 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
23300 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e  already position
23310 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20  ed at the point 
23320 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a 20 20  we are trying.  
23330 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74  ** to move to, t
23340 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20  hen just return 
23350 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e  without doing an
23360 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20  y work */.  if( 
23370 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
23380 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20 70 43  RSOR_VALID && pC
23390 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 0a 20  ur->validNKey . 
233a0 20 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67    && pCur->apPag
233b0 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 0a 20 20  e[0]->intKey .  
233c0 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
233d0 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b  >info.nKey==intK
233e0 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  ey ){.      *pRe
233f0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  s = 0;.      ret
23400 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
23410 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75     }.    if( pCu
23420 72 2d 3e 61 74 4c 61 73 74 20 26 26 20 70 43 75  r->atLast && pCu
23430 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74  r->info.nKey<int
23440 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  Key ){.      *pR
23450 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72  es = -1;.      r
23460 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
23470 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 63  .    }.  }..  rc
23480 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
23490 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ur);.  if( rc ){
234a0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
234b0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
234c0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
234d0 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73  >iPage] );.  ass
234e0 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
234f0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
23500 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65  isInit );.  asse
23510 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
23520 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
23530 43 65 6c 6c 3e 30 20 7c 7c 20 70 43 75 72 2d 3e  Cell>0 || pCur->
23540 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
23550 4e 56 41 4c 49 44 20 29 3b 0a 20 20 69 66 28 20  NVALID );.  if( 
23560 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
23570 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
23580 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a      *pRes = -1;.
23590 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
235a0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
235b0 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  Page]->nCell==0 
235c0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
235d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61  LITE_OK;.  }.  a
235e0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
235f0 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c  age[0]->intKey |
23600 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20 66  | pIdxKey );.  f
23610 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20  or(;;){.    int 
23620 6c 77 72 2c 20 75 70 72 3b 0a 20 20 20 20 50 67  lwr, upr;.    Pg
23630 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d  no chldPg;.    M
23640 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
23650 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
23660 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69  r->iPage];.    i
23670 6e 74 20 63 3b 0a 0a 20 20 20 20 2f 2a 20 70 50  nt c;..    /* pP
23680 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74 20  age->nCell must 
23690 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  be greater than 
236a0 7a 65 72 6f 2e 20 49 66 20 74 68 69 73 20 69 73  zero. If this is
236b0 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20   the root-page. 
236c0 20 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72     ** the cursor
236d0 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e   would have been
236e0 20 49 4e 56 41 4c 49 44 20 61 62 6f 76 65 20 61   INVALID above a
236f0 6e 64 20 74 68 69 73 20 66 6f 72 28 3b 3b 29 20  nd this for(;;) 
23700 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f 74 20  loop.    ** not 
23710 72 75 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20  run. If this is 
23720 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67  not the root-pag
23730 65 2c 20 74 68 65 6e 20 74 68 65 20 6d 6f 76 65  e, then the move
23740 54 6f 43 68 69 6c 64 28 29 20 72 6f 75 74 69 6e  ToChild() routin
23750 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20 68  e.    ** would h
23760 61 76 65 20 61 6c 72 65 61 64 79 20 64 65 74 65  ave already dete
23770 63 74 65 64 20 64 62 20 63 6f 72 72 75 70 74 69  cted db corrupti
23780 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 70  on. Similarly, p
23790 50 61 67 65 20 6d 75 73 74 0a 20 20 20 20 2a 2a  Page must.    **
237a0 20 62 65 20 74 68 65 20 72 69 67 68 74 20 6b 69   be the right ki
237b0 6e 64 20 28 69 6e 64 65 78 20 6f 72 20 74 61 62  nd (index or tab
237c0 6c 65 29 20 6f 66 20 62 2d 74 72 65 65 20 70 61  le) of b-tree pa
237d0 67 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 20 20  ge. Otherwise.  
237e0 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f 43 68 69    ** a moveToChi
237f0 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54 6f 52 6f  ld() or moveToRo
23800 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75 6c 64 20  ot() call would 
23810 68 61 76 65 20 64 65 74 65 63 74 65 64 20 63 6f  have detected co
23820 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20  rruption.  */.  
23830 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
23840 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20  >nCell>0 );.    
23850 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
23860 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b 65 79 3d  ntKey==(pIdxKey=
23870 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77 72 20 3d  =0) );.    lwr =
23880 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20 70 50   0;.    upr = pP
23890 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20  age->nCell-1;.  
238a0 20 20 69 66 28 20 62 69 61 73 52 69 67 68 74 20    if( biasRight 
238b0 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61  ){.      pCur->a
238c0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
238d0 5d 20 3d 20 28 75 31 36 29 75 70 72 3b 0a 20 20  ] = (u16)upr;.  
238e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
238f0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
23900 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 28  >iPage] = (u16)(
23910 28 75 70 72 2b 6c 77 72 29 2f 32 29 3b 0a 20 20  (upr+lwr)/2);.  
23920 20 20 7d 0a 20 20 20 20 66 6f 72 28 3b 3b 29 7b    }.    for(;;){
23930 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78 20 3d  .      int idx =
23940 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
23950 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 49 6e  r->iPage]; /* In
23960 64 65 78 20 6f 66 20 63 75 72 72 65 6e 74 20 63  dex of current c
23970 65 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a  ell in pPage */.
23980 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b        u8 *pCell;
23990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
239a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
239b0 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20  nter to current 
239c0 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f  cell in pPage */
239d0 0a 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e  ..      pCur->in
239e0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
239f0 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
23a00 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29  Cell(pPage, idx)
23a10 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   + pPage->childP
23a20 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66  trSize;.      if
23a30 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
23a40 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 6e  ){.        i64 n
23a50 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20  CellKey;.       
23a60 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44   if( pPage->hasD
23a70 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ata ){.         
23a80 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20   u32 dummy;.    
23a90 20 20 20 20 20 20 70 43 65 6c 6c 20 2b 3d 20 67        pCell += g
23aa0 65 74 56 61 72 69 6e 74 33 32 28 70 43 65 6c 6c  etVarint32(pCell
23ab0 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20  , dummy);.      
23ac0 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56    }.        getV
23ad0 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36  arint(pCell, (u6
23ae0 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20  4*)&nCellKey);. 
23af0 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c         if( nCell
23b00 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20  Key==intKey ){. 
23b10 20 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b 0a           c = 0;.
23b20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
23b30 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65  ( nCellKey<intKe
23b40 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  y ){.          c
23b50 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d   = -1;.        }
23b60 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
23b70 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79  assert( nCellKey
23b80 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 20  >intKey );.     
23b90 20 20 20 20 20 63 20 3d 20 2b 31 3b 0a 20 20 20       c = +1;.   
23ba0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
23bb0 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
23bc0 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72   1;.        pCur
23bd0 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43  ->info.nKey = nC
23be0 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65  ellKey;.      }e
23bf0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
23c00 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 75 70 70  The maximum supp
23c10 6f 72 74 65 64 20 70 61 67 65 2d 73 69 7a 65 20  orted page-size 
23c20 69 73 20 33 32 37 36 38 20 62 79 74 65 73 2e 20  is 32768 bytes. 
23c30 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 0a  This means that.
23c40 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d          ** the m
23c50 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
23c60 20 72 65 63 6f 72 64 20 62 79 74 65 73 20 73 74   record bytes st
23c70 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64 65 78  ored on an index
23c80 20 42 2d 54 72 65 65 0a 20 20 20 20 20 20 20 20   B-Tree.        
23c90 2a 2a 20 70 61 67 65 20 69 73 20 61 74 20 6d 6f  ** page is at mo
23ca0 73 74 20 38 31 39 38 20 62 79 74 65 73 2c 20 77  st 8198 bytes, w
23cb0 68 69 63 68 20 6d 61 79 20 62 65 20 73 74 6f 72  hich may be stor
23cc0 65 64 20 61 73 20 61 20 32 2d 62 79 74 65 0a 20  ed as a 2-byte. 
23cd0 20 20 20 20 20 20 20 2a 2a 20 76 61 72 69 6e 74         ** varint
23ce0 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  . This informati
23cf0 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 74  on is used to at
23d00 74 65 6d 70 74 20 74 6f 20 61 76 6f 69 64 20 70  tempt to avoid p
23d10 61 72 73 69 6e 67 20 0a 20 20 20 20 20 20 20 20  arsing .        
23d20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 65  ** the entire ce
23d30 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e 67 20 66  ll by checking f
23d40 6f 72 20 74 68 65 20 63 61 73 65 73 20 77 68 65  or the cases whe
23d50 72 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 73  re the record is
23d60 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f   .        ** sto
23d70 72 65 64 20 65 6e 74 69 72 65 6c 79 20 77 69 74  red entirely wit
23d80 68 69 6e 20 74 68 65 20 62 2d 74 72 65 65 20 70  hin the b-tree p
23d90 61 67 65 20 62 79 20 69 6e 73 70 65 63 74 69 6e  age by inspectin
23da0 67 20 74 68 65 20 66 69 72 73 74 20 0a 20 20 20  g the first .   
23db0 20 20 20 20 20 2a 2a 20 32 20 62 79 74 65 73 20       ** 2 bytes 
23dc0 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20 20 20  of the cell..   
23dd0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
23de0 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 70 43 65 6c  int nCell = pCel
23df0 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  l[0];.        if
23e00 28 20 21 28 6e 43 65 6c 6c 20 26 20 30 78 38 30  ( !(nCell & 0x80
23e10 29 20 26 26 20 6e 43 65 6c 6c 3c 3d 70 50 61 67  ) && nCell<=pPag
23e20 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
23e30 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
23e40 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20   branch runs if 
23e50 74 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20  the record-size 
23e60 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 65 6c  field of the cel
23e70 6c 20 69 73 20 61 0a 20 20 20 20 20 20 20 20 20  l is a.         
23e80 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65 20   ** single byte 
23e90 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72  varint and the r
23ea0 65 63 6f 72 64 20 66 69 74 73 20 65 6e 74 69 72  ecord fits entir
23eb0 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a  ely on the main.
23ec0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 2d 74            ** b-t
23ed0 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  ree page.  */.  
23ee0 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69          c = sqli
23ef0 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
23f00 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69  pare(nCell, (voi
23f10 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20 70 49  d*)&pCell[1], pI
23f20 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  dxKey);.        
23f30 7d 65 6c 73 65 20 69 66 28 20 21 28 70 43 65 6c  }else if( !(pCel
23f40 6c 5b 31 5d 20 26 20 30 78 38 30 29 20 0a 20 20  l[1] & 0x80) .  
23f50 20 20 20 20 20 20 20 20 26 26 20 28 6e 43 65 6c          && (nCel
23f60 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78 37 66  l = ((nCell&0x7f
23f70 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b 31 5d  )<<7) + pCell[1]
23f80 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  )<=pPage->maxLoc
23f90 61 6c 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  al.        ){.  
23fa0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
23fb0 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64  ecord-size field
23fc0 20 69 73 20 61 20 32 20 62 79 74 65 20 76 61 72   is a 2 byte var
23fd0 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f  int and the reco
23fe0 72 64 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  rd .          **
23ff0 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f   fits entirely o
24000 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d 74 72 65  n the main b-tre
24010 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20  e page.  */.    
24020 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65        c = sqlite
24030 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
24040 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a  re(nCell, (void*
24050 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49 64 78  )&pCell[2], pIdx
24060 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  Key);.        }e
24070 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
24080 2a 20 54 68 65 20 72 65 63 6f 72 64 20 66 6c 6f  * The record flo
24090 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e 65  ws over onto one
240a0 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f   or more overflo
240b0 77 20 70 61 67 65 73 2e 20 49 6e 0a 20 20 20 20  w pages. In.    
240c0 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61        ** this ca
240d0 73 65 20 74 68 65 20 77 68 6f 6c 65 20 63 65 6c  se the whole cel
240e0 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 61  l needs to be pa
240f0 72 73 65 64 2c 20 61 20 62 75 66 66 65 72 20 61  rsed, a buffer a
24100 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20 20  llocated.       
24110 20 20 20 2a 2a 20 61 6e 64 20 61 63 63 65 73 73     ** and access
24120 50 61 79 6c 6f 61 64 28 29 20 75 73 65 64 20 74  Payload() used t
24130 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 20 72  o retrieve the r
24140 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 0a 20  ecord into the. 
24150 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75 66 66           ** buff
24160 65 72 20 62 65 66 6f 72 65 20 56 64 62 65 52 65  er before VdbeRe
24170 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63 61  cordCompare() ca
24180 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 2a 2f 0a  n be called. */.
24190 20 20 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a            void *
241a0 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  pCellKey;.      
241b0 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70      u8 * const p
241c0 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c 6c  CellBody = pCell
241d0 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   - pPage->childP
241e0 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  trSize;.        
241f0 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
24200 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
24210 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66  Body, &pCur->inf
24220 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43  o);.          nC
24230 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43 75 72 2d  ell = (int)pCur-
24240 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20  >info.nKey;.    
24250 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d        pCellKey =
24260 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20   sqlite3Malloc( 
24270 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 20  nCell );.       
24280 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d     if( pCellKey=
24290 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
242a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
242b0 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  MEM;.           
242c0 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
242d0 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ish;.          }
242e0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
242f0 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
24300 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75  ur, 0, nCell, (u
24310 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 43  nsigned char*)pC
24320 65 6c 6c 4b 65 79 2c 20 30 29 3b 0a 20 20 20 20  ellKey, 0);.    
24330 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
24340 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
24350 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65  te3_free(pCellKe
24360 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y);.            
24370 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
24380 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  sh;.          }.
24390 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 73 71            c = sq
243a0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
243b0 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70 43  ompare(nCell, pC
243c0 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79 29  ellKey, pIdxKey)
243d0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
243e0 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65  te3_free(pCellKe
243f0 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  y);.        }.  
24400 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
24410 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c==0 ){.        
24420 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
24430 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61  y && !pPage->lea
24440 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c  f ){.          l
24450 77 72 20 3d 20 69 64 78 3b 0a 20 20 20 20 20 20  wr = idx;.      
24460 20 20 20 20 75 70 72 20 3d 20 6c 77 72 20 2d 20      upr = lwr - 
24470 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  1;.          bre
24480 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
24490 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 52  e{.          *pR
244a0 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  es = 0;.        
244b0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
244c0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
244d0 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
244e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
244f0 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3c 30 20  }.      if( c<0 
24500 29 7b 0a 20 20 20 20 20 20 20 20 6c 77 72 20 3d  ){.        lwr =
24510 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 7d 65   idx+1;.      }e
24520 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75 70 72  lse{.        upr
24530 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20   = idx-1;.      
24540 7d 0a 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e  }.      if( lwr>
24550 75 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 62  upr ){.        b
24560 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
24570 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
24580 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
24590 75 31 36 29 28 28 6c 77 72 2b 75 70 72 29 2f 32  u16)((lwr+upr)/2
245a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
245b0 65 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20  ert( lwr==upr+1 
245c0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
245d0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
245e0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c      if( pPage->l
245f0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 63 68 6c  eaf ){.      chl
24600 64 50 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  dPg = 0;.    }el
24610 73 65 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67  se if( lwr>=pPag
24620 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  e->nCell ){.    
24630 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62    chldPg = get4b
24640 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
24650 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
24660 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  et+8]);.    }els
24670 65 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20  e{.      chldPg 
24680 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  = get4byte(findC
24690 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72 29 29  ell(pPage, lwr))
246a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
246b0 63 68 6c 64 50 67 3d 3d 30 20 29 7b 0a 20 20 20  chldPg==0 ){.   
246c0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
246d0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
246e0 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65  ge]<pCur->apPage
246f0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
24700 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 2a 70  Cell );.      *p
24710 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72  Res = c;.      r
24720 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
24730 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
24740 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 20  _finish;.    }. 
24750 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
24760 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75  Cur->iPage] = (u
24770 31 36 29 6c 77 72 3b 0a 20 20 20 20 70 43 75 72  16)lwr;.    pCur
24780 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
24790 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69  ;.    pCur->vali
247a0 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 72  dNKey = 0;.    r
247b0 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
247c0 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20  pCur, chldPg);. 
247d0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
247e0 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
247f0 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73    }.moveto_finis
24800 68 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  h:.  return rc;.
24810 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  }.../*.** Return
24820 20 54 52 55 45 20 69 66 20 74 68 65 20 63 75 72   TRUE if the cur
24830 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74  sor is not point
24840 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
24850 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  of the table..**
24860 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65  .** TRUE will be
24870 20 72 65 74 75 72 6e 65 64 20 61 66 74 65 72 20   returned after 
24880 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
24890 33 42 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76  3BtreeNext() mov
248a0 65 73 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c  es.** past the l
248b0 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
248c0 20 74 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65   table or sqlite
248d0 33 42 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76  3BtreePrev() mov
248e0 65 73 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66  es past.** the f
248f0 69 72 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55  irst entry.  TRU
24900 45 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e  E is also return
24910 65 64 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  ed if the table 
24920 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74  is empty..*/.int
24930 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66   sqlite3BtreeEof
24940 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
24950 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61  {.  /* TODO: Wha
24960 74 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  t if the cursor 
24970 69 73 20 69 6e 20 43 55 52 53 4f 52 5f 52 45 51  is in CURSOR_REQ
24980 55 49 52 45 53 45 45 4b 20 62 75 74 20 61 6c 6c  UIRESEEK but all
24990 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 0a 20   table entries. 
249a0 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65   ** have been de
249b0 6c 65 74 65 64 3f 20 54 68 69 73 20 41 50 49 20  leted? This API 
249c0 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 61  will need to cha
249d0 6e 67 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e  nge to return an
249e0 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a   error code.  **
249f0 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20   as well as the 
24a00 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76  boolean result v
24a10 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74  alue..  */.  ret
24a20 75 72 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49  urn (CURSOR_VALI
24a30 44 21 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29  D!=pCur->eState)
24a40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  ;.}../*.** Advan
24a50 63 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ce the cursor to
24a60 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20   the next entry 
24a70 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
24a80 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66    If.** successf
24a90 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  ul then set *pRe
24aa0 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72  s=0.  If the cur
24ab0 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61  sor.** was alrea
24ac0 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  dy pointing to t
24ad0 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
24ae0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
24af0 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75  fore.** this rou
24b00 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c  tine was called,
24b10 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
24b20 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  1..*/.int sqlite
24b30 33 42 74 72 65 65 4e 65 78 74 28 42 74 43 75 72  3BtreeNext(BtCur
24b40 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
24b50 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
24b60 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65  .  int idx;.  Me
24b70 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
24b80 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
24b90 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
24ba0 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
24bb0 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
24bc0 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21  pCur);.  if( rc!
24bd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24be0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
24bf0 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73 21  .  assert( pRes!
24c00 3d 30 20 29 3b 0a 20 20 69 66 28 20 43 55 52 53  =0 );.  if( CURS
24c10 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
24c20 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
24c30 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72  *pRes = 1;.    r
24c40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
24c50 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d  .  }.  if( pCur-
24c60 3e 73 6b 69 70 4e 65 78 74 3e 30 20 29 7b 0a 20  >skipNext>0 ){. 
24c70 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78     pCur->skipNex
24c80 74 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73  t = 0;.    *pRes
24c90 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
24ca0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
24cb0 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
24cc0 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d   = 0;..  pPage =
24cd0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
24ce0 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64  ur->iPage];.  id
24cf0 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64  x = ++pCur->aiId
24d00 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  x[pCur->iPage];.
24d10 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
24d20 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73  >isInit );.  ass
24d30 65 72 74 28 20 69 64 78 3c 3d 70 50 61 67 65 2d  ert( idx<=pPage-
24d40 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 70 43 75  >nCell );..  pCu
24d50 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
24d60 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  0;.  pCur->valid
24d70 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20  NKey = 0;.  if( 
24d80 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  idx>=pPage->nCel
24d90 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50  l ){.    if( !pP
24da0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
24db0 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
24dc0 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79  ild(pCur, get4by
24dd0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
24de0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
24df0 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66  t+8]));.      if
24e00 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
24e10 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  ;.      rc = mov
24e20 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
24e30 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
24e40 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
24e50 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64   rc;.    }.    d
24e60 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  o{.      if( pCu
24e70 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20  r->iPage==0 ){. 
24e80 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31         *pRes = 1
24e90 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  ;.        pCur->
24ea0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
24eb0 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20  INVALID;.       
24ec0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
24ed0 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
24ee0 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43   moveToParent(pC
24ef0 75 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ur);.      pPage
24f00 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
24f10 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
24f20 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e    }while( pCur->
24f30 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
24f40 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  e]>=pPage->nCell
24f50 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   );.    *pRes = 
24f60 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  0;.    if( pPage
24f70 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
24f80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
24f90 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52  reeNext(pCur, pR
24fa0 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  es);.    }else{.
24fb0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
24fc0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
24fd0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
24fe0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 69 66   *pRes = 0;.  if
24ff0 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
25000 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
25010 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20  TE_OK;.  }.  rc 
25020 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  = moveToLeftmost
25030 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e  (pCur);.  return
25040 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53   rc;.}.../*.** S
25050 74 65 70 20 74 68 65 20 63 75 72 73 6f 72 20 74  tep the cursor t
25060 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68  o the back to th
25070 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79  e previous entry
25080 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
25090 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73  .  If.** success
250a0 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ful then set *pR
250b0 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75  es=0.  If the cu
250c0 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65  rsor.** was alre
250d0 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ady pointing to 
250e0 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
250f0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
25100 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72  before.** this r
25110 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
25120 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  d, then set *pRe
25130 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  s=1..*/.int sqli
25140 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
25150 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
25160 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
25170 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65  nt rc;.  MemPage
25180 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
25190 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
251a0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
251b0 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
251c0 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
251d0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
251e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
251f0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43  urn rc;.  }.  pC
25200 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a  ur->atLast = 0;.
25210 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
25220 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
25230 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  te ){.    *pRes 
25240 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
25250 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
25260 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e   if( pCur->skipN
25270 65 78 74 3c 30 20 29 7b 0a 20 20 20 20 70 43 75  ext<0 ){.    pCu
25280 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b  r->skipNext = 0;
25290 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  .    *pRes = 0;.
252a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
252b0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72  E_OK;.  }.  pCur
252c0 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a  ->skipNext = 0;.
252d0 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
252e0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
252f0 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  age];.  assert( 
25300 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
25310 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
25320 65 61 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  eaf ){.    int i
25330 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78  dx = pCur->aiIdx
25340 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
25350 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
25360 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79  ild(pCur, get4by
25370 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  te(findCell(pPag
25380 65 2c 20 69 64 78 29 29 29 3b 0a 20 20 20 20 69  e, idx)));.    i
25390 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
253a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
253b0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52      rc = moveToR
253c0 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  ightmost(pCur);.
253d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69    }else{.    whi
253e0 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  le( pCur->aiIdx[
253f0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 20  pCur->iPage]==0 
25400 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  ){.      if( pCu
25410 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20  r->iPage==0 ){. 
25420 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74         pCur->eSt
25430 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
25440 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 2a 70  ALID;.        *p
25450 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Res = 1;.       
25460 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
25470 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
25480 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43   moveToParent(pC
25490 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ur);.    }.    p
254a0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
254b0 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76  = 0;.    pCur->v
254c0 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20  alidNKey = 0;.. 
254d0 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
254e0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20  Cur->iPage]--;. 
254f0 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d     pPage = pCur-
25500 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
25510 61 67 65 5d 3b 0a 20 20 20 20 69 66 28 20 70 50  age];.    if( pP
25520 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21  age->intKey && !
25530 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
25540 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
25550 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 70  3BtreePrevious(p
25560 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20  Cur, pRes);.    
25570 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
25580 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
25590 20 7d 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d   }.  }.  *pRes =
255a0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
255b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
255c0 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 66 72  te a new page fr
255d0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
255e0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  file..**.** The 
255f0 6e 65 77 20 70 61 67 65 20 69 73 20 6d 61 72 6b  new page is mark
25600 65 64 20 61 73 20 64 69 72 74 79 2e 20 20 28 49  ed as dirty.  (I
25610 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73  n other words, s
25620 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
25630 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64  ().** has alread
25640 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e  y been called on
25650 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 29 20   the new page.) 
25660 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 68 61   The new page ha
25670 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72  s also.** been r
25680 65 66 65 72 65 6e 63 65 64 20 61 6e 64 20 74 68  eferenced and th
25690 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e  e calling routin
256a0 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  e is responsible
256b0 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   for calling.** 
256c0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
256d0 66 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 70  f() on the new p
256e0 61 67 65 20 77 68 65 6e 20 69 74 20 69 73 20 64  age when it is d
256f0 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  one..**.** SQLIT
25700 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
25710 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 41 6e   on success.  An
25720 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76  y other return v
25730 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73 0a 2a  alue indicates.*
25740 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70  * an error.  *pp
25750 50 61 67 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20  Page and *pPgno 
25760 61 72 65 20 75 6e 64 65 66 69 6e 65 64 20 69 6e  are undefined in
25770 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e   the event of an
25780 20 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f   error..** Do no
25790 74 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33  t invoke sqlite3
257a0 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20  PagerUnref() on 
257b0 2a 70 70 50 61 67 65 20 69 66 20 61 6e 20 65 72  *ppPage if an er
257c0 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ror is returned.
257d0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e  .**.** If the "n
257e0 65 61 72 62 79 22 20 70 61 72 61 6d 65 74 65 72  earby" parameter
257f0 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20   is not 0, then 
25800 61 20 28 66 65 65 62 6c 65 29 20 65 66 66 6f 72  a (feeble) effor
25810 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a  t is made to .**
25820 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 63   locate a page c
25830 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67 65  lose to the page
25840 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22   number "nearby"
25850 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75  .  This can be u
25860 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74  sed in an.** att
25870 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c  empt to keep rel
25880 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65  ated pages close
25890 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69   to each other i
258a0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
258b0 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e  ile,.** which in
258c0 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64   turn can make d
258d0 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20 66  atabase access f
258e0 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  aster..**.** If 
258f0 74 68 65 20 22 65 78 61 63 74 22 20 70 61 72 61  the "exact" para
25900 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20  meter is not 0, 
25910 61 6e 64 20 74 68 65 20 70 61 67 65 2d 6e 75 6d  and the page-num
25920 62 65 72 20 6e 65 61 72 62 79 20 65 78 69 73 74  ber nearby exist
25930 73 20 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f  s .** anywhere o
25940 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  n the free-list,
25950 20 74 68 65 6e 20 69 74 20 69 73 20 67 75 61 72   then it is guar
25960 65 6e 74 65 65 64 20 74 6f 20 62 65 20 72 65 74  enteed to be ret
25970 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20 69  urned. This.** i
25980 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 61  s only used by a
25990 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
259a0 61 73 65 73 20 77 68 65 6e 20 61 6c 6c 6f 63 61  ases when alloca
259b0 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65  ting a new table
259c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
259d0 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
259e0 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
259f0 42 74 2c 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Bt, .  MemPage *
25a00 2a 70 70 50 61 67 65 2c 20 0a 20 20 50 67 6e 6f  *ppPage, .  Pgno
25a10 20 2a 70 50 67 6e 6f 2c 20 0a 20 20 50 67 6e 6f   *pPgno, .  Pgno
25a20 20 6e 65 61 72 62 79 2c 0a 20 20 75 38 20 65 78   nearby,.  u8 ex
25a30 61 63 74 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65  act.){.  MemPage
25a40 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20   *pPage1;.  int 
25a50 72 63 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20 20  rc;.  u32 n;    
25a60 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
25a70 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
25a80 69 73 74 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20  ist */.  u32 k; 
25a90 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
25aa0 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74   leaves on the t
25ab0 72 75 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65  runk of the free
25ac0 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  list */.  MemPag
25ad0 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20  e *pTrunk = 0;. 
25ae0 20 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54   MemPage *pPrevT
25af0 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f  runk = 0;.  Pgno
25b00 20 6d 78 50 61 67 65 3b 20 20 20 20 20 2f 2a 20   mxPage;     /* 
25b10 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68  Total size of th
25b20 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
25b30 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
25b40 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
25b50 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
25b60 20 20 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e    pPage1 = pBt->
25b70 70 50 61 67 65 31 3b 0a 20 20 6d 78 50 61 67 65  pPage1;.  mxPage
25b80 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e   = btreePagecoun
25b90 74 28 70 42 74 29 3b 0a 20 20 6e 20 3d 20 67 65  t(pBt);.  n = ge
25ba0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
25bb0 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 74 65  aData[36]);.  te
25bc0 73 74 63 61 73 65 28 20 6e 3d 3d 6d 78 50 61 67  stcase( n==mxPag
25bd0 65 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 3e 3d  e-1 );.  if( n>=
25be0 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65  mxPage ){.    re
25bf0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
25c00 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
25c10 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f  if( n>0 ){.    /
25c20 2a 20 54 68 65 72 65 20 61 72 65 20 70 61 67 65  * There are page
25c30 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
25c40 74 2e 20 20 52 65 75 73 65 20 6f 6e 65 20 6f 66  t.  Reuse one of
25c50 20 74 68 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f   those pages. */
25c60 0a 20 20 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b  .    Pgno iTrunk
25c70 3b 0a 20 20 20 20 75 38 20 73 65 61 72 63 68 4c  ;.    u8 searchL
25c80 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74  ist = 0; /* If t
25c90 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6d 75 73  he free-list mus
25ca0 74 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f  t be searched fo
25cb0 72 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20  r 'nearby' */.  
25cc0 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
25cd0 20 27 65 78 61 63 74 27 20 70 61 72 61 6d 65 74   'exact' paramet
25ce0 65 72 20 77 61 73 20 74 72 75 65 20 61 6e 64 20  er was true and 
25cf0 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 70  a query of the p
25d00 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a  ointer-map.    *
25d10 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74 68 65  * shows that the
25d20 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69   page 'nearby' i
25d30 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74  s somewhere on t
25d40 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68  he free-list, th
25d50 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e  en.    ** the en
25d60 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62  tire-list will b
25d70 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74  e searched for t
25d80 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  hat page..    */
25d90 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
25da0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
25db0 20 20 20 20 69 66 28 20 65 78 61 63 74 20 26 26      if( exact &&
25dc0 20 6e 65 61 72 62 79 3c 3d 6d 78 50 61 67 65 20   nearby<=mxPage 
25dd0 29 7b 0a 20 20 20 20 20 20 75 38 20 65 54 79 70  ){.      u8 eTyp
25de0 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
25df0 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20   nearby>0 );.   
25e00 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
25e10 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20  autoVacuum );.  
25e20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47      rc = ptrmapG
25e30 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c 20  et(pBt, nearby, 
25e40 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20 20  &eType, 0);.    
25e50 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
25e60 6e 20 72 63 3b 0a 20 20 20 20 20 20 69 66 28 20  n rc;.      if( 
25e70 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52  eType==PTRMAP_FR
25e80 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  EEPAGE ){.      
25e90 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31    searchList = 1
25ea0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
25eb0 2a 70 50 67 6e 6f 20 3d 20 6e 65 61 72 62 79 3b  *pPgno = nearby;
25ec0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
25ed0 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20     /* Decrement 
25ee0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f  the free-list co
25ef0 75 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69 54  unt by 1. Set iT
25f00 72 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65  runk to the inde
25f10 78 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  x of the.    ** 
25f20 66 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20  first free-list 
25f30 74 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65  trunk page. iPre
25f40 76 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61  vTrunk is initia
25f50 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20  lly 1..    */.  
25f60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
25f70 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d  gerWrite(pPage1-
25f80 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
25f90 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
25fa0 63 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  c;.    put4byte(
25fb0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
25fc0 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f  6], n-1);..    /
25fd0 2a 20 54 68 65 20 63 6f 64 65 20 77 69 74 68 69  * The code withi
25fe0 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72  n this loop is r
25ff0 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20  un only once if 
26000 74 68 65 20 27 73 65 61 72 63 68 4c 69 73 74 27  the 'searchList'
26010 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a   variable.    **
26020 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74   is not true. Ot
26030 68 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73  herwise, it runs
26040 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74   once for each t
26050 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65  runk-page on the
26060 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73  .    ** free-lis
26070 74 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65  t until the page
26080 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63   'nearby' is loc
26090 61 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ated..    */.   
260a0 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65   do {.      pPre
260b0 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b  vTrunk = pTrunk;
260c0 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76  .      if( pPrev
260d0 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
260e0 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
260f0 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  te(&pPrevTrunk->
26100 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20  aData[0]);.     
26110 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26120 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  iTrunk = get4byt
26130 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
26140 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  [32]);.      }. 
26150 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
26160 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b  Trunk==mxPage );
26170 0a 20 20 20 20 20 20 69 66 28 20 69 54 72 75 6e  .      if( iTrun
26180 6b 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20  k>mxPage ){.    
26190 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
261a0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
261b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
261c0 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
261d0 50 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b  Page(pBt, iTrunk
261e0 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20  , &pTrunk, 0);. 
261f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
26200 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70   rc ){.        p
26210 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20  Trunk = 0;.     
26220 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
26230 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
26240 20 7d 0a 0a 20 20 20 20 20 20 6b 20 3d 20 67 65   }..      k = ge
26250 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
26260 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20  aData[4]);.     
26270 20 69 66 28 20 6b 3d 3d 30 20 26 26 20 21 73 65   if( k==0 && !se
26280 61 72 63 68 4c 69 73 74 20 29 7b 0a 20 20 20 20  archList ){.    
26290 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b      /* The trunk
262a0 20 68 61 73 20 6e 6f 20 6c 65 61 76 65 73 20 61   has no leaves a
262b0 6e 64 20 74 68 65 20 6c 69 73 74 20 69 73 20 6e  nd the list is n
262c0 6f 74 20 62 65 69 6e 67 20 73 65 61 72 63 68 65  ot being searche
262d0 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53  d. .        ** S
262e0 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 74 72  o extract the tr
262f0 75 6e 6b 20 70 61 67 65 20 69 74 73 65 6c 66 20  unk page itself 
26300 61 6e 64 20 75 73 65 20 69 74 20 61 73 20 74 68  and use it as th
26310 65 20 6e 65 77 6c 79 20 0a 20 20 20 20 20 20 20  e newly .       
26320 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 61   ** allocated pa
26330 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  ge */.        as
26340 73 65 72 74 28 20 70 50 72 65 76 54 72 75 6e 6b  sert( pPrevTrunk
26350 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  ==0 );.        r
26360 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
26370 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
26380 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
26390 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
263a0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
263b0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
263c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70      }.        *p
263d0 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20  Pgno = iTrunk;. 
263e0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
263f0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
26400 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
26410 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
26420 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e   *ppPage = pTrun
26430 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e  k;.        pTrun
26440 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54  k = 0;.        T
26450 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
26460 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66   %d trunk - %d f
26470 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e  ree pages left\n
26480 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29  ", *pPgno, n-1))
26490 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
264a0 28 20 6b 3e 28 75 33 32 29 28 70 42 74 2d 3e 75  ( k>(u32)(pBt->u
264b0 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29  sableSize/4 - 2)
264c0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56   ){.        /* V
264d0 61 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f 75 74  alue of k is out
264e0 20 6f 66 20 72 61 6e 67 65 2e 20 20 44 61 74 61   of range.  Data
264f0 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
26500 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
26510 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
26520 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  KPT;.        got
26530 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
26540 61 67 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  age;.#ifndef SQL
26550 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
26560 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  UUM.      }else 
26570 69 66 28 20 73 65 61 72 63 68 4c 69 73 74 20 26  if( searchList &
26580 26 20 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b  & nearby==iTrunk
26590 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
265a0 68 65 20 6c 69 73 74 20 69 73 20 62 65 69 6e 67  he list is being
265b0 20 73 65 61 72 63 68 65 64 20 61 6e 64 20 74 68   searched and th
265c0 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73  is trunk page is
265d0 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   the page.      
265e0 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65    ** to allocate
265f0 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  , regardless of 
26600 77 68 65 74 68 65 72 20 69 74 20 68 61 73 20 6c  whether it has l
26610 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  eaves..        *
26620 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
26630 28 20 2a 70 50 67 6e 6f 3d 3d 69 54 72 75 6e 6b  ( *pPgno==iTrunk
26640 20 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50   );.        *ppP
26650 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  age = pTrunk;.  
26660 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
26670 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63   = 0;.        rc
26680 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
26690 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
266a0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
266b0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
266c0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
266d0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
266e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
266f0 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   k==0 ){.       
26700 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75     if( !pPrevTru
26710 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nk ){.          
26720 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31    memcpy(&pPage1
26730 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54  ->aData[32], &pT
26740 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
26750 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  4);.          }e
26760 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
26770 20 6d 65 6d 63 70 79 28 26 70 50 72 65 76 54 72   memcpy(&pPrevTr
26780 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26  unk->aData[0], &
26790 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
267a0 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
267b0 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
267c0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
267d0 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20  e trunk page is 
267e0 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20  required by the 
267f0 63 61 6c 6c 65 72 20 62 75 74 20 69 74 20 63 6f  caller but it co
26800 6e 74 61 69 6e 73 20 0a 20 20 20 20 20 20 20 20  ntains .        
26810 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f    ** pointers to
26820 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 76 65   free-list leave
26830 73 2e 20 54 68 65 20 66 69 72 73 74 20 6c 65 61  s. The first lea
26840 66 20 62 65 63 6f 6d 65 73 20 61 20 74 72 75 6e  f becomes a trun
26850 6b 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  k.          ** p
26860 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  age in this case
26870 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
26880 20 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65           MemPage
26890 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20   *pNewTrunk;.   
268a0 20 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 77         Pgno iNew
268b0 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
268c0 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
268d0 38 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  8]);.          i
268e0 66 28 20 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50  f( iNewTrunk>mxP
268f0 61 67 65 20 29 7b 20 0a 20 20 20 20 20 20 20 20  age ){ .        
26900 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
26910 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
26920 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
26930 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
26940 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
26950 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
26960 28 20 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50  ( iNewTrunk==mxP
26970 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20  age );.         
26980 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
26990 67 65 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e  ge(pBt, iNewTrun
269a0 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30  k, &pNewTrunk, 0
269b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
269c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
269d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  {.            go
269e0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
269f0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
26a00 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
26a10 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
26a20 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44  te(pNewTrunk->pD
26a30 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
26a40 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
26a50 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
26a60 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
26a70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
26a80 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
26a90 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
26aa0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
26ab0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65       memcpy(&pNe
26ac0 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  wTrunk->aData[0]
26ad0 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
26ae0 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
26af0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 4e 65     put4byte(&pNe
26b00 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d  wTrunk->aData[4]
26b10 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  , k-1);.        
26b20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72    memcpy(&pNewTr
26b30 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26  unk->aData[8], &
26b40 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32  pTrunk->aData[12
26b50 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20  ], (k-1)*4);.   
26b60 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
26b70 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ge(pNewTrunk);. 
26b80 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50           if( !pP
26b90 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  revTrunk ){.    
26ba0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
26bb0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
26bc0 69 74 65 61 62 6c 65 28 70 50 61 67 65 31 2d 3e  iteable(pPage1->
26bd0 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20  pDbPage) );.    
26be0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
26bf0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
26c00 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b  32], iNewTrunk);
26c10 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
26c20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
26c30 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
26c40 72 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d  rite(pPrevTrunk-
26c50 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
26c60 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
26c70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67  .              g
26c80 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
26c90 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
26ca0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
26cb0 20 70 75 74 34 62 79 74 65 28 26 70 50 72 65 76   put4byte(&pPrev
26cc0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
26cd0 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20   iNewTrunk);.   
26ce0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26cf0 20 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e   }.        pTrun
26d00 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54  k = 0;.        T
26d10 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
26d20 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66   %d trunk - %d f
26d30 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e  ree pages left\n
26d40 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29  ", *pPgno, n-1))
26d50 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d  ;.#endif.      }
26d60 65 6c 73 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a  else if( k>0 ){.
26d70 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
26d80 63 74 20 61 20 6c 65 61 66 20 66 72 6f 6d 20 74  ct a leaf from t
26d90 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20  he trunk */.    
26da0 20 20 20 20 75 33 32 20 63 6c 6f 73 65 73 74 3b      u32 closest;
26db0 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 50  .        Pgno iP
26dc0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73  age;.        uns
26dd0 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74  igned char *aDat
26de0 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74  a = pTrunk->aDat
26df0 61 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  a;.        rc = 
26e00 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
26e10 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
26e20 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
26e30 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
26e40 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
26e50 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
26e60 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65  }.        if( ne
26e70 61 72 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20  arby>0 ){.      
26e80 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20      u32 i;.     
26e90 20 20 20 20 20 69 6e 74 20 64 69 73 74 3b 0a 20       int dist;. 
26ea0 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
26eb0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
26ec0 64 69 73 74 20 3d 20 67 65 74 34 62 79 74 65 28  dist = get4byte(
26ed0 26 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61  &aData[8]) - nea
26ee0 72 62 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69  rby;.          i
26ef0 66 28 20 64 69 73 74 3c 30 20 29 20 64 69 73 74  f( dist<0 ) dist
26f00 20 3d 20 2d 64 69 73 74 3b 0a 20 20 20 20 20 20   = -dist;.      
26f10 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b      for(i=1; i<k
26f20 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
26f30 20 20 20 20 69 6e 74 20 64 32 20 3d 20 67 65 74      int d2 = get
26f40 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69  4byte(&aData[8+i
26f50 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20  *4]) - nearby;. 
26f60 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64             if( d
26f70 32 3c 30 20 29 20 64 32 20 3d 20 2d 64 32 3b 0a  2<0 ) d2 = -d2;.
26f80 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
26f90 64 32 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20  d2<dist ){.     
26fa0 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
26fb0 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20   = i;.          
26fc0 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20      dist = d2;. 
26fd0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
26fe0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26ff0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
27000 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20    closest = 0;. 
27010 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
27020 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79    iPage = get4by
27030 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73  te(&aData[8+clos
27040 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20  est*4]);.       
27050 20 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65   testcase( iPage
27060 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20  ==mxPage );.    
27070 20 20 20 20 69 66 28 20 69 50 61 67 65 3e 6d 78      if( iPage>mx
27080 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
27090 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
270a0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
270b0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
270c0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
270d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
270e0 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65 3d  testcase( iPage=
270f0 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20  =mxPage );.     
27100 20 20 20 69 66 28 20 21 73 65 61 72 63 68 4c 69     if( !searchLi
27110 73 74 20 7c 7c 20 69 50 61 67 65 3d 3d 6e 65 61  st || iPage==nea
27120 72 62 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rby ){.         
27130 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a   int noContent;.
27140 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f            *pPgno
27150 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20   = iPage;.      
27160 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
27170 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61  CATE: %d was lea
27180 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72  f %d of %d on tr
27190 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20  unk %d".        
271a0 20 20 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d           ": %d m
271b0 6f 72 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e  ore free pages\n
271c0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
271d0 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73      *pPgno, clos
271e0 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b  est+1, k, pTrunk
271f0 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20  ->pgno, n-1));. 
27200 20 20 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f           if( clo
27210 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20  sest<k-1 ){.    
27220 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
27230 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a  aData[8+closest*
27240 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34  4], &aData[4+k*4
27250 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
27260 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75 74   }.          put
27270 34 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c  4byte(&aData[4],
27280 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20   k-1);.         
27290 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
272a0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
272b0 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
272c0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  ) );.          n
272d0 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72 65  oContent = !btre
272e0 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70  eGetHasContent(p
272f0 42 74 2c 20 2a 70 50 67 6e 6f 29 3b 0a 20 20 20  Bt, *pPgno);.   
27300 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
27310 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70  eGetPage(pBt, *p
27320 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f  Pgno, ppPage, no
27330 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20  Content);.      
27340 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
27350 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
27360 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
27370 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70  3PagerWrite((*pp
27380 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b  Page)->pDbPage);
27390 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
273a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
273b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
273c0 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
273d0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
273e0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
273f0 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68            search
27400 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  List = 0;.      
27410 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
27420 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
27430 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  revTrunk);.     
27440 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b   pPrevTrunk = 0;
27450 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65 61  .    }while( sea
27460 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c  rchList );.  }el
27470 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65  se{.    /* There
27480 20 61 72 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e   are no pages on
27490 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 73   the freelist, s
274a0 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 70  o create a new p
274b0 61 67 65 20 61 74 20 74 68 65 0a 20 20 20 20 2a  age at the.    *
274c0 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  * end of the fil
274d0 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  e */.    rc = sq
274e0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
274f0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62  pBt->pPage1->pDb
27500 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
27510 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
27520 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b     pBt->nPage++;
27530 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50  .    if( pBt->nP
27540 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  age==PENDING_BYT
27550 45 5f 50 41 47 45 28 70 42 74 29 20 29 20 70 42  E_PAGE(pBt) ) pB
27560 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69 66  t->nPage++;..#if
27570 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
27580 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
27590 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
275a0 75 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53  uum && PTRMAP_IS
275b0 50 41 47 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e  PAGE(pBt, pBt->n
275c0 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 2f  Page) ){.      /
275d0 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65  * If *pPgno refe
275e0 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d  rs to a pointer-
275f0 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61  map page, alloca
27600 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73  te two new pages
27610 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65  .      ** at the
27620 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
27630 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e   instead of one.
27640 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63   The first alloc
27650 61 74 65 64 20 70 61 67 65 0a 20 20 20 20 20 20  ated page.      
27660 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77  ** becomes a new
27670 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
27680 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73  e, the second is
27690 20 75 73 65 64 20 62 79 20 74 68 65 20 63 61 6c   used by the cal
276a0 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ler..      */.  
276b0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67      MemPage *pPg
276c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43   = 0;.      TRAC
276d0 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
276e0 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c   from end of fil
276f0 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  e (pointer-map p
27700 61 67 65 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50  age)\n", pBt->nP
27710 61 67 65 29 29 3b 0a 20 20 20 20 20 20 61 73 73  age));.      ass
27720 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 21  ert( pBt->nPage!
27730 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
27740 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20  GE(pBt) );.     
27750 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
27760 67 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61  ge(pBt, pBt->nPa
27770 67 65 2c 20 26 70 50 67 2c 20 31 29 3b 0a 20 20  ge, &pPg, 1);.  
27780 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
27790 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
277a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
277b0 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62  erWrite(pPg->pDb
277c0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Page);.        r
277d0 65 6c 65 61 73 65 50 61 67 65 28 70 50 67 29 3b  eleasePage(pPg);
277e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
277f0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
27800 63 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  c;.      pBt->nP
27810 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  age++;.      if(
27820 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e   pBt->nPage==PEN
27830 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
27840 42 74 29 20 29 7b 20 70 42 74 2d 3e 6e 50 61 67  Bt) ){ pBt->nPag
27850 65 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e  e++; }.    }.#en
27860 64 69 66 0a 20 20 20 20 70 75 74 34 62 79 74 65  dif.    put4byte
27870 28 32 38 20 2b 20 28 75 38 2a 29 70 42 74 2d 3e  (28 + (u8*)pBt->
27880 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 70  pPage1->aData, p
27890 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
278a0 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50  *pPgno = pBt->nP
278b0 61 67 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  age;..    assert
278c0 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  ( *pPgno!=PENDIN
278d0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
278e0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   );.    rc = btr
278f0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a  eeGetPage(pBt, *
27900 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 31  pPgno, ppPage, 1
27910 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
27920 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72  return rc;.    r
27930 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
27940 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d  Write((*ppPage)-
27950 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
27960 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
27970 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
27980 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
27990 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28      }.    TRACE(
279a0 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66  ("ALLOCATE: %d f
279b0 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c  rom end of file\
279c0 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20  n", *pPgno));.  
279d0 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 50  }..  assert( *pP
279e0 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno!=PENDING_BYT
279f0 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a  E_PAGE(pBt) );..
27a00 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
27a10 65 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  e:.  releasePage
27a20 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65  (pTrunk);.  rele
27a30 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75  asePage(pPrevTru
27a40 6e 6b 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  nk);.  if( rc==S
27a50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
27a60 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  if( sqlite3Pager
27a70 50 61 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70  PageRefcount((*p
27a80 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
27a90 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  >1 ){.      rele
27aa0 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29  asePage(*ppPage)
27ab0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
27ac0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
27ad0 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 2a  PT;.    }.    (*
27ae0 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 20  ppPage)->isInit 
27af0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
27b00 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
27b10 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
27b20 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
27b30 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
27b40 6f 20 61 64 64 20 70 61 67 65 20 69 50 61 67 65  o add page iPage
27b50 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
27b60 20 66 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e   file free-list.
27b70 20 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d   .** It is assum
27b80 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ed that the page
27b90 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
27ba0 61 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 72  a part of the fr
27bb0 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  ee-list..**.** T
27bc0 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  he value passed 
27bd0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
27be0 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
27bf0 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f  unction is optio
27c00 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63  nal..** If the c
27c10 61 6c 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f  aller happens to
27c20 20 68 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20   have a pointer 
27c30 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f  to the MemPage o
27c40 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73  bject .** corres
27c50 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20  ponding to page 
27c60 69 50 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20  iPage handy, it 
27c70 6d 61 79 20 70 61 73 73 20 69 74 20 61 73 20 74  may pass it as t
27c80 68 65 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e  he second value.
27c90 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20   .** Otherwise, 
27ca0 69 74 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c  it may pass NULL
27cb0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69  ..**.** If a poi
27cc0 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67  nter to a MemPag
27cd0 65 20 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73  e object is pass
27ce0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
27cf0 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74   argument,.** it
27d00 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  s reference coun
27d10 74 20 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64  t is not altered
27d20 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
27d30 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
27d40 20 66 72 65 65 50 61 67 65 32 28 42 74 53 68 61   freePage2(BtSha
27d50 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67  red *pBt, MemPag
27d60 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e  e *pMemPage, Pgn
27d70 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50  o iPage){.  MemP
27d80 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b  age *pTrunk = 0;
27d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27da0 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75  /* Free-list tru
27db0 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e  nk page */.  Pgn
27dc0 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20  o iTrunk = 0;   
27dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27de0 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
27df0 6f 66 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  of free-list tru
27e00 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65  nk page */ .  Me
27e10 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20  mPage *pPage1 = 
27e20 70 42 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20  pBt->pPage1;    
27e30 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72    /* Local refer
27e40 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a  ence to page 1 *
27e50 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
27e60 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
27e70 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
27e80 62 65 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79  being freed. May
27e90 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69   be NULL. */.  i
27ea0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
27eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ec0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
27ed0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65  e */.  int nFree
27ee0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27ef0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
27f00 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  itial number of 
27f10 70 61 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69  pages on free-li
27f20 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  st */..  assert(
27f30 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
27f40 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
27f50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 50 61  );.  assert( iPa
27f60 67 65 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74  ge>1 );.  assert
27f70 28 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70  ( !pMemPage || p
27f80 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69  MemPage->pgno==i
27f90 50 61 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 70  Page );..  if( p
27fa0 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 70  MemPage ){.    p
27fb0 50 61 67 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b  Page = pMemPage;
27fc0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
27fd0 72 52 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50  rRef(pPage->pDbP
27fe0 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  age);.  }else{. 
27ff0 20 20 20 70 50 61 67 65 20 3d 20 62 74 72 65 65     pPage = btree
28000 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20  PageLookup(pBt, 
28010 69 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  iPage);.  }..  /
28020 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
28030 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20  free page count 
28040 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72  on pPage1 */.  r
28050 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
28060 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
28070 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
28080 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65   ) goto freepage
28090 5f 6f 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20  _out;.  nFree = 
280a0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
280b0 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
280c0 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
280d0 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72  ->aData[36], nFr
280e0 65 65 2b 31 29 3b 0a 0a 20 20 69 66 28 20 70 42  ee+1);..  if( pB
280f0 74 2d 3e 73 65 63 75 72 65 44 65 6c 65 74 65 20  t->secureDelete 
28100 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
28110 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 20 6f   secure_delete o
28120 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64  ption is enabled
28130 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c  , then.    ** al
28140 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77  ways fully overw
28150 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66  rite deleted inf
28160 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65  ormation with ze
28170 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ros..    */.    
28180 69 66 28 20 28 21 70 50 61 67 65 20 26 26 20 28  if( (!pPage && (
28190 28 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61  (rc = btreeGetPa
281a0 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26  ge(pBt, iPage, &
281b0 70 50 61 67 65 2c 20 30 29 29 21 3d 30 29 20 29  pPage, 0))!=0) )
281c0 0a 20 20 20 20 20 7c 7c 20 20 20 20 20 20 20 20  .     ||        
281d0 20 20 20 20 28 28 72 63 20 3d 20 73 71 6c 69 74      ((rc = sqlit
281e0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
281f0 67 65 2d 3e 70 44 62 50 61 67 65 29 29 21 3d 30  ge->pDbPage))!=0
28200 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67  ).    ){.      g
28210 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
28220 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73  ;.    }.    mems
28230 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  et(pPage->aData,
28240 20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e   0, pPage->pBt->
28250 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a  pageSize);.  }..
28260 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
28270 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75  base supports au
28280 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65  to-vacuum, write
28290 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65   an entry in the
282a0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a   pointer-map.  *
282b0 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  * to indicate th
282c0 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 66  at the page is f
282d0 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ree..  */.  if( 
282e0 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
282f0 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
28300 74 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50  t, iPage, PTRMAP
28310 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20 26 72  _FREEPAGE, 0, &r
28320 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  c);.    if( rc )
28330 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
28340 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  ut;.  }..  /* No
28350 77 20 6d 61 6e 69 70 75 6c 61 74 65 20 74 68 65  w manipulate the
28360 20 61 63 74 75 61 6c 20 64 61 74 61 62 61 73 65   actual database
28370 20 66 72 65 65 2d 6c 69 73 74 20 73 74 72 75 63   free-list struc
28380 74 75 72 65 2e 20 54 68 65 72 65 20 61 72 65 20  ture. There are 
28390 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69  two.  ** possibi
283a0 6c 69 74 69 65 73 2e 20 49 66 20 74 68 65 20 66  lities. If the f
283b0 72 65 65 2d 6c 69 73 74 20 69 73 20 63 75 72 72  ree-list is curr
283c0 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20  ently empty, or 
283d0 69 66 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a  if the first.  *
283e0 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  * trunk page in 
283f0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
28400 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73   full, then this
28410 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d   page will becom
28420 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65  e a.  ** new fre
28430 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
28440 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  e. Otherwise, it
28450 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c   will become a l
28460 65 61 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  eaf of the.  ** 
28470 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65  first trunk page
28480 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
28490 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20  free-list. This 
284a0 62 6c 6f 63 6b 20 74 65 73 74 73 20 69 66 20 69  block tests if i
284b0 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62  t.  ** is possib
284c0 6c 65 20 74 6f 20 61 64 64 20 74 68 65 20 70 61  le to add the pa
284d0 67 65 20 61 73 20 61 20 6e 65 77 20 66 72 65 65  ge as a new free
284e0 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f  -list leaf..  */
284f0 0a 20 20 69 66 28 20 6e 46 72 65 65 21 3d 30 20  .  if( nFree!=0 
28500 29 7b 0a 20 20 20 20 75 33 32 20 6e 4c 65 61 66  ){.    u32 nLeaf
28510 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28520 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62   /* Initial numb
28530 65 72 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73  er of leaf cells
28540 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 2a   on trunk page *
28550 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d 20  /..    iTrunk = 
28560 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
28570 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20  ->aData[32]);.  
28580 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
28590 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c  age(pBt, iTrunk,
285a0 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20   &pTrunk, 0);.  
285b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
285c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
285d0 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
285e0 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66      }..    nLeaf
285f0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
28600 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a  unk->aData[4]);.
28610 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
28620 3e 75 73 61 62 6c 65 53 69 7a 65 3e 33 32 20 29  >usableSize>32 )
28630 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20  ;.    if( nLeaf 
28640 3e 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62  > (u32)pBt->usab
28650 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a  leSize/4 - 2 ){.
28660 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
28670 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
28680 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
28690 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
286a0 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3c 20 28     if( nLeaf < (
286b0 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  u32)pBt->usableS
286c0 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20  ize/4 - 8 ){.   
286d0 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61     /* In this ca
286e0 73 65 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d  se there is room
286f0 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 70 61   on the trunk pa
28700 67 65 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65  ge to insert the
28710 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62   page.      ** b
28720 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20  eing freed as a 
28730 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20 20 20 20  new leaf..      
28740 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65  **.      ** Note
28750 20 74 68 61 74 20 74 68 65 20 74 72 75 6e 6b 20   that the trunk 
28760 70 61 67 65 20 69 73 20 6e 6f 74 20 72 65 61 6c  page is not real
28770 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74  ly full until it
28780 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20   contains.      
28790 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  ** usableSize/4 
287a0 2d 20 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74  - 2 entries, not
287b0 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
287c0 38 20 65 6e 74 72 69 65 73 20 61 73 20 77 65 20  8 entries as we 
287d0 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f  have.      ** co
287e0 64 65 64 2e 20 20 42 75 74 20 64 75 65 20 74 6f  ded.  But due to
287f0 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20   a coding error 
28800 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  in versions of S
28810 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 0a 20  QLite prior to. 
28820 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64       ** 3.6.0, d
28830 61 74 61 62 61 73 65 73 20 77 69 74 68 20 66 72  atabases with fr
28840 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
28850 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20  es holding more 
28860 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73  than.      ** us
28870 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65  ableSize/4 - 8 e
28880 6e 74 72 69 65 73 20 77 69 6c 6c 20 62 65 20 72  ntries will be r
28890 65 70 6f 72 74 65 64 20 61 73 20 63 6f 72 72 75  eported as corru
288a0 70 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20 20  pt.  In order.  
288b0 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61      ** to mainta
288c0 69 6e 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d  in backwards com
288d0 70 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 20  patibility with 
288e0 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  older versions o
288f0 66 20 53 51 4c 69 74 65 2c 0a 20 20 20 20 20 20  f SQLite,.      
28900 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69  ** we will conti
28910 6e 75 65 20 74 6f 20 72 65 73 74 72 69 63 74 20  nue to restrict 
28920 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
28930 74 72 69 65 73 20 74 6f 20 75 73 61 62 6c 65 53  tries to usableS
28940 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20 20 20  ize/4 - 8.      
28950 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20  ** for now.  At 
28960 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68  some point in th
28970 65 20 66 75 74 75 72 65 20 28 6f 6e 63 65 20 65  e future (once e
28980 76 65 72 79 6f 6e 65 20 68 61 73 20 75 70 67 72  veryone has upgr
28990 61 64 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f  aded.      ** to
289a0 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72 29   3.6.0 or later)
289b0 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69   we should consi
289c0 64 65 72 20 66 69 78 69 6e 67 20 74 68 65 20 63  der fixing the c
289d0 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65  onditional above
289e0 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 61  .      ** to rea
289f0 64 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d  d "usableSize/4-
28a00 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 75  2" instead of "u
28a10 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a  sableSize/4-8"..
28a20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
28a30 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
28a40 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
28a50 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
28a60 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
28a70 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  ){.        put4b
28a80 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
28a90 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b  ta[4], nLeaf+1);
28aa0 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
28ab0 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
28ac0 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69 50 61  [8+nLeaf*4], iPa
28ad0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
28ae0 20 70 50 61 67 65 20 26 26 20 21 70 42 74 2d 3e   pPage && !pBt->
28af0 73 65 63 75 72 65 44 65 6c 65 74 65 20 29 7b 0a  secureDelete ){.
28b00 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
28b10 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28  3PagerDontWrite(
28b20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
28b30 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
28b40 20 20 20 72 63 20 3d 20 62 74 72 65 65 53 65 74     rc = btreeSet
28b50 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20  HasContent(pBt, 
28b60 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  iPage);.      }.
28b70 20 20 20 20 20 20 54 52 41 43 45 28 28 22 46 52        TRACE(("FR
28b80 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66  EE-PAGE: %d leaf
28b90 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25   on trunk page %
28ba0 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f  d\n",pPage->pgno
28bb0 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b  ,pTrunk->pgno));
28bc0 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
28bd0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
28be0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e    }..  /* If con
28bf0 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68  trol flows to th
28c00 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69  is point, then i
28c10 74 20 77 61 73 20 6e 6f 74 20 70 6f 73 73 69 62  t was not possib
28c20 6c 65 20 74 6f 20 61 64 64 20 74 68 65 0a 20 20  le to add the.  
28c30 2a 2a 20 74 68 65 20 70 61 67 65 20 62 65 69 6e  ** the page bein
28c40 67 20 66 72 65 65 64 20 61 73 20 61 20 6c 65 61  g freed as a lea
28c50 66 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69  f page of the fi
28c60 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65  rst trunk in the
28c70 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a   free-list..  **
28c80 20 50 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73   Possibly becaus
28c90 65 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  e the free-list 
28ca0 69 73 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73  is empty, or pos
28cb0 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68  sibly because th
28cc0 65 20 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72  e .  ** first tr
28cd0 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d  unk in the free-
28ce0 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e 20 45 69  list is full. Ei
28cf0 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 70 61  ther way, the pa
28d00 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 0a 20  ge being freed. 
28d10 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20   ** will become 
28d20 74 68 65 20 6e 65 77 20 66 69 72 73 74 20 74 72  the new first tr
28d30 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
28d40 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a  free-list..  */.
28d50 20 20 69 66 28 20 70 50 61 67 65 3d 3d 30 20 26    if( pPage==0 &
28d60 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  & SQLITE_OK!=(rc
28d70 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
28d80 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61  pBt, iPage, &pPa
28d90 67 65 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 67  ge, 0)) ){.    g
28da0 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
28db0 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
28dc0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
28dd0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
28de0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
28df0 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
28e00 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
28e10 7d 0a 20 20 70 75 74 34 62 79 74 65 28 70 50 61  }.  put4byte(pPa
28e20 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 72 75 6e  ge->aData, iTrun
28e30 6b 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  k);.  put4byte(&
28e40 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c  pPage->aData[4],
28e50 20 30 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28   0);.  put4byte(
28e60 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
28e70 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 54 52  2], iPage);.  TR
28e80 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a  ACE(("FREE-PAGE:
28e90 20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61   %d new trunk pa
28ea0 67 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c  ge replacing %d\
28eb0 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  n", pPage->pgno,
28ec0 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65   iTrunk));..free
28ed0 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20  page_out:.  if( 
28ee0 70 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61  pPage ){.    pPa
28ef0 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
28f00 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67    }.  releasePag
28f10 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 6c 65  e(pPage);.  rele
28f20 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b  asePage(pTrunk);
28f30 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
28f40 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
28f50 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
28f60 61 67 65 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  age, int *pRC){.
28f70 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51    if( (*pRC)==SQ
28f80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
28f90 70 52 43 20 3d 20 66 72 65 65 50 61 67 65 32 28  pRC = freePage2(
28fa0 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 50 61 67  pPage->pBt, pPag
28fb0 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  e, pPage->pgno);
28fc0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  .  }.}../*.** Fr
28fd0 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  ee any overflow 
28fe0 70 61 67 65 73 20 61 73 73 6f 63 69 61 74 65 64  pages associated
28ff0 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
29000 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Cell..*/.static 
29010 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28 4d 65  int clearCell(Me
29020 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 6e  mPage *pPage, un
29030 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
29040 6c 6c 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ll){.  BtShared 
29050 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
29060 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  t;.  CellInfo in
29070 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50  fo;.  Pgno ovflP
29080 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  gno;.  int rc;. 
29090 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 31   int nOvfl;.  u1
290a0 36 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a  6 ovflPageSize;.
290b0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
290c0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
290d0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
290e0 20 29 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65   );.  btreeParse
290f0 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
29100 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
29110 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  if( info.iOverfl
29120 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ow==0 ){.    ret
29130 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  urn SQLITE_OK;  
29140 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70  /* No overflow p
29150 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74  ages. Return wit
29160 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68  hout doing anyth
29170 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66  ing */.  }.  ovf
29180 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  lPgno = get4byte
29190 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
291a0 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 61 73 73 65  erflow]);.  asse
291b0 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  rt( pBt->usableS
291c0 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66  ize > 4 );.  ovf
291d0 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d  lPageSize = pBt-
291e0 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
291f0 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f  .  nOvfl = (info
29200 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f  .nPayload - info
29210 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61  .nLocal + ovflPa
29220 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c  geSize - 1)/ovfl
29230 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65  PageSize;.  asse
29240 72 74 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20  rt( ovflPgno==0 
29250 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20 20  || nOvfl>0 );.  
29260 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29  while( nOvfl-- )
29270 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65 78 74  {.    Pgno iNext
29280 20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d 50 61 67   = 0;.    MemPag
29290 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20  e *pOvfl = 0;.  
292a0 20 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3c 32    if( ovflPgno<2
292b0 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 62 74 72   || ovflPgno>btr
292c0 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
292d0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 30 20 69   ){.      /* 0 i
292e0 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c 20 70 61  s not a legal pa
292f0 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61  ge number and pa
29300 67 65 20 31 20 63 61 6e 6e 6f 74 20 62 65 20 61  ge 1 cannot be a
29310 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72  n .      ** over
29320 66 6c 6f 77 20 70 61 67 65 2e 20 54 68 65 72 65  flow page. There
29330 66 6f 72 65 20 69 66 20 6f 76 66 6c 50 67 6e 6f  fore if ovflPgno
29340 3c 32 20 6f 72 20 70 61 73 74 20 74 68 65 20 65  <2 or past the e
29350 6e 64 20 6f 66 20 74 68 65 20 0a 20 20 20 20 20  nd of the .     
29360 20 2a 2a 20 66 69 6c 65 20 74 68 65 20 64 61 74   ** file the dat
29370 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f  abase must be co
29380 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20 20 20  rrupt. */.      
29390 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
293a0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
293b0 7d 0a 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20  }.    if( nOvfl 
293c0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65  ){.      rc = ge
293d0 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42  tOverflowPage(pB
293e0 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f  t, ovflPgno, &pO
293f0 76 66 6c 2c 20 26 69 4e 65 78 74 29 3b 0a 20 20  vfl, &iNext);.  
29400 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
29410 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
29420 20 20 20 69 66 28 20 28 20 70 4f 76 66 6c 20 7c     if( ( pOvfl |
29430 7c 20 28 28 70 4f 76 66 6c 20 3d 20 62 74 72 65  | ((pOvfl = btre
29440 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c  ePageLookup(pBt,
29450 20 6f 76 66 6c 50 67 6e 6f 29 29 21 3d 30 29 20   ovflPgno))!=0) 
29460 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65  ).     && sqlite
29470 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
29480 6e 74 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67  nt(pOvfl->pDbPag
29490 65 29 21 3d 31 0a 20 20 20 20 29 7b 0a 20 20 20  e)!=1.    ){.   
294a0 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e     /* There is n
294b0 6f 20 72 65 61 73 6f 6e 20 61 6e 79 20 63 75 72  o reason any cur
294c0 73 6f 72 20 73 68 6f 75 6c 64 20 68 61 76 65 20  sor should have 
294d0 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  an outstanding r
294e0 65 66 65 72 65 6e 63 65 20 0a 20 20 20 20 20 20  eference .      
294f0 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  ** to an overflo
29500 77 20 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67  w page belonging
29510 20 74 6f 20 61 20 63 65 6c 6c 20 74 68 61 74 20   to a cell that 
29520 69 73 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64  is being deleted
29530 2f 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20  /updated..      
29540 2a 2a 20 53 6f 20 69 66 20 74 68 65 72 65 20 65  ** So if there e
29550 78 69 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20  xists more than 
29560 6f 6e 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f  one reference to
29570 20 74 68 69 73 20 70 61 67 65 2c 20 74 68 65 6e   this page, then
29580 20 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 75   it .      ** mu
29590 73 74 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65  st not really be
295a0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
295b0 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  e and the databa
295c0 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  se must be corru
295d0 70 74 2e 20 0a 20 20 20 20 20 20 2a 2a 20 49 74  pt. .      ** It
295e0 20 69 73 20 68 65 6c 70 66 75 6c 20 74 6f 20 64   is helpful to d
295f0 65 74 65 63 74 20 74 68 69 73 20 62 65 66 6f 72  etect this befor
29600 65 20 63 61 6c 6c 69 6e 67 20 66 72 65 65 50 61  e calling freePa
29610 67 65 32 28 29 2c 20 61 73 20 0a 20 20 20 20 20  ge2(), as .     
29620 20 2a 2a 20 66 72 65 65 50 61 67 65 32 28 29 20   ** freePage2() 
29630 6d 61 79 20 7a 65 72 6f 20 74 68 65 20 70 61 67  may zero the pag
29640 65 20 63 6f 6e 74 65 6e 74 73 20 69 66 20 73 65  e contents if se
29650 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65  cure-delete mode
29660 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 65 6e 61   is.      ** ena
29670 62 6c 65 64 2e 20 49 66 20 74 68 69 73 20 27 6f  bled. If this 'o
29680 76 65 72 66 6c 6f 77 27 20 70 61 67 65 20 68 61  verflow' page ha
29690 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20 70 61  ppens to be a pa
296a0 67 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  ge that the.    
296b0 20 20 2a 2a 20 63 61 6c 6c 65 72 20 69 73 20 69    ** caller is i
296c0 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68  terating through
296d0 20 6f 72 20 75 73 69 6e 67 20 69 6e 20 73 6f 6d   or using in som
296e0 65 20 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69  e other way, thi
296f0 73 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e 20 62  s.      ** can b
29700 65 20 70 72 6f 62 6c 65 6d 61 74 69 63 2e 0a 20  e problematic.. 
29710 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
29720 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
29730 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73  T_BKPT;.    }els
29740 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 72  e{.      rc = fr
29750 65 65 50 61 67 65 32 28 70 42 74 2c 20 70 4f 76  eePage2(pBt, pOv
29760 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20  fl, ovflPgno);. 
29770 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f     }..    if( pO
29780 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  vfl ){.      sql
29790 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
297a0 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Ovfl->pDbPage);.
297b0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
297c0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
297d0 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e 65    ovflPgno = iNe
297e0 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  xt;.  }.  return
297f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
29800 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20  *.** Create the 
29810 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 75 73  byte sequence us
29820 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20  ed to represent 
29830 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70  a cell on page p
29840 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74  Page.** and writ
29850 65 20 74 68 61 74 20 62 79 74 65 20 73 65 71 75  e that byte sequ
29860 65 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b  ence into pCell[
29870 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67  ].  Overflow pag
29880 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61  es are.** alloca
29890 74 65 64 20 61 6e 64 20 66 69 6c 6c 65 64 20 69  ted and filled i
298a0 6e 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 20  n as necessary. 
298b0 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f   The calling pro
298c0 63 65 64 75 72 65 0a 2a 2a 20 69 73 20 72 65 73  cedure.** is res
298d0 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b  ponsible for mak
298e0 69 6e 67 20 73 75 72 65 20 73 75 66 66 69 63 69  ing sure suffici
298f0 65 6e 74 20 73 70 61 63 65 20 68 61 73 20 62 65  ent space has be
29900 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  en allocated.** 
29910 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a  for pCell[]..**.
29920 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 43 65  ** Note that pCe
29930 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65  ll does not nece
29940 73 73 61 72 79 20 6e 65 65 64 20 74 6f 20 70 6f  ssary need to po
29950 69 6e 74 20 74 6f 20 74 68 65 20 70 50 61 67 65  int to the pPage
29960 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e  ->aData.** area.
29970 20 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f    pCell might po
29980 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70  int to some temp
29990 6f 72 61 72 79 20 73 74 6f 72 61 67 65 2e 20 20  orary storage.  
299a0 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a  The cell will.**
299b0 20 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20   be constructed 
299c0 69 6e 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72  in this temporar
299d0 79 20 61 72 65 61 20 74 68 65 6e 20 63 6f 70 69  y area then copi
299e0 65 64 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61  ed into pPage->a
299f0 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a  Data.** later..*
29a00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
29a10 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  lInCell(.  MemPa
29a20 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
29a30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
29a40 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
29a50 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ins the cell */.
29a60 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
29a70 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
29a80 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65 78   /* Complete tex
29a90 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f  t of the cell */
29aa0 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
29ab0 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20  Key, i64 nKey,  
29ac0 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a    /* The key */.
29ad0 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44    const void *pD
29ae0 61 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20  ata,int nData,  
29af0 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a   /* The data */.
29b00 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20    int nZero,    
29b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b20 20 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f 20 62   /* Extra zero b
29b30 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74  ytes to append t
29b40 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74  o pData */.  int
29b50 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20   *pnSize        
29b60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
29b70 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68  rite cell size h
29b80 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
29b90 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73  nPayload;.  cons
29ba0 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e  t u8 *pSrc;.  in
29bb0 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20  t nSrc, n, rc;. 
29bc0 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b 0a   int spaceLeft;.
29bd0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c    MemPage *pOvfl
29be0 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20   = 0;.  MemPage 
29bf0 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b  *pToRelease = 0;
29c00 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
29c10 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69   *pPrior;.  unsi
29c20 67 6e 65 64 20 63 68 61 72 20 2a 70 50 61 79 6c  gned char *pPayl
29c30 6f 61 64 3b 0a 20 20 42 74 53 68 61 72 65 64 20  oad;.  BtShared 
29c40 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
29c50 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76  t;.  Pgno pgnoOv
29c60 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48  fl = 0;.  int nH
29c70 65 61 64 65 72 3b 0a 20 20 43 65 6c 6c 49 6e 66  eader;.  CellInf
29c80 6f 20 69 6e 66 6f 3b 0a 0a 20 20 61 73 73 65 72  o info;..  asser
29c90 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
29ca0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
29cb0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
29cc0 2a 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20 6e  * pPage is not n
29cd0 65 63 65 73 73 61 72 69 6c 79 20 77 72 69 74 65  ecessarily write
29ce0 61 62 6c 65 20 73 69 6e 63 65 20 70 43 65 6c 6c  able since pCell
29cf0 20 6d 69 67 68 74 20 62 65 20 61 75 78 69 6c 69   might be auxili
29d00 61 72 79 0a 20 20 2a 2a 20 62 75 66 66 65 72 20  ary.  ** buffer 
29d10 73 70 61 63 65 20 74 68 61 74 20 69 73 20 73 65  space that is se
29d20 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68 65 20  parate from the 
29d30 70 50 61 67 65 20 62 75 66 66 65 72 20 61 72 65  pPage buffer are
29d40 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  a */.  assert( p
29d50 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61 74  Cell<pPage->aDat
29d60 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50 61  a || pCell>=&pPa
29d70 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70  ge->aData[pBt->p
29d80 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20  ageSize].       
29d90 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50       || sqlite3P
29da0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
29db0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
29dc0 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  );..  /* Fill in
29dd0 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a   the header. */.
29de0 20 20 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a 20    nHeader = 0;. 
29df0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
29e00 66 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72  f ){.    nHeader
29e10 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66 28   += 4;.  }.  if(
29e20 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
29e30 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b  ){.    nHeader +
29e40 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65  = putVarint(&pCe
29e50 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44 61  ll[nHeader], nDa
29e60 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65 6c  ta+nZero);.  }el
29e70 73 65 7b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20  se{.    nData = 
29e80 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a 20  nZero = 0;.  }. 
29e90 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56   nHeader += putV
29ea0 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65  arint(&pCell[nHe
29eb0 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e  ader], *(u64*)&n
29ec0 4b 65 79 29 3b 0a 20 20 62 74 72 65 65 50 61 72  Key);.  btreePar
29ed0 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
29ee0 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
29ef0 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e    assert( info.n
29f00 48 65 61 64 65 72 3d 3d 6e 48 65 61 64 65 72 20  Header==nHeader 
29f10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66  );.  assert( inf
29f20 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a  o.nKey==nKey );.
29f30 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e    assert( info.n
29f40 44 61 74 61 3d 3d 28 75 33 32 29 28 6e 44 61 74  Data==(u32)(nDat
29f50 61 2b 6e 5a 65 72 6f 29 20 29 3b 0a 20 20 0a 20  a+nZero) );.  . 
29f60 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20   /* Fill in the 
29f70 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50 61  payload */.  nPa
29f80 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b 20  yload = nData + 
29f90 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20 70 50 61  nZero;.  if( pPa
29fa0 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
29fb0 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a    pSrc = pData;.
29fc0 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61      nSrc = nData
29fd0 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 30 3b  ;.    nData = 0;
29fe0 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 69  .  }else{ .    i
29ff0 66 28 20 4e 45 56 45 52 28 6e 4b 65 79 3e 30 78  f( NEVER(nKey>0x
2a000 37 66 66 66 66 66 66 66 20 7c 7c 20 70 4b 65 79  7fffffff || pKey
2a010 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 72 65  ==0) ){.      re
2a020 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
2a030 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
2a040 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d 20      nPayload += 
2a050 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 20 20 70  (int)nKey;.    p
2a060 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20  Src = pKey;.    
2a070 6e 53 72 63 20 3d 20 28 69 6e 74 29 6e 4b 65 79  nSrc = (int)nKey
2a080 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53 69 7a 65 20  ;.  }.  *pnSize 
2a090 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20  = info.nSize;.  
2a0a0 73 70 61 63 65 4c 65 66 74 20 3d 20 69 6e 66 6f  spaceLeft = info
2a0b0 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70 50 61 79 6c  .nLocal;.  pPayl
2a0c0 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65  oad = &pCell[nHe
2a0d0 61 64 65 72 5d 3b 0a 20 20 70 50 72 69 6f 72 20  ader];.  pPrior 
2a0e0 3d 20 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  = &pCell[info.iO
2a0f0 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77 68 69  verflow];..  whi
2a100 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20 29  le( nPayload>0 )
2a110 7b 0a 20 20 20 20 69 66 28 20 73 70 61 63 65 4c  {.    if( spaceL
2a120 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65  eft==0 ){.#ifnde
2a130 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
2a140 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 50  TOVACUUM.      P
2a150 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d  gno pgnoPtrmap =
2a160 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76   pgnoOvfl; /* Ov
2a170 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e  erflow page poin
2a180 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 70 61  ter-map entry pa
2a190 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ge */.      if( 
2a1a0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
2a1b0 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20  ){.        do{. 
2a1c0 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4f 76 66           pgnoOvf
2a1d0 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20 77  l++;.        } w
2a1e0 68 69 6c 65 28 20 0a 20 20 20 20 20 20 20 20 20  hile( .         
2a1f0 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
2a200 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c  Bt, pgnoOvfl) ||
2a210 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49   pgnoOvfl==PENDI
2a220 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
2a230 29 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  ) .        );.  
2a240 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
2a250 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
2a260 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
2a270 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c  pOvfl, &pgnoOvfl
2a280 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a  , pgnoOvfl, 0);.
2a290 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2a2a0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
2a2b0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64       /* If the d
2a2c0 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73  atabase supports
2a2d0 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e   auto-vacuum, an
2a2e0 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20  d the second or 
2a2f0 73 75 62 73 65 71 75 65 6e 74 0a 20 20 20 20 20  subsequent.     
2a300 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   ** overflow pag
2a310 65 20 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63  e is being alloc
2a320 61 74 65 64 2c 20 61 64 64 20 61 6e 20 65 6e 74  ated, add an ent
2a330 72 79 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65  ry to the pointe
2a340 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20 66  r-map.      ** f
2a350 6f 72 20 74 68 61 74 20 70 61 67 65 20 6e 6f 77  or that page now
2a360 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  . .      **.    
2a370 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20    ** If this is 
2a380 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c  the first overfl
2a390 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 77 72  ow page, then wr
2a3a0 69 74 65 20 61 20 70 61 72 74 69 61 6c 20 65 6e  ite a partial en
2a3b0 74 72 79 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f  try .      ** to
2a3c0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
2a3d0 2e 20 49 66 20 77 65 20 77 72 69 74 65 20 6e 6f  . If we write no
2a3e0 74 68 69 6e 67 20 74 6f 20 74 68 69 73 20 70 6f  thing to this po
2a3f0 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a  inter-map slot,.
2a400 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68        ** then th
2a410 65 20 6f 70 74 69 6d 69 73 74 69 63 20 6f 76 65  e optimistic ove
2a420 72 66 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f 63  rflow chain proc
2a430 65 73 73 69 6e 67 20 69 6e 20 63 6c 65 61 72 43  essing in clearC
2a440 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d  ell().      ** m
2a450 61 79 20 6d 69 73 69 6e 74 65 72 70 72 65 74 20  ay misinterpret 
2a460 74 68 65 20 75 6e 69 6e 69 74 69 61 6c 69 73 65  the uninitialise
2a470 64 20 76 61 6c 75 65 73 20 61 6e 64 20 64 65 6c  d values and del
2a480 65 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  ete the.      **
2a490 20 77 72 6f 6e 67 20 70 61 67 65 73 20 66 72 6f   wrong pages fro
2a4a0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  m the database..
2a4b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
2a4c0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
2a4d0 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  um && rc==SQLITE
2a4e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 75  _OK ){.        u
2a4f0 38 20 65 54 79 70 65 20 3d 20 28 70 67 6e 6f 50  8 eType = (pgnoP
2a500 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45  trmap?PTRMAP_OVE
2a510 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56  RFLOW2:PTRMAP_OV
2a520 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20  ERFLOW1);.      
2a530 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
2a540 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70 65   pgnoOvfl, eType
2a550 2c 20 70 67 6e 6f 50 74 72 6d 61 70 2c 20 26 72  , pgnoPtrmap, &r
2a560 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  c);.        if( 
2a570 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
2a580 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f 76 66  releasePage(pOvf
2a590 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  l);.        }.  
2a5a0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
2a5b0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
2a5c0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2a5d0 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20  (pToRelease);.  
2a5e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2a5f0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
2a600 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65  /* If pToRelease
2a610 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61   is not zero tha
2a620 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e 74 73 20  n pPrior points 
2a630 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61 72  into the data ar
2a640 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 70  ea.      ** of p
2a650 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65  ToRelease.  Make
2a660 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65   sure pToRelease
2a670 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
2a680 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  ble. */.      as
2a690 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65  sert( pToRelease
2a6a0 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61  ==0 || sqlite3Pa
2a6b0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2a6c0 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61  ToRelease->pDbPa
2a6d0 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ge) );..      /*
2a6e0 20 49 66 20 70 50 72 69 6f 72 20 69 73 20 70 61   If pPrior is pa
2a6f0 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61  rt of the data a
2a700 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68  rea of pPage, th
2a710 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61  en make sure pPa
2a720 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  ge.      ** is s
2a730 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a  till writeable *
2a740 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
2a750 70 50 72 69 6f 72 3c 70 50 61 67 65 2d 3e 61 44  pPrior<pPage->aD
2a760 61 74 61 20 7c 7c 20 70 50 72 69 6f 72 3e 3d 26  ata || pPrior>=&
2a770 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
2a780 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20  ->pageSize].    
2a790 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
2a7a0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2a7b0 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
2a7c0 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 70 75 74  e) );..      put
2a7d0 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 70 67  4byte(pPrior, pg
2a7e0 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 72  noOvfl);.      r
2a7f0 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65  eleasePage(pToRe
2a800 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 70 54  lease);.      pT
2a810 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c  oRelease = pOvfl
2a820 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d  ;.      pPrior =
2a830 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20   pOvfl->aData;. 
2a840 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50       put4byte(pP
2a850 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  rior, 0);.      
2a860 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66  pPayload = &pOvf
2a870 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20  l->aData[4];.   
2a880 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 70     spaceLeft = p
2a890 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
2a8a0 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20   4;.    }.    n 
2a8b0 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  = nPayload;.    
2a8c0 69 66 28 20 6e 3e 73 70 61 63 65 4c 65 66 74 20  if( n>spaceLeft 
2a8d0 29 20 6e 20 3d 20 73 70 61 63 65 4c 65 66 74 3b  ) n = spaceLeft;
2a8e0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52  ..    /* If pToR
2a8f0 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65  elease is not ze
2a900 72 6f 20 74 68 61 6e 20 70 50 61 79 6c 6f 61 64  ro than pPayload
2a910 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65   points into the
2a920 20 64 61 74 61 20 61 72 65 61 0a 20 20 20 20 2a   data area.    *
2a930 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e  * of pToRelease.
2a940 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52    Make sure pToR
2a950 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20  elease is still 
2a960 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20  writeable. */.  
2a970 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c    assert( pToRel
2a980 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  ease==0 || sqlit
2a990 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2a9a0 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70  le(pToRelease->p
2a9b0 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
2a9c0 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61 64 20 69  /* If pPayload i
2a9d0 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  s part of the da
2a9e0 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65  ta area of pPage
2a9f0 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65  , then make sure
2aa00 20 70 50 61 67 65 0a 20 20 20 20 2a 2a 20 69 73   pPage.    ** is
2aa10 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65   still writeable
2aa20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
2aa30 70 50 61 79 6c 6f 61 64 3c 70 50 61 67 65 2d 3e  pPayload<pPage->
2aa40 61 44 61 74 61 20 7c 7c 20 70 50 61 79 6c 6f 61  aData || pPayloa
2aa50 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61  d>=&pPage->aData
2aa60 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a  [pBt->pageSize].
2aa70 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
2aa80 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2aa90 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
2aaa0 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 69  bPage) );..    i
2aab0 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20  f( nSrc>0 ){.   
2aac0 20 20 20 69 66 28 20 6e 3e 6e 53 72 63 20 29 20     if( n>nSrc ) 
2aad0 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20 20  n = nSrc;.      
2aae0 61 73 73 65 72 74 28 20 70 53 72 63 20 29 3b 0a  assert( pSrc );.
2aaf0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61        memcpy(pPa
2ab00 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b  yload, pSrc, n);
2ab10 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2ab20 20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f 61    memset(pPayloa
2ab30 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a  d, 0, n);.    }.
2ab40 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20      nPayload -= 
2ab50 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61 64 20  n;.    pPayload 
2ab60 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b  += n;.    pSrc +
2ab70 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d  = n;.    nSrc -=
2ab80 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66   n;.    spaceLef
2ab90 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20  t -= n;.    if( 
2aba0 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nSrc==0 ){.     
2abb0 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20   nSrc = nData;. 
2abc0 20 20 20 20 20 70 53 72 63 20 3d 20 70 44 61 74       pSrc = pDat
2abd0 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  a;.    }.  }.  r
2abe0 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65  eleasePage(pToRe
2abf0 6c 65 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e  lease);.  return
2ac00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
2ac10 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20  *.** Remove the 
2ac20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70  i-th cell from p
2ac30 50 61 67 65 2e 20 20 54 68 69 73 20 72 6f 75 74  Page.  This rout
2ac40 69 6e 65 20 65 66 66 65 63 74 73 20 70 50 61 67  ine effects pPag
2ac50 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63  e only..** The c
2ac60 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e  ell content is n
2ac70 6f 74 20 66 72 65 65 64 20 6f 72 20 64 65 61 6c  ot freed or deal
2ac80 6c 6f 63 61 74 65 64 2e 20 20 49 74 20 69 73 20  located.  It is 
2ac90 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20  assumed that.** 
2aca0 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
2acb0 20 68 61 73 20 62 65 65 6e 20 63 6f 70 69 65 64   has been copied
2acc0 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e   someplace else.
2acd0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a    This routine j
2ace0 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74  ust.** removes t
2acf0 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  he reference to 
2ad00 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50  the cell from pP
2ad10 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20  age..**.** "sz" 
2ad20 6d 75 73 74 20 62 65 20 74 68 65 20 6e 75 6d 62  must be the numb
2ad30 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
2ad40 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  he cell..*/.stat
2ad50 69 63 20 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c  ic void dropCell
2ad60 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
2ad70 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 73 7a   int idx, int sz
2ad80 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69  , int *pRC){.  i
2ad90 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 2f  nt i;          /
2ada0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
2adb0 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20  /.  int pc;     
2adc0 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
2add0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66   cell content of
2ade0 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65   cell being dele
2adf0 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  ted */.  u8 *dat
2ae00 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67  a;       /* pPag
2ae10 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38  e->aData */.  u8
2ae20 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a   *ptr;        /*
2ae30 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79   Used to move by
2ae40 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69  tes around withi
2ae50 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
2ae60 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a  t rc;         /*
2ae70 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   The return code
2ae80 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20   */.  int hdr;  
2ae90 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69        /* Beginni
2aea0 6e 67 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ng of the header
2aeb0 2e 20 20 30 20 6d 6f 73 74 20 70 61 67 65 73 2e  .  0 most pages.
2aec0 20 20 31 30 30 20 70 61 67 65 20 31 20 2a 2f 0a    100 page 1 */.
2aed0 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65  .  if( *pRC ) re
2aee0 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28  turn;..  assert(
2aef0 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70   idx>=0 && idx<p
2af00 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
2af10 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c   assert( sz==cel
2af20 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78  lSize(pPage, idx
2af30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2af40 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2af50 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
2af60 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
2af70 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2af80 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
2af90 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64  t->mutex) );.  d
2afa0 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
2afb0 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 64 61 74  ta;.  ptr = &dat
2afc0 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  a[pPage->cellOff
2afd0 73 65 74 20 2b 20 32 2a 69 64 78 5d 3b 0a 20 20  set + 2*idx];.  
2afe0 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 74  pc = get2byte(pt
2aff0 72 29 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67  r);.  hdr = pPag
2b000 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
2b010 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 67 65  testcase( pc==ge
2b020 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
2b030 2b 35 5d 29 20 29 3b 0a 20 20 74 65 73 74 63 61  +5]) );.  testca
2b040 73 65 28 20 70 63 2b 73 7a 3d 3d 70 50 61 67 65  se( pc+sz==pPage
2b050 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
2b060 65 20 29 3b 0a 20 20 69 66 28 20 70 63 20 3c 20  e );.  if( pc < 
2b070 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
2b080 64 72 2b 35 5d 29 20 7c 7c 20 70 63 2b 73 7a 20  dr+5]) || pc+sz 
2b090 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  > pPage->pBt->us
2b0a0 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
2b0b0 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f  *pRC = SQLITE_CO
2b0c0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2b0d0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63  return;.  }.  rc
2b0e0 20 3d 20 66 72 65 65 53 70 61 63 65 28 70 50 61   = freeSpace(pPa
2b0f0 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69  ge, pc, sz);.  i
2b100 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 52  f( rc ){.    *pR
2b110 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75  C = rc;.    retu
2b120 72 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  rn;.  }.  for(i=
2b130 69 64 78 2b 31 3b 20 69 3c 70 50 61 67 65 2d 3e  idx+1; i<pPage->
2b140 6e 43 65 6c 6c 3b 20 69 2b 2b 2c 20 70 74 72 2b  nCell; i++, ptr+
2b150 3d 32 29 7b 0a 20 20 20 20 70 74 72 5b 30 5d 20  =2){.    ptr[0] 
2b160 3d 20 70 74 72 5b 32 5d 3b 0a 20 20 20 20 70 74  = ptr[2];.    pt
2b170 72 5b 31 5d 20 3d 20 70 74 72 5b 33 5d 3b 0a 20  r[1] = ptr[3];. 
2b180 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c   }.  pPage->nCel
2b190 6c 2d 2d 3b 0a 20 20 70 75 74 32 62 79 74 65 28  l--;.  put2byte(
2b1a0 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50  &data[hdr+3], pP
2b1b0 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70  age->nCell);.  p
2b1c0 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32  Page->nFree += 2
2b1d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72  ;.}../*.** Inser
2b1e0 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20  t a new cell on 
2b1f0 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e  pPage at cell in
2b200 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20  dex "i".  pCell 
2b210 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a  points to the.**
2b220 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
2b230 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  cell..**.** If t
2b240 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
2b250 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20  will fit on the 
2b260 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69  page, then put i
2b270 74 20 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a  t there.  If it.
2b280 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c  ** will not fit,
2b290 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70   then make a cop
2b2a0 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  y of the cell co
2b2b0 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70  ntent into pTemp
2b2c0 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20   if.** pTemp is 
2b2d0 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72  not null.  Regar
2b2e0 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20  dless of pTemp, 
2b2f0 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65  allocate a new e
2b300 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65  ntry.** in pPage
2b310 2d 3e 61 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61  ->aOvfl[] and ma
2b320 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20 74  ke it point to t
2b330 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
2b340 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54  (either.** in pT
2b350 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67 69  emp or the origi
2b360 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20 61  nal pCell) and a
2b370 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20 69  lso record its i
2b380 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61  ndex. .** Alloca
2b390 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72 79  ting a new entry
2b3a0 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c   in pPage->aCell
2b3b0 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20  [] implies that 
2b3c0 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  .** pPage->nOver
2b3d0 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65 6e  flow is incremen
2b3e0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53  ted..**.** If nS
2b3f0 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  kip is non-zero,
2b400 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 63 6f 70   then do not cop
2b410 79 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69  y the first nSki
2b420 70 20 62 79 74 65 73 20 6f 66 20 74 68 65 0a 2a  p bytes of the.*
2b430 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63 61 6c 6c  * cell. The call
2b440 65 72 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74  er will overwrit
2b450 65 20 74 68 65 6d 20 61 66 74 65 72 20 74 68 69  e them after thi
2b460 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
2b470 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69 70 20  ns. If.** nSkip 
2b480 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
2b490 6e 20 70 43 65 6c 6c 20 6d 61 79 20 6e 6f 74 20  n pCell may not 
2b4a0 70 6f 69 6e 74 20 74 6f 20 61 6e 20 69 6e 76 61  point to an inva
2b4b0 6c 69 64 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  lid memory locat
2b4c0 69 6f 6e 20 0a 2a 2a 20 28 62 75 74 20 70 43 65  ion .** (but pCe
2b4d0 6c 6c 2b 6e 53 6b 69 70 20 69 73 20 61 6c 77 61  ll+nSkip is alwa
2b4e0 79 73 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74  ys valid)..*/.st
2b4f0 61 74 69 63 20 76 6f 69 64 20 69 6e 73 65 72 74  atic void insert
2b500 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
2b510 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61 67  *pPage,   /* Pag
2b520 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20  e into which we 
2b530 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20  are copying */. 
2b540 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20 20   int i,         
2b550 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62     /* New cell b
2b560 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68 20  ecomes the i-th 
2b570 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67 65  cell of the page
2b580 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
2b590 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
2b5a0 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63 65  nt of the new ce
2b5b0 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20  ll */.  int sz, 
2b5c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
2b5d0 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e  es of content in
2b5e0 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a   pCell */.  u8 *
2b5f0 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a  pTemp,        /*
2b600 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73 70   Temp storage sp
2b610 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69  ace for pCell, i
2b620 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 50 67  f needed */.  Pg
2b630 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20 20  no iChild,      
2b640 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  /* If non-zero, 
2b650 72 65 70 6c 61 63 65 20 66 69 72 73 74 20 34 20  replace first 4 
2b660 62 79 74 65 73 20 77 69 74 68 20 74 68 69 73 20  bytes with this 
2b670 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  value */.  int *
2b680 70 52 43 20 20 20 20 20 20 20 20 20 20 2f 2a 20  pRC          /* 
2b690 52 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 72  Read and write r
2b6a0 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20  eturn code from 
2b6b0 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
2b6c0 20 69 64 78 20 3d 20 30 3b 20 20 20 20 20 20 2f   idx = 0;      /
2b6d0 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65  * Where to write
2b6e0 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   new cell conten
2b6f0 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  t in data[] */. 
2b700 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20   int j;         
2b710 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
2b720 65 72 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b  er */.  int end;
2b730 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
2b740 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65  st byte past the
2b750 20 6c 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74   last cell point
2b760 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  er in data[] */.
2b770 20 20 69 6e 74 20 69 6e 73 3b 20 20 20 20 20 20    int ins;      
2b780 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
2b790 64 61 74 61 5b 5d 20 77 68 65 72 65 20 6e 65 77  data[] where new
2b7a0 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73   cell pointer is
2b7b0 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 69   inserted */.  i
2b7c0 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20  nt cellOffset;  
2b7d0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 66   /* Address of f
2b7e0 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  irst cell pointe
2b7f0 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  r in data[] */. 
2b800 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
2b810 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e     /* The conten
2b820 74 20 6f 66 20 74 68 65 20 77 68 6f 6c 65 20 70  t of the whole p
2b830 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72  age */.  u8 *ptr
2b840 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73  ;          /* Us
2b850 65 64 20 66 6f 72 20 6d 6f 76 69 6e 67 20 69 6e  ed for moving in
2b860 66 6f 72 6d 61 74 69 6f 6e 20 61 72 6f 75 6e 64  formation around
2b870 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20   in data[] */.. 
2b880 20 69 6e 74 20 6e 53 6b 69 70 20 3d 20 28 69 43   int nSkip = (iC
2b890 68 69 6c 64 20 3f 20 34 20 3a 20 30 29 3b 0a 0a  hild ? 4 : 0);..
2b8a0 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
2b8b0 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  urn;..  assert( 
2b8c0 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61 67 65  i>=0 && i<=pPage
2b8d0 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e  ->nCell+pPage->n
2b8e0 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73  Overflow );.  as
2b8f0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
2b900 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67  ll<=MX_CELL(pPag
2b910 65 2d 3e 70 42 74 29 20 26 26 20 4d 58 5f 43 45  e->pBt) && MX_CE
2b920 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d  LL(pPage->pBt)<=
2b930 35 34 36 30 20 29 3b 0a 20 20 61 73 73 65 72 74  5460 );.  assert
2b940 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
2b950 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65 28 70 50  ow<=ArraySize(pP
2b960 61 67 65 2d 3e 61 4f 76 66 6c 29 20 29 3b 0a 20  age->aOvfl) );. 
2b970 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2b980 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
2b990 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
2b9a0 3b 0a 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20  ;.  /* The cell 
2b9b0 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20  should normally 
2b9c0 62 65 20 73 69 7a 65 64 20 63 6f 72 72 65 63 74  be sized correct
2b9d0 6c 79 2e 20 20 48 6f 77 65 76 65 72 2c 20 77 68  ly.  However, wh
2b9e0 65 6e 20 6d 6f 76 69 6e 67 20 61 0a 20 20 2a 2a  en moving a.  **
2b9f0 20 6d 61 6c 66 6f 72 6d 65 64 20 63 65 6c 6c 20   malformed cell 
2ba00 66 72 6f 6d 20 61 20 6c 65 61 66 20 70 61 67 65  from a leaf page
2ba10 20 74 6f 20 61 6e 20 69 6e 74 65 72 69 6f 72 20   to an interior 
2ba20 70 61 67 65 2c 20 69 66 20 74 68 65 20 63 65 6c  page, if the cel
2ba30 6c 20 73 69 7a 65 0a 20 20 2a 2a 20 77 61 6e 74  l size.  ** want
2ba40 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68  ed to be less th
2ba50 61 6e 20 34 20 62 75 74 20 67 6f 74 20 72 6f 75  an 4 but got rou
2ba60 6e 64 65 64 20 75 70 20 74 6f 20 34 20 6f 6e 20  nded up to 4 on 
2ba70 74 68 65 20 6c 65 61 66 2c 20 74 68 65 6e 20 73  the leaf, then s
2ba80 69 7a 65 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62  ize.  ** might b
2ba90 65 20 6c 65 73 73 20 74 68 61 6e 20 38 20 28 6c  e less than 8 (l
2baa0 65 61 66 2d 73 69 7a 65 20 2b 20 70 6f 69 6e 74  eaf-size + point
2bab0 65 72 29 20 6f 6e 20 74 68 65 20 69 6e 74 65 72  er) on the inter
2bac0 69 6f 72 20 6e 6f 64 65 2e 20 20 48 65 6e 63 65  ior node.  Hence
2bad0 0a 20 20 2a 2a 20 74 68 65 20 74 65 72 6d 20 61  .  ** the term a
2bae0 66 74 65 72 20 74 68 65 20 7c 7c 20 69 6e 20 74  fter the || in t
2baf0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
2bb00 65 72 74 28 29 2e 20 2a 2f 0a 20 20 61 73 73 65  ert(). */.  asse
2bb10 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65  rt( sz==cellSize
2bb20 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
2bb30 29 20 7c 7c 20 28 73 7a 3d 3d 38 20 26 26 20 69  ) || (sz==8 && i
2bb40 43 68 69 6c 64 3e 30 29 20 29 3b 0a 20 20 69 66  Child>0) );.  if
2bb50 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
2bb60 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65  ow || sz+2>pPage
2bb70 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 69  ->nFree ){.    i
2bb80 66 28 20 70 54 65 6d 70 20 29 7b 0a 20 20 20 20  f( pTemp ){.    
2bb90 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2b 6e    memcpy(pTemp+n
2bba0 53 6b 69 70 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69  Skip, pCell+nSki
2bbb0 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20  p, sz-nSkip);.  
2bbc0 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d      pCell = pTem
2bbd0 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  p;.    }.    if(
2bbe0 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20   iChild ){.     
2bbf0 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c   put4byte(pCell,
2bc00 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a   iChild);.    }.
2bc10 20 20 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e      j = pPage->n
2bc20 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20  Overflow++;.    
2bc30 61 73 73 65 72 74 28 20 6a 3c 28 69 6e 74 29 28  assert( j<(int)(
2bc40 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f  sizeof(pPage->aO
2bc50 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50 61 67  vfl)/sizeof(pPag
2bc60 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29 20 29 3b  e->aOvfl[0])) );
2bc70 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66  .    pPage->aOvf
2bc80 6c 5b 6a 5d 2e 70 43 65 6c 6c 20 3d 20 70 43 65  l[j].pCell = pCe
2bc90 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61  ll;.    pPage->a
2bca0 4f 76 66 6c 5b 6a 5d 2e 69 64 78 20 3d 20 28 75  Ovfl[j].idx = (u
2bcb0 31 36 29 69 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  16)i;.  }else{. 
2bcc0 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
2bcd0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
2bce0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
2bcf0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2bd00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70  E_OK ){.      *p
2bd10 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72  RC = rc;.      r
2bd20 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
2bd30 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2bd40 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2bd50 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2bd60 20 29 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70   );.    data = p
2bd70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20  Page->aData;.   
2bd80 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50   cellOffset = pP
2bd90 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b  age->cellOffset;
2bda0 0a 20 20 20 20 65 6e 64 20 3d 20 63 65 6c 6c 4f  .    end = cellO
2bdb0 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d  ffset + 2*pPage-
2bdc0 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 73 20  >nCell;.    ins 
2bdd0 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  = cellOffset + 2
2bde0 2a 69 3b 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c  *i;.    rc = all
2bdf0 6f 63 61 74 65 53 70 61 63 65 28 70 50 61 67 65  ocateSpace(pPage
2be00 2c 20 73 7a 2c 20 26 69 64 78 29 3b 0a 20 20 20  , sz, &idx);.   
2be10 20 69 66 28 20 72 63 20 29 7b 20 2a 70 52 43 20   if( rc ){ *pRC 
2be20 3d 20 72 63 3b 20 72 65 74 75 72 6e 3b 20 7d 0a  = rc; return; }.
2be30 20 20 20 20 2f 2a 20 54 68 65 20 61 6c 6c 6f 63      /* The alloc
2be40 61 74 65 53 70 61 63 65 28 29 20 72 6f 75 74 69  ateSpace() routi
2be50 6e 65 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  ne guarantees th
2be60 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20  e following two 
2be70 70 72 6f 70 65 72 74 69 65 73 0a 20 20 20 20 2a  properties.    *
2be80 2a 20 69 66 20 69 74 20 72 65 74 75 72 6e 73 20  * if it returns 
2be90 73 75 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 61  success */.    a
2bea0 73 73 65 72 74 28 20 69 64 78 20 3e 3d 20 65 6e  ssert( idx >= en
2beb0 64 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  d+2 );.    asser
2bec0 74 28 20 69 64 78 2b 73 7a 20 3c 3d 20 70 50 61  t( idx+sz <= pPa
2bed0 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
2bee0 69 7a 65 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ize );.    pPage
2bef0 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70  ->nCell++;.    p
2bf00 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28  Page->nFree -= (
2bf10 75 31 36 29 28 32 20 2b 20 73 7a 29 3b 0a 20 20  u16)(2 + sz);.  
2bf20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 69    memcpy(&data[i
2bf30 64 78 2b 6e 53 6b 69 70 5d 2c 20 70 43 65 6c 6c  dx+nSkip], pCell
2bf40 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70  +nSkip, sz-nSkip
2bf50 29 3b 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c  );.    if( iChil
2bf60 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62  d ){.      put4b
2bf70 79 74 65 28 26 64 61 74 61 5b 69 64 78 5d 2c 20  yte(&data[idx], 
2bf80 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20  iChild);.    }. 
2bf90 20 20 20 66 6f 72 28 6a 3d 65 6e 64 2c 20 70 74     for(j=end, pt
2bfa0 72 3d 26 64 61 74 61 5b 6a 5d 3b 20 6a 3e 69 6e  r=&data[j]; j>in
2bfb0 73 3b 20 6a 2d 3d 32 2c 20 70 74 72 2d 3d 32 29  s; j-=2, ptr-=2)
2bfc0 7b 0a 20 20 20 20 20 20 70 74 72 5b 30 5d 20 3d  {.      ptr[0] =
2bfd0 20 70 74 72 5b 2d 32 5d 3b 0a 20 20 20 20 20 20   ptr[-2];.      
2bfe0 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b 2d 31 5d  ptr[1] = ptr[-1]
2bff0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 32  ;.    }.    put2
2c000 62 79 74 65 28 26 64 61 74 61 5b 69 6e 73 5d 2c  byte(&data[ins],
2c010 20 69 64 78 29 3b 0a 20 20 20 20 70 75 74 32 62   idx);.    put2b
2c020 79 74 65 28 26 64 61 74 61 5b 70 50 61 67 65 2d  yte(&data[pPage-
2c030 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c 20 70  >hdrOffset+3], p
2c040 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 23 69  Page->nCell);.#i
2c050 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2c060 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
2c070 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d   if( pPage->pBt-
2c080 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
2c090 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c       /* The cell
2c0a0 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61 20 70   may contain a p
2c0b0 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76 65  ointer to an ove
2c0c0 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 73  rflow page. If s
2c0d0 6f 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a  o, write.      *
2c0e0 2a 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20  * the entry for 
2c0f0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
2c100 65 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  e into the point
2c110 65 72 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f  er map..      */
2c120 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
2c130 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70  OvflPtr(pPage, p
2c140 43 65 6c 6c 2c 20 70 52 43 29 3b 0a 20 20 20 20  Cell, pRC);.    
2c150 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a  }.#endif.  }.}..
2c160 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 69 73 74  /*.** Add a list
2c170 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 20 70   of cells to a p
2c180 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 73  age.  The page s
2c190 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61 6c  hould be initial
2c1a0 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 20 54 68 65  ly empty..** The
2c1b0 20 63 65 6c 6c 73 20 61 72 65 20 67 75 61 72 61   cells are guara
2c1c0 6e 74 65 65 64 20 74 6f 20 66 69 74 20 6f 6e 20  nteed to fit on 
2c1d0 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  the page..*/.sta
2c1e0 74 69 63 20 76 6f 69 64 20 61 73 73 65 6d 62 6c  tic void assembl
2c1f0 65 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65  ePage(.  MemPage
2c200 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 54 68   *pPage,   /* Th
2c210 65 20 70 61 67 65 20 74 6f 20 62 65 20 61 73 73  e page to be ass
2c220 65 6d 62 6c 69 65 64 20 2a 2f 0a 20 20 69 6e 74  emblied */.  int
2c230 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f   nCell,        /
2c240 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
2c250 63 65 6c 6c 73 20 74 6f 20 61 64 64 20 74 6f 20  cells to add to 
2c260 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 75  this page */.  u
2c270 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20  8 **apCell,     
2c280 20 2f 2a 20 50 6f 69 6e 74 65 72 73 20 74 6f 20   /* Pointers to 
2c290 63 65 6c 6c 20 62 6f 64 69 65 73 20 2a 2f 0a 20  cell bodies */. 
2c2a0 20 75 31 36 20 2a 61 53 69 7a 65 20 20 20 20 20   u16 *aSize     
2c2b0 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20 74     /* Sizes of t
2c2c0 68 65 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20  he cells */.){. 
2c2d0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
2c2e0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
2c2f0 65 72 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  er */.  u8 *pCel
2c300 6c 70 74 72 3b 20 20 20 20 20 2f 2a 20 41 64 64  lptr;     /* Add
2c310 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c  ress of next cel
2c320 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69  l pointer */.  i
2c330 6e 74 20 63 65 6c 6c 62 6f 64 79 3b 20 20 20 20  nt cellbody;    
2c340 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e   /* Address of n
2c350 65 78 74 20 63 65 6c 6c 20 62 6f 64 79 20 2a 2f  ext cell body */
2c360 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61  .  u8 * const da
2c370 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
2c380 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  a;             /
2c390 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 61 74  * Pointer to dat
2c3a0 61 20 66 6f 72 20 70 50 61 67 65 20 2a 2f 0a 20  a for pPage */. 
2c3b0 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d   const int hdr =
2c3c0 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
2c3d0 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
2c3e0 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65 72  Offset of header
2c3f0 20 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20 63   on pPage */.  c
2c400 6f 6e 73 74 20 69 6e 74 20 6e 55 73 61 62 6c 65  onst int nUsable
2c410 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   = pPage->pBt->u
2c420 73 61 62 6c 65 53 69 7a 65 3b 20 2f 2a 20 55 73  sableSize; /* Us
2c430 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 70 61 67  able size of pag
2c440 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
2c450 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
2c460 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
2c470 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2c480 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
2c490 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
2c4a0 72 74 28 20 6e 43 65 6c 6c 3e 3d 30 20 26 26 20  rt( nCell>=0 && 
2c4b0 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70  nCell<=MX_CELL(p
2c4c0 50 61 67 65 2d 3e 70 42 74 29 20 26 26 20 4d 58  Page->pBt) && MX
2c4d0 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74  _CELL(pPage->pBt
2c4e0 29 3c 3d 35 34 36 30 20 29 3b 0a 20 20 61 73 73  )<=5460 );.  ass
2c4f0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
2c500 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
2c510 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
2c520 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
2c530 20 74 68 65 20 70 61 67 65 20 68 61 73 20 6a 75   the page has ju
2c540 73 74 20 62 65 65 6e 20 7a 65 72 6f 65 64 20 62  st been zeroed b
2c550 79 20 7a 65 72 6f 50 61 67 65 28 29 20 2a 2f 0a  y zeroPage() */.
2c560 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2c570 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61  >nCell==0 );.  a
2c580 73 73 65 72 74 28 20 67 65 74 32 62 79 74 65 28  ssert( get2byte(
2c590 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3d 3d 6e  &data[hdr+5])==n
2c5a0 55 73 61 62 6c 65 20 29 3b 0a 0a 20 20 70 43 65  Usable );..  pCe
2c5b0 6c 6c 70 74 72 20 3d 20 26 64 61 74 61 5b 70 50  llptr = &data[pP
2c5c0 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
2c5d0 2b 20 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20 63 65  + nCell*2];.  ce
2c5e0 6c 6c 62 6f 64 79 20 3d 20 6e 55 73 61 62 6c 65  llbody = nUsable
2c5f0 3b 0a 20 20 66 6f 72 28 69 3d 6e 43 65 6c 6c 2d  ;.  for(i=nCell-
2c600 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
2c610 20 20 20 70 43 65 6c 6c 70 74 72 20 2d 3d 20 32     pCellptr -= 2
2c620 3b 0a 20 20 20 20 63 65 6c 6c 62 6f 64 79 20 2d  ;.    cellbody -
2c630 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 20 20  = aSize[i];.    
2c640 70 75 74 32 62 79 74 65 28 70 43 65 6c 6c 70 74  put2byte(pCellpt
2c650 72 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20  r, cellbody);.  
2c660 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63    memcpy(&data[c
2c670 65 6c 6c 62 6f 64 79 5d 2c 20 61 70 43 65 6c 6c  ellbody], apCell
2c680 5b 69 5d 2c 20 61 53 69 7a 65 5b 69 5d 29 3b 0a  [i], aSize[i]);.
2c690 20 20 7d 0a 20 20 70 75 74 32 62 79 74 65 28 26    }.  put2byte(&
2c6a0 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 6e 43 65  data[hdr+3], nCe
2c6b0 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  ll);.  put2byte(
2c6c0 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 65  &data[hdr+5], ce
2c6d0 6c 6c 62 6f 64 79 29 3b 0a 20 20 70 50 61 67 65  llbody);.  pPage
2c6e0 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 6e 43 65 6c  ->nFree -= (nCel
2c6f0 6c 2a 32 20 2b 20 6e 55 73 61 62 6c 65 20 2d 20  l*2 + nUsable - 
2c700 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 70 50 61  cellbody);.  pPa
2c710 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 28 75 31 36  ge->nCell = (u16
2c720 29 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  )nCell;.}../*.**
2c730 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70   The following p
2c740 61 72 61 6d 65 74 65 72 73 20 64 65 74 65 72 6d  arameters determ
2c750 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61 64 6a  ine how many adj
2c760 61 63 65 6e 74 20 70 61 67 65 73 20 67 65 74 20  acent pages get 
2c770 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20 61  involved.** in a
2c780 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61   balancing opera
2c790 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68 65  tion.  NN is the
2c7a0 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68   number of neigh
2c7b0 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73  bors on either s
2c7c0 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61  ide.** of the pa
2c7d0 67 65 20 74 68 61 74 20 70 61 72 74 69 63 69 70  ge that particip
2c7e0 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e  ate in the balan
2c7f0 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20  cing operation. 
2c800 20 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20 74 6f   NB is the.** to
2c810 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
2c820 67 65 73 20 74 68 61 74 20 70 61 72 74 69 63 69  ges that partici
2c830 70 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20  pate, including 
2c840 74 68 65 20 74 61 72 67 65 74 20 70 61 67 65 20  the target page 
2c850 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68 62  and.** NN neighb
2c860 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69  ors on either si
2c870 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69  de..**.** The mi
2c880 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 4e  nimum value of N
2c890 4e 20 69 73 20 31 20 28 6f 66 20 63 6f 75 72 73  N is 1 (of cours
2c8a0 65 29 2e 20 20 49 6e 63 72 65 61 73 69 6e 67 20  e).  Increasing 
2c8b0 4e 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28 74  NN above 1.** (t
2c8c0 6f 20 32 20 6f 72 20 33 29 20 67 69 76 65 73 20  o 2 or 3) gives 
2c8d0 61 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76 65  a modest improve
2c8e0 6d 65 6e 74 20 69 6e 20 53 45 4c 45 43 54 20 61  ment in SELECT a
2c8f0 6e 64 20 44 45 4c 45 54 45 20 70 65 72 66 6f 72  nd DELETE perfor
2c900 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63 68  mance.** in exch
2c910 61 6e 67 65 20 66 6f 72 20 61 20 6c 61 72 67 65  ange for a large
2c920 72 20 64 65 67 72 61 64 61 74 69 6f 6e 20 69 6e  r degradation in
2c930 20 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41   INSERT and UPDA
2c940 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a  TE performance..
2c950 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  ** The value of 
2c960 4e 4e 20 61 70 70 65 61 72 73 20 74 6f 20 67 69  NN appears to gi
2c970 76 65 20 74 68 65 20 62 65 73 74 20 72 65 73 75  ve the best resu
2c980 6c 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a  lts overall..*/.
2c990 23 64 65 66 69 6e 65 20 4e 4e 20 31 20 20 20 20  #define NN 1    
2c9a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2c9b0 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20  er of neighbors 
2c9c0 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20 6f  on either side o
2c9d0 66 20 70 50 61 67 65 20 2a 2f 0a 23 64 65 66 69  f pPage */.#defi
2c9e0 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20 20  ne NB (NN*2+1)  
2c9f0 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61 67      /* Total pag
2ca00 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74  es involved in t
2ca10 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a 0a  he balance */...
2ca20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2ca30 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45  MIT_QUICKBALANCE
2ca40 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73  ./*.** This vers
2ca50 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63 65 28 29  ion of balance()
2ca60 20 68 61 6e 64 6c 65 73 20 74 68 65 20 63 6f 6d   handles the com
2ca70 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63 61 73 65  mon special case
2ca80 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e 65 77 20   where.** a new 
2ca90 65 6e 74 72 79 20 69 73 20 62 65 69 6e 67 20 69  entry is being i
2caa0 6e 73 65 72 74 65 64 20 6f 6e 20 74 68 65 20 65  nserted on the e
2cab0 78 74 72 65 6d 65 20 72 69 67 68 74 2d 65 6e 64  xtreme right-end
2cac0 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72 65 65 2c   of the.** tree,
2cad0 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   in other words,
2cae0 20 77 68 65 6e 20 74 68 65 20 6e 65 77 20 65 6e   when the new en
2caf0 74 72 79 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  try will become 
2cb00 74 68 65 20 6c 61 72 67 65 73 74 0a 2a 2a 20 65  the largest.** e
2cb10 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72 65 65  ntry in the tree
2cb20 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20  ..**.** Instead 
2cb30 6f 66 20 74 72 79 69 6e 67 20 74 6f 20 62 61 6c  of trying to bal
2cb40 61 6e 63 65 20 74 68 65 20 33 20 72 69 67 68 74  ance the 3 right
2cb50 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61 67 65 73  -most leaf pages
2cb60 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a 20 61 20  , just add.** a 
2cb70 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65 20  new page to the 
2cb80 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
2cb90 61 6e 64 20 70 75 74 20 74 68 65 20 6f 6e 65 20  and put the one 
2cba0 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20  new entry in.** 
2cbb0 74 68 61 74 20 70 61 67 65 2e 20 20 54 68 69 73  that page.  This
2cbc0 20 6c 65 61 76 65 73 20 74 68 65 20 72 69 67 68   leaves the righ
2cbd0 74 20 73 69 64 65 20 6f 66 20 74 68 65 20 74 72  t side of the tr
2cbe0 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a 2a 20 75  ee somewhat.** u
2cbf0 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42 75 74 20  nbalanced.  But 
2cc00 6f 64 64 73 20 61 72 65 20 74 68 61 74 20 77 65  odds are that we
2cc10 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 69   will be inserti
2cc20 6e 67 20 6e 65 77 20 65 6e 74 72 69 65 73 0a 2a  ng new entries.*
2cc30 2a 20 61 74 20 74 68 65 20 65 6e 64 20 73 6f 6f  * at the end soo
2cc40 6e 20 61 66 74 65 72 77 61 72 64 73 20 73 6f 20  n afterwards so 
2cc50 74 68 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79  the nearly empty
2cc60 20 70 61 67 65 20 77 69 6c 6c 20 71 75 69 63 6b   page will quick
2cc70 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e 20 20  ly.** fill up.  
2cc80 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a  On average..**.*
2cc90 2a 20 70 50 61 67 65 20 69 73 20 74 68 65 20 6c  * pPage is the l
2cca0 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20 69  eaf page which i
2ccb0 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  s the right-most
2ccc0 20 70 61 67 65 20 69 6e 20 74 68 65 20 74 72 65   page in the tre
2ccd0 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74 20 69 73  e..** pParent is
2cce0 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20 70 50   its parent.  pP
2ccf0 61 67 65 20 6d 75 73 74 20 68 61 76 65 20 61 20  age must have a 
2cd00 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c 6f 77 20  single overflow 
2cd10 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63 68 20 69  entry.** which i
2cd20 73 20 61 6c 73 6f 20 74 68 65 20 72 69 67 68 74  s also the right
2cd30 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f 6e 20 74  -most entry on t
2cd40 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  he page..**.** T
2cd50 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72  he pSpace buffer
2cd60 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72   is used to stor
2cd70 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63 6f  e a temporary co
2cd80 70 79 20 6f 66 20 74 68 65 20 64 69 76 69 64 65  py of the divide
2cd90 72 0a 2a 2a 20 63 65 6c 6c 20 74 68 61 74 20 77  r.** cell that w
2cda0 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20  ill be inserted 
2cdb0 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 53 75  into pParent. Su
2cdc0 63 68 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73  ch a cell consis
2cdd0 74 73 20 6f 66 20 61 20 34 0a 2a 2a 20 62 79 74  ts of a 4.** byt
2cde0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  e page number fo
2cdf0 6c 6c 6f 77 65 64 20 62 79 20 61 20 76 61 72 69  llowed by a vari
2ce00 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65  able length inte
2ce10 67 65 72 2e 20 49 6e 20 6f 74 68 65 72 0a 2a 2a  ger. In other.**
2ce20 20 77 6f 72 64 73 2c 20 61 74 20 6d 6f 73 74 20   words, at most 
2ce30 31 33 20 62 79 74 65 73 2e 20 48 65 6e 63 65 20  13 bytes. Hence 
2ce40 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65  the pSpace buffe
2ce50 72 20 6d 75 73 74 20 62 65 20 61 74 0a 2a 2a 20  r must be at.** 
2ce60 6c 65 61 73 74 20 31 33 20 62 79 74 65 73 20 69  least 13 bytes i
2ce70 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  n size..*/.stati
2ce80 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75  c int balance_qu
2ce90 69 63 6b 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ick(MemPage *pPa
2cea0 72 65 6e 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70  rent, MemPage *p
2ceb0 50 61 67 65 2c 20 75 38 20 2a 70 53 70 61 63 65  Page, u8 *pSpace
2cec0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 63  ){.  BtShared *c
2ced0 6f 6e 73 74 20 70 42 74 20 3d 20 70 50 61 67 65  onst pBt = pPage
2cee0 2d 3e 70 42 74 3b 20 20 20 20 2f 2a 20 42 2d 54  ->pBt;    /* B-T
2cef0 72 65 65 20 44 61 74 61 62 61 73 65 20 2a 2f 0a  ree Database */.
2cf00 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b    MemPage *pNew;
2cf10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cf20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20         /* Newly 
2cf30 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a  allocated page *
2cf40 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
2cf50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cf60 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2cf70 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67 6e  rn Code */.  Pgn
2cf80 6f 20 70 67 6e 6f 4e 65 77 3b 20 20 20 20 20 20  o pgnoNew;      
2cf90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cfa0 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
2cfb0 20 6f 66 20 70 4e 65 77 20 2a 2f 0a 0a 20 20 61   of pNew */..  a
2cfc0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2cfd0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
2cfe0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
2cff0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2d000 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2d010 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61  e(pParent->pDbPa
2d020 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
2d030 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
2d040 77 3d 3d 31 20 29 3b 0a 0a 20 20 69 66 28 20 70  w==1 );..  if( p
2d050 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 30 20 29  Page->nCell<=0 )
2d060 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
2d070 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20  ORRUPT_BKPT;..  
2d080 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  /* Allocate a ne
2d090 77 20 70 61 67 65 2e 20 54 68 69 73 20 70 61 67  w page. This pag
2d0a0 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  e will become th
2d0b0 65 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67 20  e right-sibling 
2d0c0 6f 66 20 0a 20 20 2a 2a 20 70 50 61 67 65 2e 20  of .  ** pPage. 
2d0d0 4d 61 6b 65 20 74 68 65 20 70 61 72 65 6e 74 20  Make the parent 
2d0e0 70 61 67 65 20 77 72 69 74 61 62 6c 65 2c 20 73  page writable, s
2d0f0 6f 20 74 68 61 74 20 74 68 65 20 6e 65 77 20 64  o that the new d
2d100 69 76 69 64 65 72 20 63 65 6c 6c 0a 20 20 2a 2a  ivider cell.  **
2d110 20 6d 61 79 20 62 65 20 69 6e 73 65 72 74 65 64   may be inserted
2d120 2e 20 49 66 20 62 6f 74 68 20 74 68 65 73 65 20  . If both these 
2d130 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20 73  operations are s
2d140 75 63 63 65 73 73 66 75 6c 2c 20 70 72 6f 63 65  uccessful, proce
2d150 65 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ed..  */.  rc = 
2d160 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
2d170 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70  e(pBt, &pNew, &p
2d180 67 6e 6f 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 0a  gnoNew, 0, 0);..
2d190 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2d1a0 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20 75 38 20 2a  _OK ){..    u8 *
2d1b0 70 4f 75 74 20 3d 20 26 70 53 70 61 63 65 5b 34  pOut = &pSpace[4
2d1c0 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  ];.    u8 *pCell
2d1d0 20 3d 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b   = pPage->aOvfl[
2d1e0 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20 20 20 75 31  0].pCell;.    u1
2d1f0 36 20 73 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c 53  6 szCell = cellS
2d200 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43  izePtr(pPage, pC
2d210 65 6c 6c 29 3b 0a 20 20 20 20 75 38 20 2a 70 53  ell);.    u8 *pS
2d220 74 6f 70 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  top;..    assert
2d230 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
2d240 77 72 69 74 65 61 62 6c 65 28 70 4e 65 77 2d 3e  writeable(pNew->
2d250 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20  pDbPage) );.    
2d260 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61  assert( pPage->a
2d270 44 61 74 61 5b 30 5d 3d 3d 28 50 54 46 5f 49 4e  Data[0]==(PTF_IN
2d280 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41 54  TKEY|PTF_LEAFDAT
2d290 41 7c 50 54 46 5f 4c 45 41 46 29 20 29 3b 0a 20  A|PTF_LEAF) );. 
2d2a0 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77     zeroPage(pNew
2d2b0 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46  , PTF_INTKEY|PTF
2d2c0 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 4c 45  _LEAFDATA|PTF_LE
2d2d0 41 46 29 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c  AF);.    assembl
2d2e0 65 50 61 67 65 28 70 4e 65 77 2c 20 31 2c 20 26  ePage(pNew, 1, &
2d2f0 70 43 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29 3b  pCell, &szCell);
2d300 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
2d310 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   is an auto-vacu
2d320 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70 64  um database, upd
2d330 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ate the pointer 
2d340 6d 61 70 0a 20 20 20 20 2a 2a 20 77 69 74 68 20  map.    ** with 
2d350 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20  entries for the 
2d360 6e 65 77 20 70 61 67 65 2c 20 61 6e 64 20 61 6e  new page, and an
2d370 79 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74  y pointer from t
2d380 68 65 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20  he .    ** cell 
2d390 6f 6e 20 74 68 65 20 70 61 67 65 20 74 6f 20 61  on the page to a
2d3a0 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  n overflow page.
2d3b0 20 49 66 20 65 69 74 68 65 72 20 6f 66 20 74 68   If either of th
2d3c0 65 73 65 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61  ese.    ** opera
2d3d0 74 69 6f 6e 73 20 66 61 69 6c 73 2c 20 74 68 65  tions fails, the
2d3e0 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20   return code is 
2d3f0 73 65 74 2c 20 62 75 74 20 74 68 65 20 63 6f 6e  set, but the con
2d400 74 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20  tents.    ** of 
2d410 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
2d420 61 72 65 20 73 74 69 6c 6c 20 6d 61 6e 69 70 75  are still manipu
2d430 6c 61 74 65 64 20 62 79 20 74 68 68 20 63 6f 64  lated by thh cod
2d440 65 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a 20  e below..    ** 
2d450 54 68 61 74 20 69 73 20 4f 6b 2c 20 61 74 20 74  That is Ok, at t
2d460 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 70 61  his point the pa
2d470 72 65 6e 74 20 70 61 67 65 20 69 73 20 67 75 61  rent page is gua
2d480 72 61 6e 74 65 65 64 20 74 6f 0a 20 20 20 20 2a  ranteed to.    *
2d490 2a 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64  * be marked as d
2d4a0 69 72 74 79 2e 20 52 65 74 75 72 6e 69 6e 67 20  irty. Returning 
2d4b0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77 69  an error code wi
2d4c0 6c 6c 20 63 61 75 73 65 20 61 0a 20 20 20 20 2a  ll cause a.    *
2d4d0 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 75 6e 64 6f  * rollback, undo
2d4e0 69 6e 67 20 61 6e 79 20 63 68 61 6e 67 65 73 20  ing any changes 
2d4f0 6d 61 64 65 20 74 6f 20 74 68 65 20 70 61 72 65  made to the pare
2d500 6e 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  nt page..    */.
2d510 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41      if( ISAUTOVA
2d520 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 70 74  CUUM ){.      pt
2d530 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e  rmapPut(pBt, pgn
2d540 6f 4e 65 77 2c 20 50 54 52 4d 41 50 5f 42 54 52  oNew, PTRMAP_BTR
2d550 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e  EE, pParent->pgn
2d560 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69  o, &rc);.      i
2d570 66 28 20 73 7a 43 65 6c 6c 3e 70 4e 65 77 2d 3e  f( szCell>pNew->
2d580 6d 69 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  minLocal ){.    
2d590 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66      ptrmapPutOvf
2d5a0 6c 50 74 72 28 70 4e 65 77 2c 20 70 43 65 6c 6c  lPtr(pNew, pCell
2d5b0 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a  , &rc);.      }.
2d5c0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
2d5d0 43 72 65 61 74 65 20 61 20 64 69 76 69 64 65 72  Create a divider
2d5e0 20 63 65 6c 6c 20 74 6f 20 69 6e 73 65 72 74 20   cell to insert 
2d5f0 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 54 68  into pParent. Th
2d600 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 0a 20  e divider cell. 
2d610 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 73 20 6f     ** consists o
2d620 66 20 61 20 34 2d 62 79 74 65 20 70 61 67 65 20  f a 4-byte page 
2d630 6e 75 6d 62 65 72 20 28 74 68 65 20 70 61 67 65  number (the page
2d640 20 6e 75 6d 62 65 72 20 6f 66 20 70 50 61 67 65   number of pPage
2d650 29 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61 20 76  ) and.    ** a v
2d660 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b  ariable length k
2d670 65 79 20 76 61 6c 75 65 20 28 77 68 69 63 68 20  ey value (which 
2d680 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65  must be the same
2d690 20 76 61 6c 75 65 20 61 73 20 74 68 65 0a 20 20   value as the.  
2d6a0 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 6b 65 79    ** largest key
2d6b0 20 6f 6e 20 70 50 61 67 65 29 2e 0a 20 20 20 20   on pPage)..    
2d6c0 2a 2a 0a 20 20 20 20 2a 2a 20 54 6f 20 66 69 6e  **.    ** To fin
2d6d0 64 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65  d the largest ke
2d6e0 79 20 76 61 6c 75 65 20 6f 6e 20 70 50 61 67 65  y value on pPage
2d6f0 2c 20 66 69 72 73 74 20 66 69 6e 64 20 74 68 65  , first find the
2d700 20 72 69 67 68 74 2d 6d 6f 73 74 20 0a 20 20 20   right-most .   
2d710 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67   ** cell on pPag
2d720 65 2e 20 54 68 65 20 66 69 72 73 74 20 74 77 6f  e. The first two
2d730 20 66 69 65 6c 64 73 20 6f 66 20 74 68 69 73 20   fields of this 
2d740 63 65 6c 6c 20 61 72 65 20 74 68 65 20 0a 20 20  cell are the .  
2d750 20 20 2a 2a 20 72 65 63 6f 72 64 2d 6c 65 6e 67    ** record-leng
2d760 74 68 20 28 61 20 76 61 72 69 61 62 6c 65 20 6c  th (a variable l
2d770 65 6e 67 74 68 20 69 6e 74 65 67 65 72 20 61 74  ength integer at
2d780 20 6d 6f 73 74 20 33 32 2d 62 69 74 73 20 69 6e   most 32-bits in
2d790 20 73 69 7a 65 29 0a 20 20 20 20 2a 2a 20 61 6e   size).    ** an
2d7a0 64 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 20  d the key value 
2d7b0 28 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67  (a variable leng
2d7c0 74 68 20 69 6e 74 65 67 65 72 2c 20 6d 61 79 20  th integer, may 
2d7d0 68 61 76 65 20 61 6e 79 20 76 61 6c 75 65 29 2e  have any value).
2d7e0 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 69 72 73  .    ** The firs
2d7f0 74 20 6f 66 20 74 68 65 20 77 68 69 6c 65 28 2e  t of the while(.
2d800 2e 2e 29 20 6c 6f 6f 70 73 20 62 65 6c 6f 77 20  ..) loops below 
2d810 73 6b 69 70 73 20 6f 76 65 72 20 74 68 65 20 72  skips over the r
2d820 65 63 6f 72 64 2d 6c 65 6e 67 74 68 0a 20 20 20  ecord-length.   
2d830 20 2a 2a 20 66 69 65 6c 64 2e 20 54 68 65 20 73   ** field. The s
2d840 65 63 6f 6e 64 20 77 68 69 6c 65 28 2e 2e 2e 29  econd while(...)
2d850 20 6c 6f 6f 70 20 63 6f 70 69 65 73 20 74 68 65   loop copies the
2d860 20 6b 65 79 20 76 61 6c 75 65 20 66 72 6f 6d 20   key value from 
2d870 74 68 65 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20  the.    ** cell 
2d880 6f 6e 20 70 50 61 67 65 20 69 6e 74 6f 20 74 68  on pPage into th
2d890 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72 2e  e pSpace buffer.
2d8a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 43 65 6c  .    */.    pCel
2d8b0 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
2d8c0 67 65 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ge, pPage->nCell
2d8d0 2d 31 29 3b 0a 20 20 20 20 70 53 74 6f 70 20 3d  -1);.    pStop =
2d8e0 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20   &pCell[9];.    
2d8f0 77 68 69 6c 65 28 20 28 2a 28 70 43 65 6c 6c 2b  while( (*(pCell+
2d900 2b 29 26 30 78 38 30 29 20 26 26 20 70 43 65 6c  +)&0x80) && pCel
2d910 6c 3c 70 53 74 6f 70 20 29 3b 0a 20 20 20 20 70  l<pStop );.    p
2d920 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c 5b 39 5d  Stop = &pCell[9]
2d930 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 28 2a  ;.    while( ((*
2d940 28 70 4f 75 74 2b 2b 29 20 3d 20 2a 28 70 43 65  (pOut++) = *(pCe
2d950 6c 6c 2b 2b 29 29 26 30 78 38 30 29 20 26 26 20  ll++))&0x80) && 
2d960 70 43 65 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a 0a  pCell<pStop );..
2d970 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68      /* Insert th
2d980 65 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65  e new divider ce
2d990 6c 6c 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e  ll into pParent.
2d9a0 20 2a 2f 0a 20 20 20 20 69 6e 73 65 72 74 43 65   */.    insertCe
2d9b0 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 50 61 72  ll(pParent, pPar
2d9c0 65 6e 74 2d 3e 6e 43 65 6c 6c 2c 20 70 53 70 61  ent->nCell, pSpa
2d9d0 63 65 2c 20 28 69 6e 74 29 28 70 4f 75 74 2d 70  ce, (int)(pOut-p
2d9e0 53 70 61 63 65 29 2c 0a 20 20 20 20 20 20 20 20  Space),.        
2d9f0 20 20 20 20 20 20 20 30 2c 20 70 50 61 67 65 2d         0, pPage-
2da00 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 0a 20 20  >pgno, &rc);..  
2da10 20 20 2f 2a 20 53 65 74 20 74 68 65 20 72 69 67    /* Set the rig
2da20 68 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  ht-child pointer
2da30 20 6f 66 20 70 50 61 72 65 6e 74 20 74 6f 20 70   of pParent to p
2da40 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20  oint to the new 
2da50 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 70 75 74  page. */.    put
2da60 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e  4byte(&pParent->
2da70 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68  aData[pParent->h
2da80 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e  drOffset+8], pgn
2da90 6f 4e 65 77 29 3b 0a 20 20 0a 20 20 20 20 2f 2a  oNew);.  .    /*
2daa0 20 52 65 6c 65 61 73 65 20 74 68 65 20 72 65 66   Release the ref
2dab0 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  erence to the ne
2dac0 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 72  w page. */.    r
2dad0 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 29  eleasePage(pNew)
2dae0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
2daf0 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
2db00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43  SQLITE_OMIT_QUIC
2db10 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a 23 69 66  KBALANCE */..#if
2db20 20 30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75   0./*.** This fu
2db30 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  nction does not 
2db40 63 6f 6e 74 72 69 62 75 74 65 20 61 6e 79 74 68  contribute anyth
2db50 69 6e 67 20 74 6f 20 74 68 65 20 6f 70 65 72 61  ing to the opera
2db60 74 69 6f 6e 20 6f 66 20 53 51 4c 69 74 65 2e 0a  tion of SQLite..
2db70 2a 2a 20 69 74 20 69 73 20 73 6f 6d 65 74 69 6d  ** it is sometim
2db80 65 73 20 61 63 74 69 76 61 74 65 64 20 74 65 6d  es activated tem
2db90 70 6f 72 61 72 69 6c 79 20 77 68 69 6c 65 20 64  porarily while d
2dba0 65 62 75 67 67 69 6e 67 20 63 6f 64 65 20 72 65  ebugging code re
2dbb0 73 70 6f 6e 73 69 62 6c 65 20 0a 2a 2a 20 66 6f  sponsible .** fo
2dbc0 72 20 73 65 74 74 69 6e 67 20 70 6f 69 6e 74 65  r setting pointe
2dbd0 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 2e 0a 2a  r-map entries..*
2dbe0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72  /.static int ptr
2dbf0 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28 4d 65  mapCheckPages(Me
2dc00 6d 50 61 67 65 20 2a 2a 61 70 50 61 67 65 2c 20  mPage **apPage, 
2dc10 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e  int nPage){.  in
2dc20 74 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d  t i, j;.  for(i=
2dc30 30 3b 20 69 3c 6e 50 61 67 65 3b 20 69 2b 2b 29  0; i<nPage; i++)
2dc40 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 3b 0a 20 20  {.    Pgno n;.  
2dc50 20 20 75 38 20 65 3b 0a 20 20 20 20 4d 65 6d 50    u8 e;.    MemP
2dc60 61 67 65 20 2a 70 50 61 67 65 20 3d 20 61 70 50  age *pPage = apP
2dc70 61 67 65 5b 69 5d 3b 0a 20 20 20 20 42 74 53 68  age[i];.    BtSh
2dc80 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
2dc90 65 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65  e->pBt;.    asse
2dca0 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
2dcb0 74 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 6a 3d  t );..    for(j=
2dcc0 30 3b 20 6a 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  0; j<pPage->nCel
2dcd0 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 43  l; j++){.      C
2dce0 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
2dcf0 20 20 20 20 75 38 20 2a 7a 3b 0a 20 20 20 20 20      u8 *z;.     
2dd00 0a 20 20 20 20 20 20 7a 20 3d 20 66 69 6e 64 43  .      z = findC
2dd10 65 6c 6c 28 70 50 61 67 65 2c 20 6a 29 3b 0a 20  ell(pPage, j);. 
2dd20 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43       btreeParseC
2dd30 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 7a 2c  ellPtr(pPage, z,
2dd40 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69   &info);.      i
2dd50 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  f( info.iOverflo
2dd60 77 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e  w ){.        Pgn
2dd70 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  o ovfl = get4byt
2dd80 65 28 26 7a 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  e(&z[info.iOverf
2dd90 6c 6f 77 5d 29 3b 0a 20 20 20 20 20 20 20 20 70  low]);.        p
2dda0 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6f 76  trmapGet(pBt, ov
2ddb0 66 6c 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20  fl, &e, &n);.   
2ddc0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d       assert( n==
2ddd0 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65  pPage->pgno && e
2dde0 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
2ddf0 57 31 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  W1 );.      }.  
2de00 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
2de10 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
2de20 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65 74  Pgno child = get
2de30 34 62 79 74 65 28 7a 29 3b 0a 20 20 20 20 20 20  4byte(z);.      
2de40 20 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c    ptrmapGet(pBt,
2de50 20 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b   child, &e, &n);
2de60 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2de70 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20   n==pPage->pgno 
2de80 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52  && e==PTRMAP_BTR
2de90 45 45 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  EE );.      }.  
2dea0 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70 50 61    }.    if( !pPa
2deb0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2dec0 20 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67    Pgno child = g
2ded0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
2dee0 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
2def0 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
2df00 20 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c    ptrmapGet(pBt,
2df10 20 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b   child, &e, &n);
2df20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
2df30 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26  ==pPage->pgno &&
2df40 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45   e==PTRMAP_BTREE
2df50 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   );.    }.  }.  
2df60 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
2df70 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
2df80 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
2df90 74 6f 20 63 6f 70 79 20 74 68 65 20 63 6f 6e 74  to copy the cont
2dfa0 65 6e 74 73 20 6f 66 20 74 68 65 20 62 2d 74 72  ents of the b-tr
2dfb0 65 65 20 6e 6f 64 65 20 73 74 6f 72 65 64 20 0a  ee node stored .
2dfc0 2a 2a 20 6f 6e 20 70 61 67 65 20 70 46 72 6f 6d  ** on page pFrom
2dfd0 20 74 6f 20 70 61 67 65 20 70 54 6f 2e 20 49 66   to page pTo. If
2dfe0 20 70 61 67 65 20 70 46 72 6f 6d 20 77 61 73 20   page pFrom was 
2dff0 6e 6f 74 20 61 20 6c 65 61 66 20 70 61 67 65 2c  not a leaf page,
2e000 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 70 6f 69   then.** the poi
2e010 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
2e020 20 66 6f 72 20 65 61 63 68 20 63 68 69 6c 64 20   for each child 
2e030 70 61 67 65 20 61 72 65 20 75 70 64 61 74 65 64  page are updated
2e040 20 73 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a 20   so that the.** 
2e050 70 61 72 65 6e 74 20 70 61 67 65 20 73 74 6f 72  parent page stor
2e060 65 64 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65  ed in the pointe
2e070 72 20 6d 61 70 20 69 73 20 70 61 67 65 20 70 54  r map is page pT
2e080 6f 2e 20 49 66 20 70 46 72 6f 6d 20 63 6f 6e 74  o. If pFrom cont
2e090 61 69 6e 65 64 0a 2a 2a 20 61 6e 79 20 63 65 6c  ained.** any cel
2e0a0 6c 73 20 77 69 74 68 20 6f 76 65 72 66 6c 6f 77  ls with overflow
2e0b0 20 70 61 67 65 20 70 6f 69 6e 74 65 72 73 2c 20   page pointers, 
2e0c0 74 68 65 6e 20 74 68 65 20 63 6f 72 72 65 73 70  then the corresp
2e0d0 6f 6e 64 69 6e 67 20 70 6f 69 6e 74 65 72 0a 2a  onding pointer.*
2e0e0 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20 61 72  * map entries ar
2e0f0 65 20 61 6c 73 6f 20 75 70 64 61 74 65 64 20 73  e also updated s
2e100 6f 20 74 68 61 74 20 74 68 65 20 70 61 72 65 6e  o that the paren
2e110 74 20 70 61 67 65 20 69 73 20 70 61 67 65 20 70  t page is page p
2e120 54 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72  To..**.** If pFr
2e130 6f 6d 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  om is currently 
2e140 63 61 72 72 79 69 6e 67 20 61 6e 79 20 6f 76 65  carrying any ove
2e150 72 66 6c 6f 77 20 63 65 6c 6c 73 20 28 65 6e 74  rflow cells (ent
2e160 72 69 65 73 20 69 6e 20 74 68 65 0a 2a 2a 20 4d  ries in the.** M
2e170 65 6d 50 61 67 65 2e 61 4f 76 66 6c 5b 5d 20 61  emPage.aOvfl[] a
2e180 72 72 61 79 29 2c 20 74 68 65 79 20 61 72 65 20  rray), they are 
2e190 6e 6f 74 20 63 6f 70 69 65 64 20 74 6f 20 70 54  not copied to pT
2e1a0 6f 2e 20 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65  o. .**.** Before
2e1b0 20 72 65 74 75 72 6e 69 6e 67 2c 20 70 61 67 65   returning, page
2e1c0 20 70 54 6f 20 69 73 20 72 65 69 6e 69 74 69 61   pTo is reinitia
2e1d0 6c 69 7a 65 64 20 75 73 69 6e 67 20 62 74 72 65  lized using btre
2e1e0 65 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a 0a  eInitPage()..**.
2e1f0 2a 2a 20 54 68 65 20 70 65 72 66 6f 72 6d 61 6e  ** The performan
2e200 63 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ce of this funct
2e210 69 6f 6e 20 69 73 20 6e 6f 74 20 63 72 69 74 69  ion is not criti
2e220 63 61 6c 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20  cal. It is only 
2e230 75 73 65 64 20 62 79 20 0a 2a 2a 20 74 68 65 20  used by .** the 
2e240 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65  balance_shallowe
2e250 72 28 29 20 61 6e 64 20 62 61 6c 61 6e 63 65 5f  r() and balance_
2e260 64 65 65 70 65 72 28 29 20 70 72 6f 63 65 64 75  deeper() procedu
2e270 72 65 73 2c 20 6e 65 69 74 68 65 72 20 6f 66 0a  res, neither of.
2e280 2a 2a 20 77 68 69 63 68 20 61 72 65 20 63 61 6c  ** which are cal
2e290 6c 65 64 20 6f 66 74 65 6e 20 75 6e 64 65 72 20  led often under 
2e2a0 6e 6f 72 6d 61 6c 20 63 69 72 63 75 6d 73 74 61  normal circumsta
2e2b0 6e 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nces..*/.static 
2e2c0 76 6f 69 64 20 63 6f 70 79 4e 6f 64 65 43 6f 6e  void copyNodeCon
2e2d0 74 65 6e 74 28 4d 65 6d 50 61 67 65 20 2a 70 46  tent(MemPage *pF
2e2e0 72 6f 6d 2c 20 4d 65 6d 50 61 67 65 20 2a 70 54  rom, MemPage *pT
2e2f0 6f 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20  o, int *pRC){.  
2e300 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49  if( (*pRC)==SQLI
2e310 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 42 74 53  TE_OK ){.    BtS
2e320 68 61 72 65 64 20 2a 20 63 6f 6e 73 74 20 70 42  hared * const pB
2e330 74 20 3d 20 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a  t = pFrom->pBt;.
2e340 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61      u8 * const a
2e350 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 2d 3e 61 44  From = pFrom->aD
2e360 61 74 61 3b 0a 20 20 20 20 75 38 20 2a 20 63 6f  ata;.    u8 * co
2e370 6e 73 74 20 61 54 6f 20 3d 20 70 54 6f 2d 3e 61  nst aTo = pTo->a
2e380 44 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 63 6f  Data;.    int co
2e390 6e 73 74 20 69 46 72 6f 6d 48 64 72 20 3d 20 70  nst iFromHdr = p
2e3a0 46 72 6f 6d 2d 3e 68 64 72 4f 66 66 73 65 74 3b  From->hdrOffset;
2e3b0 0a 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 20 69  .    int const i
2e3c0 54 6f 48 64 72 20 3d 20 28 28 70 54 6f 2d 3e 70  ToHdr = ((pTo->p
2e3d0 67 6e 6f 3d 3d 31 29 20 3f 20 31 30 30 20 3a 20  gno==1) ? 100 : 
2e3e0 30 29 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a  0);.    int rc;.
2e3f0 20 20 20 20 69 6e 74 20 69 44 61 74 61 3b 0a 20      int iData;. 
2e400 20 0a 20 20 0a 20 20 20 20 61 73 73 65 72 74 28   .  .    assert(
2e410 20 70 46 72 6f 6d 2d 3e 69 73 49 6e 69 74 20 29   pFrom->isInit )
2e420 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ;.    assert( pF
2e430 72 6f 6d 2d 3e 6e 46 72 65 65 3e 3d 69 54 6f 48  rom->nFree>=iToH
2e440 64 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  dr );.    assert
2e450 28 20 67 65 74 32 62 79 74 65 28 26 61 46 72 6f  ( get2byte(&aFro
2e460 6d 5b 69 46 72 6f 6d 48 64 72 2b 35 5d 29 3c 3d  m[iFromHdr+5])<=
2e470 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
2e480 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 43 6f 70  );.  .    /* Cop
2e490 79 20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f 64  y the b-tree nod
2e4a0 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 70  e content from p
2e4b0 61 67 65 20 70 46 72 6f 6d 20 74 6f 20 70 61 67  age pFrom to pag
2e4c0 65 20 70 54 6f 2e 20 2a 2f 0a 20 20 20 20 69 44  e pTo. */.    iD
2e4d0 61 74 61 20 3d 20 67 65 74 32 62 79 74 65 28 26  ata = get2byte(&
2e4e0 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b 35  aFrom[iFromHdr+5
2e4f0 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  ]);.    memcpy(&
2e500 61 54 6f 5b 69 44 61 74 61 5d 2c 20 26 61 46 72  aTo[iData], &aFr
2e510 6f 6d 5b 69 44 61 74 61 5d 2c 20 70 42 74 2d 3e  om[iData], pBt->
2e520 75 73 61 62 6c 65 53 69 7a 65 2d 69 44 61 74 61  usableSize-iData
2e530 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61  );.    memcpy(&a
2e540 54 6f 5b 69 54 6f 48 64 72 5d 2c 20 26 61 46 72  To[iToHdr], &aFr
2e550 6f 6d 5b 69 46 72 6f 6d 48 64 72 5d 2c 20 70 46  om[iFromHdr], pF
2e560 72 6f 6d 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  rom->cellOffset 
2e570 2b 20 32 2a 70 46 72 6f 6d 2d 3e 6e 43 65 6c 6c  + 2*pFrom->nCell
2e580 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 69  );.  .    /* Rei
2e590 6e 69 74 69 61 6c 69 7a 65 20 70 61 67 65 20 70  nitialize page p
2e5a0 54 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20 63  To so that the c
2e5b0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 4d  ontents of the M
2e5c0 65 6d 50 61 67 65 20 73 74 72 75 63 74 75 72 65  emPage structure
2e5d0 0a 20 20 20 20 2a 2a 20 6d 61 74 63 68 20 74 68  .    ** match th
2e5e0 65 20 6e 65 77 20 64 61 74 61 2e 20 54 68 65 20  e new data. The 
2e5f0 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f  initialization o
2e600 66 20 70 54 6f 20 63 61 6e 20 61 63 74 75 61 6c  f pTo can actual
2e610 6c 79 20 66 61 69 6c 20 75 6e 64 65 72 0a 20 20  ly fail under.  
2e620 20 20 2a 2a 20 66 61 69 72 6c 79 20 6f 62 73 63    ** fairly obsc
2e630 75 72 65 20 63 69 72 63 75 6d 73 74 61 6e 63 65  ure circumstance
2e640 73 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69  s, even though i
2e650 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 69  t is a copy of i
2e660 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20 20 20 20  nitialized .    
2e670 2a 2a 20 70 61 67 65 20 70 46 72 6f 6d 2e 0a 20  ** page pFrom.. 
2e680 20 20 20 2a 2f 0a 20 20 20 20 70 54 6f 2d 3e 69     */.    pTo->i
2e690 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 72  sInit = 0;.    r
2e6a0 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67  c = btreeInitPag
2e6b0 65 28 70 54 6f 29 3b 0a 20 20 20 20 69 66 28 20  e(pTo);.    if( 
2e6c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2e6d0 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20 72 63  .      *pRC = rc
2e6e0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
2e6f0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
2e700 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75  If this is an au
2e710 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
2e720 73 65 2c 20 75 70 64 61 74 65 20 74 68 65 20 70  se, update the p
2e730 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
2e740 65 73 0a 20 20 20 20 2a 2a 20 66 6f 72 20 61 6e  es.    ** for an
2e750 79 20 62 2d 74 72 65 65 20 6f 72 20 6f 76 65 72  y b-tree or over
2e760 66 6c 6f 77 20 70 61 67 65 73 20 74 68 61 74 20  flow pages that 
2e770 70 54 6f 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73  pTo now contains
2e780 20 74 68 65 20 70 6f 69 6e 74 65 72 73 20 74 6f   the pointers to
2e790 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2e7a0 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
2e7b0 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20 73 65  .      *pRC = se
2e7c0 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 54  tChildPtrmaps(pT
2e7d0 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  o);.    }.  }.}.
2e7e0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
2e7f0 69 6e 65 20 72 65 64 69 73 74 72 69 62 75 74 65  ine redistribute
2e800 73 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69  s cells on the i
2e810 50 61 72 65 6e 74 49 64 78 27 74 68 20 63 68 69  ParentIdx'th chi
2e820 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 0a 2a 2a  ld of pParent.**
2e830 20 28 68 65 72 65 61 66 74 65 72 20 22 74 68 65   (hereafter "the
2e840 20 70 61 67 65 22 29 20 61 6e 64 20 75 70 20 74   page") and up t
2e850 6f 20 32 20 73 69 62 6c 69 6e 67 73 20 73 6f 20  o 2 siblings so 
2e860 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20 68  that all pages h
2e870 61 76 65 20 61 62 6f 75 74 20 74 68 65 0a 2a 2a  ave about the.**
2e880 20 73 61 6d 65 20 61 6d 6f 75 6e 74 20 6f 66 20   same amount of 
2e890 66 72 65 65 20 73 70 61 63 65 2e 20 55 73 75 61  free space. Usua
2e8a0 6c 6c 79 20 61 20 73 69 6e 67 6c 65 20 73 69 62  lly a single sib
2e8b0 6c 69 6e 67 20 6f 6e 20 65 69 74 68 65 72 20 73  ling on either s
2e8c0 69 64 65 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61  ide of the.** pa
2e8d0 67 65 20 61 72 65 20 75 73 65 64 20 69 6e 20 74  ge are used in t
2e8e0 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c 20 74 68  he balancing, th
2e8f0 6f 75 67 68 20 62 6f 74 68 20 73 69 62 6c 69 6e  ough both siblin
2e900 67 73 20 6d 69 67 68 74 20 63 6f 6d 65 20 66 72  gs might come fr
2e910 6f 6d 20 6f 6e 65 0a 2a 2a 20 73 69 64 65 20 69  om one.** side i
2e920 66 20 74 68 65 20 70 61 67 65 20 69 73 20 74 68  f the page is th
2e930 65 20 66 69 72 73 74 20 6f 72 20 6c 61 73 74 20  e first or last 
2e940 63 68 69 6c 64 20 6f 66 20 69 74 73 20 70 61 72  child of its par
2e950 65 6e 74 2e 20 49 66 20 74 68 65 20 70 61 67 65  ent. If the page
2e960 20 0a 2a 2a 20 68 61 73 20 66 65 77 65 72 20 74   .** has fewer t
2e970 68 61 6e 20 32 20 73 69 62 6c 69 6e 67 73 20 28  han 2 siblings (
2e980 73 6f 6d 65 74 68 69 6e 67 20 77 68 69 63 68 20  something which 
2e990 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20  can only happen 
2e9a0 69 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69  if the page.** i
2e9b0 73 20 61 20 72 6f 6f 74 20 70 61 67 65 20 6f 72  s a root page or
2e9c0 20 61 20 63 68 69 6c 64 20 6f 66 20 61 20 72 6f   a child of a ro
2e9d0 6f 74 20 70 61 67 65 29 20 74 68 65 6e 20 61 6c  ot page) then al
2e9e0 6c 20 61 76 61 69 6c 61 62 6c 65 20 73 69 62 6c  l available sibl
2e9f0 69 6e 67 73 0a 2a 2a 20 70 61 72 74 69 63 69 70  ings.** particip
2ea00 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e  ate in the balan
2ea10 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  cing..**.** The 
2ea20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e  number of siblin
2ea30 67 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 6d  gs of the page m
2ea40 69 67 68 74 20 62 65 20 69 6e 63 72 65 61 73 65  ight be increase
2ea50 64 20 6f 72 20 64 65 63 72 65 61 73 65 64 20 62  d or decreased b
2ea60 79 20 0a 2a 2a 20 6f 6e 65 20 6f 72 20 74 77 6f  y .** one or two
2ea70 20 69 6e 20 61 6e 20 65 66 66 6f 72 74 20 74 6f   in an effort to
2ea80 20 6b 65 65 70 20 70 61 67 65 73 20 6e 65 61 72   keep pages near
2ea90 6c 79 20 66 75 6c 6c 20 62 75 74 20 6e 6f 74 20  ly full but not 
2eaa0 6f 76 65 72 20 66 75 6c 6c 2e 20 0a 2a 2a 0a 2a  over full. .**.*
2eab0 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 68 65 6e  * Note that when
2eac0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
2ead0 20 63 61 6c 6c 65 64 2c 20 73 6f 6d 65 20 6f 66   called, some of
2eae0 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 74 68   the cells on th
2eaf0 65 20 70 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20  e page.** might 
2eb00 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20  not actually be 
2eb10 73 74 6f 72 65 64 20 69 6e 20 4d 65 6d 50 61 67  stored in MemPag
2eb20 65 2e 61 44 61 74 61 5b 5d 2e 20 54 68 69 73 20  e.aData[]. This 
2eb30 63 61 6e 20 68 61 70 70 65 6e 0a 2a 2a 20 69 66  can happen.** if
2eb40 20 74 68 65 20 70 61 67 65 20 69 73 20 6f 76 65   the page is ove
2eb50 72 66 75 6c 6c 2e 20 54 68 69 73 20 72 6f 75 74  rfull. This rout
2eb60 69 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61 74  ine ensures that
2eb70 20 61 6c 6c 20 63 65 6c 6c 73 20 61 6c 6c 6f 63   all cells alloc
2eb80 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 70  ated.** to the p
2eb90 61 67 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c  age and its sibl
2eba0 69 6e 67 73 20 66 69 74 20 69 6e 74 6f 20 4d 65  ings fit into Me
2ebb0 6d 50 61 67 65 2e 61 44 61 74 61 5b 5d 20 62 65  mPage.aData[] be
2ebc0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
2ebd0 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 63 6f 75  **.** In the cou
2ebe0 72 73 65 20 6f 66 20 62 61 6c 61 6e 63 69 6e 67  rse of balancing
2ebf0 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 69 74   the page and it
2ec00 73 20 73 69 62 6c 69 6e 67 73 2c 20 63 65 6c 6c  s siblings, cell
2ec10 73 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 73 65  s may be.** inse
2ec20 72 74 65 64 20 69 6e 74 6f 20 6f 72 20 72 65 6d  rted into or rem
2ec30 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61  oved from the pa
2ec40 72 65 6e 74 20 70 61 67 65 20 28 70 50 61 72 65  rent page (pPare
2ec50 6e 74 29 2e 20 44 6f 69 6e 67 20 73 6f 0a 2a 2a  nt). Doing so.**
2ec60 20 6d 61 79 20 63 61 75 73 65 20 74 68 65 20 70   may cause the p
2ec70 61 72 65 6e 74 20 70 61 67 65 20 74 6f 20 62 65  arent page to be
2ec80 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72  come overfull or
2ec90 20 75 6e 64 65 72 66 75 6c 6c 2e 20 49 66 20 74   underfull. If t
2eca0 68 69 73 0a 2a 2a 20 68 61 70 70 65 6e 73 2c 20  his.** happens, 
2ecb0 69 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  it is the respon
2ecc0 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
2ecd0 63 61 6c 6c 65 72 20 74 6f 20 69 6e 76 6f 6b 65  caller to invoke
2ece0 20 74 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a 20   the correct.** 
2ecf0 62 61 6c 61 6e 63 69 6e 67 20 72 6f 75 74 69 6e  balancing routin
2ed00 65 20 74 6f 20 66 69 78 20 74 68 69 73 20 70 72  e to fix this pr
2ed10 6f 62 6c 65 6d 20 28 73 65 65 20 74 68 65 20 62  oblem (see the b
2ed20 61 6c 61 6e 63 65 28 29 20 72 6f 75 74 69 6e 65  alance() routine
2ed30 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  ). .**.** If thi
2ed40 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 20  s routine fails 
2ed50 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20  for any reason, 
2ed60 69 74 20 6d 69 67 68 74 20 6c 65 61 76 65 20 74  it might leave t
2ed70 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69  he database.** i
2ed80 6e 20 61 20 63 6f 72 72 75 70 74 65 64 20 73 74  n a corrupted st
2ed90 61 74 65 2e 20 53 6f 20 69 66 20 74 68 69 73 20  ate. So if this 
2eda0 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 2c 20 74  routine fails, t
2edb0 68 65 20 64 61 74 61 62 61 73 65 20 73 68 6f 75  he database shou
2edc0 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65 64 20  ld.** be rolled 
2edd0 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  back..**.** The 
2ede0 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 74  third argument t
2edf0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  o this function,
2ee00 20 61 4f 76 66 6c 53 70 61 63 65 2c 20 69 73 20   aOvflSpace, is 
2ee10 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 0a 2a  a pointer to a.*
2ee20 2a 20 62 75 66 66 65 72 20 62 69 67 20 65 6e 6f  * buffer big eno
2ee30 75 67 68 20 74 6f 20 68 6f 6c 64 20 6f 6e 65 20  ugh to hold one 
2ee40 70 61 67 65 2e 20 49 66 20 77 68 69 6c 65 20 69  page. If while i
2ee50 6e 73 65 72 74 69 6e 67 20 63 65 6c 6c 73 20 69  nserting cells i
2ee60 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 0a 2a  nto the parent.*
2ee70 2a 20 70 61 67 65 20 28 70 50 61 72 65 6e 74 29  * page (pParent)
2ee80 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2ee90 20 62 65 63 6f 6d 65 73 20 6f 76 65 72 66 75 6c   becomes overful
2eea0 6c 2c 20 74 68 69 73 20 62 75 66 66 65 72 20 69  l, this buffer i
2eeb0 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f  s.** used to sto
2eec0 72 65 20 74 68 65 20 70 61 72 65 6e 74 27 73 20  re the parent's 
2eed0 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 20  overflow cells. 
2eee0 42 65 63 61 75 73 65 20 74 68 69 73 20 66 75 6e  Because this fun
2eef0 63 74 69 6f 6e 20 69 6e 73 65 72 74 73 0a 2a 2a  ction inserts.**
2ef00 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20 66 6f   a maximum of fo
2ef10 75 72 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  ur divider cells
2ef20 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74   into the parent
2ef30 20 70 61 67 65 2c 20 61 6e 64 20 74 68 65 20 6d   page, and the m
2ef40 61 78 69 6d 75 6d 0a 2a 2a 20 73 69 7a 65 20 6f  aximum.** size o
2ef50 66 20 61 20 63 65 6c 6c 20 73 74 6f 72 65 64 20  f a cell stored 
2ef60 77 69 74 68 69 6e 20 61 6e 20 69 6e 74 65 72 6e  within an intern
2ef70 61 6c 20 6e 6f 64 65 20 69 73 20 61 6c 77 61 79  al node is alway
2ef80 73 20 6c 65 73 73 20 74 68 61 6e 20 31 2f 34 0a  s less than 1/4.
2ef90 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73  ** of the page-s
2efa0 69 7a 65 2c 20 74 68 65 20 61 4f 76 66 6c 53 70  ize, the aOvflSp
2efb0 61 63 65 5b 5d 20 62 75 66 66 65 72 20 69 73 20  ace[] buffer is 
2efc0 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
2efd0 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f 75 67 68   large.** enough
2efe0 20 66 6f 72 20 61 6c 6c 20 6f 76 65 72 66 6c 6f   for all overflo
2eff0 77 20 63 65 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49  w cells..**.** I
2f000 66 20 61 4f 76 66 6c 53 70 61 63 65 20 69 73 20  f aOvflSpace is 
2f010 73 65 74 20 74 6f 20 61 20 6e 75 6c 6c 20 70 6f  set to a null po
2f020 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63  inter, this func
2f030 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a  tion returns .**
2f040 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a   SQLITE_NOMEM..*
2f050 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
2f060 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 0a 20 20  ance_nonroot(.  
2f070 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
2f080 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2f090 2f 2a 20 50 61 72 65 6e 74 20 70 61 67 65 20 6f  /* Parent page o
2f0a0 66 20 73 69 62 6c 69 6e 67 73 20 62 65 69 6e 67  f siblings being
2f0b0 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 69   balanced */.  i
2f0c0 6e 74 20 69 50 61 72 65 6e 74 49 64 78 2c 20 20  nt iParentIdx,  
2f0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f0e0 2a 20 49 6e 64 65 78 20 6f 66 20 22 74 68 65 20  * Index of "the 
2f0f0 70 61 67 65 22 20 69 6e 20 70 50 61 72 65 6e 74  page" in pParent
2f100 20 2a 2f 0a 20 20 75 38 20 2a 61 4f 76 66 6c 53   */.  u8 *aOvflS
2f110 70 61 63 65 2c 20 20 20 20 20 20 20 20 20 20 20  pace,           
2f120 20 20 20 20 20 20 2f 2a 20 70 61 67 65 2d 73 69        /* page-si
2f130 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  ze bytes of spac
2f140 65 20 66 6f 72 20 70 61 72 65 6e 74 20 6f 76 66  e for parent ovf
2f150 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f 6f  l */.  int isRoo
2f160 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
2f170 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2f180 66 20 70 50 61 72 65 6e 74 20 69 73 20 61 20 72  f pParent is a r
2f190 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 29 7b 0a 20  oot-page */.){. 
2f1a0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
2f1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f1c0 20 54 68 65 20 77 68 6f 6c 65 20 64 61 74 61 62   The whole datab
2f1d0 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  ase */.  int nCe
2f1e0 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ll = 0;         
2f1f0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2f200 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  of cells in apCe
2f210 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  ll[] */.  int nM
2f220 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20 20 20 20  axCells = 0;    
2f230 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61         /* Alloca
2f240 74 65 64 20 73 69 7a 65 20 6f 66 20 61 70 43 65  ted size of apCe
2f250 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61 46 72 6f  ll, szCell, aFro
2f260 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77  m. */.  int nNew
2f270 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2f280 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2f290 66 20 70 61 67 65 73 20 69 6e 20 61 70 4e 65 77  f pages in apNew
2f2a0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64  [] */.  int nOld
2f2b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2f2c0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2f2d0 66 20 70 61 67 65 73 20 69 6e 20 61 70 4f 6c 64  f pages in apOld
2f2e0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  [] */.  int i, j
2f2f0 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  , k;            
2f300 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
2f310 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  nters */.  int n
2f320 78 44 69 76 3b 20 20 20 20 20 20 20 20 20 20 20  xDiv;           
2f330 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
2f340 64 69 76 69 64 65 72 20 73 6c 6f 74 20 69 6e 20  divider slot in 
2f350 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d  pParent->aCell[]
2f360 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
2f370 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
2f380 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e     /* The return
2f390 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6c   code */.  u16 l
2f3a0 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 20 20  eafCorrection;  
2f3b0 20 20 20 20 20 20 20 20 2f 2a 20 34 20 69 66 20          /* 4 if 
2f3c0 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e  pPage is a leaf.
2f3d0 20 20 30 20 69 66 20 6e 6f 74 20 2a 2f 0a 20 20    0 if not */.  
2f3e0 69 6e 74 20 6c 65 61 66 44 61 74 61 3b 20 20 20  int leafData;   
2f3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f400 54 72 75 65 20 69 66 20 70 50 61 67 65 20 69 73  True if pPage is
2f410 20 61 20 6c 65 61 66 20 6f 66 20 61 20 4c 45 41   a leaf of a LEA
2f420 46 44 41 54 41 20 74 72 65 65 20 2a 2f 0a 20 20  FDATA tree */.  
2f430 69 6e 74 20 75 73 61 62 6c 65 53 70 61 63 65 3b  int usableSpace;
2f440 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f450 42 79 74 65 73 20 69 6e 20 70 50 61 67 65 20 62  Bytes in pPage b
2f460 65 79 6f 6e 64 20 74 68 65 20 68 65 61 64 65 72  eyond the header
2f470 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 46 6c   */.  int pageFl
2f480 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
2f490 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 70     /* Value of p
2f4a0 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 2a  Page->aData[0] *
2f4b0 2f 0a 20 20 69 6e 74 20 73 75 62 74 6f 74 61 6c  /.  int subtotal
2f4c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2f4d0 20 2f 2a 20 53 75 62 74 6f 74 61 6c 20 6f 66 20   /* Subtotal of 
2f4e0 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 73 20 6f  bytes in cells o
2f4f0 6e 20 6f 6e 65 20 70 61 67 65 20 2a 2f 0a 20 20  n one page */.  
2f500 69 6e 74 20 69 53 70 61 63 65 31 20 3d 20 30 3b  int iSpace1 = 0;
2f510 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f520 46 69 72 73 74 20 75 6e 75 73 65 64 20 62 79 74  First unused byt
2f530 65 20 6f 66 20 61 53 70 61 63 65 31 5b 5d 20 2a  e of aSpace1[] *
2f540 2f 0a 20 20 69 6e 74 20 69 4f 76 66 6c 53 70 61  /.  int iOvflSpa
2f550 63 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ce = 0;         
2f560 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64   /* First unused
2f570 20 62 79 74 65 20 6f 66 20 61 4f 76 66 6c 53 70   byte of aOvflSp
2f580 61 63 65 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 73  ace[] */.  int s
2f590 7a 53 63 72 61 74 63 68 3b 20 20 20 20 20 20 20  zScratch;       
2f5a0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
2f5b0 6f 66 20 73 63 72 61 74 63 68 20 6d 65 6d 6f 72  of scratch memor
2f5c0 79 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 20  y requested */. 
2f5d0 20 4d 65 6d 50 61 67 65 20 2a 61 70 4f 6c 64 5b   MemPage *apOld[
2f5e0 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  NB];          /*
2f5f0 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f   pPage and up to
2f600 20 74 77 6f 20 73 69 62 6c 69 6e 67 73 20 2a 2f   two siblings */
2f610 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 43 6f  .  MemPage *apCo
2f620 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20  py[NB];         
2f630 2f 2a 20 50 72 69 76 61 74 65 20 63 6f 70 69 65  /* Private copie
2f640 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20 70 61 67  s of apOld[] pag
2f650 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  es */.  MemPage 
2f660 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20  *apNew[NB+2];   
2f670 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e       /* pPage an
2f680 64 20 75 70 20 74 6f 20 4e 42 20 73 69 62 6c 69  d up to NB sibli
2f690 6e 67 73 20 61 66 74 65 72 20 62 61 6c 61 6e 63  ngs after balanc
2f6a0 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 70 52 69  ing */.  u8 *pRi
2f6b0 67 68 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ght;            
2f6c0 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 74 69 6f        /* Locatio
2f6d0 6e 20 69 6e 20 70 61 72 65 6e 74 20 6f 66 20 72  n in parent of r
2f6e0 69 67 68 74 2d 73 69 62 6c 69 6e 67 20 70 6f 69  ight-sibling poi
2f6f0 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 61 70  nter */.  u8 *ap
2f700 44 69 76 5b 4e 42 2d 31 5d 3b 20 20 20 20 20 20  Div[NB-1];      
2f710 20 20 20 20 20 20 20 2f 2a 20 44 69 76 69 64 65         /* Divide
2f720 72 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65  r cells in pPare
2f730 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 4e  nt */.  int cntN
2f740 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20  ew[NB+2];       
2f750 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
2f760 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c 6c   aCell[] of cell
2f770 20 61 66 74 65 72 20 69 2d 74 68 20 70 61 67 65   after i-th page
2f780 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e 65 77 5b   */.  int szNew[
2f790 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20  NB+2];          
2f7a0 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64 20 73     /* Combined s
2f7b0 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20 70 6c 61  ize of cells pla
2f7c0 63 65 20 6f 6e 20 69 2d 74 68 20 70 61 67 65 20  ce on i-th page 
2f7d0 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c  */.  u8 **apCell
2f7e0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2f7f0 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62    /* All cells b
2f800 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f  egin balanced */
2f810 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20  .  u16 *szCell; 
2f820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f830 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66  /* Local size of
2f840 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70   all cells in ap
2f850 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a  Cell[] */.  u8 *
2f860 61 53 70 61 63 65 31 3b 20 20 20 20 20 20 20 20  aSpace1;        
2f870 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
2f880 65 20 66 6f 72 20 63 6f 70 69 65 73 20 6f 66 20  e for copies of 
2f890 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73 20 2a  dividers cells *
2f8a0 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20  /.  Pgno pgno;  
2f8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f8c0 20 2f 2a 20 54 65 6d 70 20 76 61 72 20 74 6f 20   /* Temp var to 
2f8d0 73 74 6f 72 65 20 61 20 70 61 67 65 20 6e 75 6d  store a page num
2f8e0 62 65 72 20 69 6e 20 2a 2f 0a 0a 20 20 70 42 74  ber in */..  pBt
2f8f0 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 42 74 3b   = pParent->pBt;
2f900 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2f910 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
2f920 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
2f930 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
2f940 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2f950 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
2f960 20 29 3b 0a 0a 23 69 66 20 30 0a 20 20 54 52 41   );..#if 0.  TRA
2f970 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 62 65  CE(("BALANCE: be
2f980 67 69 6e 20 70 61 67 65 20 25 64 20 63 68 69 6c  gin page %d chil
2f990 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61 67  d of %d\n", pPag
2f9a0 65 2d 3e 70 67 6e 6f 2c 20 70 50 61 72 65 6e 74  e->pgno, pParent
2f9b0 2d 3e 70 67 6e 6f 29 29 3b 0a 23 65 6e 64 69 66  ->pgno));.#endif
2f9c0 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70  ..  /* At this p
2f9d0 6f 69 6e 74 20 70 50 61 72 65 6e 74 20 6d 61 79  oint pParent may
2f9e0 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e   have at most on
2f9f0 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2e  e overflow cell.
2fa00 20 41 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68 69   And if.  ** thi
2fa10 73 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20  s overflow cell 
2fa20 69 73 20 70 72 65 73 65 6e 74 2c 20 69 74 20 6d  is present, it m
2fa30 75 73 74 20 62 65 20 74 68 65 20 63 65 6c 6c 20  ust be the cell 
2fa40 77 69 74 68 20 0a 20 20 2a 2a 20 69 6e 64 65 78  with .  ** index
2fa50 20 69 50 61 72 65 6e 74 49 64 78 2e 20 54 68 69   iParentIdx. Thi
2fa60 73 20 73 63 65 6e 61 72 69 6f 20 63 6f 6d 65 73  s scenario comes
2fa70 20 61 62 6f 75 74 20 77 68 65 6e 20 74 68 69 73   about when this
2fa80 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69   function.  ** i
2fa90 73 20 63 61 6c 6c 65 64 20 28 69 6e 64 69 72 65  s called (indire
2faa0 63 74 6c 79 29 20 66 72 6f 6d 20 73 71 6c 69 74  ctly) from sqlit
2fab0 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 29 2e  e3BtreeDelete().
2fac0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2fad0 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
2fae0 6f 77 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74  ow==0 || pParent
2faf0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29  ->nOverflow==1 )
2fb00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
2fb10 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  ent->nOverflow==
2fb20 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 61 4f  0 || pParent->aO
2fb30 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 69 50 61 72  vfl[0].idx==iPar
2fb40 65 6e 74 49 64 78 20 29 3b 0a 0a 20 20 69 66 28  entIdx );..  if(
2fb50 20 21 61 4f 76 66 6c 53 70 61 63 65 20 29 7b 0a   !aOvflSpace ){.
2fb60 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2fb70 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20  E_NOMEM;.  }..  
2fb80 2f 2a 20 46 69 6e 64 20 74 68 65 20 73 69 62 6c  /* Find the sibl
2fb90 69 6e 67 20 70 61 67 65 73 20 74 6f 20 62 61 6c  ing pages to bal
2fba0 61 6e 63 65 2e 20 41 6c 73 6f 20 6c 6f 63 61 74  ance. Also locat
2fbb0 65 20 74 68 65 20 63 65 6c 6c 73 20 69 6e 20 70  e the cells in p
2fbc0 50 61 72 65 6e 74 20 0a 20 20 2a 2a 20 74 68 61  Parent .  ** tha
2fbd0 74 20 64 69 76 69 64 65 20 74 68 65 20 73 69 62  t divide the sib
2fbe0 6c 69 6e 67 73 2e 20 41 6e 20 61 74 74 65 6d 70  lings. An attemp
2fbf0 74 20 69 73 20 6d 61 64 65 20 74 6f 20 66 69 6e  t is made to fin
2fc00 64 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e  d NN siblings on
2fc10 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 73 69   .  ** either si
2fc20 64 65 20 6f 66 20 70 50 61 67 65 2e 20 4d 6f 72  de of pPage. Mor
2fc30 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 74  e siblings are t
2fc40 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65 20 73 69  aken from one si
2fc50 64 65 2c 20 68 6f 77 65 76 65 72 2c 20 0a 20 20  de, however, .  
2fc60 2a 2a 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ** if there are 
2fc70 66 65 77 65 72 20 74 68 61 6e 20 4e 4e 20 73 69  fewer than NN si
2fc80 62 6c 69 6e 67 73 20 6f 6e 20 74 68 65 20 6f 74  blings on the ot
2fc90 68 65 72 20 73 69 64 65 2e 20 49 66 20 70 50 61  her side. If pPa
2fca0 72 65 6e 74 0a 20 20 2a 2a 20 68 61 73 20 4e 42  rent.  ** has NB
2fcb0 20 6f 72 20 66 65 77 65 72 20 63 68 69 6c 64 72   or fewer childr
2fcc0 65 6e 20 74 68 65 6e 20 61 6c 6c 20 63 68 69 6c  en then all chil
2fcd0 64 72 65 6e 20 6f 66 20 70 50 61 72 65 6e 74 20  dren of pParent 
2fce0 61 72 65 20 74 61 6b 65 6e 2e 20 20 0a 20 20 2a  are taken.  .  *
2fcf0 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70  *.  ** This loop
2fd00 20 61 6c 73 6f 20 64 72 6f 70 73 20 74 68 65 20   also drops the 
2fd10 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 66 72  divider cells fr
2fd20 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  om the parent pa
2fd30 67 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 77 61  ge. This.  ** wa
2fd40 79 2c 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72  y, the remainder
2fd50 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   of the function
2fd60 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74   does not have t
2fd70 6f 20 64 65 61 6c 20 77 69 74 68 20 61 6e 79 0a  o deal with any.
2fd80 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 63 65    ** overflow ce
2fd90 6c 6c 73 20 69 6e 20 74 68 65 20 70 61 72 65 6e  lls in the paren
2fda0 74 20 70 61 67 65 2c 20 73 69 6e 63 65 20 69 66  t page, since if
2fdb0 20 61 6e 79 20 65 78 69 73 74 65 64 20 74 68 65   any existed the
2fdc0 79 20 77 69 6c 6c 0a 20 20 2a 2a 20 68 61 76 65  y will.  ** have
2fdd0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65   already been re
2fde0 6d 6f 76 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 20  moved..  */.  i 
2fdf0 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72  = pParent->nOver
2fe00 66 6c 6f 77 20 2b 20 70 50 61 72 65 6e 74 2d 3e  flow + pParent->
2fe10 6e 43 65 6c 6c 3b 0a 20 20 69 66 28 20 69 3c 32  nCell;.  if( i<2
2fe20 20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d 20   ){.    nxDiv = 
2fe30 30 3b 0a 20 20 20 20 6e 4f 6c 64 20 3d 20 69 2b  0;.    nOld = i+
2fe40 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
2fe50 6e 4f 6c 64 20 3d 20 33 3b 0a 20 20 20 20 69 66  nOld = 3;.    if
2fe60 28 20 69 50 61 72 65 6e 74 49 64 78 3d 3d 30 20  ( iParentIdx==0 
2fe70 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ){              
2fe80 20 20 20 0a 20 20 20 20 20 20 6e 78 44 69 76 20     .      nxDiv 
2fe90 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
2fea0 66 28 20 69 50 61 72 65 6e 74 49 64 78 3d 3d 69  f( iParentIdx==i
2feb0 20 29 7b 0a 20 20 20 20 20 20 6e 78 44 69 76 20   ){.      nxDiv 
2fec0 3d 20 69 2d 32 3b 0a 20 20 20 20 7d 65 6c 73 65  = i-2;.    }else
2fed0 7b 0a 20 20 20 20 20 20 6e 78 44 69 76 20 3d 20  {.      nxDiv = 
2fee0 69 50 61 72 65 6e 74 49 64 78 2d 31 3b 0a 20 20  iParentIdx-1;.  
2fef0 20 20 7d 0a 20 20 20 20 69 20 3d 20 32 3b 0a 20    }.    i = 2;. 
2ff00 20 7d 0a 20 20 69 66 28 20 28 69 2b 6e 78 44 69   }.  if( (i+nxDi
2ff10 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72  v-pParent->nOver
2ff20 66 6c 6f 77 29 3d 3d 70 50 61 72 65 6e 74 2d 3e  flow)==pParent->
2ff30 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70 52 69  nCell ){.    pRi
2ff40 67 68 74 20 3d 20 26 70 50 61 72 65 6e 74 2d 3e  ght = &pParent->
2ff50 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68  aData[pParent->h
2ff60 64 72 4f 66 66 73 65 74 2b 38 5d 3b 0a 20 20 7d  drOffset+8];.  }
2ff70 65 6c 73 65 7b 0a 20 20 20 20 70 52 69 67 68 74  else{.    pRight
2ff80 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 72   = findCell(pPar
2ff90 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61  ent, i+nxDiv-pPa
2ffa0 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29  rent->nOverflow)
2ffb0 3b 0a 20 20 7d 0a 20 20 70 67 6e 6f 20 3d 20 67  ;.  }.  pgno = g
2ffc0 65 74 34 62 79 74 65 28 70 52 69 67 68 74 29 3b  et4byte(pRight);
2ffd0 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20  .  while( 1 ){. 
2ffe0 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e     rc = getAndIn
2fff0 69 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f  itPage(pBt, pgno
30000 2c 20 26 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20  , &apOld[i]);.  
30010 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
30020 20 20 6d 65 6d 73 65 74 28 61 70 4f 6c 64 2c 20    memset(apOld, 
30030 30 2c 20 28 69 2b 31 29 2a 73 69 7a 65 6f 66 28  0, (i+1)*sizeof(
30040 4d 65 6d 50 61 67 65 2a 29 29 3b 0a 20 20 20 20  MemPage*));.    
30050 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
30060 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20 20  leanup;.    }.  
30070 20 20 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d 20 31    nMaxCells += 1
30080 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c  +apOld[i]->nCell
30090 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72  +apOld[i]->nOver
300a0 66 6c 6f 77 3b 0a 20 20 20 20 69 66 28 20 28 69  flow;.    if( (i
300b0 2d 2d 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  --)==0 ) break;.
300c0 0a 20 20 20 20 69 66 28 20 69 2b 6e 78 44 69 76  .    if( i+nxDiv
300d0 3d 3d 70 50 61 72 65 6e 74 2d 3e 61 4f 76 66 6c  ==pParent->aOvfl
300e0 5b 30 5d 2e 69 64 78 20 26 26 20 70 50 61 72 65  [0].idx && pPare
300f0 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b  nt->nOverflow ){
30100 0a 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20  .      apDiv[i] 
30110 3d 20 70 50 61 72 65 6e 74 2d 3e 61 4f 76 66 6c  = pParent->aOvfl
30120 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20 20 20 20  [0].pCell;.     
30130 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
30140 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20  (apDiv[i]);.    
30150 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65 6c    szNew[i] = cel
30160 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74  lSizePtr(pParent
30170 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20  , apDiv[i]);.   
30180 20 20 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65     pParent->nOve
30190 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 7d  rflow = 0;.    }
301a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 70 44 69  else{.      apDi
301b0 76 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28  v[i] = findCell(
301c0 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76  pParent, i+nxDiv
301d0 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66  -pParent->nOverf
301e0 6c 6f 77 29 3b 0a 20 20 20 20 20 20 70 67 6e 6f  low);.      pgno
301f0 20 3d 20 67 65 74 34 62 79 74 65 28 61 70 44 69   = get4byte(apDi
30200 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73 7a 4e  v[i]);.      szN
30210 65 77 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65  ew[i] = cellSize
30220 50 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44  Ptr(pParent, apD
30230 69 76 5b 69 5d 29 3b 0a 0a 20 20 20 20 20 20 2f  iv[i]);..      /
30240 2a 20 44 72 6f 70 20 74 68 65 20 63 65 6c 6c 20  * Drop the cell 
30250 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20  from the parent 
30260 70 61 67 65 2e 20 61 70 44 69 76 5b 69 5d 20 73  page. apDiv[i] s
30270 74 69 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 0a 20  till points to. 
30280 20 20 20 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c       ** the cell
30290 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 72 65   within the pare
302a0 6e 74 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20  nt, even though 
302b0 69 74 20 68 61 73 20 62 65 65 6e 20 64 72 6f 70  it has been drop
302c0 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68  ped..      ** Th
302d0 69 73 20 69 73 20 73 61 66 65 20 62 65 63 61 75  is is safe becau
302e0 73 65 20 64 72 6f 70 70 69 6e 67 20 61 20 63 65  se dropping a ce
302f0 6c 6c 20 6f 6e 6c 79 20 6f 76 65 72 77 72 69 74  ll only overwrit
30300 65 73 20 74 68 65 20 66 69 72 73 74 0a 20 20 20  es the first.   
30310 20 20 20 2a 2a 20 66 6f 75 72 20 62 79 74 65 73     ** four bytes
30320 20 6f 66 20 69 74 2c 20 61 6e 64 20 74 68 69 73   of it, and this
30330 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
30340 6f 74 20 6e 65 65 64 20 74 68 65 20 66 69 72 73  ot need the firs
30350 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 75 72 20  t.      ** four 
30360 62 79 74 65 73 20 6f 66 20 74 68 65 20 64 69 76  bytes of the div
30370 69 64 65 72 20 63 65 6c 6c 2e 20 53 6f 20 74 68  ider cell. So th
30380 65 20 70 6f 69 6e 74 65 72 20 69 73 20 73 61 66  e pointer is saf
30390 65 20 74 6f 20 75 73 65 0a 20 20 20 20 20 20 2a  e to use.      *
303a0 2a 20 6c 61 74 65 72 20 6f 6e 2e 20 20 0a 20 20  * later on.  .  
303b0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
303c0 55 6e 6c 65 73 73 20 53 51 4c 69 74 65 20 69 73  Unless SQLite is
303d0 20 63 6f 6d 70 69 6c 65 64 20 69 6e 20 73 65 63   compiled in sec
303e0 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 2e  ure-delete mode.
303f0 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 0a 20   In this case,. 
30400 20 20 20 20 20 2a 2a 20 74 68 65 20 64 72 6f 70       ** the drop
30410 43 65 6c 6c 28 29 20 72 6f 75 74 69 6e 65 20 77  Cell() routine w
30420 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68  ill overwrite th
30430 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 77 69  e entire cell wi
30440 74 68 20 7a 65 72 6f 65 73 2e 0a 20 20 20 20 20  th zeroes..     
30450 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   ** In this case
30460 2c 20 74 65 6d 70 6f 72 61 72 69 6c 79 20 63 6f  , temporarily co
30470 70 79 20 74 68 65 20 63 65 6c 6c 20 69 6e 74 6f  py the cell into
30480 20 74 68 65 20 61 4f 76 66 6c 53 70 61 63 65 5b   the aOvflSpace[
30490 5d 0a 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65  ].      ** buffe
304a0 72 2e 20 49 74 20 77 69 6c 6c 20 62 65 20 63 6f  r. It will be co
304b0 70 69 65 64 20 6f 75 74 20 61 67 61 69 6e 20 61  pied out again a
304c0 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 61 53  s soon as the aS
304d0 70 61 63 65 5b 5d 20 62 75 66 66 65 72 0a 20 20  pace[] buffer.  
304e0 20 20 20 20 2a 2a 20 69 73 20 61 6c 6c 6f 63 61      ** is alloca
304f0 74 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69  ted.  */.      i
30500 66 28 20 70 42 74 2d 3e 73 65 63 75 72 65 44 65  f( pBt->secureDe
30510 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  lete ){.        
30520 69 6e 74 20 69 4f 66 66 20 3d 20 53 51 4c 49 54  int iOff = SQLIT
30530 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 61 70 44  E_PTR_TO_INT(apD
30540 69 76 5b 69 5d 29 20 2d 20 53 51 4c 49 54 45 5f  iv[i]) - SQLITE_
30550 50 54 52 5f 54 4f 5f 49 4e 54 28 70 50 61 72 65  PTR_TO_INT(pPare
30560 6e 74 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  nt->aData);.    
30570 20 20 20 20 69 66 28 20 28 69 4f 66 66 2b 73 7a      if( (iOff+sz
30580 4e 65 77 5b 69 5d 29 3e 70 42 74 2d 3e 75 73 61  New[i])>pBt->usa
30590 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
305a0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
305b0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
305c0 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28           memset(
305d0 61 70 4f 6c 64 2c 20 30 2c 20 28 69 2b 31 29 2a  apOld, 0, (i+1)*
305e0 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 2a 29  sizeof(MemPage*)
305f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
30600 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
30610 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  p;.        }else
30620 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  {.          memc
30630 70 79 28 26 61 4f 76 66 6c 53 70 61 63 65 5b 69  py(&aOvflSpace[i
30640 4f 66 66 5d 2c 20 61 70 44 69 76 5b 69 5d 2c 20  Off], apDiv[i], 
30650 73 7a 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20 20  szNew[i]);.     
30660 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20       apDiv[i] = 
30670 26 61 4f 76 66 6c 53 70 61 63 65 5b 61 70 44 69  &aOvflSpace[apDi
30680 76 5b 69 5d 2d 70 50 61 72 65 6e 74 2d 3e 61 44  v[i]-pParent->aD
30690 61 74 61 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ata];.        }.
306a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 72        }.      dr
306b0 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  opCell(pParent, 
306c0 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d  i+nxDiv-pParent-
306d0 3e 6e 4f 76 65 72 66 6c 6f 77 2c 20 73 7a 4e 65  >nOverflow, szNe
306e0 77 5b 69 5d 2c 20 26 72 63 29 3b 0a 20 20 20 20  w[i], &rc);.    
306f0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  }.  }..  /* Make
30700 20 6e 4d 61 78 43 65 6c 6c 73 20 61 20 6d 75 6c   nMaxCells a mul
30710 74 69 70 6c 65 20 6f 66 20 34 20 69 6e 20 6f 72  tiple of 4 in or
30720 64 65 72 20 74 6f 20 70 72 65 73 65 72 76 65 20  der to preserve 
30730 38 2d 62 79 74 65 0a 20 20 2a 2a 20 61 6c 69 67  8-byte.  ** alig
30740 6e 6d 65 6e 74 20 2a 2f 0a 20 20 6e 4d 61 78 43  nment */.  nMaxC
30750 65 6c 6c 73 20 3d 20 28 6e 4d 61 78 43 65 6c 6c  ells = (nMaxCell
30760 73 20 2b 20 33 29 26 7e 33 3b 0a 0a 20 20 2f 2a  s + 3)&~3;..  /*
30770 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  ** Allocate s
30780 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20  pace for memory 
30790 73 74 72 75 63 74 75 72 65 73 0a 20 20 2a 2f 0a  structures.  */.
307a0 20 20 6b 20 3d 20 70 42 74 2d 3e 70 61 67 65 53    k = pBt->pageS
307b0 69 7a 65 20 2b 20 52 4f 55 4e 44 38 28 73 69 7a  ize + ROUND8(siz
307c0 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20  eof(MemPage));. 
307d0 20 73 7a 53 63 72 61 74 63 68 20 3d 0a 20 20 20   szScratch =.   
307e0 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69      nMaxCells*si
307f0 7a 65 6f 66 28 75 38 2a 29 20 20 20 20 20 20 20  zeof(u8*)       
30800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30810 2f 2a 20 61 70 43 65 6c 6c 20 2a 2f 0a 20 20 20  /* apCell */.   
30820 20 20 2b 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69    + nMaxCells*si
30830 7a 65 6f 66 28 75 31 36 29 20 20 20 20 20 20 20  zeof(u16)       
30840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30850 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20  /* szCell */.   
30860 20 20 2b 20 70 42 74 2d 3e 70 61 67 65 53 69 7a    + pBt->pageSiz
30870 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
30880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30890 2f 2a 20 61 53 70 61 63 65 31 20 2a 2f 0a 20 20  /* aSpace1 */.  
308a0 20 20 20 2b 20 6b 2a 6e 4f 6c 64 3b 20 20 20 20     + k*nOld;    
308b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
308c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
308d0 20 2f 2a 20 50 61 67 65 20 63 6f 70 69 65 73 20   /* Page copies 
308e0 28 61 70 43 6f 70 79 29 20 2a 2f 0a 20 20 61 70  (apCopy) */.  ap
308f0 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 63  Cell = sqlite3Sc
30900 72 61 74 63 68 4d 61 6c 6c 6f 63 28 20 73 7a 53  ratchMalloc( szS
30910 63 72 61 74 63 68 20 29 3b 20 0a 20 20 69 66 28  cratch ); .  if(
30920 20 61 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20   apCell==0 ){.  
30930 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
30940 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61  MEM;.    goto ba
30950 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
30960 20 7d 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28 75   }.  szCell = (u
30970 31 36 2a 29 26 61 70 43 65 6c 6c 5b 6e 4d 61 78  16*)&apCell[nMax
30980 43 65 6c 6c 73 5d 3b 0a 20 20 61 53 70 61 63 65  Cells];.  aSpace
30990 31 20 3d 20 28 75 38 2a 29 26 73 7a 43 65 6c 6c  1 = (u8*)&szCell
309a0 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61  [nMaxCells];.  a
309b0 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
309c0 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 61 53 70 61  E_ALIGNMENT(aSpa
309d0 63 65 31 29 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20  ce1) );..  /*.  
309e0 2a 2a 20 4c 6f 61 64 20 70 6f 69 6e 74 65 72 73  ** Load pointers
309f0 20 74 6f 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e   to all cells on
30a00 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61   sibling pages a
30a10 6e 64 20 74 68 65 20 64 69 76 69 64 65 72 20 63  nd the divider c
30a20 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 74  ells.  ** into t
30a30 68 65 20 6c 6f 63 61 6c 20 61 70 43 65 6c 6c 5b  he local apCell[
30a40 5d 20 61 72 72 61 79 2e 20 20 4d 61 6b 65 20 63  ] array.  Make c
30a50 6f 70 69 65 73 20 6f 66 20 74 68 65 20 64 69 76  opies of the div
30a60 69 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20  ider cells.  ** 
30a70 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69  into space obtai
30a80 6e 65 64 20 66 72 6f 6d 20 61 53 70 61 63 65 31  ned from aSpace1
30a90 5b 5d 20 61 6e 64 20 72 65 6d 6f 76 65 20 74 68  [] and remove th
30aa0 65 20 74 68 65 20 64 69 76 69 64 65 72 20 43 65  e the divider Ce
30ab0 6c 6c 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 70 50  lls.  ** from pP
30ac0 61 72 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  arent..  **.  **
30ad0 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73   If the siblings
30ae0 20 61 72 65 20 6f 6e 20 6c 65 61 66 20 70 61 67   are on leaf pag
30af0 65 73 2c 20 74 68 65 6e 20 74 68 65 20 63 68 69  es, then the chi
30b00 6c 64 20 70 6f 69 6e 74 65 72 73 20 6f 66 20 74  ld pointers of t
30b10 68 65 0a 20 20 2a 2a 20 64 69 76 69 64 65 72 20  he.  ** divider 
30b20 63 65 6c 6c 73 20 61 72 65 20 73 74 72 69 70 70  cells are stripp
30b30 65 64 20 66 72 6f 6d 20 74 68 65 20 63 65 6c 6c  ed from the cell
30b40 73 20 62 65 66 6f 72 65 20 74 68 65 79 20 61 72  s before they ar
30b50 65 20 63 6f 70 69 65 64 0a 20 20 2a 2a 20 69 6e  e copied.  ** in
30b60 74 6f 20 61 53 70 61 63 65 31 5b 5d 2e 20 20 49  to aSpace1[].  I
30b70 6e 20 74 68 69 73 20 77 61 79 2c 20 61 6c 6c 20  n this way, all 
30b80 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
30b90 5d 20 61 72 65 20 77 69 74 68 6f 75 74 0a 20 20  ] are without.  
30ba0 2a 2a 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  ** child pointer
30bb0 73 2e 20 20 49 66 20 73 69 62 6c 69 6e 67 73 20  s.  If siblings 
30bc0 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20  are not leaves, 
30bd0 74 68 65 6e 20 61 6c 6c 20 63 65 6c 6c 20 69 6e  then all cell in
30be0 0a 20 20 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 69  .  ** apCell[] i
30bf0 6e 63 6c 75 64 65 20 63 68 69 6c 64 20 70 6f 69  nclude child poi
30c00 6e 74 65 72 73 2e 20 20 45 69 74 68 65 72 20 77  nters.  Either w
30c10 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e  ay, all cells in
30c20 20 61 70 43 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61   apCell[].  ** a
30c30 72 65 20 61 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20  re alike..  **. 
30c40 20 2a 2a 20 6c 65 61 66 43 6f 72 72 65 63 74 69   ** leafCorrecti
30c50 6f 6e 3a 20 20 34 20 69 66 20 70 50 61 67 65 20  on:  4 if pPage 
30c60 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66  is a leaf.  0 if
30c70 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20 61 20   pPage is not a 
30c80 6c 65 61 66 2e 0a 20 20 2a 2a 20 20 20 20 20 20  leaf..  **      
30c90 20 6c 65 61 66 44 61 74 61 3a 20 20 31 20 69 66   leafData:  1 if
30ca0 20 70 50 61 67 65 20 68 6f 6c 64 73 20 6b 65 79   pPage holds key
30cb0 2b 64 61 74 61 20 61 6e 64 20 70 50 61 72 65 6e  +data and pParen
30cc0 74 20 68 6f 6c 64 73 20 6f 6e 6c 79 20 6b 65 79  t holds only key
30cd0 73 2e 0a 20 20 2a 2f 0a 20 20 6c 65 61 66 43 6f  s..  */.  leafCo
30ce0 72 72 65 63 74 69 6f 6e 20 3d 20 61 70 4f 6c 64  rrection = apOld
30cf0 5b 30 5d 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c  [0]->leaf*4;.  l
30d00 65 61 66 44 61 74 61 20 3d 20 61 70 4f 6c 64 5b  eafData = apOld[
30d10 30 5d 2d 3e 68 61 73 44 61 74 61 3b 0a 20 20 66  0]->hasData;.  f
30d20 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20  or(i=0; i<nOld; 
30d30 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 69  i++){.    int li
30d40 6d 69 74 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a  mit;.    .    /*
30d50 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e   Before doing an
30d60 79 74 68 69 6e 67 20 65 6c 73 65 2c 20 74 61 6b  ything else, tak
30d70 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
30d80 69 27 74 68 20 6f 72 69 67 69 6e 61 6c 20 73 69  i'th original si
30d90 62 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 54 68 65  bling.    ** The
30da0 20 72 65 73 74 20 6f 66 20 74 68 69 73 20 66 75   rest of this fu
30db0 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 75 73 65 20  nction will use 
30dc0 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 63 6f  data from the co
30dd0 70 69 65 73 20 72 61 74 68 65 72 0a 20 20 20 20  pies rather.    
30de0 2a 2a 20 74 68 61 74 20 74 68 65 20 6f 72 69 67  ** that the orig
30df0 69 6e 61 6c 20 70 61 67 65 73 20 73 69 6e 63 65  inal pages since
30e00 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
30e10 67 65 73 20 77 69 6c 6c 20 62 65 20 69 6e 20 74  ges will be in t
30e20 68 65 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73  he.    ** proces
30e30 73 20 6f 66 20 62 65 69 6e 67 20 6f 76 65 72 77  s of being overw
30e40 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20  ritten.  */.    
30e50 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20  MemPage *pOld = 
30e60 61 70 43 6f 70 79 5b 69 5d 20 3d 20 28 4d 65 6d  apCopy[i] = (Mem
30e70 50 61 67 65 2a 29 26 61 53 70 61 63 65 31 5b 70  Page*)&aSpace1[p
30e80 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 6b  Bt->pageSize + k
30e90 2a 69 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  *i];.    memcpy(
30ea0 70 4f 6c 64 2c 20 61 70 4f 6c 64 5b 69 5d 2c 20  pOld, apOld[i], 
30eb0 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29  sizeof(MemPage))
30ec0 3b 0a 20 20 20 20 70 4f 6c 64 2d 3e 61 44 61 74  ;.    pOld->aDat
30ed0 61 20 3d 20 28 76 6f 69 64 2a 29 26 70 4f 6c 64  a = (void*)&pOld
30ee0 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  [1];.    memcpy(
30ef0 70 4f 6c 64 2d 3e 61 44 61 74 61 2c 20 61 70 4f  pOld->aData, apO
30f00 6c 64 5b 69 5d 2d 3e 61 44 61 74 61 2c 20 70 42  ld[i]->aData, pB
30f10 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20  t->pageSize);.. 
30f20 20 20 20 6c 69 6d 69 74 20 3d 20 70 4f 6c 64 2d     limit = pOld-
30f30 3e 6e 43 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76  >nCell+pOld->nOv
30f40 65 72 66 6c 6f 77 3b 0a 20 20 20 20 66 6f 72 28  erflow;.    for(
30f50 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b  j=0; j<limit; j+
30f60 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
30f70 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c  ( nCell<nMaxCell
30f80 73 20 29 3b 0a 20 20 20 20 20 20 61 70 43 65 6c  s );.      apCel
30f90 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e 64 4f  l[nCell] = findO
30fa0 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 4f 6c 64  verflowCell(pOld
30fb0 2c 20 6a 29 3b 0a 20 20 20 20 20 20 73 7a 43 65  , j);.      szCe
30fc0 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c  ll[nCell] = cell
30fd0 53 69 7a 65 50 74 72 28 70 4f 6c 64 2c 20 61 70  SizePtr(pOld, ap
30fe0 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20  Cell[nCell]);.  
30ff0 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20      nCell++;.   
31000 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c   }.    if( i<nOl
31010 64 2d 31 20 26 26 20 21 6c 65 61 66 44 61 74 61  d-1 && !leafData
31020 29 7b 0a 20 20 20 20 20 20 75 31 36 20 73 7a 20  ){.      u16 sz 
31030 3d 20 28 75 31 36 29 73 7a 4e 65 77 5b 69 5d 3b  = (u16)szNew[i];
31040 0a 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70  .      u8 *pTemp
31050 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
31060 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20  nCell<nMaxCells 
31070 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b  );.      szCell[
31080 6e 43 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20  nCell] = sz;.   
31090 20 20 20 70 54 65 6d 70 20 3d 20 26 61 53 70 61     pTemp = &aSpa
310a0 63 65 31 5b 69 53 70 61 63 65 31 5d 3b 0a 20 20  ce1[iSpace1];.  
310b0 20 20 20 20 69 53 70 61 63 65 31 20 2b 3d 20 73      iSpace1 += s
310c0 7a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  z;.      assert(
310d0 20 73 7a 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69   sz<=pBt->pageSi
310e0 7a 65 2f 34 20 29 3b 0a 20 20 20 20 20 20 61 73  ze/4 );.      as
310f0 73 65 72 74 28 20 69 53 70 61 63 65 31 3c 3d 70  sert( iSpace1<=p
31100 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a  Bt->pageSize );.
31110 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65        memcpy(pTe
31120 6d 70 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a  mp, apDiv[i], sz
31130 29 3b 0a 20 20 20 20 20 20 61 70 43 65 6c 6c 5b  );.      apCell[
31140 6e 43 65 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c  nCell] = pTemp+l
31150 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20  eafCorrection;. 
31160 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61       assert( lea
31170 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 7c  fCorrection==0 |
31180 7c 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  | leafCorrection
31190 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 73 7a 43  ==4 );.      szC
311a0 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 43  ell[nCell] = szC
311b0 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d 20 6c 65 61  ell[nCell] - lea
311c0 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20  fCorrection;.   
311d0 20 20 20 69 66 28 20 21 70 4f 6c 64 2d 3e 6c 65     if( !pOld->le
311e0 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  af ){.        as
311f0 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63  sert( leafCorrec
31200 74 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20  tion==0 );.     
31210 20 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64 2d     assert( pOld-
31220 3e 68 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 3b  >hdrOffset==0 );
31230 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
31240 72 69 67 68 74 20 70 6f 69 6e 74 65 72 20 6f 66  right pointer of
31250 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20   the child page 
31260 70 4f 6c 64 20 62 65 63 6f 6d 65 73 20 74 68 65  pOld becomes the
31270 20 6c 65 66 74 0a 20 20 20 20 20 20 20 20 2a 2a   left.        **
31280 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20   pointer of the 
31290 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a  divider cell */.
312a0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61          memcpy(a
312b0 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70  pCell[nCell], &p
312c0 4f 6c 64 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 34  Old->aData[8], 4
312d0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
312e0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
312f0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d  leafCorrection==
31300 34 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  4 );.        if(
31310 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34   szCell[nCell]<4
31320 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
31330 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e   Do not allow an
31340 79 20 63 65 6c 6c 73 20 73 6d 61 6c 6c 65 72 20  y cells smaller 
31350 74 68 61 6e 20 34 20 62 79 74 65 73 2e 20 2a 2f  than 4 bytes. */
31360 0a 20 20 20 20 20 20 20 20 20 20 73 7a 43 65 6c  .          szCel
31370 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20  l[nCell] = 4;.  
31380 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
31390 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20        nCell++;. 
313a0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20     }.  }..  /*. 
313b0 20 2a 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74   ** Figure out t
313c0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
313d0 65 73 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c  es needed to hol
313e0 64 20 61 6c 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c  d all nCell cell
313f0 73 2e 0a 20 20 2a 2a 20 53 74 6f 72 65 20 74 68  s..  ** Store th
31400 69 73 20 6e 75 6d 62 65 72 20 69 6e 20 22 6b 22  is number in "k"
31410 2e 20 20 41 6c 73 6f 20 63 6f 6d 70 75 74 65 20  .  Also compute 
31420 73 7a 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73  szNew[] which is
31430 20 74 68 65 20 74 6f 74 61 6c 0a 20 20 2a 2a 20   the total.  ** 
31440 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c  size of all cell
31450 73 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 70 61  s on the i-th pa
31460 67 65 20 61 6e 64 20 63 6e 74 4e 65 77 5b 5d 20  ge and cntNew[] 
31470 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 64  which is the ind
31480 65 78 0a 20 20 2a 2a 20 69 6e 20 61 70 43 65 6c  ex.  ** in apCel
31490 6c 5b 5d 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  l[] of the cell 
314a0 74 68 61 74 20 64 69 76 69 64 65 73 20 70 61 67  that divides pag
314b0 65 20 69 20 66 72 6f 6d 20 70 61 67 65 20 69 2b  e i from page i+
314c0 31 2e 20 20 0a 20 20 2a 2a 20 63 6e 74 4e 65 77  1.  .  ** cntNew
314d0 5b 6b 5d 20 73 68 6f 75 6c 64 20 65 71 75 61 6c  [k] should equal
314e0 20 6e 43 65 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a   nCell..  **.  *
314f0 2a 20 56 61 6c 75 65 73 20 63 6f 6d 70 75 74 65  * Values compute
31500 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63 6b 3a  d by this block:
31510 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
31520 20 20 20 20 20 6b 3a 20 54 68 65 20 74 6f 74 61       k: The tota
31530 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c  l number of sibl
31540 69 6e 67 20 70 61 67 65 73 0a 20 20 2a 2a 20 20  ing pages.  **  
31550 20 20 73 7a 4e 65 77 5b 69 5d 3a 20 53 70 61 63    szNew[i]: Spac
31560 65 64 20 75 73 65 64 20 6f 6e 20 74 68 65 20 69  ed used on the i
31570 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65  -th sibling page
31580 2e 0a 20 20 2a 2a 20 20 20 63 6e 74 4e 65 77 5b  ..  **   cntNew[
31590 69 5d 3a 20 49 6e 64 65 78 20 69 6e 20 61 70 43  i]: Index in apC
315a0 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a 43 65 6c 6c  ell[] and szCell
315b0 5b 5d 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  [] for the first
315c0 20 63 65 6c 6c 20 74 6f 0a 20 20 2a 2a 20 20 20   cell to.  **   
315d0 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20 72             the r
315e0 69 67 68 74 20 6f 66 20 74 68 65 20 69 2d 74 68  ight of the i-th
315f0 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20   sibling page.. 
31600 20 2a 2a 20 75 73 61 62 6c 65 53 70 61 63 65 3a   ** usableSpace:
31610 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
31620 20 6f 66 20 73 70 61 63 65 20 61 76 61 69 6c 61   of space availa
31630 62 6c 65 20 6f 6e 20 65 61 63 68 20 73 69 62 6c  ble on each sibl
31640 69 6e 67 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a  ing..  ** .  */.
31650 20 20 75 73 61 62 6c 65 53 70 61 63 65 20 3d 20    usableSpace = 
31660 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
31670 2d 20 31 32 20 2b 20 6c 65 61 66 43 6f 72 72 65  - 12 + leafCorre
31680 63 74 69 6f 6e 3b 0a 20 20 66 6f 72 28 73 75 62  ction;.  for(sub
31690 74 6f 74 61 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e  total=k=i=0; i<n
316a0 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
316b0 61 73 73 65 72 74 28 20 69 3c 6e 4d 61 78 43 65  assert( i<nMaxCe
316c0 6c 6c 73 20 29 3b 0a 20 20 20 20 73 75 62 74 6f  lls );.    subto
316d0 74 61 6c 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d  tal += szCell[i]
316e0 20 2b 20 32 3b 0a 20 20 20 20 69 66 28 20 73 75   + 2;.    if( su
316f0 62 74 6f 74 61 6c 20 3e 20 75 73 61 62 6c 65 53  btotal > usableS
31700 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 73 7a  pace ){.      sz
31710 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61  New[k] = subtota
31720 6c 20 2d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20  l - szCell[i];. 
31730 20 20 20 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d       cntNew[k] =
31740 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65   i;.      if( le
31750 61 66 44 61 74 61 20 29 7b 20 69 2d 2d 3b 20 7d  afData ){ i--; }
31760 0a 20 20 20 20 20 20 73 75 62 74 6f 74 61 6c 20  .      subtotal 
31770 3d 20 30 3b 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a  = 0;.      k++;.
31780 20 20 20 20 20 20 69 66 28 20 6b 3e 4e 42 2b 31        if( k>NB+1
31790 20 29 7b 20 72 63 20 3d 20 53 51 4c 49 54 45 5f   ){ rc = SQLITE_
317a0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 67 6f  CORRUPT_BKPT; go
317b0 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
317c0 75 70 3b 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a  up; }.    }.  }.
317d0 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62    szNew[k] = sub
317e0 74 6f 74 61 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b  total;.  cntNew[
317f0 6b 5d 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b  k] = nCell;.  k+
31800 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68  +;..  /*.  ** Th
31810 65 20 70 61 63 6b 69 6e 67 20 63 6f 6d 70 75 74  e packing comput
31820 65 64 20 62 79 20 74 68 65 20 70 72 65 76 69 6f  ed by the previo
31830 75 73 20 62 6c 6f 63 6b 20 69 73 20 62 69 61 73  us block is bias
31840 65 64 20 74 6f 77 61 72 64 20 74 68 65 20 73 69  ed toward the si
31850 62 6c 69 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20 74  blings.  ** on t
31860 68 65 20 6c 65 66 74 20 73 69 64 65 2e 20 20 54  he left side.  T
31870 68 65 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 73  he left siblings
31880 20 61 72 65 20 61 6c 77 61 79 73 20 6e 65 61 72   are always near
31890 6c 79 20 66 75 6c 6c 2c 20 77 68 69 6c 65 20 74  ly full, while t
318a0 68 65 0a 20 20 2a 2a 20 72 69 67 68 74 2d 6d 6f  he.  ** right-mo
318b0 73 74 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74  st sibling might
318c0 20 62 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79   be nearly empty
318d0 2e 20 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66  .  This block of
318e0 20 63 6f 64 65 20 61 74 74 65 6d 70 74 73 0a 20   code attempts. 
318f0 20 2a 2a 20 74 6f 20 61 64 6a 75 73 74 20 74 68   ** to adjust th
31900 65 20 70 61 63 6b 69 6e 67 20 6f 66 20 73 69 62  e packing of sib
31910 6c 69 6e 67 73 20 74 6f 20 67 65 74 20 61 20 62  lings to get a b
31920 65 74 74 65 72 20 62 61 6c 61 6e 63 65 2e 0a 20  etter balance.. 
31930 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 61 64   **.  ** This ad
31940 6a 75 73 74 6d 65 6e 74 20 69 73 20 6d 6f 72 65  justment is more
31950 20 74 68 61 6e 20 61 6e 20 6f 70 74 69 6d 69 7a   than an optimiz
31960 61 74 69 6f 6e 2e 20 20 54 68 65 20 70 61 63 6b  ation.  The pack
31970 69 6e 67 20 61 62 6f 76 65 20 6d 69 67 68 74 0a  ing above might.
31980 20 20 2a 2a 20 62 65 20 73 6f 20 6f 75 74 20 6f    ** be so out o
31990 66 20 62 61 6c 61 6e 63 65 20 61 73 20 74 6f 20  f balance as to 
319a0 62 65 20 69 6c 6c 65 67 61 6c 2e 20 20 46 6f 72  be illegal.  For
319b0 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 72 69   example, the ri
319c0 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73 69  ght-most.  ** si
319d0 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20 63  bling might be c
319e0 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e  ompletely empty.
319f0 20 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e    This adjustmen
31a00 74 20 69 73 20 6e 6f 74 20 6f 70 74 69 6f 6e 61  t is not optiona
31a10 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  l..  */.  for(i=
31a20 6b 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a  k-1; i>0; i--){.
31a30 20 20 20 20 69 6e 74 20 73 7a 52 69 67 68 74 20      int szRight 
31a40 3d 20 73 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20  = szNew[i];  /* 
31a50 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20  Size of sibling 
31a60 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a  on the right */.
31a70 20 20 20 20 69 6e 74 20 73 7a 4c 65 66 74 20 3d      int szLeft =
31a80 20 73 7a 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20   szNew[i-1]; /* 
31a90 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20  Size of sibling 
31aa0 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20  on the left */. 
31ab0 20 20 20 69 6e 74 20 72 3b 20 20 20 20 20 20 20     int r;       
31ac0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
31ad0 6f 66 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65  of right-most ce
31ae0 6c 6c 20 69 6e 20 6c 65 66 74 20 73 69 62 6c 69  ll in left sibli
31af0 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64 3b  ng */.    int d;
31b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31b10 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20   Index of first 
31b20 63 65 6c 6c 20 74 6f 20 74 68 65 20 6c 65 66 74  cell to the left
31b30 20 6f 66 20 72 69 67 68 74 20 73 69 62 6c 69 6e   of right siblin
31b40 67 20 2a 2f 0a 0a 20 20 20 20 72 20 3d 20 63 6e  g */..    r = cn
31b50 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20  tNew[i-1] - 1;. 
31b60 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c     d = r + 1 - l
31b70 65 61 66 44 61 74 61 3b 0a 20 20 20 20 61 73 73  eafData;.    ass
31b80 65 72 74 28 20 64 3c 6e 4d 61 78 43 65 6c 6c 73  ert( d<nMaxCells
31b90 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
31ba0 72 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  r<nMaxCells );. 
31bb0 20 20 20 77 68 69 6c 65 28 20 73 7a 52 69 67 68     while( szRigh
31bc0 74 3d 3d 30 20 7c 7c 20 73 7a 52 69 67 68 74 2b  t==0 || szRight+
31bd0 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c  szCell[d]+2<=szL
31be0 65 66 74 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b 32  eft-(szCell[r]+2
31bf0 29 20 29 7b 0a 20 20 20 20 20 20 73 7a 52 69 67  ) ){.      szRig
31c00 68 74 20 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20  ht += szCell[d] 
31c10 2b 20 32 3b 0a 20 20 20 20 20 20 73 7a 4c 65 66  + 2;.      szLef
31c20 74 20 2d 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b  t -= szCell[r] +
31c30 20 32 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77   2;.      cntNew
31c40 5b 69 2d 31 5d 2d 2d 3b 0a 20 20 20 20 20 20 72  [i-1]--;.      r
31c50 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d   = cntNew[i-1] -
31c60 20 31 3b 0a 20 20 20 20 20 20 64 20 3d 20 72 20   1;.      d = r 
31c70 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a  + 1 - leafData;.
31c80 20 20 20 20 7d 0a 20 20 20 20 73 7a 4e 65 77 5b      }.    szNew[
31c90 69 5d 20 3d 20 73 7a 52 69 67 68 74 3b 0a 20 20  i] = szRight;.  
31ca0 20 20 73 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20 73    szNew[i-1] = s
31cb0 7a 4c 65 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  zLeft;.  }..  /*
31cc0 20 45 69 74 68 65 72 20 77 65 20 66 6f 75 6e 64   Either we found
31cd0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 65 6c   one or more cel
31ce0 6c 73 20 28 63 6e 74 6e 65 77 5b 30 5d 29 3e 30  ls (cntnew[0])>0
31cf0 29 20 6f 72 20 70 50 61 67 65 20 69 73 0a 20 20  ) or pPage is.  
31d00 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f  ** a virtual roo
31d10 74 20 70 61 67 65 2e 20 20 41 20 76 69 72 74 75  t page.  A virtu
31d20 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  al root page is 
31d30 77 68 65 6e 20 74 68 65 20 72 65 61 6c 20 72 6f  when the real ro
31d40 6f 74 0a 20 20 2a 2a 20 70 61 67 65 20 69 73 20  ot.  ** page is 
31d50 70 61 67 65 20 31 20 61 6e 64 20 77 65 20 61 72  page 1 and we ar
31d60 65 20 74 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64  e the only child
31d70 20 6f 66 20 74 68 61 74 20 70 61 67 65 2e 0a 20   of that page.. 
31d80 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 63 6e   */.  assert( cn
31d90 74 4e 65 77 5b 30 5d 3e 30 20 7c 7c 20 28 70 50  tNew[0]>0 || (pP
31da0 61 72 65 6e 74 2d 3e 70 67 6e 6f 3d 3d 31 20 26  arent->pgno==1 &
31db0 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  & pParent->nCell
31dc0 3d 3d 30 29 20 29 3b 0a 0a 20 20 54 52 41 43 45  ==0) );..  TRACE
31dd0 28 28 22 42 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a  (("BALANCE: old:
31de0 20 25 64 20 25 64 20 25 64 20 20 22 2c 0a 20 20   %d %d %d  ",.  
31df0 20 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f    apOld[0]->pgno
31e00 2c 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f  , .    nOld>=2 ?
31e10 20 61 70 4f 6c 64 5b 31 5d 2d 3e 70 67 6e 6f 20   apOld[1]->pgno 
31e20 3a 20 30 2c 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33  : 0,.    nOld>=3
31e30 20 3f 20 61 70 4f 6c 64 5b 32 5d 2d 3e 70 67 6e   ? apOld[2]->pgn
31e40 6f 20 3a 20 30 0a 20 20 29 29 3b 0a 0a 20 20 2f  o : 0.  ));..  /
31e50 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  *.  ** Allocate 
31e60 6b 20 6e 65 77 20 70 61 67 65 73 2e 20 20 52 65  k new pages.  Re
31e70 75 73 65 20 6f 6c 64 20 70 61 67 65 73 20 77 68  use old pages wh
31e80 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20  ere possible..  
31e90 2a 2f 0a 20 20 69 66 28 20 61 70 4f 6c 64 5b 30  */.  if( apOld[0
31ea0 5d 2d 3e 70 67 6e 6f 3c 3d 31 20 29 7b 0a 20 20  ]->pgno<=1 ){.  
31eb0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
31ec0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
31ed0 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
31ee0 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 70 61 67 65  anup;.  }.  page
31ef0 46 6c 61 67 73 20 3d 20 61 70 4f 6c 64 5b 30 5d  Flags = apOld[0]
31f00 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a 20 20 66 6f  ->aData[0];.  fo
31f10 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29  r(i=0; i<k; i++)
31f20 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  {.    MemPage *p
31f30 4e 65 77 3b 0a 20 20 20 20 69 66 28 20 69 3c 6e  New;.    if( i<n
31f40 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  Old ){.      pNe
31f50 77 20 3d 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61  w = apNew[i] = a
31f60 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 61  pOld[i];.      a
31f70 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  pOld[i] = 0;.   
31f80 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
31f90 61 67 65 72 57 72 69 74 65 28 70 4e 65 77 2d 3e  agerWrite(pNew->
31fa0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
31fb0 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 20 20 69 66  nNew++;.      if
31fc0 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61  ( rc ) goto bala
31fd0 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
31fe0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
31ff0 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20  sert( i>0 );.   
32000 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
32010 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
32020 70 4e 65 77 2c 20 26 70 67 6e 6f 2c 20 70 67 6e  pNew, &pgno, pgn
32030 6f 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  o, 0);.      if(
32040 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e   rc ) goto balan
32050 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
32060 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 70 4e 65    apNew[i] = pNe
32070 77 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b  w;.      nNew++;
32080 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74  ..      /* Set t
32090 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
320a0 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6e 65 77  ntry for the new
320b0 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a   sibling page. *
320c0 2f 0a 20 20 20 20 20 20 69 66 28 20 49 53 41 55  /.      if( ISAU
320d0 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
320e0 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
320f0 74 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 50  t, pNew->pgno, P
32100 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61  TRMAP_BTREE, pPa
32110 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29  rent->pgno, &rc)
32120 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
32130 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
32140 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61           goto ba
32150 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
32160 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
32170 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
32180 20 46 72 65 65 20 61 6e 79 20 6f 6c 64 20 70 61   Free any old pa
32190 67 65 73 20 74 68 61 74 20 77 65 72 65 20 6e 6f  ges that were no
321a0 74 20 72 65 75 73 65 64 20 61 73 20 6e 65 77 20  t reused as new 
321b0 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 77 68  pages..  */.  wh
321c0 69 6c 65 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20  ile( i<nOld ){. 
321d0 20 20 20 66 72 65 65 50 61 67 65 28 61 70 4f 6c     freePage(apOl
321e0 64 5b 69 5d 2c 20 26 72 63 29 3b 0a 20 20 20 20  d[i], &rc);.    
321f0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61  if( rc ) goto ba
32200 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
32210 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61     releasePage(a
32220 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 61 70  pOld[i]);.    ap
32230 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  Old[i] = 0;.    
32240 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  i++;.  }..  /*. 
32250 20 2a 2a 20 50 75 74 20 74 68 65 20 6e 65 77 20   ** Put the new 
32260 70 61 67 65 73 20 69 6e 20 61 63 63 65 6e 64 69  pages in accendi
32270 6e 67 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20  ng order.  This 
32280 68 65 6c 70 73 20 74 6f 0a 20 20 2a 2a 20 6b 65  helps to.  ** ke
32290 65 70 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ep entries in th
322a0 65 20 64 69 73 6b 20 66 69 6c 65 20 69 6e 20 6f  e disk file in o
322b0 72 64 65 72 20 73 6f 20 74 68 61 74 20 61 20 73  rder so that a s
322c0 63 61 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  can.  ** of the 
322d0 74 61 62 6c 65 20 69 73 20 61 20 6c 69 6e 65 61  table is a linea
322e0 72 20 73 63 61 6e 20 74 68 72 6f 75 67 68 20 74  r scan through t
322f0 68 65 20 66 69 6c 65 2e 20 20 54 68 61 74 0a 20  he file.  That. 
32300 20 2a 2a 20 69 6e 20 74 75 72 6e 20 68 65 6c 70   ** in turn help
32310 73 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  s the operating 
32320 73 79 73 74 65 6d 20 74 6f 20 64 65 6c 69 76 65  system to delive
32330 72 20 70 61 67 65 73 0a 20 20 2a 2a 20 66 72 6f  r pages.  ** fro
32340 6d 20 74 68 65 20 64 69 73 6b 20 6d 6f 72 65 20  m the disk more 
32350 72 61 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20  rapidly..  **.  
32360 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29 20 69 6e 73  ** An O(n^2) ins
32370 65 72 74 69 6f 6e 20 73 6f 72 74 20 61 6c 67 6f  ertion sort algo
32380 72 69 74 68 6d 20 69 73 20 75 73 65 64 2c 20 62  rithm is used, b
32390 75 74 20 73 69 6e 63 65 0a 20 20 2a 2a 20 6e 20  ut since.  ** n 
323a0 69 73 20 6e 65 76 65 72 20 6d 6f 72 65 20 74 68  is never more th
323b0 61 6e 20 4e 42 20 28 61 20 73 6d 61 6c 6c 20 63  an NB (a small c
323c0 6f 6e 73 74 61 6e 74 29 2c 20 74 68 61 74 20 73  onstant), that s
323d0 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20 62  hould.  ** not b
323e0 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a  e a problem..  *
323f0 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d  *.  ** When NB==
32400 33 2c 20 74 68 69 73 20 6f 6e 65 20 6f 70 74 69  3, this one opti
32410 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b 65 73 20 74  mization makes t
32420 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  he database.  **
32430 20 61 62 6f 75 74 20 32 35 25 20 66 61 73 74 65   about 25% faste
32440 72 20 66 6f 72 20 6c 61 72 67 65 20 69 6e 73 65  r for large inse
32450 72 74 69 6f 6e 73 20 61 6e 64 20 64 65 6c 65 74  rtions and delet
32460 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ions..  */.  for
32470 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b  (i=0; i<k-1; i++
32480 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 56 20  ){.    int minV 
32490 3d 20 61 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f  = apNew[i]->pgno
324a0 3b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 49 20 3d  ;.    int minI =
324b0 20 69 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b   i;.    for(j=i+
324c0 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20  1; j<k; j++){.  
324d0 20 20 20 20 69 66 28 20 61 70 4e 65 77 5b 6a 5d      if( apNew[j]
324e0 2d 3e 70 67 6e 6f 3c 28 75 6e 73 69 67 6e 65 64  ->pgno<(unsigned
324f0 29 6d 69 6e 56 20 29 7b 0a 20 20 20 20 20 20 20  )minV ){.       
32500 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20 20 20 20 20   minI = j;.     
32510 20 20 20 6d 69 6e 56 20 3d 20 61 70 4e 65 77 5b     minV = apNew[
32520 6a 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 20 20  j]->pgno;.      
32530 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
32540 6d 69 6e 49 3e 69 20 29 7b 0a 20 20 20 20 20 20  minI>i ){.      
32550 69 6e 74 20 74 3b 0a 20 20 20 20 20 20 4d 65 6d  int t;.      Mem
32560 50 61 67 65 20 2a 70 54 3b 0a 20 20 20 20 20 20  Page *pT;.      
32570 74 20 3d 20 61 70 4e 65 77 5b 69 5d 2d 3e 70 67  t = apNew[i]->pg
32580 6e 6f 3b 0a 20 20 20 20 20 20 70 54 20 3d 20 61  no;.      pT = a
32590 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 61  pNew[i];.      a
325a0 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4e 65 77 5b  pNew[i] = apNew[
325b0 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20 61 70 4e  minI];.      apN
325c0 65 77 5b 6d 69 6e 49 5d 20 3d 20 70 54 3b 0a 20  ew[minI] = pT;. 
325d0 20 20 20 7d 0a 20 20 7d 0a 20 20 54 52 41 43 45     }.  }.  TRACE
325e0 28 28 22 6e 65 77 3a 20 25 64 28 25 64 29 20 25  (("new: %d(%d) %
325f0 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28  d(%d) %d(%d) %d(
32600 25 64 29 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20  %d) %d(%d)\n",. 
32610 20 20 20 61 70 4e 65 77 5b 30 5d 2d 3e 70 67 6e     apNew[0]->pgn
32620 6f 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a 20 20 20  o, szNew[0],.   
32630 20 6e 4e 65 77 3e 3d 32 20 3f 20 61 70 4e 65 77   nNew>=2 ? apNew
32640 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e  [1]->pgno : 0, n
32650 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e 65 77 5b 31  New>=2 ? szNew[1
32660 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e  ] : 0,.    nNew>
32670 3d 33 20 3f 20 61 70 4e 65 77 5b 32 5d 2d 3e 70  =3 ? apNew[2]->p
32680 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33  gno : 0, nNew>=3
32690 20 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c   ? szNew[2] : 0,
326a0 0a 20 20 20 20 6e 4e 65 77 3e 3d 34 20 3f 20 61  .    nNew>=4 ? a
326b0 70 4e 65 77 5b 33 5d 2d 3e 70 67 6e 6f 20 3a 20  pNew[3]->pgno : 
326c0 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e  0, nNew>=4 ? szN
326d0 65 77 5b 33 5d 20 3a 20 30 2c 0a 20 20 20 20 6e  ew[3] : 0,.    n
326e0 4e 65 77 3e 3d 35 20 3f 20 61 70 4e 65 77 5b 34  New>=5 ? apNew[4
326f0 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65  ]->pgno : 0, nNe
32700 77 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b 34 5d 20  w>=5 ? szNew[4] 
32710 3a 20 30 29 29 3b 0a 0a 20 20 61 73 73 65 72 74  : 0));..  assert
32720 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
32730 77 72 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e  writeable(pParen
32740 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  t->pDbPage) );. 
32750 20 70 75 74 34 62 79 74 65 28 70 52 69 67 68 74   put4byte(pRight
32760 2c 20 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d  , apNew[nNew-1]-
32770 3e 70 67 6e 6f 29 3b 0a 0a 20 20 2f 2a 0a 20 20  >pgno);..  /*.  
32780 2a 2a 20 45 76 65 6e 6c 79 20 64 69 73 74 72 69  ** Evenly distri
32790 62 75 74 65 20 74 68 65 20 64 61 74 61 20 69 6e  bute the data in
327a0 20 61 70 43 65 6c 6c 5b 5d 20 61 63 72 6f 73 73   apCell[] across
327b0 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 2e 0a   the new pages..
327c0 20 20 2a 2a 20 49 6e 73 65 72 74 20 64 69 76 69    ** Insert divi
327d0 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 70  der cells into p
327e0 50 61 72 65 6e 74 20 61 73 20 6e 65 63 65 73 73  Parent as necess
327f0 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20  ary..  */.  j = 
32800 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
32810 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nNew; i++){.    
32820 2f 2a 20 41 73 73 65 6d 62 6c 65 20 74 68 65 20  /* Assemble the 
32830 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65  new sibling page
32840 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65  . */.    MemPage
32850 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69   *pNew = apNew[i
32860 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a  ];.    assert( j
32870 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
32880 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c    zeroPage(pNew,
32890 20 70 61 67 65 46 6c 61 67 73 29 3b 0a 20 20 20   pageFlags);.   
328a0 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e   assemblePage(pN
328b0 65 77 2c 20 63 6e 74 4e 65 77 5b 69 5d 2d 6a 2c  ew, cntNew[i]-j,
328c0 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 73 7a   &apCell[j], &sz
328d0 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20 20 20 61 73  Cell[j]);.    as
328e0 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 43 65 6c  sert( pNew->nCel
328f0 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77 3d 3d 31 20  l>0 || (nNew==1 
32900 26 26 20 63 6e 74 4e 65 77 5b 30 5d 3d 3d 30 29  && cntNew[0]==0)
32910 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
32920 70 4e 65 77 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  pNew->nOverflow=
32930 3d 30 20 29 3b 0a 0a 20 20 20 20 6a 20 3d 20 63  =0 );..    j = c
32940 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20 20 20 20 2f  ntNew[i];..    /
32950 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67  * If the sibling
32960 20 70 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20   page assembled 
32970 61 62 6f 76 65 20 77 61 73 20 6e 6f 74 20 74 68  above was not th
32980 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62  e right-most sib
32990 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a 20 69 6e 73  ling,.    ** ins
329a0 65 72 74 20 61 20 64 69 76 69 64 65 72 20 63 65  ert a divider ce
329b0 6c 6c 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65  ll into the pare
329c0 6e 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  nt page..    */.
329d0 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 4e      assert( i<nN
329e0 65 77 2d 31 20 7c 7c 20 6a 3d 3d 6e 43 65 6c 6c  ew-1 || j==nCell
329f0 20 29 3b 0a 20 20 20 20 69 66 28 20 6a 3c 6e 43   );.    if( j<nC
32a00 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 75 38 20  ell ){.      u8 
32a10 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 75 38  *pCell;.      u8
32a20 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 69   *pTemp;.      i
32a30 6e 74 20 73 7a 3b 0a 0a 20 20 20 20 20 20 61 73  nt sz;..      as
32a40 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c  sert( j<nMaxCell
32a50 73 20 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c  s );.      pCell
32a60 20 3d 20 61 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20   = apCell[j];.  
32a70 20 20 20 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b      sz = szCell[
32a80 6a 5d 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74  j] + leafCorrect
32a90 69 6f 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d 70  ion;.      pTemp
32aa0 20 3d 20 26 61 4f 76 66 6c 53 70 61 63 65 5b 69   = &aOvflSpace[i
32ab0 4f 76 66 6c 53 70 61 63 65 5d 3b 0a 20 20 20 20  OvflSpace];.    
32ac0 20 20 69 66 28 20 21 70 4e 65 77 2d 3e 6c 65 61    if( !pNew->lea
32ad0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  f ){.        mem
32ae0 63 70 79 28 26 70 4e 65 77 2d 3e 61 44 61 74 61  cpy(&pNew->aData
32af0 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20 34 29 3b 0a  [8], pCell, 4);.
32b00 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
32b10 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20  leafData ){.    
32b20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 74 72      /* If the tr
32b30 65 65 20 69 73 20 61 20 6c 65 61 66 2d 64 61 74  ee is a leaf-dat
32b40 61 20 74 72 65 65 2c 20 61 6e 64 20 74 68 65 20  a tree, and the 
32b50 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6c 65 61  siblings are lea
32b60 76 65 73 2c 20 0a 20 20 20 20 20 20 20 20 2a 2a  ves, .        **
32b70 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e   then there is n
32b80 6f 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69  o divider cell i
32b90 6e 20 61 70 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74  n apCell[]. Inst
32ba0 65 61 64 2c 20 74 68 65 20 64 69 76 69 64 65 72  ead, the divider
32bb0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c   .        ** cel
32bc0 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68  l consists of th
32bd0 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 66 6f  e integer key fo
32be0 72 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  r the right-most
32bf0 20 63 65 6c 6c 20 6f 66 20 0a 20 20 20 20 20 20   cell of .      
32c00 20 20 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e 67    ** the sibling
32c10 2d 70 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20  -page assembled 
32c20 61 62 6f 76 65 20 6f 6e 6c 79 2e 0a 20 20 20 20  above only..    
32c30 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 43      */.        C
32c40 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
32c50 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20 20 20        j--;.     
32c60 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
32c70 6c 50 74 72 28 70 4e 65 77 2c 20 61 70 43 65 6c  lPtr(pNew, apCel
32c80 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  l[j], &info);.  
32c90 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54        pCell = pT
32ca0 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 73 7a 20  emp;.        sz 
32cb0 3d 20 34 20 2b 20 70 75 74 56 61 72 69 6e 74 28  = 4 + putVarint(
32cc0 26 70 43 65 6c 6c 5b 34 5d 2c 20 69 6e 66 6f 2e  &pCell[4], info.
32cd0 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 70  nKey);.        p
32ce0 54 65 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  Temp = 0;.      
32cf0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
32d00 43 65 6c 6c 20 2d 3d 20 34 3b 0a 20 20 20 20 20  Cell -= 4;.     
32d10 20 20 20 2f 2a 20 4f 62 73 63 75 72 65 20 63 61     /* Obscure ca
32d20 73 65 20 66 6f 72 20 6e 6f 6e 2d 6c 65 61 66 2d  se for non-leaf-
32d30 64 61 74 61 20 74 72 65 65 73 3a 20 49 66 20 74  data trees: If t
32d40 68 65 20 63 65 6c 6c 20 61 74 20 70 43 65 6c 6c  he cell at pCell
32d50 20 77 61 73 0a 20 20 20 20 20 20 20 20 2a 2a 20   was.        ** 
32d60 70 72 65 76 69 6f 75 73 6c 79 20 73 74 6f 72 65  previously store
32d70 64 20 6f 6e 20 61 20 6c 65 61 66 20 6e 6f 64 65  d on a leaf node
32d80 2c 20 61 6e 64 20 69 74 73 20 72 65 70 6f 72 74  , and its report
32d90 65 64 20 73 69 7a 65 20 77 61 73 20 34 0a 20 20  ed size was 4.  
32da0 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 2c 20        ** bytes, 
32db0 74 68 65 6e 20 69 74 20 6d 61 79 20 61 63 74 75  then it may actu
32dc0 61 6c 6c 79 20 62 65 20 73 6d 61 6c 6c 65 72 20  ally be smaller 
32dd0 74 68 61 6e 20 74 68 69 73 20 0a 20 20 20 20 20  than this .     
32de0 20 20 20 2a 2a 20 28 73 65 65 20 62 74 72 65 65     ** (see btree
32df0 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20  ParseCellPtr(), 
32e00 34 20 62 79 74 65 73 20 69 73 20 74 68 65 20 6d  4 bytes is the m
32e10 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f 66 0a 20  inimum size of. 
32e20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 20 63 65         ** any ce
32e30 6c 6c 29 2e 20 42 75 74 20 69 74 20 69 73 20 69  ll). But it is i
32e40 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70 61 73 73  mportant to pass
32e50 20 74 68 65 20 63 6f 72 72 65 63 74 20 73 69 7a   the correct siz
32e60 65 20 74 6f 20 0a 20 20 20 20 20 20 20 20 2a 2a  e to .        **
32e70 20 69 6e 73 65 72 74 43 65 6c 6c 28 29 2c 20 73   insertCell(), s
32e80 6f 20 72 65 70 61 72 73 65 20 74 68 65 20 63 65  o reparse the ce
32e90 6c 6c 20 6e 6f 77 2e 0a 20 20 20 20 20 20 20 20  ll now..        
32ea0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f  **.        ** No
32eb0 74 65 20 74 68 61 74 20 74 68 69 73 20 63 61 6e  te that this can
32ec0 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20 69 6e   never happen in
32ed0 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61 20   an SQLite data 
32ee0 66 69 6c 65 2c 20 61 73 20 61 6c 6c 0a 20 20 20  file, as all.   
32ef0 20 20 20 20 20 2a 2a 20 63 65 6c 6c 73 20 61 72       ** cells ar
32f00 65 20 61 74 20 6c 65 61 73 74 20 34 20 62 79 74  e at least 4 byt
32f10 65 73 2e 20 49 74 20 6f 6e 6c 79 20 68 61 70 70  es. It only happ
32f20 65 6e 73 20 69 6e 20 62 2d 74 72 65 65 73 20 75  ens in b-trees u
32f30 73 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  sed.        ** t
32f40 6f 20 65 76 61 6c 75 61 74 65 20 22 49 4e 20 28  o evaluate "IN (
32f50 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 61 6e 64  SELECT ...)" and
32f60 20 73 69 6d 69 6c 61 72 20 63 6c 61 75 73 65 73   similar clauses
32f70 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
32f80 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b       if( szCell[
32f90 6a 5d 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 20  j]==4 ){.       
32fa0 20 20 20 61 73 73 65 72 74 28 6c 65 61 66 43 6f     assert(leafCo
32fb0 72 72 65 63 74 69 6f 6e 3d 3d 34 29 3b 0a 20 20  rrection==4);.  
32fc0 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65 6c          sz = cel
32fd0 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74  lSizePtr(pParent
32fe0 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20  , pCell);.      
32ff0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
33000 20 20 69 4f 76 66 6c 53 70 61 63 65 20 2b 3d 20    iOvflSpace += 
33010 73 7a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  sz;.      assert
33020 28 20 73 7a 3c 3d 70 42 74 2d 3e 70 61 67 65 53  ( sz<=pBt->pageS
33030 69 7a 65 2f 34 20 29 3b 0a 20 20 20 20 20 20 61  ize/4 );.      a
33040 73 73 65 72 74 28 20 69 4f 76 66 6c 53 70 61 63  ssert( iOvflSpac
33050 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e<=pBt->pageSize
33060 20 29 3b 0a 20 20 20 20 20 20 69 6e 73 65 72 74   );.      insert
33070 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78  Cell(pParent, nx
33080 44 69 76 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c 20  Div, pCell, sz, 
33090 70 54 65 6d 70 2c 20 70 4e 65 77 2d 3e 70 67 6e  pTemp, pNew->pgn
330a0 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69  o, &rc);.      i
330b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
330c0 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
330d0 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61  cleanup;.      a
330e0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
330f0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
33100 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
33110 20 29 3b 0a 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a   );..      j++;.
33120 20 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20        nxDiv++;. 
33130 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
33140 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20  t( j==nCell );. 
33150 20 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e 30 20   assert( nOld>0 
33160 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65  );.  assert( nNe
33170 77 3e 30 20 29 3b 0a 20 20 69 66 28 20 28 70 61  w>0 );.  if( (pa
33180 67 65 46 6c 61 67 73 20 26 20 50 54 46 5f 4c 45  geFlags & PTF_LE
33190 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75 38  AF)==0 ){.    u8
331a0 20 2a 7a 43 68 69 6c 64 20 3d 20 26 61 70 43 6f   *zChild = &apCo
331b0 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61 74  py[nOld-1]->aDat
331c0 61 5b 38 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  a[8];.    memcpy
331d0 28 26 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d  (&apNew[nNew-1]-
331e0 3e 61 44 61 74 61 5b 38 5d 2c 20 7a 43 68 69 6c  >aData[8], zChil
331f0 64 2c 20 34 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  d, 4);.  }..  if
33200 28 20 69 73 52 6f 6f 74 20 26 26 20 70 50 61 72  ( isRoot && pPar
33210 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26  ent->nCell==0 &&
33220 20 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66   pParent->hdrOff
33230 73 65 74 3c 3d 61 70 4e 65 77 5b 30 5d 2d 3e 6e  set<=apNew[0]->n
33240 46 72 65 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54  Free ){.    /* T
33250 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
33260 74 68 65 20 62 2d 74 72 65 65 20 6e 6f 77 20 63  the b-tree now c
33270 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73  ontains no cells
33280 2e 20 54 68 65 20 6f 6e 6c 79 20 73 69 62 6c 69  . The only sibli
33290 6e 67 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 69  ng.    ** page i
332a0 73 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c  s the right-chil
332b0 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 2e  d of the parent.
332c0 20 43 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e   Copy the conten
332d0 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ts of the.    **
332e0 20 63 68 69 6c 64 20 70 61 67 65 20 69 6e 74 6f   child page into
332f0 20 74 68 65 20 70 61 72 65 6e 74 2c 20 64 65 63   the parent, dec
33300 72 65 61 73 69 6e 67 20 74 68 65 20 6f 76 65 72  reasing the over
33310 61 6c 6c 20 68 65 69 67 68 74 20 6f 66 20 74 68  all height of th
33320 65 0a 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20  e.    ** b-tree 
33330 73 74 72 75 63 74 75 72 65 20 62 79 20 6f 6e 65  structure by one
33340 2e 20 54 68 69 73 20 69 73 20 64 65 73 63 72 69  . This is descri
33350 62 65 64 20 61 73 20 74 68 65 20 22 62 61 6c 61  bed as the "bala
33360 6e 63 65 2d 73 68 61 6c 6c 6f 77 65 72 22 0a 20  nce-shallower". 
33370 20 20 20 2a 2a 20 73 75 62 2d 61 6c 67 6f 72 69     ** sub-algori
33380 74 68 6d 20 69 6e 20 73 6f 6d 65 20 64 6f 63 75  thm in some docu
33390 6d 65 6e 74 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  mentation..    *
333a0 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73  *.    ** If this
333b0 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   is an auto-vacu
333c0 75 6d 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  um database, the
333d0 20 63 61 6c 6c 20 74 6f 20 63 6f 70 79 4e 6f 64   call to copyNod
333e0 65 43 6f 6e 74 65 6e 74 28 29 20 0a 20 20 20 20  eContent() .    
333f0 2a 2a 20 73 65 74 73 20 61 6c 6c 20 70 6f 69 6e  ** sets all poin
33400 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20  ter-map entries 
33410 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
33420 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20   database image 
33430 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 66 6f  pages .    ** fo
33440 72 20 77 68 69 63 68 20 74 68 65 20 70 6f 69 6e  r which the poin
33450 74 65 72 20 69 73 20 73 74 6f 72 65 64 20 77 69  ter is stored wi
33460 74 68 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  thin the content
33470 20 62 65 69 6e 67 20 63 6f 70 69 65 64 2e 0a 20   being copied.. 
33480 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
33490 20 73 65 63 6f 6e 64 20 61 73 73 65 72 74 20 62   second assert b
334a0 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74 68  elow verifies th
334b0 61 74 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  at the child pag
334c0 65 20 69 73 20 64 65 66 72 61 67 6d 65 6e 74 65  e is defragmente
334d0 64 0a 20 20 20 20 2a 2a 20 28 69 74 20 6d 75 73  d.    ** (it mus
334e0 74 20 62 65 2c 20 61 73 20 69 74 20 77 61 73 20  t be, as it was 
334f0 6a 75 73 74 20 72 65 63 6f 6e 73 74 72 75 63 74  just reconstruct
33500 65 64 20 75 73 69 6e 67 20 61 73 73 65 6d 62 6c  ed using assembl
33510 65 50 61 67 65 28 29 29 2e 20 54 68 69 73 0a 20  ePage()). This. 
33520 20 20 20 2a 2a 20 69 73 20 69 6d 70 6f 72 74 61     ** is importa
33530 6e 74 20 69 66 20 74 68 65 20 70 61 72 65 6e 74  nt if the parent
33540 20 70 61 67 65 20 68 61 70 70 65 6e 73 20 74 6f   page happens to
33550 20 62 65 20 70 61 67 65 20 31 20 6f 66 20 74 68   be page 1 of th
33560 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
33570 2a 20 69 6d 61 67 65 2e 20 20 2a 2f 0a 20 20 20  * image.  */.   
33580 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3d 3d 31   assert( nNew==1
33590 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
335a0 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65 65 20  apNew[0]->nFree 
335b0 3d 3d 20 0a 20 20 20 20 20 20 20 20 28 67 65 74  == .        (get
335c0 32 62 79 74 65 28 26 61 70 4e 65 77 5b 30 5d 2d  2byte(&apNew[0]-
335d0 3e 61 44 61 74 61 5b 35 5d 29 2d 61 70 4e 65 77  >aData[5])-apNew
335e0 5b 30 5d 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2d  [0]->cellOffset-
335f0 61 70 4e 65 77 5b 30 5d 2d 3e 6e 43 65 6c 6c 2a  apNew[0]->nCell*
33600 32 29 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 63  2) .    );.    c
33610 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 61  opyNodeContent(a
33620 70 4e 65 77 5b 30 5d 2c 20 70 50 61 72 65 6e 74  pNew[0], pParent
33630 2c 20 26 72 63 29 3b 0a 20 20 20 20 66 72 65 65  , &rc);.    free
33640 50 61 67 65 28 61 70 4e 65 77 5b 30 5d 2c 20 26  Page(apNew[0], &
33650 72 63 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  rc);.  }else if(
33660 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
33670 0a 20 20 20 20 2f 2a 20 46 69 78 20 74 68 65 20  .    /* Fix the 
33680 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
33690 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 20  ies for all the 
336a0 63 65 6c 6c 73 20 74 68 61 74 20 77 65 72 65 20  cells that were 
336b0 73 68 69 66 74 65 64 20 61 72 6f 75 6e 64 2e 20  shifted around. 
336c0 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 20 61 72  .    ** There ar
336d0 65 20 73 65 76 65 72 61 6c 20 64 69 66 66 65 72  e several differ
336e0 65 6e 74 20 74 79 70 65 73 20 6f 66 20 70 6f 69  ent types of poi
336f0 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
33700 20 74 68 61 74 20 6e 65 65 64 20 74 6f 0a 20 20   that need to.  
33710 20 20 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69    ** be dealt wi
33720 74 68 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  th by this routi
33730 6e 65 2e 20 53 6f 6d 65 20 6f 66 20 74 68 65 73  ne. Some of thes
33740 65 20 68 61 76 65 20 62 65 65 6e 20 73 65 74 20  e have been set 
33750 61 6c 72 65 61 64 79 2c 20 62 75 74 0a 20 20 20  already, but.   
33760 20 2a 2a 20 6d 61 6e 79 20 68 61 76 65 20 6e 6f   ** many have no
33770 74 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  t. The following
33780 20 69 73 20 61 20 73 75 6d 6d 61 72 79 3a 0a 20   is a summary:. 
33790 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 31     **.    **   1
337a0 29 20 54 68 65 20 65 6e 74 72 69 65 73 20 61 73  ) The entries as
337b0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6e 65  sociated with ne
337c0 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20  w sibling pages 
337d0 74 68 61 74 20 77 65 72 65 20 6e 6f 74 0a 20 20  that were not.  
337e0 20 20 2a 2a 20 20 20 20 20 20 73 69 62 6c 69 6e    **      siblin
337f0 67 73 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  gs when this fun
33800 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64  ction was called
33810 2e 20 54 68 65 73 65 20 68 61 76 65 20 61 6c 72  . These have alr
33820 65 61 64 79 0a 20 20 20 20 2a 2a 20 20 20 20 20  eady.    **     
33830 20 62 65 65 6e 20 73 65 74 2e 20 57 65 20 64 6f   been set. We do
33840 6e 27 74 20 6e 65 65 64 20 74 6f 20 77 6f 72 72  n't need to worr
33850 79 20 61 62 6f 75 74 20 6f 6c 64 20 73 69 62 6c  y about old sibl
33860 69 6e 67 73 20 74 68 61 74 20 77 65 72 65 0a 20  ings that were. 
33870 20 20 20 2a 2a 20 20 20 20 20 20 6d 6f 76 65 64     **      moved
33880 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73   to the free-lis
33890 74 20 2d 20 74 68 65 20 66 72 65 65 50 61 67 65  t - the freePage
338a0 28 29 20 63 6f 64 65 20 68 61 73 20 74 61 6b 65  () code has take
338b0 6e 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 20 20  n care.    **   
338c0 20 20 20 6f 66 20 74 68 6f 73 65 2e 0a 20 20 20     of those..   
338d0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 32 29 20   **.    **   2) 
338e0 54 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  The pointer-map 
338f0 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61 74  entries associat
33900 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72 73  ed with the firs
33910 74 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 2a  t overflow.    *
33920 2a 20 20 20 20 20 20 70 61 67 65 20 69 6e 20 61  *      page in a
33930 6e 79 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69  ny overflow chai
33940 6e 73 20 75 73 65 64 20 62 79 20 6e 65 77 20 64  ns used by new d
33950 69 76 69 64 65 72 20 63 65 6c 6c 73 2e 20 54 68  ivider cells. Th
33960 65 73 65 20 0a 20 20 20 20 2a 2a 20 20 20 20 20  ese .    **     
33970 20 68 61 76 65 20 61 6c 73 6f 20 61 6c 72 65 61   have also alrea
33980 64 79 20 62 65 65 6e 20 74 61 6b 65 6e 20 63 61  dy been taken ca
33990 72 65 20 6f 66 20 62 79 20 74 68 65 20 69 6e 73  re of by the ins
339a0 65 72 74 43 65 6c 6c 28 29 20 63 6f 64 65 2e 0a  ertCell() code..
339b0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
339c0 33 29 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e  3) If the siblin
339d0 67 20 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20  g pages are not 
339e0 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 74 68 65  leaves, then the
339f0 20 63 68 69 6c 64 20 70 61 67 65 73 20 6f 66 0a   child pages of.
33a00 20 20 20 20 2a 2a 20 20 20 20 20 20 63 65 6c 6c      **      cell
33a10 73 20 73 74 6f 72 65 64 20 6f 6e 20 74 68 65 20  s stored on the 
33a20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 6d 61  sibling pages ma
33a30 79 20 6e 65 65 64 20 74 6f 20 62 65 20 75 70 64  y need to be upd
33a40 61 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ated..    **.   
33a50 20 2a 2a 20 20 20 34 29 20 49 66 20 74 68 65 20   **   4) If the 
33a60 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61 72  sibling pages ar
33a70 65 20 6e 6f 74 20 69 6e 74 65 72 6e 61 6c 20 69  e not internal i
33a80 6e 74 6b 65 79 20 6e 6f 64 65 73 2c 20 74 68 65  ntkey nodes, the
33a90 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20 20 20 20  n any.    **    
33aa0 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73    overflow pages
33ab0 20 75 73 65 64 20 62 79 20 74 68 65 73 65 20 63   used by these c
33ac0 65 6c 6c 73 20 6d 61 79 20 6e 65 65 64 20 74 6f  ells may need to
33ad0 20 62 65 20 75 70 64 61 74 65 64 0a 20 20 20 20   be updated.    
33ae0 2a 2a 20 20 20 20 20 20 28 69 6e 74 65 72 6e 61  **      (interna
33af0 6c 20 69 6e 74 6b 65 79 20 6e 6f 64 65 73 20 6e  l intkey nodes n
33b00 65 76 65 72 20 63 6f 6e 74 61 69 6e 20 70 6f 69  ever contain poi
33b10 6e 74 65 72 73 20 74 6f 20 6f 76 65 72 66 6c 6f  nters to overflo
33b20 77 20 70 61 67 65 73 29 2e 0a 20 20 20 20 2a 2a  w pages)..    **
33b30 0a 20 20 20 20 2a 2a 20 20 20 35 29 20 49 66 20  .    **   5) If 
33b40 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65  the sibling page
33b50 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73  s are not leaves
33b60 2c 20 74 68 65 6e 20 74 68 65 20 70 6f 69 6e 74  , then the point
33b70 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 20 20  er-map.    **   
33b80 20 20 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74     entries for t
33b90 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 70  he right-child p
33ba0 61 67 65 73 20 6f 66 20 65 61 63 68 20 73 69 62  ages of each sib
33bb0 6c 69 6e 67 20 6d 61 79 20 6e 65 65 64 0a 20 20  ling may need.  
33bc0 20 20 2a 2a 20 20 20 20 20 20 74 6f 20 62 65 20    **      to be 
33bd0 75 70 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 0a  updated..    **.
33be0 20 20 20 20 2a 2a 20 43 61 73 65 73 20 31 20 61      ** Cases 1 a
33bf0 6e 64 20 32 20 61 72 65 20 64 65 61 6c 74 20 77  nd 2 are dealt w
33c00 69 74 68 20 61 62 6f 76 65 20 62 79 20 6f 74 68  ith above by oth
33c10 65 72 20 63 6f 64 65 2e 20 54 68 65 20 6e 65 78  er code. The nex
33c20 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 64  t.    ** block d
33c30 65 61 6c 73 20 77 69 74 68 20 63 61 73 65 73 20  eals with cases 
33c40 33 20 61 6e 64 20 34 20 61 6e 64 20 74 68 65 20  3 and 4 and the 
33c50 6f 6e 65 20 61 66 74 65 72 20 74 68 61 74 2c 20  one after that, 
33c60 63 61 73 65 20 35 2e 20 53 69 6e 63 65 0a 20 20  case 5. Since.  
33c70 20 20 2a 2a 20 73 65 74 74 69 6e 67 20 61 20 70    ** setting a p
33c80 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79  ointer map entry
33c90 20 69 73 20 61 20 72 65 6c 61 74 69 76 65 6c 79   is a relatively
33ca0 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65 72 61   expensive opera
33cb0 74 69 6f 6e 2c 20 74 68 69 73 0a 20 20 20 20 2a  tion, this.    *
33cc0 2a 20 63 6f 64 65 20 6f 6e 6c 79 20 73 65 74 73  * code only sets
33cd0 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
33ce0 72 69 65 73 20 66 6f 72 20 63 68 69 6c 64 20 6f  ries for child o
33cf0 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  r overflow pages
33d00 20 74 68 61 74 20 68 61 76 65 0a 20 20 20 20 2a   that have.    *
33d10 2a 20 61 63 74 75 61 6c 6c 79 20 6d 6f 76 65 64  * actually moved
33d20 20 62 65 74 77 65 65 6e 20 70 61 67 65 73 2e 20   between pages. 
33d30 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   */.    MemPage 
33d40 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 30 5d  *pNew = apNew[0]
33d50 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
33d60 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 30 5d 3b  Old = apCopy[0];
33d70 0a 20 20 20 20 69 6e 74 20 6e 4f 76 65 72 66 6c  .    int nOverfl
33d80 6f 77 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72  ow = pOld->nOver
33d90 66 6c 6f 77 3b 0a 20 20 20 20 69 6e 74 20 69 4e  flow;.    int iN
33da0 65 78 74 4f 6c 64 20 3d 20 70 4f 6c 64 2d 3e 6e  extOld = pOld->n
33db0 43 65 6c 6c 20 2b 20 6e 4f 76 65 72 66 6c 6f 77  Cell + nOverflow
33dc0 3b 0a 20 20 20 20 69 6e 74 20 69 4f 76 65 72 66  ;.    int iOverf
33dd0 6c 6f 77 20 3d 20 28 6e 4f 76 65 72 66 6c 6f 77  low = (nOverflow
33de0 20 3f 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30   ? pOld->aOvfl[0
33df0 5d 2e 69 64 78 20 3a 20 2d 31 29 3b 0a 20 20 20  ].idx : -1);.   
33e00 20 6a 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20   j = 0;         
33e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33e20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 27      /* Current '
33e30 6f 6c 64 27 20 73 69 62 6c 69 6e 67 20 70 61 67  old' sibling pag
33e40 65 20 2a 2f 0a 20 20 20 20 6b 20 3d 20 30 3b 20  e */.    k = 0; 
33e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33e60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
33e70 75 72 72 65 6e 74 20 27 6e 65 77 27 20 73 69 62  urrent 'new' sib
33e80 6c 69 6e 67 20 70 61 67 65 20 2a 2f 0a 20 20 20  ling page */.   
33e90 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
33ea0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
33eb0 6e 74 20 69 73 44 69 76 69 64 65 72 20 3d 20 30  nt isDivider = 0
33ec0 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 69  ;.      while( i
33ed0 3d 3d 69 4e 65 78 74 4f 6c 64 20 29 7b 0a 20 20  ==iNextOld ){.  
33ee0 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c 20 69 20        /* Cell i 
33ef0 69 73 20 74 68 65 20 63 65 6c 6c 20 69 6d 6d 65  is the cell imme
33f00 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
33f10 67 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20  g the last cell 
33f20 6f 6e 20 6f 6c 64 0a 20 20 20 20 20 20 20 20 2a  on old.        *
33f30 2a 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 6a  * sibling page j
33f40 2e 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67  . If the sibling
33f50 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 66 20 70  s are not leaf p
33f60 61 67 65 73 20 6f 66 20 61 6e 0a 20 20 20 20 20  ages of an.     
33f70 20 20 20 2a 2a 20 69 6e 74 6b 65 79 20 62 2d 74     ** intkey b-t
33f80 72 65 65 2c 20 74 68 65 6e 20 63 65 6c 6c 20 69  ree, then cell i
33f90 20 77 61 73 20 61 20 64 69 76 69 64 65 72 20 63   was a divider c
33fa0 65 6c 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ell. */.        
33fb0 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 2b 2b  pOld = apCopy[++
33fc0 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 78  j];.        iNex
33fd0 74 4f 6c 64 20 3d 20 69 20 2b 20 21 6c 65 61 66  tOld = i + !leaf
33fe0 44 61 74 61 20 2b 20 70 4f 6c 64 2d 3e 6e 43 65  Data + pOld->nCe
33ff0 6c 6c 20 2b 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72  ll + pOld->nOver
34000 66 6c 6f 77 3b 0a 20 20 20 20 20 20 20 20 69 66  flow;.        if
34010 28 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f  ( pOld->nOverflo
34020 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  w ){.          n
34030 4f 76 65 72 66 6c 6f 77 20 3d 20 70 4f 6c 64 2d  Overflow = pOld-
34040 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20  >nOverflow;.    
34050 20 20 20 20 20 20 69 4f 76 65 72 66 6c 6f 77 20        iOverflow 
34060 3d 20 69 20 2b 20 21 6c 65 61 66 44 61 74 61 20  = i + !leafData 
34070 2b 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d  + pOld->aOvfl[0]
34080 2e 69 64 78 3b 0a 20 20 20 20 20 20 20 20 7d 0a  .idx;.        }.
34090 20 20 20 20 20 20 20 20 69 73 44 69 76 69 64 65          isDivide
340a0 72 20 3d 20 21 6c 65 61 66 44 61 74 61 3b 20 20  r = !leafData;  
340b0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
340c0 61 73 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77  assert(nOverflow
340d0 3e 30 20 7c 7c 20 69 4f 76 65 72 66 6c 6f 77 3c  >0 || iOverflow<
340e0 69 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  i );.      asser
340f0 74 28 6e 4f 76 65 72 66 6c 6f 77 3c 32 20 7c 7c  t(nOverflow<2 ||
34100 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e   pOld->aOvfl[0].
34110 69 64 78 3d 3d 70 4f 6c 64 2d 3e 61 4f 76 66 6c  idx==pOld->aOvfl
34120 5b 31 5d 2e 69 64 78 2d 31 29 3b 0a 20 20 20 20  [1].idx-1);.    
34130 20 20 61 73 73 65 72 74 28 6e 4f 76 65 72 66 6c    assert(nOverfl
34140 6f 77 3c 33 20 7c 7c 20 70 4f 6c 64 2d 3e 61 4f  ow<3 || pOld->aO
34150 76 66 6c 5b 31 5d 2e 69 64 78 3d 3d 70 4f 6c 64  vfl[1].idx==pOld
34160 2d 3e 61 4f 76 66 6c 5b 32 5d 2e 69 64 78 2d 31  ->aOvfl[2].idx-1
34170 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d  );.      if( i==
34180 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  iOverflow ){.   
34190 20 20 20 20 20 69 73 44 69 76 69 64 65 72 20 3d       isDivider =
341a0 20 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   1;.        if( 
341b0 28 2d 2d 6e 4f 76 65 72 66 6c 6f 77 29 3e 30 20  (--nOverflow)>0 
341c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 4f 76  ){.          iOv
341d0 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 20 20  erflow++;.      
341e0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
341f0 20 20 20 69 66 28 20 69 3d 3d 63 6e 74 4e 65 77     if( i==cntNew
34200 5b 6b 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  [k] ){.        /
34210 2a 20 43 65 6c 6c 20 69 20 69 73 20 74 68 65 20  * Cell i is the 
34220 63 65 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79  cell immediately
34230 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c   following the l
34240 61 73 74 20 63 65 6c 6c 20 6f 6e 20 6e 65 77 0a  ast cell on new.
34250 20 20 20 20 20 20 20 20 2a 2a 20 73 69 62 6c 69          ** sibli
34260 6e 67 20 70 61 67 65 20 6b 2e 20 49 66 20 74 68  ng page k. If th
34270 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e  e siblings are n
34280 6f 74 20 6c 65 61 66 20 70 61 67 65 73 20 6f 66  ot leaf pages of
34290 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69   an.        ** i
342a0 6e 74 6b 65 79 20 62 2d 74 72 65 65 2c 20 74 68  ntkey b-tree, th
342b0 65 6e 20 63 65 6c 6c 20 69 20 69 73 20 61 20 64  en cell i is a d
342c0 69 76 69 64 65 72 20 63 65 6c 6c 2e 20 20 2a 2f  ivider cell.  */
342d0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20  .        pNew = 
342e0 61 70 4e 65 77 5b 2b 2b 6b 5d 3b 0a 20 20 20 20  apNew[++k];.    
342f0 20 20 20 20 69 66 28 20 21 6c 65 61 66 44 61 74      if( !leafDat
34300 61 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  a ) continue;.  
34310 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
34320 72 74 28 20 6a 3c 6e 4f 6c 64 20 29 3b 0a 20 20  rt( j<nOld );.  
34330 20 20 20 20 61 73 73 65 72 74 28 20 6b 3c 6e 4e      assert( k<nN
34340 65 77 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ew );..      /* 
34350 49 66 20 74 68 65 20 63 65 6c 6c 20 77 61 73 20  If the cell was 
34360 6f 72 69 67 69 6e 61 6c 6c 79 20 64 69 76 69 64  originally divid
34370 65 72 20 63 65 6c 6c 20 28 61 6e 64 20 69 73 20  er cell (and is 
34380 6e 6f 74 20 6e 6f 77 29 20 6f 72 0a 20 20 20 20  not now) or.    
34390 20 20 2a 2a 20 61 6e 20 6f 76 65 72 66 6c 6f 77    ** an overflow
343a0 20 63 65 6c 6c 2c 20 6f 72 20 69 66 20 74 68 65   cell, or if the
343b0 20 63 65 6c 6c 20 77 61 73 20 6c 6f 63 61 74 65   cell was locate
343c0 64 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74  d on a different
343d0 20 73 69 62 6c 69 6e 67 0a 20 20 20 20 20 20 2a   sibling.      *
343e0 2a 20 70 61 67 65 20 62 65 66 6f 72 65 20 74 68  * page before th
343f0 65 20 62 61 6c 61 6e 63 69 6e 67 2c 20 74 68 65  e balancing, the
34400 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  n the pointer ma
34410 70 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69  p entries associ
34420 61 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 77 69  ated.      ** wi
34430 74 68 20 61 6e 79 20 63 68 69 6c 64 20 6f 72 20  th any child or 
34440 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 6e  overflow pages n
34450 65 65 64 20 74 6f 20 62 65 20 75 70 64 61 74 65  eed to be update
34460 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  d.  */.      if(
34470 20 69 73 44 69 76 69 64 65 72 20 7c 7c 20 70 4f   isDivider || pO
34480 6c 64 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e  ld->pgno!=pNew->
34490 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  pgno ){.        
344a0 69 66 28 20 21 6c 65 61 66 43 6f 72 72 65 63 74  if( !leafCorrect
344b0 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ion ){.         
344c0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
344d0 67 65 74 34 62 79 74 65 28 61 70 43 65 6c 6c 5b  get4byte(apCell[
344e0 69 5d 29 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  i]), PTRMAP_BTRE
344f0 45 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 26  E, pNew->pgno, &
34500 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  rc);.        }. 
34510 20 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c         if( szCel
34520 6c 5b 69 5d 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f  l[i]>pNew->minLo
34530 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  cal ){.         
34540 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
34550 72 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 69  r(pNew, apCell[i
34560 5d 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20  ], &rc);.       
34570 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
34580 0a 0a 20 20 20 20 69 66 28 20 21 6c 65 61 66 43  ..    if( !leafC
34590 6f 72 72 65 63 74 69 6f 6e 20 29 7b 0a 20 20 20  orrection ){.   
345a0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e     for(i=0; i<nN
345b0 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ew; i++){.      
345c0 20 20 75 33 32 20 6b 65 79 20 3d 20 67 65 74 34    u32 key = get4
345d0 62 79 74 65 28 26 61 70 4e 65 77 5b 69 5d 2d 3e  byte(&apNew[i]->
345e0 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20  aData[8]);.     
345f0 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
34600 2c 20 6b 65 79 2c 20 50 54 52 4d 41 50 5f 42 54  , key, PTRMAP_BT
34610 52 45 45 2c 20 61 70 4e 65 77 5b 69 5d 2d 3e 70  REE, apNew[i]->p
34620 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  gno, &rc);.     
34630 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 20 30 0a   }.    }..#if 0.
34640 20 20 20 20 2f 2a 20 54 68 65 20 70 74 72 6d 61      /* The ptrma
34650 70 43 68 65 63 6b 50 61 67 65 73 28 29 20 63 6f  pCheckPages() co
34660 6e 74 61 69 6e 73 20 61 73 73 65 72 74 28 29 20  ntains assert() 
34670 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20  statements that 
34680 76 65 72 69 66 79 20 74 68 61 74 0a 20 20 20 20  verify that.    
34690 2a 2a 20 61 6c 6c 20 70 6f 69 6e 74 65 72 20 6d  ** all pointer m
346a0 61 70 20 70 61 67 65 73 20 61 72 65 20 73 65 74  ap pages are set
346b0 20 63 6f 72 72 65 63 74 6c 79 2e 20 54 68 69 73   correctly. This
346c0 20 69 73 20 68 65 6c 70 66 75 6c 20 77 68 69 6c   is helpful whil
346d0 65 20 0a 20 20 20 20 2a 2a 20 64 65 62 75 67 67  e .    ** debugg
346e0 69 6e 67 2e 20 54 68 69 73 20 69 73 20 75 73 75  ing. This is usu
346f0 61 6c 6c 79 20 64 69 73 61 62 6c 65 64 20 62 65  ally disabled be
34700 63 61 75 73 65 20 61 20 63 6f 72 72 75 70 74 20  cause a corrupt 
34710 64 61 74 61 62 61 73 65 20 6d 61 79 0a 20 20 20  database may.   
34720 20 2a 2a 20 63 61 75 73 65 20 61 6e 20 61 73 73   ** cause an ass
34730 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20  ert() statement 
34740 74 6f 20 66 61 69 6c 2e 20 20 2a 2f 0a 20 20 20  to fail.  */.   
34750 20 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65   ptrmapCheckPage
34760 73 28 61 70 4e 65 77 2c 20 6e 4e 65 77 29 3b 0a  s(apNew, nNew);.
34770 20 20 20 20 70 74 72 6d 61 70 43 68 65 63 6b 50      ptrmapCheckP
34780 61 67 65 73 28 26 70 50 61 72 65 6e 74 2c 20 31  ages(&pParent, 1
34790 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20  );.#endif.  }.. 
347a0 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
347b0 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 54 52  ->isInit );.  TR
347c0 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 66  ACE(("BALANCE: f
347d0 69 6e 69 73 68 65 64 3a 20 6f 6c 64 3d 25 64 20  inished: old=%d 
347e0 6e 65 77 3d 25 64 20 63 65 6c 6c 73 3d 25 64 5c  new=%d cells=%d\
347f0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 6e 4f  n",.          nO
34800 6c 64 2c 20 6e 4e 65 77 2c 20 6e 43 65 6c 6c 29  ld, nNew, nCell)
34810 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c  );..  /*.  ** Cl
34820 65 61 6e 75 70 20 62 65 66 6f 72 65 20 72 65 74  eanup before ret
34830 75 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 62 61 6c  urning..  */.bal
34840 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3a 0a 20 20  ance_cleanup:.  
34850 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 46 72  sqlite3ScratchFr
34860 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20 66 6f  ee(apCell);.  fo
34870 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69  r(i=0; i<nOld; i
34880 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  ++){.    release
34890 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a  Page(apOld[i]);.
348a0 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
348b0 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nNew; i++){.   
348c0 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4e   releasePage(apN
348d0 65 77 5b 69 5d 29 3b 0a 20 20 7d 0a 0a 20 20 72  ew[i]);.  }..  r
348e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
348f0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
34900 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
34910 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   the root page o
34920 66 20 61 20 62 2d 74 72 65 65 20 73 74 72 75 63  f a b-tree struc
34930 74 75 72 65 20 69 73 0a 2a 2a 20 6f 76 65 72 66  ture is.** overf
34940 75 6c 6c 20 28 68 61 73 20 6f 6e 65 20 6f 72 20  ull (has one or 
34950 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  more overflow pa
34960 67 65 73 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65  ges)..**.** A ne
34970 77 20 63 68 69 6c 64 20 70 61 67 65 20 69 73 20  w child page is 
34980 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
34990 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
349a0 65 20 63 75 72 72 65 6e 74 20 72 6f 6f 74 0a 2a  e current root.*
349b0 2a 20 70 61 67 65 2c 20 69 6e 63 6c 75 64 69 6e  * page, includin
349c0 67 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  g overflow cells
349d0 2c 20 61 72 65 20 63 6f 70 69 65 64 20 69 6e 74  , are copied int
349e0 6f 20 74 68 65 20 63 68 69 6c 64 2e 20 54 68 65  o the child. The
349f0 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 69 73   root.** page is
34a00 20 74 68 65 6e 20 6f 76 65 72 77 72 69 74 74 65   then overwritte
34a10 6e 20 74 6f 20 6d 61 6b 65 20 69 74 20 61 6e 20  n to make it an 
34a20 65 6d 70 74 79 20 70 61 67 65 20 77 69 74 68 20  empty page with 
34a30 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
34a40 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  .** pointer poin
34a50 74 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 77 20  ting to the new 
34a60 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f  page..**.** Befo
34a70 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 61 6c  re returning, al
34a80 6c 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  l pointer-map en
34a90 74 72 69 65 73 20 63 6f 72 72 65 73 70 6f 6e 64  tries correspond
34aa0 69 6e 67 20 74 6f 20 70 61 67 65 73 20 0a 2a 2a  ing to pages .**
34ab0 20 74 68 61 74 20 74 68 65 20 6e 65 77 20 63 68   that the new ch
34ac0 69 6c 64 2d 70 61 67 65 20 6e 6f 77 20 63 6f 6e  ild-page now con
34ad0 74 61 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74  tains pointers t
34ae0 6f 20 61 72 65 20 75 70 64 61 74 65 64 2e 20 54  o are updated. T
34af0 68 65 0a 2a 2a 20 65 6e 74 72 79 20 63 6f 72 72  he.** entry corr
34b00 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
34b10 20 6e 65 77 20 72 69 67 68 74 2d 63 68 69 6c 64   new right-child
34b20 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20   pointer of the 
34b30 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 69 73 20  root.** page is 
34b40 61 6c 73 6f 20 75 70 64 61 74 65 64 2e 0a 2a 2a  also updated..**
34b50 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
34b60 6c 2c 20 2a 70 70 43 68 69 6c 64 20 69 73 20 73  l, *ppChild is s
34b70 65 74 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 20  et to contain a 
34b80 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
34b90 20 63 68 69 6c 64 20 0a 2a 2a 20 70 61 67 65 20   child .** page 
34ba0 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  and SQLITE_OK is
34bb0 20 72 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68   returned. In th
34bc0 69 73 20 63 61 73 65 20 74 68 65 20 63 61 6c 6c  is case the call
34bd0 65 72 20 69 73 20 72 65 71 75 69 72 65 64 0a 2a  er is required.*
34be0 2a 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73  * to call releas
34bf0 65 50 61 67 65 28 29 20 6f 6e 20 2a 70 70 43 68  ePage() on *ppCh
34c00 69 6c 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65  ild exactly once
34c10 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
34c20 63 75 72 73 2c 0a 2a 2a 20 61 6e 20 65 72 72 6f  curs,.** an erro
34c30 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
34c40 65 64 20 61 6e 64 20 2a 70 70 43 68 69 6c 64 20  ed and *ppChild 
34c50 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a  is set to 0..*/.
34c60 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e  static int balan
34c70 63 65 5f 64 65 65 70 65 72 28 4d 65 6d 50 61 67  ce_deeper(MemPag
34c80 65 20 2a 70 52 6f 6f 74 2c 20 4d 65 6d 50 61 67  e *pRoot, MemPag
34c90 65 20 2a 2a 70 70 43 68 69 6c 64 29 7b 0a 20 20  e **ppChild){.  
34ca0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
34cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
34cc0 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 66  * Return value f
34cd0 72 6f 6d 20 73 75 62 70 72 6f 63 65 64 75 72 65  rom subprocedure
34ce0 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  s */.  MemPage *
34cf0 70 43 68 69 6c 64 20 3d 20 30 3b 20 20 20 20 20  pChild = 0;     
34d00 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
34d10 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20   to a new child 
34d20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  page */.  Pgno p
34d30 67 6e 6f 43 68 69 6c 64 20 3d 20 30 3b 20 20 20  gnoChild = 0;   
34d40 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
34d50 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
34d60 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f  ew child page */
34d70 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
34d80 20 3d 20 70 52 6f 6f 74 2d 3e 70 42 74 3b 20 20   = pRoot->pBt;  
34d90 20 20 2f 2a 20 54 68 65 20 42 54 72 65 65 20 2a    /* The BTree *
34da0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f  /..  assert( pRo
34db0 6f 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20  ot->nOverflow>0 
34dc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
34dd0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
34de0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  pBt->mutex) );..
34df0 20 20 2f 2a 20 4d 61 6b 65 20 70 52 6f 6f 74 2c    /* Make pRoot,
34e00 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   the root page o
34e10 66 20 74 68 65 20 62 2d 74 72 65 65 2c 20 77 72  f the b-tree, wr
34e20 69 74 61 62 6c 65 2e 20 41 6c 6c 6f 63 61 74 65  itable. Allocate
34e30 20 61 20 6e 65 77 20 0a 20 20 2a 2a 20 70 61 67   a new .  ** pag
34e40 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f  e that will beco
34e50 6d 65 20 74 68 65 20 6e 65 77 20 72 69 67 68 74  me the new right
34e60 2d 63 68 69 6c 64 20 6f 66 20 70 50 61 67 65 2e  -child of pPage.
34e70 20 43 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e   Copy the conten
34e80 74 73 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6e  ts.  ** of the n
34e90 6f 64 65 20 73 74 6f 72 65 64 20 6f 6e 20 70 52  ode stored on pR
34ea0 6f 6f 74 20 69 6e 74 6f 20 74 68 65 20 6e 65 77  oot into the new
34eb0 20 63 68 69 6c 64 20 70 61 67 65 2e 0a 20 20 2a   child page..  *
34ec0 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
34ed0 50 61 67 65 72 57 72 69 74 65 28 70 52 6f 6f 74  PagerWrite(pRoot
34ee0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  ->pDbPage);.  if
34ef0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
34f00 29 7b 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f  ){.    rc = allo
34f10 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
34f20 74 2c 26 70 43 68 69 6c 64 2c 26 70 67 6e 6f 43  t,&pChild,&pgnoC
34f30 68 69 6c 64 2c 70 52 6f 6f 74 2d 3e 70 67 6e 6f  hild,pRoot->pgno
34f40 2c 30 29 3b 0a 20 20 20 20 63 6f 70 79 4e 6f 64  ,0);.    copyNod
34f50 65 43 6f 6e 74 65 6e 74 28 70 52 6f 6f 74 2c 20  eContent(pRoot, 
34f60 70 43 68 69 6c 64 2c 20 26 72 63 29 3b 0a 20 20  pChild, &rc);.  
34f70 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
34f80 55 4d 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d  UM ){.      ptrm
34f90 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 43  apPut(pBt, pgnoC
34fa0 68 69 6c 64 2c 20 50 54 52 4d 41 50 5f 42 54 52  hild, PTRMAP_BTR
34fb0 45 45 2c 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 2c  EE, pRoot->pgno,
34fc0 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   &rc);.    }.  }
34fd0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
34fe0 20 2a 70 70 43 68 69 6c 64 20 3d 20 30 3b 0a 20   *ppChild = 0;. 
34ff0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
35000 43 68 69 6c 64 29 3b 0a 20 20 20 20 72 65 74 75  Child);.    retu
35010 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
35020 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
35030 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 43 68  rIswriteable(pCh
35040 69 6c 64 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ild->pDbPage) );
35050 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
35060 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
35070 6c 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67  le(pRoot->pDbPag
35080 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
35090 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d 70  pChild->nCell==p
350a0 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a  Root->nCell );..
350b0 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
350c0 45 3a 20 63 6f 70 79 20 72 6f 6f 74 20 25 64 20  E: copy root %d 
350d0 69 6e 74 6f 20 25 64 5c 6e 22 2c 20 70 52 6f 6f  into %d\n", pRoo
350e0 74 2d 3e 70 67 6e 6f 2c 20 70 43 68 69 6c 64 2d  t->pgno, pChild-
350f0 3e 70 67 6e 6f 29 29 3b 0a 0a 20 20 2f 2a 20 43  >pgno));..  /* C
35100 6f 70 79 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  opy the overflow
35110 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70 52 6f 6f   cells from pRoo
35120 74 20 74 6f 20 70 43 68 69 6c 64 20 2a 2f 0a 20  t to pChild */. 
35130 20 6d 65 6d 63 70 79 28 70 43 68 69 6c 64 2d 3e   memcpy(pChild->
35140 61 4f 76 66 6c 2c 20 70 52 6f 6f 74 2d 3e 61 4f  aOvfl, pRoot->aO
35150 76 66 6c 2c 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65  vfl, pRoot->nOve
35160 72 66 6c 6f 77 2a 73 69 7a 65 6f 66 28 70 52 6f  rflow*sizeof(pRo
35170 6f 74 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29 3b 0a  ot->aOvfl[0]));.
35180 20 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66    pChild->nOverf
35190 6c 6f 77 20 3d 20 70 52 6f 6f 74 2d 3e 6e 4f 76  low = pRoot->nOv
351a0 65 72 66 6c 6f 77 3b 0a 0a 20 20 2f 2a 20 5a 65  erflow;..  /* Ze
351b0 72 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ro the contents 
351c0 6f 66 20 70 52 6f 6f 74 2e 20 54 68 65 6e 20 69  of pRoot. Then i
351d0 6e 73 74 61 6c 6c 20 70 43 68 69 6c 64 20 61 73  nstall pChild as
351e0 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
351f0 2e 20 2a 2f 0a 20 20 7a 65 72 6f 50 61 67 65 28  . */.  zeroPage(
35200 70 52 6f 6f 74 2c 20 70 43 68 69 6c 64 2d 3e 61  pRoot, pChild->a
35210 44 61 74 61 5b 30 5d 20 26 20 7e 50 54 46 5f 4c  Data[0] & ~PTF_L
35220 45 41 46 29 3b 0a 20 20 70 75 74 34 62 79 74 65  EAF);.  put4byte
35230 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70  (&pRoot->aData[p
35240 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Root->hdrOffset+
35250 38 5d 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a  8], pgnoChild);.
35260 0a 20 20 2a 70 70 43 68 69 6c 64 20 3d 20 70 43  .  *ppChild = pC
35270 68 69 6c 64 3b 0a 20 20 72 65 74 75 72 6e 20 53  hild;.  return S
35280 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
35290 2a 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74  ** The page that
352a0 20 70 43 75 72 20 63 75 72 72 65 6e 74 6c 79 20   pCur currently 
352b0 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20 6a 75  points to has ju
352c0 73 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  st been modified
352d0 20 69 6e 0a 2a 2a 20 73 6f 6d 65 20 77 61 79 2e   in.** some way.
352e0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66   This function f
352f0 69 67 75 72 65 73 20 6f 75 74 20 69 66 20 74 68  igures out if th
35300 69 73 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20  is modification 
35310 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20 74 72 65  means the.** tre
35320 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 62 61  e needs to be ba
35330 6c 61 6e 63 65 64 2c 20 61 6e 64 20 69 66 20 73  lanced, and if s
35340 6f 20 63 61 6c 6c 73 20 74 68 65 20 61 70 70 72  o calls the appr
35350 6f 70 72 69 61 74 65 20 62 61 6c 61 6e 63 69 6e  opriate balancin
35360 67 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e 20 42  g .** routine. B
35370 61 6c 61 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65  alancing routine
35380 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 62  s are:.**.**   b
35390 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 0a 2a  alance_quick().*
353a0 2a 20 20 20 62 61 6c 61 6e 63 65 5f 64 65 65 70  *   balance_deep
353b0 65 72 28 29 0a 2a 2a 20 20 20 62 61 6c 61 6e 63  er().**   balanc
353c0 65 5f 6e 6f 6e 72 6f 6f 74 28 29 0a 2a 2f 0a 73  e_nonroot().*/.s
353d0 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
353e0 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
353f0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
35400 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 6f 6e 73 74  LITE_OK;.  const
35410 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 70 43 75 72   int nMin = pCur
35420 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
35430 65 20 2a 20 32 20 2f 20 33 3b 0a 20 20 75 38 20  e * 2 / 3;.  u8 
35440 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61  aBalanceQuickSpa
35450 63 65 5b 31 33 5d 3b 0a 20 20 75 38 20 2a 70 46  ce[13];.  u8 *pF
35460 72 65 65 20 3d 20 30 3b 0a 0a 20 20 54 45 53 54  ree = 0;..  TEST
35470 4f 4e 4c 59 28 20 69 6e 74 20 62 61 6c 61 6e 63  ONLY( int balanc
35480 65 5f 71 75 69 63 6b 5f 63 61 6c 6c 65 64 20 3d  e_quick_called =
35490 20 30 20 29 3b 0a 20 20 54 45 53 54 4f 4e 4c 59   0 );.  TESTONLY
354a0 28 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65  ( int balance_de
354b0 65 70 65 72 5f 63 61 6c 6c 65 64 20 3d 20 30 20  eper_called = 0 
354c0 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 69  );..  do {.    i
354d0 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d  nt iPage = pCur-
354e0 3e 69 50 61 67 65 3b 0a 20 20 20 20 4d 65 6d 50  >iPage;.    MemP
354f0 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75  age *pPage = pCu
35500 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d  r->apPage[iPage]
35510 3b 0a 0a 20 20 20 20 69 66 28 20 69 50 61 67 65  ;..    if( iPage
35520 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
35530 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
35540 77 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  w ){.        /* 
35550 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  The root page of
35560 20 74 68 65 20 62 2d 74 72 65 65 20 69 73 20 6f   the b-tree is o
35570 76 65 72 66 75 6c 6c 2e 20 49 6e 20 74 68 69 73  verfull. In this
35580 20 63 61 73 65 20 63 61 6c 6c 20 74 68 65 0a 20   case call the. 
35590 20 20 20 20 20 20 20 2a 2a 20 62 61 6c 61 6e 63         ** balanc
355a0 65 5f 64 65 65 70 65 72 28 29 20 66 75 6e 63 74  e_deeper() funct
355b0 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61 20  ion to create a 
355c0 6e 65 77 20 63 68 69 6c 64 20 66 6f 72 20 74 68  new child for th
355d0 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20  e root-page.    
355e0 20 20 20 20 2a 2a 20 61 6e 64 20 63 6f 70 79 20      ** and copy 
355f0 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74  the current cont
35600 65 6e 74 73 20 6f 66 20 74 68 65 20 72 6f 6f 74  ents of the root
35610 2d 70 61 67 65 20 74 6f 20 69 74 2e 20 54 68 65  -page to it. The
35620 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 78 74  .        ** next
35630 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
35640 65 20 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20 62  e do-loop will b
35650 61 6c 61 6e 63 65 20 74 68 65 20 63 68 69 6c 64  alance the child
35660 20 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a   page..        *
35670 2f 20 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  / .        asser
35680 74 28 20 28 62 61 6c 61 6e 63 65 5f 64 65 65 70  t( (balance_deep
35690 65 72 5f 63 61 6c 6c 65 64 2b 2b 29 3d 3d 30 20  er_called++)==0 
356a0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
356b0 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 70  balance_deeper(p
356c0 50 61 67 65 2c 20 26 70 43 75 72 2d 3e 61 70 50  Page, &pCur->apP
356d0 61 67 65 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20  age[1]);.       
356e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
356f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
35700 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 31 3b  pCur->iPage = 1;
35710 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
35720 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20  >aiIdx[0] = 0;. 
35730 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61           pCur->a
35740 69 49 64 78 5b 31 5d 20 3d 20 30 3b 0a 20 20 20  iIdx[1] = 0;.   
35750 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
35760 43 75 72 2d 3e 61 70 50 61 67 65 5b 31 5d 2d 3e  Cur->apPage[1]->
35770 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 20  nOverflow );.   
35780 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
35790 73 65 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61  se{.        brea
357a0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
357b0 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 2d 3e  else if( pPage->
357c0 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 26 26 20  nOverflow==0 && 
357d0 70 50 61 67 65 2d 3e 6e 46 72 65 65 3c 3d 6e 4d  pPage->nFree<=nM
357e0 69 6e 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61  in ){.      brea
357f0 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  k;.    }else{.  
35800 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 20 63 6f      MemPage * co
35810 6e 73 74 20 70 50 61 72 65 6e 74 20 3d 20 70 43  nst pParent = pC
35820 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65  ur->apPage[iPage
35830 2d 31 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 63  -1];.      int c
35840 6f 6e 73 74 20 69 49 64 78 20 3d 20 70 43 75 72  onst iIdx = pCur
35850 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 2d 31 5d  ->aiIdx[iPage-1]
35860 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ;..      rc = sq
35870 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
35880 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65  pParent->pDbPage
35890 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
358a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69  =SQLITE_OK ){.#i
358b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
358c0 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 20  T_QUICKBALANCE. 
358d0 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
358e0 2d 3e 68 61 73 44 61 74 61 0a 20 20 20 20 20 20  ->hasData.      
358f0 20 20 20 26 26 20 70 50 61 67 65 2d 3e 6e 4f 76     && pPage->nOv
35900 65 72 66 6c 6f 77 3d 3d 31 0a 20 20 20 20 20 20  erflow==1.      
35910 20 20 20 26 26 20 70 50 61 67 65 2d 3e 61 4f 76     && pPage->aOv
35920 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70 50 61 67 65  fl[0].idx==pPage
35930 2d 3e 6e 43 65 6c 6c 0a 20 20 20 20 20 20 20 20  ->nCell.        
35940 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e   && pParent->pgn
35950 6f 21 3d 31 0a 20 20 20 20 20 20 20 20 20 26 26  o!=1.         &&
35960 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d   pParent->nCell=
35970 3d 69 49 64 78 0a 20 20 20 20 20 20 20 20 29 7b  =iIdx.        ){
35980 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61  .          /* Ca
35990 6c 6c 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b  ll balance_quick
359a0 28 29 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  () to create a n
359b0 65 77 20 73 69 62 6c 69 6e 67 20 6f 66 20 70 50  ew sibling of pP
359c0 61 67 65 20 6f 6e 20 77 68 69 63 68 0a 20 20 20  age on which.   
359d0 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 73 74 6f         ** to sto
359e0 72 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  re the overflow 
359f0 63 65 6c 6c 2e 20 62 61 6c 61 6e 63 65 5f 71 75  cell. balance_qu
35a00 69 63 6b 28 29 20 69 6e 73 65 72 74 73 20 61 20  ick() inserts a 
35a10 6e 65 77 20 63 65 6c 6c 0a 20 20 20 20 20 20 20  new cell.       
35a20 20 20 20 2a 2a 20 69 6e 74 6f 20 70 50 61 72 65     ** into pPare
35a30 6e 74 2c 20 77 68 69 63 68 20 6d 61 79 20 63 61  nt, which may ca
35a40 75 73 65 20 70 50 61 72 65 6e 74 20 6f 76 65 72  use pParent over
35a50 66 6c 6f 77 2e 20 49 66 20 74 68 69 73 0a 20 20  flow. If this.  
35a60 20 20 20 20 20 20 20 20 2a 2a 20 68 61 70 70 65          ** happe
35a70 6e 73 2c 20 74 68 65 20 6e 65 78 74 20 69 6e 74  ns, the next int
35a80 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  eration of the d
35a90 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20 62 61 6c 61  o-loop will bala
35aa0 6e 63 65 20 70 50 61 72 65 6e 74 20 0a 20 20 20  nce pParent .   
35ab0 20 20 20 20 20 20 20 2a 2a 20 75 73 65 20 65 69         ** use ei
35ac0 74 68 65 72 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e  ther balance_non
35ad0 72 6f 6f 74 28 29 20 6f 72 20 62 61 6c 61 6e 63  root() or balanc
35ae0 65 5f 64 65 65 70 65 72 28 29 2e 20 55 6e 74 69  e_deeper(). Unti
35af0 6c 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20  l this.         
35b00 20 2a 2a 20 68 61 70 70 65 6e 73 2c 20 74 68 65   ** happens, the
35b10 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 69   overflow cell i
35b20 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  s stored in the 
35b30 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61  aBalanceQuickSpa
35b40 63 65 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a  ce[].          *
35b50 2a 20 62 75 66 66 65 72 2e 20 0a 20 20 20 20 20  * buffer. .     
35b60 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
35b70 20 20 2a 2a 20 54 68 65 20 70 75 72 70 6f 73 65    ** The purpose
35b80 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
35b90 67 20 61 73 73 65 72 74 28 29 20 69 73 20 74 6f  g assert() is to
35ba0 20 63 68 65 63 6b 20 74 68 61 74 20 6f 6e 6c 79   check that only
35bb0 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20   a.          ** 
35bc0 73 69 6e 67 6c 65 20 63 61 6c 6c 20 74 6f 20 62  single call to b
35bd0 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 69  alance_quick() i
35be0 73 20 6d 61 64 65 20 66 6f 72 20 65 61 63 68 20  s made for each 
35bf0 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a 20 20 20  call to this.   
35c00 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69         ** functi
35c10 6f 6e 2e 20 49 66 20 74 68 69 73 20 77 65 72 65  on. If this were
35c20 20 6e 6f 74 20 76 65 72 69 66 69 65 64 2c 20 61   not verified, a
35c30 20 73 75 62 74 6c 65 20 62 75 67 20 69 6e 76 6f   subtle bug invo
35c40 6c 76 69 6e 67 20 72 65 75 73 65 0a 20 20 20 20  lving reuse.    
35c50 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
35c60 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61  aBalanceQuickSpa
35c70 63 65 5b 5d 20 6d 69 67 68 74 20 73 6e 65 61 6b  ce[] might sneak
35c80 20 69 6e 2e 0a 20 20 20 20 20 20 20 20 20 20 2a   in..          *
35c90 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
35ca0 72 74 28 20 28 62 61 6c 61 6e 63 65 5f 71 75 69  rt( (balance_qui
35cb0 63 6b 5f 63 61 6c 6c 65 64 2b 2b 29 3d 3d 30 20  ck_called++)==0 
35cc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
35cd0 3d 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28  = balance_quick(
35ce0 70 50 61 72 65 6e 74 2c 20 70 50 61 67 65 2c 20  pParent, pPage, 
35cf0 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61  aBalanceQuickSpa
35d00 63 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ce);.        }el
35d10 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  se.#endif.      
35d20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a    {.          /*
35d30 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 63   In this case, c
35d40 61 6c 6c 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72  all balance_nonr
35d50 6f 6f 74 28 29 20 74 6f 20 72 65 64 69 73 74 72  oot() to redistr
35d60 69 62 75 74 65 20 63 65 6c 6c 73 0a 20 20 20 20  ibute cells.    
35d70 20 20 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e        ** between
35d80 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f   pPage and up to
35d90 20 32 20 6f 66 20 69 74 73 20 73 69 62 6c 69 6e   2 of its siblin
35da0 67 20 70 61 67 65 73 2e 20 54 68 69 73 20 69 6e  g pages. This in
35db0 76 6f 6c 76 65 73 0a 20 20 20 20 20 20 20 20 20  volves.         
35dc0 20 2a 2a 20 6d 6f 64 69 66 79 69 6e 67 20 74 68   ** modifying th
35dd0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 50  e contents of pP
35de0 61 72 65 6e 74 2c 20 77 68 69 63 68 20 6d 61 79  arent, which may
35df0 20 63 61 75 73 65 20 70 50 61 72 65 6e 74 20 74   cause pParent t
35e00 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  o.          ** b
35e10 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f  ecome overfull o
35e20 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20 54 68 65  r underfull. The
35e30 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20   next iteration 
35e40 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 0a 20  of the do-loop. 
35e50 20 20 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c           ** will
35e60 20 62 61 6c 61 6e 63 65 20 74 68 65 20 70 61 72   balance the par
35e70 65 6e 74 20 70 61 67 65 20 74 6f 20 63 6f 72 72  ent page to corr
35e80 65 63 74 20 74 68 69 73 2e 0a 20 20 20 20 20 20  ect this..      
35e90 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 20      ** .        
35ea0 20 20 2a 2a 20 49 66 20 74 68 65 20 70 61 72 65    ** If the pare
35eb0 6e 74 20 70 61 67 65 20 62 65 63 6f 6d 65 73 20  nt page becomes 
35ec0 6f 76 65 72 66 75 6c 6c 2c 20 74 68 65 20 6f 76  overfull, the ov
35ed0 65 72 66 6c 6f 77 20 63 65 6c 6c 20 6f 72 20 63  erflow cell or c
35ee0 65 6c 6c 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ells.          *
35ef0 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20  * are stored in 
35f00 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65  the pSpace buffe
35f10 72 20 61 6c 6c 6f 63 61 74 65 64 20 69 6d 6d 65  r allocated imme
35f20 64 69 61 74 65 6c 79 20 62 65 6c 6f 77 2e 20 0a  diately below. .
35f30 20 20 20 20 20 20 20 20 20 20 2a 2a 20 41 20 73            ** A s
35f40 75 62 73 65 71 75 65 6e 74 20 69 74 65 72 61 74  ubsequent iterat
35f50 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f  ion of the do-lo
35f60 6f 70 20 77 69 6c 6c 20 64 65 61 6c 20 77 69 74  op will deal wit
35f70 68 20 74 68 69 73 20 62 79 0a 20 20 20 20 20 20  h this by.      
35f80 20 20 20 20 2a 2a 20 63 61 6c 6c 69 6e 67 20 62      ** calling b
35f90 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29  alance_nonroot()
35fa0 20 28 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72   (balance_deeper
35fb0 28 29 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64  () may be called
35fc0 20 66 69 72 73 74 2c 0a 20 20 20 20 20 20 20 20   first,.        
35fd0 20 20 2a 2a 20 62 75 74 20 69 74 20 64 6f 65 73    ** but it does
35fe0 6e 27 74 20 64 65 61 6c 20 77 69 74 68 20 6f 76  n't deal with ov
35ff0 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 2d 20 6a  erflow cells - j
36000 75 73 74 20 6d 6f 76 65 73 20 74 68 65 6d 20 74  ust moves them t
36010 6f 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  o a.          **
36020 20 64 69 66 66 65 72 65 6e 74 20 70 61 67 65 29   different page)
36030 2e 20 4f 6e 63 65 20 74 68 69 73 20 73 75 62 73  . Once this subs
36040 65 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f 20 62  equent call to b
36050 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29  alance_nonroot()
36060 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68   .          ** h
36070 61 73 20 63 6f 6d 70 6c 65 74 65 64 2c 20 69 74  as completed, it
36080 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 6c 65   is safe to rele
36090 61 73 65 20 74 68 65 20 70 53 70 61 63 65 20 62  ase the pSpace b
360a0 75 66 66 65 72 20 75 73 65 64 20 62 79 0a 20 20  uffer used by.  
360b0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70          ** the p
360c0 72 65 76 69 6f 75 73 20 63 61 6c 6c 2c 20 61 73  revious call, as
360d0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65   the overflow ce
360e0 6c 6c 20 64 61 74 61 20 77 69 6c 6c 20 68 61 76  ll data will hav
360f0 65 20 62 65 65 6e 20 0a 20 20 20 20 20 20 20 20  e been .        
36100 20 20 2a 2a 20 63 6f 70 69 65 64 20 65 69 74 68    ** copied eith
36110 65 72 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79  er into the body
36120 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 70   of a database p
36130 61 67 65 20 6f 72 20 69 6e 74 6f 20 74 68 65 20  age or into the 
36140 6e 65 77 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  new.          **
36150 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20 70   pSpace buffer p
36160 61 73 73 65 64 20 74 6f 20 74 68 65 20 6c 61 74  assed to the lat
36170 74 65 72 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61  ter call to bala
36180 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 2e 0a 20  nce_nonroot().. 
36190 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
361a0 20 20 20 20 20 20 75 38 20 2a 70 53 70 61 63 65        u8 *pSpace
361b0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61   = sqlite3PageMa
361c0 6c 6c 6f 63 28 70 43 75 72 2d 3e 70 42 74 2d 3e  lloc(pCur->pBt->
361d0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
361e0 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63       rc = balanc
361f0 65 5f 6e 6f 6e 72 6f 6f 74 28 70 50 61 72 65 6e  e_nonroot(pParen
36200 74 2c 20 69 49 64 78 2c 20 70 53 70 61 63 65 2c  t, iIdx, pSpace,
36210 20 69 50 61 67 65 3d 3d 31 29 3b 0a 20 20 20 20   iPage==1);.    
36220 20 20 20 20 20 20 69 66 28 20 70 46 72 65 65 20        if( pFree 
36230 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
36240 2a 20 49 66 20 70 46 72 65 65 20 69 73 20 6e 6f  * If pFree is no
36250 74 20 4e 55 4c 4c 2c 20 69 74 20 70 6f 69 6e 74  t NULL, it point
36260 73 20 74 6f 20 74 68 65 20 70 53 70 61 63 65 20  s to the pSpace 
36270 62 75 66 66 65 72 20 75 73 65 64 20 0a 20 20 20  buffer used .   
36280 20 20 20 20 20 20 20 20 20 2a 2a 20 62 79 20 61           ** by a
36290 20 70 72 65 76 69 6f 75 73 20 63 61 6c 6c 20 74   previous call t
362a0 6f 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f  o balance_nonroo
362b0 74 28 29 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74  t(). Its content
362c0 73 20 61 72 65 0a 20 20 20 20 20 20 20 20 20 20  s are.          
362d0 20 20 2a 2a 20 6e 6f 77 20 73 74 6f 72 65 64 20    ** now stored 
362e0 65 69 74 68 65 72 20 6f 6e 20 72 65 61 6c 20 64  either on real d
362f0 61 74 61 62 61 73 65 20 70 61 67 65 73 20 6f 72  atabase pages or
36300 20 77 69 74 68 69 6e 20 74 68 65 20 0a 20 20 20   within the .   
36310 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 77 20           ** new 
36320 70 53 70 61 63 65 20 62 75 66 66 65 72 2c 20 73  pSpace buffer, s
36330 6f 20 69 74 20 6d 61 79 20 62 65 20 73 61 66 65  o it may be safe
36340 6c 79 20 66 72 65 65 64 20 68 65 72 65 2e 20 2a  ly freed here. *
36350 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  /.            sq
36360 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70 46  lite3PageFree(pF
36370 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ree);.          
36380 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  }..          /* 
36390 54 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65  The pSpace buffe
363a0 72 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20  r will be freed 
363b0 61 66 74 65 72 20 74 68 65 20 6e 65 78 74 20 63  after the next c
363c0 61 6c 6c 20 74 6f 0a 20 20 20 20 20 20 20 20 20  all to.         
363d0 20 2a 2a 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72   ** balance_nonr
363e0 6f 6f 74 28 29 2c 20 6f 72 20 6a 75 73 74 20 62  oot(), or just b
363f0 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74  efore this funct
36400 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 77 68 69  ion returns, whi
36410 63 68 65 76 65 72 0a 20 20 20 20 20 20 20 20 20  chever.         
36420 20 2a 2a 20 63 6f 6d 65 73 20 66 69 72 73 74 2e   ** comes first.
36430 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 46   */.          pF
36440 72 65 65 20 3d 20 70 53 70 61 63 65 3b 0a 20 20  ree = pSpace;.  
36450 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
36460 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f  .      pPage->nO
36470 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20  verflow = 0;..  
36480 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20      /* The next 
36490 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
364a0 20 64 6f 2d 6c 6f 6f 70 20 62 61 6c 61 6e 63 65   do-loop balance
364b0 73 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  s the parent pag
364c0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65  e. */.      rele
364d0 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
364e0 20 20 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67        pCur->iPag
364f0 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68  e--;.    }.  }wh
36500 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
36510 4f 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70 46 72  OK );..  if( pFr
36520 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ee ){.    sqlite
36530 33 50 61 67 65 46 72 65 65 28 70 46 72 65 65 29  3PageFree(pFree)
36540 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
36550 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73  c;.}.../*.** Ins
36560 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64  ert a new record
36570 20 69 6e 74 6f 20 74 68 65 20 42 54 72 65 65 2e   into the BTree.
36580 20 20 54 68 65 20 6b 65 79 20 69 73 20 67 69 76    The key is giv
36590 65 6e 20 62 79 20 28 70 4b 65 79 2c 6e 4b 65 79  en by (pKey,nKey
365a0 29 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74  ).** and the dat
365b0 61 20 69 73 20 67 69 76 65 6e 20 62 79 20 28 70  a is given by (p
365c0 44 61 74 61 2c 6e 44 61 74 61 29 2e 20 20 54 68  Data,nData).  Th
365d0 65 20 63 75 72 73 6f 72 20 69 73 20 75 73 65 64  e cursor is used
365e0 20 6f 6e 6c 79 20 74 6f 0a 2a 2a 20 64 65 66 69   only to.** defi
365f0 6e 65 20 77 68 61 74 20 74 61 62 6c 65 20 74 68  ne what table th
36600 65 20 72 65 63 6f 72 64 20 73 68 6f 75 6c 64 20  e record should 
36610 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  be inserted into
36620 2e 20 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a  .  The cursor.**
36630 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
36640 67 20 61 74 20 61 20 72 61 6e 64 6f 6d 20 6c 6f  g at a random lo
36650 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f  cation..**.** Fo
36660 72 20 61 6e 20 49 4e 54 4b 45 59 20 74 61 62 6c  r an INTKEY tabl
36670 65 2c 20 6f 6e 6c 79 20 74 68 65 20 6e 4b 65 79  e, only the nKey
36680 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6b 65   value of the ke
36690 79 20 69 73 20 75 73 65 64 2e 20 20 70 4b 65 79  y is used.  pKey
366a0 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20   is.** ignored. 
366b0 20 46 6f 72 20 61 20 5a 45 52 4f 44 41 54 41 20   For a ZERODATA 
366c0 74 61 62 6c 65 2c 20 74 68 65 20 70 44 61 74 61  table, the pData
366d0 20 61 6e 64 20 6e 44 61 74 61 20 61 72 65 20 62   and nData are b
366e0 6f 74 68 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a  oth ignored..**.
366f0 2a 2a 20 49 66 20 74 68 65 20 73 65 65 6b 52 65  ** If the seekRe
36700 73 75 6c 74 20 70 61 72 61 6d 65 74 65 72 20 69  sult parameter i
36710 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
36720 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 63 61   a successful ca
36730 6c 6c 20 74 6f 0a 2a 2a 20 4d 6f 76 65 74 6f 55  ll to.** MovetoU
36740 6e 70 61 63 6b 65 64 28 29 20 74 6f 20 73 65 65  npacked() to see
36750 6b 20 63 75 72 73 6f 72 20 70 43 75 72 20 74 6f  k cursor pCur to
36760 20 28 70 4b 65 79 2c 20 6e 4b 65 79 29 20 68 61   (pKey, nKey) ha
36770 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65  s already.** bee
36780 6e 20 70 65 72 66 6f 72 6d 65 64 2e 20 73 65 65  n performed. see
36790 6b 52 65 73 75 6c 74 20 69 73 20 74 68 65 20 73  kResult is the s
367a0 65 61 72 63 68 20 72 65 73 75 6c 74 20 72 65 74  earch result ret
367b0 75 72 6e 65 64 20 28 61 20 6e 65 67 61 74 69 76  urned (a negativ
367c0 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 69 66 20 70  e.** number if p
367d0 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e  Cur points at an
367e0 20 65 6e 74 72 79 20 74 68 61 74 20 69 73 20 73   entry that is s
367f0 6d 61 6c 6c 65 72 20 74 68 61 6e 20 28 70 4b 65  maller than (pKe
36800 79 2c 20 6e 4b 65 79 29 2c 20 6f 72 0a 2a 2a 20  y, nKey), or.** 
36810 61 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65  a positive value
36820 20 69 66 20 70 43 75 72 20 70 6f 69 6e 74 73 20   if pCur points 
36830 61 74 20 61 6e 20 65 74 72 79 20 74 68 61 74 20  at an etry that 
36840 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 0a  is larger than .
36850 2a 2a 20 28 70 4b 65 79 2c 20 6e 4b 65 79 29 29  ** (pKey, nKey))
36860 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
36870 73 65 65 6b 52 65 73 75 6c 74 20 70 61 72 61 6d  seekResult param
36880 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  eter is non-zero
36890 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65  , then the calle
368a0 72 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61  r guarantees tha
368b0 74 0a 2a 2a 20 63 75 72 73 6f 72 20 70 43 75 72  t.** cursor pCur
368c0 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 61 74 20   is pointing at 
368d0 74 68 65 20 65 78 69 73 74 69 6e 67 20 63 6f 70  the existing cop
368e0 79 20 6f 66 20 61 20 72 6f 77 20 74 68 61 74 20  y of a row that 
368f0 69 73 20 74 6f 20 62 65 0a 2a 2a 20 6f 76 65 72  is to be.** over
36900 77 72 69 74 74 65 6e 2e 20 20 49 66 20 74 68 65  written.  If the
36910 20 73 65 65 6b 52 65 73 75 6c 74 20 70 61 72 61   seekResult para
36920 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68 65 6e  meter is 0, then
36930 20 63 75 72 73 6f 72 20 70 43 75 72 20 6d 61 79   cursor pCur may
36940 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61 6e 79  .** point to any
36950 20 65 6e 74 72 79 20 6f 72 20 74 6f 20 6e 6f 20   entry or to no 
36960 65 6e 74 72 79 20 61 74 20 61 6c 6c 20 61 6e 64  entry at all and
36970 20 73 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   so this functio
36980 6e 20 68 61 73 20 74 6f 20 73 65 65 6b 0a 2a 2a  n has to seek.**
36990 20 74 68 65 20 63 75 72 73 6f 72 20 62 65 66 6f   the cursor befo
369a0 72 65 20 74 68 65 20 6e 65 77 20 6b 65 79 20 63  re the new key c
369b0 61 6e 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a  an be inserted..
369c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
369d0 72 65 65 49 6e 73 65 72 74 28 0a 20 20 42 74 43  reeInsert(.  BtC
369e0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
369f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
36a00 6e 73 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20  nsert data into 
36a10 74 68 65 20 74 61 62 6c 65 20 6f 66 20 74 68 69  the table of thi
36a20 73 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63 6f  s cursor */.  co
36a30 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
36a40 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20  i64 nKey,    /* 
36a50 54 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 6e  The key of the n
36a60 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63  ew record */.  c
36a70 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61  onst void *pData
36a80 2c 20 69 6e 74 20 6e 44 61 74 61 2c 20 20 2f 2a  , int nData,  /*
36a90 20 54 68 65 20 64 61 74 61 20 6f 66 20 74 68 65   The data of the
36aa0 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20   new record */. 
36ab0 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20   int nZero,     
36ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36ad0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74  /* Number of ext
36ae0 72 61 20 30 20 62 79 74 65 73 20 74 6f 20 61 70  ra 0 bytes to ap
36af0 70 65 6e 64 20 74 6f 20 64 61 74 61 20 2a 2f 0a  pend to data */.
36b00 20 20 69 6e 74 20 61 70 70 65 6e 64 42 69 61 73    int appendBias
36b10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
36b20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
36b30 20 69 73 20 6c 69 6b 65 6c 79 20 61 6e 20 61 70   is likely an ap
36b40 70 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 73 65  pend */.  int se
36b50 65 6b 52 65 73 75 6c 74 20 20 20 20 20 20 20 20  ekResult        
36b60 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
36b70 6c 74 20 6f 66 20 70 72 69 6f 72 20 4d 6f 76 65  lt of prior Move
36b80 74 6f 55 6e 70 61 63 6b 65 64 28 29 20 63 61 6c  toUnpacked() cal
36b90 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  l */.){.  int rc
36ba0 3b 0a 20 20 69 6e 74 20 6c 6f 63 20 3d 20 73 65  ;.  int loc = se
36bb0 65 6b 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20  ekResult;       
36bc0 20 20 20 2f 2a 20 2d 31 3a 20 62 65 66 6f 72 65     /* -1: before
36bd0 20 64 65 73 69 72 65 64 20 6c 6f 63 61 74 69 6f   desired locatio
36be0 6e 20 20 2b 31 3a 20 61 66 74 65 72 20 2a 2f 0a  n  +1: after */.
36bf0 20 20 69 6e 74 20 73 7a 4e 65 77 20 3d 20 30 3b    int szNew = 0;
36c00 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65  .  int idx;.  Me
36c10 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
36c20 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75 72 2d  Btree *p = pCur-
36c30 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53 68 61  >pBtree;.  BtSha
36c40 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
36c50 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  t;.  unsigned ch
36c60 61 72 20 2a 6f 6c 64 43 65 6c 6c 3b 0a 20 20 75  ar *oldCell;.  u
36c70 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6e 65  nsigned char *ne
36c80 77 43 65 6c 6c 20 3d 20 30 3b 0a 0a 20 20 69 66  wCell = 0;..  if
36c90 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
36ca0 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a  CURSOR_FAULT ){.
36cb0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
36cc0 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49  ->skipNext!=SQLI
36cd0 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 65 74  TE_OK );.    ret
36ce0 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  urn pCur->skipNe
36cf0 78 74 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  xt;.  }..  asser
36d00 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
36d10 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
36d20 73 73 65 72 74 28 20 70 43 75 72 2d 3e 77 72 46  ssert( pCur->wrF
36d30 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72  lag && pBt->inTr
36d40 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
36d50 5f 57 52 49 54 45 20 26 26 20 21 70 42 74 2d 3e  _WRITE && !pBt->
36d60 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 61 73  readOnly );.  as
36d70 73 65 72 74 28 20 68 61 73 53 68 61 72 65 64 43  sert( hasSharedC
36d80 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  acheTableLock(p,
36d90 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
36da0 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 21   pCur->pKeyInfo!
36db0 3d 30 2c 20 32 29 20 29 3b 0a 0a 20 20 2f 2a 20  =0, 2) );..  /* 
36dc0 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
36dd0 63 61 6c 6c 65 72 20 68 61 73 20 62 65 65 6e 20  caller has been 
36de0 63 6f 6e 73 69 73 74 65 6e 74 2e 20 49 66 20 74  consistent. If t
36df0 68 69 73 20 63 75 72 73 6f 72 20 77 61 73 20 6f  his cursor was o
36e00 70 65 6e 65 64 0a 20 20 2a 2a 20 65 78 70 65 63  pened.  ** expec
36e10 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 62 2d  ting an index b-
36e20 74 72 65 65 2c 20 74 68 65 6e 20 74 68 65 20 63  tree, then the c
36e30 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 62 65 20  aller should be 
36e40 69 6e 73 65 72 74 69 6e 67 20 62 6c 6f 62 0a 20  inserting blob. 
36e50 20 2a 2a 20 6b 65 79 73 20 77 69 74 68 20 6e 6f   ** keys with no
36e60 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 74 61   associated data
36e70 2e 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20  . If the cursor 
36e80 77 61 73 20 6f 70 65 6e 65 64 20 65 78 70 65 63  was opened expec
36e90 74 69 6e 67 20 61 6e 0a 20 20 2a 2a 20 69 6e 74  ting an.  ** int
36ea0 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 20 63  key table, the c
36eb0 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 62 65 20  aller should be 
36ec0 69 6e 73 65 72 74 69 6e 67 20 69 6e 74 65 67 65  inserting intege
36ed0 72 20 6b 65 79 73 20 77 69 74 68 20 61 0a 20 20  r keys with a.  
36ee0 2a 2a 20 62 6c 6f 62 20 6f 66 20 61 73 73 6f 63  ** blob of assoc
36ef0 69 61 74 65 64 20 64 61 74 61 2e 20 20 2a 2f 0a  iated data.  */.
36f00 20 20 61 73 73 65 72 74 28 20 28 70 4b 65 79 3d    assert( (pKey=
36f10 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79  =0)==(pCur->pKey
36f20 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f  Info==0) );..  /
36f30 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
36f40 69 6e 73 65 72 74 20 69 6e 74 6f 20 61 20 74 61  insert into a ta
36f50 62 6c 65 20 62 2d 74 72 65 65 2c 20 69 6e 76 61  ble b-tree, inva
36f60 6c 69 64 61 74 65 20 61 6e 79 20 69 6e 63 72 62  lidate any incrb
36f70 6c 6f 62 20 0a 20 20 2a 2a 20 63 75 72 73 6f 72  lob .  ** cursor
36f80 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 72 6f  s open on the ro
36f90 77 20 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64  w being replaced
36fa0 20 28 61 73 73 75 6d 69 6e 67 20 74 68 69 73 20   (assuming this 
36fb0 69 73 20 61 20 72 65 70 6c 61 63 65 0a 20 20 2a  is a replace.  *
36fc0 2a 20 6f 70 65 72 61 74 69 6f 6e 20 2d 20 69 66  * operation - if
36fd0 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 20   it is not, the 
36fe0 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 20 6e  following is a n
36ff0 6f 2d 6f 70 29 2e 20 20 2a 2f 0a 20 20 69 66 28  o-op).  */.  if(
37000 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d   pCur->pKeyInfo=
37010 3d 30 20 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69  =0 ){.    invali
37020 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
37030 6f 72 73 28 70 2c 20 6e 4b 65 79 2c 20 30 29 3b  ors(p, nKey, 0);
37040 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 61 76 65 20  .  }..  /* Save 
37050 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66  the positions of
37060 20 61 6e 79 20 6f 74 68 65 72 20 63 75 72 73 6f   any other curso
37070 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20  rs open on this 
37080 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  table..  **.  **
37090 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c 20   In some cases, 
370a0 74 68 65 20 63 61 6c 6c 20 74 6f 20 62 74 72 65  the call to btre
370b0 65 4d 6f 76 65 74 6f 28 29 20 62 65 6c 6f 77 20  eMoveto() below 
370c0 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 46 6f 72 0a  is a no-op. For.
370d0 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 77 68    ** example, wh
370e0 65 6e 20 69 6e 73 65 72 74 69 6e 67 20 64 61 74  en inserting dat
370f0 61 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 77  a into a table w
37100 69 74 68 20 61 75 74 6f 2d 67 65 6e 65 72 61 74  ith auto-generat
37110 65 64 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20  ed integer.  ** 
37120 6b 65 79 73 2c 20 74 68 65 20 56 44 42 45 20 6c  keys, the VDBE l
37130 61 79 65 72 20 69 6e 76 6f 6b 65 73 20 73 71 6c  ayer invokes sql
37140 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 29 20  ite3BtreeLast() 
37150 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20 74 68  to figure out th
37160 65 20 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 20  e .  ** integer 
37170 6b 65 79 20 74 6f 20 75 73 65 2e 20 49 74 20 74  key to use. It t
37180 68 65 6e 20 63 61 6c 6c 73 20 74 68 69 73 20 66  hen calls this f
37190 75 6e 63 74 69 6f 6e 20 74 6f 20 61 63 74 75 61  unction to actua
371a0 6c 6c 79 20 69 6e 73 65 72 74 20 74 68 65 20 0a  lly insert the .
371b0 20 20 2a 2a 20 64 61 74 61 20 69 6e 74 6f 20 74    ** data into t
371c0 68 65 20 69 6e 74 6b 65 79 20 42 2d 54 72 65 65  he intkey B-Tree
371d0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 62  . In this case b
371e0 74 72 65 65 4d 6f 76 65 74 6f 28 29 20 72 65 63  treeMoveto() rec
371f0 6f 67 6e 69 7a 65 73 0a 20 20 2a 2a 20 74 68 61  ognizes.  ** tha
37200 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  t the cursor is 
37210 61 6c 72 65 61 64 79 20 77 68 65 72 65 20 69 74  already where it
37220 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 6e 64   needs to be and
37230 20 72 65 74 75 72 6e 73 20 77 69 74 68 6f 75 74   returns without
37240 0a 20 20 2a 2a 20 64 6f 69 6e 67 20 61 6e 79 20  .  ** doing any 
37250 77 6f 72 6b 2e 20 54 6f 20 61 76 6f 69 64 20 74  work. To avoid t
37260 68 77 61 72 74 69 6e 67 20 74 68 65 73 65 20 6f  hwarting these o
37270 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2c 20 69 74  ptimizations, it
37280 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 0a 20 20   is important.  
37290 2a 2a 20 6e 6f 74 20 74 6f 20 63 6c 65 61 72 20  ** not to clear 
372a0 74 68 65 20 63 75 72 73 6f 72 20 68 65 72 65 2e  the cursor here.
372b0 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 61 76  .  */.  rc = sav
372c0 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
372d0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
372e0 20 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63   pCur);.  if( rc
372f0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
37300 69 66 28 20 21 6c 6f 63 20 29 7b 0a 20 20 20 20  if( !loc ){.    
37310 72 63 20 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f  rc = btreeMoveto
37320 28 70 43 75 72 2c 20 70 4b 65 79 2c 20 6e 4b 65  (pCur, pKey, nKe
37330 79 2c 20 61 70 70 65 6e 64 42 69 61 73 2c 20 26  y, appendBias, &
37340 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63  loc);.    if( rc
37350 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
37360 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  }.  assert( pCur
37370 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
37380 5f 56 41 4c 49 44 20 7c 7c 20 28 70 43 75 72 2d  _VALID || (pCur-
37390 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
373a0 49 4e 56 41 4c 49 44 20 26 26 20 6c 6f 63 29 20  INVALID && loc) 
373b0 29 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43  );..  pPage = pC
373c0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
373d0 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72  >iPage];.  asser
373e0 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  t( pPage->intKey
373f0 20 7c 7c 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20   || nKey>=0 );. 
37400 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
37410 6c 65 61 66 20 7c 7c 20 21 70 50 61 67 65 2d 3e  leaf || !pPage->
37420 69 6e 74 4b 65 79 20 29 3b 0a 0a 20 20 54 52 41  intKey );..  TRA
37430 43 45 28 28 22 49 4e 53 45 52 54 3a 20 74 61 62  CE(("INSERT: tab
37440 6c 65 3d 25 64 20 6e 6b 65 79 3d 25 6c 6c 64 20  le=%d nkey=%lld 
37450 6e 64 61 74 61 3d 25 64 20 70 61 67 65 3d 25 64  ndata=%d page=%d
37460 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
37470 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74    pCur->pgnoRoot
37480 2c 20 6e 4b 65 79 2c 20 6e 44 61 74 61 2c 20 70  , nKey, nData, p
37490 50 61 67 65 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20  Page->pgno,.    
374a0 20 20 20 20 20 20 6c 6f 63 3d 3d 30 20 3f 20 22        loc==0 ? "
374b0 6f 76 65 72 77 72 69 74 65 22 20 3a 20 22 6e 65  overwrite" : "ne
374c0 77 20 65 6e 74 72 79 22 29 29 3b 0a 20 20 61 73  w entry"));.  as
374d0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
374e0 6e 69 74 20 29 3b 0a 20 20 61 6c 6c 6f 63 61 74  nit );.  allocat
374f0 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
37500 0a 20 20 6e 65 77 43 65 6c 6c 20 3d 20 70 42 74  .  newCell = pBt
37510 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 69  ->pTmpSpace;.  i
37520 66 28 20 6e 65 77 43 65 6c 6c 3d 3d 30 20 29 20  f( newCell==0 ) 
37530 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
37540 4d 45 4d 3b 0a 20 20 72 63 20 3d 20 66 69 6c 6c  MEM;.  rc = fill
37550 49 6e 43 65 6c 6c 28 70 50 61 67 65 2c 20 6e 65  InCell(pPage, ne
37560 77 43 65 6c 6c 2c 20 70 4b 65 79 2c 20 6e 4b 65  wCell, pKey, nKe
37570 79 2c 20 70 44 61 74 61 2c 20 6e 44 61 74 61 2c  y, pData, nData,
37580 20 6e 5a 65 72 6f 2c 20 26 73 7a 4e 65 77 29 3b   nZero, &szNew);
37590 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
375a0 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 61   end_insert;.  a
375b0 73 73 65 72 74 28 20 73 7a 4e 65 77 3d 3d 63 65  ssert( szNew==ce
375c0 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
375d0 20 6e 65 77 43 65 6c 6c 29 20 29 3b 0a 20 20 61   newCell) );.  a
375e0 73 73 65 72 74 28 20 73 7a 4e 65 77 3c 3d 4d 58  ssert( szNew<=MX
375f0 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20  _CELL_SIZE(pBt) 
37600 29 3b 0a 20 20 69 64 78 20 3d 20 70 43 75 72 2d  );.  idx = pCur-
37610 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
37620 67 65 5d 3b 0a 20 20 69 66 28 20 6c 6f 63 3d 3d  ge];.  if( loc==
37630 30 20 29 7b 0a 20 20 20 20 75 31 36 20 73 7a 4f  0 ){.    u16 szO
37640 6c 64 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ld;.    assert( 
37650 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  idx<pPage->nCell
37660 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
37670 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
37680 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
37690 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
376a0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73      goto end_ins
376b0 65 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f  ert;.    }.    o
376c0 6c 64 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c  ldCell = findCel
376d0 6c 28 70 50 61 67 65 2c 20 69 64 78 29 3b 0a 20  l(pPage, idx);. 
376e0 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
376f0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  eaf ){.      mem
37700 63 70 79 28 6e 65 77 43 65 6c 6c 2c 20 6f 6c 64  cpy(newCell, old
37710 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 7d 0a  Cell, 4);.    }.
37720 20 20 20 20 73 7a 4f 6c 64 20 3d 20 63 65 6c 6c      szOld = cell
37730 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 6f  SizePtr(pPage, o
37740 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20 72 63 20  ldCell);.    rc 
37750 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67  = clearCell(pPag
37760 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20  e, oldCell);.   
37770 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c   dropCell(pPage,
37780 20 69 64 78 2c 20 73 7a 4f 6c 64 2c 20 26 72 63   idx, szOld, &rc
37790 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
377a0 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b  goto end_insert;
377b0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63  .  }else if( loc
377c0 3c 30 20 26 26 20 70 50 61 67 65 2d 3e 6e 43 65  <0 && pPage->nCe
377d0 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65  ll>0 ){.    asse
377e0 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  rt( pPage->leaf 
377f0 29 3b 0a 20 20 20 20 69 64 78 20 3d 20 2b 2b 70  );.    idx = ++p
37800 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
37810 3e 69 50 61 67 65 5d 3b 0a 20 20 7d 65 6c 73 65  >iPage];.  }else
37820 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
37830 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 7d  age->leaf );.  }
37840 0a 20 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50  .  insertCell(pP
37850 61 67 65 2c 20 69 64 78 2c 20 6e 65 77 43 65 6c  age, idx, newCel
37860 6c 2c 20 73 7a 4e 65 77 2c 20 30 2c 20 30 2c 20  l, szNew, 0, 0, 
37870 26 72 63 29 3b 0a 20 20 61 73 73 65 72 74 28 20  &rc);.  assert( 
37880 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
37890 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20   pPage->nCell>0 
378a0 7c 7c 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  || pPage->nOverf
378b0 6c 6f 77 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  low>0 );..  /* I
378c0 66 20 6e 6f 20 65 72 72 6f 72 20 68 61 73 20 6f  f no error has o
378d0 63 63 75 72 65 64 20 61 6e 64 20 70 50 61 67 65  ccured and pPage
378e0 20 68 61 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77   has an overflow
378f0 20 63 65 6c 6c 2c 20 63 61 6c 6c 20 62 61 6c 61   cell, call bala
37900 6e 63 65 28 29 20 0a 20 20 2a 2a 20 74 6f 20 72  nce() .  ** to r
37910 65 64 69 73 74 72 69 62 75 74 65 20 74 68 65 20  edistribute the 
37920 63 65 6c 6c 73 20 77 69 74 68 69 6e 20 74 68 65  cells within the
37930 20 74 72 65 65 2e 20 53 69 6e 63 65 20 62 61 6c   tree. Since bal
37940 61 6e 63 65 28 29 20 6d 61 79 20 6d 6f 76 65 0a  ance() may move.
37950 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 2c    ** the cursor,
37960 20 7a 65 72 6f 20 74 68 65 20 42 74 43 75 72 73   zero the BtCurs
37970 6f 72 2e 69 6e 66 6f 2e 6e 53 69 7a 65 20 61 6e  or.info.nSize an
37980 64 20 42 74 43 75 72 73 6f 72 2e 76 61 6c 69 64  d BtCursor.valid
37990 4e 4b 65 79 0a 20 20 2a 2a 20 76 61 72 69 61 62  NKey.  ** variab
379a0 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 50  les..  **.  ** P
379b0 72 65 76 69 6f 75 73 20 76 65 72 73 69 6f 6e 73  revious versions
379c0 20 6f 66 20 53 51 4c 69 74 65 20 63 61 6c 6c 65   of SQLite calle
379d0 64 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20 74  d moveToRoot() t
379e0 6f 20 6d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  o move the curso
379f0 72 0a 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20 74  r.  ** back to t
37a00 68 65 20 72 6f 6f 74 20 70 61 67 65 20 61 73 20  he root page as 
37a10 62 61 6c 61 6e 63 65 28 29 20 75 73 65 64 20 74  balance() used t
37a20 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 74 68 65  o invalidate the
37a30 20 63 6f 6e 74 65 6e 74 73 0a 20 20 2a 2a 20 6f   contents.  ** o
37a40 66 20 42 74 43 75 72 73 6f 72 2e 61 70 50 61 67  f BtCursor.apPag
37a50 65 5b 5d 20 61 6e 64 20 42 74 43 75 72 73 6f 72  e[] and BtCursor
37a60 2e 61 69 49 64 78 5b 5d 2e 20 49 6e 73 74 65 61  .aiIdx[]. Instea
37a70 64 20 6f 66 20 64 6f 69 6e 67 20 74 68 61 74 2c  d of doing that,
37a80 0a 20 20 2a 2a 20 73 65 74 20 74 68 65 20 63 75  .  ** set the cu
37a90 72 73 6f 72 20 73 74 61 74 65 20 74 6f 20 22 69  rsor state to "i
37aa0 6e 76 61 6c 69 64 22 2e 20 54 68 69 73 20 6d 61  nvalid". This ma
37ab0 6b 65 73 20 63 6f 6d 6d 6f 6e 20 69 6e 73 65 72  kes common inser
37ac0 74 20 6f 70 65 72 61 74 69 6f 6e 73 0a 20 20 2a  t operations.  *
37ad0 2a 20 73 6c 69 67 68 74 6c 79 20 66 61 73 74 65  * slightly faste
37ae0 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  r..  **.  ** The
37af0 72 65 20 69 73 20 61 20 73 75 62 74 6c 65 20 62  re is a subtle b
37b00 75 74 20 69 6d 70 6f 72 74 61 6e 74 20 6f 70 74  ut important opt
37b10 69 6d 69 7a 61 74 69 6f 6e 20 68 65 72 65 20 74  imization here t
37b20 6f 6f 2e 20 57 68 65 6e 20 69 6e 73 65 72 74 69  oo. When inserti
37b30 6e 67 0a 20 20 2a 2a 20 6d 75 6c 74 69 70 6c 65  ng.  ** multiple
37b40 20 72 65 63 6f 72 64 73 20 69 6e 74 6f 20 61 6e   records into an
37b50 20 69 6e 74 6b 65 79 20 62 2d 74 72 65 65 20 75   intkey b-tree u
37b60 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 63 75  sing a single cu
37b70 72 73 6f 72 20 28 61 73 20 63 61 6e 0a 20 20 2a  rsor (as can.  *
37b80 2a 20 68 61 70 70 65 6e 20 77 68 69 6c 65 20 70  * happen while p
37b90 72 6f 63 65 73 73 69 6e 67 20 61 6e 20 22 49 4e  rocessing an "IN
37ba0 53 45 52 54 20 49 4e 54 4f 20 2e 2e 2e 20 53 45  SERT INTO ... SE
37bb0 4c 45 43 54 22 20 73 74 61 74 65 6d 65 6e 74 29  LECT" statement)
37bc0 2c 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 64 76  , it.  ** is adv
37bd0 61 6e 74 61 67 65 6f 75 73 20 74 6f 20 6c 65 61  antageous to lea
37be0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f  ve the cursor po
37bf0 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61  inting to the la
37c00 73 74 20 65 6e 74 72 79 20 69 6e 0a 20 20 2a 2a  st entry in.  **
37c10 20 74 68 65 20 62 2d 74 72 65 65 20 69 66 20 70   the b-tree if p
37c20 6f 73 73 69 62 6c 65 2e 20 49 66 20 74 68 65 20  ossible. If the 
37c30 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70  cursor is left p
37c40 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c  ointing to the l
37c50 61 73 74 0a 20 20 2a 2a 20 65 6e 74 72 79 20 69  ast.  ** entry i
37c60 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 61 6e 64  n the table, and
37c70 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e   the next row in
37c80 73 65 72 74 65 64 20 68 61 73 20 61 6e 20 69 6e  serted has an in
37c90 74 65 67 65 72 20 6b 65 79 0a 20 20 2a 2a 20 6c  teger key.  ** l
37ca0 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 6c  arger than the l
37cb0 61 72 67 65 73 74 20 65 78 69 73 74 69 6e 67 20  argest existing 
37cc0 6b 65 79 2c 20 69 74 20 69 73 20 70 6f 73 73 69  key, it is possi
37cd0 62 6c 65 20 74 6f 20 69 6e 73 65 72 74 20 74 68  ble to insert th
37ce0 65 0a 20 20 2a 2a 20 72 6f 77 20 77 69 74 68 6f  e.  ** row witho
37cf0 75 74 20 73 65 65 6b 69 6e 67 20 74 68 65 20 63  ut seeking the c
37d00 75 72 73 6f 72 2e 20 54 68 69 73 20 63 61 6e 20  ursor. This can 
37d10 62 65 20 61 20 62 69 67 20 70 65 72 66 6f 72 6d  be a big perform
37d20 61 6e 63 65 20 62 6f 6f 73 74 2e 0a 20 20 2a 2f  ance boost..  */
37d30 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
37d40 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
37d50 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a  >validNKey = 0;.
37d60 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
37d70 5f 4f 4b 20 26 26 20 70 50 61 67 65 2d 3e 6e 4f  _OK && pPage->nO
37d80 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 72  verflow ){.    r
37d90 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 43 75 72  c = balance(pCur
37da0 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20  );..    /* Must 
37db0 6d 61 6b 65 20 73 75 72 65 20 6e 4f 76 65 72 66  make sure nOverf
37dc0 6c 6f 77 20 69 73 20 72 65 73 65 74 20 74 6f 20  low is reset to 
37dd0 7a 65 72 6f 20 65 76 65 6e 20 69 66 20 74 68 65  zero even if the
37de0 20 62 61 6c 61 6e 63 65 28 29 0a 20 20 20 20 2a   balance().    *
37df0 2a 20 66 61 69 6c 73 2e 20 49 6e 74 65 72 6e 61  * fails. Interna
37e00 6c 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  l data structure
37e10 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c   corruption will
37e20 20 72 65 73 75 6c 74 20 6f 74 68 65 72 77 69 73   result otherwis
37e30 65 2e 20 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c  e. .    ** Also,
37e40 20 73 65 74 20 74 68 65 20 63 75 72 73 6f 72 20   set the cursor 
37e50 73 74 61 74 65 20 74 6f 20 69 6e 76 61 6c 69 64  state to invalid
37e60 2e 20 54 68 69 73 20 73 74 6f 70 73 20 73 61 76  . This stops sav
37e70 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
37e80 29 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 72  ).    ** from tr
37e90 79 69 6e 67 20 74 6f 20 73 61 76 65 20 74 68 65  ying to save the
37ea0 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f   current positio
37eb0 6e 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 2e  n of the cursor.
37ec0 20 20 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e 61    */.    pCur->a
37ed0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
37ee0 65 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  e]->nOverflow = 
37ef0 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  0;.    pCur->eSt
37f00 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
37f10 41 4c 49 44 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ALID;.  }.  asse
37f20 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
37f30 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
37f40 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a  Overflow==0 );..
37f50 65 6e 64 5f 69 6e 73 65 72 74 3a 0a 20 20 72 65  end_insert:.  re
37f60 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
37f70 2a 20 44 65 6c 65 74 65 20 74 68 65 20 65 6e 74  * Delete the ent
37f80 72 79 20 74 68 61 74 20 74 68 65 20 63 75 72 73  ry that the curs
37f90 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  or is pointing t
37fa0 6f 2e 20 20 54 68 65 20 63 75 72 73 6f 72 0a 2a  o.  The cursor.*
37fb0 2a 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  * is left pointi
37fc0 6e 67 20 61 74 20 61 20 61 72 62 69 74 72 61 72  ng at a arbitrar
37fd0 79 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 69  y location..*/.i
37fe0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  nt sqlite3BtreeD
37ff0 65 6c 65 74 65 28 42 74 43 75 72 73 6f 72 20 2a  elete(BtCursor *
38000 70 43 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a  pCur){.  Btree *
38010 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65  p = pCur->pBtree
38020 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
38030 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20 20  t = p->pBt;     
38040 20 20 20 20 20 20 20 20 20 0a 20 20 69 6e 74 20           .  int 
38050 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
38060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38070 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
38080 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  */.  MemPage *pP
38090 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
380a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
380b0 65 20 74 6f 20 64 65 6c 65 74 65 20 63 65 6c 6c  e to delete cell
380c0 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 6e 73 69 67   from */.  unsig
380d0 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b  ned char *pCell;
380e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
380f0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 65  /* Pointer to ce
38100 6c 6c 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a  ll to delete */.
38110 20 20 69 6e 74 20 69 43 65 6c 6c 49 64 78 3b 20    int iCellIdx; 
38120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38130 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
38140 6f 66 20 63 65 6c 6c 20 74 6f 20 64 65 6c 65 74  of cell to delet
38150 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c  e */.  int iCell
38160 44 65 70 74 68 3b 20 20 20 20 20 20 20 20 20 20  Depth;          
38170 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
38180 65 70 74 68 20 6f 66 20 6e 6f 64 65 20 63 6f 6e  epth of node con
38190 74 61 69 6e 69 6e 67 20 70 43 65 6c 6c 20 2a 2f  taining pCell */
381a0 20 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72   ..  assert( cur
381b0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
381c0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
381d0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
381e0 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
381f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
38200 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a  Bt->readOnly );.
38210 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
38220 77 72 46 6c 61 67 20 29 3b 0a 20 20 61 73 73 65  wrFlag );.  asse
38230 72 74 28 20 68 61 73 53 68 61 72 65 64 43 61 63  rt( hasSharedCac
38240 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 70  heTableLock(p, p
38250 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70  Cur->pgnoRoot, p
38260 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 21 3d 30  Cur->pKeyInfo!=0
38270 2c 20 32 29 20 29 3b 0a 20 20 61 73 73 65 72 74  , 2) );.  assert
38280 28 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69  ( !hasReadConfli
38290 63 74 73 28 70 2c 20 70 43 75 72 2d 3e 70 67 6e  cts(p, pCur->pgn
382a0 6f 52 6f 6f 74 29 20 29 3b 0a 0a 20 20 69 66 28  oRoot) );..  if(
382b0 20 4e 45 56 45 52 28 70 43 75 72 2d 3e 61 69 49   NEVER(pCur->aiI
382c0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e  dx[pCur->iPage]>
382d0 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  =pCur->apPage[pC
382e0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
382f0 6c 29 20 0a 20 20 20 7c 7c 20 4e 45 56 45 52 28  l) .   || NEVER(
38300 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
38310 52 53 4f 52 5f 56 41 4c 49 44 29 0a 20 20 29 7b  RSOR_VALID).  ){
38320 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
38330 54 45 5f 45 52 52 4f 52 3b 20 20 2f 2a 20 53 6f  TE_ERROR;  /* So
38340 6d 65 74 68 69 6e 67 20 68 61 73 20 67 6f 6e 65  mething has gone
38350 20 61 77 72 79 2e 20 2a 2f 0a 20 20 7d 0a 0a 20   awry. */.  }.. 
38360 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
38370 20 64 65 6c 65 74 65 20 6f 70 65 72 61 74 69 6f   delete operatio
38380 6e 20 74 6f 20 72 65 6d 6f 76 65 20 61 20 72 6f  n to remove a ro
38390 77 20 66 72 6f 6d 20 61 20 74 61 62 6c 65 20 62  w from a table b
383a0 2d 74 72 65 65 2c 0a 20 20 2a 2a 20 69 6e 76 61  -tree,.  ** inva
383b0 6c 69 64 61 74 65 20 61 6e 79 20 69 6e 63 72 62  lidate any incrb
383c0 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  lob cursors open
383d0 20 6f 6e 20 74 68 65 20 72 6f 77 20 62 65 69 6e   on the row bein
383e0 67 20 64 65 6c 65 74 65 64 2e 20 20 2a 2f 0a 20  g deleted.  */. 
383f0 20 69 66 28 20 70 43 75 72 2d 3e 70 4b 65 79 49   if( pCur->pKeyI
38400 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  nfo==0 ){.    in
38410 76 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62  validateIncrblob
38420 43 75 72 73 6f 72 73 28 70 2c 20 70 43 75 72 2d  Cursors(p, pCur-
38430 3e 69 6e 66 6f 2e 6e 4b 65 79 2c 20 30 29 3b 0a  >info.nKey, 0);.
38440 20 20 7d 0a 0a 20 20 69 43 65 6c 6c 44 65 70 74    }..  iCellDept
38450 68 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b  h = pCur->iPage;
38460 0a 20 20 69 43 65 6c 6c 49 64 78 20 3d 20 70 43  .  iCellIdx = pC
38470 75 72 2d 3e 61 69 49 64 78 5b 69 43 65 6c 6c 44  ur->aiIdx[iCellD
38480