/ Hex Artifact Content
Login

Artifact 34fdbe3d67032405a6ec15d2eb5ddfff32dfb0049a7128aacd7f1fc193d626a8:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
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 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64  ile contains cod
0190: 65 20 66 6f 72 20 69 6d 70 6c 65 6d 65 6e 74 61  e for implementa
01a0: 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 72 2d 74  tions of the r-t
01b0: 72 65 65 20 61 6e 64 20 72 2a 2d 74 72 65 65 0a  ree and r*-tree.
01c0: 2a 2a 20 61 6c 67 6f 72 69 74 68 6d 73 20 70 61  ** algorithms pa
01d0: 63 6b 61 67 65 64 20 61 73 20 61 6e 20 53 51 4c  ckaged as an SQL
01e0: 69 74 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ite virtual tabl
01f0: 65 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 0a 2f 2a  e module..*/../*
0200: 0a 2a 2a 20 44 61 74 61 62 61 73 65 20 46 6f 72  .** Database For
0210: 6d 61 74 20 6f 66 20 52 2d 54 72 65 65 20 54 61  mat of R-Tree Ta
0220: 62 6c 65 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  bles.** --------
0230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0240: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 54  --------.**.** T
0250: 68 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72  he data structur
0260: 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 76  e for a single v
0270: 69 72 74 75 61 6c 20 72 2d 74 72 65 65 20 74 61  irtual r-tree ta
0280: 62 6c 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ble is stored in
0290: 20 74 68 72 65 65 20 0a 2a 2a 20 6e 61 74 69 76   three .** nativ
02a0: 65 20 53 51 4c 69 74 65 20 74 61 62 6c 65 73 20  e SQLite tables 
02b0: 64 65 63 6c 61 72 65 64 20 61 73 20 66 6f 6c 6c  declared as foll
02c0: 6f 77 73 2e 20 49 6e 20 65 61 63 68 20 63 61 73  ows. In each cas
02d0: 65 2c 20 74 68 65 20 27 25 27 20 63 68 61 72 61  e, the '%' chara
02e0: 63 74 65 72 0a 2a 2a 20 69 6e 20 74 68 65 20 74  cter.** in the t
02f0: 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 72 65 70  able name is rep
0300: 6c 61 63 65 64 20 77 69 74 68 20 74 68 65 20 75  laced with the u
0310: 73 65 72 2d 73 75 70 70 6c 69 65 64 20 6e 61 6d  ser-supplied nam
0320: 65 20 6f 66 20 74 68 65 20 72 2d 74 72 65 65 0a  e of the r-tree.
0330: 2a 2a 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ** table..**.** 
0340: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 25    CREATE TABLE %
0350: 5f 6e 6f 64 65 28 6e 6f 64 65 6e 6f 20 49 4e 54  _node(nodeno INT
0360: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
0370: 2c 20 64 61 74 61 20 42 4c 4f 42 29 0a 2a 2a 20  , data BLOB).** 
0380: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 25    CREATE TABLE %
0390: 5f 70 61 72 65 6e 74 28 6e 6f 64 65 6e 6f 20 49  _parent(nodeno I
03a0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
03b0: 45 59 2c 20 70 61 72 65 6e 74 6e 6f 64 65 20 49  EY, parentnode I
03c0: 4e 54 45 47 45 52 29 0a 2a 2a 20 20 20 43 52 45  NTEGER).**   CRE
03d0: 41 54 45 20 54 41 42 4c 45 20 25 5f 72 6f 77 69  ATE TABLE %_rowi
03e0: 64 28 72 6f 77 69 64 20 49 4e 54 45 47 45 52 20  d(rowid INTEGER 
03f0: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 6e 6f 64  PRIMARY KEY, nod
0400: 65 6e 6f 20 49 4e 54 45 47 45 52 29 0a 2a 2a 0a  eno INTEGER).**.
0410: 2a 2a 20 54 68 65 20 64 61 74 61 20 66 6f 72 20  ** The data for 
0420: 65 61 63 68 20 6e 6f 64 65 20 6f 66 20 74 68 65  each node of the
0430: 20 72 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   r-tree structur
0440: 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74  e is stored in t
0450: 68 65 20 25 5f 6e 6f 64 65 0a 2a 2a 20 74 61 62  he %_node.** tab
0460: 6c 65 2e 20 46 6f 72 20 65 61 63 68 20 6e 6f 64  le. For each nod
0470: 65 20 74 68 61 74 20 69 73 20 6e 6f 74 20 74 68  e that is not th
0480: 65 20 72 6f 6f 74 20 6e 6f 64 65 20 6f 66 20 74  e root node of t
0490: 68 65 20 72 2d 74 72 65 65 2c 20 74 68 65 72 65  he r-tree, there
04a0: 20 69 73 0a 2a 2a 20 61 6e 20 65 6e 74 72 79 20   is.** an entry 
04b0: 69 6e 20 74 68 65 20 25 5f 70 61 72 65 6e 74 20  in the %_parent 
04c0: 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74 69 6e  table associatin
04d0: 67 20 74 68 65 20 6e 6f 64 65 20 77 69 74 68 20  g the node with 
04e0: 69 74 73 20 70 61 72 65 6e 74 2e 0a 2a 2a 20 41  its parent..** A
04f0: 6e 64 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20  nd for each row 
0500: 6f 66 20 64 61 74 61 20 69 6e 20 74 68 65 20 74  of data in the t
0510: 61 62 6c 65 2c 20 74 68 65 72 65 20 69 73 20 61  able, there is a
0520: 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 25  n entry in the %
0530: 5f 72 6f 77 69 64 0a 2a 2a 20 74 61 62 6c 65 20  _rowid.** table 
0540: 74 68 61 74 20 6d 61 70 73 20 66 72 6f 6d 20 74  that maps from t
0550: 68 65 20 65 6e 74 72 69 65 73 20 72 6f 77 69 64  he entries rowid
0560: 20 74 6f 20 74 68 65 20 69 64 20 6f 66 20 74 68   to the id of th
0570: 65 20 6e 6f 64 65 20 74 68 61 74 20 69 74 0a 2a  e node that it.*
0580: 2a 20 69 73 20 73 74 6f 72 65 64 20 6f 6e 2e 0a  * is stored on..
0590: 2a 2a 0a 2a 2a 20 54 68 65 20 72 6f 6f 74 20 6e  **.** The root n
05a0: 6f 64 65 20 6f 66 20 61 6e 20 72 2d 74 72 65 65  ode of an r-tree
05b0: 20 61 6c 77 61 79 73 20 65 78 69 73 74 73 2c 20   always exists, 
05c0: 65 76 65 6e 20 69 66 20 74 68 65 20 72 2d 74 72  even if the r-tr
05d0: 65 65 20 74 61 62 6c 65 20 69 73 0a 2a 2a 20 65  ee table is.** e
05e0: 6d 70 74 79 2e 20 54 68 65 20 6e 6f 64 65 6e 6f  mpty. The nodeno
05f0: 20 6f 66 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64   of the root nod
0600: 65 20 69 73 20 61 6c 77 61 79 73 20 31 2e 20 41  e is always 1. A
0610: 6c 6c 20 6f 74 68 65 72 20 6e 6f 64 65 73 20 69  ll other nodes i
0620: 6e 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 6d  n the.** table m
0630: 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20  ust be the same 
0640: 73 69 7a 65 20 61 73 20 74 68 65 20 72 6f 6f 74  size as the root
0650: 20 6e 6f 64 65 2e 20 54 68 65 20 63 6f 6e 74 65   node. The conte
0660: 6e 74 20 6f 66 20 65 61 63 68 20 6e 6f 64 65 0a  nt of each node.
0670: 2a 2a 20 69 73 20 66 6f 72 6d 61 74 74 65 64 20  ** is formatted 
0680: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
0690: 2a 20 20 20 31 2e 20 49 66 20 74 68 65 20 6e 6f  *   1. If the no
06a0: 64 65 20 69 73 20 74 68 65 20 72 6f 6f 74 20 6e  de is the root n
06b0: 6f 64 65 20 28 6e 6f 64 65 20 31 29 2c 20 74 68  ode (node 1), th
06c0: 65 6e 20 74 68 65 20 66 69 72 73 74 20 32 20 62  en the first 2 b
06d0: 79 74 65 73 0a 2a 2a 20 20 20 20 20 20 6f 66 20  ytes.**      of 
06e0: 74 68 65 20 6e 6f 64 65 20 63 6f 6e 74 61 69 6e  the node contain
06f0: 20 74 68 65 20 74 72 65 65 20 64 65 70 74 68 20   the tree depth 
0700: 61 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20  as a big-endian 
0710: 69 6e 74 65 67 65 72 2e 0a 2a 2a 20 20 20 20 20  integer..**     
0720: 20 46 6f 72 20 6e 6f 6e 2d 72 6f 6f 74 20 6e 6f   For non-root no
0730: 64 65 73 2c 20 74 68 65 20 66 69 72 73 74 20 32  des, the first 2
0740: 20 62 79 74 65 73 20 61 72 65 20 6c 65 66 74 20   bytes are left 
0750: 75 6e 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  unused..**.**   
0760: 32 2e 20 54 68 65 20 6e 65 78 74 20 32 20 62 79  2. The next 2 by
0770: 74 65 73 20 63 6f 6e 74 61 69 6e 20 74 68 65 20  tes contain the 
0780: 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
0790: 73 20 63 75 72 72 65 6e 74 6c 79 20 0a 2a 2a 20  s currently .** 
07a0: 20 20 20 20 20 73 74 6f 72 65 64 20 69 6e 20 74       stored in t
07b0: 68 65 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20  he node..**.**  
07c0: 20 33 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65   3. The remainde
07d0: 72 20 6f 66 20 74 68 65 20 6e 6f 64 65 20 63 6f  r of the node co
07e0: 6e 74 61 69 6e 73 20 74 68 65 20 6e 6f 64 65 20  ntains the node 
07f0: 65 6e 74 72 69 65 73 2e 20 45 61 63 68 20 65 6e  entries. Each en
0800: 74 72 79 0a 2a 2a 20 20 20 20 20 20 63 6f 6e 73  try.**      cons
0810: 69 73 74 73 20 6f 66 20 61 20 73 69 6e 67 6c 65  ists of a single
0820: 20 38 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20   8-byte integer 
0830: 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 20 65  followed by an e
0840: 76 65 6e 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20  ven number.**   
0850: 20 20 20 6f 66 20 34 2d 62 79 74 65 20 63 6f 6f     of 4-byte coo
0860: 72 64 69 6e 61 74 65 73 2e 20 46 6f 72 20 6c 65  rdinates. For le
0870: 61 66 20 6e 6f 64 65 73 20 74 68 65 20 69 6e 74  af nodes the int
0880: 65 67 65 72 20 69 73 20 74 68 65 20 72 6f 77 69  eger is the rowi
0890: 64 0a 2a 2a 20 20 20 20 20 20 6f 66 20 61 20 72  d.**      of a r
08a0: 65 63 6f 72 64 2e 20 46 6f 72 20 69 6e 74 65 72  ecord. For inter
08b0: 6e 61 6c 20 6e 6f 64 65 73 20 69 74 20 69 73 20  nal nodes it is 
08c0: 74 68 65 20 6e 6f 64 65 20 6e 75 6d 62 65 72 20  the node number 
08d0: 6f 66 20 61 0a 2a 2a 20 20 20 20 20 20 63 68 69  of a.**      chi
08e0: 6c 64 20 70 61 67 65 2e 0a 2a 2f 0a 0a 23 69 66  ld page..*/..#if
08f0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
0900: 5f 43 4f 52 45 29 20 7c 7c 20 64 65 66 69 6e 65  _CORE) || define
0910: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
0920: 52 54 52 45 45 29 0a 0a 23 69 66 6e 64 65 66 20  RTREE)..#ifndef 
0930: 53 51 4c 49 54 45 5f 43 4f 52 45 0a 20 20 23 69  SQLITE_CORE.  #i
0940: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33 65  nclude "sqlite3e
0950: 78 74 2e 68 22 0a 20 20 53 51 4c 49 54 45 5f 45  xt.h".  SQLITE_E
0960: 58 54 45 4e 53 49 4f 4e 5f 49 4e 49 54 31 0a 23  XTENSION_INIT1.#
0970: 65 6c 73 65 0a 20 20 23 69 6e 63 6c 75 64 65 20  else.  #include 
0980: 22 73 71 6c 69 74 65 33 2e 68 22 0a 23 65 6e 64  "sqlite3.h".#end
0990: 69 66 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  if..#include <st
09a0: 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  ring.h>.#include
09b0: 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63   <assert.h>.#inc
09c0: 6c 75 64 65 20 3c 73 74 64 69 6e 74 2e 68 3e 0a  lude <stdint.h>.
09d0: 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e  #include <stdio.
09e0: 68 3e 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  h>..#ifndef SQLI
09f0: 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 0a  TE_AMALGAMATION.
0a00: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0a10: 33 72 74 72 65 65 2e 68 22 0a 74 79 70 65 64 65  3rtree.h".typede
0a20: 66 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  f sqlite3_int64 
0a30: 69 36 34 3b 0a 74 79 70 65 64 65 66 20 73 71 6c  i64;.typedef sql
0a40: 69 74 65 33 5f 75 69 6e 74 36 34 20 75 36 34 3b  ite3_uint64 u64;
0a50: 0a 74 79 70 65 64 65 66 20 75 6e 73 69 67 6e 65  .typedef unsigne
0a60: 64 20 63 68 61 72 20 75 38 3b 0a 74 79 70 65 64  d char u8;.typed
0a70: 65 66 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72  ef unsigned shor
0a80: 74 20 75 31 36 3b 0a 74 79 70 65 64 65 66 20 75  t u16;.typedef u
0a90: 6e 73 69 67 6e 65 64 20 69 6e 74 20 75 33 32 3b  nsigned int u32;
0aa0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 20 54 68 65  .#endif../*  The
0ab0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f   following macro
0ac0: 20 69 73 20 75 73 65 64 20 74 6f 20 73 75 70 70   is used to supp
0ad0: 72 65 73 73 20 63 6f 6d 70 69 6c 65 72 20 77 61  ress compiler wa
0ae0: 72 6e 69 6e 67 73 2e 0a 2a 2f 0a 23 69 66 6e 64  rnings..*/.#ifnd
0af0: 65 66 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  ef UNUSED_PARAME
0b00: 54 45 52 0a 23 20 64 65 66 69 6e 65 20 55 4e 55  TER.# define UNU
0b10: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 78 29  SED_PARAMETER(x)
0b20: 20 28 76 6f 69 64 29 28 78 29 0a 23 65 6e 64 69   (void)(x).#endi
0b30: 66 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  f..typedef struc
0b40: 74 20 52 74 72 65 65 20 52 74 72 65 65 3b 0a 74  t Rtree Rtree;.t
0b50: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 52 74  ypedef struct Rt
0b60: 72 65 65 43 75 72 73 6f 72 20 52 74 72 65 65 43  reeCursor RtreeC
0b70: 75 72 73 6f 72 3b 0a 74 79 70 65 64 65 66 20 73  ursor;.typedef s
0b80: 74 72 75 63 74 20 52 74 72 65 65 4e 6f 64 65 20  truct RtreeNode 
0b90: 52 74 72 65 65 4e 6f 64 65 3b 0a 74 79 70 65 64  RtreeNode;.typed
0ba0: 65 66 20 73 74 72 75 63 74 20 52 74 72 65 65 43  ef struct RtreeC
0bb0: 65 6c 6c 20 52 74 72 65 65 43 65 6c 6c 3b 0a 74  ell RtreeCell;.t
0bc0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 52 74  ypedef struct Rt
0bd0: 72 65 65 43 6f 6e 73 74 72 61 69 6e 74 20 52 74  reeConstraint Rt
0be0: 72 65 65 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 74  reeConstraint;.t
0bf0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 52 74  ypedef struct Rt
0c00: 72 65 65 4d 61 74 63 68 41 72 67 20 52 74 72 65  reeMatchArg Rtre
0c10: 65 4d 61 74 63 68 41 72 67 3b 0a 74 79 70 65 64  eMatchArg;.typed
0c20: 65 66 20 73 74 72 75 63 74 20 52 74 72 65 65 47  ef struct RtreeG
0c30: 65 6f 6d 43 61 6c 6c 62 61 63 6b 20 52 74 72 65  eomCallback Rtre
0c40: 65 47 65 6f 6d 43 61 6c 6c 62 61 63 6b 3b 0a 74  eGeomCallback;.t
0c50: 79 70 65 64 65 66 20 75 6e 69 6f 6e 20 52 74 72  ypedef union Rtr
0c60: 65 65 43 6f 6f 72 64 20 52 74 72 65 65 43 6f 6f  eeCoord RtreeCoo
0c70: 72 64 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  rd;.typedef stru
0c80: 63 74 20 52 74 72 65 65 53 65 61 72 63 68 50 6f  ct RtreeSearchPo
0c90: 69 6e 74 20 52 74 72 65 65 53 65 61 72 63 68 50  int RtreeSearchP
0ca0: 6f 69 6e 74 3b 0a 0a 2f 2a 20 54 68 65 20 72 74  oint;../* The rt
0cb0: 72 65 65 20 6d 61 79 20 68 61 76 65 20 62 65 74  ree may have bet
0cc0: 77 65 65 6e 20 31 20 61 6e 64 20 52 54 52 45 45  ween 1 and RTREE
0cd0: 5f 4d 41 58 5f 44 49 4d 45 4e 53 49 4f 4e 53 20  _MAX_DIMENSIONS 
0ce0: 64 69 6d 65 6e 73 69 6f 6e 73 2e 20 2a 2f 0a 23  dimensions. */.#
0cf0: 64 65 66 69 6e 65 20 52 54 52 45 45 5f 4d 41 58  define RTREE_MAX
0d00: 5f 44 49 4d 45 4e 53 49 4f 4e 53 20 35 0a 0a 2f  _DIMENSIONS 5../
0d10: 2a 20 53 69 7a 65 20 6f 66 20 68 61 73 68 20 74  * Size of hash t
0d20: 61 62 6c 65 20 52 74 72 65 65 2e 61 48 61 73 68  able Rtree.aHash
0d30: 2e 20 54 68 69 73 20 68 61 73 68 20 74 61 62 6c  . This hash tabl
0d40: 65 20 69 73 20 6e 6f 74 20 65 78 70 65 63 74 65  e is not expecte
0d50: 64 20 74 6f 0a 2a 2a 20 65 76 65 72 20 63 6f 6e  d to.** ever con
0d60: 74 61 69 6e 20 76 65 72 79 20 6d 61 6e 79 20 65  tain very many e
0d70: 6e 74 72 69 65 73 2c 20 73 6f 20 61 20 66 69 78  ntries, so a fix
0d80: 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 62 75 63  ed number of buc
0d90: 6b 65 74 73 20 69 73 20 0a 2a 2a 20 75 73 65 64  kets is .** used
0da0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 48 41 53  ..*/.#define HAS
0db0: 48 53 49 5a 45 20 39 37 0a 0a 2f 2a 20 54 68 65  HSIZE 97../* The
0dc0: 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68   xBestIndex meth
0dd0: 6f 64 20 6f 66 20 74 68 69 73 20 76 69 72 74 75  od of this virtu
0de0: 61 6c 20 74 61 62 6c 65 20 72 65 71 75 69 72 65  al table require
0df0: 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66  s an estimate of
0e00: 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  .** the number o
0e10: 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 76 69  f rows in the vi
0e20: 72 74 75 61 6c 20 74 61 62 6c 65 20 74 6f 20 63  rtual table to c
0e30: 61 6c 63 75 6c 61 74 65 20 74 68 65 20 63 6f 73  alculate the cos
0e40: 74 73 20 6f 66 0a 2a 2a 20 76 61 72 69 6f 75 73  ts of.** various
0e50: 20 73 74 72 61 74 65 67 69 65 73 2e 20 49 66 20   strategies. If 
0e60: 70 6f 73 73 69 62 6c 65 2c 20 74 68 69 73 20 65  possible, this e
0e70: 73 74 69 6d 61 74 65 20 69 73 20 6c 6f 61 64 65  stimate is loade
0e80: 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 73 71  d from the.** sq
0e90: 6c 69 74 65 5f 73 74 61 74 31 20 74 61 62 6c 65  lite_stat1 table
0ea0: 20 28 77 69 74 68 20 52 54 52 45 45 5f 4d 49 4e   (with RTREE_MIN
0eb0: 5f 52 4f 57 45 53 54 20 61 73 20 61 20 68 61 72  _ROWEST as a har
0ec0: 64 2d 63 6f 64 65 64 20 6d 69 6e 69 6d 75 6d 29  d-coded minimum)
0ed0: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0ee0: 69 66 20 6e 6f 20 73 71 6c 69 74 65 5f 73 74 61  if no sqlite_sta
0ef0: 74 31 20 65 6e 74 72 79 20 69 73 20 61 76 61 69  t1 entry is avai
0f00: 6c 61 62 6c 65 2c 20 75 73 65 20 0a 2a 2a 20 52  lable, use .** R
0f10: 54 52 45 45 5f 44 45 46 41 55 4c 54 5f 52 4f 57  TREE_DEFAULT_ROW
0f20: 45 53 54 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  EST..*/.#define 
0f30: 52 54 52 45 45 5f 44 45 46 41 55 4c 54 5f 52 4f  RTREE_DEFAULT_RO
0f40: 57 45 53 54 20 31 30 34 38 35 37 36 0a 23 64 65  WEST 1048576.#de
0f50: 66 69 6e 65 20 52 54 52 45 45 5f 4d 49 4e 5f 52  fine RTREE_MIN_R
0f60: 4f 57 45 53 54 20 20 20 20 20 20 20 20 20 31 30  OWEST         10
0f70: 30 0a 0a 2f 2a 20 0a 2a 2a 20 41 6e 20 72 74 72  0../* .** An rtr
0f80: 65 65 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65  ee virtual-table
0f90: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 72 75   object..*/.stru
0fa0: 63 74 20 52 74 72 65 65 20 7b 0a 20 20 73 71 6c  ct Rtree {.  sql
0fb0: 69 74 65 33 5f 76 74 61 62 20 62 61 73 65 3b 20  ite3_vtab base; 
0fc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65           /* Base
0fd0: 20 63 6c 61 73 73 2e 20 20 4d 75 73 74 20 62 65   class.  Must be
0fe0: 20 66 69 72 73 74 20 2a 2f 0a 20 20 73 71 6c 69   first */.  sqli
0ff0: 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
1000: 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 73 74 20          /* Host 
1010: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1020: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 4e 6f  ion */.  int iNo
1030: 64 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  deSize;         
1040: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 69 6e 20       /* Size in 
1050: 62 79 74 65 73 20 6f 66 20 65 61 63 68 20 6e 6f  bytes of each no
1060: 64 65 20 69 6e 20 74 68 65 20 6e 6f 64 65 20 74  de in the node t
1070: 61 62 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 44 69  able */.  u8 nDi
1080: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
1090: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
10a0: 6f 66 20 64 69 6d 65 6e 73 69 6f 6e 73 20 2a 2f  of dimensions */
10b0: 0a 20 20 75 38 20 6e 44 69 6d 32 3b 20 20 20 20  .  u8 nDim2;    
10c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10d0: 2a 20 54 77 69 63 65 20 74 68 65 20 6e 75 6d 62  * Twice the numb
10e0: 65 72 20 6f 66 20 64 69 6d 65 6e 73 69 6f 6e 73  er of dimensions
10f0: 20 2a 2f 0a 20 20 75 38 20 65 43 6f 6f 72 64 54   */.  u8 eCoordT
1100: 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ype;            
1110: 20 20 2f 2a 20 52 54 52 45 45 5f 43 4f 4f 52 44    /* RTREE_COORD
1120: 5f 52 45 41 4c 33 32 20 6f 72 20 52 54 52 45 45  _REAL32 or RTREE
1130: 5f 43 4f 4f 52 44 5f 49 4e 54 33 32 20 2a 2f 0a  _COORD_INT32 */.
1140: 20 20 75 38 20 6e 42 79 74 65 73 50 65 72 43 65    u8 nBytesPerCe
1150: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ll;           /*
1160: 20 42 79 74 65 73 20 63 6f 6e 73 75 6d 65 64 20   Bytes consumed 
1170: 70 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  per cell */.  u8
1180: 20 69 6e 57 72 54 72 61 6e 73 3b 20 20 20 20 20   inWrTrans;     
1190: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
11a0: 65 20 69 66 20 69 6e 73 69 64 65 20 77 72 69 74  e if inside writ
11b0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  e transaction */
11c0: 0a 20 20 69 6e 74 20 69 44 65 70 74 68 3b 20 20  .  int iDepth;  
11d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11e0: 2a 20 43 75 72 72 65 6e 74 20 64 65 70 74 68 20  * Current depth 
11f0: 6f 66 20 74 68 65 20 72 2d 74 72 65 65 20 73 74  of the r-tree st
1200: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 63 68 61  ructure */.  cha
1210: 72 20 2a 7a 44 62 3b 20 20 20 20 20 20 20 20 20  r *zDb;         
1220: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
1230: 20 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e   of database con
1240: 74 61 69 6e 69 6e 67 20 72 2d 74 72 65 65 20 74  taining r-tree t
1250: 61 62 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  able */.  char *
1260: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
1270: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1280: 20 72 2d 74 72 65 65 20 74 61 62 6c 65 20 2a 2f   r-tree table */
1290: 20 0a 20 20 75 33 32 20 6e 42 75 73 79 3b 20 20   .  u32 nBusy;  
12a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b0: 2f 2a 20 43 75 72 72 65 6e 74 20 6e 75 6d 62 65  /* Current numbe
12c0: 72 20 6f 66 20 75 73 65 72 73 20 6f 66 20 74 68  r of users of th
12d0: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
12e0: 20 20 69 36 34 20 6e 52 6f 77 45 73 74 3b 20 20    i64 nRowEst;  
12f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1300: 20 45 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65   Estimated numbe
1310: 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 69  r of rows in thi
1320: 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 75 33 32  s table */.  u32
1330: 20 6e 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20   nCursor;       
1340: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1350: 65 72 20 6f 66 20 6f 70 65 6e 20 63 75 72 73 6f  er of open curso
1360: 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4c 69 73 74  rs */..  /* List
1370: 20 6f 66 20 6e 6f 64 65 73 20 72 65 6d 6f 76 65   of nodes remove
1380: 64 20 64 75 72 69 6e 67 20 61 20 43 6f 6e 64 65  d during a Conde
1390: 6e 73 65 54 72 65 65 20 6f 70 65 72 61 74 69 6f  nseTree operatio
13a0: 6e 2e 20 4c 69 73 74 20 69 73 0a 20 20 2a 2a 20  n. List is.  ** 
13b0: 6c 69 6e 6b 65 64 20 74 6f 67 65 74 68 65 72 20  linked together 
13c0: 76 69 61 20 74 68 65 20 70 6f 69 6e 74 65 72 20  via the pointer 
13d0: 6e 6f 72 6d 61 6c 6c 79 20 75 73 65 64 20 66 6f  normally used fo
13e0: 72 20 68 61 73 68 20 63 68 61 69 6e 73 20 2d 0a  r hash chains -.
13f0: 20 20 2a 2a 20 52 74 72 65 65 4e 6f 64 65 2e 70    ** RtreeNode.p
1400: 4e 65 78 74 2e 20 52 74 72 65 65 4e 6f 64 65 2e  Next. RtreeNode.
1410: 69 4e 6f 64 65 20 73 74 6f 72 65 73 20 74 68 65  iNode stores the
1420: 20 64 65 70 74 68 20 6f 66 20 74 68 65 20 73 75   depth of the su
1430: 62 2d 74 72 65 65 20 0a 20 20 2a 2a 20 68 65 61  b-tree .  ** hea
1440: 64 65 64 20 62 79 20 74 68 65 20 6e 6f 64 65 20  ded by the node 
1450: 28 6c 65 61 66 20 6e 6f 64 65 73 20 68 61 76 65  (leaf nodes have
1460: 20 52 74 72 65 65 4e 6f 64 65 2e 69 4e 6f 64 65   RtreeNode.iNode
1470: 3d 3d 30 29 2e 0a 20 20 2a 2f 0a 20 20 52 74 72  ==0)..  */.  Rtr
1480: 65 65 4e 6f 64 65 20 2a 70 44 65 6c 65 74 65 64  eeNode *pDeleted
1490: 3b 0a 20 20 69 6e 74 20 69 52 65 69 6e 73 65 72  ;.  int iReinser
14a0: 74 48 65 69 67 68 74 3b 20 20 20 20 20 20 20 20  tHeight;        
14b0: 2f 2a 20 48 65 69 67 68 74 20 6f 66 20 73 75 62  /* Height of sub
14c0: 2d 74 72 65 65 73 20 52 65 69 6e 73 65 72 74 28  -trees Reinsert(
14d0: 29 20 68 61 73 20 72 75 6e 20 6f 6e 20 2a 2f 0a  ) has run on */.
14e0: 0a 20 20 2f 2a 20 42 6c 6f 62 20 49 2f 4f 20 6f  .  /* Blob I/O o
14f0: 6e 20 78 78 78 5f 6e 6f 64 65 20 2a 2f 0a 20 20  n xxx_node */.  
1500: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 4e  sqlite3_blob *pN
1510: 6f 64 65 42 6c 6f 62 3b 0a 0a 20 20 2f 2a 20 53  odeBlob;..  /* S
1520: 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 72 65 61  tatements to rea
1530: 64 2f 77 72 69 74 65 2f 64 65 6c 65 74 65 20 61  d/write/delete a
1540: 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 78 78 78   record from xxx
1550: 5f 6e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74  _node */.  sqlit
1560: 65 33 5f 73 74 6d 74 20 2a 70 57 72 69 74 65 4e  e3_stmt *pWriteN
1570: 6f 64 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ode;.  sqlite3_s
1580: 74 6d 74 20 2a 70 44 65 6c 65 74 65 4e 6f 64 65  tmt *pDeleteNode
1590: 3b 0a 0a 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e  ;..  /* Statemen
15a0: 74 73 20 74 6f 20 72 65 61 64 2f 77 72 69 74 65  ts to read/write
15b0: 2f 64 65 6c 65 74 65 20 61 20 72 65 63 6f 72 64  /delete a record
15c0: 20 66 72 6f 6d 20 78 78 78 5f 72 6f 77 69 64 20   from xxx_rowid 
15d0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
15e0: 74 20 2a 70 52 65 61 64 52 6f 77 69 64 3b 0a 20  t *pReadRowid;. 
15f0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1600: 57 72 69 74 65 52 6f 77 69 64 3b 0a 20 20 73 71  WriteRowid;.  sq
1610: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 44 65 6c  lite3_stmt *pDel
1620: 65 74 65 52 6f 77 69 64 3b 0a 0a 20 20 2f 2a 20  eteRowid;..  /* 
1630: 53 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 72 65  Statements to re
1640: 61 64 2f 77 72 69 74 65 2f 64 65 6c 65 74 65 20  ad/write/delete 
1650: 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 78 78  a record from xx
1660: 78 5f 70 61 72 65 6e 74 20 2a 2f 0a 20 20 73 71  x_parent */.  sq
1670: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 52 65 61  lite3_stmt *pRea
1680: 64 50 61 72 65 6e 74 3b 0a 20 20 73 71 6c 69 74  dParent;.  sqlit
1690: 65 33 5f 73 74 6d 74 20 2a 70 57 72 69 74 65 50  e3_stmt *pWriteP
16a0: 61 72 65 6e 74 3b 0a 20 20 73 71 6c 69 74 65 33  arent;.  sqlite3
16b0: 5f 73 74 6d 74 20 2a 70 44 65 6c 65 74 65 50 61  _stmt *pDeletePa
16c0: 72 65 6e 74 3b 0a 0a 20 20 52 74 72 65 65 4e 6f  rent;..  RtreeNo
16d0: 64 65 20 2a 61 48 61 73 68 5b 48 41 53 48 53 49  de *aHash[HASHSI
16e0: 5a 45 5d 3b 20 2f 2a 20 48 61 73 68 20 74 61 62  ZE]; /* Hash tab
16f0: 6c 65 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20  le of in-memory 
1700: 6e 6f 64 65 73 2e 20 2a 2f 20 0a 7d 3b 0a 0a 2f  nodes. */ .};../
1710: 2a 20 50 6f 73 73 69 62 6c 65 20 76 61 6c 75 65  * Possible value
1720: 73 20 66 6f 72 20 52 74 72 65 65 2e 65 43 6f 6f  s for Rtree.eCoo
1730: 72 64 54 79 70 65 3a 20 2a 2f 0a 23 64 65 66 69  rdType: */.#defi
1740: 6e 65 20 52 54 52 45 45 5f 43 4f 4f 52 44 5f 52  ne RTREE_COORD_R
1750: 45 41 4c 33 32 20 30 0a 23 64 65 66 69 6e 65 20  EAL32 0.#define 
1760: 52 54 52 45 45 5f 43 4f 4f 52 44 5f 49 4e 54 33  RTREE_COORD_INT3
1770: 32 20 20 31 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53  2  1../*.** If S
1780: 51 4c 49 54 45 5f 52 54 52 45 45 5f 49 4e 54 5f  QLITE_RTREE_INT_
1790: 4f 4e 4c 59 20 69 73 20 64 65 66 69 6e 65 64 2c  ONLY is defined,
17a0: 20 74 68 65 6e 20 74 68 69 73 20 76 69 72 74 75   then this virtu
17b0: 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c 0a 2a 2a  al table will.**
17c0: 20 6f 6e 6c 79 20 64 65 61 6c 20 77 69 74 68 20   only deal with 
17d0: 69 6e 74 65 67 65 72 20 63 6f 6f 72 64 69 6e 61  integer coordina
17e0: 74 65 73 2e 20 20 4e 6f 20 66 6c 6f 61 74 69 6e  tes.  No floatin
17f0: 67 20 70 6f 69 6e 74 20 6f 70 65 72 61 74 69 6f  g point operatio
1800: 6e 73 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 64 6f  ns.** will be do
1810: 6e 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ne..*/.#ifdef SQ
1820: 4c 49 54 45 5f 52 54 52 45 45 5f 49 4e 54 5f 4f  LITE_RTREE_INT_O
1830: 4e 4c 59 0a 20 20 74 79 70 65 64 65 66 20 73 71  NLY.  typedef sq
1840: 6c 69 74 65 33 5f 69 6e 74 36 34 20 52 74 72 65  lite3_int64 Rtre
1850: 65 44 56 61 6c 75 65 3b 20 20 20 20 20 20 20 2f  eDValue;       /
1860: 2a 20 48 69 67 68 20 61 63 63 75 72 61 63 79 20  * High accuracy 
1870: 63 6f 6f 72 64 69 6e 61 74 65 20 2a 2f 0a 20 20  coordinate */.  
1880: 74 79 70 65 64 65 66 20 69 6e 74 20 52 74 72 65  typedef int Rtre
1890: 65 56 61 6c 75 65 3b 20 20 20 20 20 20 20 20 20  eValue;         
18a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77 20           /* Low 
18b0: 61 63 63 75 72 61 63 79 20 63 6f 6f 72 64 69 6e  accuracy coordin
18c0: 61 74 65 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  ate */.# define 
18d0: 52 54 52 45 45 5f 5a 45 52 4f 20 30 0a 23 65 6c  RTREE_ZERO 0.#el
18e0: 73 65 0a 20 20 74 79 70 65 64 65 66 20 64 6f 75  se.  typedef dou
18f0: 62 6c 65 20 52 74 72 65 65 44 56 61 6c 75 65 3b  ble RtreeDValue;
1900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1910: 20 48 69 67 68 20 61 63 63 75 72 61 63 79 20 63   High accuracy c
1920: 6f 6f 72 64 69 6e 61 74 65 20 2a 2f 0a 20 20 74  oordinate */.  t
1930: 79 70 65 64 65 66 20 66 6c 6f 61 74 20 52 74 72  ypedef float Rtr
1940: 65 65 56 61 6c 75 65 3b 20 20 20 20 20 20 20 20  eeValue;        
1950: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77 20 61          /* Low a
1960: 63 63 75 72 61 63 79 20 63 6f 6f 72 64 69 6e 61  ccuracy coordina
1970: 74 65 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 52  te */.# define R
1980: 54 52 45 45 5f 5a 45 52 4f 20 30 2e 30 0a 23 65  TREE_ZERO 0.0.#e
1990: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e  ndif../*.** When
19a0: 20 64 6f 69 6e 67 20 61 20 73 65 61 72 63 68 20   doing a search 
19b0: 6f 66 20 61 6e 20 72 2d 74 72 65 65 2c 20 69 6e  of an r-tree, in
19c0: 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 66  stances of the f
19d0: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
19e0: 72 65 0a 2a 2a 20 72 65 63 6f 72 64 20 69 6e 74  re.** record int
19f0: 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74  ermediate result
1a00: 73 20 66 72 6f 6d 20 74 68 65 20 74 72 65 65 20  s from the tree 
1a10: 77 61 6c 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  walk..**.** The 
1a20: 69 64 20 69 73 20 61 6c 77 61 79 73 20 61 20 6e  id is always a n
1a30: 6f 64 65 2d 69 64 2e 20 20 46 6f 72 20 69 4c 65  ode-id.  For iLe
1a40: 76 65 6c 3e 3d 31 20 74 68 65 20 69 64 20 69 73  vel>=1 the id is
1a50: 20 74 68 65 20 6e 6f 64 65 2d 69 64 20 6f 66 0a   the node-id of.
1a60: 2a 2a 20 74 68 65 20 6e 6f 64 65 20 74 68 61 74  ** the node that
1a70: 20 74 68 65 20 52 74 72 65 65 53 65 61 72 63 68   the RtreeSearch
1a80: 50 6f 69 6e 74 20 72 65 70 72 65 73 65 6e 74 73  Point represents
1a90: 2e 20 20 57 68 65 6e 20 69 4c 65 76 65 6c 3d 3d  .  When iLevel==
1aa0: 30 2c 20 68 6f 77 65 76 65 72 2c 0a 2a 2a 20 74  0, however,.** t
1ab0: 68 65 20 69 64 20 69 73 20 6f 66 20 74 68 65 20  he id is of the 
1ac0: 70 61 72 65 6e 74 20 6e 6f 64 65 20 61 6e 64 20  parent node and 
1ad0: 74 68 65 20 63 65 6c 6c 20 74 68 61 74 20 52 74  the cell that Rt
1ae0: 72 65 65 53 65 61 72 63 68 50 6f 69 6e 74 0a 2a  reeSearchPoint.*
1af0: 2a 20 72 65 70 72 65 73 65 6e 74 73 20 69 73 20  * represents is 
1b00: 74 68 65 20 69 43 65 6c 6c 2d 74 68 20 65 6e 74  the iCell-th ent
1b10: 72 79 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74  ry in the parent
1b20: 20 6e 6f 64 65 2e 0a 2a 2f 0a 73 74 72 75 63 74   node..*/.struct
1b30: 20 52 74 72 65 65 53 65 61 72 63 68 50 6f 69 6e   RtreeSearchPoin
1b40: 74 20 7b 0a 20 20 52 74 72 65 65 44 56 61 6c 75  t {.  RtreeDValu
1b50: 65 20 72 53 63 6f 72 65 3b 20 20 20 20 2f 2a 20  e rScore;    /* 
1b60: 54 68 65 20 73 63 6f 72 65 20 66 6f 72 20 74 68  The score for th
1b70: 69 73 20 6e 6f 64 65 2e 20 20 53 6d 61 6c 6c 65  is node.  Smalle
1b80: 73 74 20 67 6f 65 73 20 66 69 72 73 74 2e 20 2a  st goes first. *
1b90: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
1ba0: 34 20 69 64 3b 20 20 20 20 20 20 2f 2a 20 4e 6f  4 id;      /* No
1bb0: 64 65 20 49 44 20 2a 2f 0a 20 20 75 38 20 69 4c  de ID */.  u8 iL
1bc0: 65 76 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20  evel;           
1bd0: 20 20 2f 2a 20 30 3d 65 6e 74 72 69 65 73 2e 20    /* 0=entries. 
1be0: 20 31 3d 6c 65 61 66 20 6e 6f 64 65 2e 20 20 32   1=leaf node.  2
1bf0: 2b 20 66 6f 72 20 68 69 67 68 65 72 20 2a 2f 0a  + for higher */.
1c00: 20 20 75 38 20 65 57 69 74 68 69 6e 3b 20 20 20    u8 eWithin;   
1c10: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 52 54           /* PART
1c20: 4c 59 5f 57 49 54 48 49 4e 20 6f 72 20 46 55 4c  LY_WITHIN or FUL
1c30: 4c 59 5f 57 49 54 48 49 4e 20 2a 2f 0a 20 20 75  LY_WITHIN */.  u
1c40: 38 20 69 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  8 iCell;        
1c50: 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c 20 69 6e        /* Cell in
1c60: 64 65 78 20 77 69 74 68 69 6e 20 74 68 65 20 6e  dex within the n
1c70: 6f 64 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ode */.};../*.**
1c80: 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 6e 75 6d   The minimum num
1c90: 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 61 6c 6c  ber of cells all
1ca0: 6f 77 65 64 20 66 6f 72 20 61 20 6e 6f 64 65 20  owed for a node 
1cb0: 69 73 20 61 20 74 68 69 72 64 20 6f 66 20 74 68  is a third of th
1cc0: 65 20 0a 2a 2a 20 6d 61 78 69 6d 75 6d 2e 20 49  e .** maximum. I
1cd0: 6e 20 47 75 74 6d 61 6e 27 73 20 6e 6f 74 61 74  n Gutman's notat
1ce0: 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 6d  ion:.**.**     m
1cf0: 20 3d 20 4d 2f 33 0a 2a 2a 0a 2a 2a 20 49 66 20   = M/3.**.** If 
1d00: 61 6e 20 52 2a 2d 74 72 65 65 20 22 52 65 69 6e  an R*-tree "Rein
1d10: 73 65 72 74 22 20 6f 70 65 72 61 74 69 6f 6e 20  sert" operation 
1d20: 69 73 20 72 65 71 75 69 72 65 64 2c 20 74 68 65  is required, the
1d30: 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 0a   same number of.
1d40: 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20 72 65 6d  ** cells are rem
1d50: 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 6f 76  oved from the ov
1d60: 65 72 66 75 6c 6c 20 6e 6f 64 65 20 61 6e 64 20  erfull node and 
1d70: 72 65 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  reinserted into 
1d80: 74 68 65 20 74 72 65 65 2e 0a 2a 2f 0a 23 64 65  the tree..*/.#de
1d90: 66 69 6e 65 20 52 54 52 45 45 5f 4d 49 4e 43 45  fine RTREE_MINCE
1da0: 4c 4c 53 28 70 29 20 28 28 28 28 70 29 2d 3e 69  LLS(p) ((((p)->i
1db0: 4e 6f 64 65 53 69 7a 65 2d 34 29 2f 28 70 29 2d  NodeSize-4)/(p)-
1dc0: 3e 6e 42 79 74 65 73 50 65 72 43 65 6c 6c 29 2f  >nBytesPerCell)/
1dd0: 33 29 0a 23 64 65 66 69 6e 65 20 52 54 52 45 45  3).#define RTREE
1de0: 5f 52 45 49 4e 53 45 52 54 28 70 29 20 52 54 52  _REINSERT(p) RTR
1df0: 45 45 5f 4d 49 4e 43 45 4c 4c 53 28 70 29 0a 23  EE_MINCELLS(p).#
1e00: 64 65 66 69 6e 65 20 52 54 52 45 45 5f 4d 41 58  define RTREE_MAX
1e10: 43 45 4c 4c 53 20 35 31 0a 0a 2f 2a 0a 2a 2a 20  CELLS 51../*.** 
1e20: 54 68 65 20 73 6d 61 6c 6c 65 73 74 20 70 6f 73  The smallest pos
1e30: 73 69 62 6c 65 20 6e 6f 64 65 2d 73 69 7a 65 20  sible node-size 
1e40: 69 73 20 28 35 31 32 2d 36 34 29 3d 3d 34 34 38  is (512-64)==448
1e50: 20 62 79 74 65 73 2e 20 41 6e 64 20 74 68 65 20   bytes. And the 
1e60: 6c 61 72 67 65 73 74 0a 2a 2a 20 73 75 70 70 6f  largest.** suppo
1e70: 72 74 65 64 20 63 65 6c 6c 20 73 69 7a 65 20 69  rted cell size i
1e80: 73 20 34 38 20 62 79 74 65 73 20 28 38 20 62 79  s 48 bytes (8 by
1e90: 74 65 20 72 6f 77 69 64 20 2b 20 74 65 6e 20 34  te rowid + ten 4
1ea0: 20 62 79 74 65 20 63 6f 6f 72 64 69 6e 61 74 65   byte coordinate
1eb0: 73 29 2e 0a 2a 2a 20 54 68 65 72 65 66 6f 72 65  s)..** Therefore
1ec0: 20 61 6c 6c 20 6e 6f 6e 2d 72 6f 6f 74 20 6e 6f   all non-root no
1ed0: 64 65 73 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e  des must contain
1ee0: 20 61 74 20 6c 65 61 73 74 20 33 20 65 6e 74 72   at least 3 entr
1ef0: 69 65 73 2e 20 53 69 6e 63 65 20 0a 2a 2a 20 33  ies. Since .** 3
1f00: 5e 34 30 20 69 73 20 67 72 65 61 74 65 72 20 74  ^40 is greater t
1f10: 68 61 6e 20 32 5e 36 34 2c 20 61 6e 20 72 2d 74  han 2^64, an r-t
1f20: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 61 6c  ree structure al
1f30: 77 61 79 73 20 68 61 73 20 61 20 64 65 70 74 68  ways has a depth
1f40: 20 6f 66 0a 2a 2a 20 34 30 20 6f 72 20 6c 65 73   of.** 40 or les
1f50: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 52 54  s..*/.#define RT
1f60: 52 45 45 5f 4d 41 58 5f 44 45 50 54 48 20 34 30  REE_MAX_DEPTH 40
1f70: 0a 0a 0a 2f 2a 0a 2a 2a 20 4e 75 6d 62 65 72 20  .../*.** Number 
1f80: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  of entries in th
1f90: 65 20 63 75 72 73 6f 72 20 52 74 72 65 65 4e 6f  e cursor RtreeNo
1fa0: 64 65 20 63 61 63 68 65 2e 20 20 54 68 65 20 66  de cache.  The f
1fb0: 69 72 73 74 20 65 6e 74 72 79 20 69 73 0a 2a 2a  irst entry is.**
1fc0: 20 75 73 65 64 20 74 6f 20 63 61 63 68 65 20 74   used to cache t
1fd0: 68 65 20 52 74 72 65 65 4e 6f 64 65 20 66 6f 72  he RtreeNode for
1fe0: 20 52 74 72 65 65 43 75 72 73 6f 72 2e 73 50 6f   RtreeCursor.sPo
1ff0: 69 6e 74 2e 20 20 54 68 65 20 72 65 6d 61 69 6e  int.  The remain
2000: 69 6e 67 0a 2a 2a 20 65 6e 74 72 69 65 73 20 63  ing.** entries c
2010: 61 63 68 65 20 74 68 65 20 52 74 72 65 65 4e 6f  ache the RtreeNo
2020: 64 65 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  de for the first
2030: 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65   elements of the
2040: 20 70 72 69 6f 72 69 74 79 20 71 75 65 75 65 2e   priority queue.
2050: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 52 54 52 45  .*/.#define RTRE
2060: 45 5f 43 41 43 48 45 5f 53 5a 20 20 35 0a 0a 2f  E_CACHE_SZ  5../
2070: 2a 20 0a 2a 2a 20 41 6e 20 72 74 72 65 65 20 63  * .** An rtree c
2080: 75 72 73 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f  ursor object..*/
2090: 0a 73 74 72 75 63 74 20 52 74 72 65 65 43 75 72  .struct RtreeCur
20a0: 73 6f 72 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  sor {.  sqlite3_
20b0: 76 74 61 62 5f 63 75 72 73 6f 72 20 62 61 73 65  vtab_cursor base
20c0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73  ;         /* Bas
20d0: 65 20 63 6c 61 73 73 2e 20 20 4d 75 73 74 20 62  e class.  Must b
20e0: 65 20 66 69 72 73 74 20 2a 2f 0a 20 20 75 38 20  e first */.  u8 
20f0: 61 74 45 4f 46 3b 20 20 20 20 20 20 20 20 20 20  atEOF;          
2100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2110: 2a 20 54 72 75 65 20 69 66 20 61 74 20 65 6e 64  * True if at end
2120: 20 6f 66 20 73 65 61 72 63 68 20 2a 2f 0a 20 20   of search */.  
2130: 75 38 20 62 50 6f 69 6e 74 3b 20 20 20 20 20 20  u8 bPoint;      
2140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2150: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73 50 6f    /* True if sPo
2160: 69 6e 74 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a  int is valid */.
2170: 20 20 69 6e 74 20 69 53 74 72 61 74 65 67 79 3b    int iStrategy;
2180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2190: 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 69      /* Copy of i
21a0: 64 78 4e 75 6d 20 73 65 61 72 63 68 20 70 61 72  dxNum search par
21b0: 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ameter */.  int 
21c0: 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 20 20 20  nConstraint;    
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21e0: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
21f0: 65 73 20 69 6e 20 61 43 6f 6e 73 74 72 61 69 6e  es in aConstrain
2200: 74 20 2a 2f 0a 20 20 52 74 72 65 65 43 6f 6e 73  t */.  RtreeCons
2210: 74 72 61 69 6e 74 20 2a 61 43 6f 6e 73 74 72 61  traint *aConstra
2220: 69 6e 74 3b 20 20 20 20 20 2f 2a 20 53 65 61 72  int;     /* Sear
2230: 63 68 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20  ch constraints. 
2240: 2a 2f 0a 20 20 69 6e 74 20 6e 50 6f 69 6e 74 41  */.  int nPointA
2250: 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 20 20  lloc;           
2260: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2270: 20 6f 66 20 73 6c 6f 74 73 20 61 6c 6c 6f 63 61   of slots alloca
2280: 74 65 64 20 66 6f 72 20 61 50 6f 69 6e 74 5b 5d  ted for aPoint[]
2290: 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6f 69 6e 74   */.  int nPoint
22a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22b0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
22c0: 72 20 6f 66 20 73 6c 6f 74 73 20 75 73 65 64 20  r of slots used 
22d0: 69 6e 20 61 50 6f 69 6e 74 5b 5d 20 2a 2f 0a 20  in aPoint[] */. 
22e0: 20 69 6e 74 20 6d 78 4c 65 76 65 6c 3b 20 20 20   int mxLevel;   
22f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2300: 20 20 20 2f 2a 20 69 4c 65 76 65 6c 20 76 61 6c     /* iLevel val
2310: 75 65 20 66 6f 72 20 72 6f 6f 74 20 6f 66 20 74  ue for root of t
2320: 68 65 20 74 72 65 65 20 2a 2f 0a 20 20 52 74 72  he tree */.  Rtr
2330: 65 65 53 65 61 72 63 68 50 6f 69 6e 74 20 2a 61  eeSearchPoint *a
2340: 50 6f 69 6e 74 3b 20 20 20 20 20 20 20 20 20 2f  Point;         /
2350: 2a 20 50 72 69 6f 72 69 74 79 20 71 75 65 75 65  * Priority queue
2360: 20 66 6f 72 20 73 65 61 72 63 68 20 70 6f 69 6e   for search poin
2370: 74 73 20 2a 2f 0a 20 20 52 74 72 65 65 53 65 61  ts */.  RtreeSea
2380: 72 63 68 50 6f 69 6e 74 20 73 50 6f 69 6e 74 3b  rchPoint sPoint;
2390: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 63            /* Cac
23a0: 68 65 64 20 6e 65 78 74 20 73 65 61 72 63 68 20  hed next search 
23b0: 70 6f 69 6e 74 20 2a 2f 0a 20 20 52 74 72 65 65  point */.  Rtree
23c0: 4e 6f 64 65 20 2a 61 4e 6f 64 65 5b 52 54 52 45  Node *aNode[RTRE
23d0: 45 5f 43 41 43 48 45 5f 53 5a 5d 3b 20 2f 2a 20  E_CACHE_SZ]; /* 
23e0: 52 74 72 65 65 20 6e 6f 64 65 20 63 61 63 68 65  Rtree node cache
23f0: 20 2a 2f 0a 20 20 75 33 32 20 61 6e 51 75 65 75   */.  u32 anQueu
2400: 65 5b 52 54 52 45 45 5f 4d 41 58 5f 44 45 50 54  e[RTREE_MAX_DEPT
2410: 48 2b 31 5d 3b 20 20 20 2f 2a 20 4e 75 6d 62 65  H+1];   /* Numbe
2420: 72 20 6f 66 20 71 75 65 75 65 64 20 65 6e 74 72  r of queued entr
2430: 69 65 73 20 62 79 20 69 4c 65 76 65 6c 20 2a 2f  ies by iLevel */
2440: 0a 7d 3b 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74  .};../* Return t
2450: 68 65 20 52 74 72 65 65 20 6f 66 20 61 20 52 74  he Rtree of a Rt
2460: 72 65 65 43 75 72 73 6f 72 20 2a 2f 0a 23 64 65  reeCursor */.#de
2470: 66 69 6e 65 20 52 54 52 45 45 5f 4f 46 5f 43 55  fine RTREE_OF_CU
2480: 52 53 4f 52 28 58 29 20 20 20 28 28 52 74 72 65  RSOR(X)   ((Rtre
2490: 65 2a 29 28 28 58 29 2d 3e 62 61 73 65 2e 70 56  e*)((X)->base.pV
24a0: 74 61 62 29 29 0a 0a 2f 2a 0a 2a 2a 20 41 20 63  tab))../*.** A c
24b0: 6f 6f 72 64 69 6e 61 74 65 20 63 61 6e 20 62 65  oordinate can be
24c0: 20 65 69 74 68 65 72 20 61 20 66 6c 6f 61 74 69   either a floati
24d0: 6e 67 20 70 6f 69 6e 74 20 6e 75 6d 62 65 72 20  ng point number 
24e0: 6f 72 20 61 20 69 6e 74 65 67 65 72 2e 20 20 41  or a integer.  A
24f0: 6c 6c 0a 2a 2a 20 63 6f 6f 72 64 69 6e 61 74 65  ll.** coordinate
2500: 73 20 77 69 74 68 69 6e 20 61 20 73 69 6e 67 6c  s within a singl
2510: 65 20 52 2d 54 72 65 65 20 61 72 65 20 61 6c 77  e R-Tree are alw
2520: 61 79 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20  ays of the same 
2530: 74 69 6d 65 2e 0a 2a 2f 0a 75 6e 69 6f 6e 20 52  time..*/.union R
2540: 74 72 65 65 43 6f 6f 72 64 20 7b 0a 20 20 52 74  treeCoord {.  Rt
2550: 72 65 65 56 61 6c 75 65 20 66 3b 20 20 20 20 20  reeValue f;     
2560: 20 2f 2a 20 46 6c 6f 61 74 69 6e 67 20 70 6f 69   /* Floating poi
2570: 6e 74 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e  nt value */.  in
2580: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
2590: 20 2f 2a 20 49 6e 74 65 67 65 72 20 76 61 6c 75   /* Integer valu
25a0: 65 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20  e */.  u32 u;   
25b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73            /* Uns
25c0: 69 67 6e 65 64 20 66 6f 72 20 62 79 74 65 2d 6f  igned for byte-o
25d0: 72 64 65 72 20 63 6f 6e 76 65 72 73 69 6f 6e 73  rder conversions
25e0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68   */.};../*.** Th
25f0: 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e  e argument is an
2600: 20 52 74 72 65 65 43 6f 6f 72 64 2e 20 52 65 74   RtreeCoord. Ret
2610: 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 73 74  urn the value st
2620: 6f 72 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  ored within the 
2630: 52 74 72 65 65 43 6f 6f 72 64 0a 2a 2a 20 66 6f  RtreeCoord.** fo
2640: 72 6d 61 74 74 65 64 20 61 73 20 61 20 52 74 72  rmatted as a Rtr
2650: 65 65 44 56 61 6c 75 65 20 28 64 6f 75 62 6c 65  eeDValue (double
2660: 20 6f 72 20 69 6e 74 36 34 29 2e 20 54 68 69 73   or int64). This
2670: 20 6d 61 63 72 6f 20 61 73 73 75 6d 65 73 20 74   macro assumes t
2680: 68 61 74 20 6c 6f 63 61 6c 0a 2a 2a 20 76 61 72  hat local.** var
2690: 69 61 62 6c 65 20 70 52 74 72 65 65 20 70 6f 69  iable pRtree poi
26a0: 6e 74 73 20 74 6f 20 74 68 65 20 52 74 72 65 65  nts to the Rtree
26b0: 20 73 74 72 75 63 74 75 72 65 20 61 73 73 6f 63   structure assoc
26c0: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 2a  iated with the.*
26d0: 2a 20 52 74 72 65 65 43 6f 6f 72 64 2e 0a 2a 2f  * RtreeCoord..*/
26e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 52  .#ifdef SQLITE_R
26f0: 54 52 45 45 5f 49 4e 54 5f 4f 4e 4c 59 0a 23 20  TREE_INT_ONLY.# 
2700: 64 65 66 69 6e 65 20 44 43 4f 4f 52 44 28 63 6f  define DCOORD(co
2710: 6f 72 64 29 20 28 28 52 74 72 65 65 44 56 61 6c  ord) ((RtreeDVal
2720: 75 65 29 63 6f 6f 72 64 2e 69 29 0a 23 65 6c 73  ue)coord.i).#els
2730: 65 0a 23 20 64 65 66 69 6e 65 20 44 43 4f 4f 52  e.# define DCOOR
2740: 44 28 63 6f 6f 72 64 29 20 28 20 20 20 20 20 20  D(coord) (      
2750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2760: 20 20 20 20 20 5c 0a 20 20 20 20 28 70 52 74 72       \.    (pRtr
2770: 65 65 2d 3e 65 43 6f 6f 72 64 54 79 70 65 3d 3d  ee->eCoordType==
2780: 52 54 52 45 45 5f 43 4f 4f 52 44 5f 52 45 41 4c  RTREE_COORD_REAL
2790: 33 32 29 20 3f 20 20 20 20 20 20 5c 0a 20 20 20  32) ?      \.   
27a0: 20 20 20 28 28 64 6f 75 62 6c 65 29 63 6f 6f 72     ((double)coor
27b0: 64 2e 66 29 20 3a 20 20 20 20 20 20 20 20 20 20  d.f) :          
27c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d0: 20 5c 0a 20 20 20 20 20 20 28 28 64 6f 75 62 6c   \.      ((doubl
27e0: 65 29 63 6f 6f 72 64 2e 69 29 20 20 20 20 20 20  e)coord.i)      
27f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2800: 20 20 20 20 20 20 20 5c 0a 20 20 29 0a 23 65 6e         \.  ).#en
2810: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 65 61  dif../*.** A sea
2820: 72 63 68 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a  rch constraint..
2830: 2a 2f 0a 73 74 72 75 63 74 20 52 74 72 65 65 43  */.struct RtreeC
2840: 6f 6e 73 74 72 61 69 6e 74 20 7b 0a 20 20 69 6e  onstraint {.  in
2850: 74 20 69 43 6f 6f 72 64 3b 20 20 20 20 20 20 20  t iCoord;       
2860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2870: 20 49 6e 64 65 78 20 6f 66 20 63 6f 6e 73 74 72   Index of constr
2880: 61 69 6e 65 64 20 63 6f 6f 72 64 69 6e 61 74 65  ained coordinate
2890: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20   */.  int op;   
28a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b0: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 61        /* Constra
28c0: 69 6e 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 20  ining operation 
28d0: 2a 2f 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20  */.  union {.   
28e0: 20 52 74 72 65 65 44 56 61 6c 75 65 20 72 56 61   RtreeDValue rVa
28f0: 6c 75 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  lue;            
2900: 20 2f 2a 20 43 6f 6e 73 74 72 61 69 6e 74 20 76   /* Constraint v
2910: 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  alue. */.    int
2920: 20 28 2a 78 47 65 6f 6d 29 28 73 71 6c 69 74 65   (*xGeom)(sqlite
2930: 33 5f 72 74 72 65 65 5f 67 65 6f 6d 65 74 72 79  3_rtree_geometry
2940: 2a 2c 69 6e 74 2c 52 74 72 65 65 44 56 61 6c 75  *,int,RtreeDValu
2950: 65 2a 2c 69 6e 74 2a 29 3b 0a 20 20 20 20 69 6e  e*,int*);.    in
2960: 74 20 28 2a 78 51 75 65 72 79 46 75 6e 63 29 28  t (*xQueryFunc)(
2970: 73 71 6c 69 74 65 33 5f 72 74 72 65 65 5f 71 75  sqlite3_rtree_qu
2980: 65 72 79 5f 69 6e 66 6f 2a 29 3b 0a 20 20 7d 20  ery_info*);.  } 
2990: 75 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 74 72  u;.  sqlite3_rtr
29a0: 65 65 5f 71 75 65 72 79 5f 69 6e 66 6f 20 2a 70  ee_query_info *p
29b0: 49 6e 66 6f 3b 20 20 2f 2a 20 78 47 65 6f 6d 20  Info;  /* xGeom 
29c0: 61 6e 64 20 78 51 75 65 72 79 46 75 6e 63 20 61  and xQueryFunc a
29d0: 72 67 75 6d 65 6e 74 20 2a 2f 0a 7d 3b 0a 0a 2f  rgument */.};../
29e0: 2a 20 50 6f 73 73 69 62 6c 65 20 76 61 6c 75 65  * Possible value
29f0: 73 20 66 6f 72 20 52 74 72 65 65 43 6f 6e 73 74  s for RtreeConst
2a00: 72 61 69 6e 74 2e 6f 70 20 2a 2f 0a 23 64 65 66  raint.op */.#def
2a10: 69 6e 65 20 52 54 52 45 45 5f 45 51 20 20 20 20  ine RTREE_EQ    
2a20: 30 78 34 31 20 20 2f 2a 20 41 20 2a 2f 0a 23 64  0x41  /* A */.#d
2a30: 65 66 69 6e 65 20 52 54 52 45 45 5f 4c 45 20 20  efine RTREE_LE  
2a40: 20 20 30 78 34 32 20 20 2f 2a 20 42 20 2a 2f 0a    0x42  /* B */.
2a50: 23 64 65 66 69 6e 65 20 52 54 52 45 45 5f 4c 54  #define RTREE_LT
2a60: 20 20 20 20 30 78 34 33 20 20 2f 2a 20 43 20 2a      0x43  /* C *
2a70: 2f 0a 23 64 65 66 69 6e 65 20 52 54 52 45 45 5f  /.#define RTREE_
2a80: 47 45 20 20 20 20 30 78 34 34 20 20 2f 2a 20 44  GE    0x44  /* D
2a90: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 52 54 52 45   */.#define RTRE
2aa0: 45 5f 47 54 20 20 20 20 30 78 34 35 20 20 2f 2a  E_GT    0x45  /*
2ab0: 20 45 20 2a 2f 0a 23 64 65 66 69 6e 65 20 52 54   E */.#define RT
2ac0: 52 45 45 5f 4d 41 54 43 48 20 30 78 34 36 20 20  REE_MATCH 0x46  
2ad0: 2f 2a 20 46 3a 20 4f 6c 64 2d 73 74 79 6c 65 20  /* F: Old-style 
2ae0: 73 71 6c 69 74 65 33 5f 72 74 72 65 65 5f 67 65  sqlite3_rtree_ge
2af0: 6f 6d 65 74 72 79 5f 63 61 6c 6c 62 61 63 6b 28  ometry_callback(
2b00: 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 52 54 52  ) */.#define RTR
2b10: 45 45 5f 51 55 45 52 59 20 30 78 34 37 20 20 2f  EE_QUERY 0x47  /
2b20: 2a 20 47 3a 20 4e 65 77 2d 73 74 79 6c 65 20 73  * G: New-style s
2b30: 71 6c 69 74 65 33 5f 72 74 72 65 65 5f 71 75 65  qlite3_rtree_que
2b40: 72 79 5f 63 61 6c 6c 62 61 63 6b 28 29 20 2a 2f  ry_callback() */
2b50: 0a 0a 0a 2f 2a 20 0a 2a 2a 20 41 6e 20 72 74 72  .../* .** An rtr
2b60: 65 65 20 73 74 72 75 63 74 75 72 65 20 6e 6f 64  ee structure nod
2b70: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 52 74 72  e..*/.struct Rtr
2b80: 65 65 4e 6f 64 65 20 7b 0a 20 20 52 74 72 65 65  eeNode {.  Rtree
2b90: 4e 6f 64 65 20 2a 70 50 61 72 65 6e 74 3b 20 20  Node *pParent;  
2ba0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74         /* Parent
2bb0: 20 6e 6f 64 65 20 2a 2f 0a 20 20 69 36 34 20 69   node */.  i64 i
2bc0: 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Node;           
2bd0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 6f         /* The no
2be0: 64 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69  de number */.  i
2bf0: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
2c00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2c10: 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
2c20: 65 73 20 74 6f 20 74 68 69 73 20 6e 6f 64 65 20  es to this node 
2c30: 2a 2f 0a 20 20 69 6e 74 20 69 73 44 69 72 74 79  */.  int isDirty
2c40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2c50: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
2c60: 6e 6f 64 65 20 6e 65 65 64 73 20 74 6f 20 62 65  node needs to be
2c70: 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b   written to disk
2c80: 20 2a 2f 0a 20 20 75 38 20 2a 7a 44 61 74 61 3b   */.  u8 *zData;
2c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca0: 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20    /* Content of 
2cb0: 74 68 65 20 6e 6f 64 65 2c 20 61 73 20 73 68 6f  the node, as sho
2cc0: 75 6c 64 20 62 65 20 6f 6e 20 64 69 73 6b 20 2a  uld be on disk *
2cd0: 2f 0a 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70  /.  RtreeNode *p
2ce0: 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20  Next;           
2cf0: 2f 2a 20 4e 65 78 74 20 6e 6f 64 65 20 69 6e 20  /* Next node in 
2d00: 74 68 69 73 20 68 61 73 68 20 63 6f 6c 6c 69 73  this hash collis
2d10: 69 6f 6e 20 63 68 61 69 6e 20 2a 2f 0a 7d 3b 0a  ion chain */.};.
2d20: 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  ./* Return the n
2d30: 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69  umber of cells i
2d40: 6e 20 61 20 6e 6f 64 65 20 20 2a 2f 0a 23 64 65  n a node  */.#de
2d50: 66 69 6e 65 20 4e 43 45 4c 4c 28 70 4e 6f 64 65  fine NCELL(pNode
2d60: 29 20 72 65 61 64 49 6e 74 31 36 28 26 28 70 4e  ) readInt16(&(pN
2d70: 6f 64 65 29 2d 3e 7a 44 61 74 61 5b 32 5d 29 0a  ode)->zData[2]).
2d80: 0a 2f 2a 20 0a 2a 2a 20 41 20 73 69 6e 67 6c 65  ./* .** A single
2d90: 20 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6e 6f 64   cell from a nod
2da0: 65 2c 20 64 65 73 65 72 69 61 6c 69 7a 65 64 0a  e, deserialized.
2db0: 2a 2f 0a 73 74 72 75 63 74 20 52 74 72 65 65 43  */.struct RtreeC
2dc0: 65 6c 6c 20 7b 0a 20 20 69 36 34 20 69 52 6f 77  ell {.  i64 iRow
2dd0: 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
2de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2df0: 20 20 20 20 2f 2a 20 4e 6f 64 65 20 6f 72 20 65      /* Node or e
2e00: 6e 74 72 79 20 49 44 20 2a 2f 0a 20 20 52 74 72  ntry ID */.  Rtr
2e10: 65 65 43 6f 6f 72 64 20 61 43 6f 6f 72 64 5b 52  eeCoord aCoord[R
2e20: 54 52 45 45 5f 4d 41 58 5f 44 49 4d 45 4e 53 49  TREE_MAX_DIMENSI
2e30: 4f 4e 53 2a 32 5d 3b 20 20 2f 2a 20 42 6f 75 6e  ONS*2];  /* Boun
2e40: 64 69 6e 67 20 62 6f 78 20 63 6f 6f 72 64 69 6e  ding box coordin
2e50: 61 74 65 73 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a  ates */.};.../*.
2e60: 2a 2a 20 54 68 69 73 20 6f 62 6a 65 63 74 20 62  ** This object b
2e70: 65 63 6f 6d 65 73 20 74 68 65 20 73 71 6c 69 74  ecomes the sqlit
2e80: 65 33 5f 75 73 65 72 5f 64 61 74 61 28 29 20 66  e3_user_data() f
2e90: 6f 72 20 74 68 65 20 53 51 4c 20 66 75 6e 63 74  or the SQL funct
2ea0: 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61 72 65  ions.** that are
2eb0: 20 63 72 65 61 74 65 64 20 62 79 20 73 71 6c 69   created by sqli
2ec0: 74 65 33 5f 72 74 72 65 65 5f 67 65 6f 6d 65 74  te3_rtree_geomet
2ed0: 72 79 5f 63 61 6c 6c 62 61 63 6b 28 29 20 61 6e  ry_callback() an
2ee0: 64 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 72 74 72  d.** sqlite3_rtr
2ef0: 65 65 5f 71 75 65 72 79 5f 63 61 6c 6c 62 61 63  ee_query_callbac
2f00: 6b 28 29 20 61 6e 64 20 77 68 69 63 68 20 61 70  k() and which ap
2f10: 70 65 61 72 20 6f 6e 20 74 68 65 20 72 69 67 68  pear on the righ
2f20: 74 20 6f 66 20 4d 41 54 43 48 0a 2a 2a 20 6f 70  t of MATCH.** op
2f30: 65 72 61 74 6f 72 73 20 69 6e 20 6f 72 64 65 72  erators in order
2f40: 20 74 6f 20 63 6f 6e 73 74 72 61 69 6e 20 61 20   to constrain a 
2f50: 73 65 61 72 63 68 2e 0a 2a 2a 0a 2a 2a 20 78 47  search..**.** xG
2f60: 65 6f 6d 20 61 6e 64 20 78 51 75 65 72 79 46 75  eom and xQueryFu
2f70: 6e 63 20 61 72 65 20 74 68 65 20 63 61 6c 6c 62  nc are the callb
2f80: 61 63 6b 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  ack functions.  
2f90: 45 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 0a  Exactly one of .
2fa0: 2a 2a 20 78 47 65 6f 6d 20 61 6e 64 20 78 51 75  ** xGeom and xQu
2fb0: 65 72 79 46 75 6e 63 20 66 69 65 6c 64 73 20 69  eryFunc fields i
2fc0: 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 64 65 70 65  s non-NULL, depe
2fd0: 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72  nding on whether
2fe0: 20 74 68 65 0a 2a 2a 20 53 51 4c 20 66 75 6e 63   the.** SQL func
2ff0: 74 69 6f 6e 20 77 61 73 20 63 72 65 61 74 65 64  tion was created
3000: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 72   using sqlite3_r
3010: 74 72 65 65 5f 67 65 6f 6d 65 74 72 79 5f 63 61  tree_geometry_ca
3020: 6c 6c 62 61 63 6b 28 29 20 6f 72 0a 2a 2a 20 73  llback() or.** s
3030: 71 6c 69 74 65 33 5f 72 74 72 65 65 5f 71 75 65  qlite3_rtree_que
3040: 72 79 5f 63 61 6c 6c 62 61 63 6b 28 29 2e 0a 2a  ry_callback()..*
3050: 2a 20 0a 2a 2a 20 54 68 69 73 20 6f 62 6a 65 63  * .** This objec
3060: 74 20 69 73 20 64 65 6c 65 74 65 64 20 61 75 74  t is deleted aut
3070: 6f 6d 61 74 69 63 61 6c 6c 79 20 62 79 20 74 68  omatically by th
3080: 65 20 64 65 73 74 72 75 63 74 6f 72 20 6d 65 63  e destructor mec
3090: 68 61 6e 69 73 6d 20 69 6e 0a 2a 2a 20 73 71 6c  hanism in.** sql
30a0: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
30b0: 74 69 6f 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 73 74  tion_v2()..*/.st
30c0: 72 75 63 74 20 52 74 72 65 65 47 65 6f 6d 43 61  ruct RtreeGeomCa
30d0: 6c 6c 62 61 63 6b 20 7b 0a 20 20 69 6e 74 20 28  llback {.  int (
30e0: 2a 78 47 65 6f 6d 29 28 73 71 6c 69 74 65 33 5f  *xGeom)(sqlite3_
30f0: 72 74 72 65 65 5f 67 65 6f 6d 65 74 72 79 2a 2c  rtree_geometry*,
3100: 20 69 6e 74 2c 20 52 74 72 65 65 44 56 61 6c 75   int, RtreeDValu
3110: 65 2a 2c 20 69 6e 74 2a 29 3b 0a 20 20 69 6e 74  e*, int*);.  int
3120: 20 28 2a 78 51 75 65 72 79 46 75 6e 63 29 28 73   (*xQueryFunc)(s
3130: 71 6c 69 74 65 33 5f 72 74 72 65 65 5f 71 75 65  qlite3_rtree_que
3140: 72 79 5f 69 6e 66 6f 2a 29 3b 0a 20 20 76 6f 69  ry_info*);.  voi
3150: 64 20 28 2a 78 44 65 73 74 72 75 63 74 6f 72 29  d (*xDestructor)
3160: 28 76 6f 69 64 2a 29 3b 0a 20 20 76 6f 69 64 20  (void*);.  void 
3170: 2a 70 43 6f 6e 74 65 78 74 3b 0a 7d 3b 0a 0a 2f  *pContext;.};../
3180: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
3190: 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75   of this structu
31a0: 72 65 20 28 69 6e 20 74 68 65 20 66 6f 72 6d 20  re (in the form 
31b0: 6f 66 20 61 20 42 4c 4f 42 29 20 69 73 20 72 65  of a BLOB) is re
31c0: 74 75 72 6e 65 64 20 62 79 0a 2a 2a 20 74 68 65  turned by.** the
31d0: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20 74   SQL functions t
31e0: 68 61 74 20 73 71 6c 69 74 65 33 5f 72 74 72 65  hat sqlite3_rtre
31f0: 65 5f 67 65 6f 6d 65 74 72 79 5f 63 61 6c 6c 62  e_geometry_callb
3200: 61 63 6b 28 29 20 61 6e 64 0a 2a 2a 20 73 71 6c  ack() and.** sql
3210: 69 74 65 33 5f 72 74 72 65 65 5f 71 75 65 72 79  ite3_rtree_query
3220: 5f 63 61 6c 6c 62 61 63 6b 28 29 20 63 72 65 61  _callback() crea
3230: 74 65 2c 20 61 6e 64 20 69 73 20 72 65 61 64 20  te, and is read 
3240: 61 73 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  as the right-han
3250: 64 0a 2a 2a 20 6f 70 65 72 61 6e 64 20 74 6f 20  d.** operand to 
3260: 74 68 65 20 4d 41 54 43 48 20 6f 70 65 72 61 74  the MATCH operat
3270: 6f 72 20 6f 66 20 61 6e 20 52 2d 54 72 65 65 2e  or of an R-Tree.
3280: 0a 2a 2f 0a 73 74 72 75 63 74 20 52 74 72 65 65  .*/.struct Rtree
3290: 4d 61 74 63 68 41 72 67 20 7b 0a 20 20 75 33 32  MatchArg {.  u32
32a0: 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20   iSize;         
32b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
32c0: 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20   of this object 
32d0: 2a 2f 0a 20 20 52 74 72 65 65 47 65 6f 6d 43 61  */.  RtreeGeomCa
32e0: 6c 6c 62 61 63 6b 20 63 62 3b 20 20 20 20 20 20  llback cb;      
32f0: 20 2f 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20 74   /* Info about t
3300: 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63  he callback func
3310: 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  tions */.  int n
3320: 50 61 72 61 6d 3b 20 20 20 20 20 20 20 20 20 20  Param;          
3330: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3340: 20 6f 66 20 70 61 72 61 6d 65 74 65 72 73 20 74   of parameters t
3350: 6f 20 74 68 65 20 53 51 4c 20 66 75 6e 63 74 69  o the SQL functi
3360: 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  on */.  sqlite3_
3370: 76 61 6c 75 65 20 2a 2a 61 70 53 71 6c 50 61 72  value **apSqlPar
3380: 61 6d 3b 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20  am; /* Original 
3390: 53 51 4c 20 70 61 72 61 6d 65 74 65 72 20 76 61  SQL parameter va
33a0: 6c 75 65 73 20 2a 2f 0a 20 20 52 74 72 65 65 44  lues */.  RtreeD
33b0: 56 61 6c 75 65 20 61 50 61 72 61 6d 5b 31 5d 3b  Value aParam[1];
33c0: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 73 20        /* Values 
33d0: 66 6f 72 20 70 61 72 61 6d 65 74 65 72 73 20 74  for parameters t
33e0: 6f 20 74 68 65 20 53 51 4c 20 66 75 6e 63 74 69  o the SQL functi
33f0: 6f 6e 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 6e 64 65  on */.};..#ifnde
3400: 66 20 4d 41 58 0a 23 20 64 65 66 69 6e 65 20 4d  f MAX.# define M
3410: 41 58 28 78 2c 79 29 20 28 28 78 29 20 3c 20 28  AX(x,y) ((x) < (
3420: 79 29 20 3f 20 28 79 29 20 3a 20 28 78 29 29 0a  y) ? (y) : (x)).
3430: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4d  #endif.#ifndef M
3440: 49 4e 0a 23 20 64 65 66 69 6e 65 20 4d 49 4e 28  IN.# define MIN(
3450: 78 2c 79 29 20 28 28 78 29 20 3e 20 28 79 29 20  x,y) ((x) > (y) 
3460: 3f 20 28 79 29 20 3a 20 28 78 29 29 0a 23 65 6e  ? (y) : (x)).#en
3470: 64 69 66 0a 0a 2f 2a 20 57 68 61 74 20 76 65 72  dif../* What ver
3480: 73 69 6f 6e 20 6f 66 20 47 43 43 20 69 73 20 62  sion of GCC is b
3490: 65 69 6e 67 20 75 73 65 64 2e 20 20 30 20 6d 65  eing used.  0 me
34a0: 61 6e 73 20 47 43 43 20 69 73 20 6e 6f 74 20 62  ans GCC is not b
34b0: 65 69 6e 67 20 75 73 65 64 20 2e 0a 2a 2a 20 4e  eing used ..** N
34c0: 6f 74 65 20 74 68 61 74 20 74 68 65 20 47 43 43  ote that the GCC
34d0: 5f 56 45 52 53 49 4f 4e 20 6d 61 63 72 6f 20 77  _VERSION macro w
34e0: 69 6c 6c 20 61 6c 73 6f 20 62 65 20 73 65 74 20  ill also be set 
34f0: 63 6f 72 72 65 63 74 6c 79 20 77 68 65 6e 20 75  correctly when u
3500: 73 69 6e 67 0a 2a 2a 20 63 6c 61 6e 67 2c 20 73  sing.** clang, s
3510: 69 6e 63 65 20 63 6c 61 6e 67 20 77 6f 72 6b 73  ince clang works
3520: 20 68 61 72 64 20 74 6f 20 62 65 20 67 63 63 20   hard to be gcc 
3530: 63 6f 6d 70 61 74 69 62 6c 65 2e 20 20 53 6f 20  compatible.  So 
3540: 74 68 65 20 67 63 63 0a 2a 2a 20 6f 70 74 69 6d  the gcc.** optim
3550: 69 7a 61 74 69 6f 6e 73 20 77 69 6c 6c 20 61 6c  izations will al
3560: 73 6f 20 77 6f 72 6b 20 77 68 65 6e 20 63 6f 6d  so work when com
3570: 70 69 6c 69 6e 67 20 77 69 74 68 20 63 6c 61 6e  piling with clan
3580: 67 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 47 43  g..*/.#ifndef GC
3590: 43 5f 56 45 52 53 49 4f 4e 0a 23 69 66 20 64 65  C_VERSION.#if de
35a0: 66 69 6e 65 64 28 5f 5f 47 4e 55 43 5f 5f 29 20  fined(__GNUC__) 
35b0: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
35c0: 54 45 5f 44 49 53 41 42 4c 45 5f 49 4e 54 52 49  TE_DISABLE_INTRI
35d0: 4e 53 49 43 29 0a 23 20 64 65 66 69 6e 65 20 47  NSIC).# define G
35e0: 43 43 5f 56 45 52 53 49 4f 4e 20 28 5f 5f 47 4e  CC_VERSION (__GN
35f0: 55 43 5f 5f 2a 31 30 30 30 30 30 30 2b 5f 5f 47  UC__*1000000+__G
3600: 4e 55 43 5f 4d 49 4e 4f 52 5f 5f 2a 31 30 30 30  NUC_MINOR__*1000
3610: 2b 5f 5f 47 4e 55 43 5f 50 41 54 43 48 4c 45 56  +__GNUC_PATCHLEV
3620: 45 4c 5f 5f 29 0a 23 65 6c 73 65 0a 23 20 64 65  EL__).#else.# de
3630: 66 69 6e 65 20 47 43 43 5f 56 45 52 53 49 4f 4e  fine GCC_VERSION
3640: 20 30 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66   0.#endif.#endif
3650: 0a 0a 2f 2a 20 54 68 65 20 74 65 73 74 63 61 73  ../* The testcas
3660: 65 28 29 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64  e() macro should
3670: 20 61 6c 72 65 61 64 79 20 62 65 20 64 65 66 69   already be defi
3680: 6e 65 64 20 69 6e 20 74 68 65 20 61 6d 61 6c 67  ned in the amalg
3690: 61 6d 61 74 69 6f 6e 2e 20 20 49 66 0a 2a 2a 20  amation.  If.** 
36a0: 69 74 20 69 73 20 6e 6f 74 2c 20 6d 61 6b 65 20  it is not, make 
36b0: 69 74 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 23  it a no-op..*/.#
36c0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 41 4d  ifndef SQLITE_AM
36d0: 41 4c 47 41 4d 41 54 49 4f 4e 0a 23 20 64 65 66  ALGAMATION.# def
36e0: 69 6e 65 20 74 65 73 74 63 61 73 65 28 58 29 0a  ine testcase(X).
36f0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61  #endif../*.** Ma
3700: 63 72 6f 73 20 74 6f 20 64 65 74 65 72 6d 69 6e  cros to determin
3710: 65 20 77 68 65 74 68 65 72 20 74 68 65 20 6d 61  e whether the ma
3720: 63 68 69 6e 65 20 69 73 20 62 69 67 20 6f 72 20  chine is big or 
3730: 6c 69 74 74 6c 65 20 65 6e 64 69 61 6e 2c 0a 2a  little endian,.*
3740: 2a 20 61 6e 64 20 77 68 65 74 68 65 72 20 6f 72  * and whether or
3750: 20 6e 6f 74 20 74 68 61 74 20 64 65 74 65 72 6d   not that determ
3760: 69 6e 61 74 69 6f 6e 20 69 73 20 72 75 6e 2d 74  ination is run-t
3770: 69 6d 65 20 6f 72 20 63 6f 6d 70 69 6c 65 2d 74  ime or compile-t
3780: 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 62  ime..**.** For b
3790: 65 73 74 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c  est performance,
37a0: 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   an attempt is m
37b0: 61 64 65 20 74 6f 20 67 75 65 73 73 20 61 74 20  ade to guess at 
37c0: 74 68 65 20 62 79 74 65 2d 6f 72 64 65 72 0a 2a  the byte-order.*
37d0: 2a 20 75 73 69 6e 67 20 43 2d 70 72 65 70 72 6f  * using C-prepro
37e0: 63 65 73 73 6f 72 20 6d 61 63 72 6f 73 2e 20 20  cessor macros.  
37f0: 49 66 20 74 68 61 74 20 69 73 20 75 6e 73 75 63  If that is unsuc
3800: 63 65 73 73 66 75 6c 2c 20 6f 72 20 69 66 0a 2a  cessful, or if.*
3810: 2a 20 2d 44 53 51 4c 49 54 45 5f 52 55 4e 54 49  * -DSQLITE_RUNTI
3820: 4d 45 5f 42 59 54 45 4f 52 44 45 52 3d 31 20 69  ME_BYTEORDER=1 i
3830: 73 20 73 65 74 2c 20 74 68 65 6e 20 62 79 74 65  s set, then byte
3840: 2d 6f 72 64 65 72 20 69 73 20 64 65 74 65 72 6d  -order is determ
3850: 69 6e 65 64 0a 2a 2a 20 61 74 20 72 75 6e 2d 74  ined.** at run-t
3860: 69 6d 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ime..*/.#ifndef 
3870: 53 51 4c 49 54 45 5f 42 59 54 45 4f 52 44 45 52  SQLITE_BYTEORDER
3880: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 69 33 38  .#if defined(i38
3890: 36 29 20 20 20 20 20 7c 7c 20 64 65 66 69 6e 65  6)     || define
38a0: 64 28 5f 5f 69 33 38 36 5f 5f 29 20 20 20 7c 7c  d(__i386__)   ||
38b0: 20 64 65 66 69 6e 65 64 28 5f 4d 5f 49 58 38 36   defined(_M_IX86
38c0: 29 20 7c 7c 20 20 20 20 5c 0a 20 20 20 20 64 65  ) ||    \.    de
38d0: 66 69 6e 65 64 28 5f 5f 78 38 36 5f 36 34 29 20  fined(__x86_64) 
38e0: 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 78 38 36  || defined(__x86
38f0: 5f 36 34 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65  _64__) || define
3900: 64 28 5f 4d 5f 58 36 34 29 20 20 7c 7c 20 20 20  d(_M_X64)  ||   
3910: 20 5c 0a 20 20 20 20 64 65 66 69 6e 65 64 28 5f   \.    defined(_
3920: 4d 5f 41 4d 44 36 34 29 20 7c 7c 20 64 65 66 69  M_AMD64) || defi
3930: 6e 65 64 28 5f 4d 5f 41 52 4d 29 20 20 20 20 20  ned(_M_ARM)     
3940: 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 78 38 36  || defined(__x86
3950: 29 20 20 20 7c 7c 20 20 20 20 5c 0a 20 20 20 20  )   ||    \.    
3960: 64 65 66 69 6e 65 64 28 5f 5f 61 72 6d 5f 5f 29  defined(__arm__)
3970: 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
3980: 5f 42 59 54 45 4f 52 44 45 52 20 20 20 20 31 32  _BYTEORDER    12
3990: 33 34 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  34.#elif defined
39a0: 28 73 70 61 72 63 29 20 20 20 20 7c 7c 20 64 65  (sparc)    || de
39b0: 66 69 6e 65 64 28 5f 5f 70 70 63 5f 5f 29 0a 23  fined(__ppc__).#
39c0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 42   define SQLITE_B
39d0: 59 54 45 4f 52 44 45 52 20 20 20 20 34 33 32 31  YTEORDER    4321
39e0: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
39f0: 53 51 4c 49 54 45 5f 42 59 54 45 4f 52 44 45 52  SQLITE_BYTEORDER
3a00: 20 20 20 20 30 20 20 20 20 20 2f 2a 20 30 20 6d      0     /* 0 m
3a10: 65 61 6e 73 20 22 75 6e 6b 6e 6f 77 6e 20 61 74  eans "unknown at
3a20: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 22 20 2a   compile-time" *
3a30: 2f 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  /.#endif.#endif.
3a40: 0a 0a 2f 2a 20 57 68 61 74 20 76 65 72 73 69 6f  ../* What versio
3a50: 6e 20 6f 66 20 4d 53 56 43 20 69 73 20 62 65 69  n of MSVC is bei
3a60: 6e 67 20 75 73 65 64 2e 20 20 30 20 6d 65 61 6e  ng used.  0 mean
3a70: 73 20 4d 53 56 43 20 69 73 20 6e 6f 74 20 62 65  s MSVC is not be
3a80: 69 6e 67 20 75 73 65 64 20 2a 2f 0a 23 69 66 6e  ing used */.#ifn
3a90: 64 65 66 20 4d 53 56 43 5f 56 45 52 53 49 4f 4e  def MSVC_VERSION
3aa0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 4d 53  .#if defined(_MS
3ab0: 43 5f 56 45 52 29 20 26 26 20 21 64 65 66 69 6e  C_VER) && !defin
3ac0: 65 64 28 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  ed(SQLITE_DISABL
3ad0: 45 5f 49 4e 54 52 49 4e 53 49 43 29 0a 23 20 64  E_INTRINSIC).# d
3ae0: 65 66 69 6e 65 20 4d 53 56 43 5f 56 45 52 53 49  efine MSVC_VERSI
3af0: 4f 4e 20 5f 4d 53 43 5f 56 45 52 0a 23 65 6c 73  ON _MSC_VER.#els
3b00: 65 0a 23 20 64 65 66 69 6e 65 20 4d 53 56 43 5f  e.# define MSVC_
3b10: 56 45 52 53 49 4f 4e 20 30 0a 23 65 6e 64 69 66  VERSION 0.#endif
3b20: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46  .#endif../*.** F
3b30: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 64 65 73 65  unctions to dese
3b40: 72 69 61 6c 69 7a 65 20 61 20 31 36 20 62 69 74  rialize a 16 bit
3b50: 20 69 6e 74 65 67 65 72 2c 20 33 32 20 62 69 74   integer, 32 bit
3b60: 20 72 65 61 6c 20 6e 75 6d 62 65 72 20 61 6e 64   real number and
3b70: 0a 2a 2a 20 36 34 20 62 69 74 20 69 6e 74 65 67  .** 64 bit integ
3b80: 65 72 2e 20 54 68 65 20 64 65 73 65 72 69 61 6c  er. The deserial
3b90: 69 7a 65 64 20 76 61 6c 75 65 20 69 73 20 72 65  ized value is re
3ba0: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
3bb0: 63 20 69 6e 74 20 72 65 61 64 49 6e 74 31 36 28  c int readInt16(
3bc0: 75 38 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  u8 *p){.  return
3bd0: 20 28 70 5b 30 5d 3c 3c 38 29 20 2b 20 70 5b 31   (p[0]<<8) + p[1
3be0: 5d 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  ];.}.static void
3bf0: 20 72 65 61 64 43 6f 6f 72 64 28 75 38 20 2a 70   readCoord(u8 *p
3c00: 2c 20 52 74 72 65 65 43 6f 6f 72 64 20 2a 70 43  , RtreeCoord *pC
3c10: 6f 6f 72 64 29 7b 0a 20 20 61 73 73 65 72 74 28  oord){.  assert(
3c20: 20 28 28 28 28 63 68 61 72 2a 29 70 29 20 2d 20   ((((char*)p) - 
3c30: 28 63 68 61 72 2a 29 30 29 26 33 29 3d 3d 30 20  (char*)0)&3)==0 
3c40: 29 3b 20 20 2f 2a 20 70 20 69 73 20 61 6c 77 61  );  /* p is alwa
3c50: 79 73 20 34 2d 62 79 74 65 20 61 6c 69 67 6e 65  ys 4-byte aligne
3c60: 64 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  d */.#if SQLITE_
3c70: 42 59 54 45 4f 52 44 45 52 3d 3d 31 32 33 34 20  BYTEORDER==1234 
3c80: 26 26 20 4d 53 56 43 5f 56 45 52 53 49 4f 4e 3e  && MSVC_VERSION>
3c90: 3d 31 33 30 30 0a 20 20 70 43 6f 6f 72 64 2d 3e  =1300.  pCoord->
3ca0: 75 20 3d 20 5f 62 79 74 65 73 77 61 70 5f 75 6c  u = _byteswap_ul
3cb0: 6f 6e 67 28 2a 28 75 33 32 2a 29 70 29 3b 0a 23  ong(*(u32*)p);.#
3cc0: 65 6c 69 66 20 53 51 4c 49 54 45 5f 42 59 54 45  elif SQLITE_BYTE
3cd0: 4f 52 44 45 52 3d 3d 31 32 33 34 20 26 26 20 47  ORDER==1234 && G
3ce0: 43 43 5f 56 45 52 53 49 4f 4e 3e 3d 34 30 30 33  CC_VERSION>=4003
3cf0: 30 30 30 0a 20 20 70 43 6f 6f 72 64 2d 3e 75 20  000.  pCoord->u 
3d00: 3d 20 5f 5f 62 75 69 6c 74 69 6e 5f 62 73 77 61  = __builtin_bswa
3d10: 70 33 32 28 2a 28 75 33 32 2a 29 70 29 3b 0a 23  p32(*(u32*)p);.#
3d20: 65 6c 69 66 20 53 51 4c 49 54 45 5f 42 59 54 45  elif SQLITE_BYTE
3d30: 4f 52 44 45 52 3d 3d 34 33 32 31 0a 20 20 70 43  ORDER==4321.  pC
3d40: 6f 6f 72 64 2d 3e 75 20 3d 20 2a 28 75 33 32 2a  oord->u = *(u32*
3d50: 29 70 3b 0a 23 65 6c 73 65 0a 20 20 70 43 6f 6f  )p;.#else.  pCoo
3d60: 72 64 2d 3e 75 20 3d 20 28 0a 20 20 20 20 28 28  rd->u = (.    ((
3d70: 28 75 33 32 29 70 5b 30 5d 29 20 3c 3c 20 32 34  (u32)p[0]) << 24
3d80: 29 20 2b 20 0a 20 20 20 20 28 28 28 75 33 32 29  ) + .    (((u32)
3d90: 70 5b 31 5d 29 20 3c 3c 20 31 36 29 20 2b 20 0a  p[1]) << 16) + .
3da0: 20 20 20 20 28 28 28 75 33 32 29 70 5b 32 5d 29      (((u32)p[2])
3db0: 20 3c 3c 20 20 38 29 20 2b 20 0a 20 20 20 20 28   <<  8) + .    (
3dc0: 28 28 75 33 32 29 70 5b 33 5d 29 20 3c 3c 20 20  ((u32)p[3]) <<  
3dd0: 30 29 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a 7d  0).  );.#endif.}
3de0: 0a 73 74 61 74 69 63 20 69 36 34 20 72 65 61 64  .static i64 read
3df0: 49 6e 74 36 34 28 75 38 20 2a 70 29 7b 0a 23 69  Int64(u8 *p){.#i
3e00: 66 20 53 51 4c 49 54 45 5f 42 59 54 45 4f 52 44  f SQLITE_BYTEORD
3e10: 45 52 3d 3d 31 32 33 34 20 26 26 20 4d 53 56 43  ER==1234 && MSVC
3e20: 5f 56 45 52 53 49 4f 4e 3e 3d 31 33 30 30 0a 20  _VERSION>=1300. 
3e30: 20 75 36 34 20 78 3b 0a 20 20 6d 65 6d 63 70 79   u64 x;.  memcpy
3e40: 28 26 78 2c 20 70 2c 20 38 29 3b 0a 20 20 72 65  (&x, p, 8);.  re
3e50: 74 75 72 6e 20 28 69 36 34 29 5f 62 79 74 65 73  turn (i64)_bytes
3e60: 77 61 70 5f 75 69 6e 74 36 34 28 78 29 3b 0a 23  wap_uint64(x);.#
3e70: 65 6c 69 66 20 53 51 4c 49 54 45 5f 42 59 54 45  elif SQLITE_BYTE
3e80: 4f 52 44 45 52 3d 3d 31 32 33 34 20 26 26 20 47  ORDER==1234 && G
3e90: 43 43 5f 56 45 52 53 49 4f 4e 3e 3d 34 30 30 33  CC_VERSION>=4003
3ea0: 30 30 30 0a 20 20 75 36 34 20 78 3b 0a 20 20 6d  000.  u64 x;.  m
3eb0: 65 6d 63 70 79 28 26 78 2c 20 70 2c 20 38 29 3b  emcpy(&x, p, 8);
3ec0: 0a 20 20 72 65 74 75 72 6e 20 28 69 36 34 29 5f  .  return (i64)_
3ed0: 5f 62 75 69 6c 74 69 6e 5f 62 73 77 61 70 36 34  _builtin_bswap64
3ee0: 28 78 29 3b 0a 23 65 6c 69 66 20 53 51 4c 49 54  (x);.#elif SQLIT
3ef0: 45 5f 42 59 54 45 4f 52 44 45 52 3d 3d 34 33 32  E_BYTEORDER==432
3f00: 31 0a 20 20 69 36 34 20 78 3b 0a 20 20 6d 65 6d  1.  i64 x;.  mem
3f10: 63 70 79 28 26 78 2c 20 70 2c 20 38 29 3b 0a 20  cpy(&x, p, 8);. 
3f20: 20 72 65 74 75 72 6e 20 78 3b 0a 23 65 6c 73 65   return x;.#else
3f30: 0a 20 20 72 65 74 75 72 6e 20 28 69 36 34 29 28  .  return (i64)(
3f40: 0a 20 20 20 20 28 28 28 75 36 34 29 70 5b 30 5d  .    (((u64)p[0]
3f50: 29 20 3c 3c 20 35 36 29 20 2b 20 0a 20 20 20 20  ) << 56) + .    
3f60: 28 28 28 75 36 34 29 70 5b 31 5d 29 20 3c 3c 20  (((u64)p[1]) << 
3f70: 34 38 29 20 2b 20 0a 20 20 20 20 28 28 28 75 36  48) + .    (((u6
3f80: 34 29 70 5b 32 5d 29 20 3c 3c 20 34 30 29 20 2b  4)p[2]) << 40) +
3f90: 20 0a 20 20 20 20 28 28 28 75 36 34 29 70 5b 33   .    (((u64)p[3
3fa0: 5d 29 20 3c 3c 20 33 32 29 20 2b 20 0a 20 20 20  ]) << 32) + .   
3fb0: 20 28 28 28 75 36 34 29 70 5b 34 5d 29 20 3c 3c   (((u64)p[4]) <<
3fc0: 20 32 34 29 20 2b 20 0a 20 20 20 20 28 28 28 75   24) + .    (((u
3fd0: 36 34 29 70 5b 35 5d 29 20 3c 3c 20 31 36 29 20  64)p[5]) << 16) 
3fe0: 2b 20 0a 20 20 20 20 28 28 28 75 36 34 29 70 5b  + .    (((u64)p[
3ff0: 36 5d 29 20 3c 3c 20 20 38 29 20 2b 20 0a 20 20  6]) <<  8) + .  
4000: 20 20 28 28 28 75 36 34 29 70 5b 37 5d 29 20 3c    (((u64)p[7]) <
4010: 3c 20 20 30 29 0a 20 20 29 3b 0a 23 65 6e 64 69  <  0).  );.#endi
4020: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74  f.}../*.** Funct
4030: 69 6f 6e 73 20 74 6f 20 73 65 72 69 61 6c 69 7a  ions to serializ
4040: 65 20 61 20 31 36 20 62 69 74 20 69 6e 74 65 67  e a 16 bit integ
4050: 65 72 2c 20 33 32 20 62 69 74 20 72 65 61 6c 20  er, 32 bit real 
4060: 6e 75 6d 62 65 72 20 61 6e 64 0a 2a 2a 20 36 34  number and.** 64
4070: 20 62 69 74 20 69 6e 74 65 67 65 72 2e 20 54 68   bit integer. Th
4080: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
4090: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
40a0: 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 0a  f bytes written.
40b0: 2a 2a 20 74 6f 20 74 68 65 20 61 72 67 75 6d 65  ** to the argume
40c0: 6e 74 20 62 75 66 66 65 72 20 28 61 6c 77 61 79  nt buffer (alway
40d0: 73 20 32 2c 20 34 20 61 6e 64 20 38 20 72 65 73  s 2, 4 and 8 res
40e0: 70 65 63 74 69 76 65 6c 79 29 2e 0a 2a 2f 0a 73  pectively)..*/.s
40f0: 74 61 74 69 63 20 76 6f 69 64 20 77 72 69 74 65  tatic void write
4100: 49 6e 74 31 36 28 75 38 20 2a 70 2c 20 69 6e 74  Int16(u8 *p, int
4110: 20 69 29 7b 0a 20 20 70 5b 30 5d 20 3d 20 28 69   i){.  p[0] = (i
4120: 3e 3e 20 38 29 26 30 78 46 46 3b 0a 20 20 70 5b  >> 8)&0xFF;.  p[
4130: 31 5d 20 3d 20 28 69 3e 3e 20 30 29 26 30 78 46  1] = (i>> 0)&0xF
4140: 46 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  F;.}.static int 
4150: 77 72 69 74 65 43 6f 6f 72 64 28 75 38 20 2a 70  writeCoord(u8 *p
4160: 2c 20 52 74 72 65 65 43 6f 6f 72 64 20 2a 70 43  , RtreeCoord *pC
4170: 6f 6f 72 64 29 7b 0a 20 20 75 33 32 20 69 3b 0a  oord){.  u32 i;.
4180: 20 20 61 73 73 65 72 74 28 20 28 28 28 28 63 68    assert( ((((ch
4190: 61 72 2a 29 70 29 20 2d 20 28 63 68 61 72 2a 29  ar*)p) - (char*)
41a0: 30 29 26 33 29 3d 3d 30 20 29 3b 20 20 2f 2a 20  0)&3)==0 );  /* 
41b0: 70 20 69 73 20 61 6c 77 61 79 73 20 34 2d 62 79  p is always 4-by
41c0: 74 65 20 61 6c 69 67 6e 65 64 20 2a 2f 0a 20 20  te aligned */.  
41d0: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 52  assert( sizeof(R
41e0: 74 72 65 65 43 6f 6f 72 64 29 3d 3d 34 20 29 3b  treeCoord)==4 );
41f0: 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f  .  assert( sizeo
4200: 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a 23 69 66  f(u32)==4 );.#if
4210: 20 53 51 4c 49 54 45 5f 42 59 54 45 4f 52 44 45   SQLITE_BYTEORDE
4220: 52 3d 3d 31 32 33 34 20 26 26 20 47 43 43 5f 56  R==1234 && GCC_V
4230: 45 52 53 49 4f 4e 3e 3d 34 30 30 33 30 30 30 0a  ERSION>=4003000.
4240: 20 20 69 20 3d 20 5f 5f 62 75 69 6c 74 69 6e 5f    i = __builtin_
4250: 62 73 77 61 70 33 32 28 70 43 6f 6f 72 64 2d 3e  bswap32(pCoord->
4260: 75 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 2c 20  u);.  memcpy(p, 
4270: 26 69 2c 20 34 29 3b 0a 23 65 6c 69 66 20 53 51  &i, 4);.#elif SQ
4280: 4c 49 54 45 5f 42 59 54 45 4f 52 44 45 52 3d 3d  LITE_BYTEORDER==
4290: 31 32 33 34 20 26 26 20 4d 53 56 43 5f 56 45 52  1234 && MSVC_VER
42a0: 53 49 4f 4e 3e 3d 31 33 30 30 0a 20 20 69 20 3d  SION>=1300.  i =
42b0: 20 5f 62 79 74 65 73 77 61 70 5f 75 6c 6f 6e 67   _byteswap_ulong
42c0: 28 70 43 6f 6f 72 64 2d 3e 75 29 3b 0a 20 20 6d  (pCoord->u);.  m
42d0: 65 6d 63 70 79 28 70 2c 20 26 69 2c 20 34 29 3b  emcpy(p, &i, 4);
42e0: 0a 23 65 6c 69 66 20 53 51 4c 49 54 45 5f 42 59  .#elif SQLITE_BY
42f0: 54 45 4f 52 44 45 52 3d 3d 34 33 32 31 0a 20 20  TEORDER==4321.  
4300: 69 20 3d 20 70 43 6f 6f 72 64 2d 3e 75 3b 0a 20  i = pCoord->u;. 
4310: 20 6d 65 6d 63 70 79 28 70 2c 20 26 69 2c 20 34   memcpy(p, &i, 4
4320: 29 3b 0a 23 65 6c 73 65 0a 20 20 69 20 3d 20 70  );.#else.  i = p
4330: 43 6f 6f 72 64 2d 3e 75 3b 0a 20 20 70 5b 30 5d  Coord->u;.  p[0]
4340: 20 3d 20 28 69 3e 3e 32 34 29 26 30 78 46 46 3b   = (i>>24)&0xFF;
4350: 0a 20 20 70 5b 31 5d 20 3d 20 28 69 3e 3e 31 36  .  p[1] = (i>>16
4360: 29 26 30 78 46 46 3b 0a 20 20 70 5b 32 5d 20 3d  )&0xFF;.  p[2] =
4370: 20 28 69 3e 3e 20 38 29 26 30 78 46 46 3b 0a 20   (i>> 8)&0xFF;. 
4380: 20 70 5b 33 5d 20 3d 20 28 69 3e 3e 20 30 29 26   p[3] = (i>> 0)&
4390: 30 78 46 46 3b 0a 23 65 6e 64 69 66 0a 20 20 72  0xFF;.#endif.  r
43a0: 65 74 75 72 6e 20 34 3b 0a 7d 0a 73 74 61 74 69  eturn 4;.}.stati
43b0: 63 20 69 6e 74 20 77 72 69 74 65 49 6e 74 36 34  c int writeInt64
43c0: 28 75 38 20 2a 70 2c 20 69 36 34 20 69 29 7b 0a  (u8 *p, i64 i){.
43d0: 23 69 66 20 53 51 4c 49 54 45 5f 42 59 54 45 4f  #if SQLITE_BYTEO
43e0: 52 44 45 52 3d 3d 31 32 33 34 20 26 26 20 47 43  RDER==1234 && GC
43f0: 43 5f 56 45 52 53 49 4f 4e 3e 3d 34 30 30 33 30  C_VERSION>=40030
4400: 30 30 0a 20 20 69 20 3d 20 28 69 36 34 29 5f 5f  00.  i = (i64)__
4410: 62 75 69 6c 74 69 6e 5f 62 73 77 61 70 36 34 28  builtin_bswap64(
4420: 28 75 36 34 29 69 29 3b 0a 20 20 6d 65 6d 63 70  (u64)i);.  memcp
4430: 79 28 70 2c 20 26 69 2c 20 38 29 3b 0a 23 65 6c  y(p, &i, 8);.#el
4440: 69 66 20 53 51 4c 49 54 45 5f 42 59 54 45 4f 52  if SQLITE_BYTEOR
4450: 44 45 52 3d 3d 31 32 33 34 20 26 26 20 4d 53 56  DER==1234 && MSV
4460: 43 5f 56 45 52 53 49 4f 4e 3e 3d 31 33 30 30 0a  C_VERSION>=1300.
4470: 20 20 69 20 3d 20 28 69 36 34 29 5f 62 79 74 65    i = (i64)_byte
4480: 73 77 61 70 5f 75 69 6e 74 36 34 28 28 75 36 34  swap_uint64((u64
4490: 29 69 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 2c  )i);.  memcpy(p,
44a0: 20 26 69 2c 20 38 29 3b 0a 23 65 6c 69 66 20 53   &i, 8);.#elif S
44b0: 51 4c 49 54 45 5f 42 59 54 45 4f 52 44 45 52 3d  QLITE_BYTEORDER=
44c0: 3d 34 33 32 31 0a 20 20 6d 65 6d 63 70 79 28 70  =4321.  memcpy(p
44d0: 2c 20 26 69 2c 20 38 29 3b 0a 23 65 6c 73 65 0a  , &i, 8);.#else.
44e0: 20 20 70 5b 30 5d 20 3d 20 28 69 3e 3e 35 36 29    p[0] = (i>>56)
44f0: 26 30 78 46 46 3b 0a 20 20 70 5b 31 5d 20 3d 20  &0xFF;.  p[1] = 
4500: 28 69 3e 3e 34 38 29 26 30 78 46 46 3b 0a 20 20  (i>>48)&0xFF;.  
4510: 70 5b 32 5d 20 3d 20 28 69 3e 3e 34 30 29 26 30  p[2] = (i>>40)&0
4520: 78 46 46 3b 0a 20 20 70 5b 33 5d 20 3d 20 28 69  xFF;.  p[3] = (i
4530: 3e 3e 33 32 29 26 30 78 46 46 3b 0a 20 20 70 5b  >>32)&0xFF;.  p[
4540: 34 5d 20 3d 20 28 69 3e 3e 32 34 29 26 30 78 46  4] = (i>>24)&0xF
4550: 46 3b 0a 20 20 70 5b 35 5d 20 3d 20 28 69 3e 3e  F;.  p[5] = (i>>
4560: 31 36 29 26 30 78 46 46 3b 0a 20 20 70 5b 36 5d  16)&0xFF;.  p[6]
4570: 20 3d 20 28 69 3e 3e 20 38 29 26 30 78 46 46 3b   = (i>> 8)&0xFF;
4580: 0a 20 20 70 5b 37 5d 20 3d 20 28 69 3e 3e 20 30  .  p[7] = (i>> 0
4590: 29 26 30 78 46 46 3b 0a 23 65 6e 64 69 66 0a 20  )&0xFF;.#endif. 
45a0: 20 72 65 74 75 72 6e 20 38 3b 0a 7d 0a 0a 2f 2a   return 8;.}../*
45b0: 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68  .** Increment th
45c0: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
45d0: 74 20 6f 66 20 6e 6f 64 65 20 70 2e 0a 2a 2f 0a  t of node p..*/.
45e0: 73 74 61 74 69 63 20 76 6f 69 64 20 6e 6f 64 65  static void node
45f0: 52 65 66 65 72 65 6e 63 65 28 52 74 72 65 65 4e  Reference(RtreeN
4600: 6f 64 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  ode *p){.  if( p
4610: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2b   ){.    p->nRef+
4620: 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  +;.  }.}../*.** 
4630: 43 6c 65 61 72 20 74 68 65 20 63 6f 6e 74 65 6e  Clear the conten
4640: 74 20 6f 66 20 6e 6f 64 65 20 70 20 28 73 65 74  t of node p (set
4650: 20 61 6c 6c 20 62 79 74 65 73 20 74 6f 20 30 78   all bytes to 0x
4660: 30 30 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  00)..*/.static v
4670: 6f 69 64 20 6e 6f 64 65 5a 65 72 6f 28 52 74 72  oid nodeZero(Rtr
4680: 65 65 20 2a 70 52 74 72 65 65 2c 20 52 74 72 65  ee *pRtree, Rtre
4690: 65 4e 6f 64 65 20 2a 70 29 7b 0a 20 20 6d 65 6d  eNode *p){.  mem
46a0: 73 65 74 28 26 70 2d 3e 7a 44 61 74 61 5b 32 5d  set(&p->zData[2]
46b0: 2c 20 30 2c 20 70 52 74 72 65 65 2d 3e 69 4e 6f  , 0, pRtree->iNo
46c0: 64 65 53 69 7a 65 2d 32 29 3b 0a 20 20 70 2d 3e  deSize-2);.  p->
46d0: 69 73 44 69 72 74 79 20 3d 20 31 3b 0a 7d 0a 0a  isDirty = 1;.}..
46e0: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 6e 6f  /*.** Given a no
46f0: 64 65 20 6e 75 6d 62 65 72 20 69 4e 6f 64 65 2c  de number iNode,
4700: 20 72 65 74 75 72 6e 20 74 68 65 20 63 6f 72 72   return the corr
4710: 65 73 70 6f 6e 64 69 6e 67 20 6b 65 79 20 74 6f  esponding key to
4720: 20 75 73 65 0a 2a 2a 20 69 6e 20 74 68 65 20 52   use.** in the R
4730: 74 72 65 65 2e 61 48 61 73 68 20 74 61 62 6c 65  tree.aHash table
4740: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4750: 6e 6f 64 65 48 61 73 68 28 69 36 34 20 69 4e 6f  nodeHash(i64 iNo
4760: 64 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 69 4e  de){.  return iN
4770: 6f 64 65 20 25 20 48 41 53 48 53 49 5a 45 3b 0a  ode % HASHSIZE;.
4780: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20  }../*.** Search 
4790: 74 68 65 20 6e 6f 64 65 20 68 61 73 68 20 74 61  the node hash ta
47a0: 62 6c 65 20 66 6f 72 20 6e 6f 64 65 20 69 4e 6f  ble for node iNo
47b0: 64 65 2e 20 49 66 20 66 6f 75 6e 64 2c 20 72 65  de. If found, re
47c0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a  turn a pointer.*
47d0: 2a 20 74 6f 20 69 74 2e 20 4f 74 68 65 72 77 69  * to it. Otherwi
47e0: 73 65 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f  se, return 0..*/
47f0: 0a 73 74 61 74 69 63 20 52 74 72 65 65 4e 6f 64  .static RtreeNod
4800: 65 20 2a 6e 6f 64 65 48 61 73 68 4c 6f 6f 6b 75  e *nodeHashLooku
4810: 70 28 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c  p(Rtree *pRtree,
4820: 20 69 36 34 20 69 4e 6f 64 65 29 7b 0a 20 20 52   i64 iNode){.  R
4830: 74 72 65 65 4e 6f 64 65 20 2a 70 3b 0a 20 20 66  treeNode *p;.  f
4840: 6f 72 28 70 3d 70 52 74 72 65 65 2d 3e 61 48 61  or(p=pRtree->aHa
4850: 73 68 5b 6e 6f 64 65 48 61 73 68 28 69 4e 6f 64  sh[nodeHash(iNod
4860: 65 29 5d 3b 20 70 20 26 26 20 70 2d 3e 69 4e 6f  e)]; p && p->iNo
4870: 64 65 21 3d 69 4e 6f 64 65 3b 20 70 3d 70 2d 3e  de!=iNode; p=p->
4880: 70 4e 65 78 74 29 3b 0a 20 20 72 65 74 75 72 6e  pNext);.  return
4890: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64   p;.}../*.** Add
48a0: 20 6e 6f 64 65 20 70 4e 6f 64 65 20 74 6f 20 74   node pNode to t
48b0: 68 65 20 6e 6f 64 65 20 68 61 73 68 20 74 61 62  he node hash tab
48c0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
48d0: 69 64 20 6e 6f 64 65 48 61 73 68 49 6e 73 65 72  id nodeHashInser
48e0: 74 28 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c  t(Rtree *pRtree,
48f0: 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 4e 6f 64   RtreeNode *pNod
4900: 65 29 7b 0a 20 20 69 6e 74 20 69 48 61 73 68 3b  e){.  int iHash;
4910: 0a 20 20 61 73 73 65 72 74 28 20 70 4e 6f 64 65  .  assert( pNode
4920: 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 20 20  ->pNext==0 );.  
4930: 69 48 61 73 68 20 3d 20 6e 6f 64 65 48 61 73 68  iHash = nodeHash
4940: 28 70 4e 6f 64 65 2d 3e 69 4e 6f 64 65 29 3b 0a  (pNode->iNode);.
4950: 20 20 70 4e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d    pNode->pNext =
4960: 20 70 52 74 72 65 65 2d 3e 61 48 61 73 68 5b 69   pRtree->aHash[i
4970: 48 61 73 68 5d 3b 0a 20 20 70 52 74 72 65 65 2d  Hash];.  pRtree-
4980: 3e 61 48 61 73 68 5b 69 48 61 73 68 5d 20 3d 20  >aHash[iHash] = 
4990: 70 4e 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pNode;.}../*.** 
49a0: 52 65 6d 6f 76 65 20 6e 6f 64 65 20 70 4e 6f 64  Remove node pNod
49b0: 65 20 66 72 6f 6d 20 74 68 65 20 6e 6f 64 65 20  e from the node 
49c0: 68 61 73 68 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73  hash table..*/.s
49d0: 74 61 74 69 63 20 76 6f 69 64 20 6e 6f 64 65 48  tatic void nodeH
49e0: 61 73 68 44 65 6c 65 74 65 28 52 74 72 65 65 20  ashDelete(Rtree 
49f0: 2a 70 52 74 72 65 65 2c 20 52 74 72 65 65 4e 6f  *pRtree, RtreeNo
4a00: 64 65 20 2a 70 4e 6f 64 65 29 7b 0a 20 20 52 74  de *pNode){.  Rt
4a10: 72 65 65 4e 6f 64 65 20 2a 2a 70 70 3b 0a 20 20  reeNode **pp;.  
4a20: 69 66 28 20 70 4e 6f 64 65 2d 3e 69 4e 6f 64 65  if( pNode->iNode
4a30: 21 3d 30 20 29 7b 0a 20 20 20 20 70 70 20 3d 20  !=0 ){.    pp = 
4a40: 26 70 52 74 72 65 65 2d 3e 61 48 61 73 68 5b 6e  &pRtree->aHash[n
4a50: 6f 64 65 48 61 73 68 28 70 4e 6f 64 65 2d 3e 69  odeHash(pNode->i
4a60: 4e 6f 64 65 29 5d 3b 0a 20 20 20 20 66 6f 72 28  Node)];.    for(
4a70: 20 3b 20 28 2a 70 70 29 21 3d 70 4e 6f 64 65 3b   ; (*pp)!=pNode;
4a80: 20 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e   pp = &(*pp)->pN
4a90: 65 78 74 29 7b 20 61 73 73 65 72 74 28 2a 70 70  ext){ assert(*pp
4aa0: 29 3b 20 7d 0a 20 20 20 20 2a 70 70 20 3d 20 70  ); }.    *pp = p
4ab0: 4e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Node->pNext;.   
4ac0: 20 70 4e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d 20   pNode->pNext = 
4ad0: 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
4ae0: 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74  Allocate and ret
4af0: 75 72 6e 20 6e 65 77 20 72 2d 74 72 65 65 20 6e  urn new r-tree n
4b00: 6f 64 65 2e 20 49 6e 69 74 69 61 6c 6c 79 2c 20  ode. Initially, 
4b10: 28 52 74 72 65 65 4e 6f 64 65 2e 69 4e 6f 64 65  (RtreeNode.iNode
4b20: 3d 3d 30 29 2c 0a 2a 2a 20 69 6e 64 69 63 61 74  ==0),.** indicat
4b30: 69 6e 67 20 74 68 61 74 20 6e 6f 64 65 20 68 61  ing that node ha
4b40: 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 61  s not yet been a
4b50: 73 73 69 67 6e 65 64 20 61 20 6e 6f 64 65 20 6e  ssigned a node n
4b60: 75 6d 62 65 72 2e 20 49 74 20 69 73 0a 2a 2a 20  umber. It is.** 
4b70: 61 73 73 69 67 6e 65 64 20 61 20 6e 6f 64 65 20  assigned a node 
4b80: 6e 75 6d 62 65 72 20 77 68 65 6e 20 6e 6f 64 65  number when node
4b90: 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65  Write() is calle
4ba0: 64 20 74 6f 20 77 72 69 74 65 20 74 68 65 0a 2a  d to write the.*
4bb0: 2a 20 6e 6f 64 65 20 63 6f 6e 74 65 6e 74 73 20  * node contents 
4bc0: 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
4bd0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 52  ase..*/.static R
4be0: 74 72 65 65 4e 6f 64 65 20 2a 6e 6f 64 65 4e 65  treeNode *nodeNe
4bf0: 77 28 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c  w(Rtree *pRtree,
4c00: 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 50 61 72   RtreeNode *pPar
4c10: 65 6e 74 29 7b 0a 20 20 52 74 72 65 65 4e 6f 64  ent){.  RtreeNod
4c20: 65 20 2a 70 4e 6f 64 65 3b 0a 20 20 70 4e 6f 64  e *pNode;.  pNod
4c30: 65 20 3d 20 28 52 74 72 65 65 4e 6f 64 65 20 2a  e = (RtreeNode *
4c40: 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
4c50: 73 69 7a 65 6f 66 28 52 74 72 65 65 4e 6f 64 65  sizeof(RtreeNode
4c60: 29 20 2b 20 70 52 74 72 65 65 2d 3e 69 4e 6f 64  ) + pRtree->iNod
4c70: 65 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 70 4e  eSize);.  if( pN
4c80: 6f 64 65 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  ode ){.    memse
4c90: 74 28 70 4e 6f 64 65 2c 20 30 2c 20 73 69 7a 65  t(pNode, 0, size
4ca0: 6f 66 28 52 74 72 65 65 4e 6f 64 65 29 20 2b 20  of(RtreeNode) + 
4cb0: 70 52 74 72 65 65 2d 3e 69 4e 6f 64 65 53 69 7a  pRtree->iNodeSiz
4cc0: 65 29 3b 0a 20 20 20 20 70 4e 6f 64 65 2d 3e 7a  e);.    pNode->z
4cd0: 44 61 74 61 20 3d 20 28 75 38 20 2a 29 26 70 4e  Data = (u8 *)&pN
4ce0: 6f 64 65 5b 31 5d 3b 0a 20 20 20 20 70 4e 6f 64  ode[1];.    pNod
4cf0: 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  e->nRef = 1;.   
4d00: 20 70 4e 6f 64 65 2d 3e 70 50 61 72 65 6e 74 20   pNode->pParent 
4d10: 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 70  = pParent;.    p
4d20: 4e 6f 64 65 2d 3e 69 73 44 69 72 74 79 20 3d 20  Node->isDirty = 
4d30: 31 3b 0a 20 20 20 20 6e 6f 64 65 52 65 66 65 72  1;.    nodeRefer
4d40: 65 6e 63 65 28 70 50 61 72 65 6e 74 29 3b 0a 20  ence(pParent);. 
4d50: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 6f 64   }.  return pNod
4d60: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  e;.}../*.** Clea
4d70: 72 20 74 68 65 20 52 74 72 65 65 2e 70 4e 6f 64  r the Rtree.pNod
4d80: 65 42 6c 6f 62 20 6f 62 6a 65 63 74 0a 2a 2f 0a  eBlob object.*/.
4d90: 73 74 61 74 69 63 20 76 6f 69 64 20 6e 6f 64 65  static void node
4da0: 42 6c 6f 62 52 65 73 65 74 28 52 74 72 65 65 20  BlobReset(Rtree 
4db0: 2a 70 52 74 72 65 65 29 7b 0a 20 20 69 66 28 20  *pRtree){.  if( 
4dc0: 70 52 74 72 65 65 2d 3e 70 4e 6f 64 65 42 6c 6f  pRtree->pNodeBlo
4dd0: 62 20 26 26 20 70 52 74 72 65 65 2d 3e 69 6e 57  b && pRtree->inW
4de0: 72 54 72 61 6e 73 3d 3d 30 20 26 26 20 70 52 74  rTrans==0 && pRt
4df0: 72 65 65 2d 3e 6e 43 75 72 73 6f 72 3d 3d 30 20  ree->nCursor==0 
4e00: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  ){.    sqlite3_b
4e10: 6c 6f 62 20 2a 70 42 6c 6f 62 20 3d 20 70 52 74  lob *pBlob = pRt
4e20: 72 65 65 2d 3e 70 4e 6f 64 65 42 6c 6f 62 3b 0a  ree->pNodeBlob;.
4e30: 20 20 20 20 70 52 74 72 65 65 2d 3e 70 4e 6f 64      pRtree->pNod
4e40: 65 42 6c 6f 62 20 3d 20 30 3b 0a 20 20 20 20 73  eBlob = 0;.    s
4e50: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73  qlite3_blob_clos
4e60: 65 28 70 42 6c 6f 62 29 3b 0a 20 20 7d 0a 7d 0a  e(pBlob);.  }.}.
4e70: 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20  ./*.** Obtain a 
4e80: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 20  reference to an 
4e90: 72 2d 74 72 65 65 20 6e 6f 64 65 2e 0a 2a 2f 0a  r-tree node..*/.
4ea0: 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 64 65 41  static int nodeA
4eb0: 63 71 75 69 72 65 28 0a 20 20 52 74 72 65 65 20  cquire(.  Rtree 
4ec0: 2a 70 52 74 72 65 65 2c 20 20 20 20 20 20 20 20  *pRtree,        
4ed0: 20 20 20 20 20 2f 2a 20 52 2d 74 72 65 65 20 73       /* R-tree s
4ee0: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 36  tructure */.  i6
4ef0: 34 20 69 4e 6f 64 65 2c 20 20 20 20 20 20 20 20  4 iNode,        
4f00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 64 65           /* Node
4f10: 20 6e 75 6d 62 65 72 20 74 6f 20 6c 6f 61 64 20   number to load 
4f20: 2a 2f 0a 20 20 52 74 72 65 65 4e 6f 64 65 20 2a  */.  RtreeNode *
4f30: 70 50 61 72 65 6e 74 2c 20 20 20 20 20 20 20 20  pParent,        
4f40: 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20 70 61  /* Either the pa
4f50: 72 65 6e 74 20 6e 6f 64 65 20 6f 72 20 4e 55 4c  rent node or NUL
4f60: 4c 20 2a 2f 0a 20 20 52 74 72 65 65 4e 6f 64 65  L */.  RtreeNode
4f70: 20 2a 2a 70 70 4e 6f 64 65 20 20 20 20 20 20 20   **ppNode       
4f80: 20 20 2f 2a 20 4f 55 54 3a 20 41 63 71 75 69 72    /* OUT: Acquir
4f90: 65 64 20 6e 6f 64 65 20 2a 2f 0a 29 7b 0a 20 20  ed node */.){.  
4fa0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
4fb0: 4f 4b 3b 0a 20 20 52 74 72 65 65 4e 6f 64 65 20  OK;.  RtreeNode 
4fc0: 2a 70 4e 6f 64 65 20 3d 20 30 3b 0a 0a 20 20 2f  *pNode = 0;..  /
4fd0: 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 72  * Check if the r
4fe0: 65 71 75 65 73 74 65 64 20 6e 6f 64 65 20 69 73  equested node is
4ff0: 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
5000: 68 61 73 68 20 74 61 62 6c 65 2e 20 49 66 20 73  hash table. If s
5010: 6f 2c 0a 20 20 2a 2a 20 69 6e 63 72 65 61 73 65  o,.  ** increase
5020: 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63   its reference c
5030: 6f 75 6e 74 20 61 6e 64 20 72 65 74 75 72 6e 20  ount and return 
5040: 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  it..  */.  if( (
5050: 70 4e 6f 64 65 20 3d 20 6e 6f 64 65 48 61 73 68  pNode = nodeHash
5060: 4c 6f 6f 6b 75 70 28 70 52 74 72 65 65 2c 20 69  Lookup(pRtree, i
5070: 4e 6f 64 65 29 29 20 29 7b 0a 20 20 20 20 61 73  Node)) ){.    as
5080: 73 65 72 74 28 20 21 70 50 61 72 65 6e 74 20 7c  sert( !pParent |
5090: 7c 20 21 70 4e 6f 64 65 2d 3e 70 50 61 72 65 6e  | !pNode->pParen
50a0: 74 20 7c 7c 20 70 4e 6f 64 65 2d 3e 70 50 61 72  t || pNode->pPar
50b0: 65 6e 74 3d 3d 70 50 61 72 65 6e 74 20 29 3b 0a  ent==pParent );.
50c0: 20 20 20 20 69 66 28 20 70 50 61 72 65 6e 74 20      if( pParent 
50d0: 26 26 20 21 70 4e 6f 64 65 2d 3e 70 50 61 72 65  && !pNode->pPare
50e0: 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 6f 64 65  nt ){.      node
50f0: 52 65 66 65 72 65 6e 63 65 28 70 50 61 72 65 6e  Reference(pParen
5100: 74 29 3b 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d  t);.      pNode-
5110: 3e 70 50 61 72 65 6e 74 20 3d 20 70 50 61 72 65  >pParent = pPare
5120: 6e 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e  nt;.    }.    pN
5130: 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  ode->nRef++;.   
5140: 20 2a 70 70 4e 6f 64 65 20 3d 20 70 4e 6f 64 65   *ppNode = pNode
5150: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
5160: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69  ITE_OK;.  }..  i
5170: 66 28 20 70 52 74 72 65 65 2d 3e 70 4e 6f 64 65  f( pRtree->pNode
5180: 42 6c 6f 62 20 29 7b 0a 20 20 20 20 73 71 6c 69  Blob ){.    sqli
5190: 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 20  te3_blob *pBlob 
51a0: 3d 20 70 52 74 72 65 65 2d 3e 70 4e 6f 64 65 42  = pRtree->pNodeB
51b0: 6c 6f 62 3b 0a 20 20 20 20 70 52 74 72 65 65 2d  lob;.    pRtree-
51c0: 3e 70 4e 6f 64 65 42 6c 6f 62 20 3d 20 30 3b 0a  >pNodeBlob = 0;.
51d0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
51e0: 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 28 70 42 6c  _blob_reopen(pBl
51f0: 6f 62 2c 20 69 4e 6f 64 65 29 3b 0a 20 20 20 20  ob, iNode);.    
5200: 70 52 74 72 65 65 2d 3e 70 4e 6f 64 65 42 6c 6f  pRtree->pNodeBlo
5210: 62 20 3d 20 70 42 6c 6f 62 3b 0a 20 20 20 20 69  b = pBlob;.    i
5220: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 6e  f( rc ){.      n
5230: 6f 64 65 42 6c 6f 62 52 65 73 65 74 28 70 52 74  odeBlobReset(pRt
5240: 72 65 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ree);.      if( 
5250: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
5260: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
5270: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
5280: 7d 0a 20 20 69 66 28 20 70 52 74 72 65 65 2d 3e  }.  if( pRtree->
5290: 70 4e 6f 64 65 42 6c 6f 62 3d 3d 30 20 29 7b 0a  pNodeBlob==0 ){.
52a0: 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 20 3d      char *zTab =
52b0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
52c0: 28 22 25 73 5f 6e 6f 64 65 22 2c 20 70 52 74 72  ("%s_node", pRtr
52d0: 65 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ee->zName);.    
52e0: 69 66 28 20 7a 54 61 62 3d 3d 30 20 29 20 72 65  if( zTab==0 ) re
52f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
5300: 4d 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  M;.    rc = sqli
5310: 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 70 52  te3_blob_open(pR
5320: 74 72 65 65 2d 3e 64 62 2c 20 70 52 74 72 65 65  tree->db, pRtree
5330: 2d 3e 7a 44 62 2c 20 7a 54 61 62 2c 20 22 64 61  ->zDb, zTab, "da
5340: 74 61 22 2c 20 69 4e 6f 64 65 2c 20 30 2c 0a 20  ta", iNode, 0,. 
5350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5360: 20 20 20 20 20 20 20 20 20 20 26 70 52 74 72 65            &pRtre
5370: 65 2d 3e 70 4e 6f 64 65 42 6c 6f 62 29 3b 0a 20  e->pNodeBlob);. 
5380: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
5390: 7a 54 61 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28  zTab);.  }.  if(
53a0: 20 72 63 20 29 7b 0a 20 20 20 20 6e 6f 64 65 42   rc ){.    nodeB
53b0: 6c 6f 62 52 65 73 65 74 28 70 52 74 72 65 65 29  lobReset(pRtree)
53c0: 3b 0a 20 20 20 20 2a 70 70 4e 6f 64 65 20 3d 20  ;.    *ppNode = 
53d0: 30 3b 0a 20 20 20 20 2f 2a 20 49 66 20 75 6e 61  0;.    /* If una
53e0: 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61 6e 20 73  ble to open an s
53f0: 71 6c 69 74 65 33 5f 62 6c 6f 62 20 6f 6e 20 74  qlite3_blob on t
5400: 68 65 20 64 65 73 69 72 65 64 20 72 6f 77 2c 20  he desired row, 
5410: 74 68 61 74 20 63 61 6e 20 6f 6e 6c 79 0a 20 20  that can only.  
5420: 20 20 2a 2a 20 62 65 20 62 65 63 61 75 73 65 20    ** be because 
5430: 74 68 65 20 73 68 61 64 6f 77 20 74 61 62 6c 65  the shadow table
5440: 73 20 68 6f 6c 64 20 65 72 72 6f 6e 65 6f 75 73  s hold erroneous
5450: 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20 69 66   data. */.    if
5460: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52  ( rc==SQLITE_ERR
5470: 4f 52 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  OR ) rc = SQLITE
5480: 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 3b 0a 20  _CORRUPT_VTAB;. 
5490: 20 7d 65 6c 73 65 20 69 66 28 20 70 52 74 72 65   }else if( pRtre
54a0: 65 2d 3e 69 4e 6f 64 65 53 69 7a 65 3d 3d 73 71  e->iNodeSize==sq
54b0: 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73  lite3_blob_bytes
54c0: 28 70 52 74 72 65 65 2d 3e 70 4e 6f 64 65 42 6c  (pRtree->pNodeBl
54d0: 6f 62 29 20 29 7b 0a 20 20 20 20 70 4e 6f 64 65  ob) ){.    pNode
54e0: 20 3d 20 28 52 74 72 65 65 4e 6f 64 65 20 2a 29   = (RtreeNode *)
54f0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73  sqlite3_malloc(s
5500: 69 7a 65 6f 66 28 52 74 72 65 65 4e 6f 64 65 29  izeof(RtreeNode)
5510: 2b 70 52 74 72 65 65 2d 3e 69 4e 6f 64 65 53 69  +pRtree->iNodeSi
5520: 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4e  ze);.    if( !pN
5530: 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ode ){.      rc 
5540: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
5550: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5560: 20 70 4e 6f 64 65 2d 3e 70 50 61 72 65 6e 74 20   pNode->pParent 
5570: 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 20  = pParent;.     
5580: 20 70 4e 6f 64 65 2d 3e 7a 44 61 74 61 20 3d 20   pNode->zData = 
5590: 28 75 38 20 2a 29 26 70 4e 6f 64 65 5b 31 5d 3b  (u8 *)&pNode[1];
55a0: 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 6e 52  .      pNode->nR
55b0: 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4e  ef = 1;.      pN
55c0: 6f 64 65 2d 3e 69 4e 6f 64 65 20 3d 20 69 4e 6f  ode->iNode = iNo
55d0: 64 65 3b 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d  de;.      pNode-
55e0: 3e 69 73 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  >isDirty = 0;.  
55f0: 20 20 20 20 70 4e 6f 64 65 2d 3e 70 4e 65 78 74      pNode->pNext
5600: 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
5610: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65   sqlite3_blob_re
5620: 61 64 28 70 52 74 72 65 65 2d 3e 70 4e 6f 64 65  ad(pRtree->pNode
5630: 42 6c 6f 62 2c 20 70 4e 6f 64 65 2d 3e 7a 44 61  Blob, pNode->zDa
5640: 74 61 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ta,.            
5650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5660: 20 70 52 74 72 65 65 2d 3e 69 4e 6f 64 65 53 69   pRtree->iNodeSi
5670: 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 6e 6f  ze, 0);.      no
5680: 64 65 52 65 66 65 72 65 6e 63 65 28 70 50 61 72  deReference(pPar
5690: 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ent);.    }.  }.
56a0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 72 6f 6f  .  /* If the roo
56b0: 74 20 6e 6f 64 65 20 77 61 73 20 6a 75 73 74 20  t node was just 
56c0: 6c 6f 61 64 65 64 2c 20 73 65 74 20 70 52 74 72  loaded, set pRtr
56d0: 65 65 2d 3e 69 44 65 70 74 68 20 74 6f 20 74 68  ee->iDepth to th
56e0: 65 20 68 65 69 67 68 74 0a 20 20 2a 2a 20 6f 66  e height.  ** of
56f0: 20 74 68 65 20 72 2d 74 72 65 65 20 73 74 72 75   the r-tree stru
5700: 63 74 75 72 65 2e 20 41 20 68 65 69 67 68 74 20  cture. A height 
5710: 6f 66 20 7a 65 72 6f 20 6d 65 61 6e 73 20 61 6c  of zero means al
5720: 6c 20 64 61 74 61 20 69 73 20 73 74 6f 72 65 64  l data is stored
5730: 20 6f 6e 0a 20 20 2a 2a 20 74 68 65 20 72 6f 6f   on.  ** the roo
5740: 74 20 6e 6f 64 65 2e 20 41 20 68 65 69 67 68 74  t node. A height
5750: 20 6f 66 20 6f 6e 65 20 6d 65 61 6e 73 20 74 68   of one means th
5760: 65 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 74 68  e children of th
5770: 65 20 72 6f 6f 74 20 6e 6f 64 65 0a 20 20 2a 2a  e root node.  **
5780: 20 61 72 65 20 74 68 65 20 6c 65 61 76 65 73 2c   are the leaves,
5790: 20 61 6e 64 20 73 6f 20 6f 6e 2e 20 49 66 20 74   and so on. If t
57a0: 68 65 20 64 65 70 74 68 20 61 73 20 73 70 65 63  he depth as spec
57b0: 69 66 69 65 64 20 6f 6e 20 74 68 65 20 72 6f 6f  ified on the roo
57c0: 74 20 6e 6f 64 65 0a 20 20 2a 2a 20 69 73 20 67  t node.  ** is g
57d0: 72 65 61 74 65 72 20 74 68 61 6e 20 52 54 52 45  reater than RTRE
57e0: 45 5f 4d 41 58 5f 44 45 50 54 48 2c 20 74 68 65  E_MAX_DEPTH, the
57f0: 20 72 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   r-tree structur
5800: 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
5810: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e  t..  */.  if( pN
5820: 6f 64 65 20 26 26 20 69 4e 6f 64 65 3d 3d 31 20  ode && iNode==1 
5830: 29 7b 0a 20 20 20 20 70 52 74 72 65 65 2d 3e 69  ){.    pRtree->i
5840: 44 65 70 74 68 20 3d 20 72 65 61 64 49 6e 74 31  Depth = readInt1
5850: 36 28 70 4e 6f 64 65 2d 3e 7a 44 61 74 61 29 3b  6(pNode->zData);
5860: 0a 20 20 20 20 69 66 28 20 70 52 74 72 65 65 2d  .    if( pRtree-
5870: 3e 69 44 65 70 74 68 3e 52 54 52 45 45 5f 4d 41  >iDepth>RTREE_MA
5880: 58 5f 44 45 50 54 48 20 29 7b 0a 20 20 20 20 20  X_DEPTH ){.     
5890: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
58a0: 52 55 50 54 5f 56 54 41 42 3b 0a 20 20 20 20 7d  RUPT_VTAB;.    }
58b0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f  .  }..  /* If no
58c0: 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
58d0: 72 65 64 20 73 6f 20 66 61 72 2c 20 63 68 65 63  red so far, chec
58e0: 6b 20 69 66 20 74 68 65 20 22 6e 75 6d 62 65 72  k if the "number
58f0: 20 6f 66 20 65 6e 74 72 69 65 73 22 0a 20 20 2a   of entries".  *
5900: 2a 20 66 69 65 6c 64 20 6f 6e 20 74 68 65 20 6e  * field on the n
5910: 6f 64 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65  ode is too large
5920: 2e 20 49 66 20 73 6f 2c 20 73 65 74 20 74 68 65  . If so, set the
5930: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f 20   return code to 
5940: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52  .  ** SQLITE_COR
5950: 52 55 50 54 5f 56 54 41 42 2e 0a 20 20 2a 2f 0a  RUPT_VTAB..  */.
5960: 20 20 69 66 28 20 70 4e 6f 64 65 20 26 26 20 72    if( pNode && r
5970: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
5980: 20 20 20 20 69 66 28 20 4e 43 45 4c 4c 28 70 4e      if( NCELL(pN
5990: 6f 64 65 29 3e 28 28 70 52 74 72 65 65 2d 3e 69  ode)>((pRtree->i
59a0: 4e 6f 64 65 53 69 7a 65 2d 34 29 2f 70 52 74 72  NodeSize-4)/pRtr
59b0: 65 65 2d 3e 6e 42 79 74 65 73 50 65 72 43 65 6c  ee->nBytesPerCel
59c0: 6c 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  l) ){.      rc =
59d0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
59e0: 56 54 41 42 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  VTAB;.    }.  }.
59f0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
5a00: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
5a10: 70 4e 6f 64 65 21 3d 30 20 29 7b 0a 20 20 20 20  pNode!=0 ){.    
5a20: 20 20 6e 6f 64 65 48 61 73 68 49 6e 73 65 72 74    nodeHashInsert
5a30: 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65 29 3b  (pRtree, pNode);
5a40: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
5a50: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
5a60: 52 52 55 50 54 5f 56 54 41 42 3b 0a 20 20 20 20  RRUPT_VTAB;.    
5a70: 7d 0a 20 20 20 20 2a 70 70 4e 6f 64 65 20 3d 20  }.    *ppNode = 
5a80: 70 4e 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pNode;.  }else{.
5a90: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
5aa0: 28 70 4e 6f 64 65 29 3b 0a 20 20 20 20 2a 70 70  (pNode);.    *pp
5ab0: 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  Node = 0;.  }.. 
5ac0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
5ad0: 2a 0a 2a 2a 20 4f 76 65 72 77 72 69 74 65 20 63  *.** Overwrite c
5ae0: 65 6c 6c 20 69 43 65 6c 6c 20 6f 66 20 6e 6f 64  ell iCell of nod
5af0: 65 20 70 4e 6f 64 65 20 77 69 74 68 20 74 68 65  e pNode with the
5b00: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 43 65   contents of pCe
5b10: 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ll..*/.static vo
5b20: 69 64 20 6e 6f 64 65 4f 76 65 72 77 72 69 74 65  id nodeOverwrite
5b30: 43 65 6c 6c 28 0a 20 20 52 74 72 65 65 20 2a 70  Cell(.  Rtree *p
5b40: 52 74 72 65 65 2c 20 20 20 20 20 20 20 20 20 20  Rtree,          
5b50: 20 20 20 2f 2a 20 54 68 65 20 6f 76 65 72 61 6c     /* The overal
5b60: 6c 20 52 2d 54 72 65 65 20 2a 2f 0a 20 20 52 74  l R-Tree */.  Rt
5b70: 72 65 65 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 20  reeNode *pNode, 
5b80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
5b90: 6e 6f 64 65 20 69 6e 74 6f 20 77 68 69 63 68 20  node into which 
5ba0: 74 68 65 20 63 65 6c 6c 20 69 73 20 74 6f 20 62  the cell is to b
5bb0: 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 52  e written */.  R
5bc0: 74 72 65 65 43 65 6c 6c 20 2a 70 43 65 6c 6c 2c  treeCell *pCell,
5bd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
5be0: 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 2a   cell to write *
5bf0: 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 20 20 20  /.  int iCell   
5c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5c10: 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20 70 4e 6f  * Index into pNo
5c20: 64 65 20 69 6e 74 6f 20 77 68 69 63 68 20 70 43  de into which pC
5c30: 65 6c 6c 20 69 73 20 77 72 69 74 74 65 6e 20 2a  ell is written *
5c40: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20  /.){.  int ii;. 
5c50: 20 75 38 20 2a 70 20 3d 20 26 70 4e 6f 64 65 2d   u8 *p = &pNode-
5c60: 3e 7a 44 61 74 61 5b 34 20 2b 20 70 52 74 72 65  >zData[4 + pRtre
5c70: 65 2d 3e 6e 42 79 74 65 73 50 65 72 43 65 6c 6c  e->nBytesPerCell
5c80: 2a 69 43 65 6c 6c 5d 3b 0a 20 20 70 20 2b 3d 20  *iCell];.  p += 
5c90: 77 72 69 74 65 49 6e 74 36 34 28 70 2c 20 70 43  writeInt64(p, pC
5ca0: 65 6c 6c 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20  ell->iRowid);.  
5cb0: 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 52 74  for(ii=0; ii<pRt
5cc0: 72 65 65 2d 3e 6e 44 69 6d 32 3b 20 69 69 2b 2b  ree->nDim2; ii++
5cd0: 29 7b 0a 20 20 20 20 70 20 2b 3d 20 77 72 69 74  ){.    p += writ
5ce0: 65 43 6f 6f 72 64 28 70 2c 20 26 70 43 65 6c 6c  eCoord(p, &pCell
5cf0: 2d 3e 61 43 6f 6f 72 64 5b 69 69 5d 29 3b 0a 20  ->aCoord[ii]);. 
5d00: 20 7d 0a 20 20 70 4e 6f 64 65 2d 3e 69 73 44 69   }.  pNode->isDi
5d10: 72 74 79 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  rty = 1;.}../*.*
5d20: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 63 65 6c  * Remove the cel
5d30: 6c 20 77 69 74 68 20 69 6e 64 65 78 20 69 43 65  l with index iCe
5d40: 6c 6c 20 66 72 6f 6d 20 6e 6f 64 65 20 70 4e 6f  ll from node pNo
5d50: 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  de..*/.static vo
5d60: 69 64 20 6e 6f 64 65 44 65 6c 65 74 65 43 65 6c  id nodeDeleteCel
5d70: 6c 28 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c  l(Rtree *pRtree,
5d80: 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 4e 6f 64   RtreeNode *pNod
5d90: 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20  e, int iCell){. 
5da0: 20 75 38 20 2a 70 44 73 74 20 3d 20 26 70 4e 6f   u8 *pDst = &pNo
5db0: 64 65 2d 3e 7a 44 61 74 61 5b 34 20 2b 20 70 52  de->zData[4 + pR
5dc0: 74 72 65 65 2d 3e 6e 42 79 74 65 73 50 65 72 43  tree->nBytesPerC
5dd0: 65 6c 6c 2a 69 43 65 6c 6c 5d 3b 0a 20 20 75 38  ell*iCell];.  u8
5de0: 20 2a 70 53 72 63 20 3d 20 26 70 44 73 74 5b 70   *pSrc = &pDst[p
5df0: 52 74 72 65 65 2d 3e 6e 42 79 74 65 73 50 65 72  Rtree->nBytesPer
5e00: 43 65 6c 6c 5d 3b 0a 20 20 69 6e 74 20 6e 42 79  Cell];.  int nBy
5e10: 74 65 20 3d 20 28 4e 43 45 4c 4c 28 70 4e 6f 64  te = (NCELL(pNod
5e20: 65 29 20 2d 20 69 43 65 6c 6c 20 2d 20 31 29 20  e) - iCell - 1) 
5e30: 2a 20 70 52 74 72 65 65 2d 3e 6e 42 79 74 65 73  * pRtree->nBytes
5e40: 50 65 72 43 65 6c 6c 3b 0a 20 20 6d 65 6d 6d 6f  PerCell;.  memmo
5e50: 76 65 28 70 44 73 74 2c 20 70 53 72 63 2c 20 6e  ve(pDst, pSrc, n
5e60: 42 79 74 65 29 3b 0a 20 20 77 72 69 74 65 49 6e  Byte);.  writeIn
5e70: 74 31 36 28 26 70 4e 6f 64 65 2d 3e 7a 44 61 74  t16(&pNode->zDat
5e80: 61 5b 32 5d 2c 20 4e 43 45 4c 4c 28 70 4e 6f 64  a[2], NCELL(pNod
5e90: 65 29 2d 31 29 3b 0a 20 20 70 4e 6f 64 65 2d 3e  e)-1);.  pNode->
5ea0: 69 73 44 69 72 74 79 20 3d 20 31 3b 0a 7d 0a 0a  isDirty = 1;.}..
5eb0: 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 74 68 65  /*.** Insert the
5ec0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 63 65 6c   contents of cel
5ed0: 6c 20 70 43 65 6c 6c 20 69 6e 74 6f 20 6e 6f 64  l pCell into nod
5ee0: 65 20 70 4e 6f 64 65 2e 20 49 66 20 74 68 65 20  e pNode. If the 
5ef0: 69 6e 73 65 72 74 0a 2a 2a 20 69 73 20 73 75 63  insert.** is suc
5f00: 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20  cessful, return 
5f10: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
5f20: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74   If there is not
5f30: 20 65 6e 6f 75 67 68 20 66 72 65 65 20 73 70 61   enough free spa
5f40: 63 65 20 69 6e 20 70 4e 6f 64 65 2c 20 72 65 74  ce in pNode, ret
5f50: 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e  urn SQLITE_FULL.
5f60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  .*/.static int n
5f70: 6f 64 65 49 6e 73 65 72 74 43 65 6c 6c 28 0a 20  odeInsertCell(. 
5f80: 20 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c 20   Rtree *pRtree, 
5f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5fa0: 2a 20 54 68 65 20 6f 76 65 72 61 6c 6c 20 52 2d  * The overall R-
5fb0: 54 72 65 65 20 2a 2f 0a 20 20 52 74 72 65 65 4e  Tree */.  RtreeN
5fc0: 6f 64 65 20 2a 70 4e 6f 64 65 2c 20 20 20 20 20  ode *pNode,     
5fd0: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
5fe0: 20 6e 65 77 20 63 65 6c 6c 20 69 6e 74 6f 20 74   new cell into t
5ff0: 68 69 73 20 6e 6f 64 65 20 2a 2f 0a 20 20 52 74  his node */.  Rt
6000: 72 65 65 43 65 6c 6c 20 2a 70 43 65 6c 6c 20 20  reeCell *pCell  
6010: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
6020: 68 65 20 63 65 6c 6c 20 74 6f 20 62 65 20 69 6e  he cell to be in
6030: 73 65 72 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 69  serted */.){.  i
6040: 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20  nt nCell;       
6050: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6060: 43 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f  Current number o
6070: 66 20 63 65 6c 6c 73 20 69 6e 20 70 4e 6f 64 65  f cells in pNode
6080: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 43 65   */.  int nMaxCe
6090: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
60a0: 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e      /* Maximum n
60b0: 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 66  umber of cells f
60c0: 6f 72 20 70 4e 6f 64 65 20 2a 2f 0a 0a 20 20 6e  or pNode */..  n
60d0: 4d 61 78 43 65 6c 6c 20 3d 20 28 70 52 74 72 65  MaxCell = (pRtre
60e0: 65 2d 3e 69 4e 6f 64 65 53 69 7a 65 2d 34 29 2f  e->iNodeSize-4)/
60f0: 70 52 74 72 65 65 2d 3e 6e 42 79 74 65 73 50 65  pRtree->nBytesPe
6100: 72 43 65 6c 6c 3b 0a 20 20 6e 43 65 6c 6c 20 3d  rCell;.  nCell =
6110: 20 4e 43 45 4c 4c 28 70 4e 6f 64 65 29 3b 0a 0a   NCELL(pNode);..
6120: 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c    assert( nCell<
6130: 3d 6e 4d 61 78 43 65 6c 6c 20 29 3b 0a 20 20 69  =nMaxCell );.  i
6140: 66 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c  f( nCell<nMaxCel
6150: 6c 20 29 7b 0a 20 20 20 20 6e 6f 64 65 4f 76 65  l ){.    nodeOve
6160: 72 77 72 69 74 65 43 65 6c 6c 28 70 52 74 72 65  rwriteCell(pRtre
6170: 65 2c 20 70 4e 6f 64 65 2c 20 70 43 65 6c 6c 2c  e, pNode, pCell,
6180: 20 6e 43 65 6c 6c 29 3b 0a 20 20 20 20 77 72 69   nCell);.    wri
6190: 74 65 49 6e 74 31 36 28 26 70 4e 6f 64 65 2d 3e  teInt16(&pNode->
61a0: 7a 44 61 74 61 5b 32 5d 2c 20 6e 43 65 6c 6c 2b  zData[2], nCell+
61b0: 31 29 3b 0a 20 20 20 20 70 4e 6f 64 65 2d 3e 69  1);.    pNode->i
61c0: 73 44 69 72 74 79 20 3d 20 31 3b 0a 20 20 7d 0a  sDirty = 1;.  }.
61d0: 0a 20 20 72 65 74 75 72 6e 20 28 6e 43 65 6c 6c  .  return (nCell
61e0: 3d 3d 6e 4d 61 78 43 65 6c 6c 29 3b 0a 7d 0a 0a  ==nMaxCell);.}..
61f0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 64  /*.** If the nod
6200: 65 20 69 73 20 64 69 72 74 79 2c 20 77 72 69 74  e is dirty, writ
6210: 65 20 69 74 20 6f 75 74 20 74 6f 20 74 68 65 20  e it out to the 
6220: 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61  database..*/.sta
6230: 74 69 63 20 69 6e 74 20 6e 6f 64 65 57 72 69 74  tic int nodeWrit
6240: 65 28 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c  e(Rtree *pRtree,
6250: 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 4e 6f 64   RtreeNode *pNod
6260: 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
6270: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
6280: 70 4e 6f 64 65 2d 3e 69 73 44 69 72 74 79 20 29  pNode->isDirty )
6290: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  {.    sqlite3_st
62a0: 6d 74 20 2a 70 20 3d 20 70 52 74 72 65 65 2d 3e  mt *p = pRtree->
62b0: 70 57 72 69 74 65 4e 6f 64 65 3b 0a 20 20 20 20  pWriteNode;.    
62c0: 69 66 28 20 70 4e 6f 64 65 2d 3e 69 4e 6f 64 65  if( pNode->iNode
62d0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
62e0: 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 2c 20  3_bind_int64(p, 
62f0: 31 2c 20 70 4e 6f 64 65 2d 3e 69 4e 6f 64 65 29  1, pNode->iNode)
6300: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
6310: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
6320: 6e 75 6c 6c 28 70 2c 20 31 29 3b 0a 20 20 20 20  null(p, 1);.    
6330: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  }.    sqlite3_bi
6340: 6e 64 5f 62 6c 6f 62 28 70 2c 20 32 2c 20 70 4e  nd_blob(p, 2, pN
6350: 6f 64 65 2d 3e 7a 44 61 74 61 2c 20 70 52 74 72  ode->zData, pRtr
6360: 65 65 2d 3e 69 4e 6f 64 65 53 69 7a 65 2c 20 53  ee->iNodeSize, S
6370: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
6380: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28     sqlite3_step(
6390: 70 29 3b 0a 20 20 20 20 70 4e 6f 64 65 2d 3e 69  p);.    pNode->i
63a0: 73 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  sDirty = 0;.    
63b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
63c0: 65 74 28 70 29 3b 0a 20 20 20 20 69 66 28 20 70  et(p);.    if( p
63d0: 4e 6f 64 65 2d 3e 69 4e 6f 64 65 3d 3d 30 20 26  Node->iNode==0 &
63e0: 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
63f0: 29 7b 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e  ){.      pNode->
6400: 69 4e 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 5f  iNode = sqlite3_
6410: 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
6420: 64 28 70 52 74 72 65 65 2d 3e 64 62 29 3b 0a 20  d(pRtree->db);. 
6430: 20 20 20 20 20 6e 6f 64 65 48 61 73 68 49 6e 73       nodeHashIns
6440: 65 72 74 28 70 52 74 72 65 65 2c 20 70 4e 6f 64  ert(pRtree, pNod
6450: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
6460: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
6470: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 72 65  .** Release a re
6480: 66 65 72 65 6e 63 65 20 74 6f 20 61 20 6e 6f 64  ference to a nod
6490: 65 2e 20 49 66 20 74 68 65 20 6e 6f 64 65 20 69  e. If the node i
64a0: 73 20 64 69 72 74 79 20 61 6e 64 20 74 68 65 20  s dirty and the 
64b0: 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 63 6f 75  reference.** cou
64c0: 6e 74 20 64 72 6f 70 73 20 74 6f 20 7a 65 72 6f  nt drops to zero
64d0: 2c 20 74 68 65 20 6e 6f 64 65 20 64 61 74 61 20  , the node data 
64e0: 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  is written to th
64f0: 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73  e database..*/.s
6500: 74 61 74 69 63 20 69 6e 74 20 6e 6f 64 65 52 65  tatic int nodeRe
6510: 6c 65 61 73 65 28 52 74 72 65 65 20 2a 70 52 74  lease(Rtree *pRt
6520: 72 65 65 2c 20 52 74 72 65 65 4e 6f 64 65 20 2a  ree, RtreeNode *
6530: 70 4e 6f 64 65 29 7b 0a 20 20 69 6e 74 20 72 63  pNode){.  int rc
6540: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
6550: 69 66 28 20 70 4e 6f 64 65 20 29 7b 0a 20 20 20  if( pNode ){.   
6560: 20 61 73 73 65 72 74 28 20 70 4e 6f 64 65 2d 3e   assert( pNode->
6570: 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 70 4e  nRef>0 );.    pN
6580: 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20  ode->nRef--;.   
6590: 20 69 66 28 20 70 4e 6f 64 65 2d 3e 6e 52 65 66   if( pNode->nRef
65a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
65b0: 20 70 4e 6f 64 65 2d 3e 69 4e 6f 64 65 3d 3d 31   pNode->iNode==1
65c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52 74 72   ){.        pRtr
65d0: 65 65 2d 3e 69 44 65 70 74 68 20 3d 20 2d 31 3b  ee->iDepth = -1;
65e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
65f0: 66 28 20 70 4e 6f 64 65 2d 3e 70 50 61 72 65 6e  f( pNode->pParen
6600: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
6610: 3d 20 6e 6f 64 65 52 65 6c 65 61 73 65 28 70 52  = nodeRelease(pR
6620: 74 72 65 65 2c 20 70 4e 6f 64 65 2d 3e 70 50 61  tree, pNode->pPa
6630: 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rent);.      }. 
6640: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
6650: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
6660: 20 20 72 63 20 3d 20 6e 6f 64 65 57 72 69 74 65    rc = nodeWrite
6670: 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65 29 3b  (pRtree, pNode);
6680: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
6690: 6f 64 65 48 61 73 68 44 65 6c 65 74 65 28 70 52  odeHashDelete(pR
66a0: 74 72 65 65 2c 20 70 4e 6f 64 65 29 3b 0a 20 20  tree, pNode);.  
66b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
66c0: 28 70 4e 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20  (pNode);.    }. 
66d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
66e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
66f0: 74 68 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67  the 64-bit integ
6700: 65 72 20 76 61 6c 75 65 20 61 73 73 6f 63 69 61  er value associa
6710: 74 65 64 20 77 69 74 68 20 63 65 6c 6c 20 69 43  ted with cell iC
6720: 65 6c 6c 20 6f 66 0a 2a 2a 20 6e 6f 64 65 20 70  ell of.** node p
6730: 4e 6f 64 65 2e 20 49 66 20 70 4e 6f 64 65 20 69  Node. If pNode i
6740: 73 20 61 20 6c 65 61 66 20 6e 6f 64 65 2c 20 74  s a leaf node, t
6750: 68 69 73 20 69 73 20 61 20 72 6f 77 69 64 2e 20  his is a rowid. 
6760: 49 66 20 69 74 20 69 73 0a 2a 2a 20 61 6e 20 69  If it is.** an i
6770: 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 2c 20 74 68  nternal node, th
6780: 65 6e 20 74 68 65 20 36 34 2d 62 69 74 20 69 6e  en the 64-bit in
6790: 74 65 67 65 72 20 69 73 20 61 20 63 68 69 6c 64  teger is a child
67a0: 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f   page number..*/
67b0: 0a 73 74 61 74 69 63 20 69 36 34 20 6e 6f 64 65  .static i64 node
67c0: 47 65 74 52 6f 77 69 64 28 0a 20 20 52 74 72 65  GetRowid(.  Rtre
67d0: 65 20 2a 70 52 74 72 65 65 2c 20 20 20 20 20 20  e *pRtree,      
67e0: 20 2f 2a 20 54 68 65 20 6f 76 65 72 61 6c 6c 20   /* The overall 
67f0: 52 2d 54 72 65 65 20 2a 2f 0a 20 20 52 74 72 65  R-Tree */.  Rtre
6800: 65 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 20 20 20  eNode *pNode,   
6810: 20 2f 2a 20 54 68 65 20 6e 6f 64 65 20 66 72 6f   /* The node fro
6820: 6d 20 77 68 69 63 68 20 74 6f 20 65 78 74 72 61  m which to extra
6830: 63 74 20 74 68 65 20 49 44 20 2a 2f 0a 20 20 69  ct the ID */.  i
6840: 6e 74 20 69 43 65 6c 6c 20 20 20 20 20 20 20 20  nt iCell        
6850: 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20      /* The cell 
6860: 69 6e 64 65 78 20 66 72 6f 6d 20 77 68 69 63 68  index from which
6870: 20 74 6f 20 65 78 74 72 61 63 74 20 74 68 65 20   to extract the 
6880: 49 44 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72  ID */.){.  asser
6890: 74 28 20 69 43 65 6c 6c 3c 4e 43 45 4c 4c 28 70  t( iCell<NCELL(p
68a0: 4e 6f 64 65 29 20 29 3b 0a 20 20 72 65 74 75 72  Node) );.  retur
68b0: 6e 20 72 65 61 64 49 6e 74 36 34 28 26 70 4e 6f  n readInt64(&pNo
68c0: 64 65 2d 3e 7a 44 61 74 61 5b 34 20 2b 20 70 52  de->zData[4 + pR
68d0: 74 72 65 65 2d 3e 6e 42 79 74 65 73 50 65 72 43  tree->nBytesPerC
68e0: 65 6c 6c 2a 69 43 65 6c 6c 5d 29 3b 0a 7d 0a 0a  ell*iCell]);.}..
68f0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 63 6f 6f  /*.** Return coo
6900: 72 64 69 6e 61 74 65 20 69 43 6f 6f 72 64 20 66  rdinate iCoord f
6910: 72 6f 6d 20 63 65 6c 6c 20 69 43 65 6c 6c 20 69  rom cell iCell i
6920: 6e 20 6e 6f 64 65 20 70 4e 6f 64 65 2e 0a 2a 2f  n node pNode..*/
6930: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6e 6f 64  .static void nod
6940: 65 47 65 74 43 6f 6f 72 64 28 0a 20 20 52 74 72  eGetCoord(.  Rtr
6950: 65 65 20 2a 70 52 74 72 65 65 2c 20 20 20 20 20  ee *pRtree,     
6960: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
6970: 20 6f 76 65 72 61 6c 6c 20 52 2d 54 72 65 65 20   overall R-Tree 
6980: 2a 2f 0a 20 20 52 74 72 65 65 4e 6f 64 65 20 2a  */.  RtreeNode *
6990: 70 4e 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20  pNode,          
69a0: 20 20 2f 2a 20 54 68 65 20 6e 6f 64 65 20 66 72    /* The node fr
69b0: 6f 6d 20 77 68 69 63 68 20 74 6f 20 65 78 74 72  om which to extr
69c0: 61 63 74 20 61 20 63 6f 6f 72 64 69 6e 61 74 65  act a coordinate
69d0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c   */.  int iCell,
69e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
69f0: 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
6a00: 6f 66 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68  of the cell with
6a10: 69 6e 20 74 68 65 20 6e 6f 64 65 20 2a 2f 0a 20  in the node */. 
6a20: 20 69 6e 74 20 69 43 6f 6f 72 64 2c 20 20 20 20   int iCoord,    
6a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6a40: 20 57 68 69 63 68 20 63 6f 6f 72 64 69 6e 61 74   Which coordinat
6a50: 65 20 74 6f 20 65 78 74 72 61 63 74 20 2a 2f 0a  e to extract */.
6a60: 20 20 52 74 72 65 65 43 6f 6f 72 64 20 2a 70 43    RtreeCoord *pC
6a70: 6f 6f 72 64 20 20 20 20 20 20 20 20 20 20 20 2f  oord           /
6a80: 2a 20 4f 55 54 3a 20 53 70 61 63 65 20 74 6f 20  * OUT: Space to 
6a90: 77 72 69 74 65 20 72 65 73 75 6c 74 20 74 6f 20  write result to 
6aa0: 2a 2f 0a 29 7b 0a 20 20 72 65 61 64 43 6f 6f 72  */.){.  readCoor
6ab0: 64 28 26 70 4e 6f 64 65 2d 3e 7a 44 61 74 61 5b  d(&pNode->zData[
6ac0: 31 32 20 2b 20 70 52 74 72 65 65 2d 3e 6e 42 79  12 + pRtree->nBy
6ad0: 74 65 73 50 65 72 43 65 6c 6c 2a 69 43 65 6c 6c  tesPerCell*iCell
6ae0: 20 2b 20 34 2a 69 43 6f 6f 72 64 5d 2c 20 70 43   + 4*iCoord], pC
6af0: 6f 6f 72 64 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  oord);.}../*.** 
6b00: 44 65 73 65 72 69 61 6c 69 7a 65 20 63 65 6c 6c  Deserialize cell
6b10: 20 69 43 65 6c 6c 20 6f 66 20 6e 6f 64 65 20 70   iCell of node p
6b20: 4e 6f 64 65 2e 20 50 6f 70 75 6c 61 74 65 20 74  Node. Populate t
6b30: 68 65 20 73 74 72 75 63 74 75 72 65 20 70 6f 69  he structure poi
6b40: 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 70 43  nted.** to by pC
6b50: 65 6c 6c 20 77 69 74 68 20 74 68 65 20 72 65 73  ell with the res
6b60: 75 6c 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ults..*/.static 
6b70: 76 6f 69 64 20 6e 6f 64 65 47 65 74 43 65 6c 6c  void nodeGetCell
6b80: 28 0a 20 20 52 74 72 65 65 20 2a 70 52 74 72 65  (.  Rtree *pRtre
6b90: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
6ba0: 20 2f 2a 20 54 68 65 20 6f 76 65 72 61 6c 6c 20   /* The overall 
6bb0: 52 2d 54 72 65 65 20 2a 2f 0a 20 20 52 74 72 65  R-Tree */.  Rtre
6bc0: 65 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 20 20 20  eNode *pNode,   
6bd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
6be0: 6e 6f 64 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  node containing 
6bf0: 74 68 65 20 63 65 6c 6c 20 74 6f 20 62 65 20 72  the cell to be r
6c00: 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  ead */.  int iCe
6c10: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
6c20: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
6c30: 66 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68 69  f the cell withi
6c40: 6e 20 74 68 65 20 6e 6f 64 65 20 2a 2f 0a 20 20  n the node */.  
6c50: 52 74 72 65 65 43 65 6c 6c 20 2a 70 43 65 6c 6c  RtreeCell *pCell
6c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6c70: 4f 55 54 3a 20 57 72 69 74 65 20 74 68 65 20 63  OUT: Write the c
6c80: 65 6c 6c 20 63 6f 6e 74 65 6e 74 73 20 68 65 72  ell contents her
6c90: 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 44  e */.){.  u8 *pD
6ca0: 61 74 61 3b 0a 20 20 52 74 72 65 65 43 6f 6f 72  ata;.  RtreeCoor
6cb0: 64 20 2a 70 43 6f 6f 72 64 3b 0a 20 20 69 6e 74  d *pCoord;.  int
6cc0: 20 69 69 20 3d 20 30 3b 0a 20 20 70 43 65 6c 6c   ii = 0;.  pCell
6cd0: 2d 3e 69 52 6f 77 69 64 20 3d 20 6e 6f 64 65 47  ->iRowid = nodeG
6ce0: 65 74 52 6f 77 69 64 28 70 52 74 72 65 65 2c 20  etRowid(pRtree, 
6cf0: 70 4e 6f 64 65 2c 20 69 43 65 6c 6c 29 3b 0a 20  pNode, iCell);. 
6d00: 20 70 44 61 74 61 20 3d 20 70 4e 6f 64 65 2d 3e   pData = pNode->
6d10: 7a 44 61 74 61 20 2b 20 28 31 32 20 2b 20 70 52  zData + (12 + pR
6d20: 74 72 65 65 2d 3e 6e 42 79 74 65 73 50 65 72 43  tree->nBytesPerC
6d30: 65 6c 6c 2a 69 43 65 6c 6c 29 3b 0a 20 20 70 43  ell*iCell);.  pC
6d40: 6f 6f 72 64 20 3d 20 70 43 65 6c 6c 2d 3e 61 43  oord = pCell->aC
6d50: 6f 6f 72 64 3b 0a 20 20 64 6f 7b 0a 20 20 20 20  oord;.  do{.    
6d60: 72 65 61 64 43 6f 6f 72 64 28 70 44 61 74 61 2c  readCoord(pData,
6d70: 20 26 70 43 6f 6f 72 64 5b 69 69 5d 29 3b 0a 20   &pCoord[ii]);. 
6d80: 20 20 20 72 65 61 64 43 6f 6f 72 64 28 70 44 61     readCoord(pDa
6d90: 74 61 2b 34 2c 20 26 70 43 6f 6f 72 64 5b 69 69  ta+4, &pCoord[ii
6da0: 2b 31 5d 29 3b 0a 20 20 20 20 70 44 61 74 61 20  +1]);.    pData 
6db0: 2b 3d 20 38 3b 0a 20 20 20 20 69 69 20 2b 3d 20  += 8;.    ii += 
6dc0: 32 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 69 3c  2;.  }while( ii<
6dd0: 70 52 74 72 65 65 2d 3e 6e 44 69 6d 32 20 29 3b  pRtree->nDim2 );
6de0: 0a 7d 0a 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  .}.../* Forward 
6df0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 66 6f 72 20  declaration for 
6e00: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 74 68 61  the function tha
6e10: 74 20 64 6f 65 73 20 74 68 65 20 77 6f 72 6b 20  t does the work 
6e20: 6f 66 0a 2a 2a 20 74 68 65 20 76 69 72 74 75 61  of.** the virtua
6e30: 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78  l table module x
6e40: 43 72 65 61 74 65 28 29 20 61 6e 64 20 78 43 6f  Create() and xCo
6e50: 6e 6e 65 63 74 28 29 20 6d 65 74 68 6f 64 73 2e  nnect() methods.
6e60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
6e70: 74 72 65 65 49 6e 69 74 28 0a 20 20 73 71 6c 69  treeInit(.  sqli
6e80: 74 65 33 20 2a 2c 20 76 6f 69 64 20 2a 2c 20 69  te3 *, void *, i
6e90: 6e 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  nt, const char *
6ea0: 63 6f 6e 73 74 2a 2c 20 73 71 6c 69 74 65 33 5f  const*, sqlite3_
6eb0: 76 74 61 62 20 2a 2a 2c 20 63 68 61 72 20 2a 2a  vtab **, char **
6ec0: 2c 20 69 6e 74 0a 29 3b 0a 0a 2f 2a 20 0a 2a 2a  , int.);../* .**
6ed0: 20 52 74 72 65 65 20 76 69 72 74 75 61 6c 20 74   Rtree virtual t
6ee0: 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78 43 72 65  able module xCre
6ef0: 61 74 65 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73  ate method..*/.s
6f00: 74 61 74 69 63 20 69 6e 74 20 72 74 72 65 65 43  tatic int rtreeC
6f10: 72 65 61 74 65 28 0a 20 20 73 71 6c 69 74 65 33  reate(.  sqlite3
6f20: 20 2a 64 62 2c 0a 20 20 76 6f 69 64 20 2a 70 41   *db,.  void *pA
6f30: 75 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 20  ux,.  int argc, 
6f40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73  const char *cons
6f50: 74 2a 61 72 67 76 2c 0a 20 20 73 71 6c 69 74 65  t*argv,.  sqlite
6f60: 33 5f 76 74 61 62 20 2a 2a 70 70 56 74 61 62 2c  3_vtab **ppVtab,
6f70: 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a  .  char **pzErr.
6f80: 29 7b 0a 20 20 72 65 74 75 72 6e 20 72 74 72 65  ){.  return rtre
6f90: 65 49 6e 69 74 28 64 62 2c 20 70 41 75 78 2c 20  eInit(db, pAux, 
6fa0: 61 72 67 63 2c 20 61 72 67 76 2c 20 70 70 56 74  argc, argv, ppVt
6fb0: 61 62 2c 20 70 7a 45 72 72 2c 20 31 29 3b 0a 7d  ab, pzErr, 1);.}
6fc0: 0a 0a 2f 2a 20 0a 2a 2a 20 52 74 72 65 65 20 76  ../* .** Rtree v
6fd0: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64  irtual table mod
6fe0: 75 6c 65 20 78 43 6f 6e 6e 65 63 74 20 6d 65 74  ule xConnect met
6ff0: 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  hod..*/.static i
7000: 6e 74 20 72 74 72 65 65 43 6f 6e 6e 65 63 74 28  nt rtreeConnect(
7010: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
7020: 20 20 76 6f 69 64 20 2a 70 41 75 78 2c 0a 20 20    void *pAux,.  
7030: 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73 74 20  int argc, const 
7040: 63 68 61 72 20 2a 63 6f 6e 73 74 2a 61 72 67 76  char *const*argv
7050: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  ,.  sqlite3_vtab
7060: 20 2a 2a 70 70 56 74 61 62 2c 0a 20 20 63 68 61   **ppVtab,.  cha
7070: 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 72  r **pzErr.){.  r
7080: 65 74 75 72 6e 20 72 74 72 65 65 49 6e 69 74 28  eturn rtreeInit(
7090: 64 62 2c 20 70 41 75 78 2c 20 61 72 67 63 2c 20  db, pAux, argc, 
70a0: 61 72 67 76 2c 20 70 70 56 74 61 62 2c 20 70 7a  argv, ppVtab, pz
70b0: 45 72 72 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Err, 0);.}../*.*
70c0: 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
70d0: 72 2d 74 72 65 65 20 72 65 66 65 72 65 6e 63 65  r-tree reference
70e0: 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69   count..*/.stati
70f0: 63 20 76 6f 69 64 20 72 74 72 65 65 52 65 66 65  c void rtreeRefe
7100: 72 65 6e 63 65 28 52 74 72 65 65 20 2a 70 52 74  rence(Rtree *pRt
7110: 72 65 65 29 7b 0a 20 20 70 52 74 72 65 65 2d 3e  ree){.  pRtree->
7120: 6e 42 75 73 79 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a  nBusy++;.}../*.*
7130: 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
7140: 72 2d 74 72 65 65 20 72 65 66 65 72 65 6e 63 65  r-tree reference
7150: 20 63 6f 75 6e 74 2e 20 57 68 65 6e 20 74 68 65   count. When the
7160: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
7170: 20 72 65 61 63 68 65 73 0a 2a 2a 20 7a 65 72 6f   reaches.** zero
7180: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 69   the structure i
7190: 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74  s deleted..*/.st
71a0: 61 74 69 63 20 76 6f 69 64 20 72 74 72 65 65 52  atic void rtreeR
71b0: 65 6c 65 61 73 65 28 52 74 72 65 65 20 2a 70 52  elease(Rtree *pR
71c0: 74 72 65 65 29 7b 0a 20 20 70 52 74 72 65 65 2d  tree){.  pRtree-
71d0: 3e 6e 42 75 73 79 2d 2d 3b 0a 20 20 69 66 28 20  >nBusy--;.  if( 
71e0: 70 52 74 72 65 65 2d 3e 6e 42 75 73 79 3d 3d 30  pRtree->nBusy==0
71f0: 20 29 7b 0a 20 20 20 20 70 52 74 72 65 65 2d 3e   ){.    pRtree->
7200: 69 6e 57 72 54 72 61 6e 73 20 3d 20 30 3b 0a 20  inWrTrans = 0;. 
7210: 20 20 20 70 52 74 72 65 65 2d 3e 6e 43 75 72 73     pRtree->nCurs
7220: 6f 72 20 3d 20 30 3b 0a 20 20 20 20 6e 6f 64 65  or = 0;.    node
7230: 42 6c 6f 62 52 65 73 65 74 28 70 52 74 72 65 65  BlobReset(pRtree
7240: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
7250: 69 6e 61 6c 69 7a 65 28 70 52 74 72 65 65 2d 3e  inalize(pRtree->
7260: 70 57 72 69 74 65 4e 6f 64 65 29 3b 0a 20 20 20  pWriteNode);.   
7270: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
7280: 65 28 70 52 74 72 65 65 2d 3e 70 44 65 6c 65 74  e(pRtree->pDelet
7290: 65 4e 6f 64 65 29 3b 0a 20 20 20 20 73 71 6c 69  eNode);.    sqli
72a0: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 52 74  te3_finalize(pRt
72b0: 72 65 65 2d 3e 70 52 65 61 64 52 6f 77 69 64 29  ree->pReadRowid)
72c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
72d0: 6e 61 6c 69 7a 65 28 70 52 74 72 65 65 2d 3e 70  nalize(pRtree->p
72e0: 57 72 69 74 65 52 6f 77 69 64 29 3b 0a 20 20 20  WriteRowid);.   
72f0: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
7300: 65 28 70 52 74 72 65 65 2d 3e 70 44 65 6c 65 74  e(pRtree->pDelet
7310: 65 52 6f 77 69 64 29 3b 0a 20 20 20 20 73 71 6c  eRowid);.    sql
7320: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 52  ite3_finalize(pR
7330: 74 72 65 65 2d 3e 70 52 65 61 64 50 61 72 65 6e  tree->pReadParen
7340: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
7350: 66 69 6e 61 6c 69 7a 65 28 70 52 74 72 65 65 2d  finalize(pRtree-
7360: 3e 70 57 72 69 74 65 50 61 72 65 6e 74 29 3b 0a  >pWriteParent);.
7370: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
7380: 6c 69 7a 65 28 70 52 74 72 65 65 2d 3e 70 44 65  lize(pRtree->pDe
7390: 6c 65 74 65 50 61 72 65 6e 74 29 3b 0a 20 20 20  leteParent);.   
73a0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 52   sqlite3_free(pR
73b0: 74 72 65 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  tree);.  }.}../*
73c0: 20 0a 2a 2a 20 52 74 72 65 65 20 76 69 72 74 75   .** Rtree virtu
73d0: 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20  al table module 
73e0: 78 44 69 73 63 6f 6e 6e 65 63 74 20 6d 65 74 68  xDisconnect meth
73f0: 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  od..*/.static in
7400: 74 20 72 74 72 65 65 44 69 73 63 6f 6e 6e 65 63  t rtreeDisconnec
7410: 74 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a  t(sqlite3_vtab *
7420: 70 56 74 61 62 29 7b 0a 20 20 72 74 72 65 65 52  pVtab){.  rtreeR
7430: 65 6c 65 61 73 65 28 28 52 74 72 65 65 20 2a 29  elease((Rtree *)
7440: 70 56 74 61 62 29 3b 0a 20 20 72 65 74 75 72 6e  pVtab);.  return
7450: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
7460: 2a 20 0a 2a 2a 20 52 74 72 65 65 20 76 69 72 74  * .** Rtree virt
7470: 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65  ual table module
7480: 20 78 44 65 73 74 72 6f 79 20 6d 65 74 68 6f 64   xDestroy method
7490: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
74a0: 72 74 72 65 65 44 65 73 74 72 6f 79 28 73 71 6c  rtreeDestroy(sql
74b0: 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
74c0: 29 7b 0a 20 20 52 74 72 65 65 20 2a 70 52 74 72  ){.  Rtree *pRtr
74d0: 65 65 20 3d 20 28 52 74 72 65 65 20 2a 29 70 56  ee = (Rtree *)pV
74e0: 74 61 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  tab;.  int rc;. 
74f0: 20 63 68 61 72 20 2a 7a 43 72 65 61 74 65 20 3d   char *zCreate =
7500: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
7510: 28 0a 20 20 20 20 22 44 52 4f 50 20 54 41 42 4c  (.    "DROP TABL
7520: 45 20 27 25 71 27 2e 27 25 71 5f 6e 6f 64 65 27  E '%q'.'%q_node'
7530: 3b 22 0a 20 20 20 20 22 44 52 4f 50 20 54 41 42  ;".    "DROP TAB
7540: 4c 45 20 27 25 71 27 2e 27 25 71 5f 72 6f 77 69  LE '%q'.'%q_rowi
7550: 64 27 3b 22 0a 20 20 20 20 22 44 52 4f 50 20 54  d';".    "DROP T
7560: 41 42 4c 45 20 27 25 71 27 2e 27 25 71 5f 70 61  ABLE '%q'.'%q_pa
7570: 72 65 6e 74 27 3b 22 2c 0a 20 20 20 20 70 52 74  rent';",.    pRt
7580: 72 65 65 2d 3e 7a 44 62 2c 20 70 52 74 72 65 65  ree->zDb, pRtree
7590: 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 70 52  ->zName, .    pR
75a0: 74 72 65 65 2d 3e 7a 44 62 2c 20 70 52 74 72 65  tree->zDb, pRtre
75b0: 65 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 70 52  e->zName,.    pR
75c0: 74 72 65 65 2d 3e 7a 44 62 2c 20 70 52 74 72 65  tree->zDb, pRtre
75d0: 65 2d 3e 7a 4e 61 6d 65 0a 20 20 29 3b 0a 20 20  e->zName.  );.  
75e0: 69 66 28 20 21 7a 43 72 65 61 74 65 20 29 7b 0a  if( !zCreate ){.
75f0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
7600: 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NOMEM;.  }else{.
7610: 20 20 20 20 6e 6f 64 65 42 6c 6f 62 52 65 73 65      nodeBlobRese
7620: 74 28 70 52 74 72 65 65 29 3b 0a 20 20 20 20 72  t(pRtree);.    r
7630: 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
7640: 28 70 52 74 72 65 65 2d 3e 64 62 2c 20 7a 43 72  (pRtree->db, zCr
7650: 65 61 74 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  eate, 0, 0, 0);.
7660: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
7670: 28 7a 43 72 65 61 74 65 29 3b 0a 20 20 7d 0a 20  (zCreate);.  }. 
7680: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
7690: 4f 4b 20 29 7b 0a 20 20 20 20 72 74 72 65 65 52  OK ){.    rtreeR
76a0: 65 6c 65 61 73 65 28 70 52 74 72 65 65 29 3b 0a  elease(pRtree);.
76b0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
76c0: 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 74 72 65  ;.}../* .** Rtre
76d0: 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
76e0: 6d 6f 64 75 6c 65 20 78 4f 70 65 6e 20 6d 65 74  module xOpen met
76f0: 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  hod..*/.static i
7700: 6e 74 20 72 74 72 65 65 4f 70 65 6e 28 73 71 6c  nt rtreeOpen(sql
7710: 69 74 65 33 5f 76 74 61 62 20 2a 70 56 54 61 62  ite3_vtab *pVTab
7720: 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63  , sqlite3_vtab_c
7730: 75 72 73 6f 72 20 2a 2a 70 70 43 75 72 73 6f 72  ursor **ppCursor
7740: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
7750: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 52 74  LITE_NOMEM;.  Rt
7760: 72 65 65 20 2a 70 52 74 72 65 65 20 3d 20 28 52  ree *pRtree = (R
7770: 74 72 65 65 20 2a 29 70 56 54 61 62 3b 0a 20 20  tree *)pVTab;.  
7780: 52 74 72 65 65 43 75 72 73 6f 72 20 2a 70 43 73  RtreeCursor *pCs
7790: 72 3b 0a 0a 20 20 70 43 73 72 20 3d 20 28 52 74  r;..  pCsr = (Rt
77a0: 72 65 65 43 75 72 73 6f 72 20 2a 29 73 71 6c 69  reeCursor *)sqli
77b0: 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  te3_malloc(sizeo
77c0: 66 28 52 74 72 65 65 43 75 72 73 6f 72 29 29 3b  f(RtreeCursor));
77d0: 0a 20 20 69 66 28 20 70 43 73 72 20 29 7b 0a 20  .  if( pCsr ){. 
77e0: 20 20 20 6d 65 6d 73 65 74 28 70 43 73 72 2c 20     memset(pCsr, 
77f0: 30 2c 20 73 69 7a 65 6f 66 28 52 74 72 65 65 43  0, sizeof(RtreeC
7800: 75 72 73 6f 72 29 29 3b 0a 20 20 20 20 70 43 73  ursor));.    pCs
7810: 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 20 3d 20  r->base.pVtab = 
7820: 70 56 54 61 62 3b 0a 20 20 20 20 72 63 20 3d 20  pVTab;.    rc = 
7830: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 70  SQLITE_OK;.    p
7840: 52 74 72 65 65 2d 3e 6e 43 75 72 73 6f 72 2b 2b  Rtree->nCursor++
7850: 3b 0a 20 20 7d 0a 20 20 2a 70 70 43 75 72 73 6f  ;.  }.  *ppCurso
7860: 72 20 3d 20 28 73 71 6c 69 74 65 33 5f 76 74 61  r = (sqlite3_vta
7870: 62 5f 63 75 72 73 6f 72 20 2a 29 70 43 73 72 3b  b_cursor *)pCsr;
7880: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
7890: 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68  .../*.** Free th
78a0: 65 20 52 74 72 65 65 43 75 72 73 6f 72 2e 61 43  e RtreeCursor.aC
78b0: 6f 6e 73 74 72 61 69 6e 74 5b 5d 20 61 72 72 61  onstraint[] arra
78c0: 79 20 61 6e 64 20 69 74 73 20 63 6f 6e 74 65 6e  y and its conten
78d0: 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ts..*/.static vo
78e0: 69 64 20 66 72 65 65 43 75 72 73 6f 72 43 6f 6e  id freeCursorCon
78f0: 73 74 72 61 69 6e 74 73 28 52 74 72 65 65 43 75  straints(RtreeCu
7900: 72 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20 69  rsor *pCsr){.  i
7910: 66 28 20 70 43 73 72 2d 3e 61 43 6f 6e 73 74 72  f( pCsr->aConstr
7920: 61 69 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  aint ){.    int 
7930: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
7940: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
7950: 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
7960: 6f 75 67 68 20 63 6f 6e 73 74 72 61 69 6e 74 20  ough constraint 
7970: 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 66 6f 72  array */.    for
7980: 28 69 3d 30 3b 20 69 3c 70 43 73 72 2d 3e 6e 43  (i=0; i<pCsr->nC
7990: 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b  onstraint; i++){
79a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
79b0: 74 72 65 65 5f 71 75 65 72 79 5f 69 6e 66 6f 20  tree_query_info 
79c0: 2a 70 49 6e 66 6f 20 3d 20 70 43 73 72 2d 3e 61  *pInfo = pCsr->a
79d0: 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 70 49  Constraint[i].pI
79e0: 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70  nfo;.      if( p
79f0: 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Info ){.        
7a00: 69 66 28 20 70 49 6e 66 6f 2d 3e 78 44 65 6c 55  if( pInfo->xDelU
7a10: 73 65 72 20 29 20 70 49 6e 66 6f 2d 3e 78 44 65  ser ) pInfo->xDe
7a20: 6c 55 73 65 72 28 70 49 6e 66 6f 2d 3e 70 55 73  lUser(pInfo->pUs
7a30: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  er);.        sql
7a40: 69 74 65 33 5f 66 72 65 65 28 70 49 6e 66 6f 29  ite3_free(pInfo)
7a50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
7a60: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
7a70: 28 70 43 73 72 2d 3e 61 43 6f 6e 73 74 72 61 69  (pCsr->aConstrai
7a80: 6e 74 29 3b 0a 20 20 20 20 70 43 73 72 2d 3e 61  nt);.    pCsr->a
7a90: 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 30 3b 0a  Constraint = 0;.
7aa0: 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 74    }.}../* .** Rt
7ab0: 72 65 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ree virtual tabl
7ac0: 65 20 6d 6f 64 75 6c 65 20 78 43 6c 6f 73 65 20  e module xClose 
7ad0: 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69  method..*/.stati
7ae0: 63 20 69 6e 74 20 72 74 72 65 65 43 6c 6f 73 65  c int rtreeClose
7af0: 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75  (sqlite3_vtab_cu
7b00: 72 73 6f 72 20 2a 63 75 72 29 7b 0a 20 20 52 74  rsor *cur){.  Rt
7b10: 72 65 65 20 2a 70 52 74 72 65 65 20 3d 20 28 52  ree *pRtree = (R
7b20: 74 72 65 65 20 2a 29 28 63 75 72 2d 3e 70 56 74  tree *)(cur->pVt
7b30: 61 62 29 3b 0a 20 20 69 6e 74 20 69 69 3b 0a 20  ab);.  int ii;. 
7b40: 20 52 74 72 65 65 43 75 72 73 6f 72 20 2a 70 43   RtreeCursor *pC
7b50: 73 72 20 3d 20 28 52 74 72 65 65 43 75 72 73 6f  sr = (RtreeCurso
7b60: 72 20 2a 29 63 75 72 3b 0a 20 20 61 73 73 65 72  r *)cur;.  asser
7b70: 74 28 20 70 52 74 72 65 65 2d 3e 6e 43 75 72 73  t( pRtree->nCurs
7b80: 6f 72 3e 30 20 29 3b 0a 20 20 66 72 65 65 43 75  or>0 );.  freeCu
7b90: 72 73 6f 72 43 6f 6e 73 74 72 61 69 6e 74 73 28  rsorConstraints(
7ba0: 70 43 73 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  pCsr);.  sqlite3
7bb0: 5f 66 72 65 65 28 70 43 73 72 2d 3e 61 50 6f 69  _free(pCsr->aPoi
7bc0: 6e 74 29 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b  nt);.  for(ii=0;
7bd0: 20 69 69 3c 52 54 52 45 45 5f 43 41 43 48 45 5f   ii<RTREE_CACHE_
7be0: 53 5a 3b 20 69 69 2b 2b 29 20 6e 6f 64 65 52 65  SZ; ii++) nodeRe
7bf0: 6c 65 61 73 65 28 70 52 74 72 65 65 2c 20 70 43  lease(pRtree, pC
7c00: 73 72 2d 3e 61 4e 6f 64 65 5b 69 69 5d 29 3b 0a  sr->aNode[ii]);.
7c10: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
7c20: 43 73 72 29 3b 0a 20 20 70 52 74 72 65 65 2d 3e  Csr);.  pRtree->
7c30: 6e 43 75 72 73 6f 72 2d 2d 3b 0a 20 20 6e 6f 64  nCursor--;.  nod
7c40: 65 42 6c 6f 62 52 65 73 65 74 28 70 52 74 72 65  eBlobReset(pRtre
7c50: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e);.  return SQL
7c60: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
7c70: 20 52 74 72 65 65 20 76 69 72 74 75 61 6c 20 74   Rtree virtual t
7c80: 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78 45 6f 66  able module xEof
7c90: 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 52   method..**.** R
7ca0: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
7cb0: 66 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 65  f the cursor doe
7cc0: 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  s not currently 
7cd0: 70 6f 69 6e 74 20 74 6f 20 61 20 76 61 6c 69 64  point to a valid
7ce0: 20 0a 2a 2a 20 72 65 63 6f 72 64 20 28 69 2e 65   .** record (i.e
7cf0: 20 69 66 20 74 68 65 20 73 63 61 6e 20 68 61 73   if the scan has
7d00: 20 66 69 6e 69 73 68 65 64 29 2c 20 6f 72 20 7a   finished), or z
7d10: 65 72 6f 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ero otherwise..*
7d20: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 74 72  /.static int rtr
7d30: 65 65 45 6f 66 28 73 71 6c 69 74 65 33 5f 76 74  eeEof(sqlite3_vt
7d40: 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 29 7b  ab_cursor *cur){
7d50: 0a 20 20 52 74 72 65 65 43 75 72 73 6f 72 20 2a  .  RtreeCursor *
7d60: 70 43 73 72 20 3d 20 28 52 74 72 65 65 43 75 72  pCsr = (RtreeCur
7d70: 73 6f 72 20 2a 29 63 75 72 3b 0a 20 20 72 65 74  sor *)cur;.  ret
7d80: 75 72 6e 20 70 43 73 72 2d 3e 61 74 45 4f 46 3b  urn pCsr->atEOF;
7d90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
7da0: 74 20 72 61 77 20 62 69 74 73 20 66 72 6f 6d 20  t raw bits from 
7db0: 74 68 65 20 6f 6e 2d 64 69 73 6b 20 52 54 72 65  the on-disk RTre
7dc0: 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 61 20  e record into a 
7dd0: 63 6f 6f 72 64 69 6e 61 74 65 20 76 61 6c 75 65  coordinate value
7de0: 2e 0a 2a 2a 20 54 68 65 20 6f 6e 2d 64 69 73 6b  ..** The on-disk
7df0: 20 66 6f 72 6d 61 74 20 69 73 20 62 69 67 2d 65   format is big-e
7e00: 6e 64 69 61 6e 20 61 6e 64 20 6e 65 65 64 73 20  ndian and needs 
7e10: 74 6f 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20  to be converted 
7e20: 66 6f 72 20 6c 69 74 74 6c 65 2d 0a 2a 2a 20 65  for little-.** e
7e30: 6e 64 69 61 6e 20 70 6c 61 74 66 6f 72 6d 73 2e  ndian platforms.
7e40: 20 20 54 68 65 20 6f 6e 2d 64 69 73 6b 20 72 65    The on-disk re
7e50: 63 6f 72 64 20 73 74 6f 72 65 73 20 69 6e 74 65  cord stores inte
7e60: 67 65 72 20 63 6f 6f 72 64 69 6e 61 74 65 73 20  ger coordinates 
7e70: 69 66 0a 2a 2a 20 65 49 6e 74 20 69 73 20 74 72  if.** eInt is tr
7e80: 75 65 20 61 6e 64 20 69 74 20 73 74 6f 72 65 73  ue and it stores
7e90: 20 33 32 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67   32-bit floating
7ea0: 20 70 6f 69 6e 74 20 72 65 63 6f 72 64 73 20 69   point records i
7eb0: 66 20 65 49 6e 74 20 69 73 0a 2a 2a 20 66 61 6c  f eInt is.** fal
7ec0: 73 65 2e 20 20 61 5b 5d 20 69 73 20 74 68 65 20  se.  a[] is the 
7ed0: 66 6f 75 72 20 62 79 74 65 73 20 6f 66 20 74 68  four bytes of th
7ee0: 65 20 6f 6e 2d 64 69 73 6b 20 72 65 63 6f 72 64  e on-disk record
7ef0: 20 74 6f 20 62 65 20 64 65 63 6f 64 65 64 2e 0a   to be decoded..
7f00: 2a 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  ** Store the res
7f10: 75 6c 74 73 20 69 6e 20 22 72 22 2e 0a 2a 2a 0a  ults in "r"..**.
7f20: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 66 69 76  ** There are fiv
7f30: 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  e versions of th
7f40: 69 73 20 6d 61 63 72 6f 2e 20 20 54 68 65 20 6c  is macro.  The l
7f50: 61 73 74 20 6f 6e 65 20 69 73 20 67 65 6e 65 72  ast one is gener
7f60: 69 63 2e 20 20 54 68 65 0a 2a 2a 20 6f 74 68 65  ic.  The.** othe
7f70: 72 20 66 6f 75 72 20 61 72 65 20 76 61 72 69 6f  r four are vario
7f80: 75 73 20 61 72 63 68 69 74 65 63 74 75 72 65 73  us architectures
7f90: 2d 73 70 65 63 69 66 69 63 20 6f 70 74 69 6d 69  -specific optimi
7fa0: 7a 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 23 69 66 20  zations..*/.#if 
7fb0: 53 51 4c 49 54 45 5f 42 59 54 45 4f 52 44 45 52  SQLITE_BYTEORDER
7fc0: 3d 3d 31 32 33 34 20 26 26 20 4d 53 56 43 5f 56  ==1234 && MSVC_V
7fd0: 45 52 53 49 4f 4e 3e 3d 31 33 30 30 0a 23 64 65  ERSION>=1300.#de
7fe0: 66 69 6e 65 20 52 54 52 45 45 5f 44 45 43 4f 44  fine RTREE_DECOD
7ff0: 45 5f 43 4f 4f 52 44 28 65 49 6e 74 2c 20 61 2c  E_COORD(eInt, a,
8000: 20 72 29 20 7b 20 20 20 20 20 20 20 20 20 20 20   r) {           
8010: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
8020: 20 20 20 52 74 72 65 65 43 6f 6f 72 64 20 63 3b     RtreeCoord c;
8030: 20 20 20 20 2f 2a 20 43 6f 6f 72 64 69 6e 61 74      /* Coordinat
8040: 65 20 64 65 63 6f 64 65 64 20 2a 2f 20 20 20 20  e decoded */    
8050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
8060: 0a 20 20 20 20 63 2e 75 20 3d 20 5f 62 79 74 65  .    c.u = _byte
8070: 73 77 61 70 5f 75 6c 6f 6e 67 28 2a 28 75 33 32  swap_ulong(*(u32
8080: 2a 29 61 29 3b 20 20 20 20 20 20 20 20 20 20 20  *)a);           
8090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80a0: 20 5c 0a 20 20 20 20 72 20 3d 20 65 49 6e 74 20   \.    r = eInt 
80b0: 3f 20 28 73 71 6c 69 74 65 33 5f 72 74 72 65 65  ? (sqlite3_rtree
80c0: 5f 64 62 6c 29 63 2e 69 20 3a 20 28 73 71 6c 69  _dbl)c.i : (sqli
80d0: 74 65 33 5f 72 74 72 65 65 5f 64 62 6c 29 63 2e  te3_rtree_dbl)c.
80e0: 66 3b 20 5c 0a 7d 0a 23 65 6c 69 66 20 53 51 4c  f; \.}.#elif SQL
80f0: 49 54 45 5f 42 59 54 45 4f 52 44 45 52 3d 3d 31  ITE_BYTEORDER==1
8100: 32 33 34 20 26 26 20 47 43 43 5f 56 45 52 53 49  234 && GCC_VERSI
8110: 4f 4e 3e 3d 34 30 30 33 30 30 30 0a 23 64 65 66  ON>=4003000.#def
8120: 69 6e 65 20 52 54 52 45 45 5f 44 45 43 4f 44 45  ine RTREE_DECODE
8130: 5f 43 4f 4f 52 44 28 65 49 6e 74 2c 20 61 2c 20  _COORD(eInt, a, 
8140: 72 29 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  r) {            
8150: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
8160: 20 20 52 74 72 65 65 43 6f 6f 72 64 20 63 3b 20    RtreeCoord c; 
8170: 20 20 20 2f 2a 20 43 6f 6f 72 64 69 6e 61 74 65     /* Coordinate
8180: 20 64 65 63 6f 64 65 64 20 2a 2f 20 20 20 20 20   decoded */     
8190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
81a0: 20 20 20 20 63 2e 75 20 3d 20 5f 5f 62 75 69 6c      c.u = __buil
81b0: 74 69 6e 5f 62 73 77 61 70 33 32 28 2a 28 75 33  tin_bswap32(*(u3
81c0: 32 2a 29 61 29 3b 20 20 20 20 20 20 20 20 20 20  2*)a);          
81d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81e0: 5c 0a 20 20 20 20 72 20 3d 20 65 49 6e 74 20 3f  \.    r = eInt ?
81f0: 20 28 73 71 6c 69 74 65 33 5f 72 74 72 65 65 5f   (sqlite3_rtree_
8200: 64 62 6c 29 63 2e 69 20 3a 20 28 73 71 6c 69 74  dbl)c.i : (sqlit
8210: 65 33 5f 72 74 72 65 65 5f 64 62 6c 29 63 2e 66  e3_rtree_dbl)c.f
8220: 3b 20 5c 0a 7d 0a 23 65 6c 69 66 20 53 51 4c 49  ; \.}.#elif SQLI
8230: 54 45 5f 42 59 54 45 4f 52 44 45 52 3d 3d 31 32  TE_BYTEORDER==12
8240: 33 34 0a 23 64 65 66 69 6e 65 20 52 54 52 45 45  34.#define RTREE
8250: 5f 44 45 43 4f 44 45 5f 43 4f 4f 52 44 28 65 49  _DECODE_COORD(eI
8260: 6e 74 2c 20 61 2c 20 72 29 20 7b 20 20 20 20 20  nt, a, r) {     
8270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8280: 20 20 20 5c 0a 20 20 20 20 52 74 72 65 65 43 6f     \.    RtreeCo
8290: 6f 72 64 20 63 3b 20 20 20 20 2f 2a 20 43 6f 6f  ord c;    /* Coo
82a0: 72 64 69 6e 61 74 65 20 64 65 63 6f 64 65 64 20  rdinate decoded 
82b0: 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
82c0: 20 20 20 20 20 5c 0a 20 20 20 20 6d 65 6d 63 70       \.    memcp
82d0: 79 28 26 63 2e 75 2c 61 2c 34 29 3b 20 20 20 20  y(&c.u,a,4);    
82e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8300: 20 20 20 20 20 20 20 5c 0a 20 20 20 20 63 2e 75         \.    c.u
8310: 20 3d 20 28 28 63 2e 75 3e 3e 32 34 29 26 30 78   = ((c.u>>24)&0x
8320: 66 66 29 7c 28 28 63 2e 75 3e 3e 38 29 26 30 78  ff)|((c.u>>8)&0x
8330: 66 66 30 30 29 7c 20 20 20 20 20 20 20 20 20 20  ff00)|          
8340: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 20           \.     
8350: 20 20 20 20 20 28 28 63 2e 75 26 30 78 66 66 29       ((c.u&0xff)
8360: 3c 3c 32 34 29 7c 28 28 63 2e 75 26 30 78 66 66  <<24)|((c.u&0xff
8370: 30 30 29 3c 3c 38 29 3b 20 20 20 20 20 20 20 20  00)<<8);        
8380: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
8390: 20 72 20 3d 20 65 49 6e 74 20 3f 20 28 73 71 6c   r = eInt ? (sql
83a0: 69 74 65 33 5f 72 74 72 65 65 5f 64 62 6c 29 63  ite3_rtree_dbl)c
83b0: 2e 69 20 3a 20 28 73 71 6c 69 74 65 33 5f 72 74  .i : (sqlite3_rt
83c0: 72 65 65 5f 64 62 6c 29 63 2e 66 3b 20 5c 0a 7d  ree_dbl)c.f; \.}
83d0: 0a 23 65 6c 69 66 20 53 51 4c 49 54 45 5f 42 59  .#elif SQLITE_BY
83e0: 54 45 4f 52 44 45 52 3d 3d 34 33 32 31 0a 23 64  TEORDER==4321.#d
83f0: 65 66 69 6e 65 20 52 54 52 45 45 5f 44 45 43 4f  efine RTREE_DECO
8400: 44 45 5f 43 4f 4f 52 44 28 65 49 6e 74 2c 20 61  DE_COORD(eInt, a
8410: 2c 20 72 29 20 7b 20 20 20 20 20 20 20 20 20 20  , r) {          
8420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
8430: 20 20 20 20 52 74 72 65 65 43 6f 6f 72 64 20 63      RtreeCoord c
8440: 3b 20 20 20 20 2f 2a 20 43 6f 6f 72 64 69 6e 61  ;    /* Coordina
8450: 74 65 20 64 65 63 6f 64 65 64 20 2a 2f 20 20 20  te decoded */   
8460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8470: 5c 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 63 2e  \.    memcpy(&c.
8480: 75 2c 61 2c 34 29 3b 20 20 20 20 20 20 20 20 20  u,a,4);         
8490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84b0: 20 20 5c 0a 20 20 20 20 72 20 3d 20 65 49 6e 74    \.    r = eInt
84c0: 20 3f 20 28 73 71 6c 69 74 65 33 5f 72 74 72 65   ? (sqlite3_rtre
84d0: 65 5f 64 62 6c 29 63 2e 69 20 3a 20 28 73 71 6c  e_dbl)c.i : (sql
84e0: 69 74 65 33 5f 72 74 72 65 65 5f 64 62 6c 29 63  ite3_rtree_dbl)c
84f0: 2e 66 3b 20 5c 0a 7d 0a 23 65 6c 73 65 0a 23 64  .f; \.}.#else.#d
8500: 65 66 69 6e 65 20 52 54 52 45 45 5f 44 45 43 4f  efine RTREE_DECO
8510: 44 45 5f 43 4f 4f 52 44 28 65 49 6e 74 2c 20 61  DE_COORD(eInt, a
8520: 2c 20 72 29 20 7b 20 20 20 20 20 20 20 20 20 20  , r) {          
8530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
8540: 20 20 20 20 52 74 72 65 65 43 6f 6f 72 64 20 63      RtreeCoord c
8550: 3b 20 20 20 20 2f 2a 20 43 6f 6f 72 64 69 6e 61  ;    /* Coordina
8560: 74 65 20 64 65 63 6f 64 65 64 20 2a 2f 20 20 20  te decoded */   
8570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8580: 5c 0a 20 20 20 20 63 2e 75 20 3d 20 28 28 75 33  \.    c.u = ((u3
8590: 32 29 61 5b 30 5d 3c 3c 32 34 29 20 2b 20 28 28  2)a[0]<<24) + ((
85a0: 75 33 32 29 61 5b 31 5d 3c 3c 31 36 29 20 20 20  u32)a[1]<<16)   
85b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85c0: 20 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 2b    \.           +
85d0: 28 28 75 33 32 29 61 5b 32 5d 3c 3c 38 29 20 2b  ((u32)a[2]<<8) +
85e0: 20 61 5b 33 5d 3b 20 20 20 20 20 20 20 20 20 20   a[3];          
85f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8600: 20 20 20 20 5c 0a 20 20 20 20 72 20 3d 20 65 49      \.    r = eI
8610: 6e 74 20 3f 20 28 73 71 6c 69 74 65 33 5f 72 74  nt ? (sqlite3_rt
8620: 72 65 65 5f 64 62 6c 29 63 2e 69 20 3a 20 28 73  ree_dbl)c.i : (s
8630: 71 6c 69 74 65 33 5f 72 74 72 65 65 5f 64 62 6c  qlite3_rtree_dbl
8640: 29 63 2e 66 3b 20 5c 0a 7d 0a 23 65 6e 64 69 66  )c.f; \.}.#endif
8650: 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68  ../*.** Check th
8660: 65 20 52 54 72 65 65 20 6e 6f 64 65 20 6f 72 20  e RTree node or 
8670: 65 6e 74 72 79 20 67 69 76 65 6e 20 62 79 20 70  entry given by p
8680: 43 65 6c 6c 44 61 74 61 20 61 6e 64 20 70 20 61  CellData and p a
8690: 67 61 69 6e 73 74 20 74 68 65 20 4d 41 54 43 48  gainst the MATCH
86a0: 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 70  .** constraint p
86b0: 43 6f 6e 73 74 72 61 69 6e 74 2e 20 20 0a 2a 2f  Constraint.  .*/
86c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 74 72 65  .static int rtre
86d0: 65 43 61 6c 6c 62 61 63 6b 43 6f 6e 73 74 72 61  eCallbackConstra
86e0: 69 6e 74 28 0a 20 20 52 74 72 65 65 43 6f 6e 73  int(.  RtreeCons
86f0: 74 72 61 69 6e 74 20 2a 70 43 6f 6e 73 74 72 61  traint *pConstra
8700: 69 6e 74 2c 20 20 2f 2a 20 54 68 65 20 63 6f 6e  int,  /* The con
8710: 73 74 72 61 69 6e 74 20 74 6f 20 74 65 73 74 20  straint to test 
8720: 2a 2f 0a 20 20 69 6e 74 20 65 49 6e 74 2c 20 20  */.  int eInt,  
8730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8740: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 52      /* True if R
8750: 54 72 65 65 20 68 6f 6c 64 69 6e 67 20 69 6e 74  Tree holding int
8760: 65 67 65 72 20 63 6f 6f 72 64 69 6e 61 74 65 73  eger coordinates
8770: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 44   */.  u8 *pCellD
8780: 61 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20  ata,            
8790: 20 20 20 20 20 2f 2a 20 52 61 77 20 63 65 6c 6c       /* Raw cell
87a0: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 52 74   content */.  Rt
87b0: 72 65 65 53 65 61 72 63 68 50 6f 69 6e 74 20 2a  reeSearchPoint *
87c0: 70 53 65 61 72 63 68 2c 20 20 20 20 20 2f 2a 20  pSearch,     /* 
87d0: 43 6f 6e 74 61 69 6e 65 72 20 6f 66 20 74 68 69  Container of thi
87e0: 73 20 63 65 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69  s cell */.  sqli
87f0: 74 65 33 5f 72 74 72 65 65 5f 64 62 6c 20 2a 70  te3_rtree_dbl *p
8800: 72 53 63 6f 72 65 2c 20 20 20 20 2f 2a 20 4f 55  rScore,    /* OU
8810: 54 3a 20 73 63 6f 72 65 20 66 6f 72 20 74 68 65  T: score for the
8820: 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 2a   cell */.  int *
8830: 70 65 57 69 74 68 69 6e 20 20 20 20 20 20 20 20  peWithin        
8840: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
8850: 3a 20 76 69 73 69 62 69 6c 69 74 79 20 6f 66 20  : visibility of 
8860: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 29 7b 0a 20  the cell */.){. 
8870: 20 73 71 6c 69 74 65 33 5f 72 74 72 65 65 5f 71   sqlite3_rtree_q
8880: 75 65 72 79 5f 69 6e 66 6f 20 2a 70 49 6e 66 6f  uery_info *pInfo
8890: 20 3d 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e   = pConstraint->
88a0: 70 49 6e 66 6f 3b 20 2f 2a 20 43 61 6c 6c 62 61  pInfo; /* Callba
88b0: 63 6b 20 69 6e 66 6f 20 2a 2f 0a 20 20 69 6e 74  ck info */.  int
88c0: 20 6e 43 6f 6f 72 64 20 3d 20 70 49 6e 66 6f 2d   nCoord = pInfo-
88d0: 3e 6e 43 6f 6f 72 64 3b 20 20 20 20 20 20 20 20  >nCoord;        
88e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88f0: 20 20 20 2f 2a 20 4e 6f 2e 20 6f 66 20 63 6f 6f     /* No. of coo
8900: 72 64 69 6e 61 74 65 73 20 2a 2f 0a 20 20 69 6e  rdinates */.  in
8910: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
8920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8940: 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 72 65    /* Callback re
8950: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 52  turn code */.  R
8960: 74 72 65 65 43 6f 6f 72 64 20 63 3b 20 20 20 20  treeCoord c;    
8970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8990: 20 20 20 2f 2a 20 54 72 61 6e 73 6c 61 74 6f 72     /* Translator
89a0: 20 75 6e 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69   union */.  sqli
89b0: 74 65 33 5f 72 74 72 65 65 5f 64 62 6c 20 61 43  te3_rtree_dbl aC
89c0: 6f 6f 72 64 5b 52 54 52 45 45 5f 4d 41 58 5f 44  oord[RTREE_MAX_D
89d0: 49 4d 45 4e 53 49 4f 4e 53 2a 32 5d 3b 20 20 20  IMENSIONS*2];   
89e0: 2f 2a 20 44 65 63 6f 64 65 64 20 63 6f 6f 72 64  /* Decoded coord
89f0: 69 6e 61 74 65 73 20 2a 2f 0a 0a 20 20 61 73 73  inates */..  ass
8a00: 65 72 74 28 20 70 43 6f 6e 73 74 72 61 69 6e 74  ert( pConstraint
8a10: 2d 3e 6f 70 3d 3d 52 54 52 45 45 5f 4d 41 54 43  ->op==RTREE_MATC
8a20: 48 20 7c 7c 20 70 43 6f 6e 73 74 72 61 69 6e 74  H || pConstraint
8a30: 2d 3e 6f 70 3d 3d 52 54 52 45 45 5f 51 55 45 52  ->op==RTREE_QUER
8a40: 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  Y );.  assert( n
8a50: 43 6f 6f 72 64 3d 3d 32 20 7c 7c 20 6e 43 6f 6f  Coord==2 || nCoo
8a60: 72 64 3d 3d 34 20 7c 7c 20 6e 43 6f 6f 72 64 3d  rd==4 || nCoord=
8a70: 3d 36 20 7c 7c 20 6e 43 6f 6f 72 64 3d 3d 38 20  =6 || nCoord==8 
8a80: 7c 7c 20 6e 43 6f 6f 72 64 3d 3d 31 30 20 29 3b  || nCoord==10 );
8a90: 0a 0a 20 20 69 66 28 20 70 43 6f 6e 73 74 72 61  ..  if( pConstra
8aa0: 69 6e 74 2d 3e 6f 70 3d 3d 52 54 52 45 45 5f 51  int->op==RTREE_Q
8ab0: 55 45 52 59 20 26 26 20 70 53 65 61 72 63 68 2d  UERY && pSearch-
8ac0: 3e 69 4c 65 76 65 6c 3d 3d 31 20 29 7b 0a 20 20  >iLevel==1 ){.  
8ad0: 20 20 70 49 6e 66 6f 2d 3e 69 52 6f 77 69 64 20    pInfo->iRowid 
8ae0: 3d 20 72 65 61 64 49 6e 74 36 34 28 70 43 65 6c  = readInt64(pCel
8af0: 6c 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20 70 43  lData);.  }.  pC
8b00: 65 6c 6c 44 61 74 61 20 2b 3d 20 38 3b 0a 23 69  ellData += 8;.#i
8b10: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 52 54 52  fndef SQLITE_RTR
8b20: 45 45 5f 49 4e 54 5f 4f 4e 4c 59 0a 20 20 69 66  EE_INT_ONLY.  if
8b30: 28 20 65 49 6e 74 3d 3d 30 20 29 7b 0a 20 20 20  ( eInt==0 ){.   
8b40: 20 73 77 69 74 63 68 28 20 6e 43 6f 6f 72 64 20   switch( nCoord 
8b50: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 31 30  ){.      case 10
8b60: 3a 20 20 72 65 61 64 43 6f 6f 72 64 28 70 43 65  :  readCoord(pCe
8b70: 6c 6c 44 61 74 61 2b 33 36 2c 20 26 63 29 3b 20  llData+36, &c); 
8b80: 61 43 6f 6f 72 64 5b 39 5d 20 3d 20 63 2e 66 3b  aCoord[9] = c.f;
8b90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8ba0: 20 72 65 61 64 43 6f 6f 72 64 28 70 43 65 6c 6c   readCoord(pCell
8bb0: 44 61 74 61 2b 33 32 2c 20 26 63 29 3b 20 61 43  Data+32, &c); aC
8bc0: 6f 6f 72 64 5b 38 5d 20 3d 20 63 2e 66 3b 0a 20  oord[8] = c.f;. 
8bd0: 20 20 20 20 20 63 61 73 65 20 38 3a 20 20 20 72       case 8:   r
8be0: 65 61 64 43 6f 6f 72 64 28 70 43 65 6c 6c 44 61  eadCoord(pCellDa
8bf0: 74 61 2b 32 38 2c 20 26 63 29 3b 20 61 43 6f 6f  ta+28, &c); aCoo
8c00: 72 64 5b 37 5d 20 3d 20 63 2e 66 3b 0a 20 20 20  rd[7] = c.f;.   
8c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 61               rea
8c20: 64 43 6f 6f 72 64 28 70 43 65 6c 6c 44 61 74 61  dCoord(pCellData
8c30: 2b 32 34 2c 20 26 63 29 3b 20 61 43 6f 6f 72 64  +24, &c); aCoord
8c40: 5b 36 5d 20 3d 20 63 2e 66 3b 0a 20 20 20 20 20  [6] = c.f;.     
8c50: 20 63 61 73 65 20 36 3a 20 20 20 72 65 61 64 43   case 6:   readC
8c60: 6f 6f 72 64 28 70 43 65 6c 6c 44 61 74 61 2b 32  oord(pCellData+2
8c70: 30 2c 20 26 63 29 3b 20 61 43 6f 6f 72 64 5b 35  0, &c); aCoord[5
8c80: 5d 20 3d 20 63 2e 66 3b 0a 20 20 20 20 20 20 20  ] = c.f;.       
8c90: 20 20 20 20 20 20 20 20 20 72 65 61 64 43 6f 6f           readCoo
8ca0: 72 64 28 70 43 65 6c 6c 44 61 74 61 2b 31 36 2c  rd(pCellData+16,
8cb0: 20 26 63 29 3b 20 61 43 6f 6f 72 64 5b 34 5d 20   &c); aCoord[4] 
8cc0: 3d 20 63 2e 66 3b 0a 20 20 20 20 20 20 63 61 73  = c.f;.      cas
8cd0: 65 20 34 3a 20 20 20 72 65 61 64 43 6f 6f 72 64  e 4:   readCoord
8ce0: 28 70 43 65 6c 6c 44 61 74 61 2b 31 32 2c 20 26  (pCellData+12, &
8cf0: 63 29 3b 20 61 43 6f 6f 72 64 5b 33 5d 20 3d 20  c); aCoord[3] = 
8d00: 63 2e 66 3b 0a 20 20 20 20 20 20 20 20 20 20 20  c.f;.           
8d10: 20 20 20 20 20 72 65 61 64 43 6f 6f 72 64 28 70       readCoord(p
8d20: 43 65 6c 6c 44 61 74 61 2b 38 2c 20 20 26 63 29  CellData+8,  &c)
8d30: 3b 20 61 43 6f 6f 72 64 5b 32 5d 20 3d 20 63 2e  ; aCoord[2] = c.
8d40: 66 3b 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74  f;.      default
8d50: 3a 20 20 72 65 61 64 43 6f 6f 72 64 28 70 43 65  :  readCoord(pCe
8d60: 6c 6c 44 61 74 61 2b 34 2c 20 20 26 63 29 3b 20  llData+4,  &c); 
8d70: 61 43 6f 6f 72 64 5b 31 5d 20 3d 20 63 2e 66 3b  aCoord[1] = c.f;
8d80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8d90: 20 72 65 61 64 43 6f 6f 72 64 28 70 43 65 6c 6c   readCoord(pCell
8da0: 44 61 74 61 2c 20 20 20 20 26 63 29 3b 20 61 43  Data,    &c); aC
8db0: 6f 6f 72 64 5b 30 5d 20 3d 20 63 2e 66 3b 0a 20  oord[0] = c.f;. 
8dc0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e     }.  }else.#en
8dd0: 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 77 69 74  dif.  {.    swit
8de0: 63 68 28 20 6e 43 6f 6f 72 64 20 29 7b 0a 20 20  ch( nCoord ){.  
8df0: 20 20 20 20 63 61 73 65 20 31 30 3a 20 20 72 65      case 10:  re
8e00: 61 64 43 6f 6f 72 64 28 70 43 65 6c 6c 44 61 74  adCoord(pCellDat
8e10: 61 2b 33 36 2c 20 26 63 29 3b 20 61 43 6f 6f 72  a+36, &c); aCoor
8e20: 64 5b 39 5d 20 3d 20 63 2e 69 3b 0a 20 20 20 20  d[9] = c.i;.    
8e30: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 61 64              read
8e40: 43 6f 6f 72 64 28 70 43 65 6c 6c 44 61 74 61 2b  Coord(pCellData+
8e50: 33 32 2c 20 26 63 29 3b 20 61 43 6f 6f 72 64 5b  32, &c); aCoord[
8e60: 38 5d 20 3d 20 63 2e 69 3b 0a 20 20 20 20 20 20  8] = c.i;.      
8e70: 63 61 73 65 20 38 3a 20 20 20 72 65 61 64 43 6f  case 8:   readCo
8e80: 6f 72 64 28 70 43 65 6c 6c 44 61 74 61 2b 32 38  ord(pCellData+28
8e90: 2c 20 26 63 29 3b 20 61 43 6f 6f 72 64 5b 37 5d  , &c); aCoord[7]
8ea0: 20 3d 20 63 2e 69 3b 0a 20 20 20 20 20 20 20 20   = c.i;.        
8eb0: 20 20 20 20 20 20 20 20 72 65 61 64 43 6f 6f 72          readCoor
8ec0: 64 28 70 43 65 6c 6c 44 61 74 61 2b 32 34 2c 20  d(pCellData+24, 
8ed0: 26 63 29 3b 20 61 43 6f 6f 72 64 5b 36 5d 20 3d  &c); aCoord[6] =
8ee0: 20 63 2e 69 3b 0a 20 20 20 20 20 20 63 61 73 65   c.i;.      case
8ef0: 20 36 3a 20 20 20 72 65 61 64 43 6f 6f 72 64 28   6:   readCoord(
8f00: 70 43 65 6c 6c 44 61 74 61 2b 32 30 2c 20 26 63  pCellData+20, &c
8f10: 29 3b 20 61 43 6f 6f 72 64 5b 35 5d 20 3d 20 63  ); aCoord[5] = c
8f20: 2e 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  .i;.            
8f30: 20 20 20 20 72 65 61 64 43 6f 6f 72 64 28 70 43      readCoord(pC
8f40: 65 6c 6c 44 61 74 61 2b 31 36 2c 20 26 63 29 3b  ellData+16, &c);
8f50: 20 61 43 6f 6f 72 64 5b 34 5d 20 3d 20 63 2e 69   aCoord[4] = c.i
8f60: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 34 3a 20  ;.      case 4: 
8f70: 20 20 72 65 61 64 43 6f 6f 72 64 28 70 43 65 6c    readCoord(pCel
8f80: 6c 44 61 74 61 2b 31 32 2c 20 26 63 29 3b 20 61  lData+12, &c); a
8f90: 43 6f 6f 72 64 5b 33 5d 20 3d 20 63 2e 69 3b 0a  Coord[3] = c.i;.
8fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fb0: 72 65 61 64 43 6f 6f 72 64 28 70 43 65 6c 6c 44  readCoord(pCellD
8fc0: 61 74 61 2b 38 2c 20 20 26 63 29 3b 20 61 43 6f  ata+8,  &c); aCo
8fd0: 6f 72 64 5b 32 5d 20 3d 20 63 2e 69 3b 0a 20 20  ord[2] = c.i;.  
8fe0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 72 65      default:  re
8ff0: 61 64 43 6f 6f 72 64 28 70 43 65 6c 6c 44 61 74  adCoord(pCellDat
9000: 61 2b 34 2c 20 20 26 63 29 3b 20 61 43 6f 6f 72  a+4,  &c); aCoor
9010: 64 5b 31 5d 20 3d 20 63 2e 69 3b 0a 20 20 20 20  d[1] = c.i;.    
9020: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 61 64              read
9030: 43 6f 6f 72 64 28 70 43 65 6c 6c 44 61 74 61 2c  Coord(pCellData,
9040: 20 20 20 20 26 63 29 3b 20 61 43 6f 6f 72 64 5b      &c); aCoord[
9050: 30 5d 20 3d 20 63 2e 69 3b 0a 20 20 20 20 7d 0a  0] = c.i;.    }.
9060: 20 20 7d 0a 20 20 69 66 28 20 70 43 6f 6e 73 74    }.  if( pConst
9070: 72 61 69 6e 74 2d 3e 6f 70 3d 3d 52 54 52 45 45  raint->op==RTREE
9080: 5f 4d 41 54 43 48 20 29 7b 0a 20 20 20 20 69 6e  _MATCH ){.    in
9090: 74 20 65 57 69 74 68 69 6e 20 3d 20 30 3b 0a 20  t eWithin = 0;. 
90a0: 20 20 20 72 63 20 3d 20 70 43 6f 6e 73 74 72 61     rc = pConstra
90b0: 69 6e 74 2d 3e 75 2e 78 47 65 6f 6d 28 28 73 71  int->u.xGeom((sq
90c0: 6c 69 74 65 33 5f 72 74 72 65 65 5f 67 65 6f 6d  lite3_rtree_geom
90d0: 65 74 72 79 2a 29 70 49 6e 66 6f 2c 0a 20 20 20  etry*)pInfo,.   
90e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90f0: 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f 6f 72             nCoor
9100: 64 2c 20 61 43 6f 6f 72 64 2c 20 26 65 57 69 74  d, aCoord, &eWit
9110: 68 69 6e 29 3b 0a 20 20 20 20 69 66 28 20 65 57  hin);.    if( eW
9120: 69 74 68 69 6e 3d 3d 30 20 29 20 2a 70 65 57 69  ithin==0 ) *peWi
9130: 74 68 69 6e 20 3d 20 4e 4f 54 5f 57 49 54 48 49  thin = NOT_WITHI
9140: 4e 3b 0a 20 20 20 20 2a 70 72 53 63 6f 72 65 20  N;.    *prScore 
9150: 3d 20 52 54 52 45 45 5f 5a 45 52 4f 3b 0a 20 20  = RTREE_ZERO;.  
9160: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f  }else{.    pInfo
9170: 2d 3e 61 43 6f 6f 72 64 20 3d 20 61 43 6f 6f 72  ->aCoord = aCoor
9180: 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4c  d;.    pInfo->iL
9190: 65 76 65 6c 20 3d 20 70 53 65 61 72 63 68 2d 3e  evel = pSearch->
91a0: 69 4c 65 76 65 6c 20 2d 20 31 3b 0a 20 20 20 20  iLevel - 1;.    
91b0: 70 49 6e 66 6f 2d 3e 72 53 63 6f 72 65 20 3d 20  pInfo->rScore = 
91c0: 70 49 6e 66 6f 2d 3e 72 50 61 72 65 6e 74 53 63  pInfo->rParentSc
91d0: 6f 72 65 20 3d 20 70 53 65 61 72 63 68 2d 3e 72  ore = pSearch->r
91e0: 53 63 6f 72 65 3b 0a 20 20 20 20 70 49 6e 66 6f  Score;.    pInfo
91f0: 2d 3e 65 57 69 74 68 69 6e 20 3d 20 70 49 6e 66  ->eWithin = pInf
9200: 6f 2d 3e 65 50 61 72 65 6e 74 57 69 74 68 69 6e  o->eParentWithin
9210: 20 3d 20 70 53 65 61 72 63 68 2d 3e 65 57 69 74   = pSearch->eWit
9220: 68 69 6e 3b 0a 20 20 20 20 72 63 20 3d 20 70 43  hin;.    rc = pC
9230: 6f 6e 73 74 72 61 69 6e 74 2d 3e 75 2e 78 51 75  onstraint->u.xQu
9240: 65 72 79 46 75 6e 63 28 70 49 6e 66 6f 29 3b 0a  eryFunc(pInfo);.
9250: 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 65      if( pInfo->e
9260: 57 69 74 68 69 6e 3c 2a 70 65 57 69 74 68 69 6e  Within<*peWithin
9270: 20 29 20 2a 70 65 57 69 74 68 69 6e 20 3d 20 70   ) *peWithin = p
9280: 49 6e 66 6f 2d 3e 65 57 69 74 68 69 6e 3b 0a 20  Info->eWithin;. 
9290: 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 72 53     if( pInfo->rS
92a0: 63 6f 72 65 3c 2a 70 72 53 63 6f 72 65 20 7c 7c  core<*prScore ||
92b0: 20 2a 70 72 53 63 6f 72 65 3c 52 54 52 45 45 5f   *prScore<RTREE_
92c0: 5a 45 52 4f 20 29 7b 0a 20 20 20 20 20 20 2a 70  ZERO ){.      *p
92d0: 72 53 63 6f 72 65 20 3d 20 70 49 6e 66 6f 2d 3e  rScore = pInfo->
92e0: 72 53 63 6f 72 65 3b 0a 20 20 20 20 7d 0a 20 20  rScore;.    }.  
92f0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
9300: 0a 0a 2f 2a 20 0a 2a 2a 20 43 68 65 63 6b 20 74  ../* .** Check t
9310: 68 65 20 69 6e 74 65 72 6e 61 6c 20 52 54 72 65  he internal RTre
9320: 65 20 6e 6f 64 65 20 67 69 76 65 6e 20 62 79 20  e node given by 
9330: 70 43 65 6c 6c 44 61 74 61 20 61 67 61 69 6e 73  pCellData agains
9340: 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 70 2e 0a  t constraint p..
9350: 2a 2a 20 49 66 20 74 68 69 73 20 63 6f 6e 73 74  ** If this const
9360: 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20  raint cannot be 
9370: 73 61 74 69 73 66 69 65 64 20 62 79 20 61 6e 79  satisfied by any
9380: 20 63 68 69 6c 64 20 77 69 74 68 69 6e 20 74 68   child within th
9390: 65 20 6e 6f 64 65 2c 0a 2a 2a 20 73 65 74 20 2a  e node,.** set *
93a0: 70 65 57 69 74 68 69 6e 20 74 6f 20 4e 4f 54 5f  peWithin to NOT_
93b0: 57 49 54 48 49 4e 2e 0a 2a 2f 0a 73 74 61 74 69  WITHIN..*/.stati
93c0: 63 20 76 6f 69 64 20 72 74 72 65 65 4e 6f 6e 6c  c void rtreeNonl
93d0: 65 61 66 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20  eafConstraint(. 
93e0: 20 52 74 72 65 65 43 6f 6e 73 74 72 61 69 6e 74   RtreeConstraint
93f0: 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54   *p,        /* T
9400: 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 6f  he constraint to
9410: 20 74 65 73 74 20 2a 2f 0a 20 20 69 6e 74 20 65   test */.  int e
9420: 49 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  Int,            
9430: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
9440: 20 52 54 72 65 65 20 68 6f 6c 64 73 20 69 6e 74   RTree holds int
9450: 65 67 65 72 20 63 6f 6f 72 64 69 6e 61 74 65 73  eger coordinates
9460: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 44   */.  u8 *pCellD
9470: 61 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20  ata,            
9480: 20 2f 2a 20 52 61 77 20 63 65 6c 6c 20 63 6f 6e   /* Raw cell con
9490: 74 65 6e 74 20 61 73 20 61 70 70 65 61 72 73 20  tent as appears 
94a0: 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 69 6e 74  on disk */.  int
94b0: 20 2a 70 65 57 69 74 68 69 6e 20 20 20 20 20 20   *peWithin      
94c0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73          /* Adjus
94d0: 74 20 64 6f 77 6e 77 61 72 64 2c 20 61 73 20 61  t downward, as a
94e0: 70 70 72 6f 70 72 69 61 74 65 20 2a 2f 0a 29 7b  ppropriate */.){
94f0: 0a 20 20 73 71 6c 69 74 65 33 5f 72 74 72 65 65  .  sqlite3_rtree
9500: 5f 64 62 6c 20 76 61 6c 3b 20 20 20 20 20 2f 2a  _dbl val;     /*
9510: 20 43 6f 6f 72 64 69 6e 61 74 65 20 76 61 6c 75   Coordinate valu
9520: 65 20 63 6f 6e 76 65 72 74 20 74 6f 20 61 20 64  e convert to a d
9530: 6f 75 62 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 70  ouble */..  /* p
9540: 2d 3e 69 43 6f 6f 72 64 20 6d 69 67 68 74 20 70  ->iCoord might p
9550: 6f 69 6e 74 20 74 6f 20 65 69 74 68 65 72 20 61  oint to either a
9560: 20 6c 6f 77 65 72 20 6f 72 20 75 70 70 65 72 20   lower or upper 
9570: 62 6f 75 6e 64 20 63 6f 6f 72 64 69 6e 61 74 65  bound coordinate
9580: 0a 20 20 2a 2a 20 69 6e 20 61 20 63 6f 6f 72 64  .  ** in a coord
9590: 69 6e 61 74 65 20 70 61 69 72 2e 20 20 42 75 74  inate pair.  But
95a0: 20 6d 61 6b 65 20 70 43 65 6c 6c 44 61 74 61 20   make pCellData 
95b0: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6c 6f 77  point to the low
95c0: 65 72 20 62 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20  er bound..  */. 
95d0: 20 70 43 65 6c 6c 44 61 74 61 20 2b 3d 20 38 20   pCellData += 8 
95e0: 2b 20 34 2a 28 70 2d 3e 69 43 6f 6f 72 64 26 30  + 4*(p->iCoord&0
95f0: 78 66 65 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  xfe);..  assert(
9600: 70 2d 3e 6f 70 3d 3d 52 54 52 45 45 5f 4c 45 20  p->op==RTREE_LE 
9610: 7c 7c 20 70 2d 3e 6f 70 3d 3d 52 54 52 45 45 5f  || p->op==RTREE_
9620: 4c 54 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 52 54 52  LT || p->op==RTR
9630: 45 45 5f 47 45 20 0a 20 20 20 20 20 20 7c 7c 20  EE_GE .      || 
9640: 70 2d 3e 6f 70 3d 3d 52 54 52 45 45 5f 47 54 20  p->op==RTREE_GT 
9650: 7c 7c 20 70 2d 3e 6f 70 3d 3d 52 54 52 45 45 5f  || p->op==RTREE_
9660: 45 51 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EQ );.  assert( 
9670: 28 28 28 28 63 68 61 72 2a 29 70 43 65 6c 6c 44  ((((char*)pCellD
9680: 61 74 61 29 20 2d 20 28 63 68 61 72 2a 29 30 29  ata) - (char*)0)
9690: 26 33 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 34 2d  &3)==0 );  /* 4-
96a0: 62 79 74 65 20 61 6c 69 67 6e 65 64 20 2a 2f 0a  byte aligned */.
96b0: 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20    switch( p->op 
96c0: 29 7b 0a 20 20 20 20 63 61 73 65 20 52 54 52 45  ){.    case RTRE
96d0: 45 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 52  E_LE:.    case R
96e0: 54 52 45 45 5f 4c 54 3a 0a 20 20 20 20 63 61 73  TREE_LT:.    cas
96f0: 65 20 52 54 52 45 45 5f 45 51 3a 0a 20 20 20 20  e RTREE_EQ:.    
9700: 20 20 52 54 52 45 45 5f 44 45 43 4f 44 45 5f 43    RTREE_DECODE_C
9710: 4f 4f 52 44 28 65 49 6e 74 2c 20 70 43 65 6c 6c  OORD(eInt, pCell
9720: 44 61 74 61 2c 20 76 61 6c 29 3b 0a 20 20 20 20  Data, val);.    
9730: 20 20 2f 2a 20 76 61 6c 20 6e 6f 77 20 68 6f 6c    /* val now hol
9740: 64 73 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75  ds the lower bou
9750: 6e 64 20 6f 66 20 74 68 65 20 63 6f 6f 72 64 69  nd of the coordi
9760: 6e 61 74 65 20 70 61 69 72 20 2a 2f 0a 20 20 20  nate pair */.   
9770: 20 20 20 69 66 28 20 70 2d 3e 75 2e 72 56 61 6c     if( p->u.rVal
9780: 75 65 3e 3d 76 61 6c 20 29 20 72 65 74 75 72 6e  ue>=val ) return
9790: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f  ;.      if( p->o
97a0: 70 21 3d 52 54 52 45 45 5f 45 51 20 29 20 62 72  p!=RTREE_EQ ) br
97b0: 65 61 6b 3b 20 20 2f 2a 20 52 54 52 45 45 5f 4c  eak;  /* RTREE_L
97c0: 45 20 61 6e 64 20 52 54 52 45 45 5f 4c 54 20 65  E and RTREE_LT e
97d0: 6e 64 20 68 65 72 65 20 2a 2f 0a 20 20 20 20 20  nd here */.     
97e0: 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68   /* Fall through
97f0: 20 66 6f 72 20 74 68 65 20 52 54 52 45 45 5f 45   for the RTREE_E
9800: 51 20 63 61 73 65 20 2a 2f 0a 0a 20 20 20 20 64  Q case */..    d
9810: 65 66 61 75 6c 74 3a 20 2f 2a 20 52 54 52 45 45  efault: /* RTREE
9820: 5f 47 54 20 6f 72 20 52 54 52 45 45 5f 47 45 2c  _GT or RTREE_GE,
9830: 20 20 6f 72 20 66 61 6c 6c 74 68 72 6f 75 67 68    or fallthrough
9840: 20 6f 66 20 52 54 52 45 45 5f 45 51 20 2a 2f 0a   of RTREE_EQ */.
9850: 20 20 20 20 20 20 70 43 65 6c 6c 44 61 74 61 20        pCellData 
9860: 2b 3d 20 34 3b 0a 20 20 20 20 20 20 52 54 52 45  += 4;.      RTRE
9870: 45 5f 44 45 43 4f 44 45 5f 43 4f 4f 52 44 28 65  E_DECODE_COORD(e
9880: 49 6e 74 2c 20 70 43 65 6c 6c 44 61 74 61 2c 20  Int, pCellData, 
9890: 76 61 6c 29 3b 0a 20 20 20 20 20 20 2f 2a 20 76  val);.      /* v
98a0: 61 6c 20 6e 6f 77 20 68 6f 6c 64 73 20 74 68 65  al now holds the
98b0: 20 75 70 70 65 72 20 62 6f 75 6e 64 20 6f 66 20   upper bound of 
98c0: 74 68 65 20 63 6f 6f 72 64 69 6e 61 74 65 20 70  the coordinate p
98d0: 61 69 72 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  air */.      if(
98e0: 20 70 2d 3e 75 2e 72 56 61 6c 75 65 3c 3d 76 61   p->u.rValue<=va
98f0: 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a  l ) return;.  }.
9900: 20 20 2a 70 65 57 69 74 68 69 6e 20 3d 20 4e 4f    *peWithin = NO
9910: 54 5f 57 49 54 48 49 4e 3b 0a 7d 0a 0a 2f 2a 0a  T_WITHIN;.}../*.
9920: 2a 2a 20 43 68 65 63 6b 20 74 68 65 20 6c 65 61  ** Check the lea
9930: 66 20 52 54 72 65 65 20 63 65 6c 6c 20 67 69 76  f RTree cell giv
9940: 65 6e 20 62 79 20 70 43 65 6c 6c 44 61 74 61 20  en by pCellData 
9950: 61 67 61 69 6e 73 74 20 63 6f 6e 73 74 72 61 69  against constrai
9960: 6e 74 20 70 2e 0a 2a 2a 20 49 66 20 74 68 69 73  nt p..** If this
9970: 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6e   constraint is n
9980: 6f 74 20 73 61 74 69 73 66 69 65 64 2c 20 73 65  ot satisfied, se
9990: 74 20 2a 70 65 57 69 74 68 69 6e 20 74 6f 20 4e  t *peWithin to N
99a0: 4f 54 5f 57 49 54 48 49 4e 2e 0a 2a 2a 20 49 66  OT_WITHIN..** If
99b0: 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
99c0: 69 73 20 73 61 74 69 73 66 69 65 64 2c 20 6c 65  is satisfied, le
99d0: 61 76 65 20 2a 70 65 57 69 74 68 69 6e 20 75 6e  ave *peWithin un
99e0: 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  changed..**.** T
99f0: 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73  he constraint is
9a00: 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 78   of the form:  x
9a10: 4e 20 6f 70 20 24 76 61 6c 0a 2a 2a 0a 2a 2a 20  N op $val.**.** 
9a20: 54 68 65 20 6f 70 20 69 73 20 67 69 76 65 6e 20  The op is given 
9a30: 62 79 20 70 2d 3e 6f 70 2e 20 20 54 68 65 20 78  by p->op.  The x
9a40: 4e 20 69 73 20 70 2d 3e 69 43 6f 6f 72 64 2d 74  N is p->iCoord-t
9a50: 68 20 63 6f 6f 72 64 69 6e 61 74 65 20 69 6e 0a  h coordinate in.
9a60: 2a 2a 20 70 43 65 6c 6c 44 61 74 61 2e 20 20 24  ** pCellData.  $
9a70: 76 61 6c 20 69 73 20 67 69 76 65 6e 20 62 79 20  val is given by 
9a80: 70 2d 3e 75 2e 72 56 61 6c 75 65 2e 0a 2a 2f 0a  p->u.rValue..*/.
9a90: 73 74 61 74 69 63 20 76 6f 69 64 20 72 74 72 65  static void rtre
9aa0: 65 4c 65 61 66 43 6f 6e 73 74 72 61 69 6e 74 28  eLeafConstraint(
9ab0: 0a 20 20 52 74 72 65 65 43 6f 6e 73 74 72 61 69  .  RtreeConstrai
9ac0: 6e 74 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a  nt *p,        /*
9ad0: 20 54 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   The constraint 
9ae0: 74 6f 20 74 65 73 74 20 2a 2f 0a 20 20 69 6e 74  to test */.  int
9af0: 20 65 49 6e 74 2c 20 20 20 20 20 20 20 20 20 20   eInt,          
9b00: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
9b10: 69 66 20 52 54 72 65 65 20 68 6f 6c 64 73 20 69  if RTree holds i
9b20: 6e 74 65 67 65 72 20 63 6f 6f 72 64 69 6e 61 74  nteger coordinat
9b30: 65 73 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  es */.  u8 *pCel
9b40: 6c 44 61 74 61 2c 20 20 20 20 20 20 20 20 20 20  lData,          
9b50: 20 20 20 2f 2a 20 52 61 77 20 63 65 6c 6c 20 63     /* Raw cell c
9b60: 6f 6e 74 65 6e 74 20 61 73 20 61 70 70 65 61 72  ontent as appear
9b70: 73 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 69  s on disk */.  i
9b80: 6e 74 20 2a 70 65 57 69 74 68 69 6e 20 20 20 20  nt *peWithin    
9b90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 6a            /* Adj
9ba0: 75 73 74 20 64 6f 77 6e 77 61 72 64 2c 20 61 73  ust downward, as
9bb0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 2a 2f 0a   appropriate */.
9bc0: 29 7b 0a 20 20 52 74 72 65 65 44 56 61 6c 75 65  ){.  RtreeDValue
9bd0: 20 78 4e 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6f   xN;      /* Coo
9be0: 72 64 69 6e 61 74 65 20 76 61 6c 75 65 20 63 6f  rdinate value co
9bf0: 6e 76 65 72 74 65 64 20 74 6f 20 61 20 64 6f 75  nverted to a dou
9c00: 62 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ble */..  assert
9c10: 28 70 2d 3e 6f 70 3d 3d 52 54 52 45 45 5f 4c 45  (p->op==RTREE_LE
9c20: 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 52 54 52 45 45   || p->op==RTREE
9c30: 5f 4c 54 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 52 54  _LT || p->op==RT
9c40: 52 45 45 5f 47 45 20 0a 20 20 20 20 20 20 7c 7c  REE_GE .      ||
9c50: 20 70 2d 3e 6f 70 3d 3d 52 54 52 45 45 5f 47 54   p->op==RTREE_GT
9c60: 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 52 54 52 45 45   || p->op==RTREE
9c70: 5f 45 51 20 29 3b 0a 20 20 70 43 65 6c 6c 44 61  _EQ );.  pCellDa
9c80: 74 61 20 2b 3d 20 38 20 2b 20 70 2d 3e 69 43 6f  ta += 8 + p->iCo
9c90: 6f 72 64 2a 34 3b 0a 20 20 61 73 73 65 72 74 28  ord*4;.  assert(
9ca0: 20 28 28 28 28 63 68 61 72 2a 29 70 43 65 6c 6c   ((((char*)pCell
9cb0: 44 61 74 61 29 20 2d 20 28 63 68 61 72 2a 29 30  Data) - (char*)0
9cc0: 29 26 33 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 34  )&3)==0 );  /* 4
9cd0: 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 2a 2f  -byte aligned */
9ce0: 0a 20 20 52 54 52 45 45 5f 44 45 43 4f 44 45 5f  .  RTREE_DECODE_
9cf0: 43 4f 4f 52 44 28 65 49 6e 74 2c 20 70 43 65 6c  COORD(eInt, pCel
9d00: 6c 44 61 74 61 2c 20 78 4e 29 3b 0a 20 20 73 77  lData, xN);.  sw
9d10: 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20  itch( p->op ){. 
9d20: 20 20 20 63 61 73 65 20 52 54 52 45 45 5f 4c 45     case RTREE_LE
9d30: 3a 20 69 66 28 20 78 4e 20 3c 3d 20 70 2d 3e 75  : if( xN <= p->u
9d40: 2e 72 56 61 6c 75 65 20 29 20 72 65 74 75 72 6e  .rValue ) return
9d50: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;  break;.    ca
9d60: 73 65 20 52 54 52 45 45 5f 4c 54 3a 20 69 66 28  se RTREE_LT: if(
9d70: 20 78 4e 20 3c 20 20 70 2d 3e 75 2e 72 56 61 6c   xN <  p->u.rVal
9d80: 75 65 20 29 20 72 65 74 75 72 6e 3b 20 20 62 72  ue ) return;  br
9d90: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 52 54  eak;.    case RT
9da0: 52 45 45 5f 47 45 3a 20 69 66 28 20 78 4e 20 3e  REE_GE: if( xN >
9db0: 3d 20 70 2d 3e 75 2e 72 56 61 6c 75 65 20 29 20  = p->u.rValue ) 
9dc0: 72 65 74 75 72 6e 3b 20 20 62 72 65 61 6b 3b 0a  return;  break;.
9dd0: 20 20 20 20 63 61 73 65 20 52 54 52 45 45 5f 47      case RTREE_G
9de0: 54 3a 20 69 66 28 20 78 4e 20 3e 20 20 70 2d 3e  T: if( xN >  p->
9df0: 75 2e 72 56 61 6c 75 65 20 29 20 72 65 74 75 72  u.rValue ) retur
9e00: 6e 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64  n;  break;.    d
9e10: 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 69 66  efault:       if
9e20: 28 20 78 4e 20 3d 3d 20 70 2d 3e 75 2e 72 56 61  ( xN == p->u.rVa
9e30: 6c 75 65 20 29 20 72 65 74 75 72 6e 3b 20 20 62  lue ) return;  b
9e40: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 2a 70 65 57  reak;.  }.  *peW
9e50: 69 74 68 69 6e 20 3d 20 4e 4f 54 5f 57 49 54 48  ithin = NOT_WITH
9e60: 49 4e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 65  IN;.}../*.** One
9e70: 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 69 6e   of the cells in
9e80: 20 6e 6f 64 65 20 70 4e 6f 64 65 20 69 73 20 67   node pNode is g
9e90: 75 61 72 61 6e 74 65 65 64 20 74 6f 20 68 61 76  uaranteed to hav
9ea0: 65 20 61 20 36 34 2d 62 69 74 20 0a 2a 2a 20 69  e a 64-bit .** i
9eb0: 6e 74 65 67 65 72 20 76 61 6c 75 65 20 65 71 75  nteger value equ
9ec0: 61 6c 20 74 6f 20 69 52 6f 77 69 64 2e 20 52 65  al to iRowid. Re
9ed0: 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
9ee0: 66 20 74 68 69 73 20 63 65 6c 6c 2e 0a 2a 2f 0a  f this cell..*/.
9ef0: 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 64 65 52  static int nodeR
9f00: 6f 77 69 64 49 6e 64 65 78 28 0a 20 20 52 74 72  owidIndex(.  Rtr
9f10: 65 65 20 2a 70 52 74 72 65 65 2c 20 0a 20 20 52  ee *pRtree, .  R
9f20: 74 72 65 65 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c  treeNode *pNode,
9f30: 20 0a 20 20 69 36 34 20 69 52 6f 77 69 64 2c 0a   .  i64 iRowid,.
9f40: 20 20 69 6e 74 20 2a 70 69 49 6e 64 65 78 0a 29    int *piIndex.)
9f50: 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e  {.  int ii;.  in
9f60: 74 20 6e 43 65 6c 6c 20 3d 20 4e 43 45 4c 4c 28  t nCell = NCELL(
9f70: 70 4e 6f 64 65 29 3b 0a 20 20 61 73 73 65 72 74  pNode);.  assert
9f80: 28 20 6e 43 65 6c 6c 3c 32 30 30 20 29 3b 0a 20  ( nCell<200 );. 
9f90: 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 43   for(ii=0; ii<nC
9fa0: 65 6c 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  ell; ii++){.    
9fb0: 69 66 28 20 6e 6f 64 65 47 65 74 52 6f 77 69 64  if( nodeGetRowid
9fc0: 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65 2c 20  (pRtree, pNode, 
9fd0: 69 69 29 3d 3d 69 52 6f 77 69 64 20 29 7b 0a 20  ii)==iRowid ){. 
9fe0: 20 20 20 20 20 2a 70 69 49 6e 64 65 78 20 3d 20       *piIndex = 
9ff0: 69 69 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ii;.      return
a000: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
a010: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
a020: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54  QLITE_CORRUPT_VT
a030: 41 42 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  AB;.}../*.** Ret
a040: 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66  urn the index of
a050: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 61 69   the cell contai
a060: 6e 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 74  ning a pointer t
a070: 6f 20 6e 6f 64 65 20 70 4e 6f 64 65 0a 2a 2a 20  o node pNode.** 
a080: 69 6e 20 69 74 73 20 70 61 72 65 6e 74 2e 20 49  in its parent. I
a090: 66 20 70 4e 6f 64 65 20 69 73 20 74 68 65 20 72  f pNode is the r
a0a0: 6f 6f 74 20 6e 6f 64 65 2c 20 72 65 74 75 72 6e  oot node, return
a0b0: 20 2d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69   -1..*/.static i
a0c0: 6e 74 20 6e 6f 64 65 50 61 72 65 6e 74 49 6e 64  nt nodeParentInd
a0d0: 65 78 28 52 74 72 65 65 20 2a 70 52 74 72 65 65  ex(Rtree *pRtree
a0e0: 2c 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 4e 6f  , RtreeNode *pNo
a0f0: 64 65 2c 20 69 6e 74 20 2a 70 69 49 6e 64 65 78  de, int *piIndex
a100: 29 7b 0a 20 20 52 74 72 65 65 4e 6f 64 65 20 2a  ){.  RtreeNode *
a110: 70 50 61 72 65 6e 74 20 3d 20 70 4e 6f 64 65 2d  pParent = pNode-
a120: 3e 70 50 61 72 65 6e 74 3b 0a 20 20 69 66 28 20  >pParent;.  if( 
a130: 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 72  pParent ){.    r
a140: 65 74 75 72 6e 20 6e 6f 64 65 52 6f 77 69 64 49  eturn nodeRowidI
a150: 6e 64 65 78 28 70 52 74 72 65 65 2c 20 70 50 61  ndex(pRtree, pPa
a160: 72 65 6e 74 2c 20 70 4e 6f 64 65 2d 3e 69 4e 6f  rent, pNode->iNo
a170: 64 65 2c 20 70 69 49 6e 64 65 78 29 3b 0a 20 20  de, piIndex);.  
a180: 7d 0a 20 20 2a 70 69 49 6e 64 65 78 20 3d 20 2d  }.  *piIndex = -
a190: 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  1;.  return SQLI
a1a0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
a1b0: 43 6f 6d 70 61 72 65 20 74 77 6f 20 73 65 61 72  Compare two sear
a1c0: 63 68 20 70 6f 69 6e 74 73 2e 20 20 52 65 74 75  ch points.  Retu
a1d0: 72 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72  rn negative, zer
a1e0: 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69  o, or positive i
a1f0: 66 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69  f the first.** i
a200: 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75  s less than, equ
a210: 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65  al to, or greate
a220: 72 20 74 68 61 6e 20 74 68 65 20 73 65 63 6f 6e  r than the secon
a230: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 53 63  d..**.** The rSc
a240: 6f 72 65 20 69 73 20 74 68 65 20 70 72 69 6d 61  ore is the prima
a250: 72 79 20 6b 65 79 2e 20 20 53 6d 61 6c 6c 65 72  ry key.  Smaller
a260: 20 72 53 63 6f 72 65 20 76 61 6c 75 65 73 20 63   rScore values c
a270: 6f 6d 65 20 66 69 72 73 74 2e 0a 2a 2a 20 49 66  ome first..** If
a280: 20 74 68 65 20 72 53 63 6f 72 65 20 69 73 20 61   the rScore is a
a290: 20 74 69 65 2c 20 74 68 65 6e 20 75 73 65 20 69   tie, then use i
a2a0: 4c 65 76 65 6c 20 61 73 20 74 68 65 20 74 69 65  Level as the tie
a2b0: 20 62 72 65 61 6b 65 72 20 77 69 74 68 20 73 6d   breaker with sm
a2c0: 61 6c 6c 65 72 0a 2a 2a 20 69 4c 65 76 65 6c 20  aller.** iLevel 
a2d0: 76 61 6c 75 65 73 20 63 6f 6d 69 6e 67 20 66 69  values coming fi
a2e0: 72 73 74 2e 20 20 49 6e 20 74 68 69 73 20 77 61  rst.  In this wa
a2f0: 79 2c 20 69 66 20 72 53 63 6f 72 65 20 69 73 20  y, if rScore is 
a300: 74 68 65 20 73 61 6d 65 20 66 6f 72 20 61 6c 6c  the same for all
a310: 0a 2a 2a 20 53 65 61 72 63 68 50 6f 69 6e 74 73  .** SearchPoints
a320: 2c 20 74 68 65 6e 20 69 4c 65 76 65 6c 20 62 65  , then iLevel be
a330: 63 6f 6d 65 73 20 74 68 65 20 64 65 63 69 64 69  comes the decidi
a340: 6e 67 20 66 61 63 74 6f 72 20 61 6e 64 20 74 68  ng factor and th
a350: 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 73 20 61  e result.** is a
a360: 20 64 65 70 74 68 2d 66 69 72 73 74 20 73 65 61   depth-first sea
a370: 72 63 68 2c 20 77 68 69 63 68 20 69 73 20 74 68  rch, which is th
a380: 65 20 64 65 73 69 72 65 64 20 64 65 66 61 75 6c  e desired defaul
a390: 74 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 73  t behavior..*/.s
a3a0: 74 61 74 69 63 20 69 6e 74 20 72 74 72 65 65 53  tatic int rtreeS
a3b0: 65 61 72 63 68 50 6f 69 6e 74 43 6f 6d 70 61 72  earchPointCompar
a3c0: 65 28 0a 20 20 63 6f 6e 73 74 20 52 74 72 65 65  e(.  const Rtree
a3d0: 53 65 61 72 63 68 50 6f 69 6e 74 20 2a 70 41 2c  SearchPoint *pA,
a3e0: 0a 20 20 63 6f 6e 73 74 20 52 74 72 65 65 53 65  .  const RtreeSe
a3f0: 61 72 63 68 50 6f 69 6e 74 20 2a 70 42 0a 29 7b  archPoint *pB.){
a400: 0a 20 20 69 66 28 20 70 41 2d 3e 72 53 63 6f 72  .  if( pA->rScor
a410: 65 3c 70 42 2d 3e 72 53 63 6f 72 65 20 29 20 72  e<pB->rScore ) r
a420: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 69 66 28 20  eturn -1;.  if( 
a430: 70 41 2d 3e 72 53 63 6f 72 65 3e 70 42 2d 3e 72  pA->rScore>pB->r
a440: 53 63 6f 72 65 20 29 20 72 65 74 75 72 6e 20 2b  Score ) return +
a450: 31 3b 0a 20 20 69 66 28 20 70 41 2d 3e 69 4c 65  1;.  if( pA->iLe
a460: 76 65 6c 3c 70 42 2d 3e 69 4c 65 76 65 6c 20 29  vel<pB->iLevel )
a470: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 69 66   return -1;.  if
a480: 28 20 70 41 2d 3e 69 4c 65 76 65 6c 3e 70 42 2d  ( pA->iLevel>pB-
a490: 3e 69 4c 65 76 65 6c 20 29 20 72 65 74 75 72 6e  >iLevel ) return
a4a0: 20 2b 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b   +1;.  return 0;
a4b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 63  .}../*.** Interc
a4c0: 68 61 6e 67 65 20 74 77 6f 20 73 65 61 72 63 68  hange two search
a4d0: 20 70 6f 69 6e 74 73 20 69 6e 20 61 20 63 75 72   points in a cur
a4e0: 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  sor..*/.static v
a4f0: 6f 69 64 20 72 74 72 65 65 53 65 61 72 63 68 50  oid rtreeSearchP
a500: 6f 69 6e 74 53 77 61 70 28 52 74 72 65 65 43 75  ointSwap(RtreeCu
a510: 72 73 6f 72 20 2a 70 2c 20 69 6e 74 20 69 2c 20  rsor *p, int i, 
a520: 69 6e 74 20 6a 29 7b 0a 20 20 52 74 72 65 65 53  int j){.  RtreeS
a530: 65 61 72 63 68 50 6f 69 6e 74 20 74 20 3d 20 70  earchPoint t = p
a540: 2d 3e 61 50 6f 69 6e 74 5b 69 5d 3b 0a 20 20 61  ->aPoint[i];.  a
a550: 73 73 65 72 74 28 20 69 3c 6a 20 29 3b 0a 20 20  ssert( i<j );.  
a560: 70 2d 3e 61 50 6f 69 6e 74 5b 69 5d 20 3d 20 70  p->aPoint[i] = p
a570: 2d 3e 61 50 6f 69 6e 74 5b 6a 5d 3b 0a 20 20 70  ->aPoint[j];.  p
a580: 2d 3e 61 50 6f 69 6e 74 5b 6a 5d 20 3d 20 74 3b  ->aPoint[j] = t;
a590: 0a 20 20 69 2b 2b 3b 20 6a 2b 2b 3b 0a 20 20 69  .  i++; j++;.  i
a5a0: 66 28 20 69 3c 52 54 52 45 45 5f 43 41 43 48 45  f( i<RTREE_CACHE
a5b0: 5f 53 5a 20 29 7b 0a 20 20 20 20 69 66 28 20 6a  _SZ ){.    if( j
a5c0: 3e 3d 52 54 52 45 45 5f 43 41 43 48 45 5f 53 5a  >=RTREE_CACHE_SZ
a5d0: 20 29 7b 0a 20 20 20 20 20 20 6e 6f 64 65 52 65   ){.      nodeRe
a5e0: 6c 65 61 73 65 28 52 54 52 45 45 5f 4f 46 5f 43  lease(RTREE_OF_C
a5f0: 55 52 53 4f 52 28 70 29 2c 20 70 2d 3e 61 4e 6f  URSOR(p), p->aNo
a600: 64 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 2d  de[i]);.      p-
a610: 3e 61 4e 6f 64 65 5b 69 5d 20 3d 20 30 3b 0a 20  >aNode[i] = 0;. 
a620: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a630: 52 74 72 65 65 4e 6f 64 65 20 2a 70 54 65 6d 70  RtreeNode *pTemp
a640: 20 3d 20 70 2d 3e 61 4e 6f 64 65 5b 69 5d 3b 0a   = p->aNode[i];.
a650: 20 20 20 20 20 20 70 2d 3e 61 4e 6f 64 65 5b 69        p->aNode[i
a660: 5d 20 3d 20 70 2d 3e 61 4e 6f 64 65 5b 6a 5d 3b  ] = p->aNode[j];
a670: 0a 20 20 20 20 20 20 70 2d 3e 61 4e 6f 64 65 5b  .      p->aNode[
a680: 6a 5d 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20  j] = pTemp;.    
a690: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  }.  }.}../*.** R
a6a0: 65 74 75 72 6e 20 74 68 65 20 73 65 61 72 63 68  eturn the search
a6b0: 20 70 6f 69 6e 74 20 77 69 74 68 20 74 68 65 20   point with the 
a6c0: 6c 6f 77 65 73 74 20 63 75 72 72 65 6e 74 20 73  lowest current s
a6d0: 63 6f 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  core..*/.static 
a6e0: 52 74 72 65 65 53 65 61 72 63 68 50 6f 69 6e 74  RtreeSearchPoint
a6f0: 20 2a 72 74 72 65 65 53 65 61 72 63 68 50 6f 69   *rtreeSearchPoi
a700: 6e 74 46 69 72 73 74 28 52 74 72 65 65 43 75 72  ntFirst(RtreeCur
a710: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65  sor *pCur){.  re
a720: 74 75 72 6e 20 70 43 75 72 2d 3e 62 50 6f 69 6e  turn pCur->bPoin
a730: 74 20 3f 20 26 70 43 75 72 2d 3e 73 50 6f 69 6e  t ? &pCur->sPoin
a740: 74 20 3a 20 70 43 75 72 2d 3e 6e 50 6f 69 6e 74  t : pCur->nPoint
a750: 20 3f 20 70 43 75 72 2d 3e 61 50 6f 69 6e 74 20   ? pCur->aPoint 
a760: 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  : 0;.}../*.** Ge
a770: 74 20 74 68 65 20 52 74 72 65 65 4e 6f 64 65 20  t the RtreeNode 
a780: 66 6f 72 20 74 68 65 20 73 65 61 72 63 68 20 70  for the search p
a790: 6f 69 6e 74 20 77 69 74 68 20 74 68 65 20 6c 6f  oint with the lo
a7a0: 77 65 73 74 20 73 63 6f 72 65 2e 0a 2a 2f 0a 73  west score..*/.s
a7b0: 74 61 74 69 63 20 52 74 72 65 65 4e 6f 64 65 20  tatic RtreeNode 
a7c0: 2a 72 74 72 65 65 4e 6f 64 65 4f 66 46 69 72 73  *rtreeNodeOfFirs
a7d0: 74 53 65 61 72 63 68 50 6f 69 6e 74 28 52 74 72  tSearchPoint(Rtr
a7e0: 65 65 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  eeCursor *pCur, 
a7f0: 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 73 71 6c  int *pRC){.  sql
a800: 69 74 65 33 5f 69 6e 74 36 34 20 69 64 3b 0a 20  ite3_int64 id;. 
a810: 20 69 6e 74 20 69 69 20 3d 20 31 20 2d 20 70 43   int ii = 1 - pC
a820: 75 72 2d 3e 62 50 6f 69 6e 74 3b 0a 20 20 61 73  ur->bPoint;.  as
a830: 73 65 72 74 28 20 69 69 3d 3d 30 20 7c 7c 20 69  sert( ii==0 || i
a840: 69 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  i==1 );.  assert
a850: 28 20 70 43 75 72 2d 3e 62 50 6f 69 6e 74 20 7c  ( pCur->bPoint |
a860: 7c 20 70 43 75 72 2d 3e 6e 50 6f 69 6e 74 20 29  | pCur->nPoint )
a870: 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4e  ;.  if( pCur->aN
a880: 6f 64 65 5b 69 69 5d 3d 3d 30 20 29 7b 0a 20 20  ode[ii]==0 ){.  
a890: 20 20 61 73 73 65 72 74 28 20 70 52 43 21 3d 30    assert( pRC!=0
a8a0: 20 29 3b 0a 20 20 20 20 69 64 20 3d 20 69 69 20   );.    id = ii 
a8b0: 3f 20 70 43 75 72 2d 3e 61 50 6f 69 6e 74 5b 30  ? pCur->aPoint[0
a8c0: 5d 2e 69 64 20 3a 20 70 43 75 72 2d 3e 73 50 6f  ].id : pCur->sPo
a8d0: 69 6e 74 2e 69 64 3b 0a 20 20 20 20 2a 70 52 43  int.id;.    *pRC
a8e0: 20 3d 20 6e 6f 64 65 41 63 71 75 69 72 65 28 52   = nodeAcquire(R
a8f0: 54 52 45 45 5f 4f 46 5f 43 55 52 53 4f 52 28 70  TREE_OF_CURSOR(p
a900: 43 75 72 29 2c 20 69 64 2c 20 30 2c 20 26 70 43  Cur), id, 0, &pC
a910: 75 72 2d 3e 61 4e 6f 64 65 5b 69 69 5d 29 3b 0a  ur->aNode[ii]);.
a920: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 75    }.  return pCu
a930: 72 2d 3e 61 4e 6f 64 65 5b 69 69 5d 3b 0a 7d 0a  r->aNode[ii];.}.
a940: 0a 2f 2a 0a 2a 2a 20 50 75 73 68 20 61 20 6e 65  ./*.** Push a ne
a950: 77 20 65 6c 65 6d 65 6e 74 20 6f 6e 74 6f 20 74  w element onto t
a960: 68 65 20 70 72 69 6f 72 69 74 79 20 71 75 65 75  he priority queu
a970: 65 0a 2a 2f 0a 73 74 61 74 69 63 20 52 74 72 65  e.*/.static Rtre
a980: 65 53 65 61 72 63 68 50 6f 69 6e 74 20 2a 72 74  eSearchPoint *rt
a990: 72 65 65 45 6e 71 75 65 75 65 28 0a 20 20 52 74  reeEnqueue(.  Rt
a9a0: 72 65 65 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  reeCursor *pCur,
a9b0: 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
a9c0: 72 20 2a 2f 0a 20 20 52 74 72 65 65 44 56 61 6c  r */.  RtreeDVal
a9d0: 75 65 20 72 53 63 6f 72 65 2c 20 20 20 2f 2a 20  ue rScore,   /* 
a9e0: 53 63 6f 72 65 20 66 6f 72 20 74 68 65 20 6e 65  Score for the ne
a9f0: 77 20 73 65 61 72 63 68 20 70 6f 69 6e 74 20 2a  w search point *
aa00: 2f 0a 20 20 75 38 20 69 4c 65 76 65 6c 20 20 20  /.  u8 iLevel   
aa10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 76            /* Lev
aa20: 65 6c 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73  el for the new s
aa30: 65 61 72 63 68 20 70 6f 69 6e 74 20 2a 2f 0a 29  earch point */.)
aa40: 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  {.  int i, j;.  
aa50: 52 74 72 65 65 53 65 61 72 63 68 50 6f 69 6e 74  RtreeSearchPoint
aa60: 20 2a 70 4e 65 77 3b 0a 20 20 69 66 28 20 70 43   *pNew;.  if( pC
aa70: 75 72 2d 3e 6e 50 6f 69 6e 74 3e 3d 70 43 75 72  ur->nPoint>=pCur
aa80: 2d 3e 6e 50 6f 69 6e 74 41 6c 6c 6f 63 20 29 7b  ->nPointAlloc ){
aa90: 0a 20 20 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20  .    int nNew = 
aaa0: 70 43 75 72 2d 3e 6e 50 6f 69 6e 74 41 6c 6c 6f  pCur->nPointAllo
aab0: 63 2a 32 20 2b 20 38 3b 0a 20 20 20 20 70 4e 65  c*2 + 8;.    pNe
aac0: 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c  w = sqlite3_real
aad0: 6c 6f 63 28 70 43 75 72 2d 3e 61 50 6f 69 6e 74  loc(pCur->aPoint
aae0: 2c 20 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 70 43  , nNew*sizeof(pC
aaf0: 75 72 2d 3e 61 50 6f 69 6e 74 5b 30 5d 29 29 3b  ur->aPoint[0]));
ab00: 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  .    if( pNew==0
ab10: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
ab20: 20 70 43 75 72 2d 3e 61 50 6f 69 6e 74 20 3d 20   pCur->aPoint = 
ab30: 70 4e 65 77 3b 0a 20 20 20 20 70 43 75 72 2d 3e  pNew;.    pCur->
ab40: 6e 50 6f 69 6e 74 41 6c 6c 6f 63 20 3d 20 6e 4e  nPointAlloc = nN
ab50: 65 77 3b 0a 20 20 7d 0a 20 20 69 20 3d 20 70 43  ew;.  }.  i = pC
ab60: 75 72 2d 3e 6e 50 6f 69 6e 74 2b 2b 3b 0a 20 20  ur->nPoint++;.  
ab70: 70 4e 65 77 20 3d 20 70 43 75 72 2d 3e 61 50 6f  pNew = pCur->aPo
ab80: 69 6e 74 20 2b 20 69 3b 0a 20 20 70 4e 65 77 2d  int + i;.  pNew-
ab90: 3e 72 53 63 6f 72 65 20 3d 20 72 53 63 6f 72 65  >rScore = rScore
aba0: 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 65 76 65 6c  ;.  pNew->iLevel
abb0: 20 3d 20 69 4c 65 76 65 6c 3b 0a 20 20 61 73 73   = iLevel;.  ass
abc0: 65 72 74 28 20 69 4c 65 76 65 6c 3c 3d 52 54 52  ert( iLevel<=RTR
abd0: 45 45 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a  EE_MAX_DEPTH );.
abe0: 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a    while( i>0 ){.
abf0: 20 20 20 20 52 74 72 65 65 53 65 61 72 63 68 50      RtreeSearchP
ac00: 6f 69 6e 74 20 2a 70 50 61 72 65 6e 74 3b 0a 20  oint *pParent;. 
ac10: 20 20 20 6a 20 3d 20 28 69 2d 31 29 2f 32 3b 0a     j = (i-1)/2;.
ac20: 20 20 20 20 70 50 61 72 65 6e 74 20 3d 20 70 43      pParent = pC
ac30: 75 72 2d 3e 61 50 6f 69 6e 74 20 2b 20 6a 3b 0a  ur->aPoint + j;.
ac40: 20 20 20 20 69 66 28 20 72 74 72 65 65 53 65 61      if( rtreeSea
ac50: 72 63 68 50 6f 69 6e 74 43 6f 6d 70 61 72 65 28  rchPointCompare(
ac60: 70 4e 65 77 2c 20 70 50 61 72 65 6e 74 29 3e 3d  pNew, pParent)>=
ac70: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 72  0 ) break;.    r
ac80: 74 72 65 65 53 65 61 72 63 68 50 6f 69 6e 74 53  treeSearchPointS
ac90: 77 61 70 28 70 43 75 72 2c 20 6a 2c 20 69 29 3b  wap(pCur, j, i);
aca0: 0a 20 20 20 20 69 20 3d 20 6a 3b 0a 20 20 20 20  .    i = j;.    
acb0: 70 4e 65 77 20 3d 20 70 50 61 72 65 6e 74 3b 0a  pNew = pParent;.
acc0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
acd0: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  w;.}../*.** Allo
ace0: 63 61 74 65 20 61 20 6e 65 77 20 52 74 72 65 65  cate a new Rtree
acf0: 53 65 61 72 63 68 50 6f 69 6e 74 20 61 6e 64 20  SearchPoint and 
ad00: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
ad10: 20 74 6f 20 69 74 2e 20 20 52 65 74 75 72 6e 0a   to it.  Return.
ad20: 2a 2a 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f  ** NULL if mallo
ad30: 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  c fails..*/.stat
ad40: 69 63 20 52 74 72 65 65 53 65 61 72 63 68 50 6f  ic RtreeSearchPo
ad50: 69 6e 74 20 2a 72 74 72 65 65 53 65 61 72 63 68  int *rtreeSearch
ad60: 50 6f 69 6e 74 4e 65 77 28 0a 20 20 52 74 72 65  PointNew(.  Rtre
ad70: 65 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  eCursor *pCur,  
ad80: 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
ad90: 2a 2f 0a 20 20 52 74 72 65 65 44 56 61 6c 75 65  */.  RtreeDValue
ada0: 20 72 53 63 6f 72 65 2c 20 20 20 2f 2a 20 53 63   rScore,   /* Sc
adb0: 6f 72 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ore for the new 
adc0: 73 65 61 72 63 68 20 70 6f 69 6e 74 20 2a 2f 0a  search point */.
add0: 20 20 75 38 20 69 4c 65 76 65 6c 20 20 20 20 20    u8 iLevel     
ade0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c          /* Level
adf0: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73 65 61   for the new sea
ae00: 72 63 68 20 70 6f 69 6e 74 20 2a 2f 0a 29 7b 0a  rch point */.){.
ae10: 20 20 52 74 72 65 65 53 65 61 72 63 68 50 6f 69    RtreeSearchPoi
ae20: 6e 74 20 2a 70 4e 65 77 2c 20 2a 70 46 69 72 73  nt *pNew, *pFirs
ae30: 74 3b 0a 20 20 70 46 69 72 73 74 20 3d 20 72 74  t;.  pFirst = rt
ae40: 72 65 65 53 65 61 72 63 68 50 6f 69 6e 74 46 69  reeSearchPointFi
ae50: 72 73 74 28 70 43 75 72 29 3b 0a 20 20 70 43 75  rst(pCur);.  pCu
ae60: 72 2d 3e 61 6e 51 75 65 75 65 5b 69 4c 65 76 65  r->anQueue[iLeve
ae70: 6c 5d 2b 2b 3b 0a 20 20 69 66 28 20 70 46 69 72  l]++;.  if( pFir
ae80: 73 74 3d 3d 30 0a 20 20 20 7c 7c 20 70 46 69 72  st==0.   || pFir
ae90: 73 74 2d 3e 72 53 63 6f 72 65 3e 72 53 63 6f 72  st->rScore>rScor
aea0: 65 20 0a 20 20 20 7c 7c 20 28 70 46 69 72 73 74  e .   || (pFirst
aeb0: 2d 3e 72 53 63 6f 72 65 3d 3d 72 53 63 6f 72 65  ->rScore==rScore
aec0: 20 26 26 20 70 46 69 72 73 74 2d 3e 69 4c 65 76   && pFirst->iLev
aed0: 65 6c 3e 69 4c 65 76 65 6c 29 0a 20 20 29 7b 0a  el>iLevel).  ){.
aee0: 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 62 50      if( pCur->bP
aef0: 6f 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 69 6e  oint ){.      in
af00: 74 20 69 69 3b 0a 20 20 20 20 20 20 70 4e 65 77  t ii;.      pNew
af10: 20 3d 20 72 74 72 65 65 45 6e 71 75 65 75 65 28   = rtreeEnqueue(
af20: 70 43 75 72 2c 20 72 53 63 6f 72 65 2c 20 69 4c  pCur, rScore, iL
af30: 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  evel);.      if(
af40: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
af50: 6e 20 30 3b 0a 20 20 20 20 20 20 69 69 20 3d 20  n 0;.      ii = 
af60: 28 69 6e 74 29 28 70 4e 65 77 20 2d 20 70 43 75  (int)(pNew - pCu
af70: 72 2d 3e 61 50 6f 69 6e 74 29 20 2b 20 31 3b 0a  r->aPoint) + 1;.
af80: 20 20 20 20 20 20 69 66 28 20 69 69 3c 52 54 52        if( ii<RTR
af90: 45 45 5f 43 41 43 48 45 5f 53 5a 20 29 7b 0a 20  EE_CACHE_SZ ){. 
afa0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
afb0: 43 75 72 2d 3e 61 4e 6f 64 65 5b 69 69 5d 3d 3d  Cur->aNode[ii]==
afc0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75  0 );.        pCu
afd0: 72 2d 3e 61 4e 6f 64 65 5b 69 69 5d 20 3d 20 70  r->aNode[ii] = p
afe0: 43 75 72 2d 3e 61 4e 6f 64 65 5b 30 5d 3b 0a 20  Cur->aNode[0];. 
aff0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
b000: 20 20 20 20 20 6e 6f 64 65 52 65 6c 65 61 73 65       nodeRelease
b010: 28 52 54 52 45 45 5f 4f 46 5f 43 55 52 53 4f 52  (RTREE_OF_CURSOR
b020: 28 70 43 75 72 29 2c 20 70 43 75 72 2d 3e 61 4e  (pCur), pCur->aN
b030: 6f 64 65 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d  ode[0]);.      }
b040: 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4e 6f  .      pCur->aNo
b050: 64 65 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20  de[0] = 0;.     
b060: 20 2a 70 4e 65 77 20 3d 20 70 43 75 72 2d 3e 73   *pNew = pCur->s
b070: 50 6f 69 6e 74 3b 0a 20 20 20 20 7d 0a 20 20 20  Point;.    }.   
b080: 20 70 43 75 72 2d 3e 73 50 6f 69 6e 74 2e 72 53   pCur->sPoint.rS
b090: 63 6f 72 65 20 3d 20 72 53 63 6f 72 65 3b 0a 20  core = rScore;. 
b0a0: 20 20 20 70 43 75 72 2d 3e 73 50 6f 69 6e 74 2e     pCur->sPoint.
b0b0: 69 4c 65 76 65 6c 20 3d 20 69 4c 65 76 65 6c 3b  iLevel = iLevel;
b0c0: 0a 20 20 20 20 70 43 75 72 2d 3e 62 50 6f 69 6e  .    pCur->bPoin
b0d0: 74 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  t = 1;.    retur
b0e0: 6e 20 26 70 43 75 72 2d 3e 73 50 6f 69 6e 74 3b  n &pCur->sPoint;
b0f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
b100: 74 75 72 6e 20 72 74 72 65 65 45 6e 71 75 65 75  turn rtreeEnqueu
b110: 65 28 70 43 75 72 2c 20 72 53 63 6f 72 65 2c 20  e(pCur, rScore, 
b120: 69 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a  iLevel);.  }.}..
b130: 23 69 66 20 30 0a 2f 2a 20 54 72 61 63 69 6e 67  #if 0./* Tracing
b140: 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 74 68   routines for th
b150: 65 20 52 74 72 65 65 53 65 61 72 63 68 50 6f 69  e RtreeSearchPoi
b160: 6e 74 20 71 75 65 75 65 20 2a 2f 0a 73 74 61 74  nt queue */.stat
b170: 69 63 20 76 6f 69 64 20 74 72 61 63 65 50 6f 69  ic void tracePoi
b180: 6e 74 28 52 74 72 65 65 53 65 61 72 63 68 50 6f  nt(RtreeSearchPo
b190: 69 6e 74 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c  int *p, int idx,
b1a0: 20 52 74 72 65 65 43 75 72 73 6f 72 20 2a 70 43   RtreeCursor *pC
b1b0: 75 72 29 7b 0a 20 20 69 66 28 20 69 64 78 3c 30  ur){.  if( idx<0
b1c0: 20 29 7b 20 70 72 69 6e 74 66 28 22 20 73 22 29   ){ printf(" s")
b1d0: 3b 20 7d 65 6c 73 65 7b 20 70 72 69 6e 74 66 28  ; }else{ printf(
b1e0: 22 25 32 64 22 2c 20 69 64 78 29 3b 20 7d 0a 20  "%2d", idx); }. 
b1f0: 20 70 72 69 6e 74 66 28 22 20 25 64 2e 25 30 35   printf(" %d.%05
b200: 6c 6c 64 2e 25 30 32 64 20 25 67 20 25 64 22 2c  lld.%02d %g %d",
b210: 0a 20 20 20 20 70 2d 3e 69 4c 65 76 65 6c 2c 20  .    p->iLevel, 
b220: 70 2d 3e 69 64 2c 20 70 2d 3e 69 43 65 6c 6c 2c  p->id, p->iCell,
b230: 20 70 2d 3e 72 53 63 6f 72 65 2c 20 70 2d 3e 65   p->rScore, p->e
b240: 57 69 74 68 69 6e 0a 20 20 29 3b 0a 20 20 69 64  Within.  );.  id
b250: 78 2b 2b 3b 0a 20 20 69 66 28 20 69 64 78 3c 52  x++;.  if( idx<R
b260: 54 52 45 45 5f 43 41 43 48 45 5f 53 5a 20 29 7b  TREE_CACHE_SZ ){
b270: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 20 25 70  .    printf(" %p
b280: 5c 6e 22 2c 20 70 43 75 72 2d 3e 61 4e 6f 64 65  \n", pCur->aNode
b290: 5b 69 64 78 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b  [idx]);.  }else{
b2a0: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 5c 6e 22  .    printf("\n"
b2b0: 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
b2c0: 76 6f 69 64 20 74 72 61 63 65 51 75 65 75 65 28  void traceQueue(
b2d0: 52 74 72 65 65 43 75 72 73 6f 72 20 2a 70 43 75  RtreeCursor *pCu
b2e0: 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
b2f0: 50 72 65 66 69 78 29 7b 0a 20 20 69 6e 74 20 69  Prefix){.  int i
b300: 69 3b 0a 20 20 70 72 69 6e 74 66 28 22 3d 3d 3d  i;.  printf("===
b310: 20 25 39 73 20 22 2c 20 7a 50 72 65 66 69 78 29   %9s ", zPrefix)
b320: 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 62 50  ;.  if( pCur->bP
b330: 6f 69 6e 74 20 29 7b 0a 20 20 20 20 74 72 61 63  oint ){.    trac
b340: 65 50 6f 69 6e 74 28 26 70 43 75 72 2d 3e 73 50  ePoint(&pCur->sP
b350: 6f 69 6e 74 2c 20 2d 31 2c 20 70 43 75 72 29 3b  oint, -1, pCur);
b360: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 69 3d 30 3b  .  }.  for(ii=0;
b370: 20 69 69 3c 70 43 75 72 2d 3e 6e 50 6f 69 6e 74   ii<pCur->nPoint
b380: 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ; ii++){.    if(
b390: 20 69 69 3e 30 20 7c 7c 20 70 43 75 72 2d 3e 62   ii>0 || pCur->b
b3a0: 50 6f 69 6e 74 20 29 20 70 72 69 6e 74 66 28 22  Point ) printf("
b3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 29                ")
b3c0: 3b 0a 20 20 20 20 74 72 61 63 65 50 6f 69 6e 74  ;.    tracePoint
b3d0: 28 26 70 43 75 72 2d 3e 61 50 6f 69 6e 74 5b 69  (&pCur->aPoint[i
b3e0: 69 5d 2c 20 69 69 2c 20 70 43 75 72 29 3b 0a 20  i], ii, pCur);. 
b3f0: 20 7d 0a 7d 0a 23 20 64 65 66 69 6e 65 20 52 54   }.}.# define RT
b400: 52 45 45 5f 51 55 45 55 45 5f 54 52 41 43 45 28  REE_QUEUE_TRACE(
b410: 41 2c 42 29 20 74 72 61 63 65 51 75 65 75 65 28  A,B) traceQueue(
b420: 41 2c 42 29 0a 23 65 6c 73 65 0a 23 20 64 65 66  A,B).#else.# def
b430: 69 6e 65 20 52 54 52 45 45 5f 51 55 45 55 45 5f  ine RTREE_QUEUE_
b440: 54 52 41 43 45 28 41 2c 42 29 20 20 20 2f 2a 20  TRACE(A,B)   /* 
b450: 6e 6f 2d 6f 70 20 2a 2f 0a 23 65 6e 64 69 66 0a  no-op */.#endif.
b460: 0a 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73  ./* Remove the s
b470: 65 61 72 63 68 20 70 6f 69 6e 74 20 77 69 74 68  earch point with
b480: 20 74 68 65 20 6c 6f 77 65 73 74 20 63 75 72 72   the lowest curr
b490: 65 6e 74 20 73 63 6f 72 65 2e 0a 2a 2f 0a 73 74  ent score..*/.st
b4a0: 61 74 69 63 20 76 6f 69 64 20 72 74 72 65 65 53  atic void rtreeS
b4b0: 65 61 72 63 68 50 6f 69 6e 74 50 6f 70 28 52 74  earchPointPop(Rt
b4c0: 72 65 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20  reeCursor *p){. 
b4d0: 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 6e 3b   int i, j, k, n;
b4e0: 0a 20 20 69 20 3d 20 31 20 2d 20 70 2d 3e 62 50  .  i = 1 - p->bP
b4f0: 6f 69 6e 74 3b 0a 20 20 61 73 73 65 72 74 28 20  oint;.  assert( 
b500: 69 3d 3d 30 20 7c 7c 20 69 3d 3d 31 20 29 3b 0a  i==0 || i==1 );.
b510: 20 20 69 66 28 20 70 2d 3e 61 4e 6f 64 65 5b 69    if( p->aNode[i
b520: 5d 20 29 7b 0a 20 20 20 20 6e 6f 64 65 52 65 6c  ] ){.    nodeRel
b530: 65 61 73 65 28 52 54 52 45 45 5f 4f 46 5f 43 55  ease(RTREE_OF_CU
b540: 52 53 4f 52 28 70 29 2c 20 70 2d 3e 61 4e 6f 64  RSOR(p), p->aNod
b550: 65 5b 69 5d 29 3b 0a 20 20 20 20 70 2d 3e 61 4e  e[i]);.    p->aN
b560: 6f 64 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a  ode[i] = 0;.  }.
b570: 20 20 69 66 28 20 70 2d 3e 62 50 6f 69 6e 74 20    if( p->bPoint 
b580: 29 7b 0a 20 20 20 20 70 2d 3e 61 6e 51 75 65 75  ){.    p->anQueu
b590: 65 5b 70 2d 3e 73 50 6f 69 6e 74 2e 69 4c 65 76  e[p->sPoint.iLev
b5a0: 65 6c 5d 2d 2d 3b 0a 20 20 20 20 70 2d 3e 62 50  el]--;.    p->bP
b5b0: 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  oint = 0;.  }els
b5c0: 65 20 69 66 28 20 70 2d 3e 6e 50 6f 69 6e 74 20  e if( p->nPoint 
b5d0: 29 7b 0a 20 20 20 20 70 2d 3e 61 6e 51 75 65 75  ){.    p->anQueu
b5e0: 65 5b 70 2d 3e 61 50 6f 69 6e 74 5b 30 5d 2e 69  e[p->aPoint[0].i
b5f0: 4c 65 76 65 6c 5d 2d 2d 3b 0a 20 20 20 20 6e 20  Level]--;.    n 
b600: 3d 20 2d 2d 70 2d 3e 6e 50 6f 69 6e 74 3b 0a 20  = --p->nPoint;. 
b610: 20 20 20 70 2d 3e 61 50 6f 69 6e 74 5b 30 5d 20     p->aPoint[0] 
b620: 3d 20 70 2d 3e 61 50 6f 69 6e 74 5b 6e 5d 3b 0a  = p->aPoint[n];.
b630: 20 20 20 20 69 66 28 20 6e 3c 52 54 52 45 45 5f      if( n<RTREE_
b640: 43 41 43 48 45 5f 53 5a 2d 31 20 29 7b 0a 20 20  CACHE_SZ-1 ){.  
b650: 20 20 20 20 70 2d 3e 61 4e 6f 64 65 5b 31 5d 20      p->aNode[1] 
b660: 3d 20 70 2d 3e 61 4e 6f 64 65 5b 6e 2b 31 5d 3b  = p->aNode[n+1];
b670: 0a 20 20 20 20 20 20 70 2d 3e 61 4e 6f 64 65 5b  .      p->aNode[
b680: 6e 2b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  n+1] = 0;.    }.
b690: 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 20 20 77      i = 0;.    w
b6a0: 68 69 6c 65 28 20 28 6a 20 3d 20 69 2a 32 2b 31  hile( (j = i*2+1
b6b0: 29 3c 6e 20 29 7b 0a 20 20 20 20 20 20 6b 20 3d  )<n ){.      k =
b6c0: 20 6a 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20   j+1;.      if( 
b6d0: 6b 3c 6e 20 26 26 20 72 74 72 65 65 53 65 61 72  k<n && rtreeSear
b6e0: 63 68 50 6f 69 6e 74 43 6f 6d 70 61 72 65 28 26  chPointCompare(&
b6f0: 70 2d 3e 61 50 6f 69 6e 74 5b 6b 5d 2c 20 26 70  p->aPoint[k], &p
b700: 2d 3e 61 50 6f 69 6e 74 5b 6a 5d 29 3c 30 20 29  ->aPoint[j])<0 )
b710: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 74  {.        if( rt
b720: 72 65 65 53 65 61 72 63 68 50 6f 69 6e 74 43 6f  reeSearchPointCo
b730: 6d 70 61 72 65 28 26 70 2d 3e 61 50 6f 69 6e 74  mpare(&p->aPoint
b740: 5b 6b 5d 2c 20 26 70 2d 3e 61 50 6f 69 6e 74 5b  [k], &p->aPoint[
b750: 69 5d 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  i])<0 ){.       
b760: 20 20 20 72 74 72 65 65 53 65 61 72 63 68 50 6f     rtreeSearchPo
b770: 69 6e 74 53 77 61 70 28 70 2c 20 69 2c 20 6b 29  intSwap(p, i, k)
b780: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 3d 20  ;.          i = 
b790: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
b7a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  {.          brea
b7b0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
b7c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b7d0: 20 20 69 66 28 20 72 74 72 65 65 53 65 61 72 63    if( rtreeSearc
b7e0: 68 50 6f 69 6e 74 43 6f 6d 70 61 72 65 28 26 70  hPointCompare(&p
b7f0: 2d 3e 61 50 6f 69 6e 74 5b 6a 5d 2c 20 26 70 2d  ->aPoint[j], &p-
b800: 3e 61 50 6f 69 6e 74 5b 69 5d 29 3c 30 20 29 7b  >aPoint[i])<0 ){
b810: 0a 20 20 20 20 20 20 20 20 20 20 72 74 72 65 65  .          rtree
b820: 53 65 61 72 63 68 50 6f 69 6e 74 53 77 61 70 28  SearchPointSwap(
b830: 70 2c 20 69 2c 20 6a 29 3b 0a 20 20 20 20 20 20  p, i, j);.      
b840: 20 20 20 20 69 20 3d 20 6a 3b 0a 20 20 20 20 20      i = j;.     
b850: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b860: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b870: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
b880: 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   }.  }.}.../*.**
b890: 20 43 6f 6e 74 69 6e 75 65 20 74 68 65 20 73 65   Continue the se
b8a0: 61 72 63 68 20 6f 6e 20 63 75 72 73 6f 72 20 70  arch on cursor p
b8b0: 43 75 72 20 75 6e 74 69 6c 20 74 68 65 20 66 72  Cur until the fr
b8c0: 6f 6e 74 20 6f 66 20 74 68 65 20 71 75 65 75 65  ont of the queue
b8d0: 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  .** contains an 
b8e0: 65 6e 74 72 79 20 73 75 69 74 61 62 6c 65 20 66  entry suitable f
b8f0: 6f 72 20 72 65 74 75 72 6e 69 6e 67 20 61 73 20  or returning as 
b900: 61 20 72 65 73 75 6c 74 2d 73 65 74 20 72 6f 77  a result-set row
b910: 2c 0a 2a 2a 20 6f 72 20 75 6e 74 69 6c 20 74 68  ,.** or until th
b920: 65 20 52 74 72 65 65 53 65 61 72 63 68 50 6f 69  e RtreeSearchPoi
b930: 6e 74 20 71 75 65 75 65 20 69 73 20 65 6d 70 74  nt queue is empt
b940: 79 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68  y, indicating th
b950: 61 74 20 74 68 65 0a 2a 2a 20 71 75 65 72 79 20  at the.** query 
b960: 68 61 73 20 63 6f 6d 70 6c 65 74 65 64 2e 0a 2a  has completed..*
b970: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 74 72  /.static int rtr
b980: 65 65 53 74 65 70 54 6f 4c 65 61 66 28 52 74 72  eeStepToLeaf(Rtr
b990: 65 65 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  eeCursor *pCur){
b9a0: 0a 20 20 52 74 72 65 65 53 65 61 72 63 68 50 6f  .  RtreeSearchPo
b9b0: 69 6e 74 20 2a 70 3b 0a 20 20 52 74 72 65 65 20  int *p;.  Rtree 
b9c0: 2a 70 52 74 72 65 65 20 3d 20 52 54 52 45 45 5f  *pRtree = RTREE_
b9d0: 4f 46 5f 43 55 52 53 4f 52 28 70 43 75 72 29 3b  OF_CURSOR(pCur);
b9e0: 0a 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 4e  .  RtreeNode *pN
b9f0: 6f 64 65 3b 0a 20 20 69 6e 74 20 65 57 69 74 68  ode;.  int eWith
ba00: 69 6e 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  in;.  int rc = S
ba10: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
ba20: 6e 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 6e 43 6f  nCell;.  int nCo
ba30: 6e 73 74 72 61 69 6e 74 20 3d 20 70 43 75 72 2d  nstraint = pCur-
ba40: 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20  >nConstraint;.  
ba50: 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20 65 49  int ii;.  int eI
ba60: 6e 74 3b 0a 20 20 52 74 72 65 65 53 65 61 72 63  nt;.  RtreeSearc
ba70: 68 50 6f 69 6e 74 20 78 3b 0a 0a 20 20 65 49 6e  hPoint x;..  eIn
ba80: 74 20 3d 20 70 52 74 72 65 65 2d 3e 65 43 6f 6f  t = pRtree->eCoo
ba90: 72 64 54 79 70 65 3d 3d 52 54 52 45 45 5f 43 4f  rdType==RTREE_CO
baa0: 4f 52 44 5f 49 4e 54 33 32 3b 0a 20 20 77 68 69  ORD_INT32;.  whi
bab0: 6c 65 28 20 28 70 20 3d 20 72 74 72 65 65 53 65  le( (p = rtreeSe
bac0: 61 72 63 68 50 6f 69 6e 74 46 69 72 73 74 28 70  archPointFirst(p
bad0: 43 75 72 29 29 21 3d 30 20 26 26 20 70 2d 3e 69  Cur))!=0 && p->i
bae0: 4c 65 76 65 6c 3e 30 20 29 7b 0a 20 20 20 20 70  Level>0 ){.    p
baf0: 4e 6f 64 65 20 3d 20 72 74 72 65 65 4e 6f 64 65  Node = rtreeNode
bb00: 4f 66 46 69 72 73 74 53 65 61 72 63 68 50 6f 69  OfFirstSearchPoi
bb10: 6e 74 28 70 43 75 72 2c 20 26 72 63 29 3b 0a 20  nt(pCur, &rc);. 
bb20: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
bb30: 72 6e 20 72 63 3b 0a 20 20 20 20 6e 43 65 6c 6c  rn rc;.    nCell
bb40: 20 3d 20 4e 43 45 4c 4c 28 70 4e 6f 64 65 29 3b   = NCELL(pNode);
bb50: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65  .    assert( nCe
bb60: 6c 6c 3c 32 30 30 20 29 3b 0a 20 20 20 20 77 68  ll<200 );.    wh
bb70: 69 6c 65 28 20 70 2d 3e 69 43 65 6c 6c 3c 6e 43  ile( p->iCell<nC
bb80: 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ell ){.      sql
bb90: 69 74 65 33 5f 72 74 72 65 65 5f 64 62 6c 20 72  ite3_rtree_dbl r
bba0: 53 63 6f 72 65 20 3d 20 28 73 71 6c 69 74 65 33  Score = (sqlite3
bbb0: 5f 72 74 72 65 65 5f 64 62 6c 29 2d 31 3b 0a 20  _rtree_dbl)-1;. 
bbc0: 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 44 61       u8 *pCellDa
bbd0: 74 61 20 3d 20 70 4e 6f 64 65 2d 3e 7a 44 61 74  ta = pNode->zDat
bbe0: 61 20 2b 20 28 34 2b 70 52 74 72 65 65 2d 3e 6e  a + (4+pRtree->n
bbf0: 42 79 74 65 73 50 65 72 43 65 6c 6c 2a 70 2d 3e  BytesPerCell*p->
bc00: 69 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 65 57  iCell);.      eW
bc10: 69 74 68 69 6e 20 3d 20 46 55 4c 4c 59 5f 57 49  ithin = FULLY_WI
bc20: 54 48 49 4e 3b 0a 20 20 20 20 20 20 66 6f 72 28  THIN;.      for(
bc30: 69 69 3d 30 3b 20 69 69 3c 6e 43 6f 6e 73 74 72  ii=0; ii<nConstr
bc40: 61 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  aint; ii++){.   
bc50: 20 20 20 20 20 52 74 72 65 65 43 6f 6e 73 74 72       RtreeConstr
bc60: 61 69 6e 74 20 2a 70 43 6f 6e 73 74 72 61 69 6e  aint *pConstrain
bc70: 74 20 3d 20 70 43 75 72 2d 3e 61 43 6f 6e 73 74  t = pCur->aConst
bc80: 72 61 69 6e 74 20 2b 20 69 69 3b 0a 20 20 20 20  raint + ii;.    
bc90: 20 20 20 20 69 66 28 20 70 43 6f 6e 73 74 72 61      if( pConstra
bca0: 69 6e 74 2d 3e 6f 70 3e 3d 52 54 52 45 45 5f 4d  int->op>=RTREE_M
bcb0: 41 54 43 48 20 29 7b 0a 20 20 20 20 20 20 20 20  ATCH ){.        
bcc0: 20 20 72 63 20 3d 20 72 74 72 65 65 43 61 6c 6c    rc = rtreeCall
bcd0: 62 61 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28 70  backConstraint(p
bce0: 43 6f 6e 73 74 72 61 69 6e 74 2c 20 65 49 6e 74  Constraint, eInt
bcf0: 2c 20 70 43 65 6c 6c 44 61 74 61 2c 20 70 2c 0a  , pCellData, p,.
bd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd20: 20 20 20 20 20 20 20 26 72 53 63 6f 72 65 2c 20         &rScore, 
bd30: 26 65 57 69 74 68 69 6e 29 3b 0a 20 20 20 20 20  &eWithin);.     
bd40: 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
bd50: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
bd60: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 69 4c   }else if( p->iL
bd70: 65 76 65 6c 3d 3d 31 20 29 7b 0a 20 20 20 20 20  evel==1 ){.     
bd80: 20 20 20 20 20 72 74 72 65 65 4c 65 61 66 43 6f       rtreeLeafCo
bd90: 6e 73 74 72 61 69 6e 74 28 70 43 6f 6e 73 74 72  nstraint(pConstr
bda0: 61 69 6e 74 2c 20 65 49 6e 74 2c 20 70 43 65 6c  aint, eInt, pCel
bdb0: 6c 44 61 74 61 2c 20 26 65 57 69 74 68 69 6e 29  lData, &eWithin)
bdc0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
bdd0: 0a 20 20 20 20 20 20 20 20 20 20 72 74 72 65 65  .          rtree
bde0: 4e 6f 6e 6c 65 61 66 43 6f 6e 73 74 72 61 69 6e  NonleafConstrain
bdf0: 74 28 70 43 6f 6e 73 74 72 61 69 6e 74 2c 20 65  t(pConstraint, e
be00: 49 6e 74 2c 20 70 43 65 6c 6c 44 61 74 61 2c 20  Int, pCellData, 
be10: 26 65 57 69 74 68 69 6e 29 3b 0a 20 20 20 20 20  &eWithin);.     
be20: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
be30: 20 65 57 69 74 68 69 6e 3d 3d 4e 4f 54 5f 57 49   eWithin==NOT_WI
be40: 54 48 49 4e 20 29 20 62 72 65 61 6b 3b 0a 20 20  THIN ) break;.  
be50: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 69      }.      p->i
be60: 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20 69 66  Cell++;.      if
be70: 28 20 65 57 69 74 68 69 6e 3d 3d 4e 4f 54 5f 57  ( eWithin==NOT_W
be80: 49 54 48 49 4e 20 29 20 63 6f 6e 74 69 6e 75 65  ITHIN ) continue
be90: 3b 0a 20 20 20 20 20 20 78 2e 69 4c 65 76 65 6c  ;.      x.iLevel
bea0: 20 3d 20 70 2d 3e 69 4c 65 76 65 6c 20 2d 20 31   = p->iLevel - 1
beb0: 3b 0a 20 20 20 20 20 20 69 66 28 20 78 2e 69 4c  ;.      if( x.iL
bec0: 65 76 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  evel ){.        
bed0: 78 2e 69 64 20 3d 20 72 65 61 64 49 6e 74 36 34  x.id = readInt64
bee0: 28 70 43 65 6c 6c 44 61 74 61 29 3b 0a 20 20 20  (pCellData);.   
bef0: 20 20 20 20 20 78 2e 69 43 65 6c 6c 20 3d 20 30       x.iCell = 0
bf00: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
bf10: 20 20 20 20 20 20 20 78 2e 69 64 20 3d 20 70 2d         x.id = p-
bf20: 3e 69 64 3b 0a 20 20 20 20 20 20 20 20 78 2e 69  >id;.        x.i
bf30: 43 65 6c 6c 20 3d 20 70 2d 3e 69 43 65 6c 6c 20  Cell = p->iCell 
bf40: 2d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  - 1;.      }.   
bf50: 20 20 20 69 66 28 20 70 2d 3e 69 43 65 6c 6c 3e     if( p->iCell>
bf60: 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  =nCell ){.      
bf70: 20 20 52 54 52 45 45 5f 51 55 45 55 45 5f 54 52    RTREE_QUEUE_TR
bf80: 41 43 45 28 70 43 75 72 2c 20 22 50 4f 50 2d 53  ACE(pCur, "POP-S
bf90: 3a 22 29 3b 0a 20 20 20 20 20 20 20 20 72 74 72  :");.        rtr
bfa0: 65 65 53 65 61 72 63 68 50 6f 69 6e 74 50 6f 70  eeSearchPointPop
bfb0: 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a  (pCur);.      }.
bfc0: 20 20 20 20 20 20 69 66 28 20 72 53 63 6f 72 65        if( rScore
bfd0: 3c 52 54 52 45 45 5f 5a 45 52 4f 20 29 20 72 53  <RTREE_ZERO ) rS
bfe0: 63 6f 72 65 20 3d 20 52 54 52 45 45 5f 5a 45 52  core = RTREE_ZER
bff0: 4f 3b 0a 20 20 20 20 20 20 70 20 3d 20 72 74 72  O;.      p = rtr
c000: 65 65 53 65 61 72 63 68 50 6f 69 6e 74 4e 65 77  eeSearchPointNew
c010: 28 70 43 75 72 2c 20 72 53 63 6f 72 65 2c 20 78  (pCur, rScore, x
c020: 2e 69 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20  .iLevel);.      
c030: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
c040: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
c050: 20 20 20 20 20 20 70 2d 3e 65 57 69 74 68 69 6e        p->eWithin
c060: 20 3d 20 28 75 38 29 65 57 69 74 68 69 6e 3b 0a   = (u8)eWithin;.
c070: 20 20 20 20 20 20 70 2d 3e 69 64 20 3d 20 78 2e        p->id = x.
c080: 69 64 3b 0a 20 20 20 20 20 20 70 2d 3e 69 43 65  id;.      p->iCe
c090: 6c 6c 20 3d 20 78 2e 69 43 65 6c 6c 3b 0a 20 20  ll = x.iCell;.  
c0a0: 20 20 20 20 52 54 52 45 45 5f 51 55 45 55 45 5f      RTREE_QUEUE_
c0b0: 54 52 41 43 45 28 70 43 75 72 2c 20 22 50 55 53  TRACE(pCur, "PUS
c0c0: 48 2d 53 3a 22 29 3b 0a 20 20 20 20 20 20 62 72  H-S:");.      br
c0d0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
c0e0: 66 28 20 70 2d 3e 69 43 65 6c 6c 3e 3d 6e 43 65  f( p->iCell>=nCe
c0f0: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 52 54 52 45  ll ){.      RTRE
c100: 45 5f 51 55 45 55 45 5f 54 52 41 43 45 28 70 43  E_QUEUE_TRACE(pC
c110: 75 72 2c 20 22 50 4f 50 2d 53 65 3a 22 29 3b 0a  ur, "POP-Se:");.
c120: 20 20 20 20 20 20 72 74 72 65 65 53 65 61 72 63        rtreeSearc
c130: 68 50 6f 69 6e 74 50 6f 70 28 70 43 75 72 29 3b  hPointPop(pCur);
c140: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43 75  .    }.  }.  pCu
c150: 72 2d 3e 61 74 45 4f 46 20 3d 20 70 3d 3d 30 3b  r->atEOF = p==0;
c160: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
c170: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52  _OK;.}../* .** R
c180: 74 72 65 65 20 76 69 72 74 75 61 6c 20 74 61 62  tree virtual tab
c190: 6c 65 20 6d 6f 64 75 6c 65 20 78 4e 65 78 74 20  le module xNext 
c1a0: 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69  method..*/.stati
c1b0: 63 20 69 6e 74 20 72 74 72 65 65 4e 65 78 74 28  c int rtreeNext(
c1c0: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
c1d0: 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72  sor *pVtabCursor
c1e0: 29 7b 0a 20 20 52 74 72 65 65 43 75 72 73 6f 72  ){.  RtreeCursor
c1f0: 20 2a 70 43 73 72 20 3d 20 28 52 74 72 65 65 43   *pCsr = (RtreeC
c200: 75 72 73 6f 72 20 2a 29 70 56 74 61 62 43 75 72  ursor *)pVtabCur
c210: 73 6f 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  sor;.  int rc = 
c220: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
c230: 20 4d 6f 76 65 20 74 6f 20 74 68 65 20 6e 65 78   Move to the nex
c240: 74 20 65 6e 74 72 79 20 74 68 61 74 20 6d 61 74  t entry that mat
c250: 63 68 65 73 20 74 68 65 20 63 6f 6e 66 69 67 75  ches the configu
c260: 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e  red constraints.
c270: 20 2a 2f 0a 20 20 52 54 52 45 45 5f 51 55 45 55   */.  RTREE_QUEU
c280: 45 5f 54 52 41 43 45 28 70 43 73 72 2c 20 22 50  E_TRACE(pCsr, "P
c290: 4f 50 2d 4e 78 3a 22 29 3b 0a 20 20 72 74 72 65  OP-Nx:");.  rtre
c2a0: 65 53 65 61 72 63 68 50 6f 69 6e 74 50 6f 70 28  eSearchPointPop(
c2b0: 70 43 73 72 29 3b 0a 20 20 72 63 20 3d 20 72 74  pCsr);.  rc = rt
c2c0: 72 65 65 53 74 65 70 54 6f 4c 65 61 66 28 70 43  reeStepToLeaf(pC
c2d0: 73 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  sr);.  return rc
c2e0: 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 74 72 65  ;.}../* .** Rtre
c2f0: 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
c300: 6d 6f 64 75 6c 65 20 78 52 6f 77 69 64 20 6d 65  module xRowid me
c310: 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  thod..*/.static 
c320: 69 6e 74 20 72 74 72 65 65 52 6f 77 69 64 28 73  int rtreeRowid(s
c330: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
c340: 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72 2c  or *pVtabCursor,
c350: 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70   sqlite_int64 *p
c360: 52 6f 77 69 64 29 7b 0a 20 20 52 74 72 65 65 43  Rowid){.  RtreeC
c370: 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 52  ursor *pCsr = (R
c380: 74 72 65 65 43 75 72 73 6f 72 20 2a 29 70 56 74  treeCursor *)pVt
c390: 61 62 43 75 72 73 6f 72 3b 0a 20 20 52 74 72 65  abCursor;.  Rtre
c3a0: 65 53 65 61 72 63 68 50 6f 69 6e 74 20 2a 70 20  eSearchPoint *p 
c3b0: 3d 20 72 74 72 65 65 53 65 61 72 63 68 50 6f 69  = rtreeSearchPoi
c3c0: 6e 74 46 69 72 73 74 28 70 43 73 72 29 3b 0a 20  ntFirst(pCsr);. 
c3d0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
c3e0: 5f 4f 4b 3b 0a 20 20 52 74 72 65 65 4e 6f 64 65  _OK;.  RtreeNode
c3f0: 20 2a 70 4e 6f 64 65 20 3d 20 72 74 72 65 65 4e   *pNode = rtreeN
c400: 6f 64 65 4f 66 46 69 72 73 74 53 65 61 72 63 68  odeOfFirstSearch
c410: 50 6f 69 6e 74 28 70 43 73 72 2c 20 26 72 63 29  Point(pCsr, &rc)
c420: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
c430: 54 45 5f 4f 4b 20 26 26 20 70 20 29 7b 0a 20 20  TE_OK && p ){.  
c440: 20 20 2a 70 52 6f 77 69 64 20 3d 20 6e 6f 64 65    *pRowid = node
c450: 47 65 74 52 6f 77 69 64 28 52 54 52 45 45 5f 4f  GetRowid(RTREE_O
c460: 46 5f 43 55 52 53 4f 52 28 70 43 73 72 29 2c 20  F_CURSOR(pCsr), 
c470: 70 4e 6f 64 65 2c 20 70 2d 3e 69 43 65 6c 6c 29  pNode, p->iCell)
c480: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
c490: 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 74 72  c;.}../* .** Rtr
c4a0: 65 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ee virtual table
c4b0: 20 6d 6f 64 75 6c 65 20 78 43 6f 6c 75 6d 6e 20   module xColumn 
c4c0: 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69  method..*/.stati
c4d0: 63 20 69 6e 74 20 72 74 72 65 65 43 6f 6c 75 6d  c int rtreeColum
c4e0: 6e 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63  n(sqlite3_vtab_c
c4f0: 75 72 73 6f 72 20 2a 63 75 72 2c 20 73 71 6c 69  ursor *cur, sqli
c500: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78  te3_context *ctx
c510: 2c 20 69 6e 74 20 69 29 7b 0a 20 20 52 74 72 65  , int i){.  Rtre
c520: 65 20 2a 70 52 74 72 65 65 20 3d 20 28 52 74 72  e *pRtree = (Rtr
c530: 65 65 20 2a 29 63 75 72 2d 3e 70 56 74 61 62 3b  ee *)cur->pVtab;
c540: 0a 20 20 52 74 72 65 65 43 75 72 73 6f 72 20 2a  .  RtreeCursor *
c550: 70 43 73 72 20 3d 20 28 52 74 72 65 65 43 75 72  pCsr = (RtreeCur
c560: 73 6f 72 20 2a 29 63 75 72 3b 0a 20 20 52 74 72  sor *)cur;.  Rtr
c570: 65 65 53 65 61 72 63 68 50 6f 69 6e 74 20 2a 70  eeSearchPoint *p
c580: 20 3d 20 72 74 72 65 65 53 65 61 72 63 68 50 6f   = rtreeSearchPo
c590: 69 6e 74 46 69 72 73 74 28 70 43 73 72 29 3b 0a  intFirst(pCsr);.
c5a0: 20 20 52 74 72 65 65 43 6f 6f 72 64 20 63 3b 0a    RtreeCoord c;.
c5b0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
c5c0: 45 5f 4f 4b 3b 0a 20 20 52 74 72 65 65 4e 6f 64  E_OK;.  RtreeNod
c5d0: 65 20 2a 70 4e 6f 64 65 20 3d 20 72 74 72 65 65  e *pNode = rtree
c5e0: 4e 6f 64 65 4f 66 46 69 72 73 74 53 65 61 72 63  NodeOfFirstSearc
c5f0: 68 50 6f 69 6e 74 28 70 43 73 72 2c 20 26 72 63  hPoint(pCsr, &rc
c600: 29 3b 0a 0a 20 20 69 66 28 20 72 63 20 29 20 72  );..  if( rc ) r
c610: 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28 20  eturn rc;.  if( 
c620: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  p==0 ) return SQ
c630: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69  LITE_OK;.  if( i
c640: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
c650: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28  e3_result_int64(
c660: 63 74 78 2c 20 6e 6f 64 65 47 65 74 52 6f 77 69  ctx, nodeGetRowi
c670: 64 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65 2c  d(pRtree, pNode,
c680: 20 70 2d 3e 69 43 65 6c 6c 29 29 3b 0a 20 20 7d   p->iCell));.  }
c690: 65 6c 73 65 7b 0a 20 20 20 20 6e 6f 64 65 47 65  else{.    nodeGe
c6a0: 74 43 6f 6f 72 64 28 70 52 74 72 65 65 2c 20 70  tCoord(pRtree, p
c6b0: 4e 6f 64 65 2c 20 70 2d 3e 69 43 65 6c 6c 2c 20  Node, p->iCell, 
c6c0: 69 2d 31 2c 20 26 63 29 3b 0a 23 69 66 6e 64 65  i-1, &c);.#ifnde
c6d0: 66 20 53 51 4c 49 54 45 5f 52 54 52 45 45 5f 49  f SQLITE_RTREE_I
c6e0: 4e 54 5f 4f 4e 4c 59 0a 20 20 20 20 69 66 28 20  NT_ONLY.    if( 
c6f0: 70 52 74 72 65 65 2d 3e 65 43 6f 6f 72 64 54 79  pRtree->eCoordTy
c700: 70 65 3d 3d 52 54 52 45 45 5f 43 4f 4f 52 44 5f  pe==RTREE_COORD_
c710: 52 45 41 4c 33 32 20 29 7b 0a 20 20 20 20 20 20  REAL32 ){.      
c720: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64  sqlite3_result_d
c730: 6f 75 62 6c 65 28 63 74 78 2c 20 63 2e 66 29 3b  ouble(ctx, c.f);
c740: 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  .    }else.#endi
c750: 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 61 73  f.    {.      as
c760: 73 65 72 74 28 20 70 52 74 72 65 65 2d 3e 65 43  sert( pRtree->eC
c770: 6f 6f 72 64 54 79 70 65 3d 3d 52 54 52 45 45 5f  oordType==RTREE_
c780: 43 4f 4f 52 44 5f 49 4e 54 33 32 20 29 3b 0a 20  COORD_INT32 );. 
c790: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
c7a0: 75 6c 74 5f 69 6e 74 28 63 74 78 2c 20 63 2e 69  ult_int(ctx, c.i
c7b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
c7c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
c7d0: 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 55 73 65 20 6e  .}../* .** Use n
c7e0: 6f 64 65 41 63 71 75 69 72 65 28 29 20 74 6f 20  odeAcquire() to 
c7f0: 6f 62 74 61 69 6e 20 74 68 65 20 6c 65 61 66 20  obtain the leaf 
c800: 6e 6f 64 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  node containing 
c810: 74 68 65 20 72 65 63 6f 72 64 20 77 69 74 68 20  the record with 
c820: 0a 2a 2a 20 72 6f 77 69 64 20 69 52 6f 77 69 64  .** rowid iRowid
c830: 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
c840: 20 73 65 74 20 2a 70 70 4c 65 61 66 20 74 6f 20   set *ppLeaf to 
c850: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 6f 64  point to the nod
c860: 65 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20  e and.** return 
c870: 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68  SQLITE_OK. If th
c880: 65 72 65 20 69 73 20 6e 6f 20 73 75 63 68 20 72  ere is no such r
c890: 65 63 6f 72 64 20 69 6e 20 74 68 65 20 74 61 62  ecord in the tab
c8a0: 6c 65 2c 20 73 65 74 0a 2a 2a 20 2a 70 70 4c 65  le, set.** *ppLe
c8b0: 61 66 20 74 6f 20 30 20 61 6e 64 20 72 65 74 75  af to 0 and retu
c8c0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66  rn SQLITE_OK. If
c8d0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
c8e0: 2c 20 73 65 74 20 2a 70 70 4c 65 61 66 0a 2a 2a  , set *ppLeaf.**
c8f0: 20 74 6f 20 7a 65 72 6f 20 61 6e 64 20 72 65 74   to zero and ret
c900: 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urn an SQLite er
c910: 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
c920: 74 69 63 20 69 6e 74 20 66 69 6e 64 4c 65 61 66  tic int findLeaf
c930: 4e 6f 64 65 28 0a 20 20 52 74 72 65 65 20 2a 70  Node(.  Rtree *p
c940: 52 74 72 65 65 2c 20 20 20 20 20 20 20 20 20 20  Rtree,          
c950: 20 20 20 20 2f 2a 20 52 54 72 65 65 20 74 6f 20      /* RTree to 
c960: 73 65 61 72 63 68 20 2a 2f 0a 20 20 69 36 34 20  search */.  i64 
c970: 69 52 6f 77 69 64 2c 20 20 20 20 20 20 20 20 20  iRowid,         
c980: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
c990: 6f 77 69 64 20 73 65 61 72 63 68 69 6e 67 20 66  owid searching f
c9a0: 6f 72 20 2a 2f 0a 20 20 52 74 72 65 65 4e 6f 64  or */.  RtreeNod
c9b0: 65 20 2a 2a 70 70 4c 65 61 66 2c 20 20 20 20 20  e **ppLeaf,     
c9c0: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
c9d0: 20 6e 6f 64 65 20 68 65 72 65 20 2a 2f 0a 20 20   node here */.  
c9e0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70  sqlite3_int64 *p
c9f0: 69 4e 6f 64 65 20 20 20 20 20 20 20 2f 2a 20 57  iNode       /* W
ca00: 72 69 74 65 20 74 68 65 20 6e 6f 64 65 2d 69 64  rite the node-id
ca10: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
ca20: 74 20 72 63 3b 0a 20 20 2a 70 70 4c 65 61 66 20  t rc;.  *ppLeaf 
ca30: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62  = 0;.  sqlite3_b
ca40: 69 6e 64 5f 69 6e 74 36 34 28 70 52 74 72 65 65  ind_int64(pRtree
ca50: 2d 3e 70 52 65 61 64 52 6f 77 69 64 2c 20 31 2c  ->pReadRowid, 1,
ca60: 20 69 52 6f 77 69 64 29 3b 0a 20 20 69 66 28 20   iRowid);.  if( 
ca70: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 52 74  sqlite3_step(pRt
ca80: 72 65 65 2d 3e 70 52 65 61 64 52 6f 77 69 64 29  ree->pReadRowid)
ca90: 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
caa0: 20 20 20 20 69 36 34 20 69 4e 6f 64 65 20 3d 20      i64 iNode = 
cab0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
cac0: 6e 74 36 34 28 70 52 74 72 65 65 2d 3e 70 52 65  nt64(pRtree->pRe
cad0: 61 64 52 6f 77 69 64 2c 20 30 29 3b 0a 20 20 20  adRowid, 0);.   
cae0: 20 69 66 28 20 70 69 4e 6f 64 65 20 29 20 2a 70   if( piNode ) *p
caf0: 69 4e 6f 64 65 20 3d 20 69 4e 6f 64 65 3b 0a 20  iNode = iNode;. 
cb00: 20 20 20 72 63 20 3d 20 6e 6f 64 65 41 63 71 75     rc = nodeAcqu
cb10: 69 72 65 28 70 52 74 72 65 65 2c 20 69 4e 6f 64  ire(pRtree, iNod
cb20: 65 2c 20 30 2c 20 70 70 4c 65 61 66 29 3b 0a 20  e, 0, ppLeaf);. 
cb30: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74     sqlite3_reset
cb40: 28 70 52 74 72 65 65 2d 3e 70 52 65 61 64 52 6f  (pRtree->pReadRo
cb50: 77 69 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  wid);.  }else{. 
cb60: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
cb70: 72 65 73 65 74 28 70 52 74 72 65 65 2d 3e 70 52  reset(pRtree->pR
cb80: 65 61 64 52 6f 77 69 64 29 3b 0a 20 20 7d 0a 20  eadRowid);.  }. 
cb90: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
cba0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
cbb0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
cbc0: 63 6f 6e 66 69 67 75 72 65 20 74 68 65 20 52 74  configure the Rt
cbd0: 72 65 65 43 6f 6e 73 74 72 61 69 6e 74 20 6f 62  reeConstraint ob
cbe0: 6a 65 63 74 20 70 61 73 73 65 64 0a 2a 2a 20 61  ject passed.** a
cbf0: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
cc00: 75 6d 65 6e 74 20 66 6f 72 20 61 20 4d 41 54 43  ument for a MATC
cc10: 48 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 54 68  H constraint. Th
cc20: 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61  e value passed a
cc30: 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 61  s the.** first a
cc40: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
cc50: 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 20  function is the 
cc60: 72 69 67 68 74 2d 68 61 6e 64 20 6f 70 65 72 61  right-hand opera
cc70: 6e 64 20 74 6f 20 74 68 65 20 4d 41 54 43 48 0a  nd to the MATCH.
cc80: 2a 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a  ** operator..*/.
cc90: 73 74 61 74 69 63 20 69 6e 74 20 64 65 73 65 72  static int deser
cca0: 69 61 6c 69 7a 65 47 65 6f 6d 65 74 72 79 28 73  ializeGeometry(s
ccb0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
ccc0: 61 6c 75 65 2c 20 52 74 72 65 65 43 6f 6e 73 74  alue, RtreeConst
ccd0: 72 61 69 6e 74 20 2a 70 43 6f 6e 73 29 7b 0a 20  raint *pCons){. 
cce0: 20 52 74 72 65 65 4d 61 74 63 68 41 72 67 20 2a   RtreeMatchArg *
ccf0: 70 42 6c 6f 62 2c 20 2a 70 53 72 63 3b 20 20 20  pBlob, *pSrc;   
cd00: 20 20 20 20 2f 2a 20 42 4c 4f 42 20 72 65 74 75      /* BLOB retu
cd10: 72 6e 65 64 20 62 79 20 67 65 6f 6d 65 74 72 79  rned by geometry
cd20: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 73   function */.  s
cd30: 71 6c 69 74 65 33 5f 72 74 72 65 65 5f 71 75 65  qlite3_rtree_que
cd40: 72 79 5f 69 6e 66 6f 20 2a 70 49 6e 66 6f 3b 20  ry_info *pInfo; 
cd50: 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 69 6e    /* Callback in
cd60: 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20  formation */..  
cd70: 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 76  pSrc = sqlite3_v
cd80: 61 6c 75 65 5f 70 6f 69 6e 74 65 72 28 70 56 61  alue_pointer(pVa
cd90: 6c 75 65 2c 20 22 52 74 72 65 65 4d 61 74 63 68  lue, "RtreeMatch
cda0: 41 72 67 22 29 3b 0a 20 20 69 66 28 20 70 53 72  Arg");.  if( pSr
cdb0: 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  c==0 ) return SQ
cdc0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 70 49  LITE_ERROR;.  pI
cdd0: 6e 66 6f 20 3d 20 28 73 71 6c 69 74 65 33 5f 72  nfo = (sqlite3_r
cde0: 74 72 65 65 5f 71 75 65 72 79 5f 69 6e 66 6f 2a  tree_query_info*
cdf0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
ce00: 20 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63    sqlite3_malloc
ce10: 36 34 28 20 73 69 7a 65 6f 66 28 2a 70 49 6e 66  64( sizeof(*pInf
ce20: 6f 29 2b 70 53 72 63 2d 3e 69 53 69 7a 65 20 29  o)+pSrc->iSize )
ce30: 3b 0a 20 20 69 66 28 20 21 70 49 6e 66 6f 20 29  ;.  if( !pInfo )
ce40: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
ce50: 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70  OMEM;.  memset(p
ce60: 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Info, 0, sizeof(
ce70: 2a 70 49 6e 66 6f 29 29 3b 0a 20 20 70 42 6c 6f  *pInfo));.  pBlo
ce80: 62 20 3d 20 28 52 74 72 65 65 4d 61 74 63 68 41  b = (RtreeMatchA
ce90: 72 67 2a 29 26 70 49 6e 66 6f 5b 31 5d 3b 0a 20  rg*)&pInfo[1];. 
cea0: 20 6d 65 6d 63 70 79 28 70 42 6c 6f 62 2c 20 70   memcpy(pBlob, p
ceb0: 53 72 63 2c 20 70 53 72 63 2d 3e 69 53 69 7a 65  Src, pSrc->iSize
cec0: 29 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 43 6f 6e  );.  pInfo->pCon
ced0: 74 65 78 74 20 3d 20 70 42 6c 6f 62 2d 3e 63 62  text = pBlob->cb
cee0: 2e 70 43 6f 6e 74 65 78 74 3b 0a 20 20 70 49 6e  .pContext;.  pIn
cef0: 66 6f 2d 3e 6e 50 61 72 61 6d 20 3d 20 70 42 6c  fo->nParam = pBl
cf00: 6f 62 2d 3e 6e 50 61 72 61 6d 3b 0a 20 20 70 49  ob->nParam;.  pI
cf10: 6e 66 6f 2d 3e 61 50 61 72 61 6d 20 3d 20 70 42  nfo->aParam = pB
cf20: 6c 6f 62 2d 3e 61 50 61 72 61 6d 3b 0a 20 20 70  lob->aParam;.  p
cf30: 49 6e 66 6f 2d 3e 61 70 53 71 6c 50 61 72 61 6d  Info->apSqlParam
cf40: 20 3d 20 70 42 6c 6f 62 2d 3e 61 70 53 71 6c 50   = pBlob->apSqlP
cf50: 61 72 61 6d 3b 0a 0a 20 20 69 66 28 20 70 42 6c  aram;..  if( pBl
cf60: 6f 62 2d 3e 63 62 2e 78 47 65 6f 6d 20 29 7b 0a  ob->cb.xGeom ){.
cf70: 20 20 20 20 70 43 6f 6e 73 2d 3e 75 2e 78 47 65      pCons->u.xGe
cf80: 6f 6d 20 3d 20 70 42 6c 6f 62 2d 3e 63 62 2e 78  om = pBlob->cb.x
cf90: 47 65 6f 6d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Geom;.  }else{. 
cfa0: 20 20 20 70 43 6f 6e 73 2d 3e 6f 70 20 3d 20 52     pCons->op = R
cfb0: 54 52 45 45 5f 51 55 45 52 59 3b 0a 20 20 20 20  TREE_QUERY;.    
cfc0: 70 43 6f 6e 73 2d 3e 75 2e 78 51 75 65 72 79 46  pCons->u.xQueryF
cfd0: 75 6e 63 20 3d 20 70 42 6c 6f 62 2d 3e 63 62 2e  unc = pBlob->cb.
cfe0: 78 51 75 65 72 79 46 75 6e 63 3b 0a 20 20 7d 0a  xQueryFunc;.  }.
cff0: 20 20 70 43 6f 6e 73 2d 3e 70 49 6e 66 6f 20 3d    pCons->pInfo =
d000: 20 70 49 6e 66 6f 3b 0a 20 20 72 65 74 75 72 6e   pInfo;.  return
d010: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
d020: 2a 20 0a 2a 2a 20 52 74 72 65 65 20 76 69 72 74  * .** Rtree virt
d030: 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65  ual table module
d040: 20 78 46 69 6c 74 65 72 20 6d 65 74 68 6f 64 2e   xFilter method.
d050: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
d060: 74 72 65 65 46 69 6c 74 65 72 28 0a 20 20 73 71  treeFilter(.  sq
d070: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
d080: 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72 2c 20  r *pVtabCursor, 
d090: 0a 20 20 69 6e 74 20 69 64 78 4e 75 6d 2c 20 63  .  int idxNum, c
d0a0: 6f 6e 73 74 20 63 68 61 72 20 2a 69 64 78 53 74  onst char *idxSt
d0b0: 72 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 73  r,.  int argc, s
d0c0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
d0d0: 72 67 76 0a 29 7b 0a 20 20 52 74 72 65 65 20 2a  rgv.){.  Rtree *
d0e0: 70 52 74 72 65 65 20 3d 20 28 52 74 72 65 65 20  pRtree = (Rtree 
d0f0: 2a 29 70 56 74 61 62 43 75 72 73 6f 72 2d 3e 70  *)pVtabCursor->p
d100: 56 74 61 62 3b 0a 20 20 52 74 72 65 65 43 75 72  Vtab;.  RtreeCur
d110: 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 52 74 72  sor *pCsr = (Rtr
d120: 65 65 43 75 72 73 6f 72 20 2a 29 70 56 74 61 62  eeCursor *)pVtab
d130: 43 75 72 73 6f 72 3b 0a 20 20 52 74 72 65 65 4e  Cursor;.  RtreeN
d140: 6f 64 65 20 2a 70 52 6f 6f 74 20 3d 20 30 3b 0a  ode *pRoot = 0;.
d150: 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20    int ii;.  int 
d160: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
d170: 20 20 69 6e 74 20 69 43 65 6c 6c 20 3d 20 30 3b    int iCell = 0;
d180: 0a 0a 20 20 72 74 72 65 65 52 65 66 65 72 65 6e  ..  rtreeReferen
d190: 63 65 28 70 52 74 72 65 65 29 3b 0a 0a 20 20 2f  ce(pRtree);..  /
d1a0: 2a 20 52 65 73 65 74 20 74 68 65 20 63 75 72 73  * Reset the curs
d1b0: 6f 72 20 74 6f 20 74 68 65 20 73 61 6d 65 20 73  or to the same s
d1c0: 74 61 74 65 20 61 73 20 72 74 72 65 65 4f 70 65  tate as rtreeOpe
d1d0: 6e 28 29 20 6c 65 61 76 65 73 20 69 74 20 69 6e  n() leaves it in
d1e0: 2e 20 2a 2f 0a 20 20 66 72 65 65 43 75 72 73 6f  . */.  freeCurso
d1f0: 72 43 6f 6e 73 74 72 61 69 6e 74 73 28 70 43 73  rConstraints(pCs
d200: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  r);.  sqlite3_fr
d210: 65 65 28 70 43 73 72 2d 3e 61 50 6f 69 6e 74 29  ee(pCsr->aPoint)
d220: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 73 72 2c  ;.  memset(pCsr,
d230: 20 30 2c 20 73 69 7a 65 6f 66 28 52 74 72 65 65   0, sizeof(Rtree
d240: 43 75 72 73 6f 72 29 29 3b 0a 20 20 70 43 73 72  Cursor));.  pCsr
d250: 2d 3e 62 61 73 65 2e 70 56 74 61 62 20 3d 20 28  ->base.pVtab = (
d260: 73 71 6c 69 74 65 33 5f 76 74 61 62 2a 29 70 52  sqlite3_vtab*)pR
d270: 74 72 65 65 3b 0a 0a 20 20 70 43 73 72 2d 3e 69  tree;..  pCsr->i
d280: 53 74 72 61 74 65 67 79 20 3d 20 69 64 78 4e 75  Strategy = idxNu
d290: 6d 3b 0a 20 20 69 66 28 20 69 64 78 4e 75 6d 3d  m;.  if( idxNum=
d2a0: 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 53 70 65  =1 ){.    /* Spe
d2b0: 63 69 61 6c 20 63 61 73 65 20 2d 20 6c 6f 6f 6b  cial case - look
d2c0: 75 70 20 62 79 20 72 6f 77 69 64 2e 20 2a 2f 0a  up by rowid. */.
d2d0: 20 20 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70      RtreeNode *p
d2e0: 4c 65 61 66 3b 20 20 20 20 20 20 20 20 2f 2a 20  Leaf;        /* 
d2f0: 4c 65 61 66 20 6f 6e 20 77 68 69 63 68 20 74 68  Leaf on which th
d300: 65 20 72 65 71 75 69 72 65 64 20 63 65 6c 6c 20  e required cell 
d310: 72 65 73 69 64 65 73 20 2a 2f 0a 20 20 20 20 52  resides */.    R
d320: 74 72 65 65 53 65 61 72 63 68 50 6f 69 6e 74 20  treeSearchPoint 
d330: 2a 70 3b 20 20 20 20 20 2f 2a 20 53 65 61 72 63  *p;     /* Searc
d340: 68 20 70 6f 69 6e 74 20 66 6f 72 20 74 68 65 20  h point for the 
d350: 6c 65 61 66 20 2a 2f 0a 20 20 20 20 69 36 34 20  leaf */.    i64 
d360: 69 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33  iRowid = sqlite3
d370: 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 72 67  _value_int64(arg
d380: 76 5b 30 5d 29 3b 0a 20 20 20 20 69 36 34 20 69  v[0]);.    i64 i
d390: 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 72 63  Node = 0;.    rc
d3a0: 20 3d 20 66 69 6e 64 4c 65 61 66 4e 6f 64 65 28   = findLeafNode(
d3b0: 70 52 74 72 65 65 2c 20 69 52 6f 77 69 64 2c 20  pRtree, iRowid, 
d3c0: 26 70 4c 65 61 66 2c 20 26 69 4e 6f 64 65 29 3b  &pLeaf, &iNode);
d3d0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
d3e0: 49 54 45 5f 4f 4b 20 26 26 20 70 4c 65 61 66 21  ITE_OK && pLeaf!
d3f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 20 3d 20  =0 ){.      p = 
d400: 72 74 72 65 65 53 65 61 72 63 68 50 6f 69 6e 74  rtreeSearchPoint
d410: 4e 65 77 28 70 43 73 72 2c 20 52 54 52 45 45 5f  New(pCsr, RTREE_
d420: 5a 45 52 4f 2c 20 30 29 3b 0a 20 20 20 20 20 20  ZERO, 0);.      
d430: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 20  assert( p!=0 ); 
d440: 20 2f 2a 20 41 6c 77 61 79 73 20 72 65 74 75 72   /* Always retur
d450: 6e 73 20 70 43 73 72 2d 3e 73 50 6f 69 6e 74 20  ns pCsr->sPoint 
d460: 2a 2f 0a 20 20 20 20 20 20 70 43 73 72 2d 3e 61  */.      pCsr->a
d470: 4e 6f 64 65 5b 30 5d 20 3d 20 70 4c 65 61 66 3b  Node[0] = pLeaf;
d480: 0a 20 20 20 20 20 20 70 2d 3e 69 64 20 3d 20 69  .      p->id = i
d490: 4e 6f 64 65 3b 0a 20 20 20 20 20 20 70 2d 3e 65  Node;.      p->e
d4a0: 57 69 74 68 69 6e 20 3d 20 50 41 52 54 4c 59 5f  Within = PARTLY_
d4b0: 57 49 54 48 49 4e 3b 0a 20 20 20 20 20 20 72 63  WITHIN;.      rc
d4c0: 20 3d 20 6e 6f 64 65 52 6f 77 69 64 49 6e 64 65   = nodeRowidInde
d4d0: 78 28 70 52 74 72 65 65 2c 20 70 4c 65 61 66 2c  x(pRtree, pLeaf,
d4e0: 20 69 52 6f 77 69 64 2c 20 26 69 43 65 6c 6c 29   iRowid, &iCell)
d4f0: 3b 0a 20 20 20 20 20 20 70 2d 3e 69 43 65 6c 6c  ;.      p->iCell
d500: 20 3d 20 28 75 38 29 69 43 65 6c 6c 3b 0a 20 20   = (u8)iCell;.  
d510: 20 20 20 20 52 54 52 45 45 5f 51 55 45 55 45 5f      RTREE_QUEUE_
d520: 54 52 41 43 45 28 70 43 73 72 2c 20 22 50 55 53  TRACE(pCsr, "PUS
d530: 48 2d 46 31 3a 22 29 3b 0a 20 20 20 20 7d 65 6c  H-F1:");.    }el
d540: 73 65 7b 0a 20 20 20 20 20 20 70 43 73 72 2d 3e  se{.      pCsr->
d550: 61 74 45 4f 46 20 3d 20 31 3b 0a 20 20 20 20 7d  atEOF = 1;.    }
d560: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
d570: 20 4e 6f 72 6d 61 6c 20 63 61 73 65 20 2d 20 72   Normal case - r
d580: 2d 74 72 65 65 20 73 63 61 6e 2e 20 53 65 74 20  -tree scan. Set 
d590: 75 70 20 74 68 65 20 52 74 72 65 65 43 75 72 73  up the RtreeCurs
d5a0: 6f 72 2e 61 43 6f 6e 73 74 72 61 69 6e 74 20 61  or.aConstraint a
d5b0: 72 72 61 79 20 0a 20 20 20 20 2a 2a 20 77 69 74  rray .    ** wit
d5c0: 68 20 74 68 65 20 63 6f 6e 66 69 67 75 72 65 64  h the configured
d5d0: 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 0a 20   constraints. . 
d5e0: 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 6e     */.    rc = n
d5f0: 6f 64 65 41 63 71 75 69 72 65 28 70 52 74 72 65  odeAcquire(pRtre
d600: 65 2c 20 31 2c 20 30 2c 20 26 70 52 6f 6f 74 29  e, 1, 0, &pRoot)
d610: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
d620: 4c 49 54 45 5f 4f 4b 20 26 26 20 61 72 67 63 3e  LITE_OK && argc>
d630: 30 20 29 7b 0a 20 20 20 20 20 20 70 43 73 72 2d  0 ){.      pCsr-
d640: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 73  >aConstraint = s
d650: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69  qlite3_malloc(si
d660: 7a 65 6f 66 28 52 74 72 65 65 43 6f 6e 73 74 72  zeof(RtreeConstr
d670: 61 69 6e 74 29 2a 61 72 67 63 29 3b 0a 20 20 20  aint)*argc);.   
d680: 20 20 20 70 43 73 72 2d 3e 6e 43 6f 6e 73 74 72     pCsr->nConstr
d690: 61 69 6e 74 20 3d 20 61 72 67 63 3b 0a 20 20 20  aint = argc;.   
d6a0: 20 20 20 69 66 28 20 21 70 43 73 72 2d 3e 61 43     if( !pCsr->aC
d6b0: 6f 6e 73 74 72 61 69 6e 74 20 29 7b 0a 20 20 20  onstraint ){.   
d6c0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
d6d0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65  _NOMEM;.      }e
d6e0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  lse{.        mem
d6f0: 73 65 74 28 70 43 73 72 2d 3e 61 43 6f 6e 73 74  set(pCsr->aConst
d700: 72 61 69 6e 74 2c 20 30 2c 20 73 69 7a 65 6f 66  raint, 0, sizeof
d710: 28 52 74 72 65 65 43 6f 6e 73 74 72 61 69 6e 74  (RtreeConstraint
d720: 29 2a 61 72 67 63 29 3b 0a 20 20 20 20 20 20 20  )*argc);.       
d730: 20 6d 65 6d 73 65 74 28 70 43 73 72 2d 3e 61 6e   memset(pCsr->an
d740: 51 75 65 75 65 2c 20 30 2c 20 73 69 7a 65 6f 66  Queue, 0, sizeof
d750: 28 75 33 32 29 2a 28 70 52 74 72 65 65 2d 3e 69  (u32)*(pRtree->i
d760: 44 65 70 74 68 20 2b 20 31 29 29 3b 0a 20 20 20  Depth + 1));.   
d770: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 69 64       assert( (id
d780: 78 53 74 72 3d 3d 30 20 26 26 20 61 72 67 63 3d  xStr==0 && argc=
d790: 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  =0).            
d7a0: 20 20 20 20 7c 7c 20 28 69 64 78 53 74 72 20 26      || (idxStr &
d7b0: 26 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 69 64  & (int)strlen(id
d7c0: 78 53 74 72 29 3d 3d 61 72 67 63 2a 32 29 20 29  xStr)==argc*2) )
d7d0: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 69  ;.        for(ii
d7e0: 3d 30 3b 20 69 69 3c 61 72 67 63 3b 20 69 69 2b  =0; ii<argc; ii+
d7f0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 52 74  +){.          Rt
d800: 72 65 65 43 6f 6e 73 74 72 61 69 6e 74 20 2a 70  reeConstraint *p
d810: 20 3d 20 26 70 43 73 72 2d 3e 61 43 6f 6e 73 74   = &pCsr->aConst
d820: 72 61 69 6e 74 5b 69 69 5d 3b 0a 20 20 20 20 20  raint[ii];.     
d830: 20 20 20 20 20 70 2d 3e 6f 70 20 3d 20 69 64 78       p->op = idx
d840: 53 74 72 5b 69 69 2a 32 5d 3b 0a 20 20 20 20 20  Str[ii*2];.     
d850: 20 20 20 20 20 70 2d 3e 69 43 6f 6f 72 64 20 3d       p->iCoord =
d860: 20 69 64 78 53 74 72 5b 69 69 2a 32 2b 31 5d 2d   idxStr[ii*2+1]-
d870: 27 30 27 3b 0a 20 20 20 20 20 20 20 20 20 20 69  '0';.          i
d880: 66 28 20 70 2d 3e 6f 70 3e 3d 52 54 52 45 45 5f  f( p->op>=RTREE_
d890: 4d 41 54 43 48 20 29 7b 0a 20 20 20 20 20 20 20  MATCH ){.       
d8a0: 20 20 20 20 20 2f 2a 20 41 20 4d 41 54 43 48 20       /* A MATCH 
d8b0: 6f 70 65 72 61 74 6f 72 2e 20 54 68 65 20 72 69  operator. The ri
d8c0: 67 68 74 2d 68 61 6e 64 2d 73 69 64 65 20 6d 75  ght-hand-side mu
d8d0: 73 74 20 62 65 20 61 20 62 6c 6f 62 20 74 68 61  st be a blob tha
d8e0: 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  t.            **
d8f0: 20 63 61 6e 20 62 65 20 63 61 73 74 20 69 6e 74   can be cast int
d900: 6f 20 61 6e 20 52 74 72 65 65 4d 61 74 63 68 41  o an RtreeMatchA
d910: 72 67 20 6f 62 6a 65 63 74 2e 20 4f 6e 65 20 63  rg object. One c
d920: 72 65 61 74 65 64 20 75 73 69 6e 67 0a 20 20 20  reated using.   
d930: 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 20 73           ** an s
d940: 71 6c 69 74 65 33 5f 72 74 72 65 65 5f 67 65 6f  qlite3_rtree_geo
d950: 6d 65 74 72 79 5f 63 61 6c 6c 62 61 63 6b 28 29  metry_callback()
d960: 20 53 51 4c 20 75 73 65 72 20 66 75 6e 63 74 69   SQL user functi
d970: 6f 6e 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  on..            
d980: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  */.            r
d990: 63 20 3d 20 64 65 73 65 72 69 61 6c 69 7a 65 47  c = deserializeG
d9a0: 65 6f 6d 65 74 72 79 28 61 72 67 76 5b 69 69 5d  eometry(argv[ii]
d9b0: 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , p);.          
d9c0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
d9d0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
d9e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d9f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
da00: 20 20 20 20 20 20 70 2d 3e 70 49 6e 66 6f 2d 3e        p->pInfo->
da10: 6e 43 6f 6f 72 64 20 3d 20 70 52 74 72 65 65 2d  nCoord = pRtree-
da20: 3e 6e 44 69 6d 32 3b 0a 20 20 20 20 20 20 20 20  >nDim2;.        
da30: 20 20 20 20 70 2d 3e 70 49 6e 66 6f 2d 3e 61 6e      p->pInfo->an
da40: 51 75 65 75 65 20 3d 20 70 43 73 72 2d 3e 61 6e  Queue = pCsr->an
da50: 51 75 65 75 65 3b 0a 20 20 20 20 20 20 20 20 20  Queue;.         
da60: 20 20 20 70 2d 3e 70 49 6e 66 6f 2d 3e 6d 78 4c     p->pInfo->mxL
da70: 65 76 65 6c 20 3d 20 70 52 74 72 65 65 2d 3e 69  evel = pRtree->i
da80: 44 65 70 74 68 20 2b 20 31 3b 0a 20 20 20 20 20  Depth + 1;.     
da90: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64       }else{.#ifd
daa0: 65 66 20 53 51 4c 49 54 45 5f 52 54 52 45 45 5f  ef SQLITE_RTREE_
dab0: 49 4e 54 5f 4f 4e 4c 59 0a 20 20 20 20 20 20 20  INT_ONLY.       
dac0: 20 20 20 20 20 70 2d 3e 75 2e 72 56 61 6c 75 65       p->u.rValue
dad0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
dae0: 5f 69 6e 74 36 34 28 61 72 67 76 5b 69 69 5d 29  _int64(argv[ii])
daf0: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20  ;.#else.        
db00: 20 20 20 20 70 2d 3e 75 2e 72 56 61 6c 75 65 20      p->u.rValue 
db10: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
db20: 64 6f 75 62 6c 65 28 61 72 67 76 5b 69 69 5d 29  double(argv[ii])
db30: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  ;.#endif.       
db40: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
db50: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
db60: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
db70: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 52 74 72 65  OK ){.      Rtre
db80: 65 53 65 61 72 63 68 50 6f 69 6e 74 20 2a 70 4e  eSearchPoint *pN
db90: 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d  ew;.      pNew =
dba0: 20 72 74 72 65 65 53 65 61 72 63 68 50 6f 69 6e   rtreeSearchPoin
dbb0: 74 4e 65 77 28 70 43 73 72 2c 20 52 54 52 45 45  tNew(pCsr, RTREE
dbc0: 5f 5a 45 52 4f 2c 20 28 75 38 29 28 70 52 74 72  _ZERO, (u8)(pRtr
dbd0: 65 65 2d 3e 69 44 65 70 74 68 2b 31 29 29 3b 0a  ee->iDepth+1));.
dbe0: 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d        if( pNew==
dbf0: 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
dc00: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 70  E_NOMEM;.      p
dc10: 4e 65 77 2d 3e 69 64 20 3d 20 31 3b 0a 20 20 20  New->id = 1;.   
dc20: 20 20 20 70 4e 65 77 2d 3e 69 43 65 6c 6c 20 3d     pNew->iCell =
dc30: 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   0;.      pNew->
dc40: 65 57 69 74 68 69 6e 20 3d 20 50 41 52 54 4c 59  eWithin = PARTLY
dc50: 5f 57 49 54 48 49 4e 3b 0a 20 20 20 20 20 20 61  _WITHIN;.      a
dc60: 73 73 65 72 74 28 20 70 43 73 72 2d 3e 62 50 6f  ssert( pCsr->bPo
dc70: 69 6e 74 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  int==1 );.      
dc80: 70 43 73 72 2d 3e 61 4e 6f 64 65 5b 30 5d 20 3d  pCsr->aNode[0] =
dc90: 20 70 52 6f 6f 74 3b 0a 20 20 20 20 20 20 70 52   pRoot;.      pR
dca0: 6f 6f 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 52  oot = 0;.      R
dcb0: 54 52 45 45 5f 51 55 45 55 45 5f 54 52 41 43 45  TREE_QUEUE_TRACE
dcc0: 28 70 43 73 72 2c 20 22 50 55 53 48 2d 46 6d 3a  (pCsr, "PUSH-Fm:
dcd0: 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72  ");.      rc = r
dce0: 74 72 65 65 53 74 65 70 54 6f 4c 65 61 66 28 70  treeStepToLeaf(p
dcf0: 43 73 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Csr);.    }.  }.
dd00: 0a 20 20 6e 6f 64 65 52 65 6c 65 61 73 65 28 70  .  nodeRelease(p
dd10: 52 74 72 65 65 2c 20 70 52 6f 6f 74 29 3b 0a 20  Rtree, pRoot);. 
dd20: 20 72 74 72 65 65 52 65 6c 65 61 73 65 28 70 52   rtreeRelease(pR
dd30: 74 72 65 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  tree);.  return 
dd40: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 74 72  rc;.}../*.** Rtr
dd50: 65 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ee virtual table
dd60: 20 6d 6f 64 75 6c 65 20 78 42 65 73 74 49 6e 64   module xBestInd
dd70: 65 78 20 6d 65 74 68 6f 64 2e 20 54 68 65 72 65  ex method. There
dd80: 20 61 72 65 20 74 68 72 65 65 0a 2a 2a 20 74 61   are three.** ta
dd90: 62 6c 65 20 73 63 61 6e 20 73 74 72 61 74 65 67  ble scan strateg
dda0: 69 65 73 20 74 6f 20 63 68 6f 6f 73 65 20 66 72  ies to choose fr
ddb0: 6f 6d 20 28 69 6e 20 6f 72 64 65 72 20 66 72 6f  om (in order fro
ddc0: 6d 20 6d 6f 73 74 20 74 6f 20 0a 2a 2a 20 6c 65  m most to .** le
ddd0: 61 73 74 20 64 65 73 69 72 61 62 6c 65 29 3a 0a  ast desirable):.
dde0: 2a 2a 0a 2a 2a 20 20 20 69 64 78 4e 75 6d 20 20  **.**   idxNum  
ddf0: 20 20 20 69 64 78 53 74 72 20 20 20 20 20 20 20     idxStr       
de00: 20 53 74 72 61 74 65 67 79 0a 2a 2a 20 20 20 2d   Strategy.**   -
de10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
de20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
de30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
de40: 2a 2a 20 20 20 20 20 31 20 20 20 20 20 20 20 20  **     1        
de50: 55 6e 75 73 65 64 20 20 20 20 20 20 20 20 44 69  Unused        Di
de60: 72 65 63 74 20 6c 6f 6f 6b 75 70 20 62 79 20 72  rect lookup by r
de70: 6f 77 69 64 2e 0a 2a 2a 20 20 20 20 20 32 20 20  owid..**     2  
de80: 20 20 20 20 20 20 53 65 65 20 62 65 6c 6f 77 20        See below 
de90: 20 20 20 20 52 2d 74 72 65 65 20 71 75 65 72 79      R-tree query
dea0: 20 6f 72 20 66 75 6c 6c 2d 74 61 62 6c 65 20 73   or full-table s
deb0: 63 61 6e 2e 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d  can..**   ------
dec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ded0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a  ----------.**.**
def0: 20 49 66 20 73 74 72 61 74 65 67 79 20 31 20 69   If strategy 1 i
df00: 73 20 75 73 65 64 2c 20 74 68 65 6e 20 69 64 78  s used, then idx
df10: 53 74 72 20 69 73 20 6e 6f 74 20 6d 65 61 6e 69  Str is not meani
df20: 6e 67 66 75 6c 2e 20 49 66 20 73 74 72 61 74 65  ngful. If strate
df30: 67 79 0a 2a 2a 20 32 20 69 73 20 75 73 65 64 2c  gy.** 2 is used,
df40: 20 69 64 78 53 74 72 20 69 73 20 66 6f 72 6d 61   idxStr is forma
df50: 74 74 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20  tted to contain 
df60: 32 20 62 79 74 65 73 20 66 6f 72 20 65 61 63 68  2 bytes for each
df70: 20 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20   .** constraint 
df80: 75 73 65 64 2e 20 54 68 65 20 66 69 72 73 74 20  used. The first 
df90: 74 77 6f 20 62 79 74 65 73 20 6f 66 20 69 64 78  two bytes of idx
dfa0: 53 74 72 20 63 6f 72 72 65 73 70 6f 6e 64 20 74  Str correspond t
dfb0: 6f 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 73 74 72  o .** the constr
dfc0: 61 69 6e 74 20 69 6e 20 73 71 6c 69 74 65 33 5f  aint in sqlite3_
dfd0: 69 6e 64 65 78 5f 69 6e 66 6f 2e 61 43 6f 6e 73  index_info.aCons
dfe0: 74 72 61 69 6e 74 55 73 61 67 65 5b 5d 20 77 69  traintUsage[] wi
dff0: 74 68 0a 2a 2a 20 28 61 72 67 76 49 6e 64 65 78  th.** (argvIndex
e000: 3d 3d 31 29 20 65 74 63 2e 0a 2a 2a 0a 2a 2a 20  ==1) etc..**.** 
e010: 54 68 65 20 66 69 72 73 74 20 6f 66 20 65 61 63  The first of eac
e020: 68 20 70 61 69 72 20 6f 66 20 62 79 74 65 73 20  h pair of bytes 
e030: 69 6e 20 69 64 78 53 74 72 20 69 64 65 6e 74 69  in idxStr identi
e040: 66 69 65 73 20 74 68 65 20 63 6f 6e 73 74 72 61  fies the constra
e050: 69 6e 74 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20  int.** operator 
e060: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
e070: 2a 20 20 20 4f 70 65 72 61 74 6f 72 20 20 20 20  *   Operator    
e080: 42 79 74 65 20 56 61 6c 75 65 0a 2a 2a 20 20 20  Byte Value.**   
e090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e0a0: 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 3d  ------.**      =
e0b0: 20 20 20 20 20 20 20 20 30 78 34 31 20 28 27 41          0x41 ('A
e0c0: 27 29 0a 2a 2a 20 20 20 20 20 3c 3d 20 20 20 20  ').**     <=    
e0d0: 20 20 20 20 30 78 34 32 20 28 27 42 27 29 0a 2a      0x42 ('B').*
e0e0: 2a 20 20 20 20 20 20 3c 20 20 20 20 20 20 20 20  *      <        
e0f0: 30 78 34 33 20 28 27 43 27 29 0a 2a 2a 20 20 20  0x43 ('C').**   
e100: 20 20 3e 3d 20 20 20 20 20 20 20 20 30 78 34 34    >=        0x44
e110: 20 28 27 44 27 29 0a 2a 2a 20 20 20 20 20 20 3e   ('D').**      >
e120: 20 20 20 20 20 20 20 20 30 78 34 35 20 28 27 45          0x45 ('E
e130: 27 29 0a 2a 2a 20 20 20 4d 41 54 43 48 20 20 20  ').**   MATCH   
e140: 20 20 20 20 30 78 34 36 20 28 27 46 27 29 0a 2a      0x46 ('F').*
e150: 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
e160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a  ----------.**.**
e170: 20 54 68 65 20 73 65 63 6f 6e 64 20 6f 66 20 65   The second of e
e180: 61 63 68 20 70 61 69 72 20 6f 66 20 62 79 74 65  ach pair of byte
e190: 73 20 69 64 65 6e 74 69 66 69 65 73 20 74 68 65  s identifies the
e1a0: 20 63 6f 6f 72 64 69 6e 61 74 65 20 63 6f 6c 75   coordinate colu
e1b0: 6d 6e 0a 2a 2a 20 74 6f 20 77 68 69 63 68 20 74  mn.** to which t
e1c0: 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 70  he constraint ap
e1d0: 70 6c 69 65 73 2e 20 54 68 65 20 6c 65 66 74 6d  plies. The leftm
e1e0: 6f 73 74 20 63 6f 6f 72 64 69 6e 61 74 65 20 63  ost coordinate c
e1f0: 6f 6c 75 6d 6e 0a 2a 2a 20 69 73 20 27 61 27 2c  olumn.** is 'a',
e200: 20 74 68 65 20 73 65 63 6f 6e 64 20 66 72 6f 6d   the second from
e210: 20 74 68 65 20 6c 65 66 74 20 27 62 27 20 65 74   the left 'b' et
e220: 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  c..*/.static int
e230: 20 72 74 72 65 65 42 65 73 74 49 6e 64 65 78 28   rtreeBestIndex(
e240: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 74 61  sqlite3_vtab *ta
e250: 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  b, sqlite3_index
e260: 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 29  _info *pIdxInfo)
e270: 7b 0a 20 20 52 74 72 65 65 20 2a 70 52 74 72 65  {.  Rtree *pRtre
e280: 65 20 3d 20 28 52 74 72 65 65 2a 29 74 61 62 3b  e = (Rtree*)tab;
e290: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
e2a0: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 69 3b  TE_OK;.  int ii;
e2b0: 0a 20 20 69 6e 74 20 62 4d 61 74 63 68 20 3d 20  .  int bMatch = 
e2c0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
e2d0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
e2e0: 65 72 65 20 65 78 69 73 74 73 20 61 20 4d 41 54  ere exists a MAT
e2f0: 43 48 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  CH constraint */
e300: 0a 20 20 69 36 34 20 6e 52 6f 77 3b 20 20 20 20  .  i64 nRow;    
e310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e320: 20 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 64 20     /* Estimated 
e330: 72 6f 77 73 20 72 65 74 75 72 6e 65 64 20 62 79  rows returned by
e340: 20 74 68 69 73 20 73 63 61 6e 20 2a 2f 0a 0a 20   this scan */.. 
e350: 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20   int iIdx = 0;. 
e360: 20 63 68 61 72 20 7a 49 64 78 53 74 72 5b 52 54   char zIdxStr[RT
e370: 52 45 45 5f 4d 41 58 5f 44 49 4d 45 4e 53 49 4f  REE_MAX_DIMENSIO
e380: 4e 53 2a 38 2b 31 5d 3b 0a 20 20 6d 65 6d 73 65  NS*8+1];.  memse
e390: 74 28 7a 49 64 78 53 74 72 2c 20 30 2c 20 73 69  t(zIdxStr, 0, si
e3a0: 7a 65 6f 66 28 7a 49 64 78 53 74 72 29 29 3b 0a  zeof(zIdxStr));.
e3b0: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74  .  /* Check if t
e3c0: 68 65 72 65 20 65 78 69 73 74 73 20 61 20 4d 41  here exists a MA
e3d0: 54 43 48 20 63 6f 6e 73 74 72 61 69 6e 74 20 2d  TCH constraint -
e3e0: 20 65 76 65 6e 20 61 6e 20 75 6e 75 73 61 62 6c   even an unusabl
e3f0: 65 20 6f 6e 65 2e 20 49 66 20 74 68 65 72 65 0a  e one. If there.
e400: 20 20 2a 2a 20 69 73 2c 20 64 6f 20 6e 6f 74 20    ** is, do not 
e410: 63 6f 6e 73 69 64 65 72 20 74 68 65 20 6c 6f 6f  consider the loo
e420: 6b 75 70 2d 62 79 2d 72 6f 77 69 64 20 70 6c 61  kup-by-rowid pla
e430: 6e 20 61 73 20 75 73 69 6e 67 20 73 75 63 68 20  n as using such 
e440: 61 20 70 6c 61 6e 20 77 6f 75 6c 64 0a 20 20 2a  a plan would.  *
e450: 2a 20 72 65 71 75 69 72 65 20 74 68 65 20 56 44  * require the VD
e460: 42 45 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  BE to evaluate t
e470: 68 65 20 4d 41 54 43 48 20 63 6f 6e 73 74 72 61  he MATCH constra
e480: 69 6e 74 2c 20 77 68 69 63 68 20 69 73 20 6e 6f  int, which is no
e490: 74 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a  t currently.  **
e4a0: 20 70 6f 73 73 69 62 6c 65 2e 20 2a 2f 0a 20 20   possible. */.  
e4b0: 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 49 64  for(ii=0; ii<pId
e4c0: 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69  xInfo->nConstrai
e4d0: 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69  nt; ii++){.    i
e4e0: 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f  f( pIdxInfo->aCo
e4f0: 6e 73 74 72 61 69 6e 74 5b 69 69 5d 2e 6f 70 3d  nstraint[ii].op=
e500: 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
e510: 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43 48 20 29  NSTRAINT_MATCH )
e520: 7b 0a 20 20 20 20 20 20 62 4d 61 74 63 68 20 3d  {.      bMatch =
e530: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   1;.    }.  }.. 
e540: 20 61 73 73 65 72 74 28 20 70 49 64 78 49 6e 66   assert( pIdxInf
e550: 6f 2d 3e 69 64 78 53 74 72 3d 3d 30 20 29 3b 0a  o->idxStr==0 );.
e560: 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
e570: 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72  IdxInfo->nConstr
e580: 61 69 6e 74 20 26 26 20 69 49 64 78 3c 28 69 6e  aint && iIdx<(in
e590: 74 29 28 73 69 7a 65 6f 66 28 7a 49 64 78 53 74  t)(sizeof(zIdxSt
e5a0: 72 29 2d 31 29 3b 20 69 69 2b 2b 29 7b 0a 20 20  r)-1); ii++){.  
e5b0: 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33    struct sqlite3
e5c0: 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
e5d0: 74 20 2a 70 20 3d 20 26 70 49 64 78 49 6e 66 6f  t *p = &pIdxInfo
e5e0: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 69  ->aConstraint[ii
e5f0: 5d 3b 0a 0a 20 20 20 20 69 66 28 20 62 4d 61 74  ];..    if( bMat
e600: 63 68 3d 3d 30 20 26 26 20 70 2d 3e 75 73 61 62  ch==0 && p->usab
e610: 6c 65 20 0a 20 20 20 20 20 26 26 20 70 2d 3e 69  le .     && p->i
e620: 43 6f 6c 75 6d 6e 3d 3d 30 20 26 26 20 70 2d 3e  Column==0 && p->
e630: 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  op==SQLITE_INDEX
e640: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20 0a  _CONSTRAINT_EQ .
e650: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
e660: 57 65 20 68 61 76 65 20 61 6e 20 65 71 75 61 6c  We have an equal
e670: 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f  ity constraint o
e680: 6e 20 74 68 65 20 72 6f 77 69 64 2e 20 55 73 65  n the rowid. Use
e690: 20 73 74 72 61 74 65 67 79 20 31 2e 20 2a 2f 0a   strategy 1. */.
e6a0: 20 20 20 20 20 20 69 6e 74 20 6a 6a 3b 0a 20 20        int jj;.  
e6b0: 20 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a      for(jj=0; jj
e6c0: 3c 69 69 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20  <ii; jj++){.    
e6d0: 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43      pIdxInfo->aC
e6e0: 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 6a  onstraintUsage[j
e6f0: 6a 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d 20 30  j].argvIndex = 0
e700: 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 49 6e  ;.        pIdxIn
e710: 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
e720: 73 61 67 65 5b 6a 6a 5d 2e 6f 6d 69 74 20 3d 20  sage[jj].omit = 
e730: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
e740: 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75   pIdxInfo->idxNu
e750: 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 64  m = 1;.      pId
e760: 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
e770: 6e 74 55 73 61 67 65 5b 69 69 5d 2e 61 72 67 76  ntUsage[ii].argv
e780: 49 6e 64 65 78 20 3d 20 31 3b 0a 20 20 20 20 20  Index = 1;.     
e790: 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73   pIdxInfo->aCons
e7a0: 74 72 61 69 6e 74 55 73 61 67 65 5b 6a 6a 5d 2e  traintUsage[jj].
e7b0: 6f 6d 69 74 20 3d 20 31 3b 0a 0a 20 20 20 20 20  omit = 1;..     
e7c0: 20 2f 2a 20 54 68 69 73 20 73 74 72 61 74 65 67   /* This strateg
e7d0: 79 20 69 6e 76 6f 6c 76 65 73 20 61 20 74 77 6f  y involves a two
e7e0: 20 72 6f 77 69 64 20 6c 6f 6f 6b 75 70 73 20 6f   rowid lookups o
e7f0: 6e 20 61 6e 20 42 2d 54 72 65 65 20 73 74 72 75  n an B-Tree stru
e800: 63 74 75 72 65 73 0a 20 20 20 20 20 20 2a 2a 20  ctures.      ** 
e810: 61 6e 64 20 74 68 65 6e 20 61 20 6c 69 6e 65 61  and then a linea
e820: 72 20 73 65 61 72 63 68 20 6f 66 20 61 6e 20 52  r search of an R
e830: 2d 54 72 65 65 20 6e 6f 64 65 2e 20 54 68 69 73  -Tree node. This
e840: 20 73 68 6f 75 6c 64 20 62 65 20 0a 20 20 20 20   should be .    
e850: 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20    ** considered 
e860: 61 6c 6d 6f 73 74 20 61 73 20 71 75 69 63 6b 20  almost as quick 
e870: 61 73 20 61 20 64 69 72 65 63 74 20 72 6f 77 69  as a direct rowi
e880: 64 20 6c 6f 6f 6b 75 70 20 28 66 6f 72 20 77 68  d lookup (for wh
e890: 69 63 68 20 0a 20 20 20 20 20 20 2a 2a 20 73 71  ich .      ** sq
e8a0: 6c 69 74 65 20 75 73 65 73 20 61 6e 20 69 6e 74  lite uses an int
e8b0: 65 72 6e 61 6c 20 63 6f 73 74 20 6f 66 20 30 2e  ernal cost of 0.
e8c0: 30 29 2e 20 49 74 20 69 73 20 65 78 70 65 63 74  0). It is expect
e8d0: 65 64 20 74 6f 20 72 65 74 75 72 6e 0a 20 20 20  ed to return.   
e8e0: 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 72     ** a single r
e8f0: 6f 77 2e 0a 20 20 20 20 20 20 2a 2f 20 0a 20 20  ow..      */ .  
e900: 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73      pIdxInfo->es
e910: 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 33 30  timatedCost = 30
e920: 2e 30 3b 0a 20 20 20 20 20 20 70 49 64 78 49 6e  .0;.      pIdxIn
e930: 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77  fo->estimatedRow
e940: 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74  s = 1;.      ret
e950: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
e960: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 2d     }..    if( p-
e970: 3e 75 73 61 62 6c 65 20 26 26 20 28 70 2d 3e 69  >usable && (p->i
e980: 43 6f 6c 75 6d 6e 3e 30 20 7c 7c 20 70 2d 3e 6f  Column>0 || p->o
e990: 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  p==SQLITE_INDEX_
e9a0: 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43 48  CONSTRAINT_MATCH
e9b0: 29 20 29 7b 0a 20 20 20 20 20 20 75 38 20 6f 70  ) ){.      u8 op
e9c0: 3b 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20  ;.      switch( 
e9d0: 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20 20 20  p->op ){.       
e9e0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 44   case SQLITE_IND
e9f0: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51  EX_CONSTRAINT_EQ
ea00: 3a 20 6f 70 20 3d 20 52 54 52 45 45 5f 45 51 3b  : op = RTREE_EQ;
ea10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
ea20: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 44 45  case SQLITE_INDE
ea30: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 54 3a  X_CONSTRAINT_GT:
ea40: 20 6f 70 20 3d 20 52 54 52 45 45 5f 47 54 3b 20   op = RTREE_GT; 
ea50: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
ea60: 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 44 45 58  ase SQLITE_INDEX
ea70: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 45 3a 20  _CONSTRAINT_LE: 
ea80: 6f 70 20 3d 20 52 54 52 45 45 5f 4c 45 3b 20 62  op = RTREE_LE; b
ea90: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
eaa0: 73 65 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  se SQLITE_INDEX_
eab0: 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54 3a 20 6f  CONSTRAINT_LT: o
eac0: 70 20 3d 20 52 54 52 45 45 5f 4c 54 3b 20 62 72  p = RTREE_LT; br
ead0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
eae0: 65 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  e SQLITE_INDEX_C
eaf0: 4f 4e 53 54 52 41 49 4e 54 5f 47 45 3a 20 6f 70  ONSTRAINT_GE: op
eb00: 20 3d 20 52 54 52 45 45 5f 47 45 3b 20 62 72 65   = RTREE_GE; bre
eb10: 61 6b 3b 0a 20 20 20 20 20 20 20 20 64 65 66 61  ak;.        defa
eb20: 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 20 20 61  ult:.          a
eb30: 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 53 51  ssert( p->op==SQ
eb40: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
eb50: 52 41 49 4e 54 5f 4d 41 54 43 48 20 29 3b 0a 20  RAINT_MATCH );. 
eb60: 20 20 20 20 20 20 20 20 20 6f 70 20 3d 20 52 54           op = RT
eb70: 52 45 45 5f 4d 41 54 43 48 3b 20 0a 20 20 20 20  REE_MATCH; .    
eb80: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
eb90: 20 20 20 7d 0a 20 20 20 20 20 20 7a 49 64 78 53     }.      zIdxS
eba0: 74 72 5b 69 49 64 78 2b 2b 5d 20 3d 20 6f 70 3b  tr[iIdx++] = op;
ebb0: 0a 20 20 20 20 20 20 7a 49 64 78 53 74 72 5b 69  .      zIdxStr[i
ebc0: 49 64 78 2b 2b 5d 20 3d 20 28 63 68 61 72 29 28  Idx++] = (char)(
ebd0: 70 2d 3e 69 43 6f 6c 75 6d 6e 20 2d 20 31 20 2b  p->iColumn - 1 +
ebe0: 20 27 30 27 29 3b 0a 20 20 20 20 20 20 70 49 64   '0');.      pId
ebf0: 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
ec00: 6e 74 55 73 61 67 65 5b 69 69 5d 2e 61 72 67 76  ntUsage[ii].argv
ec10: 49 6e 64 65 78 20 3d 20 28 69 49 64 78 2f 32 29  Index = (iIdx/2)
ec20: 3b 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f  ;.      pIdxInfo
ec30: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
ec40: 67 65 5b 69 69 5d 2e 6f 6d 69 74 20 3d 20 31 3b  ge[ii].omit = 1;
ec50: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 49  .    }.  }..  pI
ec60: 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d  dxInfo->idxNum =
ec70: 20 32 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e   2;.  pIdxInfo->
ec80: 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
ec90: 20 3d 20 31 3b 0a 20 20 69 66 28 20 69 49 64 78   = 1;.  if( iIdx
eca0: 3e 30 20 26 26 20 30 3d 3d 28 70 49 64 78 49 6e  >0 && 0==(pIdxIn
ecb0: 66 6f 2d 3e 69 64 78 53 74 72 20 3d 20 73 71 6c  fo->idxStr = sql
ecc0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
ecd0: 22 2c 20 7a 49 64 78 53 74 72 29 29 20 29 7b 0a  ", zIdxStr)) ){.
ece0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ecf0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20  E_NOMEM;.  }..  
ed00: 6e 52 6f 77 20 3d 20 70 52 74 72 65 65 2d 3e 6e  nRow = pRtree->n
ed10: 52 6f 77 45 73 74 20 3e 3e 20 28 69 49 64 78 2f  RowEst >> (iIdx/
ed20: 32 29 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e  2);.  pIdxInfo->
ed30: 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20  estimatedCost = 
ed40: 28 64 6f 75 62 6c 65 29 36 2e 30 20 2a 20 28 64  (double)6.0 * (d
ed50: 6f 75 62 6c 65 29 6e 52 6f 77 3b 0a 20 20 70 49  ouble)nRow;.  pI
ed60: 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65  dxInfo->estimate
ed70: 64 52 6f 77 73 20 3d 20 6e 52 6f 77 3b 0a 0a 20  dRows = nRow;.. 
ed80: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
ed90: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
eda0: 4e 2d 64 69 6d 65 6e 73 69 6f 6e 61 6c 20 76 6f  N-dimensional vo
edb0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 63 65 6c 6c  lumn of the cell
edc0: 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 2e 0a 2a   stored in *p..*
edd0: 2f 0a 73 74 61 74 69 63 20 52 74 72 65 65 44 56  /.static RtreeDV
ede0: 61 6c 75 65 20 63 65 6c 6c 41 72 65 61 28 52 74  alue cellArea(Rt
edf0: 72 65 65 20 2a 70 52 74 72 65 65 2c 20 52 74 72  ree *pRtree, Rtr
ee00: 65 65 43 65 6c 6c 20 2a 70 29 7b 0a 20 20 52 74  eeCell *p){.  Rt
ee10: 72 65 65 44 56 61 6c 75 65 20 61 72 65 61 20 3d  reeDValue area =
ee20: 20 28 52 74 72 65 65 44 56 61 6c 75 65 29 31 3b   (RtreeDValue)1;
ee30: 0a 20 20 61 73 73 65 72 74 28 20 70 52 74 72 65  .  assert( pRtre
ee40: 65 2d 3e 6e 44 69 6d 3e 3d 31 20 26 26 20 70 52  e->nDim>=1 && pR
ee50: 74 72 65 65 2d 3e 6e 44 69 6d 3c 3d 35 20 29 3b  tree->nDim<=5 );
ee60: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
ee70: 52 54 52 45 45 5f 49 4e 54 5f 4f 4e 4c 59 0a 20  RTREE_INT_ONLY. 
ee80: 20 69 66 28 20 70 52 74 72 65 65 2d 3e 65 43 6f   if( pRtree->eCo
ee90: 6f 72 64 54 79 70 65 3d 3d 52 54 52 45 45 5f 43  ordType==RTREE_C
eea0: 4f 4f 52 44 5f 52 45 41 4c 33 32 20 29 7b 0a 20  OORD_REAL32 ){. 
eeb0: 20 20 20 73 77 69 74 63 68 28 20 70 52 74 72 65     switch( pRtre
eec0: 65 2d 3e 6e 44 69 6d 20 29 7b 0a 20 20 20 20 20  e->nDim ){.     
eed0: 20 63 61 73 65 20 35 3a 20 20 61 72 65 61 20 20   case 5:  area  
eee0: 3d 20 70 2d 3e 61 43 6f 6f 72 64 5b 39 5d 2e 66  = p->aCoord[9].f
eef0: 20 2d 20 70 2d 3e 61 43 6f 6f 72 64 5b 38 5d 2e   - p->aCoord[8].
ef00: 66 3b 0a 20 20 20 20 20 20 63 61 73 65 20 34 3a  f;.      case 4:
ef10: 20 20 61 72 65 61 20 2a 3d 20 70 2d 3e 61 43 6f    area *= p->aCo
ef20: 6f 72 64 5b 37 5d 2e 66 20 2d 20 70 2d 3e 61 43  ord[7].f - p->aC
ef30: 6f 6f 72 64 5b 36 5d 2e 66 3b 0a 20 20 20 20 20  oord[6].f;.     
ef40: 20 63 61 73 65 20 33 3a 20 20 61 72 65 61 20 2a   case 3:  area *
ef50: 3d 20 70 2d 3e 61 43 6f 6f 72 64 5b 35 5d 2e 66  = p->aCoord[5].f
ef60: 20 2d 20 70 2d 3e 61 43 6f 6f 72 64 5b 34 5d 2e   - p->aCoord[4].
ef70: 66 3b 0a 20 20 20 20 20 20 63 61 73 65 20 32 3a  f;.      case 2:
ef80: 20 20 61 72 65 61 20 2a 3d 20 70 2d 3e 61 43 6f    area *= p->aCo
ef90: 6f 72 64 5b 33 5d 2e 66 20 2d 20 70 2d 3e 61 43  ord[3].f - p->aC
efa0: 6f 6f 72 64 5b 32 5d 2e 66 3b 0a 20 20 20 20 20  oord[2].f;.     
efb0: 20 64 65 66 61 75 6c 74 3a 20 61 72 65 61 20 2a   default: area *
efc0: 3d 20 70 2d 3e 61 43 6f 6f 72 64 5b 31 5d 2e 66  = p->aCoord[1].f
efd0: 20 2d 20 70 2d 3e 61 43 6f 6f 72 64 5b 30 5d 2e   - p->aCoord[0].
efe0: 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  f;.    }.  }else
eff0: 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20  .#endif.  {.    
f000: 73 77 69 74 63 68 28 20 70 52 74 72 65 65 2d 3e  switch( pRtree->
f010: 6e 44 69 6d 20 29 7b 0a 20 20 20 20 20 20 63 61  nDim ){.      ca
f020: 73 65 20 35 3a 20 20 61 72 65 61 20 20 3d 20 70  se 5:  area  = p
f030: 2d 3e 61 43 6f 6f 72 64 5b 39 5d 2e 69 20 2d 20  ->aCoord[9].i - 
f040: 70 2d 3e 61 43 6f 6f 72 64 5b 38 5d 2e 69 3b 0a  p->aCoord[8].i;.
f050: 20 20 20 20 20 20 63 61 73 65 20 34 3a 20 20 61        case 4:  a
f060: 72 65 61 20 2a 3d 20 70 2d 3e 61 43 6f 6f 72 64  rea *= p->aCoord
f070: 5b 37 5d 2e 69 20 2d 20 70 2d 3e 61 43 6f 6f 72  [7].i - p->aCoor
f080: 64 5b 36 5d 2e 69 3b 0a 20 20 20 20 20 20 63 61  d[6].i;.      ca
f090: 73 65 20 33 3a 20 20 61 72 65 61 20 2a 3d 20 70  se 3:  area *= p
f0a0: 2d 3e 61 43 6f 6f 72 64 5b 35 5d 2e 69 20 2d 20  ->aCoord[5].i - 
f0b0: 70 2d 3e 61 43 6f 6f 72 64 5b 34 5d 2e 69 3b 0a  p->aCoord[4].i;.
f0c0: 20 20 20 20 20 20 63 61 73 65 20 32 3a 20 20 61        case 2:  a
f0d0: 72 65 61 20 2a 3d 20 70 2d 3e 61 43 6f 6f 72 64  rea *= p->aCoord
f0e0: 5b 33 5d 2e 69 20 2d 20 70 2d 3e 61 43 6f 6f 72  [3].i - p->aCoor
f0f0: 64 5b 32 5d 2e 69 3b 0a 20 20 20 20 20 20 64 65  d[2].i;.      de
f100: 66 61 75 6c 74 3a 20 61 72 65 61 20 2a 3d 20 70  fault: area *= p
f110: 2d 3e 61 43 6f 6f 72 64 5b 31 5d 2e 69 20 2d 20  ->aCoord[1].i - 
f120: 70 2d 3e 61 43 6f 6f 72 64 5b 30 5d 2e 69 3b 0a  p->aCoord[0].i;.
f130: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
f140: 72 6e 20 61 72 65 61 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn area;.}../*.*
f150: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 61 72  * Return the mar
f160: 67 69 6e 20 6c 65 6e 67 74 68 20 6f 66 20 63 65  gin length of ce
f170: 6c 6c 20 70 2e 20 54 68 65 20 6d 61 72 67 69 6e  ll p. The margin
f180: 20 6c 65 6e 67 74 68 20 69 73 20 74 68 65 20 73   length is the s
f190: 75 6d 0a 2a 2a 20 6f 66 20 74 68 65 20 6f 62 6a  um.** of the obj
f1a0: 65 63 74 73 20 73 69 7a 65 20 69 6e 20 65 61 63  ects size in eac
f1b0: 68 20 64 69 6d 65 6e 73 69 6f 6e 2e 0a 2a 2f 0a  h dimension..*/.
f1c0: 73 74 61 74 69 63 20 52 74 72 65 65 44 56 61 6c  static RtreeDVal
f1d0: 75 65 20 63 65 6c 6c 4d 61 72 67 69 6e 28 52 74  ue cellMargin(Rt
f1e0: 72 65 65 20 2a 70 52 74 72 65 65 2c 20 52 74 72  ree *pRtree, Rtr
f1f0: 65 65 43 65 6c 6c 20 2a 70 29 7b 0a 20 20 52 74  eeCell *p){.  Rt
f200: 72 65 65 44 56 61 6c 75 65 20 6d 61 72 67 69 6e  reeDValue margin
f210: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 69 20 3d   = 0;.  int ii =
f220: 20 70 52 74 72 65 65 2d 3e 6e 44 69 6d 32 20 2d   pRtree->nDim2 -
f230: 20 32 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 6d 61   2;.  do{.    ma
f240: 72 67 69 6e 20 2b 3d 20 28 44 43 4f 4f 52 44 28  rgin += (DCOORD(
f250: 70 2d 3e 61 43 6f 6f 72 64 5b 69 69 2b 31 5d 29  p->aCoord[ii+1])
f260: 20 2d 20 44 43 4f 4f 52 44 28 70 2d 3e 61 43 6f   - DCOORD(p->aCo
f270: 6f 72 64 5b 69 69 5d 29 29 3b 0a 20 20 20 20 69  ord[ii]));.    i
f280: 69 20 2d 3d 20 32 3b 0a 20 20 7d 77 68 69 6c 65  i -= 2;.  }while
f290: 28 20 69 69 3e 3d 30 20 29 3b 0a 20 20 72 65 74  ( ii>=0 );.  ret
f2a0: 75 72 6e 20 6d 61 72 67 69 6e 3b 0a 7d 0a 0a 2f  urn margin;.}../
f2b0: 2a 0a 2a 2a 20 53 74 6f 72 65 20 74 68 65 20 75  *.** Store the u
f2c0: 6e 69 6f 6e 20 6f 66 20 63 65 6c 6c 73 20 70 31  nion of cells p1
f2d0: 20 61 6e 64 20 70 32 20 69 6e 20 70 31 2e 0a 2a   and p2 in p1..*
f2e0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 65  /.static void ce
f2f0: 6c 6c 55 6e 69 6f 6e 28 52 74 72 65 65 20 2a 70  llUnion(Rtree *p
f300: 52 74 72 65 65 2c 20 52 74 72 65 65 43 65 6c 6c  Rtree, RtreeCell
f310: 20 2a 70 31 2c 20 52 74 72 65 65 43 65 6c 6c 20   *p1, RtreeCell 
f320: 2a 70 32 29 7b 0a 20 20 69 6e 74 20 69 69 20 3d  *p2){.  int ii =
f330: 20 30 3b 0a 20 20 69 66 28 20 70 52 74 72 65 65   0;.  if( pRtree
f340: 2d 3e 65 43 6f 6f 72 64 54 79 70 65 3d 3d 52 54  ->eCoordType==RT
f350: 52 45 45 5f 43 4f 4f 52 44 5f 52 45 41 4c 33 32  REE_COORD_REAL32
f360: 20 29 7b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20   ){.    do{.    
f370: 20 20 70 31 2d 3e 61 43 6f 6f 72 64 5b 69 69 5d    p1->aCoord[ii]
f380: 2e 66 20 3d 20 4d 49 4e 28 70 31 2d 3e 61 43 6f  .f = MIN(p1->aCo
f390: 6f 72 64 5b 69 69 5d 2e 66 2c 20 70 32 2d 3e 61  ord[ii].f, p2->a
f3a0: 43 6f 6f 72 64 5b 69 69 5d 2e 66 29 3b 0a 20 20  Coord[ii].f);.  
f3b0: 20 20 20 20 70 31 2d 3e 61 43 6f 6f 72 64 5b 69      p1->aCoord[i
f3c0: 69 2b 31 5d 2e 66 20 3d 20 4d 41 58 28 70 31 2d  i+1].f = MAX(p1-
f3d0: 3e 61 43 6f 6f 72 64 5b 69 69 2b 31 5d 2e 66 2c  >aCoord[ii+1].f,
f3e0: 20 70 32 2d 3e 61 43 6f 6f 72 64 5b 69 69 2b 31   p2->aCoord[ii+1
f3f0: 5d 2e 66 29 3b 0a 20 20 20 20 20 20 69 69 20 2b  ].f);.      ii +
f400: 3d 20 32 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  = 2;.    }while(
f410: 20 69 69 3c 70 52 74 72 65 65 2d 3e 6e 44 69 6d   ii<pRtree->nDim
f420: 32 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  2 );.  }else{.  
f430: 20 20 64 6f 7b 0a 20 20 20 20 20 20 70 31 2d 3e    do{.      p1->
f440: 61 43 6f 6f 72 64 5b 69 69 5d 2e 69 20 3d 20 4d  aCoord[ii].i = M
f450: 49 4e 28 70 31 2d 3e 61 43 6f 6f 72 64 5b 69 69  IN(p1->aCoord[ii
f460: 5d 2e 69 2c 20 70 32 2d 3e 61 43 6f 6f 72 64 5b  ].i, p2->aCoord[
f470: 69 69 5d 2e 69 29 3b 0a 20 20 20 20 20 20 70 31  ii].i);.      p1
f480: 2d 3e 61 43 6f 6f 72 64 5b 69 69 2b 31 5d 2e 69  ->aCoord[ii+1].i
f490: 20 3d 20 4d 41 58 28 70 31 2d 3e 61 43 6f 6f 72   = MAX(p1->aCoor
f4a0: 64 5b 69 69 2b 31 5d 2e 69 2c 20 70 32 2d 3e 61  d[ii+1].i, p2->a
f4b0: 43 6f 6f 72 64 5b 69 69 2b 31 5d 2e 69 29 3b 0a  Coord[ii+1].i);.
f4c0: 20 20 20 20 20 20 69 69 20 2b 3d 20 32 3b 0a 20        ii += 2;. 
f4d0: 20 20 20 7d 77 68 69 6c 65 28 20 69 69 3c 70 52     }while( ii<pR
f4e0: 74 72 65 65 2d 3e 6e 44 69 6d 32 20 29 3b 0a 20  tree->nDim2 );. 
f4f0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
f500: 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 61  rn true if the a
f510: 72 65 61 20 63 6f 76 65 72 65 64 20 62 79 20 70  rea covered by p
f520: 32 20 69 73 20 61 20 73 75 62 73 65 74 20 6f 66  2 is a subset of
f530: 20 74 68 65 20 61 72 65 61 20 63 6f 76 65 72 65   the area covere
f540: 64 0a 2a 2a 20 62 79 20 70 31 2e 20 46 61 6c 73  d.** by p1. Fals
f550: 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
f560: 73 74 61 74 69 63 20 69 6e 74 20 63 65 6c 6c 43  static int cellC
f570: 6f 6e 74 61 69 6e 73 28 52 74 72 65 65 20 2a 70  ontains(Rtree *p
f580: 52 74 72 65 65 2c 20 52 74 72 65 65 43 65 6c 6c  Rtree, RtreeCell
f590: 20 2a 70 31 2c 20 52 74 72 65 65 43 65 6c 6c 20   *p1, RtreeCell 
f5a0: 2a 70 32 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a  *p2){.  int ii;.
f5b0: 20 20 69 6e 74 20 69 73 49 6e 74 20 3d 20 28 70    int isInt = (p
f5c0: 52 74 72 65 65 2d 3e 65 43 6f 6f 72 64 54 79 70  Rtree->eCoordTyp
f5d0: 65 3d 3d 52 54 52 45 45 5f 43 4f 4f 52 44 5f 49  e==RTREE_COORD_I
f5e0: 4e 54 33 32 29 3b 0a 20 20 66 6f 72 28 69 69 3d  NT32);.  for(ii=
f5f0: 30 3b 20 69 69 3c 70 52 74 72 65 65 2d 3e 6e 44  0; ii<pRtree->nD
f600: 69 6d 32 3b 20 69 69 2b 3d 32 29 7b 0a 20 20 20  im2; ii+=2){.   
f610: 20 52 74 72 65 65 43 6f 6f 72 64 20 2a 61 31 20   RtreeCoord *a1 
f620: 3d 20 26 70 31 2d 3e 61 43 6f 6f 72 64 5b 69 69  = &p1->aCoord[ii
f630: 5d 3b 0a 20 20 20 20 52 74 72 65 65 43 6f 6f 72  ];.    RtreeCoor
f640: 64 20 2a 61 32 20 3d 20 26 70 32 2d 3e 61 43 6f  d *a2 = &p2->aCo
f650: 6f 72 64 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28  ord[ii];.    if(
f660: 20 28 21 69 73 49 6e 74 20 26 26 20 28 61 32 5b   (!isInt && (a2[
f670: 30 5d 2e 66 3c 61 31 5b 30 5d 2e 66 20 7c 7c 20  0].f<a1[0].f || 
f680: 61 32 5b 31 5d 2e 66 3e 61 31 5b 31 5d 2e 66 29  a2[1].f>a1[1].f)
f690: 29 20 0a 20 20 20 20 20 7c 7c 20 28 20 69 73 49  ) .     || ( isI
f6a0: 6e 74 20 26 26 20 28 61 32 5b 30 5d 2e 69 3c 61  nt && (a2[0].i<a
f6b0: 31 5b 30 5d 2e 69 20 7c 7c 20 61 32 5b 31 5d 2e  1[0].i || a2[1].
f6c0: 69 3e 61 31 5b 31 5d 2e 69 29 29 20 0a 20 20 20  i>a1[1].i)) .   
f6d0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
f6e0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
f6f0: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a  return 1;.}../*.
f700: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d  ** Return the am
f710: 6f 75 6e 74 20 63 65 6c 6c 20 70 20 77 6f 75 6c  ount cell p woul
f720: 64 20 67 72 6f 77 20 62 79 20 69 66 20 69 74 20  d grow by if it 
f730: 77 65 72 65 20 75 6e 69 6f 6e 65 64 20 77 69 74  were unioned wit
f740: 68 20 70 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  h pCell..*/.stat
f750: 69 63 20 52 74 72 65 65 44 56 61 6c 75 65 20 63  ic RtreeDValue c
f760: 65 6c 6c 47 72 6f 77 74 68 28 52 74 72 65 65 20  ellGrowth(Rtree 
f770: 2a 70 52 74 72 65 65 2c 20 52 74 72 65 65 43 65  *pRtree, RtreeCe
f780: 6c 6c 20 2a 70 2c 20 52 74 72 65 65 43 65 6c 6c  ll *p, RtreeCell
f790: 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 52 74 72 65   *pCell){.  Rtre
f7a0: 65 44 56 61 6c 75 65 20 61 72 65 61 3b 0a 20 20  eDValue area;.  
f7b0: 52 74 72 65 65 43 65 6c 6c 20 63 65 6c 6c 3b 0a  RtreeCell cell;.
f7c0: 20 20 6d 65 6d 63 70 79 28 26 63 65 6c 6c 2c 20    memcpy(&cell, 
f7d0: 70 2c 20 73 69 7a 65 6f 66 28 52 74 72 65 65 43  p, sizeof(RtreeC
f7e0: 65 6c 6c 29 29 3b 0a 20 20 61 72 65 61 20 3d 20  ell));.  area = 
f7f0: 63 65 6c 6c 41 72 65 61 28 70 52 74 72 65 65 2c  cellArea(pRtree,
f800: 20 26 63 65 6c 6c 29 3b 0a 20 20 63 65 6c 6c 55   &cell);.  cellU
f810: 6e 69 6f 6e 28 70 52 74 72 65 65 2c 20 26 63 65  nion(pRtree, &ce
f820: 6c 6c 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 72 65  ll, pCell);.  re
f830: 74 75 72 6e 20 28 63 65 6c 6c 41 72 65 61 28 70  turn (cellArea(p
f840: 52 74 72 65 65 2c 20 26 63 65 6c 6c 29 2d 61 72  Rtree, &cell)-ar
f850: 65 61 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 52  ea);.}..static R
f860: 74 72 65 65 44 56 61 6c 75 65 20 63 65 6c 6c 4f  treeDValue cellO
f870: 76 65 72 6c 61 70 28 0a 20 20 52 74 72 65 65 20  verlap(.  Rtree 
f880: 2a 70 52 74 72 65 65 2c 20 0a 20 20 52 74 72 65  *pRtree, .  Rtre
f890: 65 43 65 6c 6c 20 2a 70 2c 20 0a 20 20 52 74 72  eCell *p, .  Rtr
f8a0: 65 65 43 65 6c 6c 20 2a 61 43 65 6c 6c 2c 20 0a  eeCell *aCell, .
f8b0: 20 20 69 6e 74 20 6e 43 65 6c 6c 0a 29 7b 0a 20    int nCell.){. 
f8c0: 20 69 6e 74 20 69 69 3b 0a 20 20 52 74 72 65 65   int ii;.  Rtree
f8d0: 44 56 61 6c 75 65 20 6f 76 65 72 6c 61 70 20 3d  DValue overlap =
f8e0: 20 52 54 52 45 45 5f 5a 45 52 4f 3b 0a 20 20 66   RTREE_ZERO;.  f
f8f0: 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 43 65 6c  or(ii=0; ii<nCel
f900: 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  l; ii++){.    in
f910: 74 20 6a 6a 3b 0a 20 20 20 20 52 74 72 65 65 44  t jj;.    RtreeD
f920: 56 61 6c 75 65 20 6f 20 3d 20 28 52 74 72 65 65  Value o = (Rtree
f930: 44 56 61 6c 75 65 29 31 3b 0a 20 20 20 20 66 6f  DValue)1;.    fo
f940: 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 52 74 72 65  r(jj=0; jj<pRtre
f950: 65 2d 3e 6e 44 69 6d 32 3b 20 6a 6a 2b 3d 32 29  e->nDim2; jj+=2)
f960: 7b 0a 20 20 20 20 20 20 52 74 72 65 65 44 56 61  {.      RtreeDVa
f970: 6c 75 65 20 78 31 2c 20 78 32 3b 0a 20 20 20 20  lue x1, x2;.    
f980: 20 20 78 31 20 3d 20 4d 41 58 28 44 43 4f 4f 52    x1 = MAX(DCOOR
f990: 44 28 70 2d 3e 61 43 6f 6f 72 64 5b 6a 6a 5d 29  D(p->aCoord[jj])
f9a0: 2c 20 44 43 4f 4f 52 44 28 61 43 65 6c 6c 5b 69  , DCOORD(aCell[i
f9b0: 69 5d 2e 61 43 6f 6f 72 64 5b 6a 6a 5d 29 29 3b  i].aCoord[jj]));
f9c0: 0a 20 20 20 20 20 20 78 32 20 3d 20 4d 49 4e 28  .      x2 = MIN(
f9d0: 44 43 4f 4f 52 44 28 70 2d 3e 61 43 6f 6f 72 64  DCOORD(p->aCoord
f9e0: 5b 6a 6a 2b 31 5d 29 2c 20 44 43 4f 4f 52 44 28  [jj+1]), DCOORD(
f9f0: 61 43 65 6c 6c 5b 69 69 5d 2e 61 43 6f 6f 72 64  aCell[ii].aCoord
fa00: 5b 6a 6a 2b 31 5d 29 29 3b 0a 20 20 20 20 20 20  [jj+1]));.      
fa10: 69 66 28 20 78 32 3c 78 31 20 29 7b 0a 20 20 20  if( x2<x1 ){.   
fa20: 20 20 20 20 20 6f 20 3d 20 28 52 74 72 65 65 44       o = (RtreeD
fa30: 56 61 6c 75 65 29 30 3b 0a 20 20 20 20 20 20 20  Value)0;.       
fa40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65   break;.      }e
fa50: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6f 20 3d  lse{.        o =
fa60: 20 6f 20 2a 20 28 78 32 2d 78 31 29 3b 0a 20 20   o * (x2-x1);.  
fa70: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
fa80: 6f 76 65 72 6c 61 70 20 2b 3d 20 6f 3b 0a 20 20  overlap += o;.  
fa90: 7d 0a 20 20 72 65 74 75 72 6e 20 6f 76 65 72 6c  }.  return overl
faa0: 61 70 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  ap;.}.../*.** Th
fab0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c  is function impl
fac0: 65 6d 65 6e 74 73 20 74 68 65 20 43 68 6f 6f 73  ements the Choos
fad0: 65 4c 65 61 66 20 61 6c 67 6f 72 69 74 68 6d 20  eLeaf algorithm 
fae0: 66 72 6f 6d 20 47 75 74 6d 61 6e 5b 38 34 5d 2e  from Gutman[84].
faf0: 0a 2a 2a 20 43 68 6f 6f 73 65 53 75 62 54 72 65  .** ChooseSubTre
fb00: 65 20 69 6e 20 72 2a 74 72 65 65 20 74 65 72 6d  e in r*tree term
fb10: 69 6e 6f 6c 6f 67 79 2e 0a 2a 2f 0a 73 74 61 74  inology..*/.stat
fb20: 69 63 20 69 6e 74 20 43 68 6f 6f 73 65 4c 65 61  ic int ChooseLea
fb30: 66 28 0a 20 20 52 74 72 65 65 20 2a 70 52 74 72  f(.  Rtree *pRtr
fb40: 65 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ee,             
fb50: 20 20 2f 2a 20 52 74 72 65 65 20 74 61 62 6c 65    /* Rtree table
fb60: 20 2a 2f 0a 20 20 52 74 72 65 65 43 65 6c 6c 20   */.  RtreeCell 
fb70: 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
fb80: 20 20 20 2f 2a 20 43 65 6c 6c 20 74 6f 20 69 6e     /* Cell to in
fb90: 73 65 72 74 20 69 6e 74 6f 20 72 74 72 65 65 20  sert into rtree 
fba0: 2a 2f 0a 20 20 69 6e 74 20 69 48 65 69 67 68 74  */.  int iHeight
fbb0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
fbc0: 20 20 2f 2a 20 48 65 69 67 68 74 20 6f 66 20 73    /* Height of s
fbd0: 75 62 2d 74 72 65 65 20 72 6f 6f 74 65 64 20 61  ub-tree rooted a
fbe0: 74 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 52 74 72  t pCell */.  Rtr
fbf0: 65 65 4e 6f 64 65 20 2a 2a 70 70 4c 65 61 66 20  eeNode **ppLeaf 
fc00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
fc10: 3a 20 53 65 6c 65 63 74 65 64 20 6c 65 61 66 20  : Selected leaf 
fc20: 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  page */.){.  int
fc30: 20 72 63 3b 0a 20 20 69 6e 74 20 69 69 3b 0a 20   rc;.  int ii;. 
fc40: 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 4e 6f 64   RtreeNode *pNod
fc50: 65 3b 0a 20 20 72 63 20 3d 20 6e 6f 64 65 41 63  e;.  rc = nodeAc
fc60: 71 75 69 72 65 28 70 52 74 72 65 65 2c 20 31 2c  quire(pRtree, 1,
fc70: 20 30 2c 20 26 70 4e 6f 64 65 29 3b 0a 0a 20 20   0, &pNode);..  
fc80: 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51  for(ii=0; rc==SQ
fc90: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 28 70  LITE_OK && ii<(p
fca0: 52 74 72 65 65 2d 3e 69 44 65 70 74 68 2d 69 48  Rtree->iDepth-iH
fcb0: 65 69 67 68 74 29 3b 20 69 69 2b 2b 29 7b 0a 20  eight); ii++){. 
fcc0: 20 20 20 69 6e 74 20 69 43 65 6c 6c 3b 0a 20 20     int iCell;.  
fcd0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
fce0: 69 42 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20  iBest = 0;..    
fcf0: 52 74 72 65 65 44 56 61 6c 75 65 20 66 4d 69 6e  RtreeDValue fMin
fd00: 47 72 6f 77 74 68 20 3d 20 52 54 52 45 45 5f 5a  Growth = RTREE_Z
fd10: 45 52 4f 3b 0a 20 20 20 20 52 74 72 65 65 44 56  ERO;.    RtreeDV
fd20: 61 6c 75 65 20 66 4d 69 6e 41 72 65 61 20 3d 20  alue fMinArea = 
fd30: 52 54 52 45 45 5f 5a 45 52 4f 3b 0a 0a 20 20 20  RTREE_ZERO;..   
fd40: 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 4e 43 45   int nCell = NCE
fd50: 4c 4c 28 70 4e 6f 64 65 29 3b 0a 20 20 20 20 52  LL(pNode);.    R
fd60: 74 72 65 65 43 65 6c 6c 20 63 65 6c 6c 3b 0a 20  treeCell cell;. 
fd70: 20 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 43     RtreeNode *pC
fd80: 68 69 6c 64 3b 0a 0a 20 20 20 20 52 74 72 65 65  hild;..    Rtree
fd90: 43 65 6c 6c 20 2a 61 43 65 6c 6c 20 3d 20 30 3b  Cell *aCell = 0;
fda0: 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20  ..    /* Select 
fdb0: 74 68 65 20 63 68 69 6c 64 20 6e 6f 64 65 20 77  the child node w
fdc0: 68 69 63 68 20 77 69 6c 6c 20 62 65 20 65 6e 6c  hich will be enl
fdd0: 61 72 67 65 64 20 74 68 65 20 6c 65 61 73 74 20  arged the least 
fde0: 69 66 20 70 43 65 6c 6c 0a 20 20 20 20 2a 2a 20  if pCell.    ** 
fdf0: 69 73 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  is inserted into
fe00: 20 69 74 2e 20 52 65 73 6f 6c 76 65 20 74 69 65   it. Resolve tie
fe10: 73 20 62 79 20 63 68 6f 6f 73 69 6e 67 20 74 68  s by choosing th
fe20: 65 20 65 6e 74 72 79 20 77 69 74 68 0a 20 20 20  e entry with.   
fe30: 20 2a 2a 20 74 68 65 20 73 6d 61 6c 6c 65 73 74   ** the smallest
fe40: 20 61 72 65 61 2e 0a 20 20 20 20 2a 2f 0a 20 20   area..    */.  
fe50: 20 20 66 6f 72 28 69 43 65 6c 6c 3d 30 3b 20 69    for(iCell=0; i
fe60: 43 65 6c 6c 3c 6e 43 65 6c 6c 3b 20 69 43 65 6c  Cell<nCell; iCel
fe70: 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  l++){.      int 
fe80: 62 42 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  bBest = 0;.     
fe90: 20 52 74 72 65 65 44 56 61 6c 75 65 20 67 72 6f   RtreeDValue gro
fea0: 77 74 68 3b 0a 20 20 20 20 20 20 52 74 72 65 65  wth;.      Rtree
feb0: 44 56 61 6c 75 65 20 61 72 65 61 3b 0a 20 20 20  DValue area;.   
fec0: 20 20 20 6e 6f 64 65 47 65 74 43 65 6c 6c 28 70     nodeGetCell(p
fed0: 52 74 72 65 65 2c 20 70 4e 6f 64 65 2c 20 69 43  Rtree, pNode, iC
fee0: 65 6c 6c 2c 20 26 63 65 6c 6c 29 3b 0a 20 20 20  ell, &cell);.   
fef0: 20 20 20 67 72 6f 77 74 68 20 3d 20 63 65 6c 6c     growth = cell
ff00: 47 72 6f 77 74 68 28 70 52 74 72 65 65 2c 20 26  Growth(pRtree, &
ff10: 63 65 6c 6c 2c 20 70 43 65 6c 6c 29 3b 0a 20 20  cell, pCell);.  
ff20: 20 20 20 20 61 72 65 61 20 3d 20 63 65 6c 6c 41      area = cellA
ff30: 72 65 61 28 70 52 74 72 65 65 2c 20 26 63 65 6c  rea(pRtree, &cel
ff40: 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43  l);.      if( iC
ff50: 65 6c 6c 3d 3d 30 7c 7c 67 72 6f 77 74 68 3c 66  ell==0||growth<f
ff60: 4d 69 6e 47 72 6f 77 74 68 7c 7c 28 67 72 6f 77  MinGrowth||(grow
ff70: 74 68 3d 3d 66 4d 69 6e 47 72 6f 77 74 68 20 26  th==fMinGrowth &
ff80: 26 20 61 72 65 61 3c 66 4d 69 6e 41 72 65 61 29  & area<fMinArea)
ff90: 20 29 7b 0a 20 20 20 20 20 20 20 20 62 42 65 73   ){.        bBes
ffa0: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 1;.      }. 
ffb0: 20 20 20 20 20 69 66 28 20 62 42 65 73 74 20 29       if( bBest )
ffc0: 7b 0a 20 20 20 20 20 20 20 20 66 4d 69 6e 47 72  {.        fMinGr
ffd0: 6f 77 74 68 20 3d 20 67 72 6f 77 74 68 3b 0a 20  owth = growth;. 
ffe0: 20 20 20 20 20 20 20 66 4d 69 6e 41 72 65 61 20         fMinArea 
fff0: 3d 20 61 72 65 61 3b 0a 20 20 20 20 20 20 20 20  = area;.        
10000 69 42 65 73 74 20 3d 20 63 65 6c 6c 2e 69 52 6f  iBest = cell.iRo
10010 77 69 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  wid;.      }.   
10020 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   }..    sqlite3_
10030 66 72 65 65 28 61 43 65 6c 6c 29 3b 0a 20 20 20  free(aCell);.   
10040 20 72 63 20 3d 20 6e 6f 64 65 41 63 71 75 69 72   rc = nodeAcquir
10050 65 28 70 52 74 72 65 65 2c 20 69 42 65 73 74 2c  e(pRtree, iBest,
10060 20 70 4e 6f 64 65 2c 20 26 70 43 68 69 6c 64 29   pNode, &pChild)
10070 3b 0a 20 20 20 20 6e 6f 64 65 52 65 6c 65 61 73  ;.    nodeReleas
10080 65 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65 29  e(pRtree, pNode)
10090 3b 0a 20 20 20 20 70 4e 6f 64 65 20 3d 20 70 43  ;.    pNode = pC
100a0 68 69 6c 64 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70  hild;.  }..  *pp
100b0 4c 65 61 66 20 3d 20 70 4e 6f 64 65 3b 0a 20 20  Leaf = pNode;.  
100c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
100d0 0a 2a 2a 20 41 20 63 65 6c 6c 20 77 69 74 68 20  .** A cell with 
100e0 74 68 65 20 73 61 6d 65 20 63 6f 6e 74 65 6e 74  the same content
100f0 20 61 73 20 70 43 65 6c 6c 20 68 61 73 20 6a 75   as pCell has ju
10100 73 74 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64  st been inserted
10110 20 69 6e 74 6f 0a 2a 2a 20 74 68 65 20 6e 6f 64   into.** the nod
10120 65 20 70 4e 6f 64 65 2e 20 54 68 69 73 20 66 75  e pNode. This fu
10130 6e 63 74 69 6f 6e 20 75 70 64 61 74 65 73 20 74  nction updates t
10140 68 65 20 62 6f 75 6e 64 69 6e 67 20 62 6f 78 20  he bounding box 
10150 63 65 6c 6c 73 20 69 6e 0a 2a 2a 20 61 6c 6c 20  cells in.** all 
10160 61 6e 63 65 73 74 6f 72 20 65 6c 65 6d 65 6e 74  ancestor element
10170 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
10180 20 41 64 6a 75 73 74 54 72 65 65 28 0a 20 20 52   AdjustTree(.  R
10190 74 72 65 65 20 2a 70 52 74 72 65 65 2c 20 20 20  tree *pRtree,   
101a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101b0 20 2f 2a 20 52 74 72 65 65 20 74 61 62 6c 65 20   /* Rtree table 
101c0 2a 2f 0a 20 20 52 74 72 65 65 4e 6f 64 65 20 2a  */.  RtreeNode *
101d0 70 4e 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20  pNode,          
101e0 20 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74         /* Adjust
101f0 20 61 6e 63 65 73 74 72 79 20 6f 66 20 74 68 69   ancestry of thi
10200 73 20 6e 6f 64 65 2e 20 2a 2f 0a 20 20 52 74 72  s node. */.  Rtr
10210 65 65 43 65 6c 6c 20 2a 70 43 65 6c 6c 20 20 20  eeCell *pCell   
10220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10230 2a 20 54 68 69 73 20 63 65 6c 6c 20 77 61 73 20  * This cell was 
10240 6a 75 73 74 20 69 6e 73 65 72 74 65 64 20 2a 2f  just inserted */
10250 0a 29 7b 0a 20 20 52 74 72 65 65 4e 6f 64 65 20  .){.  RtreeNode 
10260 2a 70 20 3d 20 70 4e 6f 64 65 3b 0a 20 20 77 68  *p = pNode;.  wh
10270 69 6c 65 28 20 70 2d 3e 70 50 61 72 65 6e 74 20  ile( p->pParent 
10280 29 7b 0a 20 20 20 20 52 74 72 65 65 4e 6f 64 65  ){.    RtreeNode
10290 20 2a 70 50 61 72 65 6e 74 20 3d 20 70 2d 3e 70   *pParent = p->p
102a0 50 61 72 65 6e 74 3b 0a 20 20 20 20 52 74 72 65  Parent;.    Rtre
102b0 65 43 65 6c 6c 20 63 65 6c 6c 3b 0a 20 20 20 20  eCell cell;.    
102c0 69 6e 74 20 69 43 65 6c 6c 3b 0a 0a 20 20 20 20  int iCell;..    
102d0 69 66 28 20 6e 6f 64 65 50 61 72 65 6e 74 49 6e  if( nodeParentIn
102e0 64 65 78 28 70 52 74 72 65 65 2c 20 70 2c 20 26  dex(pRtree, p, &
102f0 69 43 65 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20  iCell) ){.      
10300 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
10310 52 52 55 50 54 5f 56 54 41 42 3b 0a 20 20 20 20  RRUPT_VTAB;.    
10320 7d 0a 0a 20 20 20 20 6e 6f 64 65 47 65 74 43 65  }..    nodeGetCe
10330 6c 6c 28 70 52 74 72 65 65 2c 20 70 50 61 72 65  ll(pRtree, pPare
10340 6e 74 2c 20 69 43 65 6c 6c 2c 20 26 63 65 6c 6c  nt, iCell, &cell
10350 29 3b 0a 20 20 20 20 69 66 28 20 21 63 65 6c 6c  );.    if( !cell
10360 43 6f 6e 74 61 69 6e 73 28 70 52 74 72 65 65 2c  Contains(pRtree,
10370 20 26 63 65 6c 6c 2c 20 70 43 65 6c 6c 29 20 29   &cell, pCell) )
10380 7b 0a 20 20 20 20 20 20 63 65 6c 6c 55 6e 69 6f  {.      cellUnio
10390 6e 28 70 52 74 72 65 65 2c 20 26 63 65 6c 6c 2c  n(pRtree, &cell,
103a0 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 6e   pCell);.      n
103b0 6f 64 65 4f 76 65 72 77 72 69 74 65 43 65 6c 6c  odeOverwriteCell
103c0 28 70 52 74 72 65 65 2c 20 70 50 61 72 65 6e 74  (pRtree, pParent
103d0 2c 20 26 63 65 6c 6c 2c 20 69 43 65 6c 6c 29 3b  , &cell, iCell);
103e0 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 70 20 3d  .    }. .    p =
103f0 20 70 50 61 72 65 6e 74 3b 0a 20 20 7d 0a 20 20   pParent;.  }.  
10400 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10410 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
10420 20 6d 61 70 70 69 6e 67 20 28 69 52 6f 77 69 64   mapping (iRowid
10430 2d 3e 69 4e 6f 64 65 29 20 74 6f 20 74 68 65 20  ->iNode) to the 
10440 3c 72 74 72 65 65 3e 5f 72 6f 77 69 64 20 74 61  <rtree>_rowid ta
10450 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
10460 6e 74 20 72 6f 77 69 64 57 72 69 74 65 28 52 74  nt rowidWrite(Rt
10470 72 65 65 20 2a 70 52 74 72 65 65 2c 20 73 71 6c  ree *pRtree, sql
10480 69 74 65 33 5f 69 6e 74 36 34 20 69 52 6f 77 69  ite3_int64 iRowi
10490 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  d, sqlite3_int64
104a0 20 69 4e 6f 64 65 29 7b 0a 20 20 73 71 6c 69 74   iNode){.  sqlit
104b0 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 52  e3_bind_int64(pR
104c0 74 72 65 65 2d 3e 70 57 72 69 74 65 52 6f 77 69  tree->pWriteRowi
104d0 64 2c 20 31 2c 20 69 52 6f 77 69 64 29 3b 0a 20  d, 1, iRowid);. 
104e0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
104f0 74 36 34 28 70 52 74 72 65 65 2d 3e 70 57 72 69  t64(pRtree->pWri
10500 74 65 52 6f 77 69 64 2c 20 32 2c 20 69 4e 6f 64  teRowid, 2, iNod
10510 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  e);.  sqlite3_st
10520 65 70 28 70 52 74 72 65 65 2d 3e 70 57 72 69 74  ep(pRtree->pWrit
10530 65 52 6f 77 69 64 29 3b 0a 20 20 72 65 74 75 72  eRowid);.  retur
10540 6e 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  n sqlite3_reset(
10550 70 52 74 72 65 65 2d 3e 70 57 72 69 74 65 52 6f  pRtree->pWriteRo
10560 77 69 64 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  wid);.}../*.** W
10570 72 69 74 65 20 6d 61 70 70 69 6e 67 20 28 69 4e  rite mapping (iN
10580 6f 64 65 2d 3e 69 50 61 72 29 20 74 6f 20 74 68  ode->iPar) to th
10590 65 20 3c 72 74 72 65 65 3e 5f 70 61 72 65 6e 74  e <rtree>_parent
105a0 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
105b0 63 20 69 6e 74 20 70 61 72 65 6e 74 57 72 69 74  c int parentWrit
105c0 65 28 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c  e(Rtree *pRtree,
105d0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
105e0 4e 6f 64 65 2c 20 73 71 6c 69 74 65 33 5f 69 6e  Node, sqlite3_in
105f0 74 36 34 20 69 50 61 72 29 7b 0a 20 20 73 71 6c  t64 iPar){.  sql
10600 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
10610 70 52 74 72 65 65 2d 3e 70 57 72 69 74 65 50 61  pRtree->pWritePa
10620 72 65 6e 74 2c 20 31 2c 20 69 4e 6f 64 65 29 3b  rent, 1, iNode);
10630 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  .  sqlite3_bind_
10640 69 6e 74 36 34 28 70 52 74 72 65 65 2d 3e 70 57  int64(pRtree->pW
10650 72 69 74 65 50 61 72 65 6e 74 2c 20 32 2c 20 69  riteParent, 2, i
10660 50 61 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Par);.  sqlite3_
10670 73 74 65 70 28 70 52 74 72 65 65 2d 3e 70 57 72  step(pRtree->pWr
10680 69 74 65 50 61 72 65 6e 74 29 3b 0a 20 20 72 65  iteParent);.  re
10690 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 72 65 73  turn sqlite3_res
106a0 65 74 28 70 52 74 72 65 65 2d 3e 70 57 72 69 74  et(pRtree->pWrit
106b0 65 50 61 72 65 6e 74 29 3b 0a 7d 0a 0a 73 74 61  eParent);.}..sta
106c0 74 69 63 20 69 6e 74 20 72 74 72 65 65 49 6e 73  tic int rtreeIns
106d0 65 72 74 43 65 6c 6c 28 52 74 72 65 65 20 2a 2c  ertCell(Rtree *,
106e0 20 52 74 72 65 65 4e 6f 64 65 20 2a 2c 20 52 74   RtreeNode *, Rt
106f0 72 65 65 43 65 6c 6c 20 2a 2c 20 69 6e 74 29 3b  reeCell *, int);
10700 0a 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  .../*.** Argumen
10710 74 73 20 61 49 64 78 2c 20 61 44 69 73 74 61 6e  ts aIdx, aDistan
10720 63 65 20 61 6e 64 20 61 53 70 61 72 65 20 61 6c  ce and aSpare al
10730 6c 20 70 6f 69 6e 74 20 74 6f 20 61 72 72 61 79  l point to array
10740 73 20 6f 66 20 73 69 7a 65 0a 2a 2a 20 6e 49 64  s of size.** nId
10750 78 2e 20 54 68 65 20 61 49 64 78 20 61 72 72 61  x. The aIdx arra
10760 79 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73  y contains the s
10770 65 74 20 6f 66 20 69 6e 74 65 67 65 72 73 20 66  et of integers f
10780 72 6f 6d 20 30 20 74 6f 20 0a 2a 2a 20 28 6e 49  rom 0 to .** (nI
10790 64 78 2d 31 29 20 69 6e 20 6e 6f 20 70 61 72 74  dx-1) in no part
107a0 69 63 75 6c 61 72 20 6f 72 64 65 72 2e 20 54 68  icular order. Th
107b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 6f 72 74  is function sort
107c0 73 20 74 68 65 20 76 61 6c 75 65 73 0a 2a 2a 20  s the values.** 
107d0 69 6e 20 61 49 64 78 20 61 63 63 6f 72 64 69 6e  in aIdx accordin
107e0 67 20 74 6f 20 74 68 65 20 69 6e 64 65 78 65 64  g to the indexed
107f0 20 76 61 6c 75 65 73 20 69 6e 20 61 44 69 73 74   values in aDist
10800 61 6e 63 65 2e 20 46 6f 72 0a 2a 2a 20 65 78 61  ance. For.** exa
10810 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20 74  mple, assuming t
10820 68 65 20 69 6e 70 75 74 73 3a 0a 2a 2a 0a 2a 2a  he inputs:.**.**
10830 20 20 20 61 49 64 78 20 20 20 20 20 20 3d 20 7b     aIdx      = {
10840 20 30 2c 20 20 20 31 2c 20 20 20 32 2c 20 20 20   0,   1,   2,   
10850 33 20 7d 0a 2a 2a 20 20 20 61 44 69 73 74 61 6e  3 }.**   aDistan
10860 63 65 20 3d 20 7b 20 35 2e 30 2c 20 32 2e 30 2c  ce = { 5.0, 2.0,
10870 20 37 2e 30 2c 20 36 2e 30 20 7d 0a 2a 2a 0a 2a   7.0, 6.0 }.**.*
10880 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
10890 73 65 74 73 20 74 68 65 20 61 49 64 78 20 61 72  sets the aIdx ar
108a0 72 61 79 20 74 6f 20 63 6f 6e 74 61 69 6e 3a 0a  ray to contain:.
108b0 2a 2a 0a 2a 2a 20 20 20 61 49 64 78 20 20 20 20  **.**   aIdx    
108c0 20 20 3d 20 7b 20 30 2c 20 20 20 31 2c 20 20 20    = { 0,   1,   
108d0 32 2c 20 20 20 33 20 7d 0a 2a 2a 0a 2a 2a 20 54  2,   3 }.**.** T
108e0 68 65 20 61 53 70 61 72 65 20 61 72 72 61 79 20  he aSpare array 
108f0 69 73 20 75 73 65 64 20 61 73 20 74 65 6d 70 6f  is used as tempo
10900 72 61 72 79 20 77 6f 72 6b 69 6e 67 20 73 70 61  rary working spa
10910 63 65 20 62 79 20 74 68 65 0a 2a 2a 20 73 6f 72  ce by the.** sor
10920 74 69 6e 67 20 61 6c 67 6f 72 69 74 68 6d 2e 0a  ting algorithm..
10930 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53  */.static void S
10940 6f 72 74 42 79 44 69 73 74 61 6e 63 65 28 0a 20  ortByDistance(. 
10950 20 69 6e 74 20 2a 61 49 64 78 2c 20 0a 20 20 69   int *aIdx, .  i
10960 6e 74 20 6e 49 64 78 2c 20 0a 20 20 52 74 72 65  nt nIdx, .  Rtre
10970 65 44 56 61 6c 75 65 20 2a 61 44 69 73 74 61 6e  eDValue *aDistan
10980 63 65 2c 20 0a 20 20 69 6e 74 20 2a 61 53 70 61  ce, .  int *aSpa
10990 72 65 0a 29 7b 0a 20 20 69 66 28 20 6e 49 64 78  re.){.  if( nIdx
109a0 3e 31 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c  >1 ){.    int iL
109b0 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  eft = 0;.    int
109c0 20 69 52 69 67 68 74 20 3d 20 30 3b 0a 0a 20 20   iRight = 0;..  
109d0 20 20 69 6e 74 20 6e 4c 65 66 74 20 3d 20 6e 49    int nLeft = nI
109e0 64 78 2f 32 3b 0a 20 20 20 20 69 6e 74 20 6e 52  dx/2;.    int nR
109f0 69 67 68 74 20 3d 20 6e 49 64 78 2d 6e 4c 65 66  ight = nIdx-nLef
10a00 74 3b 0a 20 20 20 20 69 6e 74 20 2a 61 4c 65 66  t;.    int *aLef
10a10 74 20 3d 20 61 49 64 78 3b 0a 20 20 20 20 69 6e  t = aIdx;.    in
10a20 74 20 2a 61 52 69 67 68 74 20 3d 20 26 61 49 64  t *aRight = &aId
10a30 78 5b 6e 4c 65 66 74 5d 3b 0a 0a 20 20 20 20 53  x[nLeft];..    S
10a40 6f 72 74 42 79 44 69 73 74 61 6e 63 65 28 61 4c  ortByDistance(aL
10a50 65 66 74 2c 20 6e 4c 65 66 74 2c 20 61 44 69 73  eft, nLeft, aDis
10a60 74 61 6e 63 65 2c 20 61 53 70 61 72 65 29 3b 0a  tance, aSpare);.
10a70 20 20 20 20 53 6f 72 74 42 79 44 69 73 74 61 6e      SortByDistan
10a80 63 65 28 61 52 69 67 68 74 2c 20 6e 52 69 67 68  ce(aRight, nRigh
10a90 74 2c 20 61 44 69 73 74 61 6e 63 65 2c 20 61 53  t, aDistance, aS
10aa0 70 61 72 65 29 3b 0a 0a 20 20 20 20 6d 65 6d 63  pare);..    memc
10ab0 70 79 28 61 53 70 61 72 65 2c 20 61 4c 65 66 74  py(aSpare, aLeft
10ac0 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 4c  , sizeof(int)*nL
10ad0 65 66 74 29 3b 0a 20 20 20 20 61 4c 65 66 74 20  eft);.    aLeft 
10ae0 3d 20 61 53 70 61 72 65 3b 0a 0a 20 20 20 20 77  = aSpare;..    w
10af0 68 69 6c 65 28 20 69 4c 65 66 74 3c 6e 4c 65 66  hile( iLeft<nLef
10b00 74 20 7c 7c 20 69 52 69 67 68 74 3c 6e 52 69 67  t || iRight<nRig
10b10 68 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ht ){.      if( 
10b20 69 4c 65 66 74 3d 3d 6e 4c 65 66 74 20 29 7b 0a  iLeft==nLeft ){.
10b30 20 20 20 20 20 20 20 20 61 49 64 78 5b 69 4c 65          aIdx[iLe
10b40 66 74 2b 69 52 69 67 68 74 5d 20 3d 20 61 52 69  ft+iRight] = aRi
10b50 67 68 74 5b 69 52 69 67 68 74 5d 3b 0a 20 20 20  ght[iRight];.   
10b60 20 20 20 20 20 69 52 69 67 68 74 2b 2b 3b 0a 20       iRight++;. 
10b70 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
10b80 52 69 67 68 74 3d 3d 6e 52 69 67 68 74 20 29 7b  Right==nRight ){
10b90 0a 20 20 20 20 20 20 20 20 61 49 64 78 5b 69 4c  .        aIdx[iL
10ba0 65 66 74 2b 69 52 69 67 68 74 5d 20 3d 20 61 4c  eft+iRight] = aL
10bb0 65 66 74 5b 69 4c 65 66 74 5d 3b 0a 20 20 20 20  eft[iLeft];.    
10bc0 20 20 20 20 69 4c 65 66 74 2b 2b 3b 0a 20 20 20      iLeft++;.   
10bd0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10be0 20 20 52 74 72 65 65 44 56 61 6c 75 65 20 66 4c    RtreeDValue fL
10bf0 65 66 74 20 3d 20 61 44 69 73 74 61 6e 63 65 5b  eft = aDistance[
10c00 61 4c 65 66 74 5b 69 4c 65 66 74 5d 5d 3b 0a 20  aLeft[iLeft]];. 
10c10 20 20 20 20 20 20 20 52 74 72 65 65 44 56 61 6c         RtreeDVal
10c20 75 65 20 66 52 69 67 68 74 20 3d 20 61 44 69 73  ue fRight = aDis
10c30 74 61 6e 63 65 5b 61 52 69 67 68 74 5b 69 52 69  tance[aRight[iRi
10c40 67 68 74 5d 5d 3b 0a 20 20 20 20 20 20 20 20 69  ght]];.        i
10c50 66 28 20 66 4c 65 66 74 3c 66 52 69 67 68 74 20  f( fLeft<fRight 
10c60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 49 64  ){.          aId
10c70 78 5b 69 4c 65 66 74 2b 69 52 69 67 68 74 5d 20  x[iLeft+iRight] 
10c80 3d 20 61 4c 65 66 74 5b 69 4c 65 66 74 5d 3b 0a  = aLeft[iLeft];.
10c90 20 20 20 20 20 20 20 20 20 20 69 4c 65 66 74 2b            iLeft+
10ca0 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  +;.        }else
10cb0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 49 64 78  {.          aIdx
10cc0 5b 69 4c 65 66 74 2b 69 52 69 67 68 74 5d 20 3d  [iLeft+iRight] =
10cd0 20 61 52 69 67 68 74 5b 69 52 69 67 68 74 5d 3b   aRight[iRight];
10ce0 0a 20 20 20 20 20 20 20 20 20 20 69 52 69 67 68  .          iRigh
10cf0 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  t++;.        }. 
10d00 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69       }.    }..#i
10d10 66 20 30 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  f 0.    /* Check
10d20 20 74 68 61 74 20 74 68 65 20 73 6f 72 74 20 77   that the sort w
10d30 6f 72 6b 65 64 20 2a 2f 0a 20 20 20 20 7b 0a 20  orked */.    {. 
10d40 20 20 20 20 20 69 6e 74 20 6a 6a 3b 0a 20 20 20       int jj;.   
10d50 20 20 20 66 6f 72 28 6a 6a 3d 31 3b 20 6a 6a 3c     for(jj=1; jj<
10d60 6e 49 64 78 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20  nIdx; jj++){.   
10d70 20 20 20 20 20 52 74 72 65 65 44 56 61 6c 75 65       RtreeDValue
10d80 20 6c 65 66 74 20 3d 20 61 44 69 73 74 61 6e 63   left = aDistanc
10d90 65 5b 61 49 64 78 5b 6a 6a 2d 31 5d 5d 3b 0a 20  e[aIdx[jj-1]];. 
10da0 20 20 20 20 20 20 20 52 74 72 65 65 44 56 61 6c         RtreeDVal
10db0 75 65 20 72 69 67 68 74 20 3d 20 61 44 69 73 74  ue right = aDist
10dc0 61 6e 63 65 5b 61 49 64 78 5b 6a 6a 5d 5d 3b 0a  ance[aIdx[jj]];.
10dd0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
10de0 6c 65 66 74 3c 3d 72 69 67 68 74 20 29 3b 0a 20  left<=right );. 
10df0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
10e00 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  dif.  }.}../*.**
10e10 20 41 72 67 75 6d 65 6e 74 73 20 61 49 64 78 2c   Arguments aIdx,
10e20 20 61 43 65 6c 6c 20 61 6e 64 20 61 53 70 61 72   aCell and aSpar
10e30 65 20 61 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 61  e all point to a
10e40 72 72 61 79 73 20 6f 66 20 73 69 7a 65 0a 2a 2a  rrays of size.**
10e50 20 6e 49 64 78 2e 20 54 68 65 20 61 49 64 78 20   nIdx. The aIdx 
10e60 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 20 74  array contains t
10e70 68 65 20 73 65 74 20 6f 66 20 69 6e 74 65 67 65  he set of intege
10e80 72 73 20 66 72 6f 6d 20 30 20 74 6f 20 0a 2a 2a  rs from 0 to .**
10e90 20 28 6e 49 64 78 2d 31 29 20 69 6e 20 6e 6f 20   (nIdx-1) in no 
10ea0 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72  particular order
10eb0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
10ec0 73 6f 72 74 73 20 74 68 65 20 76 61 6c 75 65 73  sorts the values
10ed0 0a 2a 2a 20 69 6e 20 61 49 64 78 20 61 63 63 6f  .** in aIdx acco
10ee0 72 64 69 6e 67 20 74 6f 20 64 69 6d 65 6e 73 69  rding to dimensi
10ef0 6f 6e 20 69 44 69 6d 20 6f 66 20 74 68 65 20 63  on iDim of the c
10f00 65 6c 6c 73 20 69 6e 20 61 43 65 6c 6c 2e 20 54  ells in aCell. T
10f10 68 65 0a 2a 2a 20 6d 69 6e 69 6d 75 6d 20 76 61  he.** minimum va
10f20 6c 75 65 20 6f 66 20 64 69 6d 65 6e 73 69 6f 6e  lue of dimension
10f30 20 69 44 69 6d 20 69 73 20 63 6f 6e 73 69 64 65   iDim is conside
10f40 72 65 64 20 66 69 72 73 74 2c 20 74 68 65 0a 2a  red first, the.*
10f50 2a 20 6d 61 78 69 6d 75 6d 20 75 73 65 64 20 74  * maximum used t
10f60 6f 20 62 72 65 61 6b 20 74 69 65 73 2e 0a 2a 2a  o break ties..**
10f70 0a 2a 2a 20 54 68 65 20 61 53 70 61 72 65 20 61  .** The aSpare a
10f80 72 72 61 79 20 69 73 20 75 73 65 64 20 61 73 20  rray is used as 
10f90 74 65 6d 70 6f 72 61 72 79 20 77 6f 72 6b 69 6e  temporary workin
10fa0 67 20 73 70 61 63 65 20 62 79 20 74 68 65 0a 2a  g space by the.*
10fb0 2a 20 73 6f 72 74 69 6e 67 20 61 6c 67 6f 72 69  * sorting algori
10fc0 74 68 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  thm..*/.static v
10fd0 6f 69 64 20 53 6f 72 74 42 79 44 69 6d 65 6e 73  oid SortByDimens
10fe0 69 6f 6e 28 0a 20 20 52 74 72 65 65 20 2a 70 52  ion(.  Rtree *pR
10ff0 74 72 65 65 2c 0a 20 20 69 6e 74 20 2a 61 49 64  tree,.  int *aId
11000 78 2c 20 0a 20 20 69 6e 74 20 6e 49 64 78 2c 20  x, .  int nIdx, 
11010 0a 20 20 69 6e 74 20 69 44 69 6d 2c 20 0a 20 20  .  int iDim, .  
11020 52 74 72 65 65 43 65 6c 6c 20 2a 61 43 65 6c 6c  RtreeCell *aCell
11030 2c 20 0a 20 20 69 6e 74 20 2a 61 53 70 61 72 65  , .  int *aSpare
11040 0a 29 7b 0a 20 20 69 66 28 20 6e 49 64 78 3e 31  .){.  if( nIdx>1
11050 20 29 7b 0a 0a 20 20 20 20 69 6e 74 20 69 4c 65   ){..    int iLe
11060 66 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ft = 0;.    int 
11070 69 52 69 67 68 74 20 3d 20 30 3b 0a 0a 20 20 20  iRight = 0;..   
11080 20 69 6e 74 20 6e 4c 65 66 74 20 3d 20 6e 49 64   int nLeft = nId
11090 78 2f 32 3b 0a 20 20 20 20 69 6e 74 20 6e 52 69  x/2;.    int nRi
110a0 67 68 74 20 3d 20 6e 49 64 78 2d 6e 4c 65 66 74  ght = nIdx-nLeft
110b0 3b 0a 20 20 20 20 69 6e 74 20 2a 61 4c 65 66 74  ;.    int *aLeft
110c0 20 3d 20 61 49 64 78 3b 0a 20 20 20 20 69 6e 74   = aIdx;.    int
110d0 20 2a 61 52 69 67 68 74 20 3d 20 26 61 49 64 78   *aRight = &aIdx
110e0 5b 6e 4c 65 66 74 5d 3b 0a 0a 20 20 20 20 53 6f  [nLeft];..    So
110f0 72 74 42 79 44 69 6d 65 6e 73 69 6f 6e 28 70 52  rtByDimension(pR
11100 74 72 65 65 2c 20 61 4c 65 66 74 2c 20 6e 4c 65  tree, aLeft, nLe
11110 66 74 2c 20 69 44 69 6d 2c 20 61 43 65 6c 6c 2c  ft, iDim, aCell,
11120 20 61 53 70 61 72 65 29 3b 0a 20 20 20 20 53 6f   aSpare);.    So
11130 72 74 42 79 44 69 6d 65 6e 73 69 6f 6e 28 70 52  rtByDimension(pR
11140 74 72 65 65 2c 20 61 52 69 67 68 74 2c 20 6e 52  tree, aRight, nR
11150 69 67 68 74 2c 20 69 44 69 6d 2c 20 61 43 65 6c  ight, iDim, aCel
11160 6c 2c 20 61 53 70 61 72 65 29 3b 0a 0a 20 20 20  l, aSpare);..   
11170 20 6d 65 6d 63 70 79 28 61 53 70 61 72 65 2c 20   memcpy(aSpare, 
11180 61 4c 65 66 74 2c 20 73 69 7a 65 6f 66 28 69 6e  aLeft, sizeof(in
11190 74 29 2a 6e 4c 65 66 74 29 3b 0a 20 20 20 20 61  t)*nLeft);.    a
111a0 4c 65 66 74 20 3d 20 61 53 70 61 72 65 3b 0a 20  Left = aSpare;. 
111b0 20 20 20 77 68 69 6c 65 28 20 69 4c 65 66 74 3c     while( iLeft<
111c0 6e 4c 65 66 74 20 7c 7c 20 69 52 69 67 68 74 3c  nLeft || iRight<
111d0 6e 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  nRight ){.      
111e0 52 74 72 65 65 44 56 61 6c 75 65 20 78 6c 65 66  RtreeDValue xlef
111f0 74 31 20 3d 20 44 43 4f 4f 52 44 28 61 43 65 6c  t1 = DCOORD(aCel
11200 6c 5b 61 4c 65 66 74 5b 69 4c 65 66 74 5d 5d 2e  l[aLeft[iLeft]].
11210 61 43 6f 6f 72 64 5b 69 44 69 6d 2a 32 5d 29 3b  aCoord[iDim*2]);
11220 0a 20 20 20 20 20 20 52 74 72 65 65 44 56 61 6c  .      RtreeDVal
11230 75 65 20 78 6c 65 66 74 32 20 3d 20 44 43 4f 4f  ue xleft2 = DCOO
11240 52 44 28 61 43 65 6c 6c 5b 61 4c 65 66 74 5b 69  RD(aCell[aLeft[i
11250 4c 65 66 74 5d 5d 2e 61 43 6f 6f 72 64 5b 69 44  Left]].aCoord[iD
11260 69 6d 2a 32 2b 31 5d 29 3b 0a 20 20 20 20 20 20  im*2+1]);.      
11270 52 74 72 65 65 44 56 61 6c 75 65 20 78 72 69 67  RtreeDValue xrig
11280 68 74 31 20 3d 20 44 43 4f 4f 52 44 28 61 43 65  ht1 = DCOORD(aCe
11290 6c 6c 5b 61 52 69 67 68 74 5b 69 52 69 67 68 74  ll[aRight[iRight
112a0 5d 5d 2e 61 43 6f 6f 72 64 5b 69 44 69 6d 2a 32  ]].aCoord[iDim*2
112b0 5d 29 3b 0a 20 20 20 20 20 20 52 74 72 65 65 44  ]);.      RtreeD
112c0 56 61 6c 75 65 20 78 72 69 67 68 74 32 20 3d 20  Value xright2 = 
112d0 44 43 4f 4f 52 44 28 61 43 65 6c 6c 5b 61 52 69  DCOORD(aCell[aRi
112e0 67 68 74 5b 69 52 69 67 68 74 5d 5d 2e 61 43 6f  ght[iRight]].aCo
112f0 6f 72 64 5b 69 44 69 6d 2a 32 2b 31 5d 29 3b 0a  ord[iDim*2+1]);.
11300 20 20 20 20 20 20 69 66 28 20 28 69 4c 65 66 74        if( (iLeft
11310 21 3d 6e 4c 65 66 74 29 20 26 26 20 28 28 69 52  !=nLeft) && ((iR
11320 69 67 68 74 3d 3d 6e 52 69 67 68 74 29 0a 20 20  ight==nRight).  
11330 20 20 20 20 20 7c 7c 20 28 78 6c 65 66 74 31 3c       || (xleft1<
11340 78 72 69 67 68 74 31 29 0a 20 20 20 20 20 20 20  xright1).       
11350 7c 7c 20 28 78 6c 65 66 74 31 3d 3d 78 72 69 67  || (xleft1==xrig
11360 68 74 31 20 26 26 20 78 6c 65 66 74 32 3c 78 72  ht1 && xleft2<xr
11370 69 67 68 74 32 29 0a 20 20 20 20 20 20 29 29 7b  ight2).      )){
11380 0a 20 20 20 20 20 20 20 20 61 49 64 78 5b 69 4c  .        aIdx[iL
11390 65 66 74 2b 69 52 69 67 68 74 5d 20 3d 20 61 4c  eft+iRight] = aL
113a0 65 66 74 5b 69 4c 65 66 74 5d 3b 0a 20 20 20 20  eft[iLeft];.    
113b0 20 20 20 20 69 4c 65 66 74 2b 2b 3b 0a 20 20 20      iLeft++;.   
113c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
113d0 20 20 61 49 64 78 5b 69 4c 65 66 74 2b 69 52 69    aIdx[iLeft+iRi
113e0 67 68 74 5d 20 3d 20 61 52 69 67 68 74 5b 69 52  ght] = aRight[iR
113f0 69 67 68 74 5d 3b 0a 20 20 20 20 20 20 20 20 69  ight];.        i
11400 52 69 67 68 74 2b 2b 3b 0a 20 20 20 20 20 20 7d  Right++;.      }
11410 0a 20 20 20 20 7d 0a 0a 23 69 66 20 30 0a 20 20  .    }..#if 0.  
11420 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
11430 74 68 65 20 73 6f 72 74 20 77 6f 72 6b 65 64 20  the sort worked 
11440 2a 2f 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69  */.    {.      i
11450 6e 74 20 6a 6a 3b 0a 20 20 20 20 20 20 66 6f 72  nt jj;.      for
11460 28 6a 6a 3d 31 3b 20 6a 6a 3c 6e 49 64 78 3b 20  (jj=1; jj<nIdx; 
11470 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 52  jj++){.        R
11480 74 72 65 65 44 56 61 6c 75 65 20 78 6c 65 66 74  treeDValue xleft
11490 31 20 3d 20 61 43 65 6c 6c 5b 61 49 64 78 5b 6a  1 = aCell[aIdx[j
114a0 6a 2d 31 5d 5d 2e 61 43 6f 6f 72 64 5b 69 44 69  j-1]].aCoord[iDi
114b0 6d 2a 32 5d 3b 0a 20 20 20 20 20 20 20 20 52 74  m*2];.        Rt
114c0 72 65 65 44 56 61 6c 75 65 20 78 6c 65 66 74 32  reeDValue xleft2
114d0 20 3d 20 61 43 65 6c 6c 5b 61 49 64 78 5b 6a 6a   = aCell[aIdx[jj
114e0 2d 31 5d 5d 2e 61 43 6f 6f 72 64 5b 69 44 69 6d  -1]].aCoord[iDim
114f0 2a 32 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 52  *2+1];.        R
11500 74 72 65 65 44 56 61 6c 75 65 20 78 72 69 67 68  treeDValue xrigh
11510 74 31 20 3d 20 61 43 65 6c 6c 5b 61 49 64 78 5b  t1 = aCell[aIdx[
11520 6a 6a 5d 5d 2e 61 43 6f 6f 72 64 5b 69 44 69 6d  jj]].aCoord[iDim
11530 2a 32 5d 3b 0a 20 20 20 20 20 20 20 20 52 74 72  *2];.        Rtr
11540 65 65 44 56 61 6c 75 65 20 78 72 69 67 68 74 32  eeDValue xright2
11550 20 3d 20 61 43 65 6c 6c 5b 61 49 64 78 5b 6a 6a   = aCell[aIdx[jj
11560 5d 5d 2e 61 43 6f 6f 72 64 5b 69 44 69 6d 2a 32  ]].aCoord[iDim*2
11570 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73  +1];.        ass
11580 65 72 74 28 20 78 6c 65 66 74 31 3c 3d 78 72 69  ert( xleft1<=xri
11590 67 68 74 31 20 26 26 20 28 78 6c 65 66 74 31 3c  ght1 && (xleft1<
115a0 78 72 69 67 68 74 31 20 7c 7c 20 78 6c 65 66 74  xright1 || xleft
115b0 32 3c 3d 78 72 69 67 68 74 32 29 20 29 3b 0a 20  2<=xright2) );. 
115c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
115d0 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  dif.  }.}../*.**
115e0 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
115f0 6f 66 20 74 68 65 20 52 2a 2d 74 72 65 65 20 76  of the R*-tree v
11600 61 72 69 61 6e 74 20 6f 66 20 53 70 6c 69 74 4e  ariant of SplitN
11610 6f 64 65 20 66 72 6f 6d 20 42 65 63 6b 6d 61 6e  ode from Beckman
11620 5b 31 39 39 30 5d 2e 0a 2a 2f 0a 73 74 61 74 69  [1990]..*/.stati
11630 63 20 69 6e 74 20 73 70 6c 69 74 4e 6f 64 65 53  c int splitNodeS
11640 74 61 72 74 72 65 65 28 0a 20 20 52 74 72 65 65  tartree(.  Rtree
11650 20 2a 70 52 74 72 65 65 2c 0a 20 20 52 74 72 65   *pRtree,.  Rtre
11660 65 43 65 6c 6c 20 2a 61 43 65 6c 6c 2c 0a 20 20  eCell *aCell,.  
11670 69 6e 74 20 6e 43 65 6c 6c 2c 0a 20 20 52 74 72  int nCell,.  Rtr
11680 65 65 4e 6f 64 65 20 2a 70 4c 65 66 74 2c 0a 20  eeNode *pLeft,. 
11690 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 52 69 67   RtreeNode *pRig
116a0 68 74 2c 0a 20 20 52 74 72 65 65 43 65 6c 6c 20  ht,.  RtreeCell 
116b0 2a 70 42 62 6f 78 4c 65 66 74 2c 0a 20 20 52 74  *pBboxLeft,.  Rt
116c0 72 65 65 43 65 6c 6c 20 2a 70 42 62 6f 78 52 69  reeCell *pBboxRi
116d0 67 68 74 0a 29 7b 0a 20 20 69 6e 74 20 2a 2a 61  ght.){.  int **a
116e0 61 53 6f 72 74 65 64 3b 0a 20 20 69 6e 74 20 2a  aSorted;.  int *
116f0 61 53 70 61 72 65 3b 0a 20 20 69 6e 74 20 69 69  aSpare;.  int ii
11700 3b 0a 0a 20 20 69 6e 74 20 69 42 65 73 74 44 69  ;..  int iBestDi
11710 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 42 65  m = 0;.  int iBe
11720 73 74 53 70 6c 69 74 20 3d 20 30 3b 0a 20 20 52  stSplit = 0;.  R
11730 74 72 65 65 44 56 61 6c 75 65 20 66 42 65 73 74  treeDValue fBest
11740 4d 61 72 67 69 6e 20 3d 20 52 54 52 45 45 5f 5a  Margin = RTREE_Z
11750 45 52 4f 3b 0a 0a 20 20 69 6e 74 20 6e 42 79 74  ERO;..  int nByt
11760 65 20 3d 20 28 70 52 74 72 65 65 2d 3e 6e 44 69  e = (pRtree->nDi
11770 6d 2b 31 29 2a 28 73 69 7a 65 6f 66 28 69 6e 74  m+1)*(sizeof(int
11780 2a 29 2b 6e 43 65 6c 6c 2a 73 69 7a 65 6f 66 28  *)+nCell*sizeof(
11790 69 6e 74 29 29 3b 0a 0a 20 20 61 61 53 6f 72 74  int));..  aaSort
117a0 65 64 20 3d 20 28 69 6e 74 20 2a 2a 29 73 71 6c  ed = (int **)sql
117b0 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74  ite3_malloc(nByt
117c0 65 29 3b 0a 20 20 69 66 28 20 21 61 61 53 6f 72  e);.  if( !aaSor
117d0 74 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ted ){.    retur
117e0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
117f0 20 20 7d 0a 0a 20 20 61 53 70 61 72 65 20 3d 20    }..  aSpare = 
11800 26 28 28 69 6e 74 20 2a 29 26 61 61 53 6f 72 74  &((int *)&aaSort
11810 65 64 5b 70 52 74 72 65 65 2d 3e 6e 44 69 6d 5d  ed[pRtree->nDim]
11820 29 5b 70 52 74 72 65 65 2d 3e 6e 44 69 6d 2a 6e  )[pRtree->nDim*n
11830 43 65 6c 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74 28  Cell];.  memset(
11840 61 61 53 6f 72 74 65 64 2c 20 30 2c 20 6e 42 79  aaSorted, 0, nBy
11850 74 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b  te);.  for(ii=0;
11860 20 69 69 3c 70 52 74 72 65 65 2d 3e 6e 44 69 6d   ii<pRtree->nDim
11870 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  ; ii++){.    int
11880 20 6a 6a 3b 0a 20 20 20 20 61 61 53 6f 72 74 65   jj;.    aaSorte
11890 64 5b 69 69 5d 20 3d 20 26 28 28 69 6e 74 20 2a  d[ii] = &((int *
118a0 29 26 61 61 53 6f 72 74 65 64 5b 70 52 74 72 65  )&aaSorted[pRtre
118b0 65 2d 3e 6e 44 69 6d 5d 29 5b 69 69 2a 6e 43 65  e->nDim])[ii*nCe
118c0 6c 6c 5d 3b 0a 20 20 20 20 66 6f 72 28 6a 6a 3d  ll];.    for(jj=
118d0 30 3b 20 6a 6a 3c 6e 43 65 6c 6c 3b 20 6a 6a 2b  0; jj<nCell; jj+
118e0 2b 29 7b 0a 20 20 20 20 20 20 61 61 53 6f 72 74  +){.      aaSort
118f0 65 64 5b 69 69 5d 5b 6a 6a 5d 20 3d 20 6a 6a 3b  ed[ii][jj] = jj;
11900 0a 20 20 20 20 7d 0a 20 20 20 20 53 6f 72 74 42  .    }.    SortB
11910 79 44 69 6d 65 6e 73 69 6f 6e 28 70 52 74 72 65  yDimension(pRtre
11920 65 2c 20 61 61 53 6f 72 74 65 64 5b 69 69 5d 2c  e, aaSorted[ii],
11930 20 6e 43 65 6c 6c 2c 20 69 69 2c 20 61 43 65 6c   nCell, ii, aCel
11940 6c 2c 20 61 53 70 61 72 65 29 3b 0a 20 20 7d 0a  l, aSpare);.  }.
11950 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
11960 70 52 74 72 65 65 2d 3e 6e 44 69 6d 3b 20 69 69  pRtree->nDim; ii
11970 2b 2b 29 7b 0a 20 20 20 20 52 74 72 65 65 44 56  ++){.    RtreeDV
11980 61 6c 75 65 20 6d 61 72 67 69 6e 20 3d 20 52 54  alue margin = RT
11990 52 45 45 5f 5a 45 52 4f 3b 0a 20 20 20 20 52 74  REE_ZERO;.    Rt
119a0 72 65 65 44 56 61 6c 75 65 20 66 42 65 73 74 4f  reeDValue fBestO
119b0 76 65 72 6c 61 70 20 3d 20 52 54 52 45 45 5f 5a  verlap = RTREE_Z
119c0 45 52 4f 3b 0a 20 20 20 20 52 74 72 65 65 44 56  ERO;.    RtreeDV
119d0 61 6c 75 65 20 66 42 65 73 74 41 72 65 61 20 3d  alue fBestArea =
119e0 20 52 54 52 45 45 5f 5a 45 52 4f 3b 0a 20 20 20   RTREE_ZERO;.   
119f0 20 69 6e 74 20 69 42 65 73 74 4c 65 66 74 20 3d   int iBestLeft =
11a00 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4c 65 66   0;.    int nLef
11a10 74 3b 0a 0a 20 20 20 20 66 6f 72 28 0a 20 20 20  t;..    for(.   
11a20 20 20 20 6e 4c 65 66 74 3d 52 54 52 45 45 5f 4d     nLeft=RTREE_M
11a30 49 4e 43 45 4c 4c 53 28 70 52 74 72 65 65 29 3b  INCELLS(pRtree);
11a40 20 0a 20 20 20 20 20 20 6e 4c 65 66 74 3c 3d 28   .      nLeft<=(
11a50 6e 43 65 6c 6c 2d 52 54 52 45 45 5f 4d 49 4e 43  nCell-RTREE_MINC
11a60 45 4c 4c 53 28 70 52 74 72 65 65 29 29 3b 20 0a  ELLS(pRtree)); .
11a70 20 20 20 20 20 20 6e 4c 65 66 74 2b 2b 0a 20 20        nLeft++.  
11a80 20 20 29 7b 0a 20 20 20 20 20 20 52 74 72 65 65    ){.      Rtree
11a90 43 65 6c 6c 20 6c 65 66 74 3b 0a 20 20 20 20 20  Cell left;.     
11aa0 20 52 74 72 65 65 43 65 6c 6c 20 72 69 67 68 74   RtreeCell right
11ab0 3b 0a 20 20 20 20 20 20 69 6e 74 20 6b 6b 3b 0a  ;.      int kk;.
11ac0 20 20 20 20 20 20 52 74 72 65 65 44 56 61 6c 75        RtreeDValu
11ad0 65 20 6f 76 65 72 6c 61 70 3b 0a 20 20 20 20 20  e overlap;.     
11ae0 20 52 74 72 65 65 44 56 61 6c 75 65 20 61 72 65   RtreeDValue are
11af0 61 3b 0a 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  a;..      memcpy
11b00 28 26 6c 65 66 74 2c 20 26 61 43 65 6c 6c 5b 61  (&left, &aCell[a
11b10 61 53 6f 72 74 65 64 5b 69 69 5d 5b 30 5d 5d 2c  aSorted[ii][0]],
11b20 20 73 69 7a 65 6f 66 28 52 74 72 65 65 43 65 6c   sizeof(RtreeCel
11b30 6c 29 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  l));.      memcp
11b40 79 28 26 72 69 67 68 74 2c 20 26 61 43 65 6c 6c  y(&right, &aCell
11b50 5b 61 61 53 6f 72 74 65 64 5b 69 69 5d 5b 6e 43  [aaSorted[ii][nC
11b60 65 6c 6c 2d 31 5d 5d 2c 20 73 69 7a 65 6f 66 28  ell-1]], sizeof(
11b70 52 74 72 65 65 43 65 6c 6c 29 29 3b 0a 20 20 20  RtreeCell));.   
11b80 20 20 20 66 6f 72 28 6b 6b 3d 31 3b 20 6b 6b 3c     for(kk=1; kk<
11b90 28 6e 43 65 6c 6c 2d 31 29 3b 20 6b 6b 2b 2b 29  (nCell-1); kk++)
11ba0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 6b  {.        if( kk
11bb0 3c 6e 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20  <nLeft ){.      
11bc0 20 20 20 20 63 65 6c 6c 55 6e 69 6f 6e 28 70 52      cellUnion(pR
11bd0 74 72 65 65 2c 20 26 6c 65 66 74 2c 20 26 61 43  tree, &left, &aC
11be0 65 6c 6c 5b 61 61 53 6f 72 74 65 64 5b 69 69 5d  ell[aaSorted[ii]
11bf0 5b 6b 6b 5d 5d 29 3b 0a 20 20 20 20 20 20 20 20  [kk]]);.        
11c00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
11c10 20 63 65 6c 6c 55 6e 69 6f 6e 28 70 52 74 72 65   cellUnion(pRtre
11c20 65 2c 20 26 72 69 67 68 74 2c 20 26 61 43 65 6c  e, &right, &aCel
11c30 6c 5b 61 61 53 6f 72 74 65 64 5b 69 69 5d 5b 6b  l[aaSorted[ii][k
11c40 6b 5d 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  k]]);.        }.
11c50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 61        }.      ma
11c60 72 67 69 6e 20 2b 3d 20 63 65 6c 6c 4d 61 72 67  rgin += cellMarg
11c70 69 6e 28 70 52 74 72 65 65 2c 20 26 6c 65 66 74  in(pRtree, &left
11c80 29 3b 0a 20 20 20 20 20 20 6d 61 72 67 69 6e 20  );.      margin 
11c90 2b 3d 20 63 65 6c 6c 4d 61 72 67 69 6e 28 70 52  += cellMargin(pR
11ca0 74 72 65 65 2c 20 26 72 69 67 68 74 29 3b 0a 20  tree, &right);. 
11cb0 20 20 20 20 20 6f 76 65 72 6c 61 70 20 3d 20 63       overlap = c
11cc0 65 6c 6c 4f 76 65 72 6c 61 70 28 70 52 74 72 65  ellOverlap(pRtre
11cd0 65 2c 20 26 6c 65 66 74 2c 20 26 72 69 67 68 74  e, &left, &right
11ce0 2c 20 31 29 3b 0a 20 20 20 20 20 20 61 72 65 61  , 1);.      area
11cf0 20 3d 20 63 65 6c 6c 41 72 65 61 28 70 52 74 72   = cellArea(pRtr
11d00 65 65 2c 20 26 6c 65 66 74 29 20 2b 20 63 65 6c  ee, &left) + cel
11d10 6c 41 72 65 61 28 70 52 74 72 65 65 2c 20 26 72  lArea(pRtree, &r
11d20 69 67 68 74 29 3b 0a 20 20 20 20 20 20 69 66 28  ight);.      if(
11d30 20 28 6e 4c 65 66 74 3d 3d 52 54 52 45 45 5f 4d   (nLeft==RTREE_M
11d40 49 4e 43 45 4c 4c 53 28 70 52 74 72 65 65 29 29  INCELLS(pRtree))
11d50 0a 20 20 20 20 20 20 20 7c 7c 20 28 6f 76 65 72  .       || (over
11d60 6c 61 70 3c 66 42 65 73 74 4f 76 65 72 6c 61 70  lap<fBestOverlap
11d70 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 6f 76 65  ).       || (ove
11d80 72 6c 61 70 3d 3d 66 42 65 73 74 4f 76 65 72 6c  rlap==fBestOverl
11d90 61 70 20 26 26 20 61 72 65 61 3c 66 42 65 73 74  ap && area<fBest
11da0 41 72 65 61 29 0a 20 20 20 20 20 20 29 7b 0a 20  Area).      ){. 
11db0 20 20 20 20 20 20 20 69 42 65 73 74 4c 65 66 74         iBestLeft
11dc0 20 3d 20 6e 4c 65 66 74 3b 0a 20 20 20 20 20 20   = nLeft;.      
11dd0 20 20 66 42 65 73 74 4f 76 65 72 6c 61 70 20 3d    fBestOverlap =
11de0 20 6f 76 65 72 6c 61 70 3b 0a 20 20 20 20 20 20   overlap;.      
11df0 20 20 66 42 65 73 74 41 72 65 61 20 3d 20 61 72    fBestArea = ar
11e00 65 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ea;.      }.    
11e10 7d 0a 0a 20 20 20 20 69 66 28 20 69 69 3d 3d 30  }..    if( ii==0
11e20 20 7c 7c 20 6d 61 72 67 69 6e 3c 66 42 65 73 74   || margin<fBest
11e30 4d 61 72 67 69 6e 20 29 7b 0a 20 20 20 20 20 20  Margin ){.      
11e40 69 42 65 73 74 44 69 6d 20 3d 20 69 69 3b 0a 20  iBestDim = ii;. 
11e50 20 20 20 20 20 66 42 65 73 74 4d 61 72 67 69 6e       fBestMargin
11e60 20 3d 20 6d 61 72 67 69 6e 3b 0a 20 20 20 20 20   = margin;.     
11e70 20 69 42 65 73 74 53 70 6c 69 74 20 3d 20 69 42   iBestSplit = iB
11e80 65 73 74 4c 65 66 74 3b 0a 20 20 20 20 7d 0a 20  estLeft;.    }. 
11e90 20 7d 0a 0a 20 20 6d 65 6d 63 70 79 28 70 42 62   }..  memcpy(pBb
11ea0 6f 78 4c 65 66 74 2c 20 26 61 43 65 6c 6c 5b 61  oxLeft, &aCell[a
11eb0 61 53 6f 72 74 65 64 5b 69 42 65 73 74 44 69 6d  aSorted[iBestDim
11ec0 5d 5b 30 5d 5d 2c 20 73 69 7a 65 6f 66 28 52 74  ][0]], sizeof(Rt
11ed0 72 65 65 43 65 6c 6c 29 29 3b 0a 20 20 6d 65 6d  reeCell));.  mem
11ee0 63 70 79 28 70 42 62 6f 78 52 69 67 68 74 2c 20  cpy(pBboxRight, 
11ef0 26 61 43 65 6c 6c 5b 61 61 53 6f 72 74 65 64 5b  &aCell[aaSorted[
11f00 69 42 65 73 74 44 69 6d 5d 5b 69 42 65 73 74 53  iBestDim][iBestS
11f10 70 6c 69 74 5d 5d 2c 20 73 69 7a 65 6f 66 28 52  plit]], sizeof(R
11f20 74 72 65 65 43 65 6c 6c 29 29 3b 0a 20 20 66 6f  treeCell));.  fo
11f30 72 28 69 69 3d 30 3b 20 69 69 3c 6e 43 65 6c 6c  r(ii=0; ii<nCell
11f40 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 52 74 72  ; ii++){.    Rtr
11f50 65 65 4e 6f 64 65 20 2a 70 54 61 72 67 65 74 20  eeNode *pTarget 
11f60 3d 20 28 69 69 3c 69 42 65 73 74 53 70 6c 69 74  = (ii<iBestSplit
11f70 29 3f 70 4c 65 66 74 3a 70 52 69 67 68 74 3b 0a  )?pLeft:pRight;.
11f80 20 20 20 20 52 74 72 65 65 43 65 6c 6c 20 2a 70      RtreeCell *p
11f90 42 62 6f 78 20 3d 20 28 69 69 3c 69 42 65 73 74  Bbox = (ii<iBest
11fa0 53 70 6c 69 74 29 3f 70 42 62 6f 78 4c 65 66 74  Split)?pBboxLeft
11fb0 3a 70 42 62 6f 78 52 69 67 68 74 3b 0a 20 20 20  :pBboxRight;.   
11fc0 20 52 74 72 65 65 43 65 6c 6c 20 2a 70 43 65 6c   RtreeCell *pCel
11fd0 6c 20 3d 20 26 61 43 65 6c 6c 5b 61 61 53 6f 72  l = &aCell[aaSor
11fe0 74 65 64 5b 69 42 65 73 74 44 69 6d 5d 5b 69 69  ted[iBestDim][ii
11ff0 5d 5d 3b 0a 20 20 20 20 6e 6f 64 65 49 6e 73 65  ]];.    nodeInse
12000 72 74 43 65 6c 6c 28 70 52 74 72 65 65 2c 20 70  rtCell(pRtree, p
12010 54 61 72 67 65 74 2c 20 70 43 65 6c 6c 29 3b 0a  Target, pCell);.
12020 20 20 20 20 63 65 6c 6c 55 6e 69 6f 6e 28 70 52      cellUnion(pR
12030 74 72 65 65 2c 20 70 42 62 6f 78 2c 20 70 43 65  tree, pBbox, pCe
12040 6c 6c 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  ll);.  }..  sqli
12050 74 65 33 5f 66 72 65 65 28 61 61 53 6f 72 74 65  te3_free(aaSorte
12060 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  d);.  return SQL
12070 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 73 74 61 74  ITE_OK;.}...stat
12080 69 63 20 69 6e 74 20 75 70 64 61 74 65 4d 61 70  ic int updateMap
12090 70 69 6e 67 28 0a 20 20 52 74 72 65 65 20 2a 70  ping(.  Rtree *p
120a0 52 74 72 65 65 2c 20 0a 20 20 69 36 34 20 69 52  Rtree, .  i64 iR
120b0 6f 77 69 64 2c 20 0a 20 20 52 74 72 65 65 4e 6f  owid, .  RtreeNo
120c0 64 65 20 2a 70 4e 6f 64 65 2c 20 0a 20 20 69 6e  de *pNode, .  in
120d0 74 20 69 48 65 69 67 68 74 0a 29 7b 0a 20 20 69  t iHeight.){.  i
120e0 6e 74 20 28 2a 78 53 65 74 4d 61 70 70 69 6e 67  nt (*xSetMapping
120f0 29 28 52 74 72 65 65 20 2a 2c 20 73 71 6c 69 74  )(Rtree *, sqlit
12100 65 33 5f 69 6e 74 36 34 2c 20 73 71 6c 69 74 65  e3_int64, sqlite
12110 33 5f 69 6e 74 36 34 29 3b 0a 20 20 78 53 65 74  3_int64);.  xSet
12120 4d 61 70 70 69 6e 67 20 3d 20 28 28 69 48 65 69  Mapping = ((iHei
12130 67 68 74 3d 3d 30 29 3f 72 6f 77 69 64 57 72 69  ght==0)?rowidWri
12140 74 65 3a 70 61 72 65 6e 74 57 72 69 74 65 29 3b  te:parentWrite);
12150 0a 20 20 69 66 28 20 69 48 65 69 67 68 74 3e 30  .  if( iHeight>0
12160 20 29 7b 0a 20 20 20 20 52 74 72 65 65 4e 6f 64   ){.    RtreeNod
12170 65 20 2a 70 43 68 69 6c 64 20 3d 20 6e 6f 64 65  e *pChild = node
12180 48 61 73 68 4c 6f 6f 6b 75 70 28 70 52 74 72 65  HashLookup(pRtre
12190 65 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  e, iRowid);.    
121a0 69 66 28 20 70 43 68 69 6c 64 20 29 7b 0a 20 20  if( pChild ){.  
121b0 20 20 20 20 6e 6f 64 65 52 65 6c 65 61 73 65 28      nodeRelease(
121c0 70 52 74 72 65 65 2c 20 70 43 68 69 6c 64 2d 3e  pRtree, pChild->
121d0 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 20 20  pParent);.      
121e0 6e 6f 64 65 52 65 66 65 72 65 6e 63 65 28 70 4e  nodeReference(pN
121f0 6f 64 65 29 3b 0a 20 20 20 20 20 20 70 43 68 69  ode);.      pChi
12200 6c 64 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 4e  ld->pParent = pN
12210 6f 64 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ode;.    }.  }. 
12220 20 72 65 74 75 72 6e 20 78 53 65 74 4d 61 70 70   return xSetMapp
12230 69 6e 67 28 70 52 74 72 65 65 2c 20 69 52 6f 77  ing(pRtree, iRow
12240 69 64 2c 20 70 4e 6f 64 65 2d 3e 69 4e 6f 64 65  id, pNode->iNode
12250 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  );.}..static int
12260 20 53 70 6c 69 74 4e 6f 64 65 28 0a 20 20 52 74   SplitNode(.  Rt
12270 72 65 65 20 2a 70 52 74 72 65 65 2c 0a 20 20 52  ree *pRtree,.  R
12280 74 72 65 65 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c  treeNode *pNode,
12290 0a 20 20 52 74 72 65 65 43 65 6c 6c 20 2a 70 43  .  RtreeCell *pC
122a0 65 6c 6c 2c 0a 20 20 69 6e 74 20 69 48 65 69 67  ell,.  int iHeig
122b0 68 74 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ht.){.  int i;. 
122c0 20 69 6e 74 20 6e 65 77 43 65 6c 6c 49 73 52 69   int newCellIsRi
122d0 67 68 74 20 3d 20 30 3b 0a 0a 20 20 69 6e 74 20  ght = 0;..  int 
122e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
122f0 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 4e 43    int nCell = NC
12300 45 4c 4c 28 70 4e 6f 64 65 29 3b 0a 20 20 52 74  ELL(pNode);.  Rt
12310 72 65 65 43 65 6c 6c 20 2a 61 43 65 6c 6c 3b 0a  reeCell *aCell;.
12320 20 20 69 6e 74 20 2a 61 69 55 73 65 64 3b 0a 0a    int *aiUsed;..
12330 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 4c 65    RtreeNode *pLe
12340 66 74 20 3d 20 30 3b 0a 20 20 52 74 72 65 65 4e  ft = 0;.  RtreeN
12350 6f 64 65 20 2a 70 52 69 67 68 74 20 3d 20 30 3b  ode *pRight = 0;
12360 0a 0a 20 20 52 74 72 65 65 43 65 6c 6c 20 6c 65  ..  RtreeCell le
12370 66 74 62 62 6f 78 3b 0a 20 20 52 74 72 65 65 43  ftbbox;.  RtreeC
12380 65 6c 6c 20 72 69 67 68 74 62 62 6f 78 3b 0a 0a  ell rightbbox;..
12390 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
123a0 20 61 72 72 61 79 20 61 6e 64 20 70 6f 70 75 6c   array and popul
123b0 61 74 65 20 69 74 20 77 69 74 68 20 61 20 63 6f  ate it with a co
123c0 70 79 20 6f 66 20 70 43 65 6c 6c 20 61 6e 64 20  py of pCell and 
123d0 0a 20 20 2a 2a 20 61 6c 6c 20 63 65 6c 6c 73 20  .  ** all cells 
123e0 66 72 6f 6d 20 6e 6f 64 65 20 70 4c 65 66 74 2e  from node pLeft.
123f0 20 54 68 65 6e 20 7a 65 72 6f 20 74 68 65 20 6f   Then zero the o
12400 72 69 67 69 6e 61 6c 20 6e 6f 64 65 2e 0a 20 20  riginal node..  
12410 2a 2f 0a 20 20 61 43 65 6c 6c 20 3d 20 73 71 6c  */.  aCell = sql
12420 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 28 73 69 7a  ite3_malloc((siz
12430 65 6f 66 28 52 74 72 65 65 43 65 6c 6c 29 2b 73  eof(RtreeCell)+s
12440 69 7a 65 6f 66 28 69 6e 74 29 29 2a 28 6e 43 65  izeof(int))*(nCe
12450 6c 6c 2b 31 29 29 3b 0a 20 20 69 66 28 20 21 61  ll+1));.  if( !a
12460 43 65 6c 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d  Cell ){.    rc =
12470 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
12480 20 20 20 67 6f 74 6f 20 73 70 6c 69 74 6e 6f 64     goto splitnod
12490 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 61 69 55  e_out;.  }.  aiU
124a0 73 65 64 20 3d 20 28 69 6e 74 20 2a 29 26 61 43  sed = (int *)&aC
124b0 65 6c 6c 5b 6e 43 65 6c 6c 2b 31 5d 3b 0a 20 20  ell[nCell+1];.  
124c0 6d 65 6d 73 65 74 28 61 69 55 73 65 64 2c 20 30  memset(aiUsed, 0
124d0 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28 6e  , sizeof(int)*(n
124e0 43 65 6c 6c 2b 31 29 29 3b 0a 20 20 66 6f 72 28  Cell+1));.  for(
124f0 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
12500 2b 29 7b 0a 20 20 20 20 6e 6f 64 65 47 65 74 43  +){.    nodeGetC
12510 65 6c 6c 28 70 52 74 72 65 65 2c 20 70 4e 6f 64  ell(pRtree, pNod
12520 65 2c 20 69 2c 20 26 61 43 65 6c 6c 5b 69 5d 29  e, i, &aCell[i])
12530 3b 0a 20 20 7d 0a 20 20 6e 6f 64 65 5a 65 72 6f  ;.  }.  nodeZero
12540 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65 29 3b  (pRtree, pNode);
12550 0a 20 20 6d 65 6d 63 70 79 28 26 61 43 65 6c 6c  .  memcpy(&aCell
12560 5b 6e 43 65 6c 6c 5d 2c 20 70 43 65 6c 6c 2c 20  [nCell], pCell, 
12570 73 69 7a 65 6f 66 28 52 74 72 65 65 43 65 6c 6c  sizeof(RtreeCell
12580 29 29 3b 0a 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 0a  ));.  nCell++;..
12590 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 69 4e 6f    if( pNode->iNo
125a0 64 65 3d 3d 31 20 29 7b 0a 20 20 20 20 70 52 69  de==1 ){.    pRi
125b0 67 68 74 20 3d 20 6e 6f 64 65 4e 65 77 28 70 52  ght = nodeNew(pR
125c0 74 72 65 65 2c 20 70 4e 6f 64 65 29 3b 0a 20 20  tree, pNode);.  
125d0 20 20 70 4c 65 66 74 20 3d 20 6e 6f 64 65 4e 65    pLeft = nodeNe
125e0 77 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65 29  w(pRtree, pNode)
125f0 3b 0a 20 20 20 20 70 52 74 72 65 65 2d 3e 69 44  ;.    pRtree->iD
12600 65 70 74 68 2b 2b 3b 0a 20 20 20 20 70 4e 6f 64  epth++;.    pNod
12610 65 2d 3e 69 73 44 69 72 74 79 20 3d 20 31 3b 0a  e->isDirty = 1;.
12620 20 20 20 20 77 72 69 74 65 49 6e 74 31 36 28 70      writeInt16(p
12630 4e 6f 64 65 2d 3e 7a 44 61 74 61 2c 20 70 52 74  Node->zData, pRt
12640 72 65 65 2d 3e 69 44 65 70 74 68 29 3b 0a 20 20  ree->iDepth);.  
12650 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c 65 66 74  }else{.    pLeft
12660 20 3d 20 70 4e 6f 64 65 3b 0a 20 20 20 20 70 52   = pNode;.    pR
12670 69 67 68 74 20 3d 20 6e 6f 64 65 4e 65 77 28 70  ight = nodeNew(p
12680 52 74 72 65 65 2c 20 70 4c 65 66 74 2d 3e 70 50  Rtree, pLeft->pP
12690 61 72 65 6e 74 29 3b 0a 20 20 20 20 6e 6f 64 65  arent);.    node
126a0 52 65 66 65 72 65 6e 63 65 28 70 4c 65 66 74 29  Reference(pLeft)
126b0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 4c  ;.  }..  if( !pL
126c0 65 66 74 20 7c 7c 20 21 70 52 69 67 68 74 20 29  eft || !pRight )
126d0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
126e0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74  E_NOMEM;.    got
126f0 6f 20 73 70 6c 69 74 6e 6f 64 65 5f 6f 75 74 3b  o splitnode_out;
12700 0a 20 20 7d 0a 0a 20 20 6d 65 6d 73 65 74 28 70  .  }..  memset(p
12710 4c 65 66 74 2d 3e 7a 44 61 74 61 2c 20 30 2c 20  Left->zData, 0, 
12720 70 52 74 72 65 65 2d 3e 69 4e 6f 64 65 53 69 7a  pRtree->iNodeSiz
12730 65 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 52 69  e);.  memset(pRi
12740 67 68 74 2d 3e 7a 44 61 74 61 2c 20 30 2c 20 70  ght->zData, 0, p
12750 52 74 72 65 65 2d 3e 69 4e 6f 64 65 53 69 7a 65  Rtree->iNodeSize
12760 29 3b 0a 0a 20 20 72 63 20 3d 20 73 70 6c 69 74  );..  rc = split
12770 4e 6f 64 65 53 74 61 72 74 72 65 65 28 70 52 74  NodeStartree(pRt
12780 72 65 65 2c 20 61 43 65 6c 6c 2c 20 6e 43 65 6c  ree, aCell, nCel
12790 6c 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  l, pLeft, pRight
127a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
127b0 20 20 20 20 20 20 20 20 20 20 20 26 6c 65 66 74             &left
127c0 62 62 6f 78 2c 20 26 72 69 67 68 74 62 62 6f 78  bbox, &rightbbox
127d0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
127e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
127f0 74 6f 20 73 70 6c 69 74 6e 6f 64 65 5f 6f 75 74  to splitnode_out
12800 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 6e 73 75  ;.  }..  /* Ensu
12810 72 65 20 62 6f 74 68 20 63 68 69 6c 64 20 6e 6f  re both child no
12820 64 65 73 20 68 61 76 65 20 6e 6f 64 65 20 6e 75  des have node nu
12830 6d 62 65 72 73 20 61 73 73 69 67 6e 65 64 20 74  mbers assigned t
12840 6f 20 74 68 65 6d 20 62 79 20 63 61 6c 6c 69 6e  o them by callin
12850 67 0a 20 20 2a 2a 20 6e 6f 64 65 57 72 69 74 65  g.  ** nodeWrite
12860 28 29 2e 20 4e 6f 64 65 20 70 52 69 67 68 74 20  (). Node pRight 
12870 61 6c 77 61 79 73 20 6e 65 65 64 73 20 61 20 6e  always needs a n
12880 6f 64 65 20 6e 75 6d 62 65 72 2c 20 61 73 20 69  ode number, as i
12890 74 20 77 61 73 20 63 72 65 61 74 65 64 0a 20 20  t was created.  
128a0 2a 2a 20 62 79 20 6e 6f 64 65 4e 65 77 28 29 20  ** by nodeNew() 
128b0 61 62 6f 76 65 2e 20 42 75 74 20 6e 6f 64 65 20  above. But node 
128c0 70 4c 65 66 74 20 73 6f 6d 65 74 69 6d 65 73 20  pLeft sometimes 
128d0 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 6e 6f  already has a no
128e0 64 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2a 20  de number..  ** 
128f0 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 76 6f  In this case avo
12900 69 64 20 74 68 65 20 61 6c 6c 20 74 6f 20 6e 6f  id the all to no
12910 64 65 57 72 69 74 65 28 29 2e 0a 20 20 2a 2f 0a  deWrite()..  */.
12920 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
12930 3d 28 72 63 20 3d 20 6e 6f 64 65 57 72 69 74 65  =(rc = nodeWrite
12940 28 70 52 74 72 65 65 2c 20 70 52 69 67 68 74 29  (pRtree, pRight)
12950 29 0a 20 20 20 7c 7c 20 28 30 3d 3d 70 4c 65 66  ).   || (0==pLef
12960 74 2d 3e 69 4e 6f 64 65 20 26 26 20 53 51 4c 49  t->iNode && SQLI
12970 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 6e 6f 64  TE_OK!=(rc = nod
12980 65 57 72 69 74 65 28 70 52 74 72 65 65 2c 20 70  eWrite(pRtree, p
12990 4c 65 66 74 29 29 29 0a 20 20 29 7b 0a 20 20 20  Left))).  ){.   
129a0 20 67 6f 74 6f 20 73 70 6c 69 74 6e 6f 64 65 5f   goto splitnode_
129b0 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 72 69 67 68  out;.  }..  righ
129c0 74 62 62 6f 78 2e 69 52 6f 77 69 64 20 3d 20 70  tbbox.iRowid = p
129d0 52 69 67 68 74 2d 3e 69 4e 6f 64 65 3b 0a 20 20  Right->iNode;.  
129e0 6c 65 66 74 62 62 6f 78 2e 69 52 6f 77 69 64 20  leftbbox.iRowid 
129f0 3d 20 70 4c 65 66 74 2d 3e 69 4e 6f 64 65 3b 0a  = pLeft->iNode;.
12a00 0a 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 69 4e  .  if( pNode->iN
12a10 6f 64 65 3d 3d 31 20 29 7b 0a 20 20 20 20 72 63  ode==1 ){.    rc
12a20 20 3d 20 72 74 72 65 65 49 6e 73 65 72 74 43 65   = rtreeInsertCe
12a30 6c 6c 28 70 52 74 72 65 65 2c 20 70 4c 65 66 74  ll(pRtree, pLeft
12a40 2d 3e 70 50 61 72 65 6e 74 2c 20 26 6c 65 66 74  ->pParent, &left
12a50 62 62 6f 78 2c 20 69 48 65 69 67 68 74 2b 31 29  bbox, iHeight+1)
12a60 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
12a70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12a80 20 67 6f 74 6f 20 73 70 6c 69 74 6e 6f 64 65 5f   goto splitnode_
12a90 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  out;.    }.  }el
12aa0 73 65 7b 0a 20 20 20 20 52 74 72 65 65 4e 6f 64  se{.    RtreeNod
12ab0 65 20 2a 70 50 61 72 65 6e 74 20 3d 20 70 4c 65  e *pParent = pLe
12ac0 66 74 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20  ft->pParent;.   
12ad0 20 69 6e 74 20 69 43 65 6c 6c 3b 0a 20 20 20 20   int iCell;.    
12ae0 72 63 20 3d 20 6e 6f 64 65 50 61 72 65 6e 74 49  rc = nodeParentI
12af0 6e 64 65 78 28 70 52 74 72 65 65 2c 20 70 4c 65  ndex(pRtree, pLe
12b00 66 74 2c 20 26 69 43 65 6c 6c 29 3b 0a 20 20 20  ft, &iCell);.   
12b10 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
12b20 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 6f 64 65  OK ){.      node
12b30 4f 76 65 72 77 72 69 74 65 43 65 6c 6c 28 70 52  OverwriteCell(pR
12b40 74 72 65 65 2c 20 70 50 61 72 65 6e 74 2c 20 26  tree, pParent, &
12b50 6c 65 66 74 62 62 6f 78 2c 20 69 43 65 6c 6c 29  leftbbox, iCell)
12b60 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 41 64 6a  ;.      rc = Adj
12b70 75 73 74 54 72 65 65 28 70 52 74 72 65 65 2c 20  ustTree(pRtree, 
12b80 70 50 61 72 65 6e 74 2c 20 26 6c 65 66 74 62 62  pParent, &leftbb
12b90 6f 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ox);.    }.    i
12ba0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
12bb0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
12bc0 70 6c 69 74 6e 6f 64 65 5f 6f 75 74 3b 0a 20 20  plitnode_out;.  
12bd0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 72    }.  }.  if( (r
12be0 63 20 3d 20 72 74 72 65 65 49 6e 73 65 72 74 43  c = rtreeInsertC
12bf0 65 6c 6c 28 70 52 74 72 65 65 2c 20 70 52 69 67  ell(pRtree, pRig
12c00 68 74 2d 3e 70 50 61 72 65 6e 74 2c 20 26 72 69  ht->pParent, &ri
12c10 67 68 74 62 62 6f 78 2c 20 69 48 65 69 67 68 74  ghtbbox, iHeight
12c20 2b 31 29 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  +1)) ){.    goto
12c30 20 73 70 6c 69 74 6e 6f 64 65 5f 6f 75 74 3b 0a   splitnode_out;.
12c40 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20    }..  for(i=0; 
12c50 69 3c 4e 43 45 4c 4c 28 70 52 69 67 68 74 29 3b  i<NCELL(pRight);
12c60 20 69 2b 2b 29 7b 0a 20 20 20 20 69 36 34 20 69   i++){.    i64 i
12c70 52 6f 77 69 64 20 3d 20 6e 6f 64 65 47 65 74 52  Rowid = nodeGetR
12c80 6f 77 69 64 28 70 52 74 72 65 65 2c 20 70 52 69  owid(pRtree, pRi
12c90 67 68 74 2c 20 69 29 3b 0a 20 20 20 20 72 63 20  ght, i);.    rc 
12ca0 3d 20 75 70 64 61 74 65 4d 61 70 70 69 6e 67 28  = updateMapping(
12cb0 70 52 74 72 65 65 2c 20 69 52 6f 77 69 64 2c 20  pRtree, iRowid, 
12cc0 70 52 69 67 68 74 2c 20 69 48 65 69 67 68 74 29  pRight, iHeight)
12cd0 3b 0a 20 20 20 20 69 66 28 20 69 52 6f 77 69 64  ;.    if( iRowid
12ce0 3d 3d 70 43 65 6c 6c 2d 3e 69 52 6f 77 69 64 20  ==pCell->iRowid 
12cf0 29 7b 0a 20 20 20 20 20 20 6e 65 77 43 65 6c 6c  ){.      newCell
12d00 49 73 52 69 67 68 74 20 3d 20 31 3b 0a 20 20 20  IsRight = 1;.   
12d10 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
12d20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12d30 20 20 67 6f 74 6f 20 73 70 6c 69 74 6e 6f 64 65    goto splitnode
12d40 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _out;.    }.  }.
12d50 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 69 4e 6f    if( pNode->iNo
12d60 64 65 3d 3d 31 20 29 7b 0a 20 20 20 20 66 6f 72  de==1 ){.    for
12d70 28 69 3d 30 3b 20 69 3c 4e 43 45 4c 4c 28 70 4c  (i=0; i<NCELL(pL
12d80 65 66 74 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  eft); i++){.    
12d90 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 6e    i64 iRowid = n
12da0 6f 64 65 47 65 74 52 6f 77 69 64 28 70 52 74 72  odeGetRowid(pRtr
12db0 65 65 2c 20 70 4c 65 66 74 2c 20 69 29 3b 0a 20  ee, pLeft, i);. 
12dc0 20 20 20 20 20 72 63 20 3d 20 75 70 64 61 74 65       rc = update
12dd0 4d 61 70 70 69 6e 67 28 70 52 74 72 65 65 2c 20  Mapping(pRtree, 
12de0 69 52 6f 77 69 64 2c 20 70 4c 65 66 74 2c 20 69  iRowid, pLeft, i
12df0 48 65 69 67 68 74 29 3b 0a 20 20 20 20 20 20 69  Height);.      i
12e00 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
12e10 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
12e20 20 73 70 6c 69 74 6e 6f 64 65 5f 6f 75 74 3b 0a   splitnode_out;.
12e30 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
12e40 7d 65 6c 73 65 20 69 66 28 20 6e 65 77 43 65 6c  }else if( newCel
12e50 6c 49 73 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20  lIsRight==0 ){. 
12e60 20 20 20 72 63 20 3d 20 75 70 64 61 74 65 4d 61     rc = updateMa
12e70 70 70 69 6e 67 28 70 52 74 72 65 65 2c 20 70 43  pping(pRtree, pC
12e80 65 6c 6c 2d 3e 69 52 6f 77 69 64 2c 20 70 4c 65  ell->iRowid, pLe
12e90 66 74 2c 20 69 48 65 69 67 68 74 29 3b 0a 20 20  ft, iHeight);.  
12ea0 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
12eb0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
12ec0 20 3d 20 6e 6f 64 65 52 65 6c 65 61 73 65 28 70   = nodeRelease(p
12ed0 52 74 72 65 65 2c 20 70 52 69 67 68 74 29 3b 0a  Rtree, pRight);.
12ee0 20 20 20 20 70 52 69 67 68 74 20 3d 20 30 3b 0a      pRight = 0;.
12ef0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
12f00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
12f10 63 20 3d 20 6e 6f 64 65 52 65 6c 65 61 73 65 28  c = nodeRelease(
12f20 70 52 74 72 65 65 2c 20 70 4c 65 66 74 29 3b 0a  pRtree, pLeft);.
12f30 20 20 20 20 70 4c 65 66 74 20 3d 20 30 3b 0a 20      pLeft = 0;. 
12f40 20 7d 0a 0a 73 70 6c 69 74 6e 6f 64 65 5f 6f 75   }..splitnode_ou
12f50 74 3a 0a 20 20 6e 6f 64 65 52 65 6c 65 61 73 65  t:.  nodeRelease
12f60 28 70 52 74 72 65 65 2c 20 70 52 69 67 68 74 29  (pRtree, pRight)
12f70 3b 0a 20 20 6e 6f 64 65 52 65 6c 65 61 73 65 28  ;.  nodeRelease(
12f80 70 52 74 72 65 65 2c 20 70 4c 65 66 74 29 3b 0a  pRtree, pLeft);.
12f90 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
12fa0 43 65 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20  Cell);.  return 
12fb0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  rc;.}../*.** If 
12fc0 6e 6f 64 65 20 70 4c 65 61 66 20 69 73 20 6e 6f  node pLeaf is no
12fd0 74 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68  t the root of th
12fe0 65 20 72 2d 74 72 65 65 20 61 6e 64 20 69 74 73  e r-tree and its
12ff0 20 70 50 61 72 65 6e 74 20 70 6f 69 6e 74 65 72   pParent pointer
13000 20 69 73 20 0a 2a 2a 20 73 74 69 6c 6c 20 4e 55   is .** still NU
13010 4c 4c 2c 20 6c 6f 61 64 20 61 6c 6c 20 61 6e 63  LL, load all anc
13020 65 73 74 6f 72 20 6e 6f 64 65 73 20 6f 66 20 70  estor nodes of p
13030 4c 65 61 66 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  Leaf into memory
13040 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 0a 2a 2a   and populate.**
13050 20 74 68 65 20 70 4c 65 61 66 2d 3e 70 50 61 72   the pLeaf->pPar
13060 65 6e 74 20 63 68 61 69 6e 20 61 6c 6c 20 74 68  ent chain all th
13070 65 20 77 61 79 20 75 70 20 74 6f 20 74 68 65 20  e way up to the 
13080 72 6f 6f 74 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a  root node..**.**
13090 20 54 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20   This operation 
130a0 69 73 20 72 65 71 75 69 72 65 64 20 77 68 65 6e  is required when
130b0 20 61 20 72 6f 77 20 69 73 20 64 65 6c 65 74 65   a row is delete
130c0 64 20 28 6f 72 20 75 70 64 61 74 65 64 20 2d 20  d (or updated - 
130d0 61 6e 20 75 70 64 61 74 65 0a 2a 2a 20 69 73 20  an update.** is 
130e0 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61  implemented as a
130f0 20 64 65 6c 65 74 65 20 66 6f 6c 6c 6f 77 65 64   delete followed
13100 20 62 79 20 61 6e 20 69 6e 73 65 72 74 29 2e 20   by an insert). 
13110 53 51 4c 69 74 65 20 70 72 6f 76 69 64 65 73 20  SQLite provides 
13120 74 68 65 0a 2a 2a 20 72 6f 77 69 64 20 6f 66 20  the.** rowid of 
13130 74 68 65 20 72 6f 77 20 74 6f 20 64 65 6c 65 74  the row to delet
13140 65 2c 20 77 68 69 63 68 20 63 61 6e 20 62 65 20  e, which can be 
13150 75 73 65 64 20 74 6f 20 66 69 6e 64 20 74 68 65  used to find the
13160 20 6c 65 61 66 20 6f 6e 20 77 68 69 63 68 0a 2a   leaf on which.*
13170 2a 20 74 68 65 20 65 6e 74 72 79 20 72 65 73 69  * the entry resi
13180 64 65 73 20 28 61 72 67 75 6d 65 6e 74 20 70 4c  des (argument pL
13190 65 61 66 29 2e 20 4f 6e 63 65 20 74 68 65 20 6c  eaf). Once the l
131a0 65 61 66 20 69 73 20 6c 6f 63 61 74 65 64 2c 20  eaf is located, 
131b0 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  this .** functio
131c0 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 64  n is called to d
131d0 65 74 65 72 6d 69 6e 65 20 69 74 73 20 61 6e 63  etermine its anc
131e0 65 73 74 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  estry..*/.static
131f0 20 69 6e 74 20 66 69 78 4c 65 61 66 50 61 72 65   int fixLeafPare
13200 6e 74 28 52 74 72 65 65 20 2a 70 52 74 72 65 65  nt(Rtree *pRtree
13210 2c 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 4c 65  , RtreeNode *pLe
13220 61 66 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  af){.  int rc = 
13230 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 52 74 72  SQLITE_OK;.  Rtr
13240 65 65 4e 6f 64 65 20 2a 70 43 68 69 6c 64 20 3d  eeNode *pChild =
13250 20 70 4c 65 61 66 3b 0a 20 20 77 68 69 6c 65 28   pLeaf;.  while(
13260 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
13270 26 20 70 43 68 69 6c 64 2d 3e 69 4e 6f 64 65 21  & pChild->iNode!
13280 3d 31 20 26 26 20 70 43 68 69 6c 64 2d 3e 70 50  =1 && pChild->pP
13290 61 72 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20  arent==0 ){.    
132a0 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45  int rc2 = SQLITE
132b0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  _OK;          /*
132c0 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 29   sqlite3_reset()
132d0 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
132e0 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
132f0 5f 69 6e 74 36 34 28 70 52 74 72 65 65 2d 3e 70  _int64(pRtree->p
13300 52 65 61 64 50 61 72 65 6e 74 2c 20 31 2c 20 70  ReadParent, 1, p
13310 43 68 69 6c 64 2d 3e 69 4e 6f 64 65 29 3b 0a 20  Child->iNode);. 
13320 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
13330 73 74 65 70 28 70 52 74 72 65 65 2d 3e 70 52 65  step(pRtree->pRe
13340 61 64 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 69  adParent);.    i
13350 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f  f( rc==SQLITE_RO
13360 57 20 29 7b 0a 20 20 20 20 20 20 52 74 72 65 65  W ){.      Rtree
13370 4e 6f 64 65 20 2a 70 54 65 73 74 3b 20 20 20 20  Node *pTest;    
13380 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
13390 6f 20 74 65 73 74 20 66 6f 72 20 72 65 66 65 72  o test for refer
133a0 65 6e 63 65 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20  ence loops */.  
133b0 20 20 20 20 69 36 34 20 69 4e 6f 64 65 3b 20 20      i64 iNode;  
133c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
133d0 2f 2a 20 4e 6f 64 65 20 6e 75 6d 62 65 72 20 6f  /* Node number o
133e0 66 20 70 61 72 65 6e 74 20 6e 6f 64 65 20 2a 2f  f parent node */
133f0 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65 66 6f 72  ..      /* Befor
13400 65 20 73 65 74 74 69 6e 67 20 70 43 68 69 6c 64  e setting pChild
13410 2d 3e 70 50 61 72 65 6e 74 2c 20 74 65 73 74 20  ->pParent, test 
13420 74 68 61 74 20 77 65 20 61 72 65 20 6e 6f 74 20  that we are not 
13430 63 72 65 61 74 69 6e 67 20 61 0a 20 20 20 20 20  creating a.     
13440 20 2a 2a 20 6c 6f 6f 70 20 6f 66 20 72 65 66 65   ** loop of refe
13450 72 65 6e 63 65 73 20 28 61 73 20 77 65 20 77 6f  rences (as we wo
13460 75 6c 64 20 69 66 2c 20 73 61 79 2c 20 70 43 68  uld if, say, pCh
13470 69 6c 64 3d 3d 70 50 61 72 65 6e 74 29 2e 20 57  ild==pParent). W
13480 65 20 64 6f 6e 27 74 0a 20 20 20 20 20 20 2a 2a  e don't.      **
13490 20 77 61 6e 74 20 74 6f 20 64 6f 20 74 68 69 73   want to do this
134a0 20 61 73 20 69 74 20 6c 65 61 64 73 20 74 6f 20   as it leads to 
134b0 61 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 77 68  a memory leak wh
134c0 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 64 65 6c  en trying to del
134d0 65 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ete.      ** the
134e0 20 72 65 66 65 72 65 6e 63 65 64 20 63 6f 75 6e   referenced coun
134f0 74 65 64 20 6e 6f 64 65 20 73 74 72 75 63 74 75  ted node structu
13500 72 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  res..      */.  
13510 20 20 20 20 69 4e 6f 64 65 20 3d 20 73 71 6c 69      iNode = sqli
13520 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
13530 28 70 52 74 72 65 65 2d 3e 70 52 65 61 64 50 61  (pRtree->pReadPa
13540 72 65 6e 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  rent, 0);.      
13550 66 6f 72 28 70 54 65 73 74 3d 70 4c 65 61 66 3b  for(pTest=pLeaf;
13560 20 70 54 65 73 74 20 26 26 20 70 54 65 73 74 2d   pTest && pTest-
13570 3e 69 4e 6f 64 65 21 3d 69 4e 6f 64 65 3b 20 70  >iNode!=iNode; p
13580 54 65 73 74 3d 70 54 65 73 74 2d 3e 70 50 61 72  Test=pTest->pPar
13590 65 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ent);.      if( 
135a0 21 70 54 65 73 74 20 29 7b 0a 20 20 20 20 20 20  !pTest ){.      
135b0 20 20 72 63 32 20 3d 20 6e 6f 64 65 41 63 71 75    rc2 = nodeAcqu
135c0 69 72 65 28 70 52 74 72 65 65 2c 20 69 4e 6f 64  ire(pRtree, iNod
135d0 65 2c 20 30 2c 20 26 70 43 68 69 6c 64 2d 3e 70  e, 0, &pChild->p
135e0 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 7d  Parent);.      }
135f0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
13600 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 52  sqlite3_reset(pR
13610 74 72 65 65 2d 3e 70 52 65 61 64 50 61 72 65 6e  tree->pReadParen
13620 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  t);.    if( rc==
13630 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d  SQLITE_OK ) rc =
13640 20 72 63 32 3b 0a 20 20 20 20 69 66 28 20 72 63   rc2;.    if( rc
13650 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
13660 70 43 68 69 6c 64 2d 3e 70 50 61 72 65 6e 74 20  pChild->pParent 
13670 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  ) rc = SQLITE_CO
13680 52 52 55 50 54 5f 56 54 41 42 3b 0a 20 20 20 20  RRUPT_VTAB;.    
13690 70 43 68 69 6c 64 20 3d 20 70 43 68 69 6c 64 2d  pChild = pChild-
136a0 3e 70 50 61 72 65 6e 74 3b 0a 20 20 7d 0a 20 20  >pParent;.  }.  
136b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74  return rc;.}..st
136c0 61 74 69 63 20 69 6e 74 20 64 65 6c 65 74 65 43  atic int deleteC
136d0 65 6c 6c 28 52 74 72 65 65 20 2a 2c 20 52 74 72  ell(Rtree *, Rtr
136e0 65 65 4e 6f 64 65 20 2a 2c 20 69 6e 74 2c 20 69  eeNode *, int, i
136f0 6e 74 29 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74  nt);..static int
13700 20 72 65 6d 6f 76 65 4e 6f 64 65 28 52 74 72 65   removeNode(Rtre
13710 65 20 2a 70 52 74 72 65 65 2c 20 52 74 72 65 65  e *pRtree, Rtree
13720 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 20 69 6e 74  Node *pNode, int
13730 20 69 48 65 69 67 68 74 29 7b 0a 20 20 69 6e 74   iHeight){.  int
13740 20 72 63 3b 0a 20 20 69 6e 74 20 72 63 32 3b 0a   rc;.  int rc2;.
13750 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 50 61    RtreeNode *pPa
13760 72 65 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  rent = 0;.  int 
13770 69 43 65 6c 6c 3b 0a 0a 20 20 61 73 73 65 72 74  iCell;..  assert
13780 28 20 70 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 31  ( pNode->nRef==1
13790 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65   );..  /* Remove
137a0 20 74 68 65 20 65 6e 74 72 79 20 69 6e 20 74 68   the entry in th
137b0 65 20 70 61 72 65 6e 74 20 63 65 6c 6c 2e 20 2a  e parent cell. *
137c0 2f 0a 20 20 72 63 20 3d 20 6e 6f 64 65 50 61 72  /.  rc = nodePar
137d0 65 6e 74 49 6e 64 65 78 28 70 52 74 72 65 65 2c  entIndex(pRtree,
137e0 20 70 4e 6f 64 65 2c 20 26 69 43 65 6c 6c 29 3b   pNode, &iCell);
137f0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
13800 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 72  E_OK ){.    pPar
13810 65 6e 74 20 3d 20 70 4e 6f 64 65 2d 3e 70 50 61  ent = pNode->pPa
13820 72 65 6e 74 3b 0a 20 20 20 20 70 4e 6f 64 65 2d  rent;.    pNode-
13830 3e 70 50 61 72 65 6e 74 20 3d 20 30 3b 0a 20 20  >pParent = 0;.  
13840 20 20 72 63 20 3d 20 64 65 6c 65 74 65 43 65 6c    rc = deleteCel
13850 6c 28 70 52 74 72 65 65 2c 20 70 50 61 72 65 6e  l(pRtree, pParen
13860 74 2c 20 69 43 65 6c 6c 2c 20 69 48 65 69 67 68  t, iCell, iHeigh
13870 74 2b 31 29 3b 0a 20 20 7d 0a 20 20 72 63 32 20  t+1);.  }.  rc2 
13880 3d 20 6e 6f 64 65 52 65 6c 65 61 73 65 28 70 52  = nodeRelease(pR
13890 74 72 65 65 2c 20 70 50 61 72 65 6e 74 29 3b 0a  tree, pParent);.
138a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
138b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
138c0 72 63 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  rc2;.  }.  if( r
138d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
138e0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
138f0 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20   }..  /* Remove 
13900 74 68 65 20 78 78 78 5f 6e 6f 64 65 20 65 6e 74  the xxx_node ent
13910 72 79 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ry. */.  sqlite3
13920 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 52 74 72  _bind_int64(pRtr
13930 65 65 2d 3e 70 44 65 6c 65 74 65 4e 6f 64 65 2c  ee->pDeleteNode,
13940 20 31 2c 20 70 4e 6f 64 65 2d 3e 69 4e 6f 64 65   1, pNode->iNode
13950 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65  );.  sqlite3_ste
13960 70 28 70 52 74 72 65 65 2d 3e 70 44 65 6c 65 74  p(pRtree->pDelet
13970 65 4e 6f 64 65 29 3b 0a 20 20 69 66 28 20 53 51  eNode);.  if( SQ
13980 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
13990 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 52 74  qlite3_reset(pRt
139a0 72 65 65 2d 3e 70 44 65 6c 65 74 65 4e 6f 64 65  ree->pDeleteNode
139b0 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  )) ){.    return
139c0 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52   rc;.  }..  /* R
139d0 65 6d 6f 76 65 20 74 68 65 20 78 78 78 5f 70 61  emove the xxx_pa
139e0 72 65 6e 74 20 65 6e 74 72 79 2e 20 2a 2f 0a 20  rent entry. */. 
139f0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
13a00 74 36 34 28 70 52 74 72 65 65 2d 3e 70 44 65 6c  t64(pRtree->pDel
13a10 65 74 65 50 61 72 65 6e 74 2c 20 31 2c 20 70 4e  eteParent, 1, pN
13a20 6f 64 65 2d 3e 69 4e 6f 64 65 29 3b 0a 20 20 73  ode->iNode);.  s
13a30 71 6c 69 74 65 33 5f 73 74 65 70 28 70 52 74 72  qlite3_step(pRtr
13a40 65 65 2d 3e 70 44 65 6c 65 74 65 50 61 72 65 6e  ee->pDeleteParen
13a50 74 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45  t);.  if( SQLITE
13a60 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
13a70 65 33 5f 72 65 73 65 74 28 70 52 74 72 65 65 2d  e3_reset(pRtree-
13a80 3e 70 44 65 6c 65 74 65 50 61 72 65 6e 74 29 29  >pDeleteParent))
13a90 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
13aa0 63 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 52  c;.  }.  .  /* R
13ab0 65 6d 6f 76 65 20 74 68 65 20 6e 6f 64 65 20 66  emove the node f
13ac0 72 6f 6d 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  rom the in-memor
13ad0 79 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64  y hash table and
13ae0 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 0a 20 20   link it into.  
13af0 2a 2a 20 74 68 65 20 52 74 72 65 65 2e 70 44 65  ** the Rtree.pDe
13b00 6c 65 74 65 64 20 6c 69 73 74 2e 20 49 74 73 20  leted list. Its 
13b10 63 6f 6e 74 65 6e 74 73 20 77 69 6c 6c 20 62 65  contents will be
13b20 20 72 65 2d 69 6e 73 65 72 74 65 64 20 6c 61 74   re-inserted lat
13b30 65 72 20 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 6e 6f  er on..  */.  no
13b40 64 65 48 61 73 68 44 65 6c 65 74 65 28 70 52 74  deHashDelete(pRt
13b50 72 65 65 2c 20 70 4e 6f 64 65 29 3b 0a 20 20 70  ree, pNode);.  p
13b60 4e 6f 64 65 2d 3e 69 4e 6f 64 65 20 3d 20 69 48  Node->iNode = iH
13b70 65 69 67 68 74 3b 0a 20 20 70 4e 6f 64 65 2d 3e  eight;.  pNode->
13b80 70 4e 65 78 74 20 3d 20 70 52 74 72 65 65 2d 3e  pNext = pRtree->
13b90 70 44 65 6c 65 74 65 64 3b 0a 20 20 70 4e 6f 64  pDeleted;.  pNod
13ba0 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 52 74  e->nRef++;.  pRt
13bb0 72 65 65 2d 3e 70 44 65 6c 65 74 65 64 20 3d 20  ree->pDeleted = 
13bc0 70 4e 6f 64 65 3b 0a 0a 20 20 72 65 74 75 72 6e  pNode;..  return
13bd0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73   SQLITE_OK;.}..s
13be0 74 61 74 69 63 20 69 6e 74 20 66 69 78 42 6f 75  tatic int fixBou
13bf0 6e 64 69 6e 67 42 6f 78 28 52 74 72 65 65 20 2a  ndingBox(Rtree *
13c00 70 52 74 72 65 65 2c 20 52 74 72 65 65 4e 6f 64  pRtree, RtreeNod
13c10 65 20 2a 70 4e 6f 64 65 29 7b 0a 20 20 52 74 72  e *pNode){.  Rtr
13c20 65 65 4e 6f 64 65 20 2a 70 50 61 72 65 6e 74 20  eeNode *pParent 
13c30 3d 20 70 4e 6f 64 65 2d 3e 70 50 61 72 65 6e 74  = pNode->pParent
13c40 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
13c50 49 54 45 5f 4f 4b 3b 20 0a 20 20 69 66 28 20 70  ITE_OK; .  if( p
13c60 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 69 6e  Parent ){.    in
13c70 74 20 69 69 3b 20 0a 20 20 20 20 69 6e 74 20 6e  t ii; .    int n
13c80 43 65 6c 6c 20 3d 20 4e 43 45 4c 4c 28 70 4e 6f  Cell = NCELL(pNo
13c90 64 65 29 3b 0a 20 20 20 20 52 74 72 65 65 43 65  de);.    RtreeCe
13ca0 6c 6c 20 62 6f 78 3b 20 20 20 20 20 20 20 20 20  ll box;         
13cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13cc0 20 20 20 2f 2a 20 42 6f 75 6e 64 69 6e 67 20 62     /* Bounding b
13cd0 6f 78 20 66 6f 72 20 70 4e 6f 64 65 20 2a 2f 0a  ox for pNode */.
13ce0 20 20 20 20 6e 6f 64 65 47 65 74 43 65 6c 6c 28      nodeGetCell(
13cf0 70 52 74 72 65 65 2c 20 70 4e 6f 64 65 2c 20 30  pRtree, pNode, 0
13d00 2c 20 26 62 6f 78 29 3b 0a 20 20 20 20 66 6f 72  , &box);.    for
13d10 28 69 69 3d 31 3b 20 69 69 3c 6e 43 65 6c 6c 3b  (ii=1; ii<nCell;
13d20 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 52 74   ii++){.      Rt
13d30 72 65 65 43 65 6c 6c 20 63 65 6c 6c 3b 0a 20 20  reeCell cell;.  
13d40 20 20 20 20 6e 6f 64 65 47 65 74 43 65 6c 6c 28      nodeGetCell(
13d50 70 52 74 72 65 65 2c 20 70 4e 6f 64 65 2c 20 69  pRtree, pNode, i
13d60 69 2c 20 26 63 65 6c 6c 29 3b 0a 20 20 20 20 20  i, &cell);.     
13d70 20 63 65 6c 6c 55 6e 69 6f 6e 28 70 52 74 72 65   cellUnion(pRtre
13d80 65 2c 20 26 62 6f 78 2c 20 26 63 65 6c 6c 29 3b  e, &box, &cell);
13d90 0a 20 20 20 20 7d 0a 20 20 20 20 62 6f 78 2e 69  .    }.    box.i
13da0 52 6f 77 69 64 20 3d 20 70 4e 6f 64 65 2d 3e 69  Rowid = pNode->i
13db0 4e 6f 64 65 3b 0a 20 20 20 20 72 63 20 3d 20 6e  Node;.    rc = n
13dc0 6f 64 65 50 61 72 65 6e 74 49 6e 64 65 78 28 70  odeParentIndex(p
13dd0 52 74 72 65 65 2c 20 70 4e 6f 64 65 2c 20 26 69  Rtree, pNode, &i
13de0 69 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  i);.    if( rc==
13df0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13e00 20 20 20 6e 6f 64 65 4f 76 65 72 77 72 69 74 65     nodeOverwrite
13e10 43 65 6c 6c 28 70 52 74 72 65 65 2c 20 70 50 61  Cell(pRtree, pPa
13e20 72 65 6e 74 2c 20 26 62 6f 78 2c 20 69 69 29 3b  rent, &box, ii);
13e30 0a 20 20 20 20 20 20 72 63 20 3d 20 66 69 78 42  .      rc = fixB
13e40 6f 75 6e 64 69 6e 67 42 6f 78 28 70 52 74 72 65  oundingBox(pRtre
13e50 65 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20 20 20  e, pParent);.   
13e60 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
13e70 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  rc;.}../*.** Del
13e80 65 74 65 20 74 68 65 20 63 65 6c 6c 20 61 74 20  ete the cell at 
13e90 69 6e 64 65 78 20 69 43 65 6c 6c 20 6f 66 20 6e  index iCell of n
13ea0 6f 64 65 20 70 4e 6f 64 65 2e 20 41 66 74 65 72  ode pNode. After
13eb0 20 72 65 6d 6f 76 69 6e 67 20 74 68 65 0a 2a 2a   removing the.**
13ec0 20 63 65 6c 6c 2c 20 61 64 6a 75 73 74 20 74 68   cell, adjust th
13ed0 65 20 72 2d 74 72 65 65 20 64 61 74 61 20 73 74  e r-tree data st
13ee0 72 75 63 74 75 72 65 20 69 66 20 72 65 71 75 69  ructure if requi
13ef0 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  red..*/.static i
13f00 6e 74 20 64 65 6c 65 74 65 43 65 6c 6c 28 52 74  nt deleteCell(Rt
13f10 72 65 65 20 2a 70 52 74 72 65 65 2c 20 52 74 72  ree *pRtree, Rtr
13f20 65 65 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 20 69  eeNode *pNode, i
13f30 6e 74 20 69 43 65 6c 6c 2c 20 69 6e 74 20 69 48  nt iCell, int iH
13f40 65 69 67 68 74 29 7b 0a 20 20 52 74 72 65 65 4e  eight){.  RtreeN
13f50 6f 64 65 20 2a 70 50 61 72 65 6e 74 3b 0a 20 20  ode *pParent;.  
13f60 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 53  int rc;..  if( S
13f70 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
13f80 66 69 78 4c 65 61 66 50 61 72 65 6e 74 28 70 52  fixLeafParent(pR
13f90 74 72 65 65 2c 20 70 4e 6f 64 65 29 29 20 29 7b  tree, pNode)) ){
13fa0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
13fb0 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65    }..  /* Remove
13fc0 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 74   the cell from t
13fd0 68 65 20 6e 6f 64 65 2e 20 54 68 69 73 20 63 61  he node. This ca
13fe0 6c 6c 20 6a 75 73 74 20 6d 6f 76 65 73 20 62 79  ll just moves by
13ff0 74 65 73 20 61 72 6f 75 6e 64 0a 20 20 2a 2a 20  tes around.  ** 
14000 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6e 6f  the in-memory no
14010 64 65 20 69 6d 61 67 65 2c 20 73 6f 20 69 74 20  de image, so it 
14020 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 0a 20 20 2a  cannot fail..  *
14030 2f 0a 20 20 6e 6f 64 65 44 65 6c 65 74 65 43 65  /.  nodeDeleteCe
14040 6c 6c 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65  ll(pRtree, pNode
14050 2c 20 69 43 65 6c 6c 29 3b 0a 0a 20 20 2f 2a 20  , iCell);..  /* 
14060 49 66 20 74 68 65 20 6e 6f 64 65 20 69 73 20 6e  If the node is n
14070 6f 74 20 74 68 65 20 74 72 65 65 20 72 6f 6f 74  ot the tree root
14080 20 61 6e 64 20 6e 6f 77 20 68 61 73 20 6c 65 73   and now has les
14090 73 20 74 68 61 6e 20 74 68 65 20 6d 69 6e 69 6d  s than the minim
140a0 75 6d 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f  um.  ** number o
140b0 66 20 63 65 6c 6c 73 2c 20 72 65 6d 6f 76 65 20  f cells, remove 
140c0 69 74 20 66 72 6f 6d 20 74 68 65 20 74 72 65 65  it from the tree
140d0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75 70 64  . Otherwise, upd
140e0 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c  ate the.  ** cel
140f0 6c 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20  l in the parent 
14100 6e 6f 64 65 20 73 6f 20 74 68 61 74 20 69 74 20  node so that it 
14110 74 69 67 68 74 6c 79 20 63 6f 6e 74 61 69 6e 73  tightly contains
14120 20 74 68 65 20 75 70 64 61 74 65 64 0a 20 20 2a   the updated.  *
14130 2a 20 6e 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 70  * node..  */.  p
14140 50 61 72 65 6e 74 20 3d 20 70 4e 6f 64 65 2d 3e  Parent = pNode->
14150 70 50 61 72 65 6e 74 3b 0a 20 20 61 73 73 65 72  pParent;.  asser
14160 74 28 20 70 50 61 72 65 6e 74 20 7c 7c 20 70 4e  t( pParent || pN
14170 6f 64 65 2d 3e 69 4e 6f 64 65 3d 3d 31 20 29 3b  ode->iNode==1 );
14180 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74 20 29  .  if( pParent )
14190 7b 0a 20 20 20 20 69 66 28 20 4e 43 45 4c 4c 28  {.    if( NCELL(
141a0 70 4e 6f 64 65 29 3c 52 54 52 45 45 5f 4d 49 4e  pNode)<RTREE_MIN
141b0 43 45 4c 4c 53 28 70 52 74 72 65 65 29 20 29 7b  CELLS(pRtree) ){
141c0 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 6d 6f  .      rc = remo
141d0 76 65 4e 6f 64 65 28 70 52 74 72 65 65 2c 20 70  veNode(pRtree, p
141e0 4e 6f 64 65 2c 20 69 48 65 69 67 68 74 29 3b 0a  Node, iHeight);.
141f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14200 20 72 63 20 3d 20 66 69 78 42 6f 75 6e 64 69 6e   rc = fixBoundin
14210 67 42 6f 78 28 70 52 74 72 65 65 2c 20 70 4e 6f  gBox(pRtree, pNo
14220 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  de);.    }.  }..
14230 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
14240 73 74 61 74 69 63 20 69 6e 74 20 52 65 69 6e 73  static int Reins
14250 65 72 74 28 0a 20 20 52 74 72 65 65 20 2a 70 52  ert(.  Rtree *pR
14260 74 72 65 65 2c 20 0a 20 20 52 74 72 65 65 4e 6f  tree, .  RtreeNo
14270 64 65 20 2a 70 4e 6f 64 65 2c 20 0a 20 20 52 74  de *pNode, .  Rt
14280 72 65 65 43 65 6c 6c 20 2a 70 43 65 6c 6c 2c 20  reeCell *pCell, 
14290 0a 20 20 69 6e 74 20 69 48 65 69 67 68 74 0a 29  .  int iHeight.)
142a0 7b 0a 20 20 69 6e 74 20 2a 61 4f 72 64 65 72 3b  {.  int *aOrder;
142b0 0a 20 20 69 6e 74 20 2a 61 53 70 61 72 65 3b 0a  .  int *aSpare;.
142c0 20 20 52 74 72 65 65 43 65 6c 6c 20 2a 61 43 65    RtreeCell *aCe
142d0 6c 6c 3b 0a 20 20 52 74 72 65 65 44 56 61 6c 75  ll;.  RtreeDValu
142e0 65 20 2a 61 44 69 73 74 61 6e 63 65 3b 0a 20 20  e *aDistance;.  
142f0 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 52 74 72  int nCell;.  Rtr
14300 65 65 44 56 61 6c 75 65 20 61 43 65 6e 74 65 72  eeDValue aCenter
14310 43 6f 6f 72 64 5b 52 54 52 45 45 5f 4d 41 58 5f  Coord[RTREE_MAX_
14320 44 49 4d 45 4e 53 49 4f 4e 53 5d 3b 0a 20 20 69  DIMENSIONS];.  i
14330 6e 74 20 69 44 69 6d 3b 0a 20 20 69 6e 74 20 69  nt iDim;.  int i
14340 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  i;.  int rc = SQ
14350 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e  LITE_OK;.  int n
14360 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 61 43 65 6e  ;..  memset(aCen
14370 74 65 72 43 6f 6f 72 64 2c 20 30 2c 20 73 69 7a  terCoord, 0, siz
14380 65 6f 66 28 52 74 72 65 65 44 56 61 6c 75 65 29  eof(RtreeDValue)
14390 2a 52 54 52 45 45 5f 4d 41 58 5f 44 49 4d 45 4e  *RTREE_MAX_DIMEN
143a0 53 49 4f 4e 53 29 3b 0a 0a 20 20 6e 43 65 6c 6c  SIONS);..  nCell
143b0 20 3d 20 4e 43 45 4c 4c 28 70 4e 6f 64 65 29 2b   = NCELL(pNode)+
143c0 31 3b 0a 20 20 6e 20 3d 20 28 6e 43 65 6c 6c 2b  1;.  n = (nCell+
143d0 31 29 26 28 7e 31 29 3b 0a 0a 20 20 2f 2a 20 41  1)&(~1);..  /* A
143e0 6c 6c 6f 63 61 74 65 20 74 68 65 20 62 75 66 66  llocate the buff
143f0 65 72 73 20 75 73 65 64 20 62 79 20 74 68 69 73  ers used by this
14400 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 65 20   operation. The 
14410 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 0a 20 20  allocation is.  
14420 2a 2a 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20  ** relinquished 
14430 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63  before this func
14440 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 20 20  tion returns..  
14450 2a 2f 0a 20 20 61 43 65 6c 6c 20 3d 20 28 52 74  */.  aCell = (Rt
14460 72 65 65 43 65 6c 6c 20 2a 29 73 71 6c 69 74 65  reeCell *)sqlite
14470 33 5f 6d 61 6c 6c 6f 63 28 6e 20 2a 20 28 0a 20  3_malloc(n * (. 
14480 20 20 20 73 69 7a 65 6f 66 28 52 74 72 65 65 43     sizeof(RtreeC
14490 65 6c 6c 29 20 20 20 20 20 2b 20 20 20 20 20 20  ell)     +      
144a0 20 20 20 2f 2a 20 61 43 65 6c 6c 20 61 72 72 61     /* aCell arra
144b0 79 20 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28  y */.    sizeof(
144c0 69 6e 74 29 20 20 20 20 20 20 20 20 20 20 20 2b  int)           +
144d0 20 20 20 20 20 20 20 20 20 2f 2a 20 61 4f 72 64           /* aOrd
144e0 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20  er array */.    
144f0 73 69 7a 65 6f 66 28 69 6e 74 29 20 20 20 20 20  sizeof(int)     
14500 20 20 20 20 20 20 2b 20 20 20 20 20 20 20 20 20        +         
14510 2f 2a 20 61 53 70 61 72 65 20 61 72 72 61 79 20  /* aSpare array 
14520 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28 52 74  */.    sizeof(Rt
14530 72 65 65 44 56 61 6c 75 65 29 20 20 20 20 20 20  reeDValue)      
14540 20 20 20 20 20 20 20 2f 2a 20 61 44 69 73 74 61         /* aDista
14550 6e 63 65 20 61 72 72 61 79 20 2a 2f 0a 20 20 29  nce array */.  )
14560 29 3b 0a 20 20 69 66 28 20 21 61 43 65 6c 6c 20  );.  if( !aCell 
14570 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
14580 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
14590 20 20 61 4f 72 64 65 72 20 20 20 20 3d 20 28 69    aOrder    = (i
145a0 6e 74 20 2a 29 26 61 43 65 6c 6c 5b 6e 5d 3b 0a  nt *)&aCell[n];.
145b0 20 20 61 53 70 61 72 65 20 20 20 20 3d 20 28 69    aSpare    = (i
145c0 6e 74 20 2a 29 26 61 4f 72 64 65 72 5b 6e 5d 3b  nt *)&aOrder[n];
145d0 0a 20 20 61 44 69 73 74 61 6e 63 65 20 3d 20 28  .  aDistance = (
145e0 52 74 72 65 65 44 56 61 6c 75 65 20 2a 29 26 61  RtreeDValue *)&a
145f0 53 70 61 72 65 5b 6e 5d 3b 0a 0a 20 20 66 6f 72  Spare[n];..  for
14600 28 69 69 3d 30 3b 20 69 69 3c 6e 43 65 6c 6c 3b  (ii=0; ii<nCell;
14610 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20   ii++){.    if( 
14620 69 69 3d 3d 28 6e 43 65 6c 6c 2d 31 29 20 29 7b  ii==(nCell-1) ){
14630 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61  .      memcpy(&a
14640 43 65 6c 6c 5b 69 69 5d 2c 20 70 43 65 6c 6c 2c  Cell[ii], pCell,
14650 20 73 69 7a 65 6f 66 28 52 74 72 65 65 43 65 6c   sizeof(RtreeCel
14660 6c 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  l));.    }else{.
14670 20 20 20 20 20 20 6e 6f 64 65 47 65 74 43 65 6c        nodeGetCel
14680 6c 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65 2c  l(pRtree, pNode,
14690 20 69 69 2c 20 26 61 43 65 6c 6c 5b 69 69 5d 29   ii, &aCell[ii])
146a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 4f 72 64  ;.    }.    aOrd
146b0 65 72 5b 69 69 5d 20 3d 20 69 69 3b 0a 20 20 20  er[ii] = ii;.   
146c0 20 66 6f 72 28 69 44 69 6d 3d 30 3b 20 69 44 69   for(iDim=0; iDi
146d0 6d 3c 70 52 74 72 65 65 2d 3e 6e 44 69 6d 3b 20  m<pRtree->nDim; 
146e0 69 44 69 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 61  iDim++){.      a
146f0 43 65 6e 74 65 72 43 6f 6f 72 64 5b 69 44 69 6d  CenterCoord[iDim
14700 5d 20 2b 3d 20 44 43 4f 4f 52 44 28 61 43 65 6c  ] += DCOORD(aCel
14710 6c 5b 69 69 5d 2e 61 43 6f 6f 72 64 5b 69 44 69  l[ii].aCoord[iDi
14720 6d 2a 32 5d 29 3b 0a 20 20 20 20 20 20 61 43 65  m*2]);.      aCe
14730 6e 74 65 72 43 6f 6f 72 64 5b 69 44 69 6d 5d 20  nterCoord[iDim] 
14740 2b 3d 20 44 43 4f 4f 52 44 28 61 43 65 6c 6c 5b  += DCOORD(aCell[
14750 69 69 5d 2e 61 43 6f 6f 72 64 5b 69 44 69 6d 2a  ii].aCoord[iDim*
14760 32 2b 31 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  2+1]);.    }.  }
14770 0a 20 20 66 6f 72 28 69 44 69 6d 3d 30 3b 20 69  .  for(iDim=0; i
14780 44 69 6d 3c 70 52 74 72 65 65 2d 3e 6e 44 69 6d  Dim<pRtree->nDim
14790 3b 20 69 44 69 6d 2b 2b 29 7b 0a 20 20 20 20 61  ; iDim++){.    a
147a0 43 65 6e 74 65 72 43 6f 6f 72 64 5b 69 44 69 6d  CenterCoord[iDim
147b0 5d 20 3d 20 28 61 43 65 6e 74 65 72 43 6f 6f 72  ] = (aCenterCoor
147c0 64 5b 69 44 69 6d 5d 2f 28 6e 43 65 6c 6c 2a 28  d[iDim]/(nCell*(
147d0 52 74 72 65 65 44 56 61 6c 75 65 29 32 29 29 3b  RtreeDValue)2));
147e0 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 69 3d 30  .  }..  for(ii=0
147f0 3b 20 69 69 3c 6e 43 65 6c 6c 3b 20 69 69 2b 2b  ; ii<nCell; ii++
14800 29 7b 0a 20 20 20 20 61 44 69 73 74 61 6e 63 65  ){.    aDistance
14810 5b 69 69 5d 20 3d 20 52 54 52 45 45 5f 5a 45 52  [ii] = RTREE_ZER
14820 4f 3b 0a 20 20 20 20 66 6f 72 28 69 44 69 6d 3d  O;.    for(iDim=
14830 30 3b 20 69 44 69 6d 3c 70 52 74 72 65 65 2d 3e  0; iDim<pRtree->
14840 6e 44 69 6d 3b 20 69 44 69 6d 2b 2b 29 7b 0a 20  nDim; iDim++){. 
14850 20 20 20 20 20 52 74 72 65 65 44 56 61 6c 75 65       RtreeDValue
14860 20 63 6f 6f 72 64 20 3d 20 28 44 43 4f 4f 52 44   coord = (DCOORD
14870 28 61 43 65 6c 6c 5b 69 69 5d 2e 61 43 6f 6f 72  (aCell[ii].aCoor
14880 64 5b 69 44 69 6d 2a 32 2b 31 5d 29 20 2d 20 0a  d[iDim*2+1]) - .
14890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 44                 D
148b0 43 4f 4f 52 44 28 61 43 65 6c 6c 5b 69 69 5d 2e  COORD(aCell[ii].
148c0 61 43 6f 6f 72 64 5b 69 44 69 6d 2a 32 5d 29 29  aCoord[iDim*2]))
148d0 3b 0a 20 20 20 20 20 20 61 44 69 73 74 61 6e 63  ;.      aDistanc
148e0 65 5b 69 69 5d 20 2b 3d 20 28 63 6f 6f 72 64 2d  e[ii] += (coord-
148f0 61 43 65 6e 74 65 72 43 6f 6f 72 64 5b 69 44 69  aCenterCoord[iDi
14900 6d 5d 29 2a 28 63 6f 6f 72 64 2d 61 43 65 6e 74  m])*(coord-aCent
14910 65 72 43 6f 6f 72 64 5b 69 44 69 6d 5d 29 3b 0a  erCoord[iDim]);.
14920 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 53 6f 72      }.  }..  Sor
14930 74 42 79 44 69 73 74 61 6e 63 65 28 61 4f 72 64  tByDistance(aOrd
14940 65 72 2c 20 6e 43 65 6c 6c 2c 20 61 44 69 73 74  er, nCell, aDist
14950 61 6e 63 65 2c 20 61 53 70 61 72 65 29 3b 0a 20  ance, aSpare);. 
14960 20 6e 6f 64 65 5a 65 72 6f 28 70 52 74 72 65 65   nodeZero(pRtree
14970 2c 20 70 4e 6f 64 65 29 3b 0a 0a 20 20 66 6f 72  , pNode);..  for
14980 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  (ii=0; rc==SQLIT
14990 45 5f 4f 4b 20 26 26 20 69 69 3c 28 6e 43 65 6c  E_OK && ii<(nCel
149a0 6c 2d 28 52 54 52 45 45 5f 4d 49 4e 43 45 4c 4c  l-(RTREE_MINCELL
149b0 53 28 70 52 74 72 65 65 29 2b 31 29 29 3b 20 69  S(pRtree)+1)); i
149c0 69 2b 2b 29 7b 0a 20 20 20 20 52 74 72 65 65 43  i++){.    RtreeC
149d0 65 6c 6c 20 2a 70 20 3d 20 26 61 43 65 6c 6c 5b  ell *p = &aCell[
149e0 61 4f 72 64 65 72 5b 69 69 5d 5d 3b 0a 20 20 20  aOrder[ii]];.   
149f0 20 6e 6f 64 65 49 6e 73 65 72 74 43 65 6c 6c 28   nodeInsertCell(
14a00 70 52 74 72 65 65 2c 20 70 4e 6f 64 65 2c 20 70  pRtree, pNode, p
14a10 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52  );.    if( p->iR
14a20 6f 77 69 64 3d 3d 70 43 65 6c 6c 2d 3e 69 52 6f  owid==pCell->iRo
14a30 77 69 64 20 29 7b 0a 20 20 20 20 20 20 69 66 28  wid ){.      if(
14a40 20 69 48 65 69 67 68 74 3d 3d 30 20 29 7b 0a 20   iHeight==0 ){. 
14a50 20 20 20 20 20 20 20 72 63 20 3d 20 72 6f 77 69         rc = rowi
14a60 64 57 72 69 74 65 28 70 52 74 72 65 65 2c 20 70  dWrite(pRtree, p
14a70 2d 3e 69 52 6f 77 69 64 2c 20 70 4e 6f 64 65 2d  ->iRowid, pNode-
14a80 3e 69 4e 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d  >iNode);.      }
14a90 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
14aa0 20 3d 20 70 61 72 65 6e 74 57 72 69 74 65 28 70   = parentWrite(p
14ab0 52 74 72 65 65 2c 20 70 2d 3e 69 52 6f 77 69 64  Rtree, p->iRowid
14ac0 2c 20 70 4e 6f 64 65 2d 3e 69 4e 6f 64 65 29 3b  , pNode->iNode);
14ad0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14ae0 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
14af0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
14b00 20 3d 20 66 69 78 42 6f 75 6e 64 69 6e 67 42 6f   = fixBoundingBo
14b10 78 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65 29  x(pRtree, pNode)
14b20 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 3b 20 72 63  ;.  }.  for(; rc
14b30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
14b40 69 3c 6e 43 65 6c 6c 3b 20 69 69 2b 2b 29 7b 0a  i<nCell; ii++){.
14b50 20 20 20 20 2f 2a 20 46 69 6e 64 20 61 20 6e 6f      /* Find a no
14b60 64 65 20 74 6f 20 73 74 6f 72 65 20 74 68 69 73  de to store this
14b70 20 63 65 6c 6c 20 69 6e 2e 20 70 4e 6f 64 65 2d   cell in. pNode-
14b80 3e 69 4e 6f 64 65 20 63 75 72 72 65 6e 74 6c 79  >iNode currently
14b90 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 2a 2a   contains.    **
14ba0 20 74 68 65 20 68 65 69 67 68 74 20 6f 66 20 74   the height of t
14bb0 68 65 20 73 75 62 2d 74 72 65 65 20 68 65 61 64  he sub-tree head
14bc0 65 64 20 62 79 20 74 68 65 20 63 65 6c 6c 2e 0a  ed by the cell..
14bd0 20 20 20 20 2a 2f 0a 20 20 20 20 52 74 72 65 65      */.    Rtree
14be0 4e 6f 64 65 20 2a 70 49 6e 73 65 72 74 3b 0a 20  Node *pInsert;. 
14bf0 20 20 20 52 74 72 65 65 43 65 6c 6c 20 2a 70 20     RtreeCell *p 
14c00 3d 20 26 61 43 65 6c 6c 5b 61 4f 72 64 65 72 5b  = &aCell[aOrder[
14c10 69 69 5d 5d 3b 0a 20 20 20 20 72 63 20 3d 20 43  ii]];.    rc = C
14c20 68 6f 6f 73 65 4c 65 61 66 28 70 52 74 72 65 65  hooseLeaf(pRtree
14c30 2c 20 70 2c 20 69 48 65 69 67 68 74 2c 20 26 70  , p, iHeight, &p
14c40 49 6e 73 65 72 74 29 3b 0a 20 20 20 20 69 66 28  Insert);.    if(
14c50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
14c60 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32 3b  {.      int rc2;
14c70 0a 20 20 20 20 20 20 72 63 20 3d 20 72 74 72 65  .      rc = rtre
14c80 65 49 6e 73 65 72 74 43 65 6c 6c 28 70 52 74 72  eInsertCell(pRtr
14c90 65 65 2c 20 70 49 6e 73 65 72 74 2c 20 70 2c 20  ee, pInsert, p, 
14ca0 69 48 65 69 67 68 74 29 3b 0a 20 20 20 20 20 20  iHeight);.      
14cb0 72 63 32 20 3d 20 6e 6f 64 65 52 65 6c 65 61 73  rc2 = nodeReleas
14cc0 65 28 70 52 74 72 65 65 2c 20 70 49 6e 73 65 72  e(pRtree, pInser
14cd0 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
14ce0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
14cf0 20 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b         rc = rc2;
14d00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14d10 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   }..  sqlite3_fr
14d20 65 65 28 61 43 65 6c 6c 29 3b 0a 20 20 72 65 74  ee(aCell);.  ret
14d30 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
14d40 20 49 6e 73 65 72 74 20 63 65 6c 6c 20 70 43 65   Insert cell pCe
14d50 6c 6c 20 69 6e 74 6f 20 6e 6f 64 65 20 70 4e 6f  ll into node pNo
14d60 64 65 2e 20 4e 6f 64 65 20 70 4e 6f 64 65 20 69  de. Node pNode i
14d70 73 20 74 68 65 20 68 65 61 64 20 6f 66 20 61 20  s the head of a 
14d80 0a 2a 2a 20 73 75 62 74 72 65 65 20 69 48 65 69  .** subtree iHei
14d90 67 68 74 20 68 69 67 68 20 28 6c 65 61 66 20 6e  ght high (leaf n
14da0 6f 64 65 73 20 68 61 76 65 20 69 48 65 69 67 68  odes have iHeigh
14db0 74 3d 3d 30 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  t==0)..*/.static
14dc0 20 69 6e 74 20 72 74 72 65 65 49 6e 73 65 72 74   int rtreeInsert
14dd0 43 65 6c 6c 28 0a 20 20 52 74 72 65 65 20 2a 70  Cell(.  Rtree *p
14de0 52 74 72 65 65 2c 0a 20 20 52 74 72 65 65 4e 6f  Rtree,.  RtreeNo
14df0 64 65 20 2a 70 4e 6f 64 65 2c 0a 20 20 52 74 72  de *pNode,.  Rtr
14e00 65 65 43 65 6c 6c 20 2a 70 43 65 6c 6c 2c 0a 20  eeCell *pCell,. 
14e10 20 69 6e 74 20 69 48 65 69 67 68 74 0a 29 7b 0a   int iHeight.){.
14e20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
14e30 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 48 65 69  E_OK;.  if( iHei
14e40 67 68 74 3e 30 20 29 7b 0a 20 20 20 20 52 74 72  ght>0 ){.    Rtr
14e50 65 65 4e 6f 64 65 20 2a 70 43 68 69 6c 64 20 3d  eeNode *pChild =
14e60 20 6e 6f 64 65 48 61 73 68 4c 6f 6f 6b 75 70 28   nodeHashLookup(
14e70 70 52 74 72 65 65 2c 20 70 43 65 6c 6c 2d 3e 69  pRtree, pCell->i
14e80 52 6f 77 69 64 29 3b 0a 20 20 20 20 69 66 28 20  Rowid);.    if( 
14e90 70 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20  pChild ){.      
14ea0 6e 6f 64 65 52 65 6c 65 61 73 65 28 70 52 74 72  nodeRelease(pRtr
14eb0 65 65 2c 20 70 43 68 69 6c 64 2d 3e 70 50 61 72  ee, pChild->pPar
14ec0 65 6e 74 29 3b 0a 20 20 20 20 20 20 6e 6f 64 65  ent);.      node
14ed0 52 65 66 65 72 65 6e 63 65 28 70 4e 6f 64 65 29  Reference(pNode)
14ee0 3b 0a 20 20 20 20 20 20 70 43 68 69 6c 64 2d 3e  ;.      pChild->
14ef0 70 50 61 72 65 6e 74 20 3d 20 70 4e 6f 64 65 3b  pParent = pNode;
14f00 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
14f10 20 6e 6f 64 65 49 6e 73 65 72 74 43 65 6c 6c 28   nodeInsertCell(
14f20 70 52 74 72 65 65 2c 20 70 4e 6f 64 65 2c 20 70  pRtree, pNode, p
14f30 43 65 6c 6c 29 20 29 7b 0a 20 20 20 20 69 66 28  Cell) ){.    if(
14f40 20 69 48 65 69 67 68 74 3c 3d 70 52 74 72 65 65   iHeight<=pRtree
14f50 2d 3e 69 52 65 69 6e 73 65 72 74 48 65 69 67 68  ->iReinsertHeigh
14f60 74 20 7c 7c 20 70 4e 6f 64 65 2d 3e 69 4e 6f 64  t || pNode->iNod
14f70 65 3d 3d 31 29 7b 0a 20 20 20 20 20 20 72 63 20  e==1){.      rc 
14f80 3d 20 53 70 6c 69 74 4e 6f 64 65 28 70 52 74 72  = SplitNode(pRtr
14f90 65 65 2c 20 70 4e 6f 64 65 2c 20 70 43 65 6c 6c  ee, pNode, pCell
14fa0 2c 20 69 48 65 69 67 68 74 29 3b 0a 20 20 20 20  , iHeight);.    
14fb0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 52 74  }else{.      pRt
14fc0 72 65 65 2d 3e 69 52 65 69 6e 73 65 72 74 48 65  ree->iReinsertHe
14fd0 69 67 68 74 20 3d 20 69 48 65 69 67 68 74 3b 0a  ight = iHeight;.
14fe0 20 20 20 20 20 20 72 63 20 3d 20 52 65 69 6e 73        rc = Reins
14ff0 65 72 74 28 70 52 74 72 65 65 2c 20 70 4e 6f 64  ert(pRtree, pNod
15000 65 2c 20 70 43 65 6c 6c 2c 20 69 48 65 69 67 68  e, pCell, iHeigh
15010 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  t);.    }.  }els
15020 65 7b 0a 20 20 20 20 72 63 20 3d 20 41 64 6a 75  e{.    rc = Adju
15030 73 74 54 72 65 65 28 70 52 74 72 65 65 2c 20 70  stTree(pRtree, p
15040 4e 6f 64 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20  Node, pCell);.  
15050 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
15060 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
15070 20 69 48 65 69 67 68 74 3d 3d 30 20 29 7b 0a 20   iHeight==0 ){. 
15080 20 20 20 20 20 20 20 72 63 20 3d 20 72 6f 77 69         rc = rowi
15090 64 57 72 69 74 65 28 70 52 74 72 65 65 2c 20 70  dWrite(pRtree, p
150a0 43 65 6c 6c 2d 3e 69 52 6f 77 69 64 2c 20 70 4e  Cell->iRowid, pN
150b0 6f 64 65 2d 3e 69 4e 6f 64 65 29 3b 0a 20 20 20  ode->iNode);.   
150c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
150d0 20 20 72 63 20 3d 20 70 61 72 65 6e 74 57 72 69    rc = parentWri
150e0 74 65 28 70 52 74 72 65 65 2c 20 70 43 65 6c 6c  te(pRtree, pCell
150f0 2d 3e 69 52 6f 77 69 64 2c 20 70 4e 6f 64 65 2d  ->iRowid, pNode-
15100 3e 69 4e 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d  >iNode);.      }
15110 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
15120 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69  urn rc;.}..stati
15130 63 20 69 6e 74 20 72 65 69 6e 73 65 72 74 4e 6f  c int reinsertNo
15140 64 65 43 6f 6e 74 65 6e 74 28 52 74 72 65 65 20  deContent(Rtree 
15150 2a 70 52 74 72 65 65 2c 20 52 74 72 65 65 4e 6f  *pRtree, RtreeNo
15160 64 65 20 2a 70 4e 6f 64 65 29 7b 0a 20 20 69 6e  de *pNode){.  in
15170 74 20 69 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d  t ii;.  int rc =
15180 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
15190 74 20 6e 43 65 6c 6c 20 3d 20 4e 43 45 4c 4c 28  t nCell = NCELL(
151a0 70 4e 6f 64 65 29 3b 0a 0a 20 20 66 6f 72 28 69  pNode);..  for(i
151b0 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
151c0 4f 4b 20 26 26 20 69 69 3c 6e 43 65 6c 6c 3b 20  OK && ii<nCell; 
151d0 69 69 2b 2b 29 7b 0a 20 20 20 20 52 74 72 65 65  ii++){.    Rtree
151e0 4e 6f 64 65 20 2a 70 49 6e 73 65 72 74 3b 0a 20  Node *pInsert;. 
151f0 20 20 20 52 74 72 65 65 43 65 6c 6c 20 63 65 6c     RtreeCell cel
15200 6c 3b 0a 20 20 20 20 6e 6f 64 65 47 65 74 43 65  l;.    nodeGetCe
15210 6c 6c 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65  ll(pRtree, pNode
15220 2c 20 69 69 2c 20 26 63 65 6c 6c 29 3b 0a 0a 20  , ii, &cell);.. 
15230 20 20 20 2f 2a 20 46 69 6e 64 20 61 20 6e 6f 64     /* Find a nod
15240 65 20 74 6f 20 73 74 6f 72 65 20 74 68 69 73 20  e to store this 
15250 63 65 6c 6c 20 69 6e 2e 20 70 4e 6f 64 65 2d 3e  cell in. pNode->
15260 69 4e 6f 64 65 20 63 75 72 72 65 6e 74 6c 79 20  iNode currently 
15270 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 2a 2a 20  contains.    ** 
15280 74 68 65 20 68 65 69 67 68 74 20 6f 66 20 74 68  the height of th
15290 65 20 73 75 62 2d 74 72 65 65 20 68 65 61 64 65  e sub-tree heade
152a0 64 20 62 79 20 74 68 65 20 63 65 6c 6c 2e 0a 20  d by the cell.. 
152b0 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 43     */.    rc = C
152c0 68 6f 6f 73 65 4c 65 61 66 28 70 52 74 72 65 65  hooseLeaf(pRtree
152d0 2c 20 26 63 65 6c 6c 2c 20 28 69 6e 74 29 70 4e  , &cell, (int)pN
152e0 6f 64 65 2d 3e 69 4e 6f 64 65 2c 20 26 70 49 6e  ode->iNode, &pIn
152f0 73 65 72 74 29 3b 0a 20 20 20 20 69 66 28 20 72  sert);.    if( r
15300 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
15310 20 20 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20        int rc2;. 
15320 20 20 20 20 20 72 63 20 3d 20 72 74 72 65 65 49       rc = rtreeI
15330 6e 73 65 72 74 43 65 6c 6c 28 70 52 74 72 65 65  nsertCell(pRtree
15340 2c 20 70 49 6e 73 65 72 74 2c 20 26 63 65 6c 6c  , pInsert, &cell
15350 2c 20 28 69 6e 74 29 70 4e 6f 64 65 2d 3e 69 4e  , (int)pNode->iN
15360 6f 64 65 29 3b 0a 20 20 20 20 20 20 72 63 32 20  ode);.      rc2 
15370 3d 20 6e 6f 64 65 52 65 6c 65 61 73 65 28 70 52  = nodeRelease(pR
15380 74 72 65 65 2c 20 70 49 6e 73 65 72 74 29 3b 0a  tree, pInsert);.
15390 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
153a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
153b0 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20     rc = rc2;.   
153c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
153d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
153e0 2a 0a 2a 2a 20 53 65 6c 65 63 74 20 61 20 63 75  *.** Select a cu
153f0 72 72 65 6e 74 6c 79 20 75 6e 75 73 65 64 20 72  rrently unused r
15400 6f 77 69 64 20 66 6f 72 20 61 20 6e 65 77 20 72  owid for a new r
15410 2d 74 72 65 65 20 72 65 63 6f 72 64 2e 0a 2a 2f  -tree record..*/
15420 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77 52  .static int newR
15430 6f 77 69 64 28 52 74 72 65 65 20 2a 70 52 74 72  owid(Rtree *pRtr
15440 65 65 2c 20 69 36 34 20 2a 70 69 52 6f 77 69 64  ee, i64 *piRowid
15450 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
15460 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c  qlite3_bind_null
15470 28 70 52 74 72 65 65 2d 3e 70 57 72 69 74 65 52  (pRtree->pWriteR
15480 6f 77 69 64 2c 20 31 29 3b 0a 20 20 73 71 6c 69  owid, 1);.  sqli
15490 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 52  te3_bind_null(pR
154a0 74 72 65 65 2d 3e 70 57 72 69 74 65 52 6f 77 69  tree->pWriteRowi
154b0 64 2c 20 32 29 3b 0a 20 20 73 71 6c 69 74 65 33  d, 2);.  sqlite3
154c0 5f 73 74 65 70 28 70 52 74 72 65 65 2d 3e 70 57  _step(pRtree->pW
154d0 72 69 74 65 52 6f 77 69 64 29 3b 0a 20 20 72 63  riteRowid);.  rc
154e0 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
154f0 28 70 52 74 72 65 65 2d 3e 70 57 72 69 74 65 52  (pRtree->pWriteR
15500 6f 77 69 64 29 3b 0a 20 20 2a 70 69 52 6f 77 69  owid);.  *piRowi
15510 64 20 3d 20 73 71 6c 69 74 65 33 5f 6c 61 73 74  d = sqlite3_last
15520 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 70 52  _insert_rowid(pR
15530 74 72 65 65 2d 3e 64 62 29 3b 0a 20 20 72 65 74  tree->db);.  ret
15540 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
15550 20 52 65 6d 6f 76 65 20 74 68 65 20 65 6e 74 72   Remove the entr
15560 79 20 77 69 74 68 20 72 6f 77 69 64 3d 69 44 65  y with rowid=iDe
15570 6c 65 74 65 20 66 72 6f 6d 20 74 68 65 20 72 2d  lete from the r-
15580 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e 0a  tree structure..
15590 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 74  */.static int rt
155a0 72 65 65 44 65 6c 65 74 65 52 6f 77 69 64 28 52  reeDeleteRowid(R
155b0 74 72 65 65 20 2a 70 52 74 72 65 65 2c 20 73 71  tree *pRtree, sq
155c0 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 44 65 6c  lite3_int64 iDel
155d0 65 74 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ete){.  int rc; 
155e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
155f0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
15600 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 52 74 72 65  n code */.  Rtre
15610 65 4e 6f 64 65 20 2a 70 4c 65 61 66 20 3d 20 30  eNode *pLeaf = 0
15620 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ;           /* L
15630 65 61 66 20 6e 6f 64 65 20 63 6f 6e 74 61 69 6e  eaf node contain
15640 69 6e 67 20 72 65 63 6f 72 64 20 69 44 65 6c 65  ing record iDele
15650 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  te */.  int iCel
15660 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
15670 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
15680 20 6f 66 20 69 44 65 6c 65 74 65 20 63 65 6c 6c   of iDelete cell
15690 20 69 6e 20 70 4c 65 61 66 20 2a 2f 0a 20 20 52   in pLeaf */.  R
156a0 74 72 65 65 4e 6f 64 65 20 2a 70 52 6f 6f 74 20  treeNode *pRoot 
156b0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
156c0 2a 20 52 6f 6f 74 20 6e 6f 64 65 20 6f 66 20 72  * Root node of r
156d0 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a  tree structure *
156e0 2f 0a 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20  /...  /* Obtain 
156f0 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
15700 68 65 20 72 6f 6f 74 20 6e 6f 64 65 20 74 6f 20  he root node to 
15710 69 6e 69 74 69 61 6c 69 7a 65 20 52 74 72 65 65  initialize Rtree
15720 2e 69 44 65 70 74 68 20 2a 2f 0a 20 20 72 63 20  .iDepth */.  rc 
15730 3d 20 6e 6f 64 65 41 63 71 75 69 72 65 28 70 52  = nodeAcquire(pR
15740 74 72 65 65 2c 20 31 2c 20 30 2c 20 26 70 52 6f  tree, 1, 0, &pRo
15750 6f 74 29 3b 0a 0a 20 20 2f 2a 20 4f 62 74 61 69  ot);..  /* Obtai
15760 6e 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  n a reference to
15770 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 20 74   the leaf node t
15780 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
15790 20 65 6e 74 72 79 20 0a 20 20 2a 2a 20 61 62 6f   entry .  ** abo
157a0 75 74 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64  ut to be deleted
157b0 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  . .  */.  if( rc
157c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
157d0 20 20 20 72 63 20 3d 20 66 69 6e 64 4c 65 61 66     rc = findLeaf
157e0 4e 6f 64 65 28 70 52 74 72 65 65 2c 20 69 44 65  Node(pRtree, iDe
157f0 6c 65 74 65 2c 20 26 70 4c 65 61 66 2c 20 30 29  lete, &pLeaf, 0)
15800 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65  ;.  }..  /* Dele
15810 74 65 20 74 68 65 20 63 65 6c 6c 20 69 6e 20 71  te the cell in q
15820 75 65 73 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  uestion from the
15830 20 6c 65 61 66 20 6e 6f 64 65 2e 20 2a 2f 0a 20   leaf node. */. 
15840 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
15850 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  OK ){.    int rc
15860 32 3b 0a 20 20 20 20 72 63 20 3d 20 6e 6f 64 65  2;.    rc = node
15870 52 6f 77 69 64 49 6e 64 65 78 28 70 52 74 72 65  RowidIndex(pRtre
15880 65 2c 20 70 4c 65 61 66 2c 20 69 44 65 6c 65 74  e, pLeaf, iDelet
15890 65 2c 20 26 69 43 65 6c 6c 29 3b 0a 20 20 20 20  e, &iCell);.    
158a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
158b0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
158c0 64 65 6c 65 74 65 43 65 6c 6c 28 70 52 74 72 65  deleteCell(pRtre
158d0 65 2c 20 70 4c 65 61 66 2c 20 69 43 65 6c 6c 2c  e, pLeaf, iCell,
158e0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   0);.    }.    r
158f0 63 32 20 3d 20 6e 6f 64 65 52 65 6c 65 61 73 65  c2 = nodeRelease
15900 28 70 52 74 72 65 65 2c 20 70 4c 65 61 66 29 3b  (pRtree, pLeaf);
15910 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
15920 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
15930 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a  rc = rc2;.    }.
15940 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65    }..  /* Delete
15950 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
15960 6e 67 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  ng entry in the 
15970 3c 72 74 72 65 65 3e 5f 72 6f 77 69 64 20 74 61  <rtree>_rowid ta
15980 62 6c 65 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63  ble. */.  if( rc
15990 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
159a0 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
159b0 69 6e 74 36 34 28 70 52 74 72 65 65 2d 3e 70 44  int64(pRtree->pD
159c0 65 6c 65 74 65 52 6f 77 69 64 2c 20 31 2c 20 69  eleteRowid, 1, i
159d0 44 65 6c 65 74 65 29 3b 0a 20 20 20 20 73 71 6c  Delete);.    sql
159e0 69 74 65 33 5f 73 74 65 70 28 70 52 74 72 65 65  ite3_step(pRtree
159f0 2d 3e 70 44 65 6c 65 74 65 52 6f 77 69 64 29 3b  ->pDeleteRowid);
15a00 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
15a10 33 5f 72 65 73 65 74 28 70 52 74 72 65 65 2d 3e  3_reset(pRtree->
15a20 70 44 65 6c 65 74 65 52 6f 77 69 64 29 3b 0a 20  pDeleteRowid);. 
15a30 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69   }..  /* Check i
15a40 66 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 20  f the root node 
15a50 6e 6f 77 20 68 61 73 20 65 78 61 63 74 6c 79 20  now has exactly 
15a60 6f 6e 65 20 63 68 69 6c 64 2e 20 49 66 20 73 6f  one child. If so
15a70 2c 20 72 65 6d 6f 76 65 0a 20 20 2a 2a 20 69 74  , remove.  ** it
15a80 2c 20 73 63 68 65 64 75 6c 65 20 74 68 65 20 63  , schedule the c
15a90 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63  ontents of the c
15aa0 68 69 6c 64 20 66 6f 72 20 72 65 69 6e 73 65 72  hild for reinser
15ab0 74 69 6f 6e 20 61 6e 64 20 0a 20 20 2a 2a 20 72  tion and .  ** r
15ac0 65 64 75 63 65 20 74 68 65 20 74 72 65 65 20 68  educe the tree h
15ad0 65 69 67 68 74 20 62 79 20 6f 6e 65 2e 0a 20 20  eight by one..  
15ae0 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20  **.  ** This is 
15af0 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 63 6f  equivalent to co
15b00 70 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  pying the conten
15b10 74 73 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20  ts of the child 
15b20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 72 6f  into.  ** the ro
15b30 6f 74 20 6e 6f 64 65 20 28 74 68 65 20 6f 70 65  ot node (the ope
15b40 72 61 74 69 6f 6e 20 74 68 61 74 20 47 75 74 6d  ration that Gutm
15b50 61 6e 27 73 20 70 61 70 65 72 20 73 61 79 73 20  an's paper says 
15b60 74 6f 20 70 65 72 66 6f 72 6d 20 0a 20 20 2a 2a  to perform .  **
15b70 20 69 6e 20 74 68 69 73 20 73 63 65 6e 61 72 69   in this scenari
15b80 6f 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  o)..  */.  if( r
15b90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
15ba0 70 52 74 72 65 65 2d 3e 69 44 65 70 74 68 3e 30  pRtree->iDepth>0
15bb0 20 26 26 20 4e 43 45 4c 4c 28 70 52 6f 6f 74 29   && NCELL(pRoot)
15bc0 3d 3d 31 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ==1 ){.    int r
15bd0 63 32 3b 0a 20 20 20 20 52 74 72 65 65 4e 6f 64  c2;.    RtreeNod
15be0 65 20 2a 70 43 68 69 6c 64 3b 0a 20 20 20 20 69  e *pChild;.    i
15bf0 36 34 20 69 43 68 69 6c 64 20 3d 20 6e 6f 64 65  64 iChild = node
15c00 47 65 74 52 6f 77 69 64 28 70 52 74 72 65 65 2c  GetRowid(pRtree,
15c10 20 70 52 6f 6f 74 2c 20 30 29 3b 0a 20 20 20 20   pRoot, 0);.    
15c20 72 63 20 3d 20 6e 6f 64 65 41 63 71 75 69 72 65  rc = nodeAcquire
15c30 28 70 52 74 72 65 65 2c 20 69 43 68 69 6c 64 2c  (pRtree, iChild,
15c40 20 70 52 6f 6f 74 2c 20 26 70 43 68 69 6c 64 29   pRoot, &pChild)
15c50 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
15c60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
15c70 20 72 63 20 3d 20 72 65 6d 6f 76 65 4e 6f 64 65   rc = removeNode
15c80 28 70 52 74 72 65 65 2c 20 70 43 68 69 6c 64 2c  (pRtree, pChild,
15c90 20 70 52 74 72 65 65 2d 3e 69 44 65 70 74 68 2d   pRtree->iDepth-
15ca0 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  1);.    }.    rc
15cb0 32 20 3d 20 6e 6f 64 65 52 65 6c 65 61 73 65 28  2 = nodeRelease(
15cc0 70 52 74 72 65 65 2c 20 70 43 68 69 6c 64 29 3b  pRtree, pChild);
15cd0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
15ce0 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63  ITE_OK ) rc = rc
15cf0 32 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  2;.    if( rc==S
15d00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15d10 20 20 70 52 74 72 65 65 2d 3e 69 44 65 70 74 68    pRtree->iDepth
15d20 2d 2d 3b 0a 20 20 20 20 20 20 77 72 69 74 65 49  --;.      writeI
15d30 6e 74 31 36 28 70 52 6f 6f 74 2d 3e 7a 44 61 74  nt16(pRoot->zDat
15d40 61 2c 20 70 52 74 72 65 65 2d 3e 69 44 65 70 74  a, pRtree->iDept
15d50 68 29 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d  h);.      pRoot-
15d60 3e 69 73 44 69 72 74 79 20 3d 20 31 3b 0a 20 20  >isDirty = 1;.  
15d70 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65    }.  }..  /* Re
15d80 2d 69 6e 73 65 72 74 20 74 68 65 20 63 6f 6e 74  -insert the cont
15d90 65 6e 74 73 20 6f 66 20 61 6e 79 20 75 6e 64 65  ents of any unde
15da0 72 66 75 6c 6c 20 6e 6f 64 65 73 20 72 65 6d 6f  rfull nodes remo
15db0 76 65 64 20 66 72 6f 6d 20 74 68 65 20 74 72 65  ved from the tre
15dc0 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 4c 65 61  e. */.  for(pLea
15dd0 66 3d 70 52 74 72 65 65 2d 3e 70 44 65 6c 65 74  f=pRtree->pDelet
15de0 65 64 3b 20 70 4c 65 61 66 3b 20 70 4c 65 61 66  ed; pLeaf; pLeaf
15df0 3d 70 52 74 72 65 65 2d 3e 70 44 65 6c 65 74 65  =pRtree->pDelete
15e00 64 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d){.    if( rc==
15e10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15e20 20 20 20 72 63 20 3d 20 72 65 69 6e 73 65 72 74     rc = reinsert
15e30 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 70 52 74 72  NodeContent(pRtr
15e40 65 65 2c 20 70 4c 65 61 66 29 3b 0a 20 20 20 20  ee, pLeaf);.    
15e50 7d 0a 20 20 20 20 70 52 74 72 65 65 2d 3e 70 44  }.    pRtree->pD
15e60 65 6c 65 74 65 64 20 3d 20 70 4c 65 61 66 2d 3e  eleted = pLeaf->
15e70 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74  pNext;.    sqlit
15e80 65 33 5f 66 72 65 65 28 70 4c 65 61 66 29 3b 0a  e3_free(pLeaf);.
15e90 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73    }..  /* Releas
15ea0 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  e the reference 
15eb0 74 6f 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65  to the root node
15ec0 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53  . */.  if( rc==S
15ed0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15ee0 72 63 20 3d 20 6e 6f 64 65 52 65 6c 65 61 73 65  rc = nodeRelease
15ef0 28 70 52 74 72 65 65 2c 20 70 52 6f 6f 74 29 3b  (pRtree, pRoot);
15f00 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 6f  .  }else{.    no
15f10 64 65 52 65 6c 65 61 73 65 28 70 52 74 72 65 65  deRelease(pRtree
15f20 2c 20 70 52 6f 6f 74 29 3b 0a 20 20 7d 0a 0a 20  , pRoot);.  }.. 
15f30 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
15f40 2a 0a 2a 2a 20 52 6f 75 6e 64 69 6e 67 20 63 6f  *.** Rounding co
15f50 6e 73 74 61 6e 74 73 20 66 6f 72 20 66 6c 6f 61  nstants for floa
15f60 74 2d 3e 64 6f 75 62 6c 65 20 63 6f 6e 76 65 72  t->double conver
15f70 73 69 6f 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  sion..*/.#define
15f80 20 52 4e 44 54 4f 57 41 52 44 53 20 20 28 31 2e   RNDTOWARDS  (1.
15f90 30 20 2d 20 31 2e 30 2f 38 33 38 38 36 30 38 2e  0 - 1.0/8388608.
15fa0 30 29 20 20 2f 2a 20 52 6f 75 6e 64 20 74 6f 77  0)  /* Round tow
15fb0 61 72 64 73 20 7a 65 72 6f 20 2a 2f 0a 23 64 65  ards zero */.#de
15fc0 66 69 6e 65 20 52 4e 44 41 57 41 59 20 20 20 20  fine RNDAWAY    
15fd0 20 28 31 2e 30 20 2b 20 31 2e 30 2f 38 33 38 38   (1.0 + 1.0/8388
15fe0 36 30 38 2e 30 29 20 20 2f 2a 20 52 6f 75 6e 64  608.0)  /* Round
15ff0 20 61 77 61 79 20 66 72 6f 6d 20 7a 65 72 6f 20   away from zero 
16000 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  */..#if !defined
16010 28 53 51 4c 49 54 45 5f 52 54 52 45 45 5f 49 4e  (SQLITE_RTREE_IN
16020 54 5f 4f 4e 4c 59 29 0a 2f 2a 0a 2a 2a 20 43 6f  T_ONLY)./*.** Co
16030 6e 76 65 72 74 20 61 6e 20 73 71 6c 69 74 65 33  nvert an sqlite3
16040 5f 76 61 6c 75 65 20 69 6e 74 6f 20 61 6e 20 52  _value into an R
16050 74 72 65 65 56 61 6c 75 65 20 28 70 72 65 73 75  treeValue (presu
16060 6d 61 62 6c 79 20 61 20 66 6c 6f 61 74 29 0a 2a  mably a float).*
16070 2a 20 77 68 69 6c 65 20 74 61 6b 69 6e 67 20 63  * while taking c
16080 61 72 65 20 74 6f 20 72 6f 75 6e 64 20 74 6f 77  are to round tow
16090 61 72 64 20 6e 65 67 61 74 69 76 65 20 6f 72 20  ard negative or 
160a0 70 6f 73 69 74 69 76 65 2c 20 72 65 73 70 65 63  positive, respec
160b0 74 69 76 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  tively..*/.stati
160c0 63 20 52 74 72 65 65 56 61 6c 75 65 20 72 74 72  c RtreeValue rtr
160d0 65 65 56 61 6c 75 65 44 6f 77 6e 28 73 71 6c 69  eeValueDown(sqli
160e0 74 65 33 5f 76 61 6c 75 65 20 2a 76 29 7b 0a 20  te3_value *v){. 
160f0 20 64 6f 75 62 6c 65 20 64 20 3d 20 73 71 6c 69   double d = sqli
16100 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65  te3_value_double
16110 28 76 29 3b 0a 20 20 66 6c 6f 61 74 20 66 20 3d  (v);.  float f =
16120 20 28 66 6c 6f 61 74 29 64 3b 0a 20 20 69 66 28   (float)d;.  if(
16130 20 66 3e 64 20 29 7b 0a 20 20 20 20 66 20 3d 20   f>d ){.    f = 
16140 28 66 6c 6f 61 74 29 28 64 2a 28 64 3c 30 20 3f  (float)(d*(d<0 ?
16150 20 52 4e 44 41 57 41 59 20 3a 20 52 4e 44 54 4f   RNDAWAY : RNDTO
16160 57 41 52 44 53 29 29 3b 0a 20 20 7d 0a 20 20 72  WARDS));.  }.  r
16170 65 74 75 72 6e 20 66 3b 0a 7d 0a 73 74 61 74 69  eturn f;.}.stati
16180 63 20 52 74 72 65 65 56 61 6c 75 65 20 72 74 72  c RtreeValue rtr
16190 65 65 56 61 6c 75 65 55 70 28 73 71 6c 69 74 65  eeValueUp(sqlite
161a0 33 5f 76 61 6c 75 65 20 2a 76 29 7b 0a 20 20 64  3_value *v){.  d
161b0 6f 75 62 6c 65 20 64 20 3d 20 73 71 6c 69 74 65  ouble d = sqlite
161c0 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 76  3_value_double(v
161d0 29 3b 0a 20 20 66 6c 6f 61 74 20 66 20 3d 20 28  );.  float f = (
161e0 66 6c 6f 61 74 29 64 3b 0a 20 20 69 66 28 20 66  float)d;.  if( f
161f0 3c 64 20 29 7b 0a 20 20 20 20 66 20 3d 20 28 66  <d ){.    f = (f
16200 6c 6f 61 74 29 28 64 2a 28 64 3c 30 20 3f 20 52  loat)(d*(d<0 ? R
16210 4e 44 54 4f 57 41 52 44 53 20 3a 20 52 4e 44 41  NDTOWARDS : RNDA
16220 57 41 59 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74  WAY));.  }.  ret
16230 75 72 6e 20 66 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn f;.}.#endif 
16240 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
16250 54 45 5f 52 54 52 45 45 5f 49 4e 54 5f 4f 4e 4c  TE_RTREE_INT_ONL
16260 59 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 20 63  Y) */../*.** A c
16270 6f 6e 73 74 72 61 69 6e 74 20 68 61 73 20 66 61  onstraint has fa
16280 69 6c 65 64 20 77 68 69 6c 65 20 69 6e 73 65 72  iled while inser
16290 74 69 6e 67 20 61 20 72 6f 77 20 69 6e 74 6f 20  ting a row into 
162a0 61 6e 20 72 74 72 65 65 20 74 61 62 6c 65 2e 20  an rtree table. 
162b0 0a 2a 2a 20 41 73 73 75 6d 69 6e 67 20 6e 6f 20  .** Assuming no 
162c0 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73  OOM error occurs
162d0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
162e0 73 65 74 73 20 74 68 65 20 65 72 72 6f 72 20 6d  sets the error m
162f0 65 73 73 61 67 65 20 0a 2a 2a 20 28 61 74 20 70  essage .** (at p
16300 52 74 72 65 65 2d 3e 62 61 73 65 2e 7a 45 72 72  Rtree->base.zErr
16310 4d 73 67 29 20 74 6f 20 61 6e 20 61 70 70 72 6f  Msg) to an appro
16320 70 72 69 61 74 65 20 76 61 6c 75 65 20 61 6e 64  priate value and
16330 20 72 65 74 75 72 6e 73 0a 2a 2a 20 53 51 4c 49   returns.** SQLI
16340 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2e 0a 2a  TE_CONSTRAINT..*
16350 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 69  *.** Parameter i
16360 43 6f 6c 20 69 73 20 74 68 65 20 69 6e 64 65 78  Col is the index
16370 20 6f 66 20 74 68 65 20 6c 65 66 74 6d 6f 73 74   of the leftmost
16380 20 63 6f 6c 75 6d 6e 20 69 6e 76 6f 6c 76 65 64   column involved
16390 20 69 6e 20 74 68 65 0a 2a 2a 20 63 6f 6e 73 74   in the.** const
163a0 72 61 69 6e 74 20 66 61 69 6c 75 72 65 2e 20 49  raint failure. I
163b0 66 20 69 74 20 69 73 20 30 2c 20 74 68 65 6e 20  f it is 0, then 
163c0 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  the constraint t
163d0 68 61 74 20 66 61 69 6c 65 64 20 69 73 0a 2a 2a  hat failed is.**
163e0 20 74 68 65 20 75 6e 69 71 75 65 20 63 6f 6e 73   the unique cons
163f0 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 69 64  traint on the id
16400 20 63 6f 6c 75 6d 6e 2e 20 4f 74 68 65 72 77 69   column. Otherwi
16410 73 65 2c 20 69 74 20 69 73 20 74 68 65 20 72 74  se, it is the rt
16420 72 65 65 0a 2a 2a 20 28 63 31 3c 3d 63 32 29 20  ree.** (c1<=c2) 
16430 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 63 6f  constraint on co
16440 6c 75 6d 6e 73 20 69 43 6f 6c 20 61 6e 64 20 69  lumns iCol and i
16450 43 6f 6c 2b 31 20 74 68 61 74 20 68 61 73 20 66  Col+1 that has f
16460 61 69 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ailed..**.** If 
16470 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73 2c 20 53  an OOM occurs, S
16480 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72  QLITE_NOMEM is r
16490 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64 20  eturned instead 
164a0 6f 66 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  of SQLITE_CONSTR
164b0 41 49 4e 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  AINT..*/.static 
164c0 69 6e 74 20 72 74 72 65 65 43 6f 6e 73 74 72 61  int rtreeConstra
164d0 69 6e 74 45 72 72 6f 72 28 52 74 72 65 65 20 2a  intError(Rtree *
164e0 70 52 74 72 65 65 2c 20 69 6e 74 20 69 43 6f 6c  pRtree, int iCol
164f0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
16500 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t *pStmt = 0;.  
16510 63 68 61 72 20 2a 7a 53 71 6c 3b 20 0a 20 20 69  char *zSql; .  i
16520 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
16530 28 20 69 43 6f 6c 3d 3d 30 20 7c 7c 20 69 43 6f  ( iCol==0 || iCo
16540 6c 25 32 20 29 3b 0a 20 20 7a 53 71 6c 20 3d 20  l%2 );.  zSql = 
16550 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
16560 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 25  "SELECT * FROM %
16570 51 2e 25 51 22 2c 20 70 52 74 72 65 65 2d 3e 7a  Q.%Q", pRtree->z
16580 44 62 2c 20 70 52 74 72 65 65 2d 3e 7a 4e 61 6d  Db, pRtree->zNam
16590 65 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 20 29  e);.  if( zSql )
165a0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
165b0 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 52  e3_prepare_v2(pR
165c0 74 72 65 65 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  tree->db, zSql, 
165d0 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
165e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
165f0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
16600 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
16610 65 65 28 7a 53 71 6c 29 3b 0a 0a 20 20 69 66 28  ee(zSql);..  if(
16620 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
16630 7b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d  {.    if( iCol==
16640 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  0 ){.      const
16650 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 73 71   char *zCol = sq
16660 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d  lite3_column_nam
16670 65 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20  e(pStmt, 0);.   
16680 20 20 20 70 52 74 72 65 65 2d 3e 62 61 73 65 2e     pRtree->base.
16690 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
166a0 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20  3_mprintf(.     
166b0 20 20 20 20 20 22 55 4e 49 51 55 45 20 63 6f 6e       "UNIQUE con
166c0 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 3a 20  straint failed: 
166d0 25 73 2e 25 73 22 2c 20 70 52 74 72 65 65 2d 3e  %s.%s", pRtree->
166e0 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 0a 20 20 20 20  zName, zCol.    
166f0 20 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a    );.    }else{.
16700 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
16710 20 2a 7a 43 6f 6c 31 20 3d 20 73 71 6c 69 74 65   *zCol1 = sqlite
16720 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53  3_column_name(pS
16730 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20  tmt, iCol);.    
16740 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
16750 6f 6c 32 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  ol2 = sqlite3_co
16760 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c  lumn_name(pStmt,
16770 20 69 43 6f 6c 2b 31 29 3b 0a 20 20 20 20 20 20   iCol+1);.      
16780 70 52 74 72 65 65 2d 3e 62 61 73 65 2e 7a 45 72  pRtree->base.zEr
16790 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rMsg = sqlite3_m
167a0 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
167b0 20 20 22 72 74 72 65 65 20 63 6f 6e 73 74 72 61    "rtree constra
167c0 69 6e 74 20 66 61 69 6c 65 64 3a 20 25 73 2e 28  int failed: %s.(
167d0 25 73 3c 3d 25 73 29 22 2c 20 70 52 74 72 65 65  %s<=%s)", pRtree
167e0 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 31 2c 20  ->zName, zCol1, 
167f0 7a 43 6f 6c 32 0a 20 20 20 20 20 20 29 3b 0a 20  zCol2.      );. 
16800 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69     }.  }..  sqli
16810 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
16820 6d 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 72  mt);.  return (r
16830 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 53  c==SQLITE_OK ? S
16840 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
16850 20 3a 20 72 63 29 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a   : rc);.}..../*.
16860 2a 2a 20 54 68 65 20 78 55 70 64 61 74 65 20 6d  ** The xUpdate m
16870 65 74 68 6f 64 20 66 6f 72 20 72 74 72 65 65 20  ethod for rtree 
16880 6d 6f 64 75 6c 65 20 76 69 72 74 75 61 6c 20 74  module virtual t
16890 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ables..*/.static
168a0 20 69 6e 74 20 72 74 72 65 65 55 70 64 61 74 65   int rtreeUpdate
168b0 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  (.  sqlite3_vtab
168c0 20 2a 70 56 74 61 62 2c 20 0a 20 20 69 6e 74 20   *pVtab, .  int 
168d0 6e 44 61 74 61 2c 20 0a 20 20 73 71 6c 69 74 65  nData, .  sqlite
168e0 33 5f 76 61 6c 75 65 20 2a 2a 61 7a 44 61 74 61  3_value **azData
168f0 2c 20 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36  , .  sqlite_int6
16900 34 20 2a 70 52 6f 77 69 64 0a 29 7b 0a 20 20 52  4 *pRowid.){.  R
16910 74 72 65 65 20 2a 70 52 74 72 65 65 20 3d 20 28  tree *pRtree = (
16920 52 74 72 65 65 20 2a 29 70 56 74 61 62 3b 0a 20  Rtree *)pVtab;. 
16930 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
16940 5f 4f 4b 3b 0a 20 20 52 74 72 65 65 43 65 6c 6c  _OK;.  RtreeCell
16950 20 63 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20   cell;          
16960 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 65         /* New ce
16970 6c 6c 20 74 6f 20 69 6e 73 65 72 74 20 69 66 20  ll to insert if 
16980 6e 44 61 74 61 3e 31 20 2a 2f 0a 20 20 69 6e 74  nData>1 */.  int
16990 20 62 48 61 76 65 52 6f 77 69 64 20 3d 20 30 3b   bHaveRowid = 0;
169a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
169b0 53 65 74 20 74 6f 20 31 20 61 66 74 65 72 20 6e  Set to 1 after n
169c0 65 77 20 72 6f 77 69 64 20 69 73 20 64 65 74 65  ew rowid is dete
169d0 72 6d 69 6e 65 64 20 2a 2f 0a 0a 20 20 72 74 72  rmined */..  rtr
169e0 65 65 52 65 66 65 72 65 6e 63 65 28 70 52 74 72  eeReference(pRtr
169f0 65 65 29 3b 0a 20 20 61 73 73 65 72 74 28 6e 44  ee);.  assert(nD
16a00 61 74 61 3e 3d 31 29 3b 0a 0a 20 20 63 65 6c 6c  ata>=1);..  cell
16a10 2e 69 52 6f 77 69 64 20 3d 20 30 3b 20 20 2f 2a  .iRowid = 0;  /*
16a20 20 55 73 65 64 20 6f 6e 6c 79 20 74 6f 20 73 75   Used only to su
16a30 70 70 72 65 73 73 20 61 20 63 6f 6d 70 69 6c 65  ppress a compile
16a40 72 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 0a 20 20  r warning */..  
16a50 2f 2a 20 43 6f 6e 73 74 72 61 69 6e 74 20 68 61  /* Constraint ha
16a60 6e 64 6c 69 6e 67 2e 20 41 20 77 72 69 74 65 20  ndling. A write 
16a70 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20 61 6e 20  operation on an 
16a80 72 2d 74 72 65 65 20 74 61 62 6c 65 20 6d 61 79  r-tree table may
16a90 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c   return.  ** SQL
16aa0 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 66  ITE_CONSTRAINT f
16ab0 6f 72 20 74 77 6f 20 72 65 61 73 6f 6e 73 3a 0a  or two reasons:.
16ac0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 41    **.  **   1. A
16ad0 20 64 75 70 6c 69 63 61 74 65 20 72 6f 77 69 64   duplicate rowid
16ae0 20 76 61 6c 75 65 2c 20 6f 72 0a 20 20 2a 2a 20   value, or.  ** 
16af0 20 20 32 2e 20 54 68 65 20 73 75 70 70 6c 69 65    2. The supplie
16b00 64 20 64 61 74 61 20 76 69 6f 6c 61 74 65 73 20  d data violates 
16b10 74 68 65 20 22 78 32 3e 3d 78 31 22 20 63 6f 6e  the "x2>=x1" con
16b20 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2a 0a 20 20  straint..  **.  
16b30 2a 2a 20 49 6e 20 74 68 65 20 66 69 72 73 74 20  ** In the first 
16b40 63 61 73 65 2c 20 69 66 20 74 68 65 20 63 6f 6e  case, if the con
16b50 66 6c 69 63 74 2d 68 61 6e 64 6c 69 6e 67 20 6d  flict-handling m
16b60 6f 64 65 20 69 73 20 52 45 50 4c 41 43 45 2c 20  ode is REPLACE, 
16b70 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 63 6f  then.  ** the co
16b80 6e 66 6c 69 63 74 69 6e 67 20 72 6f 77 20 63 61  nflicting row ca
16b90 6e 20 62 65 20 72 65 6d 6f 76 65 64 20 62 65 66  n be removed bef
16ba0 6f 72 65 20 70 72 6f 63 65 65 64 69 6e 67 2e 20  ore proceeding. 
16bb0 49 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 20 20  In the second.  
16bc0 2a 2a 20 63 61 73 65 2c 20 53 51 4c 49 54 45 5f  ** case, SQLITE_
16bd0 43 4f 4e 53 54 52 41 49 4e 54 20 6d 75 73 74 20  CONSTRAINT must 
16be0 62 65 20 72 65 74 75 72 6e 65 64 20 72 65 67 61  be returned rega
16bf0 72 64 6c 65 73 73 20 6f 66 20 74 68 65 0a 20 20  rdless of the.  
16c00 2a 2a 20 63 6f 6e 66 6c 69 63 74 2d 68 61 6e 64  ** conflict-hand
16c10 6c 69 6e 67 20 6d 6f 64 65 20 73 70 65 63 69 66  ling mode specif
16c20 69 65 64 20 62 79 20 74 68 65 20 75 73 65 72 2e  ied by the user.
16c30 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 44 61 74  .  */.  if( nDat
16c40 61 3e 31 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  a>1 ){.    int i
16c50 69 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f 70 75 6c  i;..    /* Popul
16c60 61 74 65 20 74 68 65 20 63 65 6c 6c 2e 61 43 6f  ate the cell.aCo
16c70 6f 72 64 5b 5d 20 61 72 72 61 79 2e 20 54 68 65  ord[] array. The
16c80 20 66 69 72 73 74 20 63 6f 6f 72 64 69 6e 61 74   first coordinat
16c90 65 20 69 73 20 61 7a 44 61 74 61 5b 33 5d 2e 0a  e is azData[3]..
16ca0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 42      **.    ** NB
16cb0 3a 20 6e 44 61 74 61 20 63 61 6e 20 6f 6e 6c 79  : nData can only
16cc0 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 6e 44   be less than nD
16cd0 69 6d 2a 32 2b 33 20 69 66 20 74 68 65 20 72 74  im*2+3 if the rt
16ce0 72 65 65 20 69 73 20 6d 69 73 2d 64 65 63 6c 61  ree is mis-decla
16cf0 72 65 64 0a 20 20 20 20 2a 2a 20 77 69 74 68 20  red.    ** with 
16d00 22 63 6f 6c 75 6d 6e 22 20 74 68 61 74 20 61 72  "column" that ar
16d10 65 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  e interpreted as
16d20 20 74 61 62 6c 65 20 63 6f 6e 73 74 72 61 69 6e   table constrain
16d30 74 73 2e 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70  ts..    ** Examp
16d40 6c 65 3a 20 20 43 52 45 41 54 45 20 56 49 52 54  le:  CREATE VIRT
16d50 55 41 4c 20 54 41 42 4c 45 20 62 61 64 20 55 53  UAL TABLE bad US
16d60 49 4e 47 20 72 74 72 65 65 28 78 2c 79 2c 43 48  ING rtree(x,y,CH
16d70 45 43 4b 28 79 3e 35 29 29 3b 0a 20 20 20 20 2a  ECK(y>5));.    *
16d80 2a 20 54 68 69 73 20 70 72 6f 62 6c 65 6d 20 77  * This problem w
16d90 61 73 20 64 69 73 63 6f 76 65 72 65 64 20 61 66  as discovered af
16da0 74 65 72 20 79 65 61 72 73 20 6f 66 20 75 73 65  ter years of use
16db0 2c 20 73 6f 20 77 65 20 73 69 6c 65 6e 74 6c 79  , so we silently
16dc0 20 69 67 6e 6f 72 65 0a 20 20 20 20 2a 2a 20 74   ignore.    ** t
16dd0 68 65 73 65 20 6b 69 6e 64 73 20 6f 66 20 6d 69  hese kinds of mi
16de0 73 64 65 63 6c 61 72 65 64 20 74 61 62 6c 65 73  sdeclared tables
16df0 20 74 6f 20 61 76 6f 69 64 20 62 72 65 61 6b 69   to avoid breaki
16e00 6e 67 20 61 6e 79 20 6c 65 67 61 63 79 2e 0a 20  ng any legacy.. 
16e10 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
16e20 28 20 6e 44 61 74 61 3c 3d 28 70 52 74 72 65 65  ( nData<=(pRtree
16e30 2d 3e 6e 44 69 6d 32 20 2b 20 33 29 20 29 3b 0a  ->nDim2 + 3) );.
16e40 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16e50 52 54 52 45 45 5f 49 4e 54 5f 4f 4e 4c 59 0a 20  RTREE_INT_ONLY. 
16e60 20 20 20 69 66 28 20 70 52 74 72 65 65 2d 3e 65     if( pRtree->e
16e70 43 6f 6f 72 64 54 79 70 65 3d 3d 52 54 52 45 45  CoordType==RTREE
16e80 5f 43 4f 4f 52 44 5f 52 45 41 4c 33 32 20 29 7b  _COORD_REAL32 ){
16e90 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  .      for(ii=0;
16ea0 20 69 69 3c 6e 44 61 74 61 2d 34 3b 20 69 69 2b   ii<nData-4; ii+
16eb0 3d 32 29 7b 0a 20 20 20 20 20 20 20 20 63 65 6c  =2){.        cel
16ec0 6c 2e 61 43 6f 6f 72 64 5b 69 69 5d 2e 66 20 3d  l.aCoord[ii].f =
16ed0 20 72 74 72 65 65 56 61 6c 75 65 44 6f 77 6e 28   rtreeValueDown(
16ee0 61 7a 44 61 74 61 5b 69 69 2b 33 5d 29 3b 0a 20  azData[ii+3]);. 
16ef0 20 20 20 20 20 20 20 63 65 6c 6c 2e 61 43 6f 6f         cell.aCoo
16f00 72 64 5b 69 69 2b 31 5d 2e 66 20 3d 20 72 74 72  rd[ii+1].f = rtr
16f10 65 65 56 61 6c 75 65 55 70 28 61 7a 44 61 74 61  eeValueUp(azData
16f20 5b 69 69 2b 34 5d 29 3b 0a 20 20 20 20 20 20 20  [ii+4]);.       
16f30 20 69 66 28 20 63 65 6c 6c 2e 61 43 6f 6f 72 64   if( cell.aCoord
16f40 5b 69 69 5d 2e 66 3e 63 65 6c 6c 2e 61 43 6f 6f  [ii].f>cell.aCoo
16f50 72 64 5b 69 69 2b 31 5d 2e 66 20 29 7b 0a 20 20  rd[ii+1].f ){.  
16f60 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 74 72          rc = rtr
16f70 65 65 43 6f 6e 73 74 72 61 69 6e 74 45 72 72 6f  eeConstraintErro
16f80 72 28 70 52 74 72 65 65 2c 20 69 69 2b 31 29 3b  r(pRtree, ii+1);
16f90 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
16fa0 63 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20  constraint;.    
16fb0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
16fc0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
16fd0 20 20 20 7b 0a 20 20 20 20 20 20 66 6f 72 28 69     {.      for(i
16fe0 69 3d 30 3b 20 69 69 3c 6e 44 61 74 61 2d 34 3b  i=0; ii<nData-4;
16ff0 20 69 69 2b 3d 32 29 7b 0a 20 20 20 20 20 20 20   ii+=2){.       
17000 20 63 65 6c 6c 2e 61 43 6f 6f 72 64 5b 69 69 5d   cell.aCoord[ii]
17010 2e 69 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  .i = sqlite3_val
17020 75 65 5f 69 6e 74 28 61 7a 44 61 74 61 5b 69 69  ue_int(azData[ii
17030 2b 33 5d 29 3b 0a 20 20 20 20 20 20 20 20 63 65  +3]);.        ce
17040 6c 6c 2e 61 43 6f 6f 72 64 5b 69 69 2b 31 5d 2e  ll.aCoord[ii+1].
17050 69 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  i = sqlite3_valu
17060 65 5f 69 6e 74 28 61 7a 44 61 74 61 5b 69 69 2b  e_int(azData[ii+
17070 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  4]);.        if(
17080 20 63 65 6c 6c 2e 61 43 6f 6f 72 64 5b 69 69 5d   cell.aCoord[ii]
17090 2e 69 3e 63 65 6c 6c 2e 61 43 6f 6f 72 64 5b 69  .i>cell.aCoord[i
170a0 69 2b 31 5d 2e 69 20 29 7b 0a 20 20 20 20 20 20  i+1].i ){.      
170b0 20 20 20 20 72 63 20 3d 20 72 74 72 65 65 43 6f      rc = rtreeCo
170c0 6e 73 74 72 61 69 6e 74 45 72 72 6f 72 28 70 52  nstraintError(pR
170d0 74 72 65 65 2c 20 69 69 2b 31 29 3b 0a 20 20 20  tree, ii+1);.   
170e0 20 20 20 20 20 20 20 67 6f 74 6f 20 63 6f 6e 73         goto cons
170f0 74 72 61 69 6e 74 3b 0a 20 20 20 20 20 20 20 20  traint;.        
17100 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
17110 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 72 6f 77  .    /* If a row
17120 69 64 20 76 61 6c 75 65 20 77 61 73 20 73 75 70  id value was sup
17130 70 6c 69 65 64 2c 20 63 68 65 63 6b 20 69 66 20  plied, check if 
17140 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 70 72  it is already pr
17150 65 73 65 6e 74 20 69 6e 20 0a 20 20 20 20 2a 2a  esent in .    **
17160 20 74 68 65 20 74 61 62 6c 65 2e 20 49 66 20 73   the table. If s
17170 6f 2c 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  o, the constrain
17180 74 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f  t has failed. */
17190 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
171a0 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 7a 44 61  _value_type(azDa
171b0 74 61 5b 32 5d 29 21 3d 53 51 4c 49 54 45 5f 4e  ta[2])!=SQLITE_N
171c0 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 63 65 6c  ULL ){.      cel
171d0 6c 2e 69 52 6f 77 69 64 20 3d 20 73 71 6c 69 74  l.iRowid = sqlit
171e0 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61  e3_value_int64(a
171f0 7a 44 61 74 61 5b 32 5d 29 3b 0a 20 20 20 20 20  zData[2]);.     
17200 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c   if( sqlite3_val
17210 75 65 5f 74 79 70 65 28 61 7a 44 61 74 61 5b 30  ue_type(azData[0
17220 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 0a  ])==SQLITE_NULL.
17230 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
17240 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 7a  3_value_int64(az
17250 44 61 74 61 5b 30 5d 29 21 3d 63 65 6c 6c 2e 69  Data[0])!=cell.i
17260 52 6f 77 69 64 0a 20 20 20 20 20 20 29 7b 0a 20  Rowid.      ){. 
17270 20 20 20 20 20 20 20 69 6e 74 20 73 74 65 70 72         int stepr
17280 63 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  c;.        sqlit
17290 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 52  e3_bind_int64(pR
172a0 74 72 65 65 2d 3e 70 52 65 61 64 52 6f 77 69 64  tree->pReadRowid
172b0 2c 20 31 2c 20 63 65 6c 6c 2e 69 52 6f 77 69 64  , 1, cell.iRowid
172c0 29 3b 0a 20 20 20 20 20 20 20 20 73 74 65 70 72  );.        stepr
172d0 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70  c = sqlite3_step
172e0 28 70 52 74 72 65 65 2d 3e 70 52 65 61 64 52 6f  (pRtree->pReadRo
172f0 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 72 63  wid);.        rc
17300 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
17310 28 70 52 74 72 65 65 2d 3e 70 52 65 61 64 52 6f  (pRtree->pReadRo
17320 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 69 66  wid);.        if
17330 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 74  ( SQLITE_ROW==st
17340 65 70 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  eprc ){.        
17350 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 74    if( sqlite3_vt
17360 61 62 5f 6f 6e 5f 63 6f 6e 66 6c 69 63 74 28 70  ab_on_conflict(p
17370 52 74 72 65 65 2d 3e 64 62 29 3d 3d 53 51 4c 49  Rtree->db)==SQLI
17380 54 45 5f 52 45 50 4c 41 43 45 20 29 7b 0a 20 20  TE_REPLACE ){.  
17390 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 72            rc = r
173a0 74 72 65 65 44 65 6c 65 74 65 52 6f 77 69 64 28  treeDeleteRowid(
173b0 70 52 74 72 65 65 2c 20 63 65 6c 6c 2e 69 52 6f  pRtree, cell.iRo
173c0 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  wid);.          
173d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
173e0 20 20 20 72 63 20 3d 20 72 74 72 65 65 43 6f 6e     rc = rtreeCon
173f0 73 74 72 61 69 6e 74 45 72 72 6f 72 28 70 52 74  straintError(pRt
17400 72 65 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ree, 0);.       
17410 20 20 20 20 20 67 6f 74 6f 20 63 6f 6e 73 74 72       goto constr
17420 61 69 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20  aint;.          
17430 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
17440 20 20 7d 0a 20 20 20 20 20 20 62 48 61 76 65 52    }.      bHaveR
17450 6f 77 69 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  owid = 1;.    }.
17460 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 7a 44    }..  /* If azD
17470 61 74 61 5b 30 5d 20 69 73 20 6e 6f 74 20 61 6e  ata[0] is not an
17480 20 53 51 4c 20 4e 55 4c 4c 20 76 61 6c 75 65 2c   SQL NULL value,
17490 20 69 74 20 69 73 20 74 68 65 20 72 6f 77 69 64   it is the rowid
174a0 20 6f 66 20 61 0a 20 20 2a 2a 20 72 65 63 6f 72   of a.  ** recor
174b0 64 20 74 6f 20 64 65 6c 65 74 65 20 66 72 6f 6d  d to delete from
174c0 20 74 68 65 20 72 2d 74 72 65 65 20 74 61 62 6c   the r-tree tabl
174d0 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e. The following
174e0 20 62 6c 6f 63 6b 20 64 6f 65 73 0a 20 20 2a 2a   block does.  **
174f0 20 6a 75 73 74 20 74 68 61 74 2e 0a 20 20 2a 2f   just that..  */
17500 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76  .  if( sqlite3_v
17510 61 6c 75 65 5f 74 79 70 65 28 61 7a 44 61 74 61  alue_type(azData
17520 5b 30 5d 29 21 3d 53 51 4c 49 54 45 5f 4e 55 4c  [0])!=SQLITE_NUL
17530 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 74  L ){.    rc = rt
17540 72 65 65 44 65 6c 65 74 65 52 6f 77 69 64 28 70  reeDeleteRowid(p
17550 52 74 72 65 65 2c 20 73 71 6c 69 74 65 33 5f 76  Rtree, sqlite3_v
17560 61 6c 75 65 5f 69 6e 74 36 34 28 61 7a 44 61 74  alue_int64(azDat
17570 61 5b 30 5d 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f  a[0]));.  }..  /
17580 2a 20 49 66 20 74 68 65 20 61 7a 44 61 74 61 5b  * If the azData[
17590 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73  ] array contains
175a0 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 65   more than one e
175b0 6c 65 6d 65 6e 74 2c 20 65 6c 65 6d 65 6e 74 73  lement, elements
175c0 0a 20 20 2a 2a 20 28 61 7a 44 61 74 61 5b 32 5d  .  ** (azData[2]
175d0 2e 2e 61 7a 44 61 74 61 5b 61 72 67 63 2d 31 5d  ..azData[argc-1]
175e0 29 20 63 6f 6e 74 61 69 6e 20 61 20 6e 65 77 20  ) contain a new 
175f0 72 65 63 6f 72 64 20 74 6f 20 69 6e 73 65 72 74  record to insert
17600 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 72   into.  ** the r
17610 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e  -tree structure.
17620 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
17630 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 44 61  SQLITE_OK && nDa
17640 74 61 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49  ta>1 ){.    /* I
17650 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 72 65  nsert the new re
17660 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 72 2d  cord into the r-
17670 74 72 65 65 20 2a 2f 0a 20 20 20 20 52 74 72 65  tree */.    Rtre
17680 65 4e 6f 64 65 20 2a 70 4c 65 61 66 20 3d 20 30  eNode *pLeaf = 0
17690 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65  ;..    /* Figure
176a0 20 6f 75 74 20 74 68 65 20 72 6f 77 69 64 20 6f   out the rowid o
176b0 66 20 74 68 65 20 6e 65 77 20 72 6f 77 2e 20 2a  f the new row. *
176c0 2f 0a 20 20 20 20 69 66 28 20 62 48 61 76 65 52  /.    if( bHaveR
176d0 6f 77 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  owid==0 ){.     
176e0 20 72 63 20 3d 20 6e 65 77 52 6f 77 69 64 28 70   rc = newRowid(p
176f0 52 74 72 65 65 2c 20 26 63 65 6c 6c 2e 69 52 6f  Rtree, &cell.iRo
17700 77 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  wid);.    }.    
17710 2a 70 52 6f 77 69 64 20 3d 20 63 65 6c 6c 2e 69  *pRowid = cell.i
17720 52 6f 77 69 64 3b 0a 0a 20 20 20 20 69 66 28 20  Rowid;..    if( 
17730 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
17740 0a 20 20 20 20 20 20 72 63 20 3d 20 43 68 6f 6f  .      rc = Choo
17750 73 65 4c 65 61 66 28 70 52 74 72 65 65 2c 20 26  seLeaf(pRtree, &
17760 63 65 6c 6c 2c 20 30 2c 20 26 70 4c 65 61 66 29  cell, 0, &pLeaf)
17770 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
17780 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
17790 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32 3b 0a  .      int rc2;.
177a0 20 20 20 20 20 20 70 52 74 72 65 65 2d 3e 69 52        pRtree->iR
177b0 65 69 6e 73 65 72 74 48 65 69 67 68 74 20 3d 20  einsertHeight = 
177c0 2d 31 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72  -1;.      rc = r
177d0 74 72 65 65 49 6e 73 65 72 74 43 65 6c 6c 28 70  treeInsertCell(p
177e0 52 74 72 65 65 2c 20 70 4c 65 61 66 2c 20 26 63  Rtree, pLeaf, &c
177f0 65 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  ell, 0);.      r
17800 63 32 20 3d 20 6e 6f 64 65 52 65 6c 65 61 73 65  c2 = nodeRelease
17810 28 70 52 74 72 65 65 2c 20 70 4c 65 61 66 29 3b  (pRtree, pLeaf);
17820 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
17830 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17840 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20      rc = rc2;.  
17850 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
17860 0a 63 6f 6e 73 74 72 61 69 6e 74 3a 0a 20 20 72  .constraint:.  r
17870 74 72 65 65 52 65 6c 65 61 73 65 28 70 52 74 72  treeRelease(pRtr
17880 65 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ee);.  return rc
17890 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 65  ;.}../*.** Calle
178a0 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63  d when a transac
178b0 74 69 6f 6e 20 73 74 61 72 74 73 2e 0a 2a 2f 0a  tion starts..*/.
178c0 73 74 61 74 69 63 20 69 6e 74 20 72 74 72 65 65  static int rtree
178d0 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  BeginTransaction
178e0 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70  (sqlite3_vtab *p
178f0 56 74 61 62 29 7b 0a 20 20 52 74 72 65 65 20 2a  Vtab){.  Rtree *
17900 70 52 74 72 65 65 20 3d 20 28 52 74 72 65 65 20  pRtree = (Rtree 
17910 2a 29 70 56 74 61 62 3b 0a 20 20 61 73 73 65 72  *)pVtab;.  asser
17920 74 28 20 70 52 74 72 65 65 2d 3e 69 6e 57 72 54  t( pRtree->inWrT
17930 72 61 6e 73 3d 3d 30 20 29 3b 0a 20 20 70 52 74  rans==0 );.  pRt
17940 72 65 65 2d 3e 69 6e 57 72 54 72 61 6e 73 2b 2b  ree->inWrTrans++
17950 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
17960 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
17970 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 74 72 61  alled when a tra
17980 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 70 6c 65 74  nsaction complet
17990 65 73 20 28 65 69 74 68 65 72 20 62 79 20 43 4f  es (either by CO
179a0 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c 42 41 43 4b  MMIT or ROLLBACK
179b0 29 2e 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65  )..** The sqlite
179c0 33 5f 62 6c 6f 62 20 6f 62 6a 65 63 74 20 73 68  3_blob object sh
179d0 6f 75 6c 64 20 62 65 20 72 65 6c 65 61 73 65 64  ould be released
179e0 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a   at this point..
179f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 74  */.static int rt
17a00 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f  reeEndTransactio
17a10 6e 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a  n(sqlite3_vtab *
17a20 70 56 74 61 62 29 7b 0a 20 20 52 74 72 65 65 20  pVtab){.  Rtree 
17a30 2a 70 52 74 72 65 65 20 3d 20 28 52 74 72 65 65  *pRtree = (Rtree
17a40 20 2a 29 70 56 74 61 62 3b 0a 20 20 70 52 74 72   *)pVtab;.  pRtr
17a50 65 65 2d 3e 69 6e 57 72 54 72 61 6e 73 20 3d 20  ee->inWrTrans = 
17a60 30 3b 0a 20 20 6e 6f 64 65 42 6c 6f 62 52 65 73  0;.  nodeBlobRes
17a70 65 74 28 70 52 74 72 65 65 29 3b 0a 20 20 72 65  et(pRtree);.  re
17a80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
17a90 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 78 52 65  }../*.** The xRe
17aa0 6e 61 6d 65 20 6d 65 74 68 6f 64 20 66 6f 72 20  name method for 
17ab0 72 74 72 65 65 20 6d 6f 64 75 6c 65 20 76 69 72  rtree module vir
17ac0 74 75 61 6c 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a  tual tables..*/.
17ad0 73 74 61 74 69 63 20 69 6e 74 20 72 74 72 65 65  static int rtree
17ae0 52 65 6e 61 6d 65 28 73 71 6c 69 74 65 33 5f 76  Rename(sqlite3_v
17af0 74 61 62 20 2a 70 56 74 61 62 2c 20 63 6f 6e 73  tab *pVtab, cons
17b00 74 20 63 68 61 72 20 2a 7a 4e 65 77 4e 61 6d 65  t char *zNewName
17b10 29 7b 0a 20 20 52 74 72 65 65 20 2a 70 52 74 72  ){.  Rtree *pRtr
17b20 65 65 20 3d 20 28 52 74 72 65 65 20 2a 29 70 56  ee = (Rtree *)pV
17b30 74 61 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  tab;.  int rc = 
17b40 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
17b50 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c  char *zSql = sql
17b60 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
17b70 20 20 22 41 4c 54 45 52 20 54 41 42 4c 45 20 25    "ALTER TABLE %
17b80 51 2e 27 25 71 5f 6e 6f 64 65 27 20 20 20 52 45  Q.'%q_node'   RE
17b90 4e 41 4d 45 20 54 4f 20 5c 22 25 77 5f 6e 6f 64  NAME TO \"%w_nod
17ba0 65 5c 22 3b 22 0a 20 20 20 20 22 41 4c 54 45 52  e\";".    "ALTER
17bb0 20 54 41 42 4c 45 20 25 51 2e 27 25 71 5f 70 61   TABLE %Q.'%q_pa
17bc0 72 65 6e 74 27 20 52 45 4e 41 4d 45 20 54 4f 20  rent' RENAME TO 
17bd0 5c 22 25 77 5f 70 61 72 65 6e 74 5c 22 3b 22 0a  \"%w_parent\";".
17be0 20 20 20 20 22 41 4c 54 45 52 20 54 41 42 4c 45      "ALTER TABLE
17bf0 20 25 51 2e 27 25 71 5f 72 6f 77 69 64 27 20 20   %Q.'%q_rowid'  
17c00 52 45 4e 41 4d 45 20 54 4f 20 5c 22 25 77 5f 72  RENAME TO \"%w_r
17c10 6f 77 69 64 5c 22 3b 22 0a 20 20 20 20 2c 20 70  owid\";".    , p
17c20 52 74 72 65 65 2d 3e 7a 44 62 2c 20 70 52 74 72  Rtree->zDb, pRtr
17c30 65 65 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 65 77 4e  ee->zName, zNewN
17c40 61 6d 65 20 0a 20 20 20 20 2c 20 70 52 74 72 65  ame .    , pRtre
17c50 65 2d 3e 7a 44 62 2c 20 70 52 74 72 65 65 2d 3e  e->zDb, pRtree->
17c60 7a 4e 61 6d 65 2c 20 7a 4e 65 77 4e 61 6d 65 20  zName, zNewName 
17c70 0a 20 20 20 20 2c 20 70 52 74 72 65 65 2d 3e 7a  .    , pRtree->z
17c80 44 62 2c 20 70 52 74 72 65 65 2d 3e 7a 4e 61 6d  Db, pRtree->zNam
17c90 65 2c 20 7a 4e 65 77 4e 61 6d 65 0a 20 20 29 3b  e, zNewName.  );
17ca0 0a 20 20 69 66 28 20 7a 53 71 6c 20 29 7b 0a 20  .  if( zSql ){. 
17cb0 20 20 20 6e 6f 64 65 42 6c 6f 62 52 65 73 65 74     nodeBlobReset
17cc0 28 70 52 74 72 65 65 29 3b 0a 20 20 20 20 72 63  (pRtree);.    rc
17cd0 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
17ce0 70 52 74 72 65 65 2d 3e 64 62 2c 20 7a 53 71 6c  pRtree->db, zSql
17cf0 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
17d00 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
17d10 6c 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  l);.  }.  return
17d20 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
17d30 65 20 78 53 61 76 65 70 6f 69 6e 74 20 6d 65 74  e xSavepoint met
17d40 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  hod..**.** This 
17d50 6d 6f 64 75 6c 65 20 64 6f 65 73 20 6e 6f 74 20  module does not 
17d60 6e 65 65 64 20 74 6f 20 64 6f 20 61 6e 79 74 68  need to do anyth
17d70 69 6e 67 20 74 6f 20 73 75 70 70 6f 72 74 20 73  ing to support s
17d80 61 76 65 70 6f 69 6e 74 73 2e 20 48 6f 77 65 76  avepoints. Howev
17d90 65 72 2c 0a 2a 2a 20 69 74 20 75 73 65 73 20 74  er,.** it uses t
17da0 68 69 73 20 68 6f 6f 6b 20 74 6f 20 63 6c 6f 73  his hook to clos
17db0 65 20 61 6e 79 20 6f 70 65 6e 20 62 6c 6f 62 20  e any open blob 
17dc0 68 61 6e 64 6c 65 2e 20 54 68 69 73 20 69 73 20  handle. This is 
17dd0 64 6f 6e 65 20 62 65 63 61 75 73 65 20 61 20 0a  done because a .
17de0 2a 2a 20 44 52 4f 50 20 54 41 42 4c 45 20 63 6f  ** DROP TABLE co
17df0 6d 6d 61 6e 64 20 2d 20 77 68 69 63 68 20 66 6f  mmand - which fo
17e00 72 74 75 6e 61 74 65 6c 79 20 61 6c 77 61 79 73  rtunately always
17e10 20 6f 70 65 6e 73 20 61 20 73 61 76 65 70 6f 69   opens a savepoi
17e20 6e 74 20 2d 20 63 61 6e 6e 6f 74 20 0a 2a 2a 20  nt - cannot .** 
17e30 73 75 63 63 65 65 64 20 69 66 20 74 68 65 72 65  succeed if there
17e40 20 61 72 65 20 61 6e 79 20 6f 70 65 6e 20 62 6c   are any open bl
17e50 6f 62 20 68 61 6e 64 6c 65 73 2e 20 69 2e 65 2e  ob handles. i.e.
17e60 20 69 66 20 74 68 65 20 62 6c 6f 62 20 68 61 6e   if the blob han
17e70 64 6c 65 20 77 65 72 65 0a 2a 2a 20 6e 6f 74 20  dle were.** not 
17e80 63 6c 6f 73 65 64 20 68 65 72 65 2c 20 74 68 65  closed here, the
17e90 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 6f 75 6c 64   following would
17ea0 20 66 61 69 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20 42   fail:.**.**   B
17eb0 45 47 49 4e 3b 0a 2a 2a 20 20 20 20 20 49 4e 53  EGIN;.**     INS
17ec0 45 52 54 20 49 4e 54 4f 20 72 74 72 65 65 2e 2e  ERT INTO rtree..
17ed0 2e 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54 41  ..**     DROP TA
17ee0 42 4c 45 20 3c 74 61 62 6c 65 6e 61 6d 65 3e 3b  BLE <tablename>;
17ef0 20 20 20 20 2d 2d 20 57 6f 75 6c 64 20 66 61 69      -- Would fai
17f00 6c 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4c 4f  l with SQLITE_LO
17f10 43 4b 45 44 0a 2a 2a 20 20 20 43 4f 4d 4d 49 54  CKED.**   COMMIT
17f20 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.*/.static int 
17f30 72 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 73  rtreeSavepoint(s
17f40 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
17f50 61 62 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69  ab, int iSavepoi
17f60 6e 74 29 7b 0a 20 20 52 74 72 65 65 20 2a 70 52  nt){.  Rtree *pR
17f70 74 72 65 65 20 3d 20 28 52 74 72 65 65 20 2a 29  tree = (Rtree *)
17f80 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 69 77 74  pVtab;.  int iwt
17f90 20 3d 20 70 52 74 72 65 65 2d 3e 69 6e 57 72 54   = pRtree->inWrT
17fa0 72 61 6e 73 3b 0a 20 20 55 4e 55 53 45 44 5f 50  rans;.  UNUSED_P
17fb0 41 52 41 4d 45 54 45 52 28 69 53 61 76 65 70 6f  ARAMETER(iSavepo
17fc0 69 6e 74 29 3b 0a 20 20 70 52 74 72 65 65 2d 3e  int);.  pRtree->
17fd0 69 6e 57 72 54 72 61 6e 73 20 3d 20 30 3b 0a 20  inWrTrans = 0;. 
17fe0 20 6e 6f 64 65 42 6c 6f 62 52 65 73 65 74 28 70   nodeBlobReset(p
17ff0 52 74 72 65 65 29 3b 0a 20 20 70 52 74 72 65 65  Rtree);.  pRtree
18000 2d 3e 69 6e 57 72 54 72 61 6e 73 20 3d 20 69 77  ->inWrTrans = iw
18010 74 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  t;.  return SQLI
18020 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
18030 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70 6f  This function po
18040 70 75 6c 61 74 65 73 20 74 68 65 20 70 52 74 72  pulates the pRtr
18050 65 65 2d 3e 6e 52 6f 77 45 73 74 20 76 61 72 69  ee->nRowEst vari
18060 61 62 6c 65 20 77 69 74 68 20 61 6e 20 65 73 74  able with an est
18070 69 6d 61 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20  imate.** of the 
18080 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
18090 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  n the virtual ta
180a0 62 6c 65 2e 20 49 66 20 70 6f 73 73 69 62 6c 65  ble. If possible
180b0 2c 20 74 68 69 73 20 69 73 20 62 61 73 65 64 0a  , this is based.
180c0 2a 2a 20 6f 6e 20 73 71 6c 69 74 65 5f 73 74 61  ** on sqlite_sta
180d0 74 31 20 64 61 74 61 2e 20 4f 74 68 65 72 77 69  t1 data. Otherwi
180e0 73 65 2c 20 75 73 65 20 52 54 52 45 45 5f 44 45  se, use RTREE_DE
180f0 46 41 55 4c 54 5f 52 4f 57 45 53 54 2e 0a 2a 2f  FAULT_ROWEST..*/
18100 0a 73 74 61 74 69 63 20 69 6e 74 20 72 74 72 65  .static int rtre
18110 65 51 75 65 72 79 53 74 61 74 31 28 73 71 6c 69  eQueryStat1(sqli
18120 74 65 33 20 2a 64 62 2c 20 52 74 72 65 65 20 2a  te3 *db, Rtree *
18130 70 52 74 72 65 65 29 7b 0a 20 20 63 6f 6e 73 74  pRtree){.  const
18140 20 63 68 61 72 20 2a 7a 46 6d 74 20 3d 20 22 53   char *zFmt = "S
18150 45 4c 45 43 54 20 73 74 61 74 20 46 52 4f 4d 20  ELECT stat FROM 
18160 25 51 2e 73 71 6c 69 74 65 5f 73 74 61 74 31 20  %Q.sqlite_stat1 
18170 57 48 45 52 45 20 74 62 6c 20 3d 20 27 25 71 5f  WHERE tbl = '%q_
18180 72 6f 77 69 64 27 22 3b 0a 20 20 63 68 61 72 20  rowid'";.  char 
18190 2a 7a 53 71 6c 3b 0a 20 20 73 71 6c 69 74 65 33  *zSql;.  sqlite3
181a0 5f 73 74 6d 74 20 2a 70 3b 0a 20 20 69 6e 74 20  _stmt *p;.  int 
181b0 72 63 3b 0a 20 20 69 36 34 20 6e 52 6f 77 20 3d  rc;.  i64 nRow =
181c0 20 30 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69   0;..  rc = sqli
181d0 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e  te3_table_column
181e0 5f 6d 65 74 61 64 61 74 61 28 0a 20 20 20 20 20  _metadata(.     
181f0 20 64 62 2c 20 70 52 74 72 65 65 2d 3e 7a 44 62   db, pRtree->zDb
18200 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74 31 22  , "sqlite_stat1"
18210 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30 0a 20 20 29  ,0,0,0,0,0,0.  )
18220 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
18230 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 52 74  TE_OK ){.    pRt
18240 72 65 65 2d 3e 6e 52 6f 77 45 73 74 20 3d 20 52  ree->nRowEst = R
18250 54 52 45 45 5f 44 45 46 41 55 4c 54 5f 52 4f 57  TREE_DEFAULT_ROW
18260 45 53 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  EST;.    return 
18270 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52  rc==SQLITE_ERROR
18280 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72   ? SQLITE_OK : r
18290 63 3b 0a 20 20 7d 0a 20 20 7a 53 71 6c 20 3d 20  c;.  }.  zSql = 
182a0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
182b0 7a 46 6d 74 2c 20 70 52 74 72 65 65 2d 3e 7a 44  zFmt, pRtree->zD
182c0 62 2c 20 70 52 74 72 65 65 2d 3e 7a 4e 61 6d 65  b, pRtree->zName
182d0 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  );.  if( zSql==0
182e0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
182f0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c  ITE_NOMEM;.  }el
18300 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  se{.    rc = sql
18310 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
18320 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
18330 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
18340 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
18350 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
18360 5f 73 74 65 70 28 70 29 3d 3d 53 51 4c 49 54 45  _step(p)==SQLITE
18370 5f 52 4f 57 20 29 20 6e 52 6f 77 20 3d 20 73 71  _ROW ) nRow = sq
18380 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
18390 36 34 28 70 2c 20 30 29 3b 0a 20 20 20 20 20 20  64(p, 0);.      
183a0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e  rc = sqlite3_fin
183b0 61 6c 69 7a 65 28 70 29 3b 0a 20 20 20 20 7d 65  alize(p);.    }e
183c0 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49  lse if( rc!=SQLI
183d0 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  TE_NOMEM ){.    
183e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
183f0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
18400 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
18410 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 52 6f 77  {.      if( nRow
18420 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
18430 52 74 72 65 65 2d 3e 6e 52 6f 77 45 73 74 20 3d  Rtree->nRowEst =
18440 20 52 54 52 45 45 5f 44 45 46 41 55 4c 54 5f 52   RTREE_DEFAULT_R
18450 4f 57 45 53 54 3b 0a 20 20 20 20 20 20 7d 65 6c  OWEST;.      }el
18460 73 65 7b 0a 20 20 20 20 20 20 20 20 70 52 74 72  se{.        pRtr
18470 65 65 2d 3e 6e 52 6f 77 45 73 74 20 3d 20 4d 41  ee->nRowEst = MA
18480 58 28 6e 52 6f 77 2c 20 52 54 52 45 45 5f 4d 49  X(nRow, RTREE_MI
18490 4e 5f 52 4f 57 45 53 54 29 3b 0a 20 20 20 20 20  N_ROWEST);.     
184a0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
184b0 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
184c0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
184d0 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 73 71 6c  c;.}..static sql
184e0 69 74 65 33 5f 6d 6f 64 75 6c 65 20 72 74 72 65  ite3_module rtre
184f0 65 4d 6f 64 75 6c 65 20 3d 20 7b 0a 20 20 32 2c  eModule = {.  2,
18500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18510 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
18520 72 73 69 6f 6e 20 2a 2f 0a 20 20 72 74 72 65 65  rsion */.  rtree
18530 43 72 65 61 74 65 2c 20 20 20 20 20 20 20 20 20  Create,         
18540 20 20 20 20 20 20 20 2f 2a 20 78 43 72 65 61 74         /* xCreat
18550 65 20 2d 20 63 72 65 61 74 65 20 61 20 74 61 62  e - create a tab
18560 6c 65 20 2a 2f 0a 20 20 72 74 72 65 65 43 6f 6e  le */.  rtreeCon
18570 6e 65 63 74 2c 20 20 20 20 20 20 20 20 20 20 20  nect,           
18580 20 20 20 20 2f 2a 20 78 43 6f 6e 6e 65 63 74 20      /* xConnect 
18590 2d 20 63 6f 6e 6e 65 63 74 20 74 6f 20 61 6e 20  - connect to an 
185a0 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 2a  existing table *
185b0 2f 0a 20 20 72 74 72 65 65 42 65 73 74 49 6e 64  /.  rtreeBestInd
185c0 65 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ex,             
185d0 2f 2a 20 78 42 65 73 74 49 6e 64 65 78 20 2d 20  /* xBestIndex - 
185e0 44 65 74 65 72 6d 69 6e 65 20 73 65 61 72 63 68  Determine search
185f0 20 73 74 72 61 74 65 67 79 20 2a 2f 0a 20 20 72   strategy */.  r
18600 74 72 65 65 44 69 73 63 6f 6e 6e 65 63 74 2c 20  treeDisconnect, 
18610 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
18620 69 73 63 6f 6e 6e 65 63 74 20 2d 20 44 69 73 63  isconnect - Disc
18630 6f 6e 6e 65 63 74 20 66 72 6f 6d 20 61 20 74 61  onnect from a ta
18640 62 6c 65 20 2a 2f 0a 20 20 72 74 72 65 65 44 65  ble */.  rtreeDe
18650 73 74 72 6f 79 2c 20 20 20 20 20 20 20 20 20 20  stroy,          
18660 20 20 20 20 20 2f 2a 20 78 44 65 73 74 72 6f 79       /* xDestroy
18670 20 2d 20 44 72 6f 70 20 61 20 74 61 62 6c 65 20   - Drop a table 
18680 2a 2f 0a 20 20 72 74 72 65 65 4f 70 65 6e 2c 20  */.  rtreeOpen, 
18690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
186a0 20 2f 2a 20 78 4f 70 65 6e 20 2d 20 6f 70 65 6e   /* xOpen - open
186b0 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 72   a cursor */.  r
186c0 74 72 65 65 43 6c 6f 73 65 2c 20 20 20 20 20 20  treeClose,      
186d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
186e0 6c 6f 73 65 20 2d 20 63 6c 6f 73 65 20 61 20 63  lose - close a c
186f0 75 72 73 6f 72 20 2a 2f 0a 20 20 72 74 72 65 65  ursor */.  rtree
18700 46 69 6c 74 65 72 2c 20 20 20 20 20 20 20 20 20  Filter,         
18710 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 74 65         /* xFilte
18720 72 20 2d 20 63 6f 6e 66 69 67 75 72 65 20 73 63  r - configure sc
18730 61 6e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  an constraints *
18740 2f 0a 20 20 72 74 72 65 65 4e 65 78 74 2c 20 20  /.  rtreeNext,  
18750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18760 2f 2a 20 78 4e 65 78 74 20 2d 20 61 64 76 61 6e  /* xNext - advan
18770 63 65 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20  ce a cursor */. 
18780 20 72 74 72 65 65 45 6f 66 2c 20 20 20 20 20 20   rtreeEof,      
18790 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
187a0 78 45 6f 66 20 2a 2f 0a 20 20 72 74 72 65 65 43  xEof */.  rtreeC
187b0 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20  olumn,          
187c0 20 20 20 20 20 20 2f 2a 20 78 43 6f 6c 75 6d 6e        /* xColumn
187d0 20 2d 20 72 65 61 64 20 64 61 74 61 20 2a 2f 0a   - read data */.
187e0 20 20 72 74 72 65 65 52 6f 77 69 64 2c 20 20 20    rtreeRowid,   
187f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18800 20 78 52 6f 77 69 64 20 2d 20 72 65 61 64 20 64   xRowid - read d
18810 61 74 61 20 2a 2f 0a 20 20 72 74 72 65 65 55 70  ata */.  rtreeUp
18820 64 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  date,           
18830 20 20 20 20 20 2f 2a 20 78 55 70 64 61 74 65 20       /* xUpdate 
18840 2d 20 77 72 69 74 65 20 64 61 74 61 20 2a 2f 0a  - write data */.
18850 20 20 72 74 72 65 65 42 65 67 69 6e 54 72 61 6e    rtreeBeginTran
18860 73 61 63 74 69 6f 6e 2c 20 20 20 20 20 20 2f 2a  saction,      /*
18870 20 78 42 65 67 69 6e 20 2d 20 62 65 67 69 6e 20   xBegin - begin 
18880 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
18890 20 72 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63   rtreeEndTransac
188a0 74 69 6f 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20  tion,        /* 
188b0 78 53 79 6e 63 20 2d 20 73 79 6e 63 20 74 72 61  xSync - sync tra
188c0 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 72 74  nsaction */.  rt
188d0 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f  reeEndTransactio
188e0 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f  n,        /* xCo
188f0 6d 6d 69 74 20 2d 20 63 6f 6d 6d 69 74 20 74 72  mmit - commit tr
18900 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 72  ansaction */.  r
18910 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69  treeEndTransacti
18920 6f 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 78 52  on,        /* xR
18930 6f 6c 6c 62 61 63 6b 20 2d 20 72 6f 6c 6c 62 61  ollback - rollba
18940 63 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a  ck transaction *
18950 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
18960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18970 2f 2a 20 78 46 69 6e 64 46 75 6e 63 74 69 6f 6e  /* xFindFunction
18980 20 2d 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65 72   - function over
18990 6c 6f 61 64 69 6e 67 20 2a 2f 0a 20 20 72 74 72  loading */.  rtr
189a0 65 65 52 65 6e 61 6d 65 2c 20 20 20 20 20 20 20  eeRename,       
189b0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 6e           /* xRen
189c0 61 6d 65 20 2d 20 72 65 6e 61 6d 65 20 74 68 65  ame - rename the
189d0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 72 74 72 65   table */.  rtre
189e0 65 53 61 76 65 70 6f 69 6e 74 2c 20 20 20 20 20  eSavepoint,     
189f0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 61 76 65          /* xSave
18a00 70 6f 69 6e 74 20 2a 2f 0a 20 20 30 2c 20 20 20  point */.  0,   
18a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 6c 65 61         /* xRelea
18a30 73 65 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  se */.  0,      
18a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a50 20 20 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b      /* xRollback
18a60 54 6f 20 2a 2f 0a 7d 3b 0a 0a 73 74 61 74 69 63  To */.};..static
18a70 20 69 6e 74 20 72 74 72 65 65 53 71 6c 49 6e 69   int rtreeSqlIni
18a80 74 28 0a 20 20 52 74 72 65 65 20 2a 70 52 74 72  t(.  Rtree *pRtr
18a90 65 65 2c 20 0a 20 20 73 71 6c 69 74 65 33 20 2a  ee, .  sqlite3 *
18aa0 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  db, .  const cha
18ab0 72 20 2a 7a 44 62 2c 20 0a 20 20 63 6f 6e 73 74  r *zDb, .  const
18ac0 20 63 68 61 72 20 2a 7a 50 72 65 66 69 78 2c 20   char *zPrefix, 
18ad0 0a 20 20 69 6e 74 20 69 73 43 72 65 61 74 65 0a  .  int isCreate.
18ae0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
18af0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 23 64 65 66  LITE_OK;..  #def
18b00 69 6e 65 20 4e 5f 53 54 41 54 45 4d 45 4e 54 20  ine N_STATEMENT 
18b10 38 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  8.  static const
18b20 20 63 68 61 72 20 2a 61 7a 53 71 6c 5b 4e 5f 53   char *azSql[N_S
18b30 54 41 54 45 4d 45 4e 54 5d 20 3d 20 7b 0a 20 20  TATEMENT] = {.  
18b40 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 78    /* Write the x
18b50 78 78 5f 6e 6f 64 65 20 74 61 62 6c 65 20 2a 2f  xx_node table */
18b60 0a 20 20 20 20 22 49 4e 53 45 52 54 20 4f 52 20  .    "INSERT OR 
18b70 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 27 25 71  REPLACE INTO '%q
18b80 27 2e 27 25 71 5f 6e 6f 64 65 27 20 56 41 4c 55  '.'%q_node' VALU
18b90 45 53 28 3a 31 2c 20 3a 32 29 22 2c 0a 20 20 20  ES(:1, :2)",.   
18ba0 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 27 25   "DELETE FROM '%
18bb0 71 27 2e 27 25 71 5f 6e 6f 64 65 27 20 57 48 45  q'.'%q_node' WHE
18bc0 52 45 20 6e 6f 64 65 6e 6f 20 3d 20 3a 31 22 2c  RE nodeno = :1",
18bd0 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 61 6e  ..    /* Read an
18be0 64 20 77 72 69 74 65 20 74 68 65 20 78 78 78 5f  d write the xxx_
18bf0 72 6f 77 69 64 20 74 61 62 6c 65 20 2a 2f 0a 20  rowid table */. 
18c00 20 20 20 22 53 45 4c 45 43 54 20 6e 6f 64 65 6e     "SELECT noden
18c10 6f 20 46 52 4f 4d 20 27 25 71 27 2e 27 25 71 5f  o FROM '%q'.'%q_
18c20 72 6f 77 69 64 27 20 57 48 45 52 45 20 72 6f 77  rowid' WHERE row
18c30 69 64 20 3d 20 3a 31 22 2c 0a 20 20 20 20 22 49  id = :1",.    "I
18c40 4e 53 45 52 54 20 4f 52 20 52 45 50 4c 41 43 45  NSERT OR REPLACE
18c50 20 49 4e 54 4f 20 27 25 71 27 2e 27 25 71 5f 72   INTO '%q'.'%q_r
18c60 6f 77 69 64 27 20 56 41 4c 55 45 53 28 3a 31 2c  owid' VALUES(:1,
18c70 20 3a 32 29 22 2c 0a 20 20 20 20 22 44 45 4c 45   :2)",.    "DELE
18c80 54 45 20 46 52 4f 4d 20 27 25 71 27 2e 27 25 71  TE FROM '%q'.'%q
18c90 5f 72 6f 77 69 64 27 20 57 48 45 52 45 20 72 6f  _rowid' WHERE ro
18ca0 77 69 64 20 3d 20 3a 31 22 2c 0a 0a 20 20 20 20  wid = :1",..    
18cb0 2f 2a 20 52 65 61 64 20 61 6e 64 20 77 72 69 74  /* Read and writ
18cc0 65 20 74 68 65 20 78 78 78 5f 70 61 72 65 6e 74  e the xxx_parent
18cd0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 22 53   table */.    "S
18ce0 45 4c 45 43 54 20 70 61 72 65 6e 74 6e 6f 64 65  ELECT parentnode
18cf0 20 46 52 4f 4d 20 27 25 71 27 2e 27 25 71 5f 70   FROM '%q'.'%q_p
18d00 61 72 65 6e 74 27 20 57 48 45 52 45 20 6e 6f 64  arent' WHERE nod
18d10 65 6e 6f 20 3d 20 3a 31 22 2c 0a 20 20 20 20 22  eno = :1",.    "
18d20 49 4e 53 45 52 54 20 4f 52 20 52 45 50 4c 41 43  INSERT OR REPLAC
18d30 45 20 49 4e 54 4f 20 27 25 71 27 2e 27 25 71 5f  E INTO '%q'.'%q_
18d40 70 61 72 65 6e 74 27 20 56 41 4c 55 45 53 28 3a  parent' VALUES(:
18d50 31 2c 20 3a 32 29 22 2c 0a 20 20 20 20 22 44 45  1, :2)",.    "DE
18d60 4c 45 54 45 20 46 52 4f 4d 20 27 25 71 27 2e 27  LETE FROM '%q'.'
18d70 25 71 5f 70 61 72 65 6e 74 27 20 57 48 45 52 45  %q_parent' WHERE
18d80 20 6e 6f 64 65 6e 6f 20 3d 20 3a 31 22 0a 20 20   nodeno = :1".  
18d90 7d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  };.  sqlite3_stm
18da0 74 20 2a 2a 61 70 70 53 74 6d 74 5b 4e 5f 53 54  t **appStmt[N_ST
18db0 41 54 45 4d 45 4e 54 5d 3b 0a 20 20 69 6e 74 20  ATEMENT];.  int 
18dc0 69 3b 0a 0a 20 20 70 52 74 72 65 65 2d 3e 64 62  i;..  pRtree->db
18dd0 20 3d 20 64 62 3b 0a 0a 20 20 69 66 28 20 69 73   = db;..  if( is
18de0 43 72 65 61 74 65 20 29 7b 0a 20 20 20 20 63 68  Create ){.    ch
18df0 61 72 20 2a 7a 43 72 65 61 74 65 20 3d 20 73 71  ar *zCreate = sq
18e00 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 22  lite3_mprintf(."
18e10 43 52 45 41 54 45 20 54 41 42 4c 45 20 5c 22 25  CREATE TABLE \"%
18e20 77 5c 22 2e 5c 22 25 77 5f 6e 6f 64 65 5c 22 28  w\".\"%w_node\"(
18e30 6e 6f 64 65 6e 6f 20 49 4e 54 45 47 45 52 20 50  nodeno INTEGER P
18e40 52 49 4d 41 52 59 20 4b 45 59 2c 20 64 61 74 61  RIMARY KEY, data
18e50 20 42 4c 4f 42 29 3b 22 0a 22 43 52 45 41 54 45   BLOB);"."CREATE
18e60 20 54 41 42 4c 45 20 5c 22 25 77 5c 22 2e 5c 22   TABLE \"%w\".\"
18e70 25 77 5f 72 6f 77 69 64 5c 22 28 72 6f 77 69 64  %w_rowid\"(rowid
18e80 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
18e90 20 4b 45 59 2c 20 6e 6f 64 65 6e 6f 20 49 4e 54   KEY, nodeno INT
18ea0 45 47 45 52 29 3b 22 0a 22 43 52 45 41 54 45 20  EGER);"."CREATE 
18eb0 54 41 42 4c 45 20 5c 22 25 77 5c 22 2e 5c 22 25  TABLE \"%w\".\"%
18ec0 77 5f 70 61 72 65 6e 74 5c 22 28 6e 6f 64 65 6e  w_parent\"(noden
18ed0 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  o INTEGER PRIMAR
18ee0 59 20 4b 45 59 2c 22 0a 20 20 20 20 20 20 20 20  Y KEY,".        
18ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f00 20 20 20 20 20 20 20 20 20 20 22 20 70 61 72 65            " pare
18f10 6e 74 6e 6f 64 65 20 49 4e 54 45 47 45 52 29 3b  ntnode INTEGER);
18f20 22 0a 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 27  "."INSERT INTO '
18f30 25 71 27 2e 27 25 71 5f 6e 6f 64 65 27 20 56 41  %q'.'%q_node' VA
18f40 4c 55 45 53 28 31 2c 20 7a 65 72 6f 62 6c 6f 62  LUES(1, zeroblob
18f50 28 25 64 29 29 22 2c 0a 20 20 20 20 20 20 7a 44  (%d))",.      zD
18f60 62 2c 20 7a 50 72 65 66 69 78 2c 20 7a 44 62 2c  b, zPrefix, zDb,
18f70 20 7a 50 72 65 66 69 78 2c 20 7a 44 62 2c 20 7a   zPrefix, zDb, z
18f80 50 72 65 66 69 78 2c 20 7a 44 62 2c 20 7a 50 72  Prefix, zDb, zPr
18f90 65 66 69 78 2c 20 70 52 74 72 65 65 2d 3e 69 4e  efix, pRtree->iN
18fa0 6f 64 65 53 69 7a 65 0a 20 20 20 20 29 3b 0a 20  odeSize.    );. 
18fb0 20 20 20 69 66 28 20 21 7a 43 72 65 61 74 65 20     if( !zCreate 
18fc0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
18fd0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
18fe0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
18ff0 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 43  ite3_exec(db, zC
19000 72 65 61 74 65 2c 20 30 2c 20 30 2c 20 30 29 3b  reate, 0, 0, 0);
19010 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
19020 65 28 7a 43 72 65 61 74 65 29 3b 0a 20 20 20 20  e(zCreate);.    
19030 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
19040 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
19050 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
19060 0a 20 20 61 70 70 53 74 6d 74 5b 30 5d 20 3d 20  .  appStmt[0] = 
19070 26 70 52 74 72 65 65 2d 3e 70 57 72 69 74 65 4e  &pRtree->pWriteN
19080 6f 64 65 3b 0a 20 20 61 70 70 53 74 6d 74 5b 31  ode;.  appStmt[1
19090 5d 20 3d 20 26 70 52 74 72 65 65 2d 3e 70 44 65  ] = &pRtree->pDe
190a0 6c 65 74 65 4e 6f 64 65 3b 0a 20 20 61 70 70 53  leteNode;.  appS
190b0 74 6d 74 5b 32 5d 20 3d 20 26 70 52 74 72 65 65  tmt[2] = &pRtree
190c0 2d 3e 70 52 65 61 64 52 6f 77 69 64 3b 0a 20 20  ->pReadRowid;.  
190d0 61 70 70 53 74 6d 74 5b 33 5d 20 3d 20 26 70 52  appStmt[3] = &pR
190e0 74 72 65 65 2d 3e 70 57 72 69 74 65 52 6f 77 69  tree->pWriteRowi
190f0 64 3b 0a 20 20 61 70 70 53 74 6d 74 5b 34 5d 20  d;.  appStmt[4] 
19100 3d 20 26 70 52 74 72 65 65 2d 3e 70 44 65 6c 65  = &pRtree->pDele
19110 74 65 52 6f 77 69 64 3b 0a 20 20 61 70 70 53 74  teRowid;.  appSt
19120 6d 74 5b 35 5d 20 3d 20 26 70 52 74 72 65 65 2d  mt[5] = &pRtree-
19130 3e 70 52 65 61 64 50 61 72 65 6e 74 3b 0a 20 20  >pReadParent;.  
19140 61 70 70 53 74 6d 74 5b 36 5d 20 3d 20 26 70 52  appStmt[6] = &pR
19150 74 72 65 65 2d 3e 70 57 72 69 74 65 50 61 72 65  tree->pWritePare
19160 6e 74 3b 0a 20 20 61 70 70 53 74 6d 74 5b 37 5d  nt;.  appStmt[7]
19170 20 3d 20 26 70 52 74 72 65 65 2d 3e 70 44 65 6c   = &pRtree->pDel
19180 65 74 65 50 61 72 65 6e 74 3b 0a 0a 20 20 72 63  eteParent;..  rc
19190 20 3d 20 72 74 72 65 65 51 75 65 72 79 53 74 61   = rtreeQuerySta
191a0 74 31 28 64 62 2c 20 70 52 74 72 65 65 29 3b 0a  t1(db, pRtree);.
191b0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 5f 53    for(i=0; i<N_S
191c0 54 41 54 45 4d 45 4e 54 20 26 26 20 72 63 3d 3d  TATEMENT && rc==
191d0 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b  SQLITE_OK; i++){
191e0 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 20  .    char *zSql 
191f0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
19200 66 28 61 7a 53 71 6c 5b 69 5d 2c 20 7a 44 62 2c  f(azSql[i], zDb,
19210 20 7a 50 72 65 66 69 78 29 3b 0a 20 20 20 20 69   zPrefix);.    i
19220 66 28 20 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20  f( zSql ){.     
19230 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
19240 65 70 61 72 65 5f 76 33 28 64 62 2c 20 7a 53 71  epare_v3(db, zSq
19250 6c 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 50 52  l, -1, SQLITE_PR
19260 45 50 41 52 45 5f 50 45 52 53 49 53 54 45 4e 54  EPARE_PERSISTENT
19270 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19290 61 70 70 53 74 6d 74 5b 69 5d 2c 20 30 29 3b 20  appStmt[i], 0); 
192a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
192b0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
192c0 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  MEM;.    }.    s
192d0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
192e0 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
192f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
19300 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
19310 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
19320 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  on contains the 
19330 74 65 78 74 20 6f 66 20 61 6e 20 53 51 4c 20 73  text of an SQL s
19340 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 68 61 74  tatement.** that
19350 20 72 65 74 75 72 6e 73 20 61 20 73 69 6e 67 6c   returns a singl
19360 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 2e  e integer value.
19370 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   The statement i
19380 73 20 63 6f 6d 70 69 6c 65 64 20 61 6e 64 20 65  s compiled and e
19390 78 65 63 75 74 65 64 0a 2a 2a 20 75 73 69 6e 67  xecuted.** using
193a0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
193b0 74 69 6f 6e 20 64 62 2e 20 49 66 20 73 75 63 63  tion db. If succ
193c0 65 73 73 66 75 6c 2c 20 74 68 65 20 69 6e 74 65  essful, the inte
193d0 67 65 72 20 76 61 6c 75 65 20 72 65 74 75 72 6e  ger value return
193e0 65 64 0a 2a 2a 20 69 73 20 77 72 69 74 74 65 6e  ed.** is written
193f0 20 74 6f 20 2a 70 69 56 61 6c 20 61 6e 64 20 53   to *piVal and S
19400 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
19410 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e  d. Otherwise, an
19420 20 53 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a   SQLite error.**
19430 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
19440 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20  d and the value 
19450 6f 66 20 2a 70 69 56 61 6c 20 61 66 74 65 72 20  of *piVal after 
19460 72 65 74 75 72 6e 69 6e 67 20 69 73 20 6e 6f 74  returning is not
19470 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61   defined..*/.sta
19480 74 69 63 20 69 6e 74 20 67 65 74 49 6e 74 46 72  tic int getIntFr
19490 6f 6d 53 74 6d 74 28 73 71 6c 69 74 65 33 20 2a  omStmt(sqlite3 *
194a0 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
194b0 7a 53 71 6c 2c 20 69 6e 74 20 2a 70 69 56 61 6c  zSql, int *piVal
194c0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
194d0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 69 66  LITE_NOMEM;.  if
194e0 28 20 7a 53 71 6c 20 29 7b 0a 20 20 20 20 73 71  ( zSql ){.    sq
194f0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
19500 74 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  t = 0;.    rc = 
19510 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
19520 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  v2(db, zSql, -1,
19530 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
19540 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
19550 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
19560 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
19570 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20  te3_step(pStmt) 
19580 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 69 56 61  ){.        *piVa
19590 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
195a0 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29  mn_int(pStmt, 0)
195b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
195c0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e  rc = sqlite3_fin
195d0 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
195e0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
195f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
19600 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
19610 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69  alled from withi
19620 6e 20 74 68 65 20 78 43 6f 6e 6e 65 63 74 28 29  n the xConnect()
19630 20 6f 72 20 78 43 72 65 61 74 65 28 29 20 6d 65   or xCreate() me
19640 74 68 6f 64 20 74 6f 0a 2a 2a 20 64 65 74 65 72  thod to.** deter
19650 6d 69 6e 65 20 74 68 65 20 6e 6f 64 65 2d 73 69  mine the node-si
19660 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20 72  ze used by the r
19670 74 72 65 65 20 74 61 62 6c 65 20 62 65 69 6e 67  tree table being
19680 20 63 72 65 61 74 65 64 20 6f 72 20 63 6f 6e 6e   created or conn
19690 65 63 74 65 64 0a 2a 2a 20 74 6f 2e 20 49 66 20  ected.** to. If 
196a0 73 75 63 63 65 73 73 66 75 6c 2c 20 70 52 74 72  successful, pRtr
196b0 65 65 2d 3e 69 4e 6f 64 65 53 69 7a 65 20 69 73  ee->iNodeSize is
196c0 20 70 6f 70 75 6c 61 74 65 64 20 61 6e 64 20 53   populated and S
196d0 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
196e0 64 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  d..** Otherwise,
196f0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
19700 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
19710 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  d..**.** If this
19720 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69   function is bei
19730 6e 67 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72  ng called as par
19740 74 20 6f 66 20 61 6e 20 78 43 6f 6e 6e 65 63 74  t of an xConnect
19750 28 29 2c 20 74 68 65 6e 20 74 68 65 20 72 74 72  (), then the rtr
19760 65 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6c 72 65  ee.** table alre
19770 61 64 79 20 65 78 69 73 74 73 2e 20 49 6e 20 74  ady exists. In t
19780 68 69 73 20 63 61 73 65 20 74 68 65 20 6e 6f 64  his case the nod
19790 65 2d 73 69 7a 65 20 69 73 20 64 65 74 65 72 6d  e-size is determ
197a0 69 6e 65 64 20 62 79 20 69 6e 73 70 65 63 74 69  ined by inspecti
197b0 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 6e  ng.** the root n
197c0 6f 64 65 20 6f 66 20 74 68 65 20 74 72 65 65 2e  ode of the tree.
197d0 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
197e0 2c 20 66 6f 72 20 61 6e 20 78 43 72 65 61 74 65  , for an xCreate
197f0 28 29 2c 20 75 73 65 20 36 34 20 62 79 74 65 73  (), use 64 bytes
19800 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 64   less than the d
19810 61 74 61 62 61 73 65 20 70 61 67 65 2d 73 69 7a  atabase page-siz
19820 65 2e 20 0a 2a 2a 20 54 68 69 73 20 65 6e 73 75  e. .** This ensu
19830 72 65 73 20 74 68 61 74 20 65 61 63 68 20 6e 6f  res that each no
19840 64 65 20 69 73 20 73 74 6f 72 65 64 20 6f 6e 20  de is stored on 
19850 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  a single databas
19860 65 20 70 61 67 65 2e 20 49 66 20 74 68 65 20 0a  e page. If the .
19870 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ** database page
19880 2d 73 69 7a 65 20 69 73 20 73 6f 20 6c 61 72 67  -size is so larg
19890 65 20 74 68 61 74 20 6d 6f 72 65 20 74 68 61 6e  e that more than
198a0 20 52 54 52 45 45 5f 4d 41 58 43 45 4c 4c 53 20   RTREE_MAXCELLS 
198b0 65 6e 74 72 69 65 73 20 0a 2a 2a 20 77 6f 75 6c  entries .** woul
198c0 64 20 66 69 74 20 69 6e 20 61 20 73 69 6e 67 6c  d fit in a singl
198d0 65 20 6e 6f 64 65 2c 20 75 73 65 20 61 20 73 6d  e node, use a sm
198e0 61 6c 6c 65 72 20 6e 6f 64 65 2d 73 69 7a 65 2e  aller node-size.
198f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
19900 65 74 4e 6f 64 65 53 69 7a 65 28 0a 20 20 73 71  etNodeSize(.  sq
19910 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
19920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19930 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   Database handle
19940 20 2a 2f 0a 20 20 52 74 72 65 65 20 2a 70 52 74   */.  Rtree *pRt
19950 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ree,            
19960 20 20 20 20 20 20 2f 2a 20 52 74 72 65 65 20 68        /* Rtree h
19970 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  andle */.  int i
19980 73 43 72 65 61 74 65 2c 20 20 20 20 20 20 20 20  sCreate,        
19990 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
199a0 75 65 20 66 6f 72 20 78 43 72 65 61 74 65 2c 20  ue for xCreate, 
199b0 66 61 6c 73 65 20 66 6f 72 20 78 43 6f 6e 6e 65  false for xConne
199c0 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  ct */.  char **p
199d0 7a 45 72 72 20 20 20 20 20 20 20 20 20 20 20 20  zErr            
199e0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
199f0 45 72 72 6f 72 20 6d 65 73 73 61 67 65 2c 20 69  Error message, i
19a00 66 20 61 6e 79 20 2a 2f 0a 29 7b 0a 20 20 69 6e  f any */.){.  in
19a10 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 53  t rc;.  char *zS
19a20 71 6c 3b 0a 20 20 69 66 28 20 69 73 43 72 65 61  ql;.  if( isCrea
19a30 74 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 50  te ){.    int iP
19a40 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  ageSize = 0;.   
19a50 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
19a60 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20  mprintf("PRAGMA 
19a70 25 51 2e 70 61 67 65 5f 73 69 7a 65 22 2c 20 70  %Q.page_size", p
19a80 52 74 72 65 65 2d 3e 7a 44 62 29 3b 0a 20 20 20  Rtree->zDb);.   
19a90 20 72 63 20 3d 20 67 65 74 49 6e 74 46 72 6f 6d   rc = getIntFrom
19aa0 53 74 6d 74 28 64 62 2c 20 7a 53 71 6c 2c 20 26  Stmt(db, zSql, &
19ab0 69 50 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  iPageSize);.    
19ac0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19ad0 4b 20 29 7b 0a 20 20 20 20 20 20 70 52 74 72 65  K ){.      pRtre
19ae0 65 2d 3e 69 4e 6f 64 65 53 69 7a 65 20 3d 20 69  e->iNodeSize = i
19af0 50 61 67 65 53 69 7a 65 2d 36 34 3b 0a 20 20 20  PageSize-64;.   
19b00 20 20 20 69 66 28 20 28 34 2b 70 52 74 72 65 65     if( (4+pRtree
19b10 2d 3e 6e 42 79 74 65 73 50 65 72 43 65 6c 6c 2a  ->nBytesPerCell*
19b20 52 54 52 45 45 5f 4d 41 58 43 45 4c 4c 53 29 3c  RTREE_MAXCELLS)<
19b30 70 52 74 72 65 65 2d 3e 69 4e 6f 64 65 53 69 7a  pRtree->iNodeSiz
19b40 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52 74  e ){.        pRt
19b50 72 65 65 2d 3e 69 4e 6f 64 65 53 69 7a 65 20 3d  ree->iNodeSize =
19b60 20 34 2b 70 52 74 72 65 65 2d 3e 6e 42 79 74 65   4+pRtree->nByte
19b70 73 50 65 72 43 65 6c 6c 2a 52 54 52 45 45 5f 4d  sPerCell*RTREE_M
19b80 41 58 43 45 4c 4c 53 3b 0a 20 20 20 20 20 20 7d  AXCELLS;.      }
19b90 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
19ba0 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69 74    *pzErr = sqlit
19bb0 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c  e3_mprintf("%s",
19bc0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
19bd0 64 62 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  db));.    }.  }e
19be0 6c 73 65 7b 0a 20 20 20 20 7a 53 71 6c 20 3d 20  lse{.    zSql = 
19bf0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
19c00 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54  .        "SELECT
19c10 20 6c 65 6e 67 74 68 28 64 61 74 61 29 20 46 52   length(data) FR
19c20 4f 4d 20 27 25 71 27 2e 27 25 71 5f 6e 6f 64 65  OM '%q'.'%q_node
19c30 27 20 57 48 45 52 45 20 6e 6f 64 65 6e 6f 20 3d  ' WHERE nodeno =
19c40 20 31 22 2c 0a 20 20 20 20 20 20 20 20 70 52 74   1",.        pRt
19c50 72 65 65 2d 3e 7a 44 62 2c 20 70 52 74 72 65 65  ree->zDb, pRtree
19c60 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20  ->zName.    );. 
19c70 20 20 20 72 63 20 3d 20 67 65 74 49 6e 74 46 72     rc = getIntFr
19c80 6f 6d 53 74 6d 74 28 64 62 2c 20 7a 53 71 6c 2c  omStmt(db, zSql,
19c90 20 26 70 52 74 72 65 65 2d 3e 69 4e 6f 64 65 53   &pRtree->iNodeS
19ca0 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ize);.    if( rc
19cb0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
19cc0 20 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71       *pzErr = sq
19cd0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
19ce0 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  s", sqlite3_errm
19cf0 73 67 28 64 62 29 29 3b 0a 20 20 20 20 7d 65 6c  sg(db));.    }el
19d00 73 65 20 69 66 28 20 70 52 74 72 65 65 2d 3e 69  se if( pRtree->i
19d10 4e 6f 64 65 53 69 7a 65 3c 28 35 31 32 2d 36 34  NodeSize<(512-64
19d20 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
19d30 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56  SQLITE_CORRUPT_V
19d40 54 41 42 3b 0a 20 20 20 20 20 20 2a 70 7a 45 72  TAB;.      *pzEr
19d50 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  r = sqlite3_mpri
19d60 6e 74 66 28 22 75 6e 64 65 72 73 69 7a 65 20 52  ntf("undersize R
19d70 54 72 65 65 20 62 6c 6f 62 73 20 69 6e 20 5c 22  Tree blobs in \"
19d80 25 71 5f 6e 6f 64 65 5c 22 22 2c 0a 20 20 20 20  %q_node\"",.    
19d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19da0 20 20 20 20 20 20 20 20 20 20 20 70 52 74 72 65             pRtre
19db0 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  e->zName);.    }
19dc0 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f  .  }..  sqlite3_
19dd0 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 72 65  free(zSql);.  re
19de0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a  turn rc;.}../* .
19df0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
19e00 20 69 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e   is the implemen
19e10 74 61 74 69 6f 6e 20 6f 66 20 62 6f 74 68 20 74  tation of both t
19e20 68 65 20 78 43 6f 6e 6e 65 63 74 20 61 6e 64 20  he xConnect and 
19e30 78 43 72 65 61 74 65 0a 2a 2a 20 6d 65 74 68 6f  xCreate.** metho
19e40 64 73 20 6f 66 20 74 68 65 20 72 2d 74 72 65 65  ds of the r-tree
19e50 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a   virtual table..
19e60 2a 2a 0a 2a 2a 20 20 20 61 72 67 76 5b 30 5d 20  **.**   argv[0] 
19e70 20 20 2d 3e 20 6d 6f 64 75 6c 65 20 6e 61 6d 65    -> module name
19e80 0a 2a 2a 20 20 20 61 72 67 76 5b 31 5d 20 20 20  .**   argv[1]   
19e90 2d 3e 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  -> database name
19ea0 0a 2a 2a 20 20 20 61 72 67 76 5b 32 5d 20 20 20  .**   argv[2]   
19eb0 2d 3e 20 74 61 62 6c 65 20 6e 61 6d 65 0a 2a 2a  -> table name.**
19ec0 20 20 20 61 72 67 76 5b 2e 2e 2e 5d 20 2d 3e 20     argv[...] -> 
19ed0 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 2e 2e 0a  column names....
19ee0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 74  */.static int rt
19ef0 72 65 65 49 6e 69 74 28 0a 20 20 73 71 6c 69 74  reeInit(.  sqlit
19f00 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
19f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19f20 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
19f30 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20  ction */.  void 
19f40 2a 70 41 75 78 2c 20 20 20 20 20 20 20 20 20 20  *pAux,          
19f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19f60 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 52 54 52  * One of the RTR
19f70 45 45 5f 43 4f 4f 52 44 5f 2a 20 63 6f 6e 73 74  EE_COORD_* const
19f80 61 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 61 72  ants */.  int ar
19f90 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  gc, const char *
19fa0 63 6f 6e 73 74 2a 61 72 67 76 2c 20 20 20 2f 2a  const*argv,   /*
19fb0 20 50 61 72 61 6d 65 74 65 72 73 20 74 6f 20 43   Parameters to C
19fc0 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
19fd0 65 6d 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74  ement */.  sqlit
19fe0 65 33 5f 76 74 61 62 20 2a 2a 70 70 56 74 61 62  e3_vtab **ppVtab
19ff0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1a000 2a 20 4f 55 54 3a 20 4e 65 77 20 76 69 72 74 75  * OUT: New virtu
1a010 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 68  al table */.  ch
1a020 61 72 20 2a 2a 70 7a 45 72 72 2c 20 20 20 20 20  ar **pzErr,     
1a030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a040 20 20 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20    /* OUT: Error 
1a050 6d 65 73 73 61 67 65 2c 20 69 66 20 61 6e 79 20  message, if any 
1a060 2a 2f 0a 20 20 69 6e 74 20 69 73 43 72 65 61 74  */.  int isCreat
1a070 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
1a080 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1a090 20 66 6f 72 20 78 43 72 65 61 74 65 2c 20 66 61   for xCreate, fa
1a0a0 6c 73 65 20 66 6f 72 20 78 43 6f 6e 6e 65 63 74  lse for xConnect
1a0b0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
1a0c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 52  = SQLITE_OK;.  R
1a0d0 74 72 65 65 20 2a 70 52 74 72 65 65 3b 0a 20 20  tree *pRtree;.  
1a0e0 69 6e 74 20 6e 44 62 3b 20 20 20 20 20 20 20 20  int nDb;        
1a0f0 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
1a100 6f 66 20 73 74 72 69 6e 67 20 61 72 67 76 5b 31  of string argv[1
1a110 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65  ] */.  int nName
1a120 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1a130 4c 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e 67  Length of string
1a140 20 61 72 67 76 5b 32 5d 20 2a 2f 0a 20 20 69 6e   argv[2] */.  in
1a150 74 20 65 43 6f 6f 72 64 54 79 70 65 20 3d 20 28  t eCoordType = (
1a160 70 41 75 78 20 3f 20 52 54 52 45 45 5f 43 4f 4f  pAux ? RTREE_COO
1a170 52 44 5f 49 4e 54 33 32 20 3a 20 52 54 52 45 45  RD_INT32 : RTREE
1a180 5f 43 4f 4f 52 44 5f 52 45 41 4c 33 32 29 3b 0a  _COORD_REAL32);.
1a190 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  .  const char *a
1a1a0 45 72 72 4d 73 67 5b 5d 20 3d 20 7b 0a 20 20 20  ErrMsg[] = {.   
1a1b0 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
1a1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1e0 20 20 20 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20         /* 0 */. 
1a1f0 20 20 20 22 57 72 6f 6e 67 20 6e 75 6d 62 65 72     "Wrong number
1a200 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20   of columns for 
1a210 61 6e 20 72 74 72 65 65 20 74 61 62 6c 65 22 2c  an rtree table",
1a220 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 2a 2f           /* 1 */
1a230 0a 20 20 20 20 22 54 6f 6f 20 66 65 77 20 63 6f  .    "Too few co
1a240 6c 75 6d 6e 73 20 66 6f 72 20 61 6e 20 72 74 72  lumns for an rtr
1a250 65 65 20 74 61 62 6c 65 22 2c 20 20 20 20 20 20  ee table",      
1a260 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 20             /* 2 
1a270 2a 2f 0a 20 20 20 20 22 54 6f 6f 20 6d 61 6e 79  */.    "Too many
1a280 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 61 6e 20   columns for an 
1a290 72 74 72 65 65 20 74 61 62 6c 65 22 20 20 20 20  rtree table"    
1a2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a2b0 33 20 2a 2f 0a 20 20 7d 3b 0a 0a 20 20 69 6e 74  3 */.  };..  int
1a2c0 20 69 45 72 72 20 3d 20 28 61 72 67 63 3c 36 29   iErr = (argc<6)
1a2d0 20 3f 20 32 20 3a 20 61 72 67 63 3e 28 52 54 52   ? 2 : argc>(RTR
1a2e0 45 45 5f 4d 41 58 5f 44 49 4d 45 4e 53 49 4f 4e  EE_MAX_DIMENSION
1a2f0 53 2a 32 2b 34 29 20 3f 20 33 20 3a 20 61 72 67  S*2+4) ? 3 : arg
1a300 63 25 32 3b 0a 20 20 69 66 28 20 61 45 72 72 4d  c%2;.  if( aErrM
1a310 73 67 5b 69 45 72 72 5d 20 29 7b 0a 20 20 20 20  sg[iErr] ){.    
1a320 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33  *pzErr = sqlite3
1a330 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 61  _mprintf("%s", a
1a340 45 72 72 4d 73 67 5b 69 45 72 72 5d 29 3b 0a 20  ErrMsg[iErr]);. 
1a350 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1a360 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 73  _ERROR;.  }..  s
1a370 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 6f 6e 66  qlite3_vtab_conf
1a380 69 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 56 54  ig(db, SQLITE_VT
1a390 41 42 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 53 55  AB_CONSTRAINT_SU
1a3a0 50 50 4f 52 54 2c 20 31 29 3b 0a 0a 20 20 2f 2a  PPORT, 1);..  /*
1a3b0 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71   Allocate the sq
1a3c0 6c 69 74 65 33 5f 76 74 61 62 20 73 74 72 75 63  lite3_vtab struc
1a3d0 74 75 72 65 20 2a 2f 0a 20 20 6e 44 62 20 3d 20  ture */.  nDb = 
1a3e0 28 69 6e 74 29 73 74 72 6c 65 6e 28 61 72 67 76  (int)strlen(argv
1a3f0 5b 31 5d 29 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20  [1]);.  nName = 
1a400 28 69 6e 74 29 73 74 72 6c 65 6e 28 61 72 67 76  (int)strlen(argv
1a410 5b 32 5d 29 3b 0a 20 20 70 52 74 72 65 65 20 3d  [2]);.  pRtree =
1a420 20 28 52 74 72 65 65 20 2a 29 73 71 6c 69 74 65   (Rtree *)sqlite
1a430 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  3_malloc(sizeof(
1a440 52 74 72 65 65 29 2b 6e 44 62 2b 6e 4e 61 6d 65  Rtree)+nDb+nName
1a450 2b 32 29 3b 0a 20 20 69 66 28 20 21 70 52 74 72  +2);.  if( !pRtr
1a460 65 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ee ){.    return
1a470 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1a480 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 52 74 72   }.  memset(pRtr
1a490 65 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 52 74  ee, 0, sizeof(Rt
1a4a0 72 65 65 29 2b 6e 44 62 2b 6e 4e 61 6d 65 2b 32  ree)+nDb+nName+2
1a4b0 29 3b 0a 20 20 70 52 74 72 65 65 2d 3e 6e 42 75  );.  pRtree->nBu
1a4c0 73 79 20 3d 20 31 3b 0a 20 20 70 52 74 72 65 65  sy = 1;.  pRtree
1a4d0 2d 3e 62 61 73 65 2e 70 4d 6f 64 75 6c 65 20 3d  ->base.pModule =
1a4e0 20 26 72 74 72 65 65 4d 6f 64 75 6c 65 3b 0a 20   &rtreeModule;. 
1a4f0 20 70 52 74 72 65 65 2d 3e 7a 44 62 20 3d 20 28   pRtree->zDb = (
1a500 63 68 61 72 20 2a 29 26 70 52 74 72 65 65 5b 31  char *)&pRtree[1
1a510 5d 3b 0a 20 20 70 52 74 72 65 65 2d 3e 7a 4e 61  ];.  pRtree->zNa
1a520 6d 65 20 3d 20 26 70 52 74 72 65 65 2d 3e 7a 44  me = &pRtree->zD
1a530 62 5b 6e 44 62 2b 31 5d 3b 0a 20 20 70 52 74 72  b[nDb+1];.  pRtr
1a540 65 65 2d 3e 6e 44 69 6d 20 3d 20 28 75 38 29 28  ee->nDim = (u8)(
1a550 28 61 72 67 63 2d 34 29 2f 32 29 3b 0a 20 20 70  (argc-4)/2);.  p
1a560 52 74 72 65 65 2d 3e 6e 44 69 6d 32 20 3d 20 70  Rtree->nDim2 = p
1a570 52 74 72 65 65 2d 3e 6e 44 69 6d 2a 32 3b 0a 20  Rtree->nDim*2;. 
1a580 20 70 52 74 72 65 65 2d 3e 6e 42 79 74 65 73 50   pRtree->nBytesP
1a590 65 72 43 65 6c 6c 20 3d 20 38 20 2b 20 70 52 74  erCell = 8 + pRt
1a5a0 72 65 65 2d 3e 6e 44 69 6d 32 2a 34 3b 0a 20 20  ree->nDim2*4;.  
1a5b0 70 52 74 72 65 65 2d 3e 65 43 6f 6f 72 64 54 79  pRtree->eCoordTy
1a5c0 70 65 20 3d 20 28 75 38 29 65 43 6f 6f 72 64 54  pe = (u8)eCoordT
1a5d0 79 70 65 3b 0a 20 20 6d 65 6d 63 70 79 28 70 52  ype;.  memcpy(pR
1a5e0 74 72 65 65 2d 3e 7a 44 62 2c 20 61 72 67 76 5b  tree->zDb, argv[
1a5f0 31 5d 2c 20 6e 44 62 29 3b 0a 20 20 6d 65 6d 63  1], nDb);.  memc
1a600 70 79 28 70 52 74 72 65 65 2d 3e 7a 4e 61 6d 65  py(pRtree->zName
1a610 2c 20 61 72 67 76 5b 32 5d 2c 20 6e 4e 61 6d 65  , argv[2], nName
1a620 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  );..  /* Figure 
1a630 6f 75 74 20 74 68 65 20 6e 6f 64 65 20 73 69 7a  out the node siz
1a640 65 20 74 6f 20 75 73 65 2e 20 2a 2f 0a 20 20 72  e to use. */.  r
1a650 63 20 3d 20 67 65 74 4e 6f 64 65 53 69 7a 65 28  c = getNodeSize(
1a660 64 62 2c 20 70 52 74 72 65 65 2c 20 69 73 43 72  db, pRtree, isCr
1a670 65 61 74 65 2c 20 70 7a 45 72 72 29 3b 0a 0a 20  eate, pzErr);.. 
1a680 20 2f 2a 20 43 72 65 61 74 65 2f 43 6f 6e 6e 65   /* Create/Conne
1a690 63 74 20 74 6f 20 74 68 65 20 75 6e 64 65 72 6c  ct to the underl
1a6a0 79 69 6e 67 20 72 65 6c 61 74 69 6f 6e 61 6c 20  ying relational 
1a6b0 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
1a6c0 20 49 66 0a 20 20 2a 2a 20 74 68 61 74 20 69 73   If.  ** that is
1a6d0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 63 61 6c   successful, cal
1a6e0 6c 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72  l sqlite3_declar
1a6f0 65 5f 76 74 61 62 28 29 20 74 6f 20 63 6f 6e 66  e_vtab() to conf
1a700 69 67 75 72 65 0a 20 20 2a 2a 20 74 68 65 20 72  igure.  ** the r
1a710 2d 74 72 65 65 20 74 61 62 6c 65 20 73 63 68 65  -tree table sche
1a720 6d 61 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  ma..  */.  if( r
1a730 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1a740 20 20 20 20 69 66 28 20 28 72 63 20 3d 20 72 74      if( (rc = rt
1a750 72 65 65 53 71 6c 49 6e 69 74 28 70 52 74 72 65  reeSqlInit(pRtre
1a760 65 2c 20 64 62 2c 20 61 72 67 76 5b 31 5d 2c 20  e, db, argv[1], 
1a770 61 72 67 76 5b 32 5d 2c 20 69 73 43 72 65 61 74  argv[2], isCreat
1a780 65 29 29 20 29 7b 0a 20 20 20 20 20 20 2a 70 7a  e)) ){.      *pz
1a790 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Err = sqlite3_mp
1a7a0 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69  rintf("%s", sqli
1a7b0 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b  te3_errmsg(db));
1a7c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1a7d0 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73    char *zSql = s
1a7e0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
1a7f0 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 28 25  CREATE TABLE x(%
1a800 73 22 2c 20 61 72 67 76 5b 33 5d 29 3b 0a 20 20  s", argv[3]);.  
1a810 20 20 20 20 63 68 61 72 20 2a 7a 54 6d 70 3b 0a      char *zTmp;.
1a820 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20        int ii;.  
1a830 20 20 20 20 66 6f 72 28 69 69 3d 34 3b 20 7a 53      for(ii=4; zS
1a840 71 6c 20 26 26 20 69 69 3c 61 72 67 63 3b 20 69  ql && ii<argc; i
1a850 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 7a 54  i++){.        zT
1a860 6d 70 20 3d 20 7a 53 71 6c 3b 0a 20 20 20 20 20  mp = zSql;.     
1a870 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
1a880 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 2c 20 25  3_mprintf("%s, %
1a890 73 22 2c 20 7a 54 6d 70 2c 20 61 72 67 76 5b 69  s", zTmp, argv[i
1a8a0 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  i]);.        sql
1a8b0 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 29 3b  ite3_free(zTmp);
1a8c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1a8d0 66 28 20 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20  f( zSql ){.     
1a8e0 20 20 20 7a 54 6d 70 20 3d 20 7a 53 71 6c 3b 0a     zTmp = zSql;.
1a8f0 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73          zSql = s
1a900 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
1a910 25 73 29 3b 22 2c 20 7a 54 6d 70 29 3b 0a 20 20  %s);", zTmp);.  
1a920 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
1a930 65 65 28 7a 54 6d 70 29 3b 0a 20 20 20 20 20 20  ee(zTmp);.      
1a940 7d 0a 20 20 20 20 20 20 69 66 28 20 21 7a 53 71  }.      if( !zSq
1a950 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  l ){.        rc 
1a960 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
1a970 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1a980 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
1a990 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65   sqlite3_declare
1a9a0 5f 76 74 61 62 28 64 62 2c 20 7a 53 71 6c 29 29  _vtab(db, zSql))
1a9b0 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 45   ){.        *pzE
1a9c0 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  rr = sqlite3_mpr
1a9d0 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74  intf("%s", sqlit
1a9e0 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a  e3_errmsg(db));.
1a9f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
1aa00 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
1aa10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
1aa20 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1aa30 20 29 7b 0a 20 20 20 20 2a 70 70 56 74 61 62 20   ){.    *ppVtab 
1aa40 3d 20 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20  = (sqlite3_vtab 
1aa50 2a 29 70 52 74 72 65 65 3b 0a 20 20 7d 65 6c 73  *)pRtree;.  }els
1aa60 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a  e{.    assert( *
1aa70 70 70 56 74 61 62 3d 3d 30 20 29 3b 0a 20 20 20  ppVtab==0 );.   
1aa80 20 61 73 73 65 72 74 28 20 70 52 74 72 65 65 2d   assert( pRtree-
1aa90 3e 6e 42 75 73 79 3d 3d 31 20 29 3b 0a 20 20 20  >nBusy==1 );.   
1aaa0 20 72 74 72 65 65 52 65 6c 65 61 73 65 28 70 52   rtreeRelease(pR
1aab0 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  tree);.  }.  ret
1aac0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
1aad0 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
1aae0 20 6f 66 20 61 20 73 63 61 6c 61 72 20 66 75 6e   of a scalar fun
1aaf0 63 74 69 6f 6e 20 74 68 61 74 20 64 65 63 6f 64  ction that decod
1ab00 65 73 20 72 2d 74 72 65 65 20 6e 6f 64 65 73 20  es r-tree nodes 
1ab10 74 6f 0a 2a 2a 20 68 75 6d 61 6e 20 72 65 61 64  to.** human read
1ab20 61 62 6c 65 20 73 74 72 69 6e 67 73 2e 20 54 68  able strings. Th
1ab30 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 66  is can be used f
1ab40 6f 72 20 64 65 62 75 67 67 69 6e 67 20 61 6e 64  or debugging and
1ab50 20 61 6e 61 6c 79 73 69 73 2e 0a 2a 2a 0a 2a 2a   analysis..**.**
1ab60 20 54 68 65 20 73 63 61 6c 61 72 20 66 75 6e 63   The scalar func
1ab70 74 69 6f 6e 20 74 61 6b 65 73 20 74 77 6f 20 61  tion takes two a
1ab80 72 67 75 6d 65 6e 74 73 3a 20 28 31 29 20 74 68  rguments: (1) th
1ab90 65 20 6e 75 6d 62 65 72 20 6f 66 20 64 69 6d 65  e number of dime
1aba0 6e 73 69 6f 6e 73 0a 2a 2a 20 74 6f 20 74 68 65  nsions.** to the
1abb0 20 72 74 72 65 65 20 28 62 65 74 77 65 65 6e 20   rtree (between 
1abc0 31 20 61 6e 64 20 35 2c 20 69 6e 63 6c 75 73 69  1 and 5, inclusi
1abd0 76 65 29 20 61 6e 64 20 28 32 29 20 61 20 62 6c  ve) and (2) a bl
1abe0 6f 62 20 6f 66 20 64 61 74 61 20 63 6f 6e 74 61  ob of data conta
1abf0 69 6e 69 6e 67 0a 2a 2a 20 61 6e 20 72 2d 74 72  ining.** an r-tr
1ac00 65 65 20 6e 6f 64 65 2e 20 20 46 6f 72 20 61 20  ee node.  For a 
1ac10 74 77 6f 2d 64 69 6d 65 6e 73 69 6f 6e 61 6c 20  two-dimensional 
1ac20 72 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  r-tree structure
1ac30 20 63 61 6c 6c 65 64 20 22 72 74 22 2c 20 74 6f   called "rt", to
1ac40 0a 2a 2a 20 64 65 73 65 72 69 61 6c 69 7a 65 20  .** deserialize 
1ac50 61 6c 6c 20 6e 6f 64 65 73 2c 20 61 20 73 74 61  all nodes, a sta
1ac60 74 65 6d 65 6e 74 20 6c 69 6b 65 3a 0a 2a 2a 0a  tement like:.**.
1ac70 2a 2a 20 20 20 53 45 4c 45 43 54 20 72 74 72 65  **   SELECT rtre
1ac80 65 6e 6f 64 65 28 32 2c 20 64 61 74 61 29 20 46  enode(2, data) F
1ac90 52 4f 4d 20 72 74 5f 6e 6f 64 65 3b 0a 2a 2a 0a  ROM rt_node;.**.
1aca0 2a 2a 20 54 68 65 20 68 75 6d 61 6e 20 72 65 61  ** The human rea
1acb0 64 61 62 6c 65 20 73 74 72 69 6e 67 20 74 61 6b  dable string tak
1acc0 65 73 20 74 68 65 20 66 6f 72 6d 20 6f 66 20 61  es the form of a
1acd0 20 54 63 6c 20 6c 69 73 74 20 77 69 74 68 20 6f   Tcl list with o
1ace0 6e 65 0a 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20  ne.** entry for 
1acf0 65 61 63 68 20 63 65 6c 6c 20 69 6e 20 74 68 65  each cell in the
1ad00 20 72 2d 74 72 65 65 20 6e 6f 64 65 2e 20 45 61   r-tree node. Ea
1ad10 63 68 20 65 6e 74 72 79 20 69 73 20 69 74 73 65  ch entry is itse
1ad20 6c 66 20 61 0a 2a 2a 20 6c 69 73 74 2c 20 63 6f  lf a.** list, co
1ad30 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 38 2d 62  ntaining the 8-b
1ad40 79 74 65 20 72 6f 77 69 64 2f 70 61 67 65 6e 6f  yte rowid/pageno
1ad50 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 68 65   followed by the
1ad60 20 0a 2a 2a 20 3c 6e 75 6d 2d 64 69 6d 65 6e 73   .** <num-dimens
1ad70 69 6f 6e 3e 2a 32 20 63 6f 6f 72 64 69 6e 61 74  ion>*2 coordinat
1ad80 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
1ad90 69 64 20 72 74 72 65 65 6e 6f 64 65 28 73 71 6c  id rtreenode(sql
1ada0 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74  ite3_context *ct
1adb0 78 2c 20 69 6e 74 20 6e 41 72 67 2c 20 73 71 6c  x, int nArg, sql
1adc0 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41  ite3_value **apA
1add0 72 67 29 7b 0a 20 20 63 68 61 72 20 2a 7a 54 65  rg){.  char *zTe
1ade0 78 74 20 3d 20 30 3b 0a 20 20 52 74 72 65 65 4e  xt = 0;.  RtreeN
1adf0 6f 64 65 20 6e 6f 64 65 3b 0a 20 20 52 74 72 65  ode node;.  Rtre
1ae00 65 20 74 72 65 65 3b 0a 20 20 69 6e 74 20 69 69  e tree;.  int ii
1ae10 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
1ae20 4d 45 54 45 52 28 6e 41 72 67 29 3b 0a 20 20 6d  METER(nArg);.  m
1ae30 65 6d 73 65 74 28 26 6e 6f 64 65 2c 20 30 2c 20  emset(&node, 0, 
1ae40 73 69 7a 65 6f 66 28 52 74 72 65 65 4e 6f 64 65  sizeof(RtreeNode
1ae50 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 74 72  ));.  memset(&tr
1ae60 65 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 52 74  ee, 0, sizeof(Rt
1ae70 72 65 65 29 29 3b 0a 20 20 74 72 65 65 2e 6e 44  ree));.  tree.nD
1ae80 69 6d 20 3d 20 28 75 38 29 73 71 6c 69 74 65 33  im = (u8)sqlite3
1ae90 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70 41 72 67  _value_int(apArg
1aea0 5b 30 5d 29 3b 0a 20 20 74 72 65 65 2e 6e 44 69  [0]);.  tree.nDi
1aeb0 6d 32 20 3d 20 74 72 65 65 2e 6e 44 69 6d 2a 32  m2 = tree.nDim*2
1aec0 3b 0a 20 20 74 72 65 65 2e 6e 42 79 74 65 73 50  ;.  tree.nBytesP
1aed0 65 72 43 65 6c 6c 20 3d 20 38 20 2b 20 38 20 2a  erCell = 8 + 8 *
1aee0 20 74 72 65 65 2e 6e 44 69 6d 3b 0a 20 20 6e 6f   tree.nDim;.  no
1aef0 64 65 2e 7a 44 61 74 61 20 3d 20 28 75 38 20 2a  de.zData = (u8 *
1af00 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62  )sqlite3_value_b
1af10 6c 6f 62 28 61 70 41 72 67 5b 31 5d 29 3b 0a 0a  lob(apArg[1]);..
1af20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 4e    for(ii=0; ii<N
1af30 43 45 4c 4c 28 26 6e 6f 64 65 29 3b 20 69 69 2b  CELL(&node); ii+
1af40 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 43 65  +){.    char zCe
1af50 6c 6c 5b 35 31 32 5d 3b 0a 20 20 20 20 69 6e 74  ll[512];.    int
1af60 20 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 20 20   nCell = 0;.    
1af70 52 74 72 65 65 43 65 6c 6c 20 63 65 6c 6c 3b 0a  RtreeCell cell;.
1af80 20 20 20 20 69 6e 74 20 6a 6a 3b 0a 0a 20 20 20      int jj;..   
1af90 20 6e 6f 64 65 47 65 74 43 65 6c 6c 28 26 74 72   nodeGetCell(&tr
1afa0 65 65 2c 20 26 6e 6f 64 65 2c 20 69 69 2c 20 26  ee, &node, ii, &
1afb0 63 65 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74  cell);.    sqlit
1afc0 65 33 5f 73 6e 70 72 69 6e 74 66 28 35 31 32 2d  e3_snprintf(512-
1afd0 6e 43 65 6c 6c 2c 26 7a 43 65 6c 6c 5b 6e 43 65  nCell,&zCell[nCe
1afe0 6c 6c 5d 2c 22 25 6c 6c 64 22 2c 20 63 65 6c 6c  ll],"%lld", cell
1aff0 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 6e 43  .iRowid);.    nC
1b000 65 6c 6c 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  ell = (int)strle
1b010 6e 28 7a 43 65 6c 6c 29 3b 0a 20 20 20 20 66 6f  n(zCell);.    fo
1b020 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 74 72 65 65 2e  r(jj=0; jj<tree.
1b030 6e 44 69 6d 32 3b 20 6a 6a 2b 2b 29 7b 0a 23 69  nDim2; jj++){.#i
1b040 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 52 54 52  fndef SQLITE_RTR
1b050 45 45 5f 49 4e 54 5f 4f 4e 4c 59 0a 20 20 20 20  EE_INT_ONLY.    
1b060 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
1b070 74 66 28 35 31 32 2d 6e 43 65 6c 6c 2c 26 7a 43  tf(512-nCell,&zC
1b080 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 22 20 25 67  ell[nCell], " %g
1b090 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1b0a0 20 20 20 20 20 20 20 20 20 20 28 64 6f 75 62 6c            (doubl
1b0b0 65 29 63 65 6c 6c 2e 61 43 6f 6f 72 64 5b 6a 6a  e)cell.aCoord[jj
1b0c0 5d 2e 66 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  ].f);.#else.    
1b0d0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
1b0e0 74 66 28 35 31 32 2d 6e 43 65 6c 6c 2c 26 7a 43  tf(512-nCell,&zC
1b0f0 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 22 20 25 64  ell[nCell], " %d
1b100 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1b110 20 20 20 20 20 20 20 20 20 20 63 65 6c 6c 2e 61            cell.a
1b120 43 6f 6f 72 64 5b 6a 6a 5d 2e 69 29 3b 0a 23 65  Coord[jj].i);.#e
1b130 6e 64 69 66 0a 20 20 20 20 20 20 6e 43 65 6c 6c  ndif.      nCell
1b140 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   = (int)strlen(z
1b150 43 65 6c 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Cell);.    }..  
1b160 20 20 69 66 28 20 7a 54 65 78 74 20 29 7b 0a 20    if( zText ){. 
1b170 20 20 20 20 20 63 68 61 72 20 2a 7a 54 65 78 74       char *zText
1b180 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  New = sqlite3_mp
1b190 72 69 6e 74 66 28 22 25 73 20 7b 25 73 7d 22 2c  rintf("%s {%s}",
1b1a0 20 7a 54 65 78 74 2c 20 7a 43 65 6c 6c 29 3b 0a   zText, zCell);.
1b1b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
1b1c0 65 65 28 7a 54 65 78 74 29 3b 0a 20 20 20 20 20  ee(zText);.     
1b1d0 20 7a 54 65 78 74 20 3d 20 7a 54 65 78 74 4e 65   zText = zTextNe
1b1e0 77 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  w;.    }else{.  
1b1f0 20 20 20 20 7a 54 65 78 74 20 3d 20 73 71 6c 69      zText = sqli
1b200 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 7b 25 73  te3_mprintf("{%s
1b210 7d 22 2c 20 7a 43 65 6c 6c 29 3b 0a 20 20 20 20  }", zCell);.    
1b220 7d 0a 20 20 7d 0a 20 20 0a 20 20 73 71 6c 69 74  }.  }.  .  sqlit
1b230 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
1b240 74 78 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20 73  tx, zText, -1, s
1b250 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 7d 0a  qlite3_free);.}.
1b260 0a 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  ./* This routine
1b270 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 53   implements an S
1b280 51 4c 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  QL function that
1b290 20 72 65 74 75 72 6e 73 20 74 68 65 20 22 64 65   returns the "de
1b2a0 70 74 68 22 20 70 61 72 61 6d 65 74 65 72 0a 2a  pth" parameter.*
1b2b0 2a 20 66 72 6f 6d 20 74 68 65 20 66 72 6f 6e 74  * from the front
1b2c0 20 6f 66 20 61 20 62 6c 6f 62 20 74 68 61 74 20   of a blob that 
1b2d0 69 73 20 61 6e 20 72 2d 74 72 65 65 20 6e 6f 64  is an r-tree nod
1b2e0 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  e.  For example:
1b2f0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
1b300 54 20 72 74 72 65 65 64 65 70 74 68 28 64 61 74  T rtreedepth(dat
1b310 61 29 20 46 52 4f 4d 20 72 74 5f 6e 6f 64 65 20  a) FROM rt_node 
1b320 57 48 45 52 45 20 6e 6f 64 65 6e 6f 3d 31 3b 0a  WHERE nodeno=1;.
1b330 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 70 74 68 20  **.** The depth 
1b340 76 61 6c 75 65 20 69 73 20 30 20 66 6f 72 20 61  value is 0 for a
1b350 6c 6c 20 6e 6f 64 65 73 20 6f 74 68 65 72 20 74  ll nodes other t
1b360 68 61 6e 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64  han the root nod
1b370 65 2c 20 61 6e 64 20 74 68 65 20 72 6f 6f 74 0a  e, and the root.
1b380 2a 2a 20 6e 6f 64 65 20 61 6c 77 61 79 73 20 68  ** node always h
1b390 61 73 20 6e 6f 64 65 6e 6f 3d 31 2c 20 73 6f 20  as nodeno=1, so 
1b3a0 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76  the example abov
1b3b0 65 20 69 73 20 74 68 65 20 70 72 69 6d 61 72 79  e is the primary
1b3c0 20 75 73 65 20 66 6f 72 20 74 68 69 73 0a 2a 2a   use for this.**
1b3d0 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 69 73 20   routine.  This 
1b3e0 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 74 65 6e  routine is inten
1b3f0 64 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  ded for testing 
1b400 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  and analysis onl
1b410 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
1b420 64 20 72 74 72 65 65 64 65 70 74 68 28 73 71 6c  d rtreedepth(sql
1b430 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74  ite3_context *ct
1b440 78 2c 20 69 6e 74 20 6e 41 72 67 2c 20 73 71 6c  x, int nArg, sql
1b450 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41  ite3_value **apA
1b460 72 67 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  rg){.  UNUSED_PA
1b470 52 41 4d 45 54 45 52 28 6e 41 72 67 29 3b 0a 20  RAMETER(nArg);. 
1b480 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c   if( sqlite3_val
1b490 75 65 5f 74 79 70 65 28 61 70 41 72 67 5b 30 5d  ue_type(apArg[0]
1b4a0 29 21 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 0a  )!=SQLITE_BLOB .
1b4b0 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f 76 61     || sqlite3_va
1b4c0 6c 75 65 5f 62 79 74 65 73 28 61 70 41 72 67 5b  lue_bytes(apArg[
1b4d0 30 5d 29 3c 32 0a 20 20 29 7b 0a 20 20 20 20 73  0])<2.  ){.    s
1b4e0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
1b4f0 72 6f 72 28 63 74 78 2c 20 22 49 6e 76 61 6c 69  ror(ctx, "Invali
1b500 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 72 74  d argument to rt
1b510 72 65 65 64 65 70 74 68 28 29 22 2c 20 2d 31 29  reedepth()", -1)
1b520 3b 20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ; .  }else{.    
1b530 75 38 20 2a 7a 42 6c 6f 62 20 3d 20 28 75 38 20  u8 *zBlob = (u8 
1b540 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
1b550 62 6c 6f 62 28 61 70 41 72 67 5b 30 5d 29 3b 0a  blob(apArg[0]);.
1b560 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
1b570 6c 74 5f 69 6e 74 28 63 74 78 2c 20 72 65 61 64  lt_int(ctx, read
1b580 49 6e 74 31 36 28 7a 42 6c 6f 62 29 29 3b 0a 20  Int16(zBlob));. 
1b590 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74   }.}../*.** Cont
1b5a0 65 78 74 20 6f 62 6a 65 63 74 20 70 61 73 73 65  ext object passe
1b5b0 64 20 62 65 74 77 65 65 6e 20 74 68 65 20 76 61  d between the va
1b5c0 72 69 6f 75 73 20 72 6f 75 74 69 6e 65 73 20 74  rious routines t
1b5d0 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65 0a  hat make up the.
1b5e0 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** implementatio
1b5f0 6e 20 6f 66 20 69 6e 74 65 67 72 69 74 79 2d 63  n of integrity-c
1b600 68 65 63 6b 20 66 75 6e 63 74 69 6f 6e 20 72 74  heck function rt
1b610 72 65 65 63 68 65 63 6b 28 29 2e 0a 2a 2f 0a 74  reecheck()..*/.t
1b620 79 70 65 64 65 66 20 73 74 72 75 63 74 20 52 74  ypedef struct Rt
1b630 72 65 65 43 68 65 63 6b 20 52 74 72 65 65 43 68  reeCheck RtreeCh
1b640 65 63 6b 3b 0a 73 74 72 75 63 74 20 52 74 72 65  eck;.struct Rtre
1b650 65 43 68 65 63 6b 20 7b 0a 20 20 73 71 6c 69 74  eCheck {.  sqlit
1b660 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
1b670 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
1b680 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
1b690 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1b6a0 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
1b6b0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
1b6c0 6f 6e 74 61 69 6e 69 6e 67 20 72 74 72 65 65 20  ontaining rtree 
1b6d0 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  table */.  const
1b6e0 20 63 68 61 72 20 2a 7a 54 61 62 3b 20 20 20 20   char *zTab;    
1b6f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
1b700 6d 65 20 6f 66 20 72 74 72 65 65 20 74 61 62 6c  me of rtree tabl
1b710 65 20 2a 2f 0a 20 20 69 6e 74 20 62 49 6e 74 3b  e */.  int bInt;
1b720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b730 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
1b740 6f 72 20 72 74 72 65 65 5f 69 33 32 20 74 61 62  or rtree_i32 tab
1b750 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 69 6d  le */.  int nDim
1b760 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b770 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1b780 72 20 6f 66 20 64 69 6d 65 6e 73 69 6f 6e 73 20  r of dimensions 
1b790 66 6f 72 20 74 68 69 73 20 72 74 72 65 65 20 74  for this rtree t
1b7a0 62 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  bl */.  sqlite3_
1b7b0 73 74 6d 74 20 2a 70 47 65 74 4e 6f 64 65 3b 20  stmt *pGetNode; 
1b7c0 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65          /* State
1b7d0 6d 65 6e 74 20 75 73 65 64 20 74 6f 20 72 65 74  ment used to ret
1b7e0 72 69 65 76 65 20 6e 6f 64 65 73 20 2a 2f 0a 20  rieve nodes */. 
1b7f0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 61   sqlite3_stmt *a
1b800 43 68 65 63 6b 4d 61 70 70 69 6e 67 5b 32 5d 3b  CheckMapping[2];
1b810 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 73 20 74   /* Statements t
1b820 6f 20 71 75 65 72 79 20 25 5f 70 61 72 65 6e 74  o query %_parent
1b830 2f 25 5f 72 6f 77 69 64 20 2a 2f 0a 20 20 69 6e  /%_rowid */.  in
1b840 74 20 6e 4c 65 61 66 3b 20 20 20 20 20 20 20 20  t nLeaf;        
1b850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b860 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20   Number of leaf 
1b870 63 65 6c 6c 73 20 69 6e 20 74 61 62 6c 65 20 2a  cells in table *
1b880 2f 0a 20 20 69 6e 74 20 6e 4e 6f 6e 4c 65 61 66  /.  int nNonLeaf
1b890 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b8a0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1b8b0 20 6e 6f 6e 2d 6c 65 61 66 20 63 65 6c 6c 73 20   non-leaf cells 
1b8c0 69 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  in table */.  in
1b8d0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1b8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b8f0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1b900 20 20 63 68 61 72 20 2a 7a 52 65 70 6f 72 74 3b    char *zReport;
1b910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b920 20 20 2f 2a 20 4d 65 73 73 61 67 65 20 74 6f 20    /* Message to 
1b930 72 65 70 6f 72 74 20 2a 2f 0a 20 20 69 6e 74 20  report */.  int 
1b940 6e 45 72 72 3b 20 20 20 20 20 20 20 20 20 20 20  nErr;           
1b950 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1b960 75 6d 62 65 72 20 6f 66 20 6c 69 6e 65 73 20 69  umber of lines i
1b970 6e 20 7a 52 65 70 6f 72 74 20 2a 2f 0a 7d 3b 0a  n zReport */.};.
1b980 0a 23 64 65 66 69 6e 65 20 52 54 52 45 45 5f 43  .#define RTREE_C
1b990 48 45 43 4b 5f 4d 41 58 5f 45 52 52 4f 52 20 31  HECK_MAX_ERROR 1
1b9a0 30 30 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20  00../*.** Reset 
1b9b0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 70 53  SQL statement pS
1b9c0 74 6d 74 2e 20 49 66 20 74 68 65 20 73 71 6c 69  tmt. If the sqli
1b9d0 74 65 33 5f 72 65 73 65 74 28 29 20 63 61 6c 6c  te3_reset() call
1b9e0 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f   returns an erro
1b9f0 72 2c 0a 2a 2a 20 61 6e 64 20 52 74 72 65 65 43  r,.** and RtreeC
1ba00 68 65 63 6b 2e 72 63 3d 3d 53 51 4c 49 54 45 5f  heck.rc==SQLITE_
1ba10 4f 4b 2c 20 73 65 74 20 52 74 72 65 65 43 68 65  OK, set RtreeChe
1ba20 63 6b 2e 72 63 20 74 6f 20 74 68 65 20 65 72 72  ck.rc to the err
1ba30 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
1ba40 69 63 20 76 6f 69 64 20 72 74 72 65 65 43 68 65  ic void rtreeChe
1ba50 63 6b 52 65 73 65 74 28 52 74 72 65 65 43 68 65  ckReset(RtreeChe
1ba60 63 6b 20 2a 70 43 68 65 63 6b 2c 20 73 71 6c 69  ck *pCheck, sqli
1ba70 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 29  te3_stmt *pStmt)
1ba80 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  {.  int rc = sql
1ba90 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74  ite3_reset(pStmt
1baa0 29 3b 0a 20 20 69 66 28 20 70 43 68 65 63 6b 2d  );.  if( pCheck-
1bab0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1bac0 20 70 43 68 65 63 6b 2d 3e 72 63 20 3d 20 72 63   pCheck->rc = rc
1bad0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  ;.}../*.** The s
1bae0 65 63 6f 6e 64 20 61 6e 64 20 73 75 62 73 65 71  econd and subseq
1baf0 75 65 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 74  uent arguments t
1bb00 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
1bb10 61 72 65 20 61 20 66 6f 72 6d 61 74 20 73 74 72  are a format str
1bb20 69 6e 67 0a 2a 2a 20 61 6e 64 20 70 72 69 6e 74  ing.** and print
1bb30 66 20 73 74 79 6c 65 20 61 72 67 75 6d 65 6e 74  f style argument
1bb40 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  s. This function
1bb50 20 66 6f 72 6d 61 74 73 20 74 68 65 20 73 74 72   formats the str
1bb60 69 6e 67 20 61 6e 64 20 61 74 74 65 6d 70 74 73  ing and attempts
1bb70 0a 2a 2a 20 74 6f 20 63 6f 6d 70 69 6c 65 20 69  .** to compile i
1bb80 74 20 61 73 20 61 6e 20 53 51 4c 20 73 74 61 74  t as an SQL stat
1bb90 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ement..**.** If 
1bba0 73 75 63 63 65 73 73 66 75 6c 2c 20 61 20 70 6f  successful, a po
1bbb0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77  inter to the new
1bbc0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69   SQL statement i
1bbd0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
1bbe0 72 77 69 73 65 2c 0a 2a 2a 20 4e 55 4c 4c 20 69  rwise,.** NULL i
1bbf0 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 61  s returned and a
1bc00 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 6c 65 66  n error code lef
1bc10 74 20 69 6e 20 52 74 72 65 65 43 68 65 63 6b 2e  t in RtreeCheck.
1bc20 72 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71  rc..*/.static sq
1bc30 6c 69 74 65 33 5f 73 74 6d 74 20 2a 72 74 72 65  lite3_stmt *rtre
1bc40 65 43 68 65 63 6b 50 72 65 70 61 72 65 28 0a 20  eCheckPrepare(. 
1bc50 20 52 74 72 65 65 43 68 65 63 6b 20 2a 70 43 68   RtreeCheck *pCh
1bc60 65 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  eck,            
1bc70 20 2f 2a 20 52 74 72 65 65 43 68 65 63 6b 20 6f   /* RtreeCheck o
1bc80 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  bject */.  const
1bc90 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e   char *zFmt, ...
1bca0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
1bcb0 72 6d 61 74 20 73 74 72 69 6e 67 20 61 6e 64 20  rmat string and 
1bcc0 74 72 61 69 6c 69 6e 67 20 61 72 67 73 20 2a 2f  trailing args */
1bcd0 0a 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
1bce0 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73  ;.  char *z;.  s
1bcf0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 52 65  qlite3_stmt *pRe
1bd00 74 20 3d 20 30 3b 0a 0a 20 20 76 61 5f 73 74 61  t = 0;..  va_sta
1bd10 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20  rt(ap, zFmt);.  
1bd20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72  z = sqlite3_vmpr
1bd30 69 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29 3b 0a  intf(zFmt, ap);.
1bd40 0a 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 72  .  if( pCheck->r
1bd50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1bd60 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a      if( z==0 ){.
1bd70 20 20 20 20 20 20 70 43 68 65 63 6b 2d 3e 72 63        pCheck->rc
1bd80 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
1bd90 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1bda0 20 20 70 43 68 65 63 6b 2d 3e 72 63 20 3d 20 73    pCheck->rc = s
1bdb0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
1bdc0 32 28 70 43 68 65 63 6b 2d 3e 64 62 2c 20 7a 2c  2(pCheck->db, z,
1bdd0 20 2d 31 2c 20 26 70 52 65 74 2c 20 30 29 3b 0a   -1, &pRet, 0);.
1bde0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c      }.  }..  sql
1bdf0 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20  ite3_free(z);.  
1be00 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65  va_end(ap);.  re
1be10 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
1be20 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61  .** The second a
1be30 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 61 72  nd subsequent ar
1be40 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 69 73 20  guments to this 
1be50 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 61 20 70  function are a p
1be60 72 69 6e 74 66 28 29 0a 2a 2a 20 73 74 79 6c 65  rintf().** style
1be70 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 61   format string a
1be80 6e 64 20 61 72 67 75 6d 65 6e 74 73 2e 20 54 68  nd arguments. Th
1be90 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 6d  is function form
1bea0 61 74 73 20 74 68 65 20 73 74 72 69 6e 67 20 61  ats the string a
1beb0 6e 64 0a 2a 2a 20 61 70 70 65 6e 64 73 20 69 74  nd.** appends it
1bec0 20 74 6f 20 74 68 65 20 72 65 70 6f 72 74 20 62   to the report b
1bed0 65 69 6e 67 20 61 63 63 75 6d 75 61 74 65 64 20  eing accumuated 
1bee0 69 6e 20 70 43 68 65 63 6b 2e 0a 2a 2f 0a 73 74  in pCheck..*/.st
1bef0 61 74 69 63 20 76 6f 69 64 20 72 74 72 65 65 43  atic void rtreeC
1bf00 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 52 74  heckAppendMsg(Rt
1bf10 72 65 65 43 68 65 63 6b 20 2a 70 43 68 65 63 6b  reeCheck *pCheck
1bf20 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
1bf30 6d 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  mt, ...){.  va_l
1bf40 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74 61  ist ap;.  va_sta
1bf50 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20  rt(ap, zFmt);.  
1bf60 69 66 28 20 70 43 68 65 63 6b 2d 3e 72 63 3d 3d  if( pCheck->rc==
1bf70 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 43 68  SQLITE_OK && pCh
1bf80 65 63 6b 2d 3e 6e 45 72 72 3c 52 54 52 45 45 5f  eck->nErr<RTREE_
1bf90 43 48 45 43 4b 5f 4d 41 58 5f 45 52 52 4f 52 20  CHECK_MAX_ERROR 
1bfa0 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d  ){.    char *z =
1bfb0 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74   sqlite3_vmprint
1bfc0 66 28 7a 46 6d 74 2c 20 61 70 29 3b 0a 20 20 20  f(zFmt, ap);.   
1bfd0 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20   if( z==0 ){.   
1bfe0 20 20 20 70 43 68 65 63 6b 2d 3e 72 63 20 3d 20     pCheck->rc = 
1bff0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1c000 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1c010 43 68 65 63 6b 2d 3e 7a 52 65 70 6f 72 74 20 3d  Check->zReport =
1c020 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
1c030 28 22 25 7a 25 73 25 7a 22 2c 20 0a 20 20 20 20  ("%z%s%z", .    
1c040 20 20 20 20 20 20 70 43 68 65 63 6b 2d 3e 7a 52        pCheck->zR
1c050 65 70 6f 72 74 2c 20 28 70 43 68 65 63 6b 2d 3e  eport, (pCheck->
1c060 7a 52 65 70 6f 72 74 20 3f 20 22 5c 6e 22 20 3a  zReport ? "\n" :
1c070 20 22 22 29 2c 20 7a 0a 20 20 20 20 20 20 29 3b   ""), z.      );
1c080 0a 20 20 20 20 20 20 69 66 28 20 70 43 68 65 63  .      if( pChec
1c090 6b 2d 3e 7a 52 65 70 6f 72 74 3d 3d 30 20 29 7b  k->zReport==0 ){
1c0a0 0a 20 20 20 20 20 20 20 20 70 43 68 65 63 6b 2d  .        pCheck-
1c0b0 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
1c0c0 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
1c0d0 7d 0a 20 20 20 20 70 43 68 65 63 6b 2d 3e 6e 45  }.    pCheck->nE
1c0e0 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 76 61 5f 65  rr++;.  }.  va_e
1c0f0 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nd(ap);.}../*.**
1c100 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1c110 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65  s a no-op if the
1c120 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e  re is already an
1c130 20 65 72 72 6f 72 20 63 6f 64 65 20 73 74 6f 72   error code stor
1c140 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 52 74 72  ed.** in the Rtr
1c150 65 65 43 68 65 63 6b 20 6f 62 6a 65 63 74 20 69  eeCheck object i
1c160 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20  ndicated by the 
1c170 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20  first argument. 
1c180 4e 55 4c 4c 20 69 73 0a 2a 2a 20 72 65 74 75 72  NULL is.** retur
1c190 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65  ned in this case
1c1a0 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
1c1b0 65 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  e, the contents 
1c1c0 6f 66 20 72 74 72 65 65 20 74 61 62 6c 65 20 6e  of rtree table n
1c1d0 6f 64 65 20 69 4e 6f 64 65 20 61 72 65 20 6c 6f  ode iNode are lo
1c1e0 61 64 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65  aded from.** the
1c1f0 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 63 6f   database and co
1c200 70 69 65 64 20 69 6e 74 6f 20 61 20 62 75 66 66  pied into a buff
1c210 65 72 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  er obtained from
1c220 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
1c230 29 2e 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f  )..** If no erro
1c240 72 20 6f 63 63 75 72 73 2c 20 61 20 70 6f 69 6e  r occurs, a poin
1c250 74 65 72 20 74 6f 20 74 68 65 20 62 75 66 66 65  ter to the buffe
1c260 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  r is returned an
1c270 64 20 28 2a 70 6e 4e 6f 64 65 29 0a 2a 2a 20 69  d (*pnNode).** i
1c280 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a  s set to the siz
1c290 65 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  e of the buffer 
1c2a0 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  in bytes..**.** 
1c2b0 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  Or, if an error 
1c2c0 64 6f 65 73 20 6f 63 63 75 72 2c 20 4e 55 4c 4c  does occur, NULL
1c2d0 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
1c2e0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 6c   an error code l
1c2f0 65 66 74 0a 2a 2a 20 69 6e 20 74 68 65 20 52 74  eft.** in the Rt
1c300 72 65 65 43 68 65 63 6b 20 6f 62 6a 65 63 74 2e  reeCheck object.
1c310 20 54 68 65 20 66 69 6e 61 6c 20 76 61 6c 75 65   The final value
1c320 20 6f 66 20 2a 70 6e 4e 6f 64 65 20 69 73 20 75   of *pnNode is u
1c330 6e 64 65 66 69 6e 65 64 20 69 6e 0a 2a 2a 20 74  ndefined in.** t
1c340 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61  his case..*/.sta
1c350 74 69 63 20 75 38 20 2a 72 74 72 65 65 43 68 65  tic u8 *rtreeChe
1c360 63 6b 47 65 74 4e 6f 64 65 28 52 74 72 65 65 43  ckGetNode(RtreeC
1c370 68 65 63 6b 20 2a 70 43 68 65 63 6b 2c 20 69 36  heck *pCheck, i6
1c380 34 20 69 4e 6f 64 65 2c 20 69 6e 74 20 2a 70 6e  4 iNode, int *pn
1c390 4e 6f 64 65 29 7b 0a 20 20 75 38 20 2a 70 52 65  Node){.  u8 *pRe
1c3a0 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
1c3b0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1c3c0 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 61  rn value */..  a
1c3d0 73 73 65 72 74 28 20 70 43 68 65 63 6b 2d 3e 72  ssert( pCheck->r
1c3e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
1c3f0 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 70 47    if( pCheck->pG
1c400 65 74 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20  etNode==0 ){.   
1c410 20 70 43 68 65 63 6b 2d 3e 70 47 65 74 4e 6f 64   pCheck->pGetNod
1c420 65 20 3d 20 72 74 72 65 65 43 68 65 63 6b 50 72  e = rtreeCheckPr
1c430 65 70 61 72 65 28 70 43 68 65 63 6b 2c 0a 20 20  epare(pCheck,.  
1c440 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 64 61        "SELECT da
1c450 74 61 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 6e  ta FROM %Q.'%q_n
1c460 6f 64 65 27 20 57 48 45 52 45 20 6e 6f 64 65 6e  ode' WHERE noden
1c470 6f 3d 3f 22 2c 20 0a 20 20 20 20 20 20 20 20 70  o=?", .        p
1c480 43 68 65 63 6b 2d 3e 7a 44 62 2c 20 70 43 68 65  Check->zDb, pChe
1c490 63 6b 2d 3e 7a 54 61 62 0a 20 20 20 20 29 3b 0a  ck->zTab.    );.
1c4a0 20 20 7d 0a 0a 20 20 69 66 28 20 70 43 68 65 63    }..  if( pChec
1c4b0 6b 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  k->rc==SQLITE_OK
1c4c0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1c4d0 62 69 6e 64 5f 69 6e 74 36 34 28 70 43 68 65 63  bind_int64(pChec
1c4e0 6b 2d 3e 70 47 65 74 4e 6f 64 65 2c 20 31 2c 20  k->pGetNode, 1, 
1c4f0 69 4e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20  iNode);.    if( 
1c500 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 43 68  sqlite3_step(pCh
1c510 65 63 6b 2d 3e 70 47 65 74 4e 6f 64 65 29 3d 3d  eck->pGetNode)==
1c520 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
1c530 20 20 20 20 69 6e 74 20 6e 4e 6f 64 65 20 3d 20      int nNode = 
1c540 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
1c550 79 74 65 73 28 70 43 68 65 63 6b 2d 3e 70 47 65  ytes(pCheck->pGe
1c560 74 4e 6f 64 65 2c 20 30 29 3b 0a 20 20 20 20 20  tNode, 0);.     
1c570 20 63 6f 6e 73 74 20 75 38 20 2a 70 4e 6f 64 65   const u8 *pNode
1c580 20 3d 20 28 63 6f 6e 73 74 20 75 38 2a 29 73 71   = (const u8*)sq
1c590 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f  lite3_column_blo
1c5a0 62 28 70 43 68 65 63 6b 2d 3e 70 47 65 74 4e 6f  b(pCheck->pGetNo
1c5b0 64 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 52  de, 0);.      pR
1c5c0 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  et = sqlite3_mal
1c5d0 6c 6f 63 28 6e 4e 6f 64 65 29 3b 0a 20 20 20 20  loc(nNode);.    
1c5e0 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 29 7b    if( pRet==0 ){
1c5f0 0a 20 20 20 20 20 20 20 20 70 43 68 65 63 6b 2d  .        pCheck-
1c600 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
1c610 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EM;.      }else{
1c620 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
1c630 70 52 65 74 2c 20 70 4e 6f 64 65 2c 20 6e 4e 6f  pRet, pNode, nNo
1c640 64 65 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 6e  de);.        *pn
1c650 4e 6f 64 65 20 3d 20 6e 4e 6f 64 65 3b 0a 20 20  Node = nNode;.  
1c660 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1c670 72 74 72 65 65 43 68 65 63 6b 52 65 73 65 74 28  rtreeCheckReset(
1c680 70 43 68 65 63 6b 2c 20 70 43 68 65 63 6b 2d 3e  pCheck, pCheck->
1c690 70 47 65 74 4e 6f 64 65 29 3b 0a 20 20 20 20 69  pGetNode);.    i
1c6a0 66 28 20 70 43 68 65 63 6b 2d 3e 72 63 3d 3d 53  f( pCheck->rc==S
1c6b0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 52 65 74  QLITE_OK && pRet
1c6c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 74 72  ==0 ){.      rtr
1c6d0 65 65 43 68 65 63 6b 41 70 70 65 6e 64 4d 73 67  eeCheckAppendMsg
1c6e0 28 70 43 68 65 63 6b 2c 20 22 4e 6f 64 65 20 25  (pCheck, "Node %
1c6f0 6c 6c 64 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d  lld missing from
1c700 20 64 61 74 61 62 61 73 65 22 2c 20 69 4e 6f 64   database", iNod
1c710 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  e);.    }.  }.. 
1c720 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
1c730 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1c740 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
1c750 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 25  check that the %
1c760 5f 70 61 72 65 6e 74 20 28 69 66 20 62 4c 65 61  _parent (if bLea
1c770 66 3d 3d 30 29 20 6f 72 20 25 5f 72 6f 77 69 64  f==0) or %_rowid
1c780 0a 2a 2a 20 28 69 66 20 62 4c 65 61 66 3d 3d 31  .** (if bLeaf==1
1c790 29 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73  ) table contains
1c7a0 20 61 20 73 70 65 63 69 66 69 65 64 20 65 6e 74   a specified ent
1c7b0 72 79 2e 20 54 68 65 20 73 63 68 65 6d 61 73 20  ry. The schemas 
1c7c0 6f 66 20 74 68 65 0a 2a 2a 20 74 77 6f 20 74 61  of the.** two ta
1c7d0 62 6c 65 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20  bles are:.**.** 
1c7e0 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 25    CREATE TABLE %
1c7f0 5f 70 61 72 65 6e 74 28 6e 6f 64 65 6e 6f 20 49  _parent(nodeno I
1c800 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
1c810 45 59 2c 20 70 61 72 65 6e 74 6e 6f 64 65 20 49  EY, parentnode I
1c820 4e 54 45 47 45 52 29 0a 2a 2a 20 20 20 43 52 45  NTEGER).**   CRE
1c830 41 54 45 20 54 41 42 4c 45 20 25 5f 72 6f 77 69  ATE TABLE %_rowi
1c840 64 28 72 6f 77 69 64 20 49 4e 54 45 47 45 52 20  d(rowid INTEGER 
1c850 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 6e 6f 64  PRIMARY KEY, nod
1c860 65 6e 6f 20 49 4e 54 45 47 45 52 29 0a 2a 2a 0a  eno INTEGER).**.
1c870 2a 2a 20 49 6e 20 62 6f 74 68 20 63 61 73 65 73  ** In both cases
1c880 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
1c890 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 72  checks that ther
1c8a0 65 20 65 78 69 73 74 73 20 61 6e 20 65 6e 74 72  e exists an entr
1c8b0 79 20 77 69 74 68 0a 2a 2a 20 49 50 4b 20 76 61  y with.** IPK va
1c8c0 6c 75 65 20 69 4b 65 79 20 61 6e 64 20 74 68 65  lue iKey and the
1c8d0 20 73 65 63 6f 6e 64 20 63 6f 6c 75 6d 6e 20 73   second column s
1c8e0 65 74 20 74 6f 20 69 56 61 6c 2e 0a 2a 2a 0a 2a  et to iVal..**.*
1c8f0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 74  /.static void rt
1c900 72 65 65 43 68 65 63 6b 4d 61 70 70 69 6e 67 28  reeCheckMapping(
1c910 0a 20 20 52 74 72 65 65 43 68 65 63 6b 20 2a 70  .  RtreeCheck *p
1c920 43 68 65 63 6b 2c 20 20 20 20 20 20 20 20 20 20  Check,          
1c930 20 20 20 2f 2a 20 52 74 72 65 65 43 68 65 63 6b     /* RtreeCheck
1c940 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
1c950 20 62 4c 65 61 66 2c 20 20 20 20 20 20 20 20 20   bLeaf,         
1c960 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c970 54 72 75 65 20 66 6f 72 20 61 20 6c 65 61 66 20  True for a leaf 
1c980 63 65 6c 6c 2c 20 66 61 6c 73 65 20 66 6f 72 20  cell, false for 
1c990 69 6e 74 65 72 69 6f 72 20 2a 2f 0a 20 20 69 36  interior */.  i6
1c9a0 34 20 69 4b 65 79 2c 20 20 20 20 20 20 20 20 20  4 iKey,         
1c9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c9c0 20 4b 65 79 20 66 6f 72 20 6d 61 70 70 69 6e 67   Key for mapping
1c9d0 20 2a 2f 0a 20 20 69 36 34 20 69 56 61 6c 20 20   */.  i64 iVal  
1c9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c9f0 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74 65        /* Expecte
1ca00 64 20 76 61 6c 75 65 20 66 6f 72 20 6d 61 70 70  d value for mapp
1ca10 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ing */.){.  int 
1ca20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  rc;.  sqlite3_st
1ca30 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 63 6f 6e  mt *pStmt;.  con
1ca40 73 74 20 63 68 61 72 20 2a 61 7a 53 71 6c 5b 32  st char *azSql[2
1ca50 5d 20 3d 20 7b 0a 20 20 20 20 22 53 45 4c 45 43  ] = {.    "SELEC
1ca60 54 20 70 61 72 65 6e 74 6e 6f 64 65 20 46 52 4f  T parentnode FRO
1ca70 4d 20 25 51 2e 27 25 71 5f 70 61 72 65 6e 74 27  M %Q.'%q_parent'
1ca80 20 57 48 45 52 45 20 6e 6f 64 65 6e 6f 3d 3f 22   WHERE nodeno=?"
1ca90 2c 0a 20 20 20 20 22 53 45 4c 45 43 54 20 6e 6f  ,.    "SELECT no
1caa0 64 65 6e 6f 20 46 52 4f 4d 20 25 51 2e 27 25 71  deno FROM %Q.'%q
1cab0 5f 72 6f 77 69 64 27 20 57 48 45 52 45 20 72 6f  _rowid' WHERE ro
1cac0 77 69 64 3d 3f 22 0a 20 20 7d 3b 0a 0a 20 20 61  wid=?".  };..  a
1cad0 73 73 65 72 74 28 20 62 4c 65 61 66 3d 3d 30 20  ssert( bLeaf==0 
1cae0 7c 7c 20 62 4c 65 61 66 3d 3d 31 20 29 3b 0a 20  || bLeaf==1 );. 
1caf0 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 61 43 68   if( pCheck->aCh
1cb00 65 63 6b 4d 61 70 70 69 6e 67 5b 62 4c 65 61 66  eckMapping[bLeaf
1cb10 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 68 65  ]==0 ){.    pChe
1cb20 63 6b 2d 3e 61 43 68 65 63 6b 4d 61 70 70 69 6e  ck->aCheckMappin
1cb30 67 5b 62 4c 65 61 66 5d 20 3d 20 72 74 72 65 65  g[bLeaf] = rtree
1cb40 43 68 65 63 6b 50 72 65 70 61 72 65 28 70 43 68  CheckPrepare(pCh
1cb50 65 63 6b 2c 0a 20 20 20 20 20 20 20 20 61 7a 53  eck,.        azS
1cb60 71 6c 5b 62 4c 65 61 66 5d 2c 20 70 43 68 65 63  ql[bLeaf], pChec
1cb70 6b 2d 3e 7a 44 62 2c 20 70 43 68 65 63 6b 2d 3e  k->zDb, pCheck->
1cb80 7a 54 61 62 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  zTab.    );.  }.
1cb90 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 72 63    if( pCheck->rc
1cba0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
1cbb0 74 75 72 6e 3b 0a 0a 20 20 70 53 74 6d 74 20 3d  turn;..  pStmt =
1cbc0 20 70 43 68 65 63 6b 2d 3e 61 43 68 65 63 6b 4d   pCheck->aCheckM
1cbd0 61 70 70 69 6e 67 5b 62 4c 65 61 66 5d 3b 0a 20  apping[bLeaf];. 
1cbe0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
1cbf0 74 36 34 28 70 53 74 6d 74 2c 20 31 2c 20 69 4b  t64(pStmt, 1, iK
1cc00 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ey);.  rc = sqli
1cc10 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b  te3_step(pStmt);
1cc20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1cc30 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 72 74  E_DONE ){.    rt
1cc40 72 65 65 43 68 65 63 6b 41 70 70 65 6e 64 4d 73  reeCheckAppendMs
1cc50 67 28 70 43 68 65 63 6b 2c 20 22 4d 61 70 70 69  g(pCheck, "Mappi
1cc60 6e 67 20 28 25 6c 6c 64 20 2d 3e 20 25 6c 6c 64  ng (%lld -> %lld
1cc70 29 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 25  ) missing from %
1cc80 73 20 74 61 62 6c 65 22 2c 0a 20 20 20 20 20 20  s table",.      
1cc90 20 20 69 4b 65 79 2c 20 69 56 61 6c 2c 20 28 62    iKey, iVal, (b
1cca0 4c 65 61 66 20 3f 20 22 25 5f 72 6f 77 69 64 22  Leaf ? "%_rowid"
1ccb0 20 3a 20 22 25 5f 70 61 72 65 6e 74 22 29 0a 20   : "%_parent"). 
1ccc0 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66     );.  }else if
1ccd0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  ( rc==SQLITE_ROW
1cce0 20 29 7b 0a 20 20 20 20 69 36 34 20 69 69 20 3d   ){.    i64 ii =
1ccf0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1cd00 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 30 29 3b  int64(pStmt, 0);
1cd10 0a 20 20 20 20 69 66 28 20 69 69 21 3d 69 56 61  .    if( ii!=iVa
1cd20 6c 20 29 7b 0a 20 20 20 20 20 20 72 74 72 65 65  l ){.      rtree
1cd30 43 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  CheckAppendMsg(p
1cd40 43 68 65 63 6b 2c 20 0a 20 20 20 20 20 20 20 20  Check, .        
1cd50 20 20 22 46 6f 75 6e 64 20 28 25 6c 6c 64 20 2d    "Found (%lld -
1cd60 3e 20 25 6c 6c 64 29 20 69 6e 20 25 73 20 74 61  > %lld) in %s ta
1cd70 62 6c 65 2c 20 65 78 70 65 63 74 65 64 20 28 25  ble, expected (%
1cd80 6c 6c 64 20 2d 3e 20 25 6c 6c 64 29 22 2c 0a 20  lld -> %lld)",. 
1cd90 20 20 20 20 20 20 20 20 20 69 4b 65 79 2c 20 69           iKey, i
1cda0 69 2c 20 28 62 4c 65 61 66 20 3f 20 22 25 5f 72  i, (bLeaf ? "%_r
1cdb0 6f 77 69 64 22 20 3a 20 22 25 5f 70 61 72 65 6e  owid" : "%_paren
1cdc0 74 22 29 2c 20 69 4b 65 79 2c 20 69 56 61 6c 0a  t"), iKey, iVal.
1cdd0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
1cde0 20 7d 0a 20 20 72 74 72 65 65 43 68 65 63 6b 52   }.  rtreeCheckR
1cdf0 65 73 65 74 28 70 43 68 65 63 6b 2c 20 70 53 74  eset(pCheck, pSt
1ce00 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72  mt);.}../*.** Ar
1ce10 67 75 6d 65 6e 74 20 70 43 65 6c 6c 20 70 6f 69  gument pCell poi
1ce20 6e 74 73 20 74 6f 20 61 6e 20 61 72 72 61 79 20  nts to an array 
1ce30 6f 66 20 63 6f 6f 72 64 69 6e 61 74 65 73 20 73  of coordinates s
1ce40 74 6f 72 65 64 20 6f 6e 20 61 6e 20 72 74 72 65  tored on an rtre
1ce50 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20  e page..** This 
1ce60 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20  function checks 
1ce70 74 68 61 74 20 74 68 65 20 63 6f 6f 72 64 69 6e  that the coordin
1ce80 61 74 65 73 20 61 72 65 20 69 6e 74 65 72 6e 61  ates are interna
1ce90 6c 6c 79 20 63 6f 6e 73 69 73 74 65 6e 74 20 28  lly consistent (
1cea0 6e 6f 0a 2a 2a 20 78 31 3e 78 32 20 63 6f 6e 64  no.** x1>x2 cond
1ceb0 69 74 69 6f 6e 73 29 20 61 6e 64 20 61 64 64 73  itions) and adds
1cec0 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
1ced0 65 20 74 6f 20 74 68 65 20 52 74 72 65 65 43 68  e to the RtreeCh
1cee0 65 63 6b 20 6f 62 6a 65 63 74 0a 2a 2a 20 69 66  eck object.** if
1cef0 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 0a 2a   they are not..*
1cf00 2a 0a 2a 2a 20 41 64 64 69 74 69 6f 6e 61 6c 6c  *.** Additionall
1cf10 79 2c 20 69 66 20 70 50 61 72 65 6e 74 20 69 73  y, if pParent is
1cf20 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
1cf30 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f  it is assumed to
1cf40 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65   point to.** the
1cf50 20 61 72 72 61 79 20 6f 66 20 63 6f 6f 72 64 69   array of coordi
1cf60 6e 61 74 65 73 20 6f 6e 20 74 68 65 20 70 61 72  nates on the par
1cf70 65 6e 74 20 70 61 67 65 20 74 68 61 74 20 62 6f  ent page that bo
1cf80 75 6e 64 20 74 68 65 20 70 61 67 65 20 0a 2a 2a  und the page .**
1cf90 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 43 65 6c   containing pCel
1cfa0 6c 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  l. In this case 
1cfb0 69 74 20 69 73 20 61 6c 73 6f 20 76 65 72 69 66  it is also verif
1cfc0 69 65 64 20 74 68 61 74 20 74 68 65 20 74 77 6f  ied that the two
1cfd0 0a 2a 2a 20 73 65 74 73 20 6f 66 20 63 6f 6f 72  .** sets of coor
1cfe0 64 69 6e 61 74 65 73 20 61 72 65 20 6d 75 74 75  dinates are mutu
1cff0 61 6c 6c 79 20 63 6f 6e 73 69 73 74 65 6e 74 20  ally consistent 
1d000 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  and an error mes
1d010 73 61 67 65 20 61 64 64 65 64 0a 2a 2a 20 74 6f  sage added.** to
1d020 20 74 68 65 20 52 74 72 65 65 43 68 65 63 6b 20   the RtreeCheck 
1d030 6f 62 6a 65 63 74 20 69 66 20 74 68 65 79 20 61  object if they a
1d040 72 65 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69  re not..*/.stati
1d050 63 20 76 6f 69 64 20 72 74 72 65 65 43 68 65 63  c void rtreeChec
1d060 6b 43 65 6c 6c 43 6f 6f 72 64 28 0a 20 20 52 74  kCellCoord(.  Rt
1d070 72 65 65 43 68 65 63 6b 20 2a 70 43 68 65 63 6b  reeCheck *pCheck
1d080 2c 20 0a 20 20 69 36 34 20 69 4e 6f 64 65 2c 20  , .  i64 iNode, 
1d090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d0a0 20 20 20 20 20 2f 2a 20 4e 6f 64 65 20 69 64 20       /* Node id 
1d0b0 74 6f 20 75 73 65 20 69 6e 20 65 72 72 6f 72 20  to use in error 
1d0c0 6d 65 73 73 61 67 65 73 20 2a 2f 0a 20 20 69 6e  messages */.  in
1d0d0 74 20 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20  t iCell,        
1d0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d0f0 20 43 65 6c 6c 20 6e 75 6d 62 65 72 20 74 6f 20   Cell number to 
1d100 75 73 65 20 69 6e 20 65 72 72 6f 72 20 6d 65 73  use in error mes
1d110 73 61 67 65 73 20 2a 2f 0a 20 20 75 38 20 2a 70  sages */.  u8 *p
1d120 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
1d130 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
1d140 69 6e 74 65 72 20 74 6f 20 63 65 6c 6c 20 63 6f  inter to cell co
1d150 6f 72 64 69 6e 61 74 65 73 20 2a 2f 0a 20 20 75  ordinates */.  u
1d160 38 20 2a 70 50 61 72 65 6e 74 20 20 20 20 20 20  8 *pParent      
1d170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d180 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 72  * Pointer to par
1d190 65 6e 74 20 63 6f 6f 72 64 69 6e 61 74 65 73 20  ent coordinates 
1d1a0 2a 2f 0a 29 7b 0a 20 20 52 74 72 65 65 43 6f 6f  */.){.  RtreeCoo
1d1b0 72 64 20 63 31 2c 20 63 32 3b 0a 20 20 52 74 72  rd c1, c2;.  Rtr
1d1c0 65 65 43 6f 6f 72 64 20 70 31 2c 20 70 32 3b 0a  eeCoord p1, p2;.
1d1d0 20 20 69 6e 74 20 69 3b 0a 0a 20 20 66 6f 72 28    int i;..  for(
1d1e0 69 3d 30 3b 20 69 3c 70 43 68 65 63 6b 2d 3e 6e  i=0; i<pCheck->n
1d1f0 44 69 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72  Dim; i++){.    r
1d200 65 61 64 43 6f 6f 72 64 28 26 70 43 65 6c 6c 5b  eadCoord(&pCell[
1d210 34 2a 32 2a 69 5d 2c 20 26 63 31 29 3b 0a 20 20  4*2*i], &c1);.  
1d220 20 20 72 65 61 64 43 6f 6f 72 64 28 26 70 43 65    readCoord(&pCe
1d230 6c 6c 5b 34 2a 28 32 2a 69 20 2b 20 31 29 5d 2c  ll[4*(2*i + 1)],
1d240 20 26 63 32 29 3b 0a 0a 20 20 20 20 2f 2a 20 70   &c2);..    /* p
1d250 72 69 6e 74 66 28 22 25 65 2c 20 25 65 5c 6e 22  rintf("%e, %e\n"
1d260 2c 20 63 31 2e 75 2e 66 2c 20 63 32 2e 75 2e 66  , c1.u.f, c2.u.f
1d270 29 3b 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43  ); */.    if( pC
1d280 68 65 63 6b 2d 3e 62 49 6e 74 20 3f 20 63 31 2e  heck->bInt ? c1.
1d290 69 3e 63 32 2e 69 20 3a 20 63 31 2e 66 3e 63 32  i>c2.i : c1.f>c2
1d2a0 2e 66 20 29 7b 0a 20 20 20 20 20 20 72 74 72 65  .f ){.      rtre
1d2b0 65 43 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28  eCheckAppendMsg(
1d2c0 70 43 68 65 63 6b 2c 20 0a 20 20 20 20 20 20 20  pCheck, .       
1d2d0 20 20 20 22 44 69 6d 65 6e 73 69 6f 6e 20 25 64     "Dimension %d
1d2e0 20 6f 66 20 63 65 6c 6c 20 25 64 20 6f 6e 20 6e   of cell %d on n
1d2f0 6f 64 65 20 25 6c 6c 64 20 69 73 20 63 6f 72 72  ode %lld is corr
1d300 75 70 74 22 2c 20 69 2c 20 69 43 65 6c 6c 2c 20  upt", i, iCell, 
1d310 69 4e 6f 64 65 0a 20 20 20 20 20 20 29 3b 0a 20  iNode.      );. 
1d320 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 50     }..    if( pP
1d330 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 72  arent ){.      r
1d340 65 61 64 43 6f 6f 72 64 28 26 70 50 61 72 65 6e  eadCoord(&pParen
1d350 74 5b 34 2a 32 2a 69 5d 2c 20 26 70 31 29 3b 0a  t[4*2*i], &p1);.
1d360 20 20 20 20 20 20 72 65 61 64 43 6f 6f 72 64 28        readCoord(
1d370 26 70 50 61 72 65 6e 74 5b 34 2a 28 32 2a 69 20  &pParent[4*(2*i 
1d380 2b 20 31 29 5d 2c 20 26 70 32 29 3b 0a 0a 20 20  + 1)], &p2);..  
1d390 20 20 20 20 69 66 28 20 28 70 43 68 65 63 6b 2d      if( (pCheck-
1d3a0 3e 62 49 6e 74 20 3f 20 63 31 2e 69 3c 70 31 2e  >bInt ? c1.i<p1.
1d3b0 69 20 3a 20 63 31 2e 66 3c 70 31 2e 66 29 20 0a  i : c1.f<p1.f) .
1d3c0 20 20 20 20 20 20 20 7c 7c 20 28 70 43 68 65 63         || (pChec
1d3d0 6b 2d 3e 62 49 6e 74 20 3f 20 63 32 2e 69 3e 70  k->bInt ? c2.i>p
1d3e0 32 2e 69 20 3a 20 63 32 2e 66 3e 70 32 2e 66 29  2.i : c2.f>p2.f)
1d3f0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
1d400 20 20 72 74 72 65 65 43 68 65 63 6b 41 70 70 65    rtreeCheckAppe
1d410 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 0a 20  ndMsg(pCheck, . 
1d420 20 20 20 20 20 20 20 20 20 20 20 22 44 69 6d 65             "Dime
1d430 6e 73 69 6f 6e 20 25 64 20 6f 66 20 63 65 6c 6c  nsion %d of cell
1d440 20 25 64 20 6f 6e 20 6e 6f 64 65 20 25 6c 6c 64   %d on node %lld
1d450 20 69 73 20 63 6f 72 72 75 70 74 20 72 65 6c 61   is corrupt rela
1d460 74 69 76 65 20 74 6f 20 70 61 72 65 6e 74 22 0a  tive to parent".
1d470 20 20 20 20 20 20 20 20 20 20 20 20 2c 20 69 2c              , i,
1d480 20 69 43 65 6c 6c 2c 20 69 4e 6f 64 65 0a 20 20   iCell, iNode.  
1d490 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
1d4a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
1d4b0 0a 2a 2a 20 52 75 6e 20 72 74 72 65 65 63 68 65  .** Run rtreeche
1d4c0 63 6b 28 29 20 63 68 65 63 6b 73 20 6f 6e 20 6e  ck() checks on n
1d4d0 6f 64 65 20 69 4e 6f 64 65 2c 20 77 68 69 63 68  ode iNode, which
1d4e0 20 69 73 20 61 74 20 64 65 70 74 68 20 69 44 65   is at depth iDe
1d4f0 70 74 68 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68  pth within.** th
1d500 65 20 72 2d 74 72 65 65 20 73 74 72 75 63 74 75  e r-tree structu
1d510 72 65 2e 20 41 72 67 75 6d 65 6e 74 20 61 50 61  re. Argument aPa
1d520 72 65 6e 74 20 70 6f 69 6e 74 73 20 74 6f 20 74  rent points to t
1d530 68 65 20 61 72 72 61 79 20 6f 66 20 63 6f 6f 72  he array of coor
1d540 64 69 6e 61 74 65 73 0a 2a 2a 20 74 68 61 74 20  dinates.** that 
1d550 62 6f 75 6e 64 20 6e 6f 64 65 20 69 4e 6f 64 65  bound node iNode
1d560 20 6f 6e 20 74 68 65 20 70 61 72 65 6e 74 20 6e   on the parent n
1d570 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ode..**.** If an
1d580 79 20 70 72 6f 62 6c 65 6d 73 20 61 72 65 20 64  y problems are d
1d590 69 73 63 6f 76 65 72 65 64 2c 20 61 6e 20 65 72  iscovered, an er
1d5a0 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 61  ror message is a
1d5b0 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 0a 2a  ppended to the.*
1d5c0 2a 20 72 65 70 6f 72 74 20 61 63 63 75 6d 75 6c  * report accumul
1d5d0 61 74 65 64 20 69 6e 20 74 68 65 20 52 74 72 65  ated in the Rtre
1d5e0 65 43 68 65 63 6b 20 6f 62 6a 65 63 74 2e 0a 2a  eCheck object..*
1d5f0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 74  /.static void rt
1d600 72 65 65 43 68 65 63 6b 4e 6f 64 65 28 0a 20 20  reeCheckNode(.  
1d610 52 74 72 65 65 43 68 65 63 6b 20 2a 70 43 68 65  RtreeCheck *pChe
1d620 63 6b 2c 0a 20 20 69 6e 74 20 69 44 65 70 74 68  ck,.  int iDepth
1d630 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1d640 20 20 20 20 20 20 2f 2a 20 44 65 70 74 68 20 6f        /* Depth o
1d650 66 20 69 4e 6f 64 65 20 28 30 3d 3d 6c 65 61 66  f iNode (0==leaf
1d660 29 20 2a 2f 0a 20 20 75 38 20 2a 61 50 61 72 65  ) */.  u8 *aPare
1d670 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nt,             
1d680 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72         /* Buffer
1d690 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 61 72 65   containing pare
1d6a0 6e 74 20 63 6f 6f 72 64 73 20 2a 2f 0a 20 20 69  nt coords */.  i
1d6b0 36 34 20 69 4e 6f 64 65 20 20 20 20 20 20 20 20  64 iNode        
1d6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d6d0 2a 20 4e 6f 64 65 20 74 6f 20 63 68 65 63 6b 20  * Node to check 
1d6e0 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 61 4e 6f 64  */.){.  u8 *aNod
1d6f0 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4e 6f  e = 0;.  int nNo
1d700 64 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  de = 0;..  asser
1d710 74 28 20 69 4e 6f 64 65 3d 3d 31 20 7c 7c 20 61  t( iNode==1 || a
1d720 50 61 72 65 6e 74 21 3d 30 20 29 3b 0a 20 20 61  Parent!=0 );.  a
1d730 73 73 65 72 74 28 20 70 43 68 65 63 6b 2d 3e 6e  ssert( pCheck->n
1d740 44 69 6d 3e 30 20 29 3b 0a 0a 20 20 61 4e 6f 64  Dim>0 );..  aNod
1d750 65 20 3d 20 72 74 72 65 65 43 68 65 63 6b 47 65  e = rtreeCheckGe
1d760 74 4e 6f 64 65 28 70 43 68 65 63 6b 2c 20 69 4e  tNode(pCheck, iN
1d770 6f 64 65 2c 20 26 6e 4e 6f 64 65 29 3b 0a 20 20  ode, &nNode);.  
1d780 69 66 28 20 61 4e 6f 64 65 20 29 7b 0a 20 20 20  if( aNode ){.   
1d790 20 69 66 28 20 6e 4e 6f 64 65 3c 34 20 29 7b 0a   if( nNode<4 ){.
1d7a0 20 20 20 20 20 20 72 74 72 65 65 43 68 65 63 6b        rtreeCheck
1d7b0 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
1d7c0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 4e 6f  , .          "No
1d7d0 64 65 20 25 6c 6c 64 20 69 73 20 74 6f 6f 20 73  de %lld is too s
1d7e0 6d 61 6c 6c 20 28 25 64 20 62 79 74 65 73 29 22  mall (%d bytes)"
1d7f0 2c 20 69 4e 6f 64 65 2c 20 6e 4e 6f 64 65 0a 20  , iNode, nNode. 
1d800 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 65 6c 73       );.    }els
1d810 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 65  e{.      int nCe
1d820 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
1d830 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1d840 66 20 63 65 6c 6c 73 20 6f 6e 20 70 61 67 65 20  f cells on page 
1d850 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20  */.      int i; 
1d860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d870 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
1d880 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
1d890 63 65 6c 6c 73 20 2a 2f 0a 20 20 20 20 20 20 69  cells */.      i
1d8a0 66 28 20 61 50 61 72 65 6e 74 3d 3d 30 20 29 7b  f( aParent==0 ){
1d8b0 0a 20 20 20 20 20 20 20 20 69 44 65 70 74 68 20  .        iDepth 
1d8c0 3d 20 72 65 61 64 49 6e 74 31 36 28 61 4e 6f 64  = readInt16(aNod
1d8d0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
1d8e0 69 44 65 70 74 68 3e 52 54 52 45 45 5f 4d 41 58  iDepth>RTREE_MAX
1d8f0 5f 44 45 50 54 48 20 29 7b 0a 20 20 20 20 20 20  _DEPTH ){.      
1d900 20 20 20 20 72 74 72 65 65 43 68 65 63 6b 41 70      rtreeCheckAp
1d910 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
1d920 22 52 74 72 65 65 20 64 65 70 74 68 20 6f 75 74  "Rtree depth out
1d930 20 6f 66 20 72 61 6e 67 65 20 28 25 64 29 22 2c   of range (%d)",
1d940 20 69 44 65 70 74 68 29 3b 0a 20 20 20 20 20 20   iDepth);.      
1d950 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1d960 28 61 4e 6f 64 65 29 3b 0a 20 20 20 20 20 20 20  (aNode);.       
1d970 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
1d980 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1d990 20 20 20 6e 43 65 6c 6c 20 3d 20 72 65 61 64 49     nCell = readI
1d9a0 6e 74 31 36 28 26 61 4e 6f 64 65 5b 32 5d 29 3b  nt16(&aNode[2]);
1d9b0 0a 20 20 20 20 20 20 69 66 28 20 28 34 20 2b 20  .      if( (4 + 
1d9c0 6e 43 65 6c 6c 2a 28 38 20 2b 20 70 43 68 65 63  nCell*(8 + pChec
1d9d0 6b 2d 3e 6e 44 69 6d 2a 32 2a 34 29 29 3e 6e 4e  k->nDim*2*4))>nN
1d9e0 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ode ){.        r
1d9f0 74 72 65 65 43 68 65 63 6b 41 70 70 65 6e 64 4d  treeCheckAppendM
1da00 73 67 28 70 43 68 65 63 6b 2c 20 0a 20 20 20 20  sg(pCheck, .    
1da10 20 20 20 20 20 20 20 20 22 4e 6f 64 65 20 25 6c          "Node %l
1da20 6c 64 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20  ld is too small 
1da30 66 6f 72 20 63 65 6c 6c 20 63 6f 75 6e 74 20 6f  for cell count o
1da40 66 20 25 64 20 28 25 64 20 62 79 74 65 73 29 22  f %d (%d bytes)"
1da50 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  , .            i
1da60 4e 6f 64 65 2c 20 6e 43 65 6c 6c 2c 20 6e 4e 6f  Node, nCell, nNo
1da70 64 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  de.        );.  
1da80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1da90 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
1daa0 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ell; i++){.     
1dab0 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d       u8 *pCell =
1dac0 20 26 61 4e 6f 64 65 5b 34 20 2b 20 69 2a 28 38   &aNode[4 + i*(8
1dad0 20 2b 20 70 43 68 65 63 6b 2d 3e 6e 44 69 6d 2a   + pCheck->nDim*
1dae0 32 2a 34 29 5d 3b 0a 20 20 20 20 20 20 20 20 20  2*4)];.         
1daf0 20 69 36 34 20 69 56 61 6c 20 3d 20 72 65 61 64   i64 iVal = read
1db00 49 6e 74 36 34 28 70 43 65 6c 6c 29 3b 0a 20 20  Int64(pCell);.  
1db10 20 20 20 20 20 20 20 20 72 74 72 65 65 43 68 65          rtreeChe
1db20 63 6b 43 65 6c 6c 43 6f 6f 72 64 28 70 43 68 65  ckCellCoord(pChe
1db30 63 6b 2c 20 69 4e 6f 64 65 2c 20 69 2c 20 26 70  ck, iNode, i, &p
1db40 43 65 6c 6c 5b 38 5d 2c 20 61 50 61 72 65 6e 74  Cell[8], aParent
1db50 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66  );..          if
1db60 28 20 69 44 65 70 74 68 3e 30 20 29 7b 0a 20 20  ( iDepth>0 ){.  
1db70 20 20 20 20 20 20 20 20 20 20 72 74 72 65 65 43            rtreeC
1db80 68 65 63 6b 4d 61 70 70 69 6e 67 28 70 43 68 65  heckMapping(pChe
1db90 63 6b 2c 20 30 2c 20 69 56 61 6c 2c 20 69 4e 6f  ck, 0, iVal, iNo
1dba0 64 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  de);.           
1dbb0 20 72 74 72 65 65 43 68 65 63 6b 4e 6f 64 65 28   rtreeCheckNode(
1dbc0 70 43 68 65 63 6b 2c 20 69 44 65 70 74 68 2d 31  pCheck, iDepth-1
1dbd0 2c 20 26 70 43 65 6c 6c 5b 38 5d 2c 20 69 56 61  , &pCell[8], iVa
1dbe0 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  l);.            
1dbf0 70 43 68 65 63 6b 2d 3e 6e 4e 6f 6e 4c 65 61 66  pCheck->nNonLeaf
1dc00 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ++;.          }e
1dc10 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
1dc20 20 72 74 72 65 65 43 68 65 63 6b 4d 61 70 70 69   rtreeCheckMappi
1dc30 6e 67 28 70 43 68 65 63 6b 2c 20 31 2c 20 69 56  ng(pCheck, 1, iV
1dc40 61 6c 2c 20 69 4e 6f 64 65 29 3b 0a 20 20 20 20  al, iNode);.    
1dc50 20 20 20 20 20 20 20 20 70 43 68 65 63 6b 2d 3e          pCheck->
1dc60 6e 4c 65 61 66 2b 2b 3b 0a 20 20 20 20 20 20 20  nLeaf++;.       
1dc70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1dc80 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1dc90 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 4e   sqlite3_free(aN
1dca0 6f 64 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ode);.  }.}../*.
1dcb0 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  ** The second ar
1dcc0 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
1dcd0 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  unction must be 
1dce0 65 69 74 68 65 72 20 22 5f 72 6f 77 69 64 22 20  either "_rowid" 
1dcf0 6f 72 0a 2a 2a 20 22 5f 70 61 72 65 6e 74 22 2e  or.** "_parent".
1dd00 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
1dd10 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 20 6e  hecks that the n
1dd20 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
1dd30 20 69 6e 20 74 68 65 0a 2a 2a 20 25 5f 72 6f 77   in the.** %_row
1dd40 69 64 20 6f 72 20 25 5f 70 61 72 65 6e 74 20 74  id or %_parent t
1dd50 61 62 6c 65 20 69 73 20 65 78 61 63 74 6c 79 20  able is exactly 
1dd60 6e 45 78 70 65 63 74 2e 20 49 66 20 6e 6f 74 2c  nExpect. If not,
1dd70 20 69 74 20 61 64 64 73 0a 2a 2a 20 61 6e 20 65   it adds.** an e
1dd80 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20  rror message to 
1dd90 74 68 65 20 72 65 70 6f 72 74 20 69 6e 20 74 68  the report in th
1dda0 65 20 52 74 72 65 65 43 68 65 63 6b 20 6f 62 6a  e RtreeCheck obj
1ddb0 65 63 74 20 69 6e 64 69 63 61 74 65 64 0a 2a 2a  ect indicated.**
1ddc0 20 62 79 20 74 68 65 20 66 69 72 73 74 20 61 72   by the first ar
1ddd0 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
1dde0 63 20 76 6f 69 64 20 72 74 72 65 65 43 68 65 63  c void rtreeChec
1ddf0 6b 43 6f 75 6e 74 28 52 74 72 65 65 43 68 65 63  kCount(RtreeChec
1de00 6b 20 2a 70 43 68 65 63 6b 2c 20 63 6f 6e 73 74  k *pCheck, const
1de10 20 63 68 61 72 20 2a 7a 54 62 6c 2c 20 69 36 34   char *zTbl, i64
1de20 20 6e 45 78 70 65 63 74 29 7b 0a 20 20 69 66 28   nExpect){.  if(
1de30 20 70 43 68 65 63 6b 2d 3e 72 63 3d 3d 53 51 4c   pCheck->rc==SQL
1de40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
1de50 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 43 6f 75  lite3_stmt *pCou
1de60 6e 74 3b 0a 20 20 20 20 70 43 6f 75 6e 74 20 3d  nt;.    pCount =
1de70 20 72 74 72 65 65 43 68 65 63 6b 50 72 65 70 61   rtreeCheckPrepa
1de80 72 65 28 70 43 68 65 63 6b 2c 20 22 53 45 4c 45  re(pCheck, "SELE
1de90 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
1dea0 20 25 51 2e 27 25 71 25 73 27 22 2c 0a 20 20 20   %Q.'%q%s'",.   
1deb0 20 20 20 20 20 70 43 68 65 63 6b 2d 3e 7a 44 62       pCheck->zDb
1dec0 2c 20 70 43 68 65 63 6b 2d 3e 7a 54 61 62 2c 20  , pCheck->zTab, 
1ded0 7a 54 62 6c 0a 20 20 20 20 29 3b 0a 20 20 20 20  zTbl.    );.    
1dee0 69 66 28 20 70 43 6f 75 6e 74 20 29 7b 0a 20 20  if( pCount ){.  
1def0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
1df00 73 74 65 70 28 70 43 6f 75 6e 74 29 3d 3d 53 51  step(pCount)==SQ
1df10 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
1df20 20 20 20 20 69 36 34 20 6e 41 63 74 75 61 6c 20      i64 nActual 
1df30 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
1df40 5f 69 6e 74 36 34 28 70 43 6f 75 6e 74 2c 20 30  _int64(pCount, 0
1df50 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
1df60 41 63 74 75 61 6c 21 3d 6e 45 78 70 65 63 74 20  Actual!=nExpect 
1df70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 74 72  ){.          rtr
1df80 65 65 43 68 65 63 6b 41 70 70 65 6e 64 4d 73 67  eeCheckAppendMsg
1df90 28 70 43 68 65 63 6b 2c 20 22 57 72 6f 6e 67 20  (pCheck, "Wrong 
1dfa0 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
1dfb0 73 20 69 6e 20 25 25 25 73 20 74 61 62 6c 65 22  s in %%%s table"
1dfc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
1dfd0 20 2d 20 65 78 70 65 63 74 65 64 20 25 6c 6c 64   - expected %lld
1dfe0 2c 20 61 63 74 75 61 6c 20 25 6c 6c 64 22 20 2c  , actual %lld" ,
1dff0 20 7a 54 62 6c 2c 20 6e 45 78 70 65 63 74 2c 20   zTbl, nExpect, 
1e000 6e 41 63 74 75 61 6c 0a 20 20 20 20 20 20 20 20  nActual.        
1e010 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20    );.        }. 
1e020 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 68       }.      pCh
1e030 65 63 6b 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65  eck->rc = sqlite
1e040 33 5f 66 69 6e 61 6c 69 7a 65 28 70 43 6f 75 6e  3_finalize(pCoun
1e050 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  t);.    }.  }.}.
1e060 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1e070 74 69 6f 6e 20 64 6f 65 73 20 74 68 65 20 62 75  tion does the bu
1e080 6c 6b 20 6f 66 20 74 68 65 20 77 6f 72 6b 20 66  lk of the work f
1e090 6f 72 20 74 68 65 20 72 74 72 65 65 20 69 6e 74  or the rtree int
1e0a0 65 67 72 69 74 79 2d 63 68 65 63 6b 2e 0a 2a 2a  egrity-check..**
1e0b0 20 49 74 20 69 73 20 63 61 6c 6c 65 64 20 62 79   It is called by
1e0c0 20 72 74 72 65 65 63 68 65 63 6b 28 29 2c 20 77   rtreecheck(), w
1e0d0 68 69 63 68 20 69 73 20 74 68 65 20 53 51 4c 20  hich is the SQL 
1e0e0 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65  function impleme
1e0f0 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ntation..*/.stat
1e100 69 63 20 69 6e 74 20 72 74 72 65 65 43 68 65 63  ic int rtreeChec
1e110 6b 54 61 62 6c 65 28 0a 20 20 73 71 6c 69 74 65  kTable(.  sqlite
1e120 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
1e130 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
1e140 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74 6f 20  abase handle to 
1e150 61 63 63 65 73 73 20 64 62 20 74 68 72 6f 75 67  access db throug
1e160 68 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  h */.  const cha
1e170 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 20 20  r *zDb,         
1e180 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
1e190 66 20 64 62 20 28 22 6d 61 69 6e 22 2c 20 22 74  f db ("main", "t
1e1a0 65 6d 70 22 20 65 74 63 2e 29 20 2a 2f 0a 20 20  emp" etc.) */.  
1e1b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
1e1c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1e1d0 2f 2a 20 4e 61 6d 65 20 6f 66 20 72 74 72 65 65  /* Name of rtree
1e1e0 20 74 61 62 6c 65 20 74 6f 20 63 68 65 63 6b 20   table to check 
1e1f0 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 52 65  */.  char **pzRe
1e200 70 6f 72 74 20 20 20 20 20 20 20 20 20 20 20 20  port            
1e210 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 73 71 6c       /* OUT: sql
1e220 69 74 65 33 5f 6d 61 6c 6c 6f 63 27 64 20 72 65  ite3_malloc'd re
1e230 70 6f 72 74 20 74 65 78 74 20 2a 2f 0a 29 7b 0a  port text */.){.
1e240 20 20 52 74 72 65 65 43 68 65 63 6b 20 63 68 65    RtreeCheck che
1e250 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ck;             
1e260 20 20 2f 2a 20 43 6f 6d 6d 6f 6e 20 63 6f 6e 74    /* Common cont
1e270 65 78 74 20 66 6f 72 20 76 61 72 69 6f 75 73 20  ext for various 
1e280 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 20 20 73 71  routines */.  sq
1e290 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
1e2a0 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  t = 0;        /*
1e2b0 20 55 73 65 64 20 74 6f 20 66 69 6e 64 20 63 6f   Used to find co
1e2c0 6c 75 6d 6e 20 63 6f 75 6e 74 20 6f 66 20 72 74  lumn count of rt
1e2d0 72 65 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  ree table */.  i
1e2e0 6e 74 20 62 45 6e 64 20 3d 20 30 3b 20 20 20 20  nt bEnd = 0;    
1e2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e300 2a 20 54 72 75 65 20 69 66 20 74 72 61 6e 73 61  * True if transa
1e310 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20  ction should be 
1e320 63 6c 6f 73 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20  closed */..  /* 
1e330 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 63  Initialize the c
1e340 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 2a 2f  ontext object */
1e350 0a 20 20 6d 65 6d 73 65 74 28 26 63 68 65 63 6b  .  memset(&check
1e360 2c 20 30 2c 20 73 69 7a 65 6f 66 28 63 68 65 63  , 0, sizeof(chec
1e370 6b 29 29 3b 0a 20 20 63 68 65 63 6b 2e 64 62 20  k));.  check.db 
1e380 3d 20 64 62 3b 0a 20 20 63 68 65 63 6b 2e 7a 44  = db;.  check.zD
1e390 62 20 3d 20 7a 44 62 3b 0a 20 20 63 68 65 63 6b  b = zDb;.  check
1e3a0 2e 7a 54 61 62 20 3d 20 7a 54 61 62 3b 0a 0a 20  .zTab = zTab;.. 
1e3b0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
1e3c0 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e 20 6f  not already an o
1e3d0 70 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  pen transaction,
1e3e0 20 6f 70 65 6e 20 6f 6e 65 20 6e 6f 77 2e 20 54   open one now. T
1e3f0 68 69 73 20 69 73 0a 20 20 2a 2a 20 74 6f 20 65  his is.  ** to e
1e400 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 71  nsure that the q
1e410 75 65 72 69 65 73 20 72 75 6e 20 61 73 20 70 61  ueries run as pa
1e420 72 74 20 6f 66 20 74 68 69 73 20 69 6e 74 65 67  rt of this integ
1e430 72 69 74 79 2d 63 68 65 63 6b 20 6f 70 65 72 61  rity-check opera
1e440 74 65 0a 20 20 2a 2a 20 6f 6e 20 61 20 63 6f 6e  te.  ** on a con
1e450 73 69 73 74 65 6e 74 20 73 6e 61 70 73 68 6f 74  sistent snapshot
1e460 2e 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  .  */.  if( sqli
1e470 74 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d  te3_get_autocomm
1e480 69 74 28 64 62 29 20 29 7b 0a 20 20 20 20 63 68  it(db) ){.    ch
1e490 65 63 6b 2e 72 63 20 3d 20 73 71 6c 69 74 65 33  eck.rc = sqlite3
1e4a0 5f 65 78 65 63 28 64 62 2c 20 22 42 45 47 49 4e  _exec(db, "BEGIN
1e4b0 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ", 0, 0, 0);.   
1e4c0 20 62 45 6e 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a   bEnd = 1;.  }..
1e4d0 20 20 2f 2a 20 46 69 6e 64 20 6e 75 6d 62 65 72    /* Find number
1e4e0 20 6f 66 20 64 69 6d 65 6e 73 69 6f 6e 73 20 69   of dimensions i
1e4f0 6e 20 74 68 65 20 72 74 72 65 65 20 74 61 62 6c  n the rtree tabl
1e500 65 2e 20 2a 2f 0a 20 20 70 53 74 6d 74 20 3d 20  e. */.  pStmt = 
1e510 72 74 72 65 65 43 68 65 63 6b 50 72 65 70 61 72  rtreeCheckPrepar
1e520 65 28 26 63 68 65 63 6b 2c 20 22 53 45 4c 45 43  e(&check, "SELEC
1e530 54 20 2a 20 46 52 4f 4d 20 25 51 2e 25 51 22 2c  T * FROM %Q.%Q",
1e540 20 7a 44 62 2c 20 7a 54 61 62 29 3b 0a 20 20 69   zDb, zTab);.  i
1e550 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  f( pStmt ){.    
1e560 69 6e 74 20 72 63 3b 0a 20 20 20 20 63 68 65 63  int rc;.    chec
1e570 6b 2e 6e 44 69 6d 20 3d 20 28 73 71 6c 69 74 65  k.nDim = (sqlite
1e580 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70  3_column_count(p
1e590 53 74 6d 74 29 20 2d 20 31 29 20 2f 20 32 3b 0a  Stmt) - 1) / 2;.
1e5a0 20 20 20 20 69 66 28 20 63 68 65 63 6b 2e 6e 44      if( check.nD
1e5b0 69 6d 3c 31 20 29 7b 0a 20 20 20 20 20 20 72 74  im<1 ){.      rt
1e5c0 72 65 65 43 68 65 63 6b 41 70 70 65 6e 64 4d 73  reeCheckAppendMs
1e5d0 67 28 26 63 68 65 63 6b 2c 20 22 53 63 68 65 6d  g(&check, "Schem
1e5e0 61 20 63 6f 72 72 75 70 74 20 6f 72 20 6e 6f 74  a corrupt or not
1e5f0 20 61 6e 20 72 74 72 65 65 22 29 3b 0a 20 20 20   an rtree");.   
1e600 20 7d 65 6c 73 65 20 69 66 28 20 53 51 4c 49 54   }else if( SQLIT
1e610 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
1e620 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20  tep(pStmt) ){.  
1e630 20 20 20 20 63 68 65 63 6b 2e 62 49 6e 74 20 3d      check.bInt =
1e640 20 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   (sqlite3_column
1e650 5f 74 79 70 65 28 70 53 74 6d 74 2c 20 31 29 3d  _type(pStmt, 1)=
1e660 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29  =SQLITE_INTEGER)
1e670 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
1e680 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
1e690 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66  e(pStmt);.    if
1e6a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 43 4f 52  ( rc!=SQLITE_COR
1e6b0 52 55 50 54 20 29 20 63 68 65 63 6b 2e 72 63 20  RUPT ) check.rc 
1e6c0 3d 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  = rc;.  }..  /* 
1e6d0 44 6f 20 74 68 65 20 61 63 74 75 61 6c 20 69 6e  Do the actual in
1e6e0 74 65 67 72 69 74 79 2d 63 68 65 63 6b 20 2a 2f  tegrity-check */
1e6f0 0a 20 20 69 66 28 20 63 68 65 63 6b 2e 6e 44 69  .  if( check.nDi
1e700 6d 3e 3d 31 20 29 7b 0a 20 20 20 20 69 66 28 20  m>=1 ){.    if( 
1e710 63 68 65 63 6b 2e 72 63 3d 3d 53 51 4c 49 54 45  check.rc==SQLITE
1e720 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 74 72  _OK ){.      rtr
1e730 65 65 43 68 65 63 6b 4e 6f 64 65 28 26 63 68 65  eeCheckNode(&che
1e740 63 6b 2c 20 30 2c 20 30 2c 20 31 29 3b 0a 20 20  ck, 0, 0, 1);.  
1e750 20 20 7d 0a 20 20 20 20 72 74 72 65 65 43 68 65    }.    rtreeChe
1e760 63 6b 43 6f 75 6e 74 28 26 63 68 65 63 6b 2c 20  ckCount(&check, 
1e770 22 5f 72 6f 77 69 64 22 2c 20 63 68 65 63 6b 2e  "_rowid", check.
1e780 6e 4c 65 61 66 29 3b 0a 20 20 20 20 72 74 72 65  nLeaf);.    rtre
1e790 65 43 68 65 63 6b 43 6f 75 6e 74 28 26 63 68 65  eCheckCount(&che
1e7a0 63 6b 2c 20 22 5f 70 61 72 65 6e 74 22 2c 20 63  ck, "_parent", c
1e7b0 68 65 63 6b 2e 6e 4e 6f 6e 4c 65 61 66 29 3b 0a  heck.nNonLeaf);.
1e7c0 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 69    }..  /* Finali
1e7d0 7a 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ze SQL statement
1e7e0 73 20 75 73 65 64 20 62 79 20 74 68 65 20 69 6e  s used by the in
1e7f0 74 65 67 72 69 74 79 2d 63 68 65 63 6b 20 2a 2f  tegrity-check */
1e800 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
1e810 69 7a 65 28 63 68 65 63 6b 2e 70 47 65 74 4e 6f  ize(check.pGetNo
1e820 64 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  de);.  sqlite3_f
1e830 69 6e 61 6c 69 7a 65 28 63 68 65 63 6b 2e 61 43  inalize(check.aC
1e840 68 65 63 6b 4d 61 70 70 69 6e 67 5b 30 5d 29 3b  heckMapping[0]);
1e850 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
1e860 69 7a 65 28 63 68 65 63 6b 2e 61 43 68 65 63 6b  ize(check.aCheck
1e870 4d 61 70 70 69 6e 67 5b 31 5d 29 3b 0a 0a 20 20  Mapping[1]);..  
1e880 2f 2a 20 49 66 20 6f 6e 65 20 77 61 73 20 6f 70  /* If one was op
1e890 65 6e 65 64 2c 20 63 6c 6f 73 65 20 74 68 65 20  ened, close the 
1e8a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
1e8b0 20 69 66 28 20 62 45 6e 64 20 29 7b 0a 20 20 20   if( bEnd ){.   
1e8c0 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
1e8d0 33 5f 65 78 65 63 28 64 62 2c 20 22 45 4e 44 22  3_exec(db, "END"
1e8e0 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
1e8f0 69 66 28 20 63 68 65 63 6b 2e 72 63 3d 3d 53 51  if( check.rc==SQ
1e900 4c 49 54 45 5f 4f 4b 20 29 20 63 68 65 63 6b 2e  LITE_OK ) check.
1e910 72 63 20 3d 20 72 63 3b 0a 20 20 7d 0a 20 20 2a  rc = rc;.  }.  *
1e920 70 7a 52 65 70 6f 72 74 20 3d 20 63 68 65 63 6b  pzReport = check
1e930 2e 7a 52 65 70 6f 72 74 3b 0a 20 20 72 65 74 75  .zReport;.  retu
1e940 72 6e 20 63 68 65 63 6b 2e 72 63 3b 0a 7d 0a 0a  rn check.rc;.}..
1e950 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a  /*.** Usage:.**.
1e960 2a 2a 20 20 20 72 74 72 65 65 63 68 65 63 6b 28  **   rtreecheck(
1e970 3c 72 74 72 65 65 2d 74 61 62 6c 65 3e 29 3b 0a  <rtree-table>);.
1e980 2a 2a 20 20 20 72 74 72 65 65 63 68 65 63 6b 28  **   rtreecheck(
1e990 3c 64 61 74 61 62 61 73 65 3e 2c 20 3c 72 74 72  <database>, <rtr
1e9a0 65 65 2d 74 61 62 6c 65 3e 29 3b 0a 2a 2a 0a 2a  ee-table>);.**.*
1e9b0 2a 20 49 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20  * Invoking this 
1e9c0 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 72 75 6e  SQL function run
1e9d0 73 20 61 6e 20 69 6e 74 65 67 72 69 74 79 2d 63  s an integrity-c
1e9e0 68 65 63 6b 20 6f 6e 20 74 68 65 20 6e 61 6d 65  heck on the name
1e9f0 64 20 72 74 72 65 65 0a 2a 2a 20 74 61 62 6c 65  d rtree.** table
1ea00 2e 20 54 68 65 20 69 6e 74 65 67 72 69 74 79 2d  . The integrity-
1ea10 63 68 65 63 6b 20 76 65 72 69 66 69 65 73 20 74  check verifies t
1ea20 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
1ea30 0a 2a 2a 20 20 20 31 2e 20 46 6f 72 20 65 61 63  .**   1. For eac
1ea40 68 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 72 2d  h cell in the r-
1ea50 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 28  tree structure (
1ea60 25 5f 6e 6f 64 65 20 74 61 62 6c 65 29 2c 20 74  %_node table), t
1ea70 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  hat:.**.**      
1ea80 20 61 29 20 66 6f 72 20 65 61 63 68 20 64 69 6d   a) for each dim
1ea90 65 6e 73 69 6f 6e 2c 20 28 63 6f 6f 72 64 31 20  ension, (coord1 
1eaa0 3c 3d 20 63 6f 6f 72 64 32 29 2e 0a 2a 2a 0a 2a  <= coord2)..**.*
1eab0 2a 20 20 20 20 20 20 20 62 29 20 75 6e 6c 65 73  *       b) unles
1eac0 73 20 74 68 65 20 63 65 6c 6c 20 69 73 20 6f 6e  s the cell is on
1ead0 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2c 20   the root node, 
1eae0 74 68 61 74 20 74 68 65 20 63 65 6c 6c 20 69 73  that the cell is
1eaf0 20 62 6f 75 6e 64 65 64 0a 2a 2a 20 20 20 20 20   bounded.**     
1eb00 20 20 20 20 20 62 79 20 74 68 65 20 70 61 72 65       by the pare
1eb10 6e 74 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 70  nt cell on the p
1eb20 61 72 65 6e 74 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a  arent node..**.*
1eb30 2a 20 20 20 20 20 20 20 63 29 20 66 6f 72 20 6c  *       c) for l
1eb40 65 61 66 20 6e 6f 64 65 73 2c 20 74 68 61 74 20  eaf nodes, that 
1eb50 74 68 65 72 65 20 69 73 20 61 6e 20 65 6e 74 72  there is an entr
1eb60 79 20 69 6e 20 74 68 65 20 25 5f 72 6f 77 69 64  y in the %_rowid
1eb70 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74 61   .**          ta
1eb80 62 6c 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ble correspondin
1eb90 67 20 74 6f 20 74 68 65 20 63 65 6c 6c 27 73 20  g to the cell's 
1eba0 72 6f 77 69 64 20 76 61 6c 75 65 20 74 68 61 74  rowid value that
1ebb0 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 70 6f   .**          po
1ebc0 69 6e 74 73 20 74 6f 20 74 68 65 20 63 6f 72 72  ints to the corr
1ebd0 65 63 74 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ect node..**.** 
1ebe0 20 20 20 20 20 20 64 29 20 66 6f 72 20 63 65 6c        d) for cel
1ebf0 6c 73 20 6f 6e 20 6e 6f 6e 2d 6c 65 61 66 20 6e  ls on non-leaf n
1ec00 6f 64 65 73 2c 20 74 68 61 74 20 74 68 65 72 65  odes, that there
1ec10 20 69 73 20 61 6e 20 65 6e 74 72 79 20 69 6e 20   is an entry in 
1ec20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  the .**         
1ec30 20 25 5f 70 61 72 65 6e 74 20 74 61 62 6c 65 20   %_parent table 
1ec40 6d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 68 65  mapping from the
1ec50 20 63 65 6c 6c 27 73 20 63 68 69 6c 64 20 6e 6f   cell's child no
1ec60 64 65 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20  de to the.**    
1ec70 20 20 20 20 20 20 6e 6f 64 65 20 74 68 61 74 20        node that 
1ec80 69 74 20 72 65 73 69 64 65 73 20 6f 6e 2e 0a 2a  it resides on..*
1ec90 2a 0a 2a 2a 20 20 20 32 2e 20 54 68 61 74 20 74  *.**   2. That t
1eca0 68 65 72 65 20 61 72 65 20 74 68 65 20 73 61 6d  here are the sam
1ecb0 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
1ecc0 69 65 73 20 69 6e 20 74 68 65 20 25 5f 72 6f 77  ies in the %_row
1ecd0 69 64 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20  id table.**     
1ece0 20 61 73 20 74 68 65 72 65 20 61 72 65 20 6c 65   as there are le
1ecf0 61 66 20 63 65 6c 6c 73 20 69 6e 20 74 68 65 20  af cells in the 
1ed00 72 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  r-tree structure
1ed10 2c 20 61 6e 64 20 74 68 61 74 20 74 68 65 72 65  , and that there
1ed20 0a 2a 2a 20 20 20 20 20 20 69 73 20 61 20 6c 65  .**      is a le
1ed30 61 66 20 63 65 6c 6c 20 74 68 61 74 20 63 6f 72  af cell that cor
1ed40 72 65 73 70 6f 6e 64 73 20 74 6f 20 65 61 63 68  responds to each
1ed50 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 25 5f   entry in the %_
1ed60 72 6f 77 69 64 20 74 61 62 6c 65 2e 0a 2a 2a 0a  rowid table..**.
1ed70 2a 2a 20 20 20 33 2e 20 54 68 61 74 20 74 68 65  **   3. That the
1ed80 72 65 20 61 72 65 20 74 68 65 20 73 61 6d 65 20  re are the same 
1ed90 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
1eda0 73 20 69 6e 20 74 68 65 20 25 5f 70 61 72 65 6e  s in the %_paren
1edb0 74 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20  t table.**      
1edc0 61 73 20 74 68 65 72 65 20 61 72 65 20 6e 6f 6e  as there are non
1edd0 2d 6c 65 61 66 20 63 65 6c 6c 73 20 69 6e 20 74  -leaf cells in t
1ede0 68 65 20 72 2d 74 72 65 65 20 73 74 72 75 63 74  he r-tree struct
1edf0 75 72 65 2c 20 61 6e 64 20 74 68 61 74 20 0a 2a  ure, and that .*
1ee00 2a 20 20 20 20 20 20 74 68 65 72 65 20 69 73 20  *      there is 
1ee10 61 20 6e 6f 6e 2d 6c 65 61 66 20 63 65 6c 6c 20  a non-leaf cell 
1ee20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  that corresponds
1ee30 20 74 6f 20 65 61 63 68 20 65 6e 74 72 79 20 69   to each entry i
1ee40 6e 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 25  n the .**      %
1ee50 5f 70 61 72 65 6e 74 20 74 61 62 6c 65 2e 0a 2a  _parent table..*
1ee60 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 74  /.static void rt
1ee70 72 65 65 63 68 65 63 6b 28 0a 20 20 73 71 6c 69  reecheck(.  sqli
1ee80 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78  te3_context *ctx
1ee90 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 0a  , .  int nArg, .
1eea0 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
1eeb0 2a 2a 61 70 41 72 67 0a 29 7b 0a 20 20 69 66 28  **apArg.){.  if(
1eec0 20 6e 41 72 67 21 3d 31 20 26 26 20 6e 41 72 67   nArg!=1 && nArg
1eed0 21 3d 32 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=2 ){.    sqlit
1eee0 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
1eef0 63 74 78 2c 20 0a 20 20 20 20 20 20 20 20 22 77  ctx, .        "w
1ef00 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61  rong number of a
1ef10 72 67 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63  rguments to func
1ef20 74 69 6f 6e 20 72 74 72 65 65 63 68 65 63 6b 28  tion rtreecheck(
1ef30 29 22 2c 20 2d 31 0a 20 20 20 20 29 3b 0a 20 20  )", -1.    );.  
1ef40 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72  }else{.    int r
1ef50 63 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 52 65  c;.    char *zRe
1ef60 70 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 63 6f  port = 0;.    co
1ef70 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20  nst char *zDb = 
1ef80 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
1ef90 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
1efa0 61 70 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 63  apArg[0]);.    c
1efb0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 3b  onst char *zTab;
1efc0 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 31  .    if( nArg==1
1efd0 20 29 7b 0a 20 20 20 20 20 20 7a 54 61 62 20 3d   ){.      zTab =
1efe0 20 7a 44 62 3b 0a 20 20 20 20 20 20 7a 44 62 20   zDb;.      zDb 
1eff0 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 7d 65  = "main";.    }e
1f000 6c 73 65 7b 0a 20 20 20 20 20 20 7a 54 61 62 20  lse{.      zTab 
1f010 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
1f020 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
1f030 74 28 61 70 41 72 67 5b 31 5d 29 3b 0a 20 20 20  t(apArg[1]);.   
1f040 20 7d 0a 20 20 20 20 72 63 20 3d 20 72 74 72 65   }.    rc = rtre
1f050 65 43 68 65 63 6b 54 61 62 6c 65 28 73 71 6c 69  eCheckTable(sqli
1f060 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68  te3_context_db_h
1f070 61 6e 64 6c 65 28 63 74 78 29 2c 20 7a 44 62 2c  andle(ctx), zDb,
1f080 20 7a 54 61 62 2c 20 26 7a 52 65 70 6f 72 74 29   zTab, &zReport)
1f090 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1f0a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1f0b0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
1f0c0 74 65 78 74 28 63 74 78 2c 20 7a 52 65 70 6f 72  text(ctx, zRepor
1f0d0 74 20 3f 20 7a 52 65 70 6f 72 74 20 3a 20 22 6f  t ? zReport : "o
1f0e0 6b 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54  k", -1, SQLITE_T
1f0f0 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d  RANSIENT);.    }
1f100 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
1f110 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
1f120 5f 63 6f 64 65 28 63 74 78 2c 20 72 63 29 3b 0a  _code(ctx, rc);.
1f130 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1f140 33 5f 66 72 65 65 28 7a 52 65 70 6f 72 74 29 3b  3_free(zReport);
1f150 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52  .  }.}.../*.** R
1f160 65 67 69 73 74 65 72 20 74 68 65 20 72 2d 74 72  egister the r-tr
1f170 65 65 20 6d 6f 64 75 6c 65 20 77 69 74 68 20 64  ee module with d
1f180 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64  atabase handle d
1f190 62 2e 20 54 68 69 73 20 63 72 65 61 74 65 73 20  b. This creates 
1f1a0 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74  the.** virtual t
1f1b0 61 62 6c 65 20 6d 6f 64 75 6c 65 20 22 72 74 72  able module "rtr
1f1c0 65 65 22 20 61 6e 64 20 74 68 65 20 64 65 62 75  ee" and the debu
1f1d0 67 67 69 6e 67 2f 61 6e 61 6c 79 73 69 73 20 73  gging/analysis s
1f1e0 63 61 6c 61 72 20 0a 2a 2a 20 66 75 6e 63 74 69  calar .** functi
1f1f0 6f 6e 20 22 72 74 72 65 65 6e 6f 64 65 22 2e 0a  on "rtreenode"..
1f200 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 52 74  */.int sqlite3Rt
1f210 72 65 65 49 6e 69 74 28 73 71 6c 69 74 65 33 20  reeInit(sqlite3 
1f220 2a 64 62 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e  *db){.  const in
1f230 74 20 75 74 66 38 20 3d 20 53 51 4c 49 54 45 5f  t utf8 = SQLITE_
1f240 55 54 46 38 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  UTF8;.  int rc;.
1f250 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
1f260 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
1f270 64 62 2c 20 22 72 74 72 65 65 6e 6f 64 65 22 2c  db, "rtreenode",
1f280 20 32 2c 20 75 74 66 38 2c 20 30 2c 20 72 74 72   2, utf8, 0, rtr
1f290 65 65 6e 6f 64 65 2c 20 30 2c 20 30 29 3b 0a 20  eenode, 0, 0);. 
1f2a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1f2b0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
1f2c0 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
1f2d0 6e 63 74 69 6f 6e 28 64 62 2c 20 22 72 74 72 65  nction(db, "rtre
1f2e0 65 64 65 70 74 68 22 2c 20 31 2c 20 75 74 66 38  edepth", 1, utf8
1f2f0 2c 20 30 2c 72 74 72 65 65 64 65 70 74 68 2c 20  , 0,rtreedepth, 
1f300 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  0, 0);.  }.  if(
1f310 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1f320 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
1f330 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
1f340 6f 6e 28 64 62 2c 20 22 72 74 72 65 65 63 68 65  on(db, "rtreeche
1f350 63 6b 22 2c 20 2d 31 2c 20 75 74 66 38 2c 20 30  ck", -1, utf8, 0
1f360 2c 72 74 72 65 65 63 68 65 63 6b 2c 20 30 2c 30  ,rtreecheck, 0,0
1f370 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
1f380 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69  =SQLITE_OK ){.#i
1f390 66 64 65 66 20 53 51 4c 49 54 45 5f 52 54 52 45  fdef SQLITE_RTRE
1f3a0 45 5f 49 4e 54 5f 4f 4e 4c 59 0a 20 20 20 20 76  E_INT_ONLY.    v
1f3b0 6f 69 64 20 2a 63 20 3d 20 28 76 6f 69 64 20 2a  oid *c = (void *
1f3c0 29 52 54 52 45 45 5f 43 4f 4f 52 44 5f 49 4e 54  )RTREE_COORD_INT
1f3d0 33 32 3b 0a 23 65 6c 73 65 0a 20 20 20 20 76 6f  32;.#else.    vo
1f3e0 69 64 20 2a 63 20 3d 20 28 76 6f 69 64 20 2a 29  id *c = (void *)
1f3f0 52 54 52 45 45 5f 43 4f 4f 52 44 5f 52 45 41 4c  RTREE_COORD_REAL
1f400 33 32 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72  32;.#endif.    r
1f410 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
1f420 74 65 5f 6d 6f 64 75 6c 65 5f 76 32 28 64 62 2c  te_module_v2(db,
1f430 20 22 72 74 72 65 65 22 2c 20 26 72 74 72 65 65   "rtree", &rtree
1f440 4d 6f 64 75 6c 65 2c 20 63 2c 20 30 29 3b 0a 20  Module, c, 0);. 
1f450 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
1f460 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 76 6f  ITE_OK ){.    vo
1f470 69 64 20 2a 63 20 3d 20 28 76 6f 69 64 20 2a 29  id *c = (void *)
1f480 52 54 52 45 45 5f 43 4f 4f 52 44 5f 49 4e 54 33  RTREE_COORD_INT3
1f490 32 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  2;.    rc = sqli
1f4a0 74 65 33 5f 63 72 65 61 74 65 5f 6d 6f 64 75 6c  te3_create_modul
1f4b0 65 5f 76 32 28 64 62 2c 20 22 72 74 72 65 65 5f  e_v2(db, "rtree_
1f4c0 69 33 32 22 2c 20 26 72 74 72 65 65 4d 6f 64 75  i32", &rtreeModu
1f4d0 6c 65 2c 20 63 2c 20 30 29 3b 0a 20 20 7d 0a 0a  le, c, 0);.  }..
1f4e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1f4f0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1f500 6e 65 20 64 65 6c 65 74 65 73 20 74 68 65 20 52  ne deletes the R
1f510 74 72 65 65 47 65 6f 6d 43 61 6c 6c 62 61 63 6b  treeGeomCallback
1f520 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77 61 73   object that was
1f530 20 61 74 74 61 63 68 65 64 0a 2a 2a 20 6f 6e 65   attached.** one
1f540 20 6f 66 20 74 68 65 20 53 51 4c 20 66 75 6e 63   of the SQL func
1f550 74 69 6f 6e 73 20 63 72 65 61 74 65 20 62 79 20  tions create by 
1f560 73 71 6c 69 74 65 33 5f 72 74 72 65 65 5f 67 65  sqlite3_rtree_ge
1f570 6f 6d 65 74 72 79 5f 63 61 6c 6c 62 61 63 6b 28  ometry_callback(
1f580 29 0a 2a 2a 20 6f 72 20 73 71 6c 69 74 65 33 5f  ).** or sqlite3_
1f590 72 74 72 65 65 5f 71 75 65 72 79 5f 63 61 6c 6c  rtree_query_call
1f5a0 62 61 63 6b 28 29 2e 20 20 49 6e 20 6f 74 68 65  back().  In othe
1f5b0 72 20 77 6f 72 64 73 2c 20 74 68 69 73 20 72 6f  r words, this ro
1f5c0 75 74 69 6e 65 20 69 73 20 74 68 65 0a 2a 2a 20  utine is the.** 
1f5d0 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 61  destructor for a
1f5e0 6e 20 52 74 72 65 65 47 65 6f 6d 43 61 6c 6c 62  n RtreeGeomCallb
1f5f0 61 63 6b 20 6f 62 6a 65 63 63 74 2e 20 20 54 68  ack objecct.  Th
1f600 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
1f610 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 74 68 65  lled when.** the
1f620 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 53   corresponding S
1f630 51 4c 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 64  QL function is d
1f640 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  eleted..*/.stati
1f650 63 20 76 6f 69 64 20 72 74 72 65 65 46 72 65 65  c void rtreeFree
1f660 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70  Callback(void *p
1f670 29 7b 0a 20 20 52 74 72 65 65 47 65 6f 6d 43 61  ){.  RtreeGeomCa
1f680 6c 6c 62 61 63 6b 20 2a 70 49 6e 66 6f 20 3d 20  llback *pInfo = 
1f690 28 52 74 72 65 65 47 65 6f 6d 43 61 6c 6c 62 61  (RtreeGeomCallba
1f6a0 63 6b 2a 29 70 3b 0a 20 20 69 66 28 20 70 49 6e  ck*)p;.  if( pIn
1f6b0 66 6f 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20  fo->xDestructor 
1f6c0 29 20 70 49 6e 66 6f 2d 3e 78 44 65 73 74 72 75  ) pInfo->xDestru
1f6d0 63 74 6f 72 28 70 49 6e 66 6f 2d 3e 70 43 6f 6e  ctor(pInfo->pCon
1f6e0 74 65 78 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  text);.  sqlite3
1f6f0 5f 66 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  _free(p);.}../*.
1f700 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1f710 66 72 65 65 73 20 74 68 65 20 42 4c 4f 42 20 74  frees the BLOB t
1f720 68 61 74 20 69 73 20 72 65 74 75 72 6e 65 64 20  hat is returned 
1f730 62 79 20 67 65 6f 6d 43 61 6c 6c 62 61 63 6b 28  by geomCallback(
1f740 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
1f750 64 20 72 74 72 65 65 4d 61 74 63 68 41 72 67 46  d rtreeMatchArgF
1f760 72 65 65 28 76 6f 69 64 20 2a 70 41 72 67 29 7b  ree(void *pArg){
1f770 0a 20 20 69 6e 74 20 69 3b 0a 20 20 52 74 72 65  .  int i;.  Rtre
1f780 65 4d 61 74 63 68 41 72 67 20 2a 70 20 3d 20 28  eMatchArg *p = (
1f790 52 74 72 65 65 4d 61 74 63 68 41 72 67 2a 29 70  RtreeMatchArg*)p
1f7a0 41 72 67 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  Arg;.  for(i=0; 
1f7b0 69 3c 70 2d 3e 6e 50 61 72 61 6d 3b 20 69 2b 2b  i<p->nParam; i++
1f7c0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  ){.    sqlite3_v
1f7d0 61 6c 75 65 5f 66 72 65 65 28 70 2d 3e 61 70 53  alue_free(p->apS
1f7e0 71 6c 50 61 72 61 6d 5b 69 5d 29 3b 0a 20 20 7d  qlParam[i]);.  }
1f7f0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1f800 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 61 63  p);.}../*.** Eac
1f810 68 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  h call to sqlite
1f820 33 5f 72 74 72 65 65 5f 67 65 6f 6d 65 74 72 79  3_rtree_geometry
1f830 5f 63 61 6c 6c 62 61 63 6b 28 29 20 6f 72 0a 2a  _callback() or.*
1f840 2a 20 73 71 6c 69 74 65 33 5f 72 74 72 65 65 5f  * sqlite3_rtree_
1f850 71 75 65 72 79 5f 63 61 6c 6c 62 61 63 6b 28 29  query_callback()
1f860 20 63 72 65 61 74 65 73 20 61 6e 20 6f 72 64 69   creates an ordi
1f870 6e 61 72 79 20 53 51 4c 69 74 65 0a 2a 2a 20 73  nary SQLite.** s
1f880 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 74  calar function t
1f890 68 61 74 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  hat is implement
1f8a0 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  ed by this routi
1f8b0 6e 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 74 68  ne..**.** All th
1f8c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  is function does
1f8d0 20 69 73 20 63 6f 6e 73 74 72 75 63 74 20 61 6e   is construct an
1f8e0 20 52 74 72 65 65 4d 61 74 63 68 41 72 67 20 6f   RtreeMatchArg o
1f8f0 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20 63 6f  bject that.** co
1f900 6e 74 61 69 6e 73 20 74 68 65 20 67 65 6f 6d 65  ntains the geome
1f910 74 72 79 2d 63 68 65 63 6b 69 6e 67 20 63 61 6c  try-checking cal
1f920 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 73 20 61  lback routines a
1f930 6e 64 20 61 20 6c 69 73 74 20 6f 66 0a 2a 2a 20  nd a list of.** 
1f940 70 61 72 61 6d 65 74 65 72 73 20 74 6f 20 74 68  parameters to th
1f950 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65  is function, the
1f960 6e 20 72 65 74 75 72 6e 20 74 68 61 74 20 52 74  n return that Rt
1f970 72 65 65 4d 61 74 63 68 41 72 67 20 6f 62 6a 65  reeMatchArg obje
1f980 63 74 0a 2a 2a 20 61 73 20 61 20 42 4c 4f 42 2e  ct.** as a BLOB.
1f990 0a 2a 2a 0a 2a 2a 20 54 68 65 20 52 2d 54 72 65  .**.** The R-Tre
1f9a0 65 20 4d 41 54 43 48 20 6f 70 65 72 61 74 6f 72  e MATCH operator
1f9b0 20 77 69 6c 6c 20 72 65 61 64 20 74 68 65 20 72   will read the r
1f9c0 65 74 75 72 6e 65 64 20 42 4c 4f 42 2c 20 64 65  eturned BLOB, de
1f9d0 73 65 72 69 61 6c 69 7a 65 0a 2a 2a 20 74 68 65  serialize.** the
1f9e0 20 52 74 72 65 65 4d 61 74 63 68 41 72 67 20 6f   RtreeMatchArg o
1f9f0 62 6a 65 63 74 2c 20 61 6e 64 20 75 73 65 20 74  bject, and use t
1fa00 68 65 20 52 74 72 65 65 4d 61 74 63 68 41 72 67  he RtreeMatchArg
1fa10 20 6f 62 6a 65 63 74 20 74 6f 20 66 69 67 75 72   object to figur
1fa20 65 0a 2a 2a 20 6f 75 74 20 77 68 69 63 68 20 65  e.** out which e
1fa30 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 52  lements of the R
1fa40 2d 54 72 65 65 20 73 68 6f 75 6c 64 20 62 65 20  -Tree should be 
1fa50 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
1fa60 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  query..*/.static
1fa70 20 76 6f 69 64 20 67 65 6f 6d 43 61 6c 6c 62 61   void geomCallba
1fa80 63 6b 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  ck(sqlite3_conte
1fa90 78 74 20 2a 63 74 78 2c 20 69 6e 74 20 6e 41 72  xt *ctx, int nAr
1faa0 67 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  g, sqlite3_value
1fab0 20 2a 2a 61 41 72 67 29 7b 0a 20 20 52 74 72 65   **aArg){.  Rtre
1fac0 65 47 65 6f 6d 43 61 6c 6c 62 61 63 6b 20 2a 70  eGeomCallback *p
1fad0 47 65 6f 6d 43 74 78 20 3d 20 28 52 74 72 65 65  GeomCtx = (Rtree
1fae0 47 65 6f 6d 43 61 6c 6c 62 61 63 6b 20 2a 29 73  GeomCallback *)s
1faf0 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
1fb00 28 63 74 78 29 3b 0a 20 20 52 74 72 65 65 4d 61  (ctx);.  RtreeMa
1fb10 74 63 68 41 72 67 20 2a 70 42 6c 6f 62 3b 0a 20  tchArg *pBlob;. 
1fb20 20 69 6e 74 20 6e 42 6c 6f 62 3b 0a 20 20 69 6e   int nBlob;.  in
1fb30 74 20 6d 65 6d 45 72 72 20 3d 20 30 3b 0a 0a 20  t memErr = 0;.. 
1fb40 20 6e 42 6c 6f 62 20 3d 20 73 69 7a 65 6f 66 28   nBlob = sizeof(
1fb50 52 74 72 65 65 4d 61 74 63 68 41 72 67 29 20 2b  RtreeMatchArg) +
1fb60 20 28 6e 41 72 67 2d 31 29 2a 73 69 7a 65 6f 66   (nArg-1)*sizeof
1fb70 28 52 74 72 65 65 44 56 61 6c 75 65 29 0a 20 20  (RtreeDValue).  
1fb80 20 20 20 20 20 20 20 20 20 2b 20 6e 41 72 67 2a           + nArg*
1fb90 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 76  sizeof(sqlite3_v
1fba0 61 6c 75 65 2a 29 3b 0a 20 20 70 42 6c 6f 62 20  alue*);.  pBlob 
1fbb0 3d 20 28 52 74 72 65 65 4d 61 74 63 68 41 72 67  = (RtreeMatchArg
1fbc0 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
1fbd0 63 28 6e 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20  c(nBlob);.  if( 
1fbe0 21 70 42 6c 6f 62 20 29 7b 0a 20 20 20 20 73 71  !pBlob ){.    sq
1fbf0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
1fc00 6f 72 5f 6e 6f 6d 65 6d 28 63 74 78 29 3b 0a 20  or_nomem(ctx);. 
1fc10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
1fc20 69 3b 0a 20 20 20 20 70 42 6c 6f 62 2d 3e 69 53  i;.    pBlob->iS
1fc30 69 7a 65 20 3d 20 6e 42 6c 6f 62 3b 0a 20 20 20  ize = nBlob;.   
1fc40 20 70 42 6c 6f 62 2d 3e 63 62 20 3d 20 70 47 65   pBlob->cb = pGe
1fc50 6f 6d 43 74 78 5b 30 5d 3b 0a 20 20 20 20 70 42  omCtx[0];.    pB
1fc60 6c 6f 62 2d 3e 61 70 53 71 6c 50 61 72 61 6d 20  lob->apSqlParam 
1fc70 3d 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  = (sqlite3_value
1fc80 2a 2a 29 26 70 42 6c 6f 62 2d 3e 61 50 61 72 61  **)&pBlob->aPara
1fc90 6d 5b 6e 41 72 67 5d 3b 0a 20 20 20 20 70 42 6c  m[nArg];.    pBl
1fca0 6f 62 2d 3e 6e 50 61 72 61 6d 20 3d 20 6e 41 72  ob->nParam = nAr
1fcb0 67 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  g;.    for(i=0; 
1fcc0 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
1fcd0 20 20 20 20 70 42 6c 6f 62 2d 3e 61 70 53 71 6c      pBlob->apSql
1fce0 50 61 72 61 6d 5b 69 5d 20 3d 20 73 71 6c 69 74  Param[i] = sqlit
1fcf0 65 33 5f 76 61 6c 75 65 5f 64 75 70 28 61 41 72  e3_value_dup(aAr
1fd00 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  g[i]);.      if(
1fd10 20 70 42 6c 6f 62 2d 3e 61 70 53 71 6c 50 61 72   pBlob->apSqlPar
1fd20 61 6d 5b 69 5d 3d 3d 30 20 29 20 6d 65 6d 45 72  am[i]==0 ) memEr
1fd30 72 20 3d 20 31 3b 0a 23 69 66 64 65 66 20 53 51  r = 1;.#ifdef SQ
1fd40 4c 49 54 45 5f 52 54 52 45 45 5f 49 4e 54 5f 4f  LITE_RTREE_INT_O
1fd50 4e 4c 59 0a 20 20 20 20 20 20 70 42 6c 6f 62 2d  NLY.      pBlob-
1fd60 3e 61 50 61 72 61 6d 5b 69 5d 20 3d 20 73 71 6c  >aParam[i] = sql
1fd70 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34  ite3_value_int64
1fd80 28 61 41 72 67 5b 69 5d 29 3b 0a 23 65 6c 73 65  (aArg[i]);.#else
1fd90 0a 20 20 20 20 20 20 70 42 6c 6f 62 2d 3e 61 50  .      pBlob->aP
1fda0 61 72 61 6d 5b 69 5d 20 3d 20 73 71 6c 69 74 65  aram[i] = sqlite
1fdb0 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61  3_value_double(a
1fdc0 41 72 67 5b 69 5d 29 3b 0a 23 65 6e 64 69 66 0a  Arg[i]);.#endif.
1fdd0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 65      }.    if( me
1fde0 6d 45 72 72 20 29 7b 0a 20 20 20 20 20 20 73 71  mErr ){.      sq
1fdf0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
1fe00 6f 72 5f 6e 6f 6d 65 6d 28 63 74 78 29 3b 0a 20  or_nomem(ctx);. 
1fe10 20 20 20 20 20 72 74 72 65 65 4d 61 74 63 68 41       rtreeMatchA
1fe20 72 67 46 72 65 65 28 70 42 6c 6f 62 29 3b 0a 20  rgFree(pBlob);. 
1fe30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1fe40 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 70  sqlite3_result_p
1fe50 6f 69 6e 74 65 72 28 63 74 78 2c 20 70 42 6c 6f  ointer(ctx, pBlo
1fe60 62 2c 20 22 52 74 72 65 65 4d 61 74 63 68 41 72  b, "RtreeMatchAr
1fe70 67 22 2c 20 72 74 72 65 65 4d 61 74 63 68 41 72  g", rtreeMatchAr
1fe80 67 46 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20  gFree);.    }.  
1fe90 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  }.}../*.** Regis
1fea0 74 65 72 20 61 20 6e 65 77 20 67 65 6f 6d 65 74  ter a new geomet
1feb0 72 79 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  ry function for 
1fec0 75 73 65 20 77 69 74 68 20 74 68 65 20 72 2d 74  use with the r-t
1fed0 72 65 65 20 4d 41 54 43 48 20 6f 70 65 72 61 74  ree MATCH operat
1fee0 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  or..*/.int sqlit
1fef0 65 33 5f 72 74 72 65 65 5f 67 65 6f 6d 65 74 72  e3_rtree_geometr
1ff00 79 5f 63 61 6c 6c 62 61 63 6b 28 0a 20 20 73 71  y_callback(.  sq
1ff10 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
1ff20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1ff30 65 67 69 73 74 65 72 20 53 51 4c 20 66 75 6e 63  egister SQL func
1ff40 74 69 6f 6e 20 6f 6e 20 74 68 69 73 20 63 6f 6e  tion on this con
1ff50 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e  nection */.  con
1ff60 73 74 20 63 68 61 72 20 2a 7a 47 65 6f 6d 2c 20  st char *zGeom, 
1ff70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
1ff80 6d 65 20 6f 66 20 74 68 65 20 6e 65 77 20 53 51  me of the new SQ
1ff90 4c 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  L function */.  
1ffa0 69 6e 74 20 28 2a 78 47 65 6f 6d 29 28 73 71 6c  int (*xGeom)(sql
1ffb0 69 74 65 33 5f 72 74 72 65 65 5f 67 65 6f 6d 65  ite3_rtree_geome
1ffc0 74 72 79 2a 2c 69 6e 74 2c 52 74 72 65 65 44 56  try*,int,RtreeDV
1ffd0 61 6c 75 65 2a 2c 69 6e 74 2a 29 2c 20 2f 2a 20  alue*,int*), /* 
1ffe0 43 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 76 6f  Callback */.  vo
1fff0 69 64 20 2a 70 43 6f 6e 74 65 78 74 20 20 20 20  id *pContext    
20000 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
20010 78 74 72 61 20 64 61 74 61 20 61 73 73 6f 63 69  xtra data associ
20020 61 74 65 64 20 77 69 74 68 20 74 68 65 20 63 61  ated with the ca
20030 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 52  llback */.){.  R
20040 74 72 65 65 47 65 6f 6d 43 61 6c 6c 62 61 63 6b  treeGeomCallback
20050 20 2a 70 47 65 6f 6d 43 74 78 3b 20 20 20 20 20   *pGeomCtx;     
20060 20 2f 2a 20 43 6f 6e 74 65 78 74 20 6f 62 6a 65   /* Context obje
20070 63 74 20 66 6f 72 20 6e 65 77 20 75 73 65 72 2d  ct for new user-
20080 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f  function */..  /
20090 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 70  * Allocate and p
200a0 6f 70 75 6c 61 74 65 20 74 68 65 20 63 6f 6e 74  opulate the cont
200b0 65 78 74 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20  ext object. */. 
200c0 20 70 47 65 6f 6d 43 74 78 20 3d 20 28 52 74 72   pGeomCtx = (Rtr
200d0 65 65 47 65 6f 6d 43 61 6c 6c 62 61 63 6b 20 2a  eeGeomCallback *
200e0 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
200f0 73 69 7a 65 6f 66 28 52 74 72 65 65 47 65 6f 6d  sizeof(RtreeGeom
20100 43 61 6c 6c 62 61 63 6b 29 29 3b 0a 20 20 69 66  Callback));.  if
20110 28 20 21 70 47 65 6f 6d 43 74 78 20 29 20 72 65  ( !pGeomCtx ) re
20120 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
20130 4d 3b 0a 20 20 70 47 65 6f 6d 43 74 78 2d 3e 78  M;.  pGeomCtx->x
20140 47 65 6f 6d 20 3d 20 78 47 65 6f 6d 3b 0a 20 20  Geom = xGeom;.  
20150 70 47 65 6f 6d 43 74 78 2d 3e 78 51 75 65 72 79  pGeomCtx->xQuery
20160 46 75 6e 63 20 3d 20 30 3b 0a 20 20 70 47 65 6f  Func = 0;.  pGeo
20170 6d 43 74 78 2d 3e 78 44 65 73 74 72 75 63 74 6f  mCtx->xDestructo
20180 72 20 3d 20 30 3b 0a 20 20 70 47 65 6f 6d 43 74  r = 0;.  pGeomCt
20190 78 2d 3e 70 43 6f 6e 74 65 78 74 20 3d 20 70 43  x->pContext = pC
201a0 6f 6e 74 65 78 74 3b 0a 20 20 72 65 74 75 72 6e  ontext;.  return
201b0 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
201c0 66 75 6e 63 74 69 6f 6e 5f 76 32 28 64 62 2c 20  function_v2(db, 
201d0 7a 47 65 6f 6d 2c 20 2d 31 2c 20 53 51 4c 49 54  zGeom, -1, SQLIT
201e0 45 5f 41 4e 59 2c 20 0a 20 20 20 20 20 20 28 76  E_ANY, .      (v
201f0 6f 69 64 20 2a 29 70 47 65 6f 6d 43 74 78 2c 20  oid *)pGeomCtx, 
20200 67 65 6f 6d 43 61 6c 6c 62 61 63 6b 2c 20 30 2c  geomCallback, 0,
20210 20 30 2c 20 72 74 72 65 65 46 72 65 65 43 61 6c   0, rtreeFreeCal
20220 6c 62 61 63 6b 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a  lback.  );.}../*
20230 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e  .** Register a n
20240 65 77 20 32 6e 64 2d 67 65 6e 65 72 61 74 69 6f  ew 2nd-generatio
20250 6e 20 67 65 6f 6d 65 74 72 79 20 66 75 6e 63 74  n geometry funct
20260 69 6f 6e 20 66 6f 72 20 75 73 65 20 77 69 74 68  ion for use with
20270 20 74 68 65 0a 2a 2a 20 72 2d 74 72 65 65 20 4d   the.** r-tree M
20280 41 54 43 48 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  ATCH operator..*
20290 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 72 74  /.int sqlite3_rt
202a0 72 65 65 5f 71 75 65 72 79 5f 63 61 6c 6c 62 61  ree_query_callba
202b0 63 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ck(.  sqlite3 *d
202c0 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
202d0 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 53     /* Register S
202e0 51 4c 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 20 74  QL function on t
202f0 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  his connection *
20300 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
20310 7a 51 75 65 72 79 46 75 6e 63 2c 20 20 20 20 20  zQueryFunc,     
20320 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6e 65 77 20   /* Name of new 
20330 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  SQL function */.
20340 20 20 69 6e 74 20 28 2a 78 51 75 65 72 79 46 75    int (*xQueryFu
20350 6e 63 29 28 73 71 6c 69 74 65 33 5f 72 74 72 65  nc)(sqlite3_rtre
20360 65 5f 71 75 65 72 79 5f 69 6e 66 6f 2a 29 2c 20  e_query_info*), 
20370 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20  /* Callback */. 
20380 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74 2c   void *pContext,
20390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
203a0 20 45 78 74 72 61 20 64 61 74 61 20 70 61 73 73   Extra data pass
203b0 65 64 20 69 6e 74 6f 20 74 68 65 20 63 61 6c 6c  ed into the call
203c0 62 61 63 6b 20 2a 2f 0a 20 20 76 6f 69 64 20 28  back */.  void (
203d0 2a 78 44 65 73 74 72 75 63 74 6f 72 29 28 76 6f  *xDestructor)(vo
203e0 69 64 2a 29 20 20 20 2f 2a 20 44 65 73 74 72 75  id*)   /* Destru
203f0 63 74 6f 72 20 66 6f 72 20 74 68 65 20 65 78 74  ctor for the ext
20400 72 61 20 64 61 74 61 20 2a 2f 0a 29 7b 0a 20 20  ra data */.){.  
20410 52 74 72 65 65 47 65 6f 6d 43 61 6c 6c 62 61 63  RtreeGeomCallbac
20420 6b 20 2a 70 47 65 6f 6d 43 74 78 3b 20 20 20 20  k *pGeomCtx;    
20430 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 6f 62 6a    /* Context obj
20440 65 63 74 20 66 6f 72 20 6e 65 77 20 75 73 65 72  ect for new user
20450 2d 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20  -function */..  
20460 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  /* Allocate and 
20470 70 6f 70 75 6c 61 74 65 20 74 68 65 20 63 6f 6e  populate the con
20480 74 65 78 74 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a  text object. */.
20490 20 20 70 47 65 6f 6d 43 74 78 20 3d 20 28 52 74    pGeomCtx = (Rt
204a0 72 65 65 47 65 6f 6d 43 61 6c 6c 62 61 63 6b 20  reeGeomCallback 
204b0 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
204c0 28 73 69 7a 65 6f 66 28 52 74 72 65 65 47 65 6f  (sizeof(RtreeGeo
204d0 6d 43 61 6c 6c 62 61 63 6b 29 29 3b 0a 20 20 69  mCallback));.  i
204e0 66 28 20 21 70 47 65 6f 6d 43 74 78 20 29 20 72  f( !pGeomCtx ) r
204f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
20500 45 4d 3b 0a 20 20 70 47 65 6f 6d 43 74 78 2d 3e  EM;.  pGeomCtx->
20510 78 47 65 6f 6d 20 3d 20 30 3b 0a 20 20 70 47 65  xGeom = 0;.  pGe
20520 6f 6d 43 74 78 2d 3e 78 51 75 65 72 79 46 75 6e  omCtx->xQueryFun
20530 63 20 3d 20 78 51 75 65 72 79 46 75 6e 63 3b 0a  c = xQueryFunc;.
20540 20 20 70 47 65 6f 6d 43 74 78 2d 3e 78 44 65 73    pGeomCtx->xDes
20550 74 72 75 63 74 6f 72 20 3d 20 78 44 65 73 74 72  tructor = xDestr
20560 75 63 74 6f 72 3b 0a 20 20 70 47 65 6f 6d 43 74  uctor;.  pGeomCt
20570 78 2d 3e 70 43 6f 6e 74 65 78 74 20 3d 20 70 43  x->pContext = pC
20580 6f 6e 74 65 78 74 3b 0a 20 20 72 65 74 75 72 6e  ontext;.  return
20590 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
205a0 66 75 6e 63 74 69 6f 6e 5f 76 32 28 64 62 2c 20  function_v2(db, 
205b0 7a 51 75 65 72 79 46 75 6e 63 2c 20 2d 31 2c 20  zQueryFunc, -1, 
205c0 53 51 4c 49 54 45 5f 41 4e 59 2c 20 0a 20 20 20  SQLITE_ANY, .   
205d0 20 20 20 28 76 6f 69 64 20 2a 29 70 47 65 6f 6d     (void *)pGeom
205e0 43 74 78 2c 20 67 65 6f 6d 43 61 6c 6c 62 61 63  Ctx, geomCallbac
205f0 6b 2c 20 30 2c 20 30 2c 20 72 74 72 65 65 46 72  k, 0, 0, rtreeFr
20600 65 65 43 61 6c 6c 62 61 63 6b 0a 20 20 29 3b 0a  eeCallback.  );.
20610 7d 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 43  }..#if !SQLITE_C
20620 4f 52 45 0a 23 69 66 64 65 66 20 5f 57 49 4e 33  ORE.#ifdef _WIN3
20630 32 0a 5f 5f 64 65 63 6c 73 70 65 63 28 64 6c 6c  2.__declspec(dll
20640 65 78 70 6f 72 74 29 0a 23 65 6e 64 69 66 0a 69  export).#endif.i
20650 6e 74 20 73 71 6c 69 74 65 33 5f 72 74 72 65 65  nt sqlite3_rtree
20660 5f 69 6e 69 74 28 0a 20 20 73 71 6c 69 74 65 33  _init(.  sqlite3
20670 20 2a 64 62 2c 0a 20 20 63 68 61 72 20 2a 2a 70   *db,.  char **p
20680 7a 45 72 72 4d 73 67 2c 0a 20 20 63 6f 6e 73 74  zErrMsg,.  const
20690 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75   sqlite3_api_rou
206a0 74 69 6e 65 73 20 2a 70 41 70 69 0a 29 7b 0a 20  tines *pApi.){. 
206b0 20 53 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f   SQLITE_EXTENSIO
206c0 4e 5f 49 4e 49 54 32 28 70 41 70 69 29 0a 20 20  N_INIT2(pApi).  
206d0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 52 74  return sqlite3Rt
206e0 72 65 65 49 6e 69 74 28 64 62 29 3b 0a 7d 0a 23  reeInit(db);.}.#
206f0 65 6e 64 69 66 0a 0a 23 65 6e 64 69 66 0a        endif..#endif.