/ Hex Artifact Content
Login

Artifact a4e18b2c150adad20aecbeb3408cd235a0a57441:


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 2f 2a 0a 2a 2a 20 54 68  RTREE)../*.** Th
0930: 69 73 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73  is file contains
0940: 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69   an implementati
0950: 6f 6e 20 6f 66 20 61 20 63 6f 75 70 6c 65 20 6f  on of a couple o
0960: 66 20 64 69 66 66 65 72 65 6e 74 20 76 61 72 69  f different vari
0970: 61 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 72  ants.** of the r
0980: 2d 74 72 65 65 20 61 6c 67 6f 72 69 74 68 6d 2e  -tree algorithm.
0990: 20 53 65 65 20 74 68 65 20 52 45 41 44 4d 45 20   See the README 
09a0: 66 69 6c 65 20 66 6f 72 20 66 75 72 74 68 65 72  file for further
09b0: 20 64 65 74 61 69 6c 73 2e 20 54 68 65 20 0a 2a   details. The .*
09c0: 2a 20 73 61 6d 65 20 64 61 74 61 2d 73 74 72 75  * same data-stru
09d0: 63 74 75 72 65 20 69 73 20 75 73 65 64 20 66 6f  cture is used fo
09e0: 72 20 61 6c 6c 2c 20 62 75 74 20 74 68 65 20 61  r all, but the a
09f0: 6c 67 6f 72 69 74 68 6d 73 20 66 6f 72 20 69 6e  lgorithms for in
0a00: 73 65 72 74 20 61 6e 64 0a 2a 2a 20 64 65 6c 65  sert and.** dele
0a10: 74 65 20 6f 70 65 72 61 74 69 6f 6e 73 20 76 61  te operations va
0a20: 72 79 2e 20 54 68 65 20 76 61 72 69 61 6e 74 73  ry. The variants
0a30: 20 75 73 65 64 20 61 72 65 20 73 65 6c 65 63 74   used are select
0a40: 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69  ed at compile ti
0a50: 6d 65 20 0a 2a 2a 20 62 79 20 64 65 66 69 6e 69  me .** by defini
0a60: 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
0a70: 20 73 79 6d 62 6f 6c 73 3a 0a 2a 2f 0a 0a 2f 2a   symbols:.*/../*
0a80: 20 45 69 74 68 65 72 2c 20 62 6f 74 68 20 6f 72   Either, both or
0a90: 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c   none of the fol
0aa0: 6c 6f 77 69 6e 67 20 6d 61 79 20 62 65 20 73 65  lowing may be se
0ab0: 74 20 74 6f 20 61 63 74 69 76 61 74 65 20 0a 2a  t to activate .*
0ac0: 2a 20 72 2a 74 72 65 65 20 76 61 72 69 61 6e 74  * r*tree variant
0ad0: 20 61 6c 67 6f 72 69 74 68 6d 73 2e 0a 2a 2f 0a   algorithms..*/.
0ae0: 23 64 65 66 69 6e 65 20 56 41 52 49 41 4e 54 5f  #define VARIANT_
0af0: 52 53 54 41 52 54 52 45 45 5f 43 48 4f 4f 53 45  RSTARTREE_CHOOSE
0b00: 53 55 42 54 52 45 45 20 30 0a 23 64 65 66 69 6e  SUBTREE 0.#defin
0b10: 65 20 56 41 52 49 41 4e 54 5f 52 53 54 41 52 54  e VARIANT_RSTART
0b20: 52 45 45 5f 52 45 49 4e 53 45 52 54 20 20 20 20  REE_REINSERT    
0b30: 20 20 31 0a 0a 2f 2a 20 0a 2a 2a 20 45 78 61 63    1../* .** Exac
0b40: 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 66  tly one of the f
0b50: 6f 6c 6c 6f 77 69 6e 67 20 6d 75 73 74 20 62 65  ollowing must be
0b60: 20 73 65 74 20 74 6f 20 31 2e 0a 2a 2f 0a 23 64   set to 1..*/.#d
0b70: 65 66 69 6e 65 20 56 41 52 49 41 4e 54 5f 47 55  efine VARIANT_GU
0b80: 54 54 4d 41 4e 5f 51 55 41 44 52 41 54 49 43 5f  TTMAN_QUADRATIC_
0b90: 53 50 4c 49 54 20 30 0a 23 64 65 66 69 6e 65 20  SPLIT 0.#define 
0ba0: 56 41 52 49 41 4e 54 5f 47 55 54 54 4d 41 4e 5f  VARIANT_GUTTMAN_
0bb0: 4c 49 4e 45 41 52 5f 53 50 4c 49 54 20 20 20 20  LINEAR_SPLIT    
0bc0: 30 0a 23 64 65 66 69 6e 65 20 56 41 52 49 41 4e  0.#define VARIAN
0bd0: 54 5f 52 53 54 41 52 54 52 45 45 5f 53 50 4c 49  T_RSTARTREE_SPLI
0be0: 54 20 20 20 20 20 20 20 20 20 31 0a 0a 23 64 65  T         1..#de
0bf0: 66 69 6e 65 20 56 41 52 49 41 4e 54 5f 47 55 54  fine VARIANT_GUT
0c00: 54 4d 41 4e 5f 53 50 4c 49 54 20 5c 0a 20 20 20  TMAN_SPLIT \.   
0c10: 20 20 20 20 20 28 56 41 52 49 41 4e 54 5f 47 55       (VARIANT_GU
0c20: 54 54 4d 41 4e 5f 4c 49 4e 45 41 52 5f 53 50 4c  TTMAN_LINEAR_SPL
0c30: 49 54 7c 7c 56 41 52 49 41 4e 54 5f 47 55 54 54  IT||VARIANT_GUTT
0c40: 4d 41 4e 5f 51 55 41 44 52 41 54 49 43 5f 53 50  MAN_QUADRATIC_SP
0c50: 4c 49 54 29 0a 0a 23 69 66 20 56 41 52 49 41 4e  LIT)..#if VARIAN
0c60: 54 5f 47 55 54 54 4d 41 4e 5f 51 55 41 44 52 41  T_GUTTMAN_QUADRA
0c70: 54 49 43 5f 53 50 4c 49 54 0a 20 20 23 64 65 66  TIC_SPLIT.  #def
0c80: 69 6e 65 20 50 69 63 6b 4e 65 78 74 20 51 75 61  ine PickNext Qua
0c90: 64 72 61 74 69 63 50 69 63 6b 4e 65 78 74 0a 20  draticPickNext. 
0ca0: 20 23 64 65 66 69 6e 65 20 50 69 63 6b 53 65 65   #define PickSee
0cb0: 64 73 20 51 75 61 64 72 61 74 69 63 50 69 63 6b  ds QuadraticPick
0cc0: 53 65 65 64 73 0a 20 20 23 64 65 66 69 6e 65 20  Seeds.  #define 
0cd0: 41 73 73 69 67 6e 43 65 6c 6c 73 20 73 70 6c 69  AssignCells spli
0ce0: 74 4e 6f 64 65 47 75 74 74 6d 61 6e 0a 23 65 6e  tNodeGuttman.#en
0cf0: 64 69 66 0a 23 69 66 20 56 41 52 49 41 4e 54 5f  dif.#if VARIANT_
0d00: 47 55 54 54 4d 41 4e 5f 4c 49 4e 45 41 52 5f 53  GUTTMAN_LINEAR_S
0d10: 50 4c 49 54 0a 20 20 23 64 65 66 69 6e 65 20 50  PLIT.  #define P
0d20: 69 63 6b 4e 65 78 74 20 4c 69 6e 65 61 72 50 69  ickNext LinearPi
0d30: 63 6b 4e 65 78 74 0a 20 20 23 64 65 66 69 6e 65  ckNext.  #define
0d40: 20 50 69 63 6b 53 65 65 64 73 20 4c 69 6e 65 61   PickSeeds Linea
0d50: 72 50 69 63 6b 53 65 65 64 73 0a 20 20 23 64 65  rPickSeeds.  #de
0d60: 66 69 6e 65 20 41 73 73 69 67 6e 43 65 6c 6c 73  fine AssignCells
0d70: 20 73 70 6c 69 74 4e 6f 64 65 47 75 74 74 6d 61   splitNodeGuttma
0d80: 6e 0a 23 65 6e 64 69 66 0a 23 69 66 20 56 41 52  n.#endif.#if VAR
0d90: 49 41 4e 54 5f 52 53 54 41 52 54 52 45 45 5f 53  IANT_RSTARTREE_S
0da0: 50 4c 49 54 0a 20 20 23 64 65 66 69 6e 65 20 41  PLIT.  #define A
0db0: 73 73 69 67 6e 43 65 6c 6c 73 20 73 70 6c 69 74  ssignCells split
0dc0: 4e 6f 64 65 53 74 61 72 74 72 65 65 0a 23 65 6e  NodeStartree.#en
0dd0: 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
0de0: 64 28 4e 44 45 42 55 47 29 20 26 26 20 21 64 65  d(NDEBUG) && !de
0df0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
0e00: 55 47 29 20 0a 23 20 64 65 66 69 6e 65 20 4e 44  UG) .# define ND
0e10: 45 42 55 47 20 31 0a 23 65 6e 64 69 66 0a 0a 23  EBUG 1.#endif..#
0e20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 43 4f  ifndef SQLITE_CO
0e30: 52 45 0a 20 20 23 69 6e 63 6c 75 64 65 20 22 73  RE.  #include "s
0e40: 71 6c 69 74 65 33 65 78 74 2e 68 22 0a 20 20 53  qlite3ext.h".  S
0e50: 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f  QLITE_EXTENSION_
0e60: 49 4e 49 54 31 0a 23 65 6c 73 65 0a 20 20 23 69  INIT1.#else.  #i
0e70: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33 2e  nclude "sqlite3.
0e80: 68 22 0a 23 65 6e 64 69 66 0a 0a 23 69 6e 63 6c  h".#endif..#incl
0e90: 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23  ude <string.h>.#
0ea0: 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e  include <assert.
0eb0: 68 3e 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  h>..#ifndef SQLI
0ec0: 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 0a  TE_AMALGAMATION.
0ed0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0ee0: 33 72 74 72 65 65 2e 68 22 0a 74 79 70 65 64 65  3rtree.h".typede
0ef0: 66 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  f sqlite3_int64 
0f00: 69 36 34 3b 0a 74 79 70 65 64 65 66 20 75 6e 73  i64;.typedef uns
0f10: 69 67 6e 65 64 20 63 68 61 72 20 75 38 3b 0a 74  igned char u8;.t
0f20: 79 70 65 64 65 66 20 75 6e 73 69 67 6e 65 64 20  ypedef unsigned 
0f30: 69 6e 74 20 75 33 32 3b 0a 23 65 6e 64 69 66 0a  int u32;.#endif.
0f40: 0a 2f 2a 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ./*  The followi
0f50: 6e 67 20 6d 61 63 72 6f 20 69 73 20 75 73 65 64  ng macro is used
0f60: 20 74 6f 20 73 75 70 70 72 65 73 73 20 63 6f 6d   to suppress com
0f70: 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 2e 0a  piler warnings..
0f80: 2a 2f 0a 23 69 66 6e 64 65 66 20 55 4e 55 53 45  */.#ifndef UNUSE
0f90: 44 5f 50 41 52 41 4d 45 54 45 52 0a 23 20 64 65  D_PARAMETER.# de
0fa0: 66 69 6e 65 20 55 4e 55 53 45 44 5f 50 41 52 41  fine UNUSED_PARA
0fb0: 4d 45 54 45 52 28 78 29 20 28 76 6f 69 64 29 28  METER(x) (void)(
0fc0: 78 29 0a 23 65 6e 64 69 66 0a 0a 74 79 70 65 64  x).#endif..typed
0fd0: 65 66 20 73 74 72 75 63 74 20 52 74 72 65 65 20  ef struct Rtree 
0fe0: 52 74 72 65 65 3b 0a 74 79 70 65 64 65 66 20 73  Rtree;.typedef s
0ff0: 74 72 75 63 74 20 52 74 72 65 65 43 75 72 73 6f  truct RtreeCurso
1000: 72 20 52 74 72 65 65 43 75 72 73 6f 72 3b 0a 74  r RtreeCursor;.t
1010: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 52 74  ypedef struct Rt
1020: 72 65 65 4e 6f 64 65 20 52 74 72 65 65 4e 6f 64  reeNode RtreeNod
1030: 65 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  e;.typedef struc
1040: 74 20 52 74 72 65 65 43 65 6c 6c 20 52 74 72 65  t RtreeCell Rtre
1050: 65 43 65 6c 6c 3b 0a 74 79 70 65 64 65 66 20 73  eCell;.typedef s
1060: 74 72 75 63 74 20 52 74 72 65 65 43 6f 6e 73 74  truct RtreeConst
1070: 72 61 69 6e 74 20 52 74 72 65 65 43 6f 6e 73 74  raint RtreeConst
1080: 72 61 69 6e 74 3b 0a 74 79 70 65 64 65 66 20 73  raint;.typedef s
1090: 74 72 75 63 74 20 52 74 72 65 65 4d 61 74 63 68  truct RtreeMatch
10a0: 41 72 67 20 52 74 72 65 65 4d 61 74 63 68 41 72  Arg RtreeMatchAr
10b0: 67 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  g;.typedef struc
10c0: 74 20 52 74 72 65 65 47 65 6f 6d 43 61 6c 6c 62  t RtreeGeomCallb
10d0: 61 63 6b 20 52 74 72 65 65 47 65 6f 6d 43 61 6c  ack RtreeGeomCal
10e0: 6c 62 61 63 6b 3b 0a 74 79 70 65 64 65 66 20 75  lback;.typedef u
10f0: 6e 69 6f 6e 20 52 74 72 65 65 43 6f 6f 72 64 20  nion RtreeCoord 
1100: 52 74 72 65 65 43 6f 6f 72 64 3b 0a 0a 2f 2a 20  RtreeCoord;../* 
1110: 54 68 65 20 72 74 72 65 65 20 6d 61 79 20 68 61  The rtree may ha
1120: 76 65 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64  ve between 1 and
1130: 20 52 54 52 45 45 5f 4d 41 58 5f 44 49 4d 45 4e   RTREE_MAX_DIMEN
1140: 53 49 4f 4e 53 20 64 69 6d 65 6e 73 69 6f 6e 73  SIONS dimensions
1150: 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 52 54 52  . */.#define RTR
1160: 45 45 5f 4d 41 58 5f 44 49 4d 45 4e 53 49 4f 4e  EE_MAX_DIMENSION
1170: 53 20 35 0a 0a 2f 2a 20 53 69 7a 65 20 6f 66 20  S 5../* Size of 
1180: 68 61 73 68 20 74 61 62 6c 65 20 52 74 72 65 65  hash table Rtree
1190: 2e 61 48 61 73 68 2e 20 54 68 69 73 20 68 61 73  .aHash. This has
11a0: 68 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 65  h table is not e
11b0: 78 70 65 63 74 65 64 20 74 6f 0a 2a 2a 20 65 76  xpected to.** ev
11c0: 65 72 20 63 6f 6e 74 61 69 6e 20 76 65 72 79 20  er contain very 
11d0: 6d 61 6e 79 20 65 6e 74 72 69 65 73 2c 20 73 6f  many entries, so
11e0: 20 61 20 66 69 78 65 64 20 6e 75 6d 62 65 72 20   a fixed number 
11f0: 6f 66 20 62 75 63 6b 65 74 73 20 69 73 20 0a 2a  of buckets is .*
1200: 2a 20 75 73 65 64 2e 0a 2a 2f 0a 23 64 65 66 69  * used..*/.#defi
1210: 6e 65 20 48 41 53 48 53 49 5a 45 20 31 32 38 0a  ne HASHSIZE 128.
1220: 0a 2f 2a 20 54 68 65 20 78 42 65 73 74 49 6e 64  ./* The xBestInd
1230: 65 78 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 69  ex method of thi
1240: 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  s virtual table 
1250: 72 65 71 75 69 72 65 73 20 61 6e 20 65 73 74 69  requires an esti
1260: 6d 61 74 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  mate of.** the n
1270: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
1280: 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
1290: 6c 65 20 74 6f 20 63 61 6c 63 75 6c 61 74 65 20  le to calculate 
12a0: 74 68 65 20 63 6f 73 74 73 20 6f 66 0a 2a 2a 20  the costs of.** 
12b0: 76 61 72 69 6f 75 73 20 73 74 72 61 74 65 67 69  various strategi
12c0: 65 73 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c  es. If possible,
12d0: 20 74 68 69 73 20 65 73 74 69 6d 61 74 65 20 69   this estimate i
12e0: 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 74 68  s loaded from th
12f0: 65 0a 2a 2a 20 73 71 6c 69 74 65 5f 73 74 61 74  e.** sqlite_stat
1300: 31 20 74 61 62 6c 65 20 28 77 69 74 68 20 52 54  1 table (with RT
1310: 52 45 45 5f 4d 49 4e 5f 52 4f 57 45 53 54 20 61  REE_MIN_ROWEST a
1320: 73 20 61 20 68 61 72 64 2d 63 6f 64 65 64 20 6d  s a hard-coded m
1330: 69 6e 69 6d 75 6d 29 2e 0a 2a 2a 20 4f 74 68 65  inimum)..** Othe
1340: 72 77 69 73 65 2c 20 69 66 20 6e 6f 20 73 71 6c  rwise, if no sql
1350: 69 74 65 5f 73 74 61 74 31 20 65 6e 74 72 79 20  ite_stat1 entry 
1360: 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 75 73  is available, us
1370: 65 20 0a 2a 2a 20 52 54 52 45 45 5f 44 45 46 41  e .** RTREE_DEFA
1380: 55 4c 54 5f 52 4f 57 45 53 54 2e 0a 2a 2f 0a 23  ULT_ROWEST..*/.#
1390: 64 65 66 69 6e 65 20 52 54 52 45 45 5f 44 45 46  define RTREE_DEF
13a0: 41 55 4c 54 5f 52 4f 57 45 53 54 20 31 30 34 38  AULT_ROWEST 1048
13b0: 35 37 36 0a 23 64 65 66 69 6e 65 20 52 54 52 45  576.#define RTRE
13c0: 45 5f 4d 49 4e 5f 52 4f 57 45 53 54 20 20 20 20  E_MIN_ROWEST    
13d0: 20 20 20 20 20 31 30 30 0a 0a 2f 2a 20 0a 2a 2a       100../* .**
13e0: 20 41 6e 20 72 74 72 65 65 20 76 69 72 74 75 61   An rtree virtua
13f0: 6c 2d 74 61 62 6c 65 20 6f 62 6a 65 63 74 2e 0a  l-table object..
1400: 2a 2f 0a 73 74 72 75 63 74 20 52 74 72 65 65 20  */.struct Rtree 
1410: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  {.  sqlite3_vtab
1420: 20 62 61 73 65 3b 0a 20 20 73 71 6c 69 74 65 33   base;.  sqlite3
1430: 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
1440: 20 20 20 20 20 2f 2a 20 48 6f 73 74 20 64 61 74       /* Host dat
1450: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1460: 20 2a 2f 0a 20 20 69 6e 74 20 69 4e 6f 64 65 53   */.  int iNodeS
1470: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
1480: 20 20 2f 2a 20 53 69 7a 65 20 69 6e 20 62 79 74    /* Size in byt
1490: 65 73 20 6f 66 20 65 61 63 68 20 6e 6f 64 65 20  es of each node 
14a0: 69 6e 20 74 68 65 20 6e 6f 64 65 20 74 61 62 6c  in the node tabl
14b0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 69 6d 3b  e */.  int nDim;
14c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
14e0: 64 69 6d 65 6e 73 69 6f 6e 73 20 2a 2f 0a 20 20  dimensions */.  
14f0: 69 6e 74 20 6e 42 79 74 65 73 50 65 72 43 65 6c  int nBytesPerCel
1500: 6c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  l;          /* B
1510: 79 74 65 73 20 63 6f 6e 73 75 6d 65 64 20 70 65  ytes consumed pe
1520: 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  r cell */.  int 
1530: 69 44 65 70 74 68 3b 20 20 20 20 20 20 20 20 20  iDepth;         
1540: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
1550: 6e 74 20 64 65 70 74 68 20 6f 66 20 74 68 65 20  nt depth of the 
1560: 72 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  r-tree structure
1570: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b   */.  char *zDb;
1580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1590: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 64 61 74    /* Name of dat
15a0: 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
15b0: 20 72 2d 74 72 65 65 20 74 61 62 6c 65 20 2a 2f   r-tree table */
15c0: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20  .  char *zName; 
15d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15e0: 2a 20 4e 61 6d 65 20 6f 66 20 72 2d 74 72 65 65  * Name of r-tree
15f0: 20 74 61 62 6c 65 20 2a 2f 20 0a 20 20 52 74 72   table */ .  Rtr
1600: 65 65 4e 6f 64 65 20 2a 61 48 61 73 68 5b 48 41  eeNode *aHash[HA
1610: 53 48 53 49 5a 45 5d 3b 20 2f 2a 20 48 61 73 68  SHSIZE]; /* Hash
1620: 20 74 61 62 6c 65 20 6f 66 20 69 6e 2d 6d 65 6d   table of in-mem
1630: 6f 72 79 20 6e 6f 64 65 73 2e 20 2a 2f 20 0a 20  ory nodes. */ . 
1640: 20 69 6e 74 20 6e 42 75 73 79 3b 20 20 20 20 20   int nBusy;     
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1660: 43 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f  Current number o
1670: 66 20 75 73 65 72 73 20 6f 66 20 74 68 69 73 20  f users of this 
1680: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69  structure */.  i
1690: 36 34 20 6e 52 6f 77 45 73 74 3b 20 20 20 20 20  64 nRowEst;     
16a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 73             /* Es
16b0: 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f  timated number o
16c0: 66 20 72 6f 77 73 20 69 6e 20 74 68 69 73 20 74  f rows in this t
16d0: 61 62 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4c 69  able */..  /* Li
16e0: 73 74 20 6f 66 20 6e 6f 64 65 73 20 72 65 6d 6f  st of nodes remo
16f0: 76 65 64 20 64 75 72 69 6e 67 20 61 20 43 6f 6e  ved during a Con
1700: 64 65 6e 73 65 54 72 65 65 20 6f 70 65 72 61 74  denseTree operat
1710: 69 6f 6e 2e 20 4c 69 73 74 20 69 73 0a 20 20 2a  ion. List is.  *
1720: 2a 20 6c 69 6e 6b 65 64 20 74 6f 67 65 74 68 65  * linked togethe
1730: 72 20 76 69 61 20 74 68 65 20 70 6f 69 6e 74 65  r via the pointe
1740: 72 20 6e 6f 72 6d 61 6c 6c 79 20 75 73 65 64 20  r normally used 
1750: 66 6f 72 20 68 61 73 68 20 63 68 61 69 6e 73 20  for hash chains 
1760: 2d 0a 20 20 2a 2a 20 52 74 72 65 65 4e 6f 64 65  -.  ** RtreeNode
1770: 2e 70 4e 65 78 74 2e 20 52 74 72 65 65 4e 6f 64  .pNext. RtreeNod
1780: 65 2e 69 4e 6f 64 65 20 73 74 6f 72 65 73 20 74  e.iNode stores t
1790: 68 65 20 64 65 70 74 68 20 6f 66 20 74 68 65 20  he depth of the 
17a0: 73 75 62 2d 74 72 65 65 20 0a 20 20 2a 2a 20 68  sub-tree .  ** h
17b0: 65 61 64 65 64 20 62 79 20 74 68 65 20 6e 6f 64  eaded by the nod
17c0: 65 20 28 6c 65 61 66 20 6e 6f 64 65 73 20 68 61  e (leaf nodes ha
17d0: 76 65 20 52 74 72 65 65 4e 6f 64 65 2e 69 4e 6f  ve RtreeNode.iNo
17e0: 64 65 3d 3d 30 29 2e 0a 20 20 2a 2f 0a 20 20 52  de==0)..  */.  R
17f0: 74 72 65 65 4e 6f 64 65 20 2a 70 44 65 6c 65 74  treeNode *pDelet
1800: 65 64 3b 0a 20 20 69 6e 74 20 69 52 65 69 6e 73  ed;.  int iReins
1810: 65 72 74 48 65 69 67 68 74 3b 20 20 20 20 20 20  ertHeight;      
1820: 20 20 2f 2a 20 48 65 69 67 68 74 20 6f 66 20 73    /* Height of s
1830: 75 62 2d 74 72 65 65 73 20 52 65 69 6e 73 65 72  ub-trees Reinser
1840: 74 28 29 20 68 61 73 20 72 75 6e 20 6f 6e 20 2a  t() has run on *
1850: 2f 0a 0a 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e  /..  /* Statemen
1860: 74 73 20 74 6f 20 72 65 61 64 2f 77 72 69 74 65  ts to read/write
1870: 2f 64 65 6c 65 74 65 20 61 20 72 65 63 6f 72 64  /delete a record
1880: 20 66 72 6f 6d 20 78 78 78 5f 6e 6f 64 65 20 2a   from xxx_node *
1890: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
18a0: 20 2a 70 52 65 61 64 4e 6f 64 65 3b 0a 20 20 73   *pReadNode;.  s
18b0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 57 72  qlite3_stmt *pWr
18c0: 69 74 65 4e 6f 64 65 3b 0a 20 20 73 71 6c 69 74  iteNode;.  sqlit
18d0: 65 33 5f 73 74 6d 74 20 2a 70 44 65 6c 65 74 65  e3_stmt *pDelete
18e0: 4e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 53 74 61 74  Node;..  /* Stat
18f0: 65 6d 65 6e 74 73 20 74 6f 20 72 65 61 64 2f 77  ements to read/w
1900: 72 69 74 65 2f 64 65 6c 65 74 65 20 61 20 72 65  rite/delete a re
1910: 63 6f 72 64 20 66 72 6f 6d 20 78 78 78 5f 72 6f  cord from xxx_ro
1920: 77 69 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  wid */.  sqlite3
1930: 5f 73 74 6d 74 20 2a 70 52 65 61 64 52 6f 77 69  _stmt *pReadRowi
1940: 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  d;.  sqlite3_stm
1950: 74 20 2a 70 57 72 69 74 65 52 6f 77 69 64 3b 0a  t *pWriteRowid;.
1960: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1970: 70 44 65 6c 65 74 65 52 6f 77 69 64 3b 0a 0a 20  pDeleteRowid;.. 
1980: 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 73 20 74   /* Statements t
1990: 6f 20 72 65 61 64 2f 77 72 69 74 65 2f 64 65 6c  o read/write/del
19a0: 65 74 65 20 61 20 72 65 63 6f 72 64 20 66 72 6f  ete a record fro
19b0: 6d 20 78 78 78 5f 70 61 72 65 6e 74 20 2a 2f 0a  m xxx_parent */.
19c0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
19d0: 70 52 65 61 64 50 61 72 65 6e 74 3b 0a 20 20 73  pReadParent;.  s
19e0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 57 72  qlite3_stmt *pWr
19f0: 69 74 65 50 61 72 65 6e 74 3b 0a 20 20 73 71 6c  iteParent;.  sql
1a00: 69 74 65 33 5f 73 74 6d 74 20 2a 70 44 65 6c 65  ite3_stmt *pDele
1a10: 74 65 50 61 72 65 6e 74 3b 0a 0a 20 20 69 6e 74  teParent;..  int
1a20: 20 65 43 6f 6f 72 64 54 79 70 65 3b 0a 7d 3b 0a   eCoordType;.};.
1a30: 0a 2f 2a 20 50 6f 73 73 69 62 6c 65 20 76 61 6c  ./* Possible val
1a40: 75 65 73 20 66 6f 72 20 65 43 6f 6f 72 64 54 79  ues for eCoordTy
1a50: 70 65 3a 20 2a 2f 0a 23 64 65 66 69 6e 65 20 52  pe: */.#define R
1a60: 54 52 45 45 5f 43 4f 4f 52 44 5f 52 45 41 4c 33  TREE_COORD_REAL3
1a70: 32 20 30 0a 23 64 65 66 69 6e 65 20 52 54 52 45  2 0.#define RTRE
1a80: 45 5f 43 4f 4f 52 44 5f 49 4e 54 33 32 20 20 31  E_COORD_INT32  1
1a90: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ../*.** If SQLIT
1aa0: 45 5f 52 54 52 45 45 5f 49 4e 54 5f 4f 4e 4c 59  E_RTREE_INT_ONLY
1ab0: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65   is defined, the
1ac0: 6e 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 74  n this virtual t
1ad0: 61 62 6c 65 20 77 69 6c 6c 0a 2a 2a 20 6f 6e 6c  able will.** onl
1ae0: 79 20 64 65 61 6c 20 77 69 74 68 20 69 6e 74 65  y deal with inte
1af0: 67 65 72 20 63 6f 6f 72 64 69 6e 61 74 65 73 2e  ger coordinates.
1b00: 20 20 4e 6f 20 66 6c 6f 61 74 69 6e 67 20 70 6f    No floating po
1b10: 69 6e 74 20 6f 70 65 72 61 74 69 6f 6e 73 0a 2a  int operations.*
1b20: 2a 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 2e 0a  * will be done..
1b30: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
1b40: 5f 52 54 52 45 45 5f 49 4e 54 5f 4f 4e 4c 59 0a  _RTREE_INT_ONLY.
1b50: 20 20 74 79 70 65 64 65 66 20 73 71 6c 69 74 65    typedef sqlite
1b60: 33 5f 69 6e 74 36 34 20 52 74 72 65 65 44 56 61  3_int64 RtreeDVa
1b70: 6c 75 65 3b 20 20 20 20 20 20 20 2f 2a 20 48 69  lue;       /* Hi
1b80: 67 68 20 61 63 63 75 72 61 63 79 20 63 6f 6f 72  gh accuracy coor
1b90: 64 69 6e 61 74 65 20 2a 2f 0a 20 20 74 79 70 65  dinate */.  type
1ba0: 64 65 66 20 69 6e 74 20 52 74 72 65 65 56 61 6c  def int RtreeVal
1bb0: 75 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ue;             
1bc0: 20 20 20 20 20 2f 2a 20 4c 6f 77 20 61 63 63 75       /* Low accu
1bd0: 72 61 63 79 20 63 6f 6f 72 64 69 6e 61 74 65 20  racy coordinate 
1be0: 2a 2f 0a 23 65 6c 73 65 0a 20 20 74 79 70 65 64  */.#else.  typed
1bf0: 65 66 20 64 6f 75 62 6c 65 20 52 74 72 65 65 44  ef double RtreeD
1c00: 56 61 6c 75 65 3b 20 20 20 20 20 20 20 20 20 20  Value;          
1c10: 20 20 20 20 2f 2a 20 48 69 67 68 20 61 63 63 75      /* High accu
1c20: 72 61 63 79 20 63 6f 6f 72 64 69 6e 61 74 65 20  racy coordinate 
1c30: 2a 2f 0a 20 20 74 79 70 65 64 65 66 20 66 6c 6f  */.  typedef flo
1c40: 61 74 20 52 74 72 65 65 56 61 6c 75 65 3b 20 20  at RtreeValue;  
1c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c60: 20 4c 6f 77 20 61 63 63 75 72 61 63 79 20 63 6f   Low accuracy co
1c70: 6f 72 64 69 6e 61 74 65 20 2a 2f 0a 23 65 6e 64  ordinate */.#end
1c80: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 69  if../*.** The mi
1c90: 6e 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  nimum number of 
1ca0: 63 65 6c 6c 73 20 61 6c 6c 6f 77 65 64 20 66 6f  cells allowed fo
1cb0: 72 20 61 20 6e 6f 64 65 20 69 73 20 61 20 74 68  r a node is a th
1cc0: 69 72 64 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6d  ird of the .** m
1cd0: 61 78 69 6d 75 6d 2e 20 49 6e 20 47 75 74 6d 61  aximum. In Gutma
1ce0: 6e 27 73 20 6e 6f 74 61 74 69 6f 6e 3a 0a 2a 2a  n's notation:.**
1cf0: 0a 2a 2a 20 20 20 20 20 6d 20 3d 20 4d 2f 33 0a  .**     m = M/3.
1d00: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 52 2a 2d 74  **.** If an R*-t
1d10: 72 65 65 20 22 52 65 69 6e 73 65 72 74 22 20 6f  ree "Reinsert" o
1d20: 70 65 72 61 74 69 6f 6e 20 69 73 20 72 65 71 75  peration is requ
1d30: 69 72 65 64 2c 20 74 68 65 20 73 61 6d 65 20 6e  ired, the same n
1d40: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c  umber of.** cell
1d50: 73 20 61 72 65 20 72 65 6d 6f 76 65 64 20 66 72  s are removed fr
1d60: 6f 6d 20 74 68 65 20 6f 76 65 72 66 75 6c 6c 20  om the overfull 
1d70: 6e 6f 64 65 20 61 6e 64 20 72 65 69 6e 73 65 72  node and reinser
1d80: 74 65 64 20 69 6e 74 6f 20 74 68 65 20 74 72 65  ted into the tre
1d90: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 52 54  e..*/.#define RT
1da0: 52 45 45 5f 4d 49 4e 43 45 4c 4c 53 28 70 29 20  REE_MINCELLS(p) 
1db0: 28 28 28 28 70 29 2d 3e 69 4e 6f 64 65 53 69 7a  ((((p)->iNodeSiz
1dc0: 65 2d 34 29 2f 28 70 29 2d 3e 6e 42 79 74 65 73  e-4)/(p)->nBytes
1dd0: 50 65 72 43 65 6c 6c 29 2f 33 29 0a 23 64 65 66  PerCell)/3).#def
1de0: 69 6e 65 20 52 54 52 45 45 5f 52 45 49 4e 53 45  ine RTREE_REINSE
1df0: 52 54 28 70 29 20 52 54 52 45 45 5f 4d 49 4e 43  RT(p) RTREE_MINC
1e00: 45 4c 4c 53 28 70 29 0a 23 64 65 66 69 6e 65 20  ELLS(p).#define 
1e10: 52 54 52 45 45 5f 4d 41 58 43 45 4c 4c 53 20 35  RTREE_MAXCELLS 5
1e20: 31 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 6d 61  1../*.** The sma
1e30: 6c 6c 65 73 74 20 70 6f 73 73 69 62 6c 65 20 6e  llest possible n
1e40: 6f 64 65 2d 73 69 7a 65 20 69 73 20 28 35 31 32  ode-size is (512
1e50: 2d 36 34 29 3d 3d 34 34 38 20 62 79 74 65 73 2e  -64)==448 bytes.
1e60: 20 41 6e 64 20 74 68 65 20 6c 61 72 67 65 73 74   And the largest
1e70: 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64 20 63 65  .** supported ce
1e80: 6c 6c 20 73 69 7a 65 20 69 73 20 34 38 20 62 79  ll size is 48 by
1e90: 74 65 73 20 28 38 20 62 79 74 65 20 72 6f 77 69  tes (8 byte rowi
1ea0: 64 20 2b 20 74 65 6e 20 34 20 62 79 74 65 20 63  d + ten 4 byte c
1eb0: 6f 6f 72 64 69 6e 61 74 65 73 29 2e 0a 2a 2a 20  oordinates)..** 
1ec0: 54 68 65 72 65 66 6f 72 65 20 61 6c 6c 20 6e 6f  Therefore all no
1ed0: 6e 2d 72 6f 6f 74 20 6e 6f 64 65 73 20 6d 75 73  n-root nodes mus
1ee0: 74 20 63 6f 6e 74 61 69 6e 20 61 74 20 6c 65 61  t contain at lea
1ef0: 73 74 20 33 20 65 6e 74 72 69 65 73 2e 20 53 69  st 3 entries. Si
1f00: 6e 63 65 20 0a 2a 2a 20 32 5e 34 30 20 69 73 20  nce .** 2^40 is 
1f10: 67 72 65 61 74 65 72 20 74 68 61 6e 20 32 5e 36  greater than 2^6
1f20: 34 2c 20 61 6e 20 72 2d 74 72 65 65 20 73 74 72  4, an r-tree str
1f30: 75 63 74 75 72 65 20 61 6c 77 61 79 73 20 68 61  ucture always ha
1f40: 73 20 61 20 64 65 70 74 68 20 6f 66 0a 2a 2a 20  s a depth of.** 
1f50: 34 30 20 6f 72 20 6c 65 73 73 2e 0a 2a 2f 0a 23  40 or less..*/.#
1f60: 64 65 66 69 6e 65 20 52 54 52 45 45 5f 4d 41 58  define RTREE_MAX
1f70: 5f 44 45 50 54 48 20 34 30 0a 0a 2f 2a 20 0a 2a  _DEPTH 40../* .*
1f80: 2a 20 41 6e 20 72 74 72 65 65 20 63 75 72 73 6f  * An rtree curso
1f90: 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 72  r object..*/.str
1fa0: 75 63 74 20 52 74 72 65 65 43 75 72 73 6f 72 20  uct RtreeCursor 
1fb0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  {.  sqlite3_vtab
1fc0: 5f 63 75 72 73 6f 72 20 62 61 73 65 3b 0a 20 20  _cursor base;.  
1fd0: 52 74 72 65 65 4e 6f 64 65 20 2a 70 4e 6f 64 65  RtreeNode *pNode
1fe0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ff0: 20 20 2f 2a 20 4e 6f 64 65 20 63 75 72 73 6f 72    /* Node cursor
2000: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
2010: 69 6e 74 69 6e 67 20 61 74 20 2a 2f 0a 20 20 69  inting at */.  i
2020: 6e 74 20 69 43 65 6c 6c 3b 20 20 20 20 20 20 20  nt iCell;       
2030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2040: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 75 72   /* Index of cur
2050: 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70 4e 6f  rent cell in pNo
2060: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 72  de */.  int iStr
2070: 61 74 65 67 79 3b 20 20 20 20 20 20 20 20 20 20  ategy;          
2080: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70            /* Cop
2090: 79 20 6f 66 20 69 64 78 4e 75 6d 20 73 65 61 72  y of idxNum sear
20a0: 63 68 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a  ch parameter */.
20b0: 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e    int nConstrain
20c0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
20d0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
20e0: 20 65 6e 74 72 69 65 73 20 69 6e 20 61 43 6f 6e   entries in aCon
20f0: 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 52 74 72  straint */.  Rtr
2100: 65 65 43 6f 6e 73 74 72 61 69 6e 74 20 2a 61 43  eeConstraint *aC
2110: 6f 6e 73 74 72 61 69 6e 74 3b 20 20 20 20 20 2f  onstraint;     /
2120: 2a 20 53 65 61 72 63 68 20 63 6f 6e 73 74 72 61  * Search constra
2130: 69 6e 74 73 2e 20 2a 2f 0a 7d 3b 0a 0a 75 6e 69  ints. */.};..uni
2140: 6f 6e 20 52 74 72 65 65 43 6f 6f 72 64 20 7b 0a  on RtreeCoord {.
2150: 20 20 52 74 72 65 65 56 61 6c 75 65 20 66 3b 0a    RtreeValue f;.
2160: 20 20 69 6e 74 20 69 3b 0a 7d 3b 0a 0a 2f 2a 0a    int i;.};../*.
2170: 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  ** The argument 
2180: 69 73 20 61 6e 20 52 74 72 65 65 43 6f 6f 72 64  is an RtreeCoord
2190: 2e 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c  . Return the val
21a0: 75 65 20 73 74 6f 72 65 64 20 77 69 74 68 69 6e  ue stored within
21b0: 20 74 68 65 20 52 74 72 65 65 43 6f 6f 72 64 0a   the RtreeCoord.
21c0: 2a 2a 20 66 6f 72 6d 61 74 74 65 64 20 61 73 20  ** formatted as 
21d0: 61 20 52 74 72 65 65 44 56 61 6c 75 65 20 28 64  a RtreeDValue (d
21e0: 6f 75 62 6c 65 20 6f 72 20 69 6e 74 36 34 29 2e  ouble or int64).
21f0: 20 54 68 69 73 20 6d 61 63 72 6f 20 61 73 73 75   This macro assu
2200: 6d 65 73 20 74 68 61 74 20 6c 6f 63 61 6c 0a 2a  mes that local.*
2210: 2a 20 76 61 72 69 61 62 6c 65 20 70 52 74 72 65  * variable pRtre
2220: 65 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  e points to the 
2230: 52 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  Rtree structure 
2240: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2250: 74 68 65 0a 2a 2a 20 52 74 72 65 65 43 6f 6f 72  the.** RtreeCoor
2260: 64 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  d..*/.#ifdef SQL
2270: 49 54 45 5f 52 54 52 45 45 5f 49 4e 54 5f 4f 4e  ITE_RTREE_INT_ON
2280: 4c 59 0a 23 20 64 65 66 69 6e 65 20 44 43 4f 4f  LY.# define DCOO
2290: 52 44 28 63 6f 6f 72 64 29 20 28 28 52 74 72 65  RD(coord) ((Rtre
22a0: 65 44 56 61 6c 75 65 29 63 6f 6f 72 64 2e 69 29  eDValue)coord.i)
22b0: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
22c0: 44 43 4f 4f 52 44 28 63 6f 6f 72 64 29 20 28 20  DCOORD(coord) ( 
22d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e0: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
22f0: 28 70 52 74 72 65 65 2d 3e 65 43 6f 6f 72 64 54  (pRtree->eCoordT
2300: 79 70 65 3d 3d 52 54 52 45 45 5f 43 4f 4f 52 44  ype==RTREE_COORD
2310: 5f 52 45 41 4c 33 32 29 20 3f 20 20 20 20 20 20  _REAL32) ?      
2320: 5c 0a 20 20 20 20 20 20 28 28 64 6f 75 62 6c 65  \.      ((double
2330: 29 63 6f 6f 72 64 2e 66 29 20 3a 20 20 20 20 20  )coord.f) :     
2340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2350: 20 20 20 20 20 20 5c 0a 20 20 20 20 20 20 28 28        \.      ((
2360: 64 6f 75 62 6c 65 29 63 6f 6f 72 64 2e 69 29 20  double)coord.i) 
2370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2380: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
2390: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
23a0: 41 20 73 65 61 72 63 68 20 63 6f 6e 73 74 72 61  A search constra
23b0: 69 6e 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 52  int..*/.struct R
23c0: 74 72 65 65 43 6f 6e 73 74 72 61 69 6e 74 20 7b  treeConstraint {
23d0: 0a 20 20 69 6e 74 20 69 43 6f 6f 72 64 3b 20 20  .  int iCoord;  
23e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63     /* Index of c
2400: 6f 6e 73 74 72 61 69 6e 65 64 20 63 6f 6f 72 64  onstrained coord
2410: 69 6e 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6f  inate */.  int o
2420: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
2430: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
2440: 6e 73 74 72 61 69 6e 69 6e 67 20 6f 70 65 72 61  nstraining opera
2450: 74 69 6f 6e 20 2a 2f 0a 20 20 52 74 72 65 65 44  tion */.  RtreeD
2460: 56 61 6c 75 65 20 72 56 61 6c 75 65 3b 20 20 20  Value rValue;   
2470: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
2480: 73 74 72 61 69 6e 74 20 76 61 6c 75 65 2e 20 2a  straint value. *
2490: 2f 0a 20 20 69 6e 74 20 28 2a 78 47 65 6f 6d 29  /.  int (*xGeom)
24a0: 28 73 71 6c 69 74 65 33 5f 72 74 72 65 65 5f 67  (sqlite3_rtree_g
24b0: 65 6f 6d 65 74 72 79 2a 2c 20 69 6e 74 2c 20 52  eometry*, int, R
24c0: 74 72 65 65 44 56 61 6c 75 65 2a 2c 20 69 6e 74  treeDValue*, int
24d0: 2a 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 74  *);.  sqlite3_rt
24e0: 72 65 65 5f 67 65 6f 6d 65 74 72 79 20 2a 70 47  ree_geometry *pG
24f0: 65 6f 6d 3b 20 20 2f 2a 20 43 6f 6e 73 74 72 61  eom;  /* Constra
2500: 69 6e 74 20 63 61 6c 6c 62 61 63 6b 20 61 72 67  int callback arg
2510: 75 6d 65 6e 74 20 66 6f 72 20 61 20 4d 41 54 43  ument for a MATC
2520: 48 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 50 6f 73 73  H */.};../* Poss
2530: 69 62 6c 65 20 76 61 6c 75 65 73 20 66 6f 72 20  ible values for 
2540: 52 74 72 65 65 43 6f 6e 73 74 72 61 69 6e 74 2e  RtreeConstraint.
2550: 6f 70 20 2a 2f 0a 23 64 65 66 69 6e 65 20 52 54  op */.#define RT
2560: 52 45 45 5f 45 51 20 20 20 20 30 78 34 31 0a 23  REE_EQ    0x41.#
2570: 64 65 66 69 6e 65 20 52 54 52 45 45 5f 4c 45 20  define RTREE_LE 
2580: 20 20 20 30 78 34 32 0a 23 64 65 66 69 6e 65 20     0x42.#define 
2590: 52 54 52 45 45 5f 4c 54 20 20 20 20 30 78 34 33  RTREE_LT    0x43
25a0: 0a 23 64 65 66 69 6e 65 20 52 54 52 45 45 5f 47  .#define RTREE_G
25b0: 45 20 20 20 20 30 78 34 34 0a 23 64 65 66 69 6e  E    0x44.#defin
25c0: 65 20 52 54 52 45 45 5f 47 54 20 20 20 20 30 78  e RTREE_GT    0x
25d0: 34 35 0a 23 64 65 66 69 6e 65 20 52 54 52 45 45  45.#define RTREE
25e0: 5f 4d 41 54 43 48 20 30 78 34 36 0a 0a 2f 2a 20  _MATCH 0x46../* 
25f0: 0a 2a 2a 20 41 6e 20 72 74 72 65 65 20 73 74 72  .** An rtree str
2600: 75 63 74 75 72 65 20 6e 6f 64 65 2e 0a 2a 2f 0a  ucture node..*/.
2610: 73 74 72 75 63 74 20 52 74 72 65 65 4e 6f 64 65  struct RtreeNode
2620: 20 7b 0a 20 20 52 74 72 65 65 4e 6f 64 65 20 2a   {.  RtreeNode *
2630: 70 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20  pParent;        
2640: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74         /* Parent
2650: 20 6e 6f 64 65 20 2a 2f 0a 20 20 69 36 34 20 69   node */.  i64 i
2660: 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 6e 52 65 66  Node;.  int nRef
2670: 3b 0a 20 20 69 6e 74 20 69 73 44 69 72 74 79 3b  ;.  int isDirty;
2680: 0a 20 20 75 38 20 2a 7a 44 61 74 61 3b 0a 20 20  .  u8 *zData;.  
2690: 52 74 72 65 65 4e 6f 64 65 20 2a 70 4e 65 78 74  RtreeNode *pNext
26a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26b0: 20 20 2f 2a 20 4e 65 78 74 20 6e 6f 64 65 20 69    /* Next node i
26c0: 6e 20 74 68 69 73 20 68 61 73 68 20 63 68 61 69  n this hash chai
26d0: 6e 20 2a 2f 0a 7d 3b 0a 23 64 65 66 69 6e 65 20  n */.};.#define 
26e0: 4e 43 45 4c 4c 28 70 4e 6f 64 65 29 20 72 65 61  NCELL(pNode) rea
26f0: 64 49 6e 74 31 36 28 26 28 70 4e 6f 64 65 29 2d  dInt16(&(pNode)-
2700: 3e 7a 44 61 74 61 5b 32 5d 29 0a 0a 2f 2a 20 0a  >zData[2])../* .
2710: 2a 2a 20 53 74 72 75 63 74 75 72 65 20 74 6f 20  ** Structure to 
2720: 73 74 6f 72 65 20 61 20 64 65 73 65 72 69 61 6c  store a deserial
2730: 69 7a 65 64 20 72 74 72 65 65 20 72 65 63 6f 72  ized rtree recor
2740: 64 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 52 74 72  d..*/.struct Rtr
2750: 65 65 43 65 6c 6c 20 7b 0a 20 20 69 36 34 20 69  eeCell {.  i64 i
2760: 52 6f 77 69 64 3b 0a 20 20 52 74 72 65 65 43 6f  Rowid;.  RtreeCo
2770: 6f 72 64 20 61 43 6f 6f 72 64 5b 52 54 52 45 45  ord aCoord[RTREE
2780: 5f 4d 41 58 5f 44 49 4d 45 4e 53 49 4f 4e 53 2a  _MAX_DIMENSIONS*
2790: 32 5d 3b 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 56  2];.};.../*.** V
27a0: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 66 69 72  alue for the fir
27b0: 73 74 20 66 69 65 6c 64 20 6f 66 20 65 76 65 72  st field of ever
27c0: 79 20 52 74 72 65 65 4d 61 74 63 68 41 72 67 20  y RtreeMatchArg 
27d0: 6f 62 6a 65 63 74 2e 20 54 68 65 20 4d 41 54 43  object. The MATC
27e0: 48 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 74 65  H.** operator te
27f0: 73 74 73 20 74 68 61 74 20 74 68 65 20 66 69 72  sts that the fir
2800: 73 74 20 66 69 65 6c 64 20 6f 66 20 61 20 62 6c  st field of a bl
2810: 6f 62 20 6f 70 65 72 61 6e 64 20 6d 61 74 63 68  ob operand match
2820: 65 73 20 74 68 69 73 0a 2a 2a 20 76 61 6c 75 65  es this.** value
2830: 20 74 6f 20 61 76 6f 69 64 20 6f 70 65 72 61 74   to avoid operat
2840: 69 6e 67 20 6f 6e 20 69 6e 76 61 6c 69 64 20 62  ing on invalid b
2850: 6c 6f 62 73 20 28 77 68 69 63 68 20 63 6f 75 6c  lobs (which coul
2860: 64 20 63 61 75 73 65 20 61 20 73 65 67 66 61 75  d cause a segfau
2870: 6c 74 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  lt)..*/.#define 
2880: 52 54 52 45 45 5f 47 45 4f 4d 45 54 52 59 5f 4d  RTREE_GEOMETRY_M
2890: 41 47 49 43 20 30 78 38 39 31 32 34 35 41 42 0a  AGIC 0x891245AB.
28a0: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
28b0: 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  ce of this struc
28c0: 74 75 72 65 20 6d 75 73 74 20 62 65 20 73 75 70  ture must be sup
28d0: 70 6c 69 65 64 20 61 73 20 61 20 62 6c 6f 62 20  plied as a blob 
28e0: 61 72 67 75 6d 65 6e 74 20 74 6f 0a 2a 2a 20 74  argument to.** t
28f0: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 2d 73 69  he right-hand-si
2900: 64 65 20 6f 66 20 61 6e 20 53 51 4c 20 4d 41 54  de of an SQL MAT
2910: 43 48 20 6f 70 65 72 61 74 6f 72 20 75 73 65 64  CH operator used
2920: 20 74 6f 20 63 6f 6e 73 74 72 61 69 6e 20 61 6e   to constrain an
2930: 0a 2a 2a 20 72 2d 74 72 65 65 20 71 75 65 72 79  .** r-tree query
2940: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 52 74 72 65  ..*/.struct Rtre
2950: 65 4d 61 74 63 68 41 72 67 20 7b 0a 20 20 75 33  eMatchArg {.  u3
2960: 32 20 6d 61 67 69 63 3b 20 20 20 20 20 20 20 20  2 magic;        
2970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2980: 20 41 6c 77 61 79 73 20 52 54 52 45 45 5f 47 45   Always RTREE_GE
2990: 4f 4d 45 54 52 59 5f 4d 41 47 49 43 20 2a 2f 0a  OMETRY_MAGIC */.
29a0: 20 20 69 6e 74 20 28 2a 78 47 65 6f 6d 29 28 73    int (*xGeom)(s
29b0: 71 6c 69 74 65 33 5f 72 74 72 65 65 5f 67 65 6f  qlite3_rtree_geo
29c0: 6d 65 74 72 79 20 2a 2c 20 69 6e 74 2c 20 52 74  metry *, int, Rt
29d0: 72 65 65 44 56 61 6c 75 65 2a 2c 20 69 6e 74 20  reeDValue*, int 
29e0: 2a 29 3b 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6e  *);.  void *pCon
29f0: 74 65 78 74 3b 0a 20 20 69 6e 74 20 6e 50 61 72  text;.  int nPar
2a00: 61 6d 3b 0a 20 20 52 74 72 65 65 44 56 61 6c 75  am;.  RtreeDValu
2a10: 65 20 61 50 61 72 61 6d 5b 31 5d 3b 0a 7d 3b 0a  e aParam[1];.};.
2a20: 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 67 65  ./*.** When a ge
2a30: 6f 6d 65 74 72 79 20 63 61 6c 6c 62 61 63 6b 20  ometry callback 
2a40: 69 73 20 63 72 65 61 74 65 64 20 28 73 65 65 20  is created (see 
2a50: 73 71 6c 69 74 65 33 5f 72 74 72 65 65 5f 67 65  sqlite3_rtree_ge
2a60: 6f 6d 65 74 72 79 5f 63 61 6c 6c 62 61 63 6b 29  ometry_callback)
2a70: 2c 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 69 6e  ,.** a single in
2a80: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
2a90: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
2aa0: 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 20  e is allocated. 
2ab0: 49 74 20 69 73 20 75 73 65 64 0a 2a 2a 20 61 73  It is used.** as
2ac0: 20 74 68 65 20 63 6f 6e 74 65 78 74 20 66 6f 72   the context for
2ad0: 20 74 68 65 20 75 73 65 72 2d 66 75 6e 63 74 69   the user-functi
2ae0: 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20 62 79  on created by by
2af0: 20 73 5f 72 5f 67 5f 63 28 29 2e 20 54 68 65 20   s_r_g_c(). The 
2b00: 6f 62 6a 65 63 74 0a 2a 2a 20 69 73 20 65 76 65  object.** is eve
2b10: 6e 74 75 61 6c 6c 79 20 64 65 6c 65 74 65 64 20  ntually deleted 
2b20: 62 79 20 74 68 65 20 64 65 73 74 72 75 63 74 6f  by the destructo
2b30: 72 20 6d 65 63 68 61 6e 69 73 6d 20 70 72 6f 76  r mechanism prov
2b40: 69 64 65 64 20 62 79 0a 2a 2a 20 73 71 6c 69 74  ided by.** sqlit
2b50: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
2b60: 6f 6e 5f 76 32 28 29 20 28 77 68 69 63 68 20 69  on_v2() (which i
2b70: 73 20 63 61 6c 6c 65 64 20 62 79 20 73 5f 72 5f  s called by s_r_
2b80: 67 5f 63 28 29 20 74 6f 20 63 72 65 61 74 65 0a  g_c() to create.
2b90: 2a 2a 20 74 68 65 20 67 65 6f 6d 65 74 72 79 20  ** the geometry 
2ba0: 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f  callback functio
2bb0: 6e 29 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 52 74  n)..*/.struct Rt
2bc0: 72 65 65 47 65 6f 6d 43 61 6c 6c 62 61 63 6b 20  reeGeomCallback 
2bd0: 7b 0a 20 20 69 6e 74 20 28 2a 78 47 65 6f 6d 29  {.  int (*xGeom)
2be0: 28 73 71 6c 69 74 65 33 5f 72 74 72 65 65 5f 67  (sqlite3_rtree_g
2bf0: 65 6f 6d 65 74 72 79 2a 2c 20 69 6e 74 2c 20 52  eometry*, int, R
2c00: 74 72 65 65 44 56 61 6c 75 65 2a 2c 20 69 6e 74  treeDValue*, int
2c10: 2a 29 3b 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6e  *);.  void *pCon
2c20: 74 65 78 74 3b 0a 7d 3b 0a 0a 23 69 66 6e 64 65  text;.};..#ifnde
2c30: 66 20 4d 41 58 0a 23 20 64 65 66 69 6e 65 20 4d  f MAX.# define M
2c40: 41 58 28 78 2c 79 29 20 28 28 78 29 20 3c 20 28  AX(x,y) ((x) < (
2c50: 79 29 20 3f 20 28 79 29 20 3a 20 28 78 29 29 0a  y) ? (y) : (x)).
2c60: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4d  #endif.#ifndef M
2c70: 49 4e 0a 23 20 64 65 66 69 6e 65 20 4d 49 4e 28  IN.# define MIN(
2c80: 78 2c 79 29 20 28 28 78 29 20 3e 20 28 79 29 20  x,y) ((x) > (y) 
2c90: 3f 20 28 79 29 20 3a 20 28 78 29 29 0a 23 65 6e  ? (y) : (x)).#en
2ca0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74  dif../*.** Funct
2cb0: 69 6f 6e 73 20 74 6f 20 64 65 73 65 72 69 61 6c  ions to deserial
2cc0: 69 7a 65 20 61 20 31 36 20 62 69 74 20 69 6e 74  ize a 16 bit int
2cd0: 65 67 65 72 2c 20 33 32 20 62 69 74 20 72 65 61  eger, 32 bit rea
2ce0: 6c 20 6e 75 6d 62 65 72 20 61 6e 64 0a 2a 2a 20  l number and.** 
2cf0: 36 34 20 62 69 74 20 69 6e 74 65 67 65 72 2e 20  64 bit integer. 
2d00: 54 68 65 20 64 65 73 65 72 69 61 6c 69 7a 65 64  The deserialized
2d10: 20 76 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e   value is return
2d20: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
2d30: 74 20 72 65 61 64 49 6e 74 31 36 28 75 38 20 2a  t readInt16(u8 *
2d40: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70 5b  p){.  return (p[
2d50: 30 5d 3c 3c 38 29 20 2b 20 70 5b 31 5d 3b 0a 7d  0]<<8) + p[1];.}
2d60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 61  .static void rea
2d70: 64 43 6f 6f 72 64 28 75 38 20 2a 70 2c 20 52 74  dCoord(u8 *p, Rt
2d80: 72 65 65 43 6f 6f 72 64 20 2a 70 43 6f 6f 72 64  reeCoord *pCoord
2d90: 29 7b 0a 20 20 75 33 32 20 69 20 3d 20 28 0a 20  ){.  u32 i = (. 
2da0: 20 20 20 28 28 28 75 33 32 29 70 5b 30 5d 29 20     (((u32)p[0]) 
2db0: 3c 3c 20 32 34 29 20 2b 20 0a 20 20 20 20 28 28  << 24) + .    ((
2dc0: 28 75 33 32 29 70 5b 31 5d 29 20 3c 3c 20 31 36  (u32)p[1]) << 16
2dd0: 29 20 2b 20 0a 20 20 20 20 28 28 28 75 33 32 29  ) + .    (((u32)
2de0: 70 5b 32 5d 29 20 3c 3c 20 20 38 29 20 2b 20 0a  p[2]) <<  8) + .
2df0: 20 20 20 20 28 28 28 75 33 32 29 70 5b 33 5d 29      (((u32)p[3])
2e00: 20 3c 3c 20 20 30 29 0a 20 20 29 3b 0a 20 20 2a   <<  0).  );.  *
2e10: 28 75 33 32 20 2a 29 70 43 6f 6f 72 64 20 3d 20  (u32 *)pCoord = 
2e20: 69 3b 0a 7d 0a 73 74 61 74 69 63 20 69 36 34 20  i;.}.static i64 
2e30: 72 65 61 64 49 6e 74 36 34 28 75 38 20 2a 70 29  readInt64(u8 *p)
2e40: 7b 0a 20 20 72 65 74 75 72 6e 20 28 0a 20 20 20  {.  return (.   
2e50: 20 28 28 28 69 36 34 29 70 5b 30 5d 29 20 3c 3c   (((i64)p[0]) <<
2e60: 20 35 36 29 20 2b 20 0a 20 20 20 20 28 28 28 69   56) + .    (((i
2e70: 36 34 29 70 5b 31 5d 29 20 3c 3c 20 34 38 29 20  64)p[1]) << 48) 
2e80: 2b 20 0a 20 20 20 20 28 28 28 69 36 34 29 70 5b  + .    (((i64)p[
2e90: 32 5d 29 20 3c 3c 20 34 30 29 20 2b 20 0a 20 20  2]) << 40) + .  
2ea0: 20 20 28 28 28 69 36 34 29 70 5b 33 5d 29 20 3c    (((i64)p[3]) <
2eb0: 3c 20 33 32 29 20 2b 20 0a 20 20 20 20 28 28 28  < 32) + .    (((
2ec0: 69 36 34 29 70 5b 34 5d 29 20 3c 3c 20 32 34 29  i64)p[4]) << 24)
2ed0: 20 2b 20 0a 20 20 20 20 28 28 28 69 36 34 29 70   + .    (((i64)p
2ee0: 5b 35 5d 29 20 3c 3c 20 31 36 29 20 2b 20 0a 20  [5]) << 16) + . 
2ef0: 20 20 20 28 28 28 69 36 34 29 70 5b 36 5d 29 20     (((i64)p[6]) 
2f00: 3c 3c 20 20 38 29 20 2b 20 0a 20 20 20 20 28 28  <<  8) + .    ((
2f10: 28 69 36 34 29 70 5b 37 5d 29 20 3c 3c 20 20 30  (i64)p[7]) <<  0
2f20: 29 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ).  );.}../*.** 
2f30: 46 75 6e 63 74 69 6f 6e 73 20 74 6f 20 73 65 72  Functions to ser
2f40: 69 61 6c 69 7a 65 20 61 20 31 36 20 62 69 74 20  ialize a 16 bit 
2f50: 69 6e 74 65 67 65 72 2c 20 33 32 20 62 69 74 20  integer, 32 bit 
2f60: 72 65 61 6c 20 6e 75 6d 62 65 72 20 61 6e 64 0a  real number and.
2f70: 2a 2a 20 36 34 20 62 69 74 20 69 6e 74 65 67 65  ** 64 bit intege
2f80: 72 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  r. The value ret
2f90: 75 72 6e 65 64 20 69 73 20 74 68 65 20 6e 75 6d  urned is the num
2fa0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69  ber of bytes wri
2fb0: 74 74 65 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 61  tten.** to the a
2fc0: 72 67 75 6d 65 6e 74 20 62 75 66 66 65 72 20 28  rgument buffer (
2fd0: 61 6c 77 61 79 73 20 32 2c 20 34 20 61 6e 64 20  always 2, 4 and 
2fe0: 38 20 72 65 73 70 65 63 74 69 76 65 6c 79 29 2e  8 respectively).
2ff0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
3000: 72 69 74 65 49 6e 74 31 36 28 75 38 20 2a 70 2c  riteInt16(u8 *p,
3010: 20 69 6e 74 20 69 29 7b 0a 20 20 70 5b 30 5d 20   int i){.  p[0] 
3020: 3d 20 28 69 3e 3e 20 38 29 26 30 78 46 46 3b 0a  = (i>> 8)&0xFF;.
3030: 20 20 70 5b 31 5d 20 3d 20 28 69 3e 3e 20 30 29    p[1] = (i>> 0)
3040: 26 30 78 46 46 3b 0a 20 20 72 65 74 75 72 6e 20  &0xFF;.  return 
3050: 32 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  2;.}.static int 
3060: 77 72 69 74 65 43 6f 6f 72 64 28 75 38 20 2a 70  writeCoord(u8 *p
3070: 2c 20 52 74 72 65 65 43 6f 6f 72 64 20 2a 70 43  , RtreeCoord *pC
3080: 6f 6f 72 64 29 7b 0a 20 20 75 33 32 20 69 3b 0a  oord){.  u32 i;.
3090: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
30a0: 28 52 74 72 65 65 43 6f 6f 72 64 29 3d 3d 34 20  (RtreeCoord)==4 
30b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a  );.  assert( siz
30c0: 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20  eof(u32)==4 );. 
30d0: 20 69 20 3d 20 2a 28 75 33 32 20 2a 29 70 43 6f   i = *(u32 *)pCo
30e0: 6f 72 64 3b 0a 20 20 70 5b 30 5d 20 3d 20 28 69  ord;.  p[0] = (i
30f0: 3e 3e 32 34 29 26 30 78 46 46 3b 0a 20 20 70 5b  >>24)&0xFF;.  p[
3100: 31 5d 20 3d 20 28 69 3e 3e 31 36 29 26 30 78 46  1] = (i>>16)&0xF
3110: 46 3b 0a 20 20 70 5b 32 5d 20 3d 20 28 69 3e 3e  F;.  p[2] = (i>>
3120: 20 38 29 26 30 78 46 46 3b 0a 20 20 70 5b 33 5d   8)&0xFF;.  p[3]
3130: 20 3d 20 28 69 3e 3e 20 30 29 26 30 78 46 46 3b   = (i>> 0)&0xFF;
3140: 0a 20 20 72 65 74 75 72 6e 20 34 3b 0a 7d 0a 73  .  return 4;.}.s
3150: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 49  tatic int writeI
3160: 6e 74 36 34 28 75 38 20 2a 70 2c 20 69 36 34 20  nt64(u8 *p, i64 
3170: 69 29 7b 0a 20 20 70 5b 30 5d 20 3d 20 28 69 3e  i){.  p[0] = (i>
3180: 3e 35 36 29 26 30 78 46 46 3b 0a 20 20 70 5b 31  >56)&0xFF;.  p[1
3190: 5d 20 3d 20 28 69 3e 3e 34 38 29 26 30 78 46 46  ] = (i>>48)&0xFF
31a0: 3b 0a 20 20 70 5b 32 5d 20 3d 20 28 69 3e 3e 34  ;.  p[2] = (i>>4
31b0: 30 29 26 30 78 46 46 3b 0a 20 20 70 5b 33 5d 20  0)&0xFF;.  p[3] 
31c0: 3d 20 28 69 3e 3e 33 32 29 26 30 78 46 46 3b 0a  = (i>>32)&0xFF;.
31d0: 20 20 70 5b 34 5d 20 3d 20 28 69 3e 3e 32 34 29    p[4] = (i>>24)
31e0: 26 30 78 46 46 3b 0a 20 20 70 5b 35 5d 20 3d 20  &0xFF;.  p[5] = 
31f0: 28 69 3e 3e 31 36 29 26 30 78 46 46 3b 0a 20 20  (i>>16)&0xFF;.  
3200: 70 5b 36 5d 20 3d 20 28 69 3e 3e 20 38 29 26 30  p[6] = (i>> 8)&0
3210: 78 46 46 3b 0a 20 20 70 5b 37 5d 20 3d 20 28 69  xFF;.  p[7] = (i
3220: 3e 3e 20 30 29 26 30 78 46 46 3b 0a 20 20 72 65  >> 0)&0xFF;.  re
3230: 74 75 72 6e 20 38 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 8;.}../*.**
3240: 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72   Increment the r
3250: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f  eference count o
3260: 66 20 6e 6f 64 65 20 70 2e 0a 2a 2f 0a 73 74 61  f node p..*/.sta
3270: 74 69 63 20 76 6f 69 64 20 6e 6f 64 65 52 65 66  tic void nodeRef
3280: 65 72 65 6e 63 65 28 52 74 72 65 65 4e 6f 64 65  erence(RtreeNode
3290: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b   *p){.  if( p ){
32a0: 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2b 2b 3b 0a  .    p->nRef++;.
32b0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65    }.}../*.** Cle
32c0: 61 72 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ar the content o
32d0: 66 20 6e 6f 64 65 20 70 20 28 73 65 74 20 61 6c  f node p (set al
32e0: 6c 20 62 79 74 65 73 20 74 6f 20 30 78 30 30 29  l bytes to 0x00)
32f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3300: 20 6e 6f 64 65 5a 65 72 6f 28 52 74 72 65 65 20   nodeZero(Rtree 
3310: 2a 70 52 74 72 65 65 2c 20 52 74 72 65 65 4e 6f  *pRtree, RtreeNo
3320: 64 65 20 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74  de *p){.  memset
3330: 28 26 70 2d 3e 7a 44 61 74 61 5b 32 5d 2c 20 30  (&p->zData[2], 0
3340: 2c 20 70 52 74 72 65 65 2d 3e 69 4e 6f 64 65 53  , pRtree->iNodeS
3350: 69 7a 65 2d 32 29 3b 0a 20 20 70 2d 3e 69 73 44  ize-2);.  p->isD
3360: 69 72 74 79 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  irty = 1;.}../*.
3370: 2a 2a 20 47 69 76 65 6e 20 61 20 6e 6f 64 65 20  ** Given a node 
3380: 6e 75 6d 62 65 72 20 69 4e 6f 64 65 2c 20 72 65  number iNode, re
3390: 74 75 72 6e 20 74 68 65 20 63 6f 72 72 65 73 70  turn the corresp
33a0: 6f 6e 64 69 6e 67 20 6b 65 79 20 74 6f 20 75 73  onding key to us
33b0: 65 0a 2a 2a 20 69 6e 20 74 68 65 20 52 74 72 65  e.** in the Rtre
33c0: 65 2e 61 48 61 73 68 20 74 61 62 6c 65 2e 0a 2a  e.aHash table..*
33d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 64  /.static int nod
33e0: 65 48 61 73 68 28 69 36 34 20 69 4e 6f 64 65 29  eHash(i64 iNode)
33f0: 7b 0a 20 20 72 65 74 75 72 6e 20 28 0a 20 20 20  {.  return (.   
3400: 20 28 69 4e 6f 64 65 3e 3e 35 36 29 20 5e 20 28   (iNode>>56) ^ (
3410: 69 4e 6f 64 65 3e 3e 34 38 29 20 5e 20 28 69 4e  iNode>>48) ^ (iN
3420: 6f 64 65 3e 3e 34 30 29 20 5e 20 28 69 4e 6f 64  ode>>40) ^ (iNod
3430: 65 3e 3e 33 32 29 20 5e 20 0a 20 20 20 20 28 69  e>>32) ^ .    (i
3440: 4e 6f 64 65 3e 3e 32 34 29 20 5e 20 28 69 4e 6f  Node>>24) ^ (iNo
3450: 64 65 3e 3e 31 36 29 20 5e 20 28 69 4e 6f 64 65  de>>16) ^ (iNode
3460: 3e 3e 20 38 29 20 5e 20 28 69 4e 6f 64 65 3e 3e  >> 8) ^ (iNode>>
3470: 20 30 29 0a 20 20 29 20 25 20 48 41 53 48 53 49   0).  ) % HASHSI
3480: 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61  ZE;.}../*.** Sea
3490: 72 63 68 20 74 68 65 20 6e 6f 64 65 20 68 61 73  rch the node has
34a0: 68 20 74 61 62 6c 65 20 66 6f 72 20 6e 6f 64 65  h table for node
34b0: 20 69 4e 6f 64 65 2e 20 49 66 20 66 6f 75 6e 64   iNode. If found
34c0: 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  , return a point
34d0: 65 72 0a 2a 2a 20 74 6f 20 69 74 2e 20 4f 74 68  er.** to it. Oth
34e0: 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 30  erwise, return 0
34f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 52 74 72 65  ..*/.static Rtre
3500: 65 4e 6f 64 65 20 2a 6e 6f 64 65 48 61 73 68 4c  eNode *nodeHashL
3510: 6f 6f 6b 75 70 28 52 74 72 65 65 20 2a 70 52 74  ookup(Rtree *pRt
3520: 72 65 65 2c 20 69 36 34 20 69 4e 6f 64 65 29 7b  ree, i64 iNode){
3530: 0a 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 3b  .  RtreeNode *p;
3540: 0a 20 20 66 6f 72 28 70 3d 70 52 74 72 65 65 2d  .  for(p=pRtree-
3550: 3e 61 48 61 73 68 5b 6e 6f 64 65 48 61 73 68 28  >aHash[nodeHash(
3560: 69 4e 6f 64 65 29 5d 3b 20 70 20 26 26 20 70 2d  iNode)]; p && p-
3570: 3e 69 4e 6f 64 65 21 3d 69 4e 6f 64 65 3b 20 70  >iNode!=iNode; p
3580: 3d 70 2d 3e 70 4e 65 78 74 29 3b 0a 20 20 72 65  =p->pNext);.  re
3590: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
35a0: 20 41 64 64 20 6e 6f 64 65 20 70 4e 6f 64 65 20   Add node pNode 
35b0: 74 6f 20 74 68 65 20 6e 6f 64 65 20 68 61 73 68  to the node hash
35c0: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
35d0: 63 20 76 6f 69 64 20 6e 6f 64 65 48 61 73 68 49  c void nodeHashI
35e0: 6e 73 65 72 74 28 52 74 72 65 65 20 2a 70 52 74  nsert(Rtree *pRt
35f0: 72 65 65 2c 20 52 74 72 65 65 4e 6f 64 65 20 2a  ree, RtreeNode *
3600: 70 4e 6f 64 65 29 7b 0a 20 20 69 6e 74 20 69 48  pNode){.  int iH
3610: 61 73 68 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ash;.  assert( p
3620: 4e 6f 64 65 2d 3e 70 4e 65 78 74 3d 3d 30 20 29  Node->pNext==0 )
3630: 3b 0a 20 20 69 48 61 73 68 20 3d 20 6e 6f 64 65  ;.  iHash = node
3640: 48 61 73 68 28 70 4e 6f 64 65 2d 3e 69 4e 6f 64  Hash(pNode->iNod
3650: 65 29 3b 0a 20 20 70 4e 6f 64 65 2d 3e 70 4e 65  e);.  pNode->pNe
3660: 78 74 20 3d 20 70 52 74 72 65 65 2d 3e 61 48 61  xt = pRtree->aHa
3670: 73 68 5b 69 48 61 73 68 5d 3b 0a 20 20 70 52 74  sh[iHash];.  pRt
3680: 72 65 65 2d 3e 61 48 61 73 68 5b 69 48 61 73 68  ree->aHash[iHash
3690: 5d 20 3d 20 70 4e 6f 64 65 3b 0a 7d 0a 0a 2f 2a  ] = pNode;.}../*
36a0: 0a 2a 2a 20 52 65 6d 6f 76 65 20 6e 6f 64 65 20  .** Remove node 
36b0: 70 4e 6f 64 65 20 66 72 6f 6d 20 74 68 65 20 6e  pNode from the n
36c0: 6f 64 65 20 68 61 73 68 20 74 61 62 6c 65 2e 0a  ode hash table..
36d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6e  */.static void n
36e0: 6f 64 65 48 61 73 68 44 65 6c 65 74 65 28 52 74  odeHashDelete(Rt
36f0: 72 65 65 20 2a 70 52 74 72 65 65 2c 20 52 74 72  ree *pRtree, Rtr
3700: 65 65 4e 6f 64 65 20 2a 70 4e 6f 64 65 29 7b 0a  eeNode *pNode){.
3710: 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 2a 70 70    RtreeNode **pp
3720: 3b 0a 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 69  ;.  if( pNode->i
3730: 4e 6f 64 65 21 3d 30 20 29 7b 0a 20 20 20 20 70  Node!=0 ){.    p
3740: 70 20 3d 20 26 70 52 74 72 65 65 2d 3e 61 48 61  p = &pRtree->aHa
3750: 73 68 5b 6e 6f 64 65 48 61 73 68 28 70 4e 6f 64  sh[nodeHash(pNod
3760: 65 2d 3e 69 4e 6f 64 65 29 5d 3b 0a 20 20 20 20  e->iNode)];.    
3770: 66 6f 72 28 20 3b 20 28 2a 70 70 29 21 3d 70 4e  for( ; (*pp)!=pN
3780: 6f 64 65 3b 20 70 70 20 3d 20 26 28 2a 70 70 29  ode; pp = &(*pp)
3790: 2d 3e 70 4e 65 78 74 29 7b 20 61 73 73 65 72 74  ->pNext){ assert
37a0: 28 2a 70 70 29 3b 20 7d 0a 20 20 20 20 2a 70 70  (*pp); }.    *pp
37b0: 20 3d 20 70 4e 6f 64 65 2d 3e 70 4e 65 78 74 3b   = pNode->pNext;
37c0: 0a 20 20 20 20 70 4e 6f 64 65 2d 3e 70 4e 65 78  .    pNode->pNex
37d0: 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  t = 0;.  }.}../*
37e0: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  .** Allocate and
37f0: 20 72 65 74 75 72 6e 20 6e 65 77 20 72 2d 74 72   return new r-tr
3800: 65 65 20 6e 6f 64 65 2e 20 49 6e 69 74 69 61 6c  ee node. Initial
3810: 6c 79 2c 20 28 52 74 72 65 65 4e 6f 64 65 2e 69  ly, (RtreeNode.i
3820: 4e 6f 64 65 3d 3d 30 29 2c 0a 2a 2a 20 69 6e 64  Node==0),.** ind
3830: 69 63 61 74 69 6e 67 20 74 68 61 74 20 6e 6f 64  icating that nod
3840: 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  e has not yet be
3850: 65 6e 20 61 73 73 69 67 6e 65 64 20 61 20 6e 6f  en assigned a no
3860: 64 65 20 6e 75 6d 62 65 72 2e 20 49 74 20 69 73  de number. It is
3870: 0a 2a 2a 20 61 73 73 69 67 6e 65 64 20 61 20 6e  .** assigned a n
3880: 6f 64 65 20 6e 75 6d 62 65 72 20 77 68 65 6e 20  ode number when 
3890: 6e 6f 64 65 57 72 69 74 65 28 29 20 69 73 20 63  nodeWrite() is c
38a0: 61 6c 6c 65 64 20 74 6f 20 77 72 69 74 65 20 74  alled to write t
38b0: 68 65 0a 2a 2a 20 6e 6f 64 65 20 63 6f 6e 74 65  he.** node conte
38c0: 6e 74 73 20 6f 75 74 20 74 6f 20 74 68 65 20 64  nts out to the d
38d0: 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  atabase..*/.stat
38e0: 69 63 20 52 74 72 65 65 4e 6f 64 65 20 2a 6e 6f  ic RtreeNode *no
38f0: 64 65 4e 65 77 28 52 74 72 65 65 20 2a 70 52 74  deNew(Rtree *pRt
3900: 72 65 65 2c 20 52 74 72 65 65 4e 6f 64 65 20 2a  ree, RtreeNode *
3910: 70 50 61 72 65 6e 74 29 7b 0a 20 20 52 74 72 65  pParent){.  Rtre
3920: 65 4e 6f 64 65 20 2a 70 4e 6f 64 65 3b 0a 20 20  eNode *pNode;.  
3930: 70 4e 6f 64 65 20 3d 20 28 52 74 72 65 65 4e 6f  pNode = (RtreeNo
3940: 64 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  de *)sqlite3_mal
3950: 6c 6f 63 28 73 69 7a 65 6f 66 28 52 74 72 65 65  loc(sizeof(Rtree
3960: 4e 6f 64 65 29 20 2b 20 70 52 74 72 65 65 2d 3e  Node) + pRtree->
3970: 69 4e 6f 64 65 53 69 7a 65 29 3b 0a 20 20 69 66  iNodeSize);.  if
3980: 28 20 70 4e 6f 64 65 20 29 7b 0a 20 20 20 20 6d  ( pNode ){.    m
3990: 65 6d 73 65 74 28 70 4e 6f 64 65 2c 20 30 2c 20  emset(pNode, 0, 
39a0: 73 69 7a 65 6f 66 28 52 74 72 65 65 4e 6f 64 65  sizeof(RtreeNode
39b0: 29 20 2b 20 70 52 74 72 65 65 2d 3e 69 4e 6f 64  ) + pRtree->iNod
39c0: 65 53 69 7a 65 29 3b 0a 20 20 20 20 70 4e 6f 64  eSize);.    pNod
39d0: 65 2d 3e 7a 44 61 74 61 20 3d 20 28 75 38 20 2a  e->zData = (u8 *
39e0: 29 26 70 4e 6f 64 65 5b 31 5d 3b 0a 20 20 20 20  )&pNode[1];.    
39f0: 70 4e 6f 64 65 2d 3e 6e 52 65 66 20 3d 20 31 3b  pNode->nRef = 1;
3a00: 0a 20 20 20 20 70 4e 6f 64 65 2d 3e 70 50 61 72  .    pNode->pPar
3a10: 65 6e 74 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20  ent = pParent;. 
3a20: 20 20 20 70 4e 6f 64 65 2d 3e 69 73 44 69 72 74     pNode->isDirt
3a30: 79 20 3d 20 31 3b 0a 20 20 20 20 6e 6f 64 65 52  y = 1;.    nodeR
3a40: 65 66 65 72 65 6e 63 65 28 70 50 61 72 65 6e 74  eference(pParent
3a50: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
3a60: 70 4e 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pNode;.}../*.** 
3a70: 4f 62 74 61 69 6e 20 61 20 72 65 66 65 72 65 6e  Obtain a referen
3a80: 63 65 20 74 6f 20 61 6e 20 72 2d 74 72 65 65 20  ce to an r-tree 
3a90: 6e 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  node..*/.static 
3aa0: 69 6e 74 0a 6e 6f 64 65 41 63 71 75 69 72 65 28  int.nodeAcquire(
3ab0: 0a 20 20 52 74 72 65 65 20 2a 70 52 74 72 65 65  .  Rtree *pRtree
3ac0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
3ad0: 20 52 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   R-tree structur
3ae0: 65 20 2a 2f 0a 20 20 69 36 34 20 69 4e 6f 64 65  e */.  i64 iNode
3af0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3b00: 20 20 2f 2a 20 4e 6f 64 65 20 6e 75 6d 62 65 72    /* Node number
3b10: 20 74 6f 20 6c 6f 61 64 20 2a 2f 0a 20 20 52 74   to load */.  Rt
3b20: 72 65 65 4e 6f 64 65 20 2a 70 50 61 72 65 6e 74  reeNode *pParent
3b30: 2c 20 20 20 20 20 20 20 20 2f 2a 20 45 69 74 68  ,        /* Eith
3b40: 65 72 20 74 68 65 20 70 61 72 65 6e 74 20 6e 6f  er the parent no
3b50: 64 65 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  de or NULL */.  
3b60: 52 74 72 65 65 4e 6f 64 65 20 2a 2a 70 70 4e 6f  RtreeNode **ppNo
3b70: 64 65 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55  de         /* OU
3b80: 54 3a 20 41 63 71 75 69 72 65 64 20 6e 6f 64 65  T: Acquired node
3b90: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
3ba0: 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c  .  int rc2 = SQL
3bb0: 49 54 45 5f 4f 4b 3b 0a 20 20 52 74 72 65 65 4e  ITE_OK;.  RtreeN
3bc0: 6f 64 65 20 2a 70 4e 6f 64 65 3b 0a 0a 20 20 2f  ode *pNode;..  /
3bd0: 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 72  * Check if the r
3be0: 65 71 75 65 73 74 65 64 20 6e 6f 64 65 20 69 73  equested node is
3bf0: 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
3c00: 68 61 73 68 20 74 61 62 6c 65 2e 20 49 66 20 73  hash table. If s
3c10: 6f 2c 0a 20 20 2a 2a 20 69 6e 63 72 65 61 73 65  o,.  ** increase
3c20: 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63   its reference c
3c30: 6f 75 6e 74 20 61 6e 64 20 72 65 74 75 72 6e 20  ount and return 
3c40: 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  it..  */.  if( (
3c50: 70 4e 6f 64 65 20 3d 20 6e 6f 64 65 48 61 73 68  pNode = nodeHash
3c60: 4c 6f 6f 6b 75 70 28 70 52 74 72 65 65 2c 20 69  Lookup(pRtree, i
3c70: 4e 6f 64 65 29 29 20 29 7b 0a 20 20 20 20 61 73  Node)) ){.    as
3c80: 73 65 72 74 28 20 21 70 50 61 72 65 6e 74 20 7c  sert( !pParent |
3c90: 7c 20 21 70 4e 6f 64 65 2d 3e 70 50 61 72 65 6e  | !pNode->pParen
3ca0: 74 20 7c 7c 20 70 4e 6f 64 65 2d 3e 70 50 61 72  t || pNode->pPar
3cb0: 65 6e 74 3d 3d 70 50 61 72 65 6e 74 20 29 3b 0a  ent==pParent );.
3cc0: 20 20 20 20 69 66 28 20 70 50 61 72 65 6e 74 20      if( pParent 
3cd0: 26 26 20 21 70 4e 6f 64 65 2d 3e 70 50 61 72 65  && !pNode->pPare
3ce0: 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 6f 64 65  nt ){.      node
3cf0: 52 65 66 65 72 65 6e 63 65 28 70 50 61 72 65 6e  Reference(pParen
3d00: 74 29 3b 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d  t);.      pNode-
3d10: 3e 70 50 61 72 65 6e 74 20 3d 20 70 50 61 72 65  >pParent = pPare
3d20: 6e 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e  nt;.    }.    pN
3d30: 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  ode->nRef++;.   
3d40: 20 2a 70 70 4e 6f 64 65 20 3d 20 70 4e 6f 64 65   *ppNode = pNode
3d50: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
3d60: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 73  ITE_OK;.  }..  s
3d70: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
3d80: 34 28 70 52 74 72 65 65 2d 3e 70 52 65 61 64 4e  4(pRtree->pReadN
3d90: 6f 64 65 2c 20 31 2c 20 69 4e 6f 64 65 29 3b 0a  ode, 1, iNode);.
3da0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73    rc = sqlite3_s
3db0: 74 65 70 28 70 52 74 72 65 65 2d 3e 70 52 65 61  tep(pRtree->pRea
3dc0: 64 4e 6f 64 65 29 3b 0a 20 20 69 66 28 20 72 63  dNode);.  if( rc
3dd0: 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
3de0: 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a 42      const u8 *zB
3df0: 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  lob = sqlite3_co
3e00: 6c 75 6d 6e 5f 62 6c 6f 62 28 70 52 74 72 65 65  lumn_blob(pRtree
3e10: 2d 3e 70 52 65 61 64 4e 6f 64 65 2c 20 30 29 3b  ->pReadNode, 0);
3e20: 0a 20 20 20 20 69 66 28 20 70 52 74 72 65 65 2d  .    if( pRtree-
3e30: 3e 69 4e 6f 64 65 53 69 7a 65 3d 3d 73 71 6c 69  >iNodeSize==sqli
3e40: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73  te3_column_bytes
3e50: 28 70 52 74 72 65 65 2d 3e 70 52 65 61 64 4e 6f  (pRtree->pReadNo
3e60: 64 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  de, 0) ){.      
3e70: 70 4e 6f 64 65 20 3d 20 28 52 74 72 65 65 4e 6f  pNode = (RtreeNo
3e80: 64 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  de *)sqlite3_mal
3e90: 6c 6f 63 28 73 69 7a 65 6f 66 28 52 74 72 65 65  loc(sizeof(Rtree
3ea0: 4e 6f 64 65 29 2b 70 52 74 72 65 65 2d 3e 69 4e  Node)+pRtree->iN
3eb0: 6f 64 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  odeSize);.      
3ec0: 69 66 28 20 21 70 4e 6f 64 65 20 29 7b 0a 20 20  if( !pNode ){.  
3ed0: 20 20 20 20 20 20 72 63 32 20 3d 20 53 51 4c 49        rc2 = SQLI
3ee0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
3ef0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
3f00: 4e 6f 64 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20  Node->pParent = 
3f10: 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 20 20 20  pParent;.       
3f20: 20 70 4e 6f 64 65 2d 3e 7a 44 61 74 61 20 3d 20   pNode->zData = 
3f30: 28 75 38 20 2a 29 26 70 4e 6f 64 65 5b 31 5d 3b  (u8 *)&pNode[1];
3f40: 0a 20 20 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e  .        pNode->
3f50: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20  nRef = 1;.      
3f60: 20 20 70 4e 6f 64 65 2d 3e 69 4e 6f 64 65 20 3d    pNode->iNode =
3f70: 20 69 4e 6f 64 65 3b 0a 20 20 20 20 20 20 20 20   iNode;.        
3f80: 70 4e 6f 64 65 2d 3e 69 73 44 69 72 74 79 20 3d  pNode->isDirty =
3f90: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4e 6f 64   0;.        pNod
3fa0: 65 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  e->pNext = 0;.  
3fb0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4e 6f        memcpy(pNo
3fc0: 64 65 2d 3e 7a 44 61 74 61 2c 20 7a 42 6c 6f 62  de->zData, zBlob
3fd0: 2c 20 70 52 74 72 65 65 2d 3e 69 4e 6f 64 65 53  , pRtree->iNodeS
3fe0: 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 6e 6f  ize);.        no
3ff0: 64 65 52 65 66 65 72 65 6e 63 65 28 70 50 61 72  deReference(pPar
4000: 65 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ent);.      }.  
4010: 20 20 7d 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73    }.  }.  rc = s
4020: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 52 74  qlite3_reset(pRt
4030: 72 65 65 2d 3e 70 52 65 61 64 4e 6f 64 65 29 3b  ree->pReadNode);
4040: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
4050: 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b  E_OK ) rc = rc2;
4060: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 72 6f  ..  /* If the ro
4070: 6f 74 20 6e 6f 64 65 20 77 61 73 20 6a 75 73 74  ot node was just
4080: 20 6c 6f 61 64 65 64 2c 20 73 65 74 20 70 52 74   loaded, set pRt
4090: 72 65 65 2d 3e 69 44 65 70 74 68 20 74 6f 20 74  ree->iDepth to t
40a0: 68 65 20 68 65 69 67 68 74 0a 20 20 2a 2a 20 6f  he height.  ** o
40b0: 66 20 74 68 65 20 72 2d 74 72 65 65 20 73 74 72  f the r-tree str
40c0: 75 63 74 75 72 65 2e 20 41 20 68 65 69 67 68 74  ucture. A height
40d0: 20 6f 66 20 7a 65 72 6f 20 6d 65 61 6e 73 20 61   of zero means a
40e0: 6c 6c 20 64 61 74 61 20 69 73 20 73 74 6f 72 65  ll data is store
40f0: 64 20 6f 6e 0a 20 20 2a 2a 20 74 68 65 20 72 6f  d on.  ** the ro
4100: 6f 74 20 6e 6f 64 65 2e 20 41 20 68 65 69 67 68  ot node. A heigh
4110: 74 20 6f 66 20 6f 6e 65 20 6d 65 61 6e 73 20 74  t of one means t
4120: 68 65 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 74  he children of t
4130: 68 65 20 72 6f 6f 74 20 6e 6f 64 65 0a 20 20 2a  he root node.  *
4140: 2a 20 61 72 65 20 74 68 65 20 6c 65 61 76 65 73  * are the leaves
4150: 2c 20 61 6e 64 20 73 6f 20 6f 6e 2e 20 49 66 20  , and so on. If 
4160: 74 68 65 20 64 65 70 74 68 20 61 73 20 73 70 65  the depth as spe
4170: 63 69 66 69 65 64 20 6f 6e 20 74 68 65 20 72 6f  cified on the ro
4180: 6f 74 20 6e 6f 64 65 0a 20 20 2a 2a 20 69 73 20  ot node.  ** is 
4190: 67 72 65 61 74 65 72 20 74 68 61 6e 20 52 54 52  greater than RTR
41a0: 45 45 5f 4d 41 58 5f 44 45 50 54 48 2c 20 74 68  EE_MAX_DEPTH, th
41b0: 65 20 72 2d 74 72 65 65 20 73 74 72 75 63 74 75  e r-tree structu
41c0: 72 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  re must be corru
41d0: 70 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  pt..  */.  if( p
41e0: 4e 6f 64 65 20 26 26 20 69 4e 6f 64 65 3d 3d 31  Node && iNode==1
41f0: 20 29 7b 0a 20 20 20 20 70 52 74 72 65 65 2d 3e   ){.    pRtree->
4200: 69 44 65 70 74 68 20 3d 20 72 65 61 64 49 6e 74  iDepth = readInt
4210: 31 36 28 70 4e 6f 64 65 2d 3e 7a 44 61 74 61 29  16(pNode->zData)
4220: 3b 0a 20 20 20 20 69 66 28 20 70 52 74 72 65 65  ;.    if( pRtree
4230: 2d 3e 69 44 65 70 74 68 3e 52 54 52 45 45 5f 4d  ->iDepth>RTREE_M
4240: 41 58 5f 44 45 50 54 48 20 29 7b 0a 20 20 20 20  AX_DEPTH ){.    
4250: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
4260: 52 52 55 50 54 5f 56 54 41 42 3b 0a 20 20 20 20  RRUPT_VTAB;.    
4270: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e  }.  }..  /* If n
4280: 6f 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  o error has occu
4290: 72 72 65 64 20 73 6f 20 66 61 72 2c 20 63 68 65  rred so far, che
42a0: 63 6b 20 69 66 20 74 68 65 20 22 6e 75 6d 62 65  ck if the "numbe
42b0: 72 20 6f 66 20 65 6e 74 72 69 65 73 22 0a 20 20  r of entries".  
42c0: 2a 2a 20 66 69 65 6c 64 20 6f 6e 20 74 68 65 20  ** field on the 
42d0: 6e 6f 64 65 20 69 73 20 74 6f 6f 20 6c 61 72 67  node is too larg
42e0: 65 2e 20 49 66 20 73 6f 2c 20 73 65 74 20 74 68  e. If so, set th
42f0: 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f  e return code to
4300: 20 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 43 4f   .  ** SQLITE_CO
4310: 52 52 55 50 54 5f 56 54 41 42 2e 0a 20 20 2a 2f  RRUPT_VTAB..  */
4320: 0a 20 20 69 66 28 20 70 4e 6f 64 65 20 26 26 20  .  if( pNode && 
4330: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
4340: 0a 20 20 20 20 69 66 28 20 4e 43 45 4c 4c 28 70  .    if( NCELL(p
4350: 4e 6f 64 65 29 3e 28 28 70 52 74 72 65 65 2d 3e  Node)>((pRtree->
4360: 69 4e 6f 64 65 53 69 7a 65 2d 34 29 2f 70 52 74  iNodeSize-4)/pRt
4370: 72 65 65 2d 3e 6e 42 79 74 65 73 50 65 72 43 65  ree->nBytesPerCe
4380: 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ll) ){.      rc 
4390: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
43a0: 5f 56 54 41 42 3b 0a 20 20 20 20 7d 0a 20 20 7d  _VTAB;.    }.  }
43b0: 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
43c0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
43d0: 20 70 4e 6f 64 65 21 3d 30 20 29 7b 0a 20 20 20   pNode!=0 ){.   
43e0: 20 20 20 6e 6f 64 65 48 61 73 68 49 6e 73 65 72     nodeHashInser
43f0: 74 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65 29  t(pRtree, pNode)
4400: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
4410: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
4420: 4f 52 52 55 50 54 5f 56 54 41 42 3b 0a 20 20 20  ORRUPT_VTAB;.   
4430: 20 7d 0a 20 20 20 20 2a 70 70 4e 6f 64 65 20 3d   }.    *ppNode =
4440: 20 70 4e 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b   pNode;.  }else{
4450: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
4460: 65 28 70 4e 6f 64 65 29 3b 0a 20 20 20 20 2a 70  e(pNode);.    *p
4470: 70 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a  pNode = 0;.  }..
4480: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
4490: 2f 2a 0a 2a 2a 20 4f 76 65 72 77 72 69 74 65 20  /*.** Overwrite 
44a0: 63 65 6c 6c 20 69 43 65 6c 6c 20 6f 66 20 6e 6f  cell iCell of no
44b0: 64 65 20 70 4e 6f 64 65 20 77 69 74 68 20 74 68  de pNode with th
44c0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 43  e contents of pC
44d0: 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ell..*/.static v
44e0: 6f 69 64 20 6e 6f 64 65 4f 76 65 72 77 72 69 74  oid nodeOverwrit
44f0: 65 43 65 6c 6c 28 0a 20 20 52 74 72 65 65 20 2a  eCell(.  Rtree *
4500: 70 52 74 72 65 65 2c 20 0a 20 20 52 74 72 65 65  pRtree, .  Rtree
4510: 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 20 20 0a 20  Node *pNode,  . 
4520: 20 52 74 72 65 65 43 65 6c 6c 20 2a 70 43 65 6c   RtreeCell *pCel
4530: 6c 2c 20 0a 20 20 69 6e 74 20 69 43 65 6c 6c 0a  l, .  int iCell.
4540: 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 75  ){.  int ii;.  u
4550: 38 20 2a 70 20 3d 20 26 70 4e 6f 64 65 2d 3e 7a  8 *p = &pNode->z
4560: 44 61 74 61 5b 34 20 2b 20 70 52 74 72 65 65 2d  Data[4 + pRtree-
4570: 3e 6e 42 79 74 65 73 50 65 72 43 65 6c 6c 2a 69  >nBytesPerCell*i
4580: 43 65 6c 6c 5d 3b 0a 20 20 70 20 2b 3d 20 77 72  Cell];.  p += wr
4590: 69 74 65 49 6e 74 36 34 28 70 2c 20 70 43 65 6c  iteInt64(p, pCel
45a0: 6c 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 66 6f  l->iRowid);.  fo
45b0: 72 28 69 69 3d 30 3b 20 69 69 3c 28 70 52 74 72  r(ii=0; ii<(pRtr
45c0: 65 65 2d 3e 6e 44 69 6d 2a 32 29 3b 20 69 69 2b  ee->nDim*2); ii+
45d0: 2b 29 7b 0a 20 20 20 20 70 20 2b 3d 20 77 72 69  +){.    p += wri
45e0: 74 65 43 6f 6f 72 64 28 70 2c 20 26 70 43 65 6c  teCoord(p, &pCel
45f0: 6c 2d 3e 61 43 6f 6f 72 64 5b 69 69 5d 29 3b 0a  l->aCoord[ii]);.
4600: 20 20 7d 0a 20 20 70 4e 6f 64 65 2d 3e 69 73 44    }.  pNode->isD
4610: 69 72 74 79 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  irty = 1;.}../*.
4620: 2a 2a 20 52 65 6d 6f 76 65 20 63 65 6c 6c 20 74  ** Remove cell t
4630: 68 65 20 63 65 6c 6c 20 77 69 74 68 20 69 6e 64  he cell with ind
4640: 65 78 20 69 43 65 6c 6c 20 66 72 6f 6d 20 6e 6f  ex iCell from no
4650: 64 65 20 70 4e 6f 64 65 2e 0a 2a 2f 0a 73 74 61  de pNode..*/.sta
4660: 74 69 63 20 76 6f 69 64 20 6e 6f 64 65 44 65 6c  tic void nodeDel
4670: 65 74 65 43 65 6c 6c 28 52 74 72 65 65 20 2a 70  eteCell(Rtree *p
4680: 52 74 72 65 65 2c 20 52 74 72 65 65 4e 6f 64 65  Rtree, RtreeNode
4690: 20 2a 70 4e 6f 64 65 2c 20 69 6e 74 20 69 43 65   *pNode, int iCe
46a0: 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 44 73 74 20  ll){.  u8 *pDst 
46b0: 3d 20 26 70 4e 6f 64 65 2d 3e 7a 44 61 74 61 5b  = &pNode->zData[
46c0: 34 20 2b 20 70 52 74 72 65 65 2d 3e 6e 42 79 74  4 + pRtree->nByt
46d0: 65 73 50 65 72 43 65 6c 6c 2a 69 43 65 6c 6c 5d  esPerCell*iCell]
46e0: 3b 0a 20 20 75 38 20 2a 70 53 72 63 20 3d 20 26  ;.  u8 *pSrc = &
46f0: 70 44 73 74 5b 70 52 74 72 65 65 2d 3e 6e 42 79  pDst[pRtree->nBy
4700: 74 65 73 50 65 72 43 65 6c 6c 5d 3b 0a 20 20 69  tesPerCell];.  i
4710: 6e 74 20 6e 42 79 74 65 20 3d 20 28 4e 43 45 4c  nt nByte = (NCEL
4720: 4c 28 70 4e 6f 64 65 29 20 2d 20 69 43 65 6c 6c  L(pNode) - iCell
4730: 20 2d 20 31 29 20 2a 20 70 52 74 72 65 65 2d 3e   - 1) * pRtree->
4740: 6e 42 79 74 65 73 50 65 72 43 65 6c 6c 3b 0a 20  nBytesPerCell;. 
4750: 20 6d 65 6d 6d 6f 76 65 28 70 44 73 74 2c 20 70   memmove(pDst, p
4760: 53 72 63 2c 20 6e 42 79 74 65 29 3b 0a 20 20 77  Src, nByte);.  w
4770: 72 69 74 65 49 6e 74 31 36 28 26 70 4e 6f 64 65  riteInt16(&pNode
4780: 2d 3e 7a 44 61 74 61 5b 32 5d 2c 20 4e 43 45 4c  ->zData[2], NCEL
4790: 4c 28 70 4e 6f 64 65 29 2d 31 29 3b 0a 20 20 70  L(pNode)-1);.  p
47a0: 4e 6f 64 65 2d 3e 69 73 44 69 72 74 79 20 3d 20  Node->isDirty = 
47b0: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65  1;.}../*.** Inse
47c0: 72 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  rt the contents 
47d0: 6f 66 20 63 65 6c 6c 20 70 43 65 6c 6c 20 69 6e  of cell pCell in
47e0: 74 6f 20 6e 6f 64 65 20 70 4e 6f 64 65 2e 20 49  to node pNode. I
47f0: 66 20 74 68 65 20 69 6e 73 65 72 74 0a 2a 2a 20  f the insert.** 
4800: 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72  is successful, r
4810: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
4820: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
4830: 69 73 20 6e 6f 74 20 65 6e 6f 75 67 68 20 66 72  is not enough fr
4840: 65 65 20 73 70 61 63 65 20 69 6e 20 70 4e 6f 64  ee space in pNod
4850: 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  e, return SQLITE
4860: 5f 46 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63  _FULL..*/.static
4870: 20 69 6e 74 0a 6e 6f 64 65 49 6e 73 65 72 74 43   int.nodeInsertC
4880: 65 6c 6c 28 0a 20 20 52 74 72 65 65 20 2a 70 52  ell(.  Rtree *pR
4890: 74 72 65 65 2c 20 0a 20 20 52 74 72 65 65 4e 6f  tree, .  RtreeNo
48a0: 64 65 20 2a 70 4e 6f 64 65 2c 20 0a 20 20 52 74  de *pNode, .  Rt
48b0: 72 65 65 43 65 6c 6c 20 2a 70 43 65 6c 6c 20 0a  reeCell *pCell .
48c0: 29 7b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20  ){.  int nCell; 
48d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48e0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6e 75     /* Current nu
48f0: 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e  mber of cells in
4900: 20 70 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20   pNode */.  int 
4910: 6e 4d 61 78 43 65 6c 6c 3b 20 20 20 20 20 20 20  nMaxCell;       
4920: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
4930: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63  imum number of c
4940: 65 6c 6c 73 20 66 6f 72 20 70 4e 6f 64 65 20 2a  ells for pNode *
4950: 2f 0a 0a 20 20 6e 4d 61 78 43 65 6c 6c 20 3d 20  /..  nMaxCell = 
4960: 28 70 52 74 72 65 65 2d 3e 69 4e 6f 64 65 53 69  (pRtree->iNodeSi
4970: 7a 65 2d 34 29 2f 70 52 74 72 65 65 2d 3e 6e 42  ze-4)/pRtree->nB
4980: 79 74 65 73 50 65 72 43 65 6c 6c 3b 0a 20 20 6e  ytesPerCell;.  n
4990: 43 65 6c 6c 20 3d 20 4e 43 45 4c 4c 28 70 4e 6f  Cell = NCELL(pNo
49a0: 64 65 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  de);..  assert( 
49b0: 6e 43 65 6c 6c 3c 3d 6e 4d 61 78 43 65 6c 6c 20  nCell<=nMaxCell 
49c0: 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c 3c 6e  );.  if( nCell<n
49d0: 4d 61 78 43 65 6c 6c 20 29 7b 0a 20 20 20 20 6e  MaxCell ){.    n
49e0: 6f 64 65 4f 76 65 72 77 72 69 74 65 43 65 6c 6c  odeOverwriteCell
49f0: 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65 2c 20  (pRtree, pNode, 
4a00: 70 43 65 6c 6c 2c 20 6e 43 65 6c 6c 29 3b 0a 20  pCell, nCell);. 
4a10: 20 20 20 77 72 69 74 65 49 6e 74 31 36 28 26 70     writeInt16(&p
4a20: 4e 6f 64 65 2d 3e 7a 44 61 74 61 5b 32 5d 2c 20  Node->zData[2], 
4a30: 6e 43 65 6c 6c 2b 31 29 3b 0a 20 20 20 20 70 4e  nCell+1);.    pN
4a40: 6f 64 65 2d 3e 69 73 44 69 72 74 79 20 3d 20 31  ode->isDirty = 1
4a50: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
4a60: 28 6e 43 65 6c 6c 3d 3d 6e 4d 61 78 43 65 6c 6c  (nCell==nMaxCell
4a70: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  );.}../*.** If t
4a80: 68 65 20 6e 6f 64 65 20 69 73 20 64 69 72 74 79  he node is dirty
4a90: 2c 20 77 72 69 74 65 20 69 74 20 6f 75 74 20 74  , write it out t
4aa0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  o the database..
4ab0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 6e 6f  */.static int.no
4ac0: 64 65 57 72 69 74 65 28 52 74 72 65 65 20 2a 70  deWrite(Rtree *p
4ad0: 52 74 72 65 65 2c 20 52 74 72 65 65 4e 6f 64 65  Rtree, RtreeNode
4ae0: 20 2a 70 4e 6f 64 65 29 7b 0a 20 20 69 6e 74 20   *pNode){.  int 
4af0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
4b00: 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 69 73 44    if( pNode->isD
4b10: 69 72 74 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  irty ){.    sqli
4b20: 74 65 33 5f 73 74 6d 74 20 2a 70 20 3d 20 70 52  te3_stmt *p = pR
4b30: 74 72 65 65 2d 3e 70 57 72 69 74 65 4e 6f 64 65  tree->pWriteNode
4b40: 3b 0a 20 20 20 20 69 66 28 20 70 4e 6f 64 65 2d  ;.    if( pNode-
4b50: 3e 69 4e 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  >iNode ){.      
4b60: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
4b70: 36 34 28 70 2c 20 31 2c 20 70 4e 6f 64 65 2d 3e  64(p, 1, pNode->
4b80: 69 4e 6f 64 65 29 3b 0a 20 20 20 20 7d 65 6c 73  iNode);.    }els
4b90: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
4ba0: 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 2c 20 31 29  _bind_null(p, 1)
4bb0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
4bc0: 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 2c  te3_bind_blob(p,
4bd0: 20 32 2c 20 70 4e 6f 64 65 2d 3e 7a 44 61 74 61   2, pNode->zData
4be0: 2c 20 70 52 74 72 65 65 2d 3e 69 4e 6f 64 65 53  , pRtree->iNodeS
4bf0: 69 7a 65 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  ize, SQLITE_STAT
4c00: 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  IC);.    sqlite3
4c10: 5f 73 74 65 70 28 70 29 3b 0a 20 20 20 20 70 4e  _step(p);.    pN
4c20: 6f 64 65 2d 3e 69 73 44 69 72 74 79 20 3d 20 30  ode->isDirty = 0
4c30: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
4c40: 65 33 5f 72 65 73 65 74 28 70 29 3b 0a 20 20 20  e3_reset(p);.   
4c50: 20 69 66 28 20 70 4e 6f 64 65 2d 3e 69 4e 6f 64   if( pNode->iNod
4c60: 65 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49  e==0 && rc==SQLI
4c70: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
4c80: 4e 6f 64 65 2d 3e 69 4e 6f 64 65 20 3d 20 73 71  Node->iNode = sq
4c90: 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72  lite3_last_inser
4ca0: 74 5f 72 6f 77 69 64 28 70 52 74 72 65 65 2d 3e  t_rowid(pRtree->
4cb0: 64 62 29 3b 0a 20 20 20 20 20 20 6e 6f 64 65 48  db);.      nodeH
4cc0: 61 73 68 49 6e 73 65 72 74 28 70 52 74 72 65 65  ashInsert(pRtree
4cd0: 2c 20 70 4e 6f 64 65 29 3b 0a 20 20 20 20 7d 0a  , pNode);.    }.
4ce0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
4cf0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
4d00: 65 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  e a reference to
4d10: 20 61 20 6e 6f 64 65 2e 20 49 66 20 74 68 65 20   a node. If the 
4d20: 6e 6f 64 65 20 69 73 20 64 69 72 74 79 20 61 6e  node is dirty an
4d30: 64 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 0a  d the reference.
4d40: 2a 2a 20 63 6f 75 6e 74 20 64 72 6f 70 73 20 74  ** count drops t
4d50: 6f 20 7a 65 72 6f 2c 20 74 68 65 20 6e 6f 64 65  o zero, the node
4d60: 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e   data is written
4d70: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
4d80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a  ..*/.static int.
4d90: 6e 6f 64 65 52 65 6c 65 61 73 65 28 52 74 72 65  nodeRelease(Rtre
4da0: 65 20 2a 70 52 74 72 65 65 2c 20 52 74 72 65 65  e *pRtree, Rtree
4db0: 4e 6f 64 65 20 2a 70 4e 6f 64 65 29 7b 0a 20 20  Node *pNode){.  
4dc0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
4dd0: 4f 4b 3b 0a 20 20 69 66 28 20 70 4e 6f 64 65 20  OK;.  if( pNode 
4de0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
4df0: 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a  Node->nRef>0 );.
4e00: 20 20 20 20 70 4e 6f 64 65 2d 3e 6e 52 65 66 2d      pNode->nRef-
4e10: 2d 3b 0a 20 20 20 20 69 66 28 20 70 4e 6f 64 65  -;.    if( pNode
4e20: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
4e30: 20 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 69 4e     if( pNode->iN
4e40: 6f 64 65 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  ode==1 ){.      
4e50: 20 20 70 52 74 72 65 65 2d 3e 69 44 65 70 74 68    pRtree->iDepth
4e60: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20   = -1;.      }. 
4e70: 20 20 20 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e       if( pNode->
4e80: 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 20  pParent ){.     
4e90: 20 20 20 72 63 20 3d 20 6e 6f 64 65 52 65 6c 65     rc = nodeRele
4ea0: 61 73 65 28 70 52 74 72 65 65 2c 20 70 4e 6f 64  ase(pRtree, pNod
4eb0: 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 20  e->pParent);.   
4ec0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
4ed0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
4ee0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e 6f 64          rc = nod
4ef0: 65 57 72 69 74 65 28 70 52 74 72 65 65 2c 20 70  eWrite(pRtree, p
4f00: 4e 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Node);.      }. 
4f10: 20 20 20 20 20 6e 6f 64 65 48 61 73 68 44 65 6c       nodeHashDel
4f20: 65 74 65 28 70 52 74 72 65 65 2c 20 70 4e 6f 64  ete(pRtree, pNod
4f30: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
4f40: 33 5f 66 72 65 65 28 70 4e 6f 64 65 29 3b 0a 20  3_free(pNode);. 
4f50: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
4f60: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
4f70: 65 74 75 72 6e 20 74 68 65 20 36 34 2d 62 69 74  eturn the 64-bit
4f80: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 61   integer value a
4f90: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63  ssociated with c
4fa0: 65 6c 6c 20 69 43 65 6c 6c 20 6f 66 0a 2a 2a 20  ell iCell of.** 
4fb0: 6e 6f 64 65 20 70 4e 6f 64 65 2e 20 49 66 20 70  node pNode. If p
4fc0: 4e 6f 64 65 20 69 73 20 61 20 6c 65 61 66 20 6e  Node is a leaf n
4fd0: 6f 64 65 2c 20 74 68 69 73 20 69 73 20 61 20 72  ode, this is a r
4fe0: 6f 77 69 64 2e 20 49 66 20 69 74 20 69 73 0a 2a  owid. If it is.*
4ff0: 2a 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 6e 6f  * an internal no
5000: 64 65 2c 20 74 68 65 6e 20 74 68 65 20 36 34 2d  de, then the 64-
5010: 62 69 74 20 69 6e 74 65 67 65 72 20 69 73 20 61  bit integer is a
5020: 20 63 68 69 6c 64 20 70 61 67 65 20 6e 75 6d 62   child page numb
5030: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36  er..*/.static i6
5040: 34 20 6e 6f 64 65 47 65 74 52 6f 77 69 64 28 0a  4 nodeGetRowid(.
5050: 20 20 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c    Rtree *pRtree,
5060: 20 0a 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70   .  RtreeNode *p
5070: 4e 6f 64 65 2c 20 0a 20 20 69 6e 74 20 69 43 65  Node, .  int iCe
5080: 6c 6c 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ll.){.  assert( 
5090: 69 43 65 6c 6c 3c 4e 43 45 4c 4c 28 70 4e 6f 64  iCell<NCELL(pNod
50a0: 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e) );.  return r
50b0: 65 61 64 49 6e 74 36 34 28 26 70 4e 6f 64 65 2d  eadInt64(&pNode-
50c0: 3e 7a 44 61 74 61 5b 34 20 2b 20 70 52 74 72 65  >zData[4 + pRtre
50d0: 65 2d 3e 6e 42 79 74 65 73 50 65 72 43 65 6c 6c  e->nBytesPerCell
50e0: 2a 69 43 65 6c 6c 5d 29 3b 0a 7d 0a 0a 2f 2a 0a  *iCell]);.}../*.
50f0: 2a 2a 20 52 65 74 75 72 6e 20 63 6f 6f 72 64 69  ** Return coordi
5100: 6e 61 74 65 20 69 43 6f 6f 72 64 20 66 72 6f 6d  nate iCoord from
5110: 20 63 65 6c 6c 20 69 43 65 6c 6c 20 69 6e 20 6e   cell iCell in n
5120: 6f 64 65 20 70 4e 6f 64 65 2e 0a 2a 2f 0a 73 74  ode pNode..*/.st
5130: 61 74 69 63 20 76 6f 69 64 20 6e 6f 64 65 47 65  atic void nodeGe
5140: 74 43 6f 6f 72 64 28 0a 20 20 52 74 72 65 65 20  tCoord(.  Rtree 
5150: 2a 70 52 74 72 65 65 2c 20 0a 20 20 52 74 72 65  *pRtree, .  Rtre
5160: 65 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 20 0a 20  eNode *pNode, . 
5170: 20 69 6e 74 20 69 43 65 6c 6c 2c 0a 20 20 69 6e   int iCell,.  in
5180: 74 20 69 43 6f 6f 72 64 2c 0a 20 20 52 74 72 65  t iCoord,.  Rtre
5190: 65 43 6f 6f 72 64 20 2a 70 43 6f 6f 72 64 20 20  eCoord *pCoord  
51a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
51b0: 65 20 74 6f 20 77 72 69 74 65 20 72 65 73 75 6c  e to write resul
51c0: 74 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 72 65 61  t to */.){.  rea
51d0: 64 43 6f 6f 72 64 28 26 70 4e 6f 64 65 2d 3e 7a  dCoord(&pNode->z
51e0: 44 61 74 61 5b 31 32 20 2b 20 70 52 74 72 65 65  Data[12 + pRtree
51f0: 2d 3e 6e 42 79 74 65 73 50 65 72 43 65 6c 6c 2a  ->nBytesPerCell*
5200: 69 43 65 6c 6c 20 2b 20 34 2a 69 43 6f 6f 72 64  iCell + 4*iCoord
5210: 5d 2c 20 70 43 6f 6f 72 64 29 3b 0a 7d 0a 0a 2f  ], pCoord);.}../
5220: 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65  *.** Deserialize
5230: 20 63 65 6c 6c 20 69 43 65 6c 6c 20 6f 66 20 6e   cell iCell of n
5240: 6f 64 65 20 70 4e 6f 64 65 2e 20 50 6f 70 75 6c  ode pNode. Popul
5250: 61 74 65 20 74 68 65 20 73 74 72 75 63 74 75 72  ate the structur
5260: 65 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20  e pointed.** to 
5270: 62 79 20 70 43 65 6c 6c 20 77 69 74 68 20 74 68  by pCell with th
5280: 65 20 72 65 73 75 6c 74 73 2e 0a 2a 2f 0a 73 74  e results..*/.st
5290: 61 74 69 63 20 76 6f 69 64 20 6e 6f 64 65 47 65  atic void nodeGe
52a0: 74 43 65 6c 6c 28 0a 20 20 52 74 72 65 65 20 2a  tCell(.  Rtree *
52b0: 70 52 74 72 65 65 2c 20 0a 20 20 52 74 72 65 65  pRtree, .  Rtree
52c0: 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 20 0a 20 20  Node *pNode, .  
52d0: 69 6e 74 20 69 43 65 6c 6c 2c 0a 20 20 52 74 72  int iCell,.  Rtr
52e0: 65 65 43 65 6c 6c 20 2a 70 43 65 6c 6c 0a 29 7b  eeCell *pCell.){
52f0: 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 70 43 65  .  int ii;.  pCe
5300: 6c 6c 2d 3e 69 52 6f 77 69 64 20 3d 20 6e 6f 64  ll->iRowid = nod
5310: 65 47 65 74 52 6f 77 69 64 28 70 52 74 72 65 65  eGetRowid(pRtree
5320: 2c 20 70 4e 6f 64 65 2c 20 69 43 65 6c 6c 29 3b  , pNode, iCell);
5330: 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
5340: 70 52 74 72 65 65 2d 3e 6e 44 69 6d 2a 32 3b 20  pRtree->nDim*2; 
5350: 69 69 2b 2b 29 7b 0a 20 20 20 20 6e 6f 64 65 47  ii++){.    nodeG
5360: 65 74 43 6f 6f 72 64 28 70 52 74 72 65 65 2c 20  etCoord(pRtree, 
5370: 70 4e 6f 64 65 2c 20 69 43 65 6c 6c 2c 20 69 69  pNode, iCell, ii
5380: 2c 20 26 70 43 65 6c 6c 2d 3e 61 43 6f 6f 72 64  , &pCell->aCoord
5390: 5b 69 69 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  [ii]);.  }.}.../
53a0: 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
53b0: 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 66 75  ation for the fu
53c0: 6e 63 74 69 6f 6e 20 74 68 61 74 20 64 6f 65 73  nction that does
53d0: 20 74 68 65 20 77 6f 72 6b 20 6f 66 0a 2a 2a 20   the work of.** 
53e0: 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
53f0: 65 20 6d 6f 64 75 6c 65 20 78 43 72 65 61 74 65  e module xCreate
5400: 28 29 20 61 6e 64 20 78 43 6f 6e 6e 65 63 74 28  () and xConnect(
5410: 29 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74  ) methods..*/.st
5420: 61 74 69 63 20 69 6e 74 20 72 74 72 65 65 49 6e  atic int rtreeIn
5430: 69 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 2c  it(.  sqlite3 *,
5440: 20 76 6f 69 64 20 2a 2c 20 69 6e 74 2c 20 63 6f   void *, int, co
5450: 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 2a  nst char *const*
5460: 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a  , sqlite3_vtab *
5470: 2a 2c 20 63 68 61 72 20 2a 2a 2c 20 69 6e 74 0a  *, char **, int.
5480: 29 3b 0a 0a 2f 2a 20 0a 2a 2a 20 52 74 72 65 65  );../* .** Rtree
5490: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d   virtual table m
54a0: 6f 64 75 6c 65 20 78 43 72 65 61 74 65 20 6d 65  odule xCreate me
54b0: 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  thod..*/.static 
54c0: 69 6e 74 20 72 74 72 65 65 43 72 65 61 74 65 28  int rtreeCreate(
54d0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
54e0: 20 20 76 6f 69 64 20 2a 70 41 75 78 2c 0a 20 20    void *pAux,.  
54f0: 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73 74 20  int argc, const 
5500: 63 68 61 72 20 2a 63 6f 6e 73 74 2a 61 72 67 76  char *const*argv
5510: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  ,.  sqlite3_vtab
5520: 20 2a 2a 70 70 56 74 61 62 2c 0a 20 20 63 68 61   **ppVtab,.  cha
5530: 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 72  r **pzErr.){.  r
5540: 65 74 75 72 6e 20 72 74 72 65 65 49 6e 69 74 28  eturn rtreeInit(
5550: 64 62 2c 20 70 41 75 78 2c 20 61 72 67 63 2c 20  db, pAux, argc, 
5560: 61 72 67 76 2c 20 70 70 56 74 61 62 2c 20 70 7a  argv, ppVtab, pz
5570: 45 72 72 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 20 0a  Err, 1);.}../* .
5580: 2a 2a 20 52 74 72 65 65 20 76 69 72 74 75 61 6c  ** Rtree virtual
5590: 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78 43   table module xC
55a0: 6f 6e 6e 65 63 74 20 6d 65 74 68 6f 64 2e 0a 2a  onnect method..*
55b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 74 72  /.static int rtr
55c0: 65 65 43 6f 6e 6e 65 63 74 28 0a 20 20 73 71 6c  eeConnect(.  sql
55d0: 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69 64  ite3 *db,.  void
55e0: 20 2a 70 41 75 78 2c 0a 20 20 69 6e 74 20 61 72   *pAux,.  int ar
55f0: 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  gc, const char *
5600: 63 6f 6e 73 74 2a 61 72 67 76 2c 0a 20 20 73 71  const*argv,.  sq
5610: 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a 70 70 56  lite3_vtab **ppV
5620: 74 61 62 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a  tab,.  char **pz
5630: 45 72 72 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20  Err.){.  return 
5640: 72 74 72 65 65 49 6e 69 74 28 64 62 2c 20 70 41  rtreeInit(db, pA
5650: 75 78 2c 20 61 72 67 63 2c 20 61 72 67 76 2c 20  ux, argc, argv, 
5660: 70 70 56 74 61 62 2c 20 70 7a 45 72 72 2c 20 30  ppVtab, pzErr, 0
5670: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72  );.}../*.** Incr
5680: 65 6d 65 6e 74 20 74 68 65 20 72 2d 74 72 65 65  ement the r-tree
5690: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
56a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
56b0: 20 72 74 72 65 65 52 65 66 65 72 65 6e 63 65 28   rtreeReference(
56c0: 52 74 72 65 65 20 2a 70 52 74 72 65 65 29 7b 0a  Rtree *pRtree){.
56d0: 20 20 70 52 74 72 65 65 2d 3e 6e 42 75 73 79 2b    pRtree->nBusy+
56e0: 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72  +;.}../*.** Decr
56f0: 65 6d 65 6e 74 20 74 68 65 20 72 2d 74 72 65 65  ement the r-tree
5700: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
5710: 2e 20 57 68 65 6e 20 74 68 65 20 72 65 66 65 72  . When the refer
5720: 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63 68  ence count reach
5730: 65 73 0a 2a 2a 20 7a 65 72 6f 20 74 68 65 20 73  es.** zero the s
5740: 74 72 75 63 74 75 72 65 20 69 73 20 64 65 6c 65  tructure is dele
5750: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ted..*/.static v
5760: 6f 69 64 20 72 74 72 65 65 52 65 6c 65 61 73 65  oid rtreeRelease
5770: 28 52 74 72 65 65 20 2a 70 52 74 72 65 65 29 7b  (Rtree *pRtree){
5780: 0a 20 20 70 52 74 72 65 65 2d 3e 6e 42 75 73 79  .  pRtree->nBusy
5790: 2d 2d 3b 0a 20 20 69 66 28 20 70 52 74 72 65 65  --;.  if( pRtree
57a0: 2d 3e 6e 42 75 73 79 3d 3d 30 20 29 7b 0a 20 20  ->nBusy==0 ){.  
57b0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
57c0: 7a 65 28 70 52 74 72 65 65 2d 3e 70 52 65 61 64  ze(pRtree->pRead
57d0: 4e 6f 64 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Node);.    sqlit
57e0: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 52 74 72  e3_finalize(pRtr
57f0: 65 65 2d 3e 70 57 72 69 74 65 4e 6f 64 65 29 3b  ee->pWriteNode);
5800: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
5810: 61 6c 69 7a 65 28 70 52 74 72 65 65 2d 3e 70 44  alize(pRtree->pD
5820: 65 6c 65 74 65 4e 6f 64 65 29 3b 0a 20 20 20 20  eleteNode);.    
5830: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
5840: 28 70 52 74 72 65 65 2d 3e 70 52 65 61 64 52 6f  (pRtree->pReadRo
5850: 77 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  wid);.    sqlite
5860: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 52 74 72 65  3_finalize(pRtre
5870: 65 2d 3e 70 57 72 69 74 65 52 6f 77 69 64 29 3b  e->pWriteRowid);
5880: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
5890: 61 6c 69 7a 65 28 70 52 74 72 65 65 2d 3e 70 44  alize(pRtree->pD
58a0: 65 6c 65 74 65 52 6f 77 69 64 29 3b 0a 20 20 20  eleteRowid);.   
58b0: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
58c0: 65 28 70 52 74 72 65 65 2d 3e 70 52 65 61 64 50  e(pRtree->pReadP
58d0: 61 72 65 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69  arent);.    sqli
58e0: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 52 74  te3_finalize(pRt
58f0: 72 65 65 2d 3e 70 57 72 69 74 65 50 61 72 65 6e  ree->pWriteParen
5900: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
5910: 66 69 6e 61 6c 69 7a 65 28 70 52 74 72 65 65 2d  finalize(pRtree-
5920: 3e 70 44 65 6c 65 74 65 50 61 72 65 6e 74 29 3b  >pDeleteParent);
5930: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
5940: 65 28 70 52 74 72 65 65 29 3b 0a 20 20 7d 0a 7d  e(pRtree);.  }.}
5950: 0a 0a 2f 2a 20 0a 2a 2a 20 52 74 72 65 65 20 76  ../* .** Rtree v
5960: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64  irtual table mod
5970: 75 6c 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 20  ule xDisconnect 
5980: 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69  method..*/.stati
5990: 63 20 69 6e 74 20 72 74 72 65 65 44 69 73 63 6f  c int rtreeDisco
59a0: 6e 6e 65 63 74 28 73 71 6c 69 74 65 33 5f 76 74  nnect(sqlite3_vt
59b0: 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 72 74  ab *pVtab){.  rt
59c0: 72 65 65 52 65 6c 65 61 73 65 28 28 52 74 72 65  reeRelease((Rtre
59d0: 65 20 2a 29 70 56 74 61 62 29 3b 0a 20 20 72 65  e *)pVtab);.  re
59e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
59f0: 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 74 72 65 65 20  }../* .** Rtree 
5a00: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f  virtual table mo
5a10: 64 75 6c 65 20 78 44 65 73 74 72 6f 79 20 6d 65  dule xDestroy me
5a20: 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  thod..*/.static 
5a30: 69 6e 74 20 72 74 72 65 65 44 65 73 74 72 6f 79  int rtreeDestroy
5a40: 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70  (sqlite3_vtab *p
5a50: 56 74 61 62 29 7b 0a 20 20 52 74 72 65 65 20 2a  Vtab){.  Rtree *
5a60: 70 52 74 72 65 65 20 3d 20 28 52 74 72 65 65 20  pRtree = (Rtree 
5a70: 2a 29 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 72  *)pVtab;.  int r
5a80: 63 3b 0a 20 20 63 68 61 72 20 2a 7a 43 72 65 61  c;.  char *zCrea
5a90: 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  te = sqlite3_mpr
5aa0: 69 6e 74 66 28 0a 20 20 20 20 22 44 52 4f 50 20  intf(.    "DROP 
5ab0: 54 41 42 4c 45 20 27 25 71 27 2e 27 25 71 5f 6e  TABLE '%q'.'%q_n
5ac0: 6f 64 65 27 3b 22 0a 20 20 20 20 22 44 52 4f 50  ode';".    "DROP
5ad0: 20 54 41 42 4c 45 20 27 25 71 27 2e 27 25 71 5f   TABLE '%q'.'%q_
5ae0: 72 6f 77 69 64 27 3b 22 0a 20 20 20 20 22 44 52  rowid';".    "DR
5af0: 4f 50 20 54 41 42 4c 45 20 27 25 71 27 2e 27 25  OP TABLE '%q'.'%
5b00: 71 5f 70 61 72 65 6e 74 27 3b 22 2c 0a 20 20 20  q_parent';",.   
5b10: 20 70 52 74 72 65 65 2d 3e 7a 44 62 2c 20 70 52   pRtree->zDb, pR
5b20: 74 72 65 65 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20  tree->zName, .  
5b30: 20 20 70 52 74 72 65 65 2d 3e 7a 44 62 2c 20 70    pRtree->zDb, p
5b40: 52 74 72 65 65 2d 3e 7a 4e 61 6d 65 2c 0a 20 20  Rtree->zName,.  
5b50: 20 20 70 52 74 72 65 65 2d 3e 7a 44 62 2c 20 70    pRtree->zDb, p
5b60: 52 74 72 65 65 2d 3e 7a 4e 61 6d 65 0a 20 20 29  Rtree->zName.  )
5b70: 3b 0a 20 20 69 66 28 20 21 7a 43 72 65 61 74 65  ;.  if( !zCreate
5b80: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
5b90: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c  ITE_NOMEM;.  }el
5ba0: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  se{.    rc = sql
5bb0: 69 74 65 33 5f 65 78 65 63 28 70 52 74 72 65 65  ite3_exec(pRtree
5bc0: 2d 3e 64 62 2c 20 7a 43 72 65 61 74 65 2c 20 30  ->db, zCreate, 0
5bd0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
5be0: 69 74 65 33 5f 66 72 65 65 28 7a 43 72 65 61 74  ite3_free(zCreat
5bf0: 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  e);.  }.  if( rc
5c00: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
5c10: 20 20 20 72 74 72 65 65 52 65 6c 65 61 73 65 28     rtreeRelease(
5c20: 70 52 74 72 65 65 29 3b 0a 20 20 7d 0a 0a 20 20  pRtree);.  }..  
5c30: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
5c40: 20 0a 2a 2a 20 52 74 72 65 65 20 76 69 72 74 75   .** Rtree virtu
5c50: 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20  al table module 
5c60: 78 4f 70 65 6e 20 6d 65 74 68 6f 64 2e 0a 2a 2f  xOpen method..*/
5c70: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 74 72 65  .static int rtre
5c80: 65 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 74  eOpen(sqlite3_vt
5c90: 61 62 20 2a 70 56 54 61 62 2c 20 73 71 6c 69 74  ab *pVTab, sqlit
5ca0: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
5cb0: 2a 70 70 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e  *ppCursor){.  in
5cc0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  t rc = SQLITE_NO
5cd0: 4d 45 4d 3b 0a 20 20 52 74 72 65 65 43 75 72 73  MEM;.  RtreeCurs
5ce0: 6f 72 20 2a 70 43 73 72 3b 0a 0a 20 20 70 43 73  or *pCsr;..  pCs
5cf0: 72 20 3d 20 28 52 74 72 65 65 43 75 72 73 6f 72  r = (RtreeCursor
5d00: 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
5d10: 63 28 73 69 7a 65 6f 66 28 52 74 72 65 65 43 75  c(sizeof(RtreeCu
5d20: 72 73 6f 72 29 29 3b 0a 20 20 69 66 28 20 70 43  rsor));.  if( pC
5d30: 73 72 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  sr ){.    memset
5d40: 28 70 43 73 72 2c 20 30 2c 20 73 69 7a 65 6f 66  (pCsr, 0, sizeof
5d50: 28 52 74 72 65 65 43 75 72 73 6f 72 29 29 3b 0a  (RtreeCursor));.
5d60: 20 20 20 20 70 43 73 72 2d 3e 62 61 73 65 2e 70      pCsr->base.p
5d70: 56 74 61 62 20 3d 20 70 56 54 61 62 3b 0a 20 20  Vtab = pVTab;.  
5d80: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
5d90: 3b 0a 20 20 7d 0a 20 20 2a 70 70 43 75 72 73 6f  ;.  }.  *ppCurso
5da0: 72 20 3d 20 28 73 71 6c 69 74 65 33 5f 76 74 61  r = (sqlite3_vta
5db0: 62 5f 63 75 72 73 6f 72 20 2a 29 70 43 73 72 3b  b_cursor *)pCsr;
5dc0: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
5dd0: 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68  .../*.** Free th
5de0: 65 20 52 74 72 65 65 43 75 72 73 6f 72 2e 61 43  e RtreeCursor.aC
5df0: 6f 6e 73 74 72 61 69 6e 74 5b 5d 20 61 72 72 61  onstraint[] arra
5e00: 79 20 61 6e 64 20 69 74 73 20 63 6f 6e 74 65 6e  y and its conten
5e10: 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ts..*/.static vo
5e20: 69 64 20 66 72 65 65 43 75 72 73 6f 72 43 6f 6e  id freeCursorCon
5e30: 73 74 72 61 69 6e 74 73 28 52 74 72 65 65 43 75  straints(RtreeCu
5e40: 72 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20 69  rsor *pCsr){.  i
5e50: 66 28 20 70 43 73 72 2d 3e 61 43 6f 6e 73 74 72  f( pCsr->aConstr
5e60: 61 69 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  aint ){.    int 
5e70: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
5e80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
5e90: 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
5ea0: 6f 75 67 68 20 63 6f 6e 73 74 72 61 69 6e 74 20  ough constraint 
5eb0: 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 66 6f 72  array */.    for
5ec0: 28 69 3d 30 3b 20 69 3c 70 43 73 72 2d 3e 6e 43  (i=0; i<pCsr->nC
5ed0: 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b  onstraint; i++){
5ee0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
5ef0: 74 72 65 65 5f 67 65 6f 6d 65 74 72 79 20 2a 70  tree_geometry *p
5f00: 47 65 6f 6d 20 3d 20 70 43 73 72 2d 3e 61 43 6f  Geom = pCsr->aCo
5f10: 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 70 47 65 6f  nstraint[i].pGeo
5f20: 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 47 65  m;.      if( pGe
5f30: 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  om ){.        if
5f40: 28 20 70 47 65 6f 6d 2d 3e 78 44 65 6c 55 73 65  ( pGeom->xDelUse
5f50: 72 20 29 20 70 47 65 6f 6d 2d 3e 78 44 65 6c 55  r ) pGeom->xDelU
5f60: 73 65 72 28 70 47 65 6f 6d 2d 3e 70 55 73 65 72  ser(pGeom->pUser
5f70: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
5f80: 65 33 5f 66 72 65 65 28 70 47 65 6f 6d 29 3b 0a  e3_free(pGeom);.
5f90: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
5fa0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
5fb0: 43 73 72 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  Csr->aConstraint
5fc0: 29 3b 0a 20 20 20 20 70 43 73 72 2d 3e 61 43 6f  );.    pCsr->aCo
5fd0: 6e 73 74 72 61 69 6e 74 20 3d 20 30 3b 0a 20 20  nstraint = 0;.  
5fe0: 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 74 72 65  }.}../* .** Rtre
5ff0: 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
6000: 6d 6f 64 75 6c 65 20 78 43 6c 6f 73 65 20 6d 65  module xClose me
6010: 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  thod..*/.static 
6020: 69 6e 74 20 72 74 72 65 65 43 6c 6f 73 65 28 73  int rtreeClose(s
6030: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
6040: 6f 72 20 2a 63 75 72 29 7b 0a 20 20 52 74 72 65  or *cur){.  Rtre
6050: 65 20 2a 70 52 74 72 65 65 20 3d 20 28 52 74 72  e *pRtree = (Rtr
6060: 65 65 20 2a 29 28 63 75 72 2d 3e 70 56 74 61 62  ee *)(cur->pVtab
6070: 29 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 52  );.  int rc;.  R
6080: 74 72 65 65 43 75 72 73 6f 72 20 2a 70 43 73 72  treeCursor *pCsr
6090: 20 3d 20 28 52 74 72 65 65 43 75 72 73 6f 72 20   = (RtreeCursor 
60a0: 2a 29 63 75 72 3b 0a 20 20 66 72 65 65 43 75 72  *)cur;.  freeCur
60b0: 73 6f 72 43 6f 6e 73 74 72 61 69 6e 74 73 28 70  sorConstraints(p
60c0: 43 73 72 29 3b 0a 20 20 72 63 20 3d 20 6e 6f 64  Csr);.  rc = nod
60d0: 65 52 65 6c 65 61 73 65 28 70 52 74 72 65 65 2c  eRelease(pRtree,
60e0: 20 70 43 73 72 2d 3e 70 4e 6f 64 65 29 3b 0a 20   pCsr->pNode);. 
60f0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
6100: 73 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  sr);.  return rc
6110: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 74 72 65 65  ;.}../*.** Rtree
6120: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d   virtual table m
6130: 6f 64 75 6c 65 20 78 45 6f 66 20 6d 65 74 68 6f  odule xEof metho
6140: 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
6150: 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
6160: 63 75 72 73 6f 72 20 64 6f 65 73 20 6e 6f 74 20  cursor does not 
6170: 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 20  currently point 
6180: 74 6f 20 61 20 76 61 6c 69 64 20 0a 2a 2a 20 72  to a valid .** r
6190: 65 63 6f 72 64 20 28 69 2e 65 20 69 66 20 74 68  ecord (i.e if th
61a0: 65 20 73 63 61 6e 20 68 61 73 20 66 69 6e 69 73  e scan has finis
61b0: 68 65 64 29 2c 20 6f 72 20 7a 65 72 6f 20 6f 74  hed), or zero ot
61c0: 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74  herwise..*/.stat
61d0: 69 63 20 69 6e 74 20 72 74 72 65 65 45 6f 66 28  ic int rtreeEof(
61e0: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
61f0: 73 6f 72 20 2a 63 75 72 29 7b 0a 20 20 52 74 72  sor *cur){.  Rtr
6200: 65 65 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d  eeCursor *pCsr =
6210: 20 28 52 74 72 65 65 43 75 72 73 6f 72 20 2a 29   (RtreeCursor *)
6220: 63 75 72 3b 0a 20 20 72 65 74 75 72 6e 20 28 70  cur;.  return (p
6230: 43 73 72 2d 3e 70 4e 6f 64 65 3d 3d 30 29 3b 0a  Csr->pNode==0);.
6240: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 2d 74  }../*.** The r-t
6250: 72 65 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 70  ree constraint p
6260: 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
6270: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
6280: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
6290: 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74  .** guaranteed t
62a0: 6f 20 62 65 20 61 20 4d 41 54 43 48 20 63 6f 6e  o be a MATCH con
62b0: 73 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74  straint..*/.stat
62c0: 69 63 20 69 6e 74 20 74 65 73 74 52 74 72 65 65  ic int testRtree
62d0: 47 65 6f 6d 28 0a 20 20 52 74 72 65 65 20 2a 70  Geom(.  Rtree *p
62e0: 52 74 72 65 65 2c 20 20 20 20 20 20 20 20 20 20  Rtree,          
62f0: 20 20 20 20 20 20 20 20 2f 2a 20 52 2d 54 72 65          /* R-Tre
6300: 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 52 74  e object */.  Rt
6310: 72 65 65 43 6f 6e 73 74 72 61 69 6e 74 20 2a 70  reeConstraint *p
6320: 43 6f 6e 73 74 72 61 69 6e 74 2c 20 20 20 2f 2a  Constraint,   /*
6330: 20 4d 41 54 43 48 20 63 6f 6e 73 74 72 61 69 6e   MATCH constrain
6340: 74 20 74 6f 20 74 65 73 74 20 2a 2f 0a 20 20 52  t to test */.  R
6350: 74 72 65 65 43 65 6c 6c 20 2a 70 43 65 6c 6c 2c  treeCell *pCell,
6360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6370: 2a 20 43 65 6c 6c 20 74 6f 20 74 65 73 74 20 2a  * Cell to test *
6380: 2f 0a 20 20 69 6e 74 20 2a 70 62 52 65 73 20 20  /.  int *pbRes  
6390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63a0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 65 73 74      /* OUT: Test
63b0: 20 72 65 73 75 6c 74 20 2a 2f 0a 29 7b 0a 20 20   result */.){.  
63c0: 69 6e 74 20 69 3b 0a 20 20 52 74 72 65 65 44 56  int i;.  RtreeDV
63d0: 61 6c 75 65 20 61 43 6f 6f 72 64 5b 52 54 52 45  alue aCoord[RTRE
63e0: 45 5f 4d 41 58 5f 44 49 4d 45 4e 53 49 4f 4e 53  E_MAX_DIMENSIONS
63f0: 2a 32 5d 3b 0a 20 20 69 6e 74 20 6e 43 6f 6f 72  *2];.  int nCoor
6400: 64 20 3d 20 70 52 74 72 65 65 2d 3e 6e 44 69 6d  d = pRtree->nDim
6410: 2a 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  *2;..  assert( p
6420: 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f 70 3d 3d  Constraint->op==
6430: 52 54 52 45 45 5f 4d 41 54 43 48 20 29 3b 0a 20  RTREE_MATCH );. 
6440: 20 61 73 73 65 72 74 28 20 70 43 6f 6e 73 74 72   assert( pConstr
6450: 61 69 6e 74 2d 3e 70 47 65 6f 6d 20 29 3b 0a 0a  aint->pGeom );..
6460: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
6470: 6f 72 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61  ord; i++){.    a
6480: 43 6f 6f 72 64 5b 69 5d 20 3d 20 44 43 4f 4f 52  Coord[i] = DCOOR
6490: 44 28 70 43 65 6c 6c 2d 3e 61 43 6f 6f 72 64 5b  D(pCell->aCoord[
64a0: 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  i]);.  }.  retur
64b0: 6e 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 78  n pConstraint->x
64c0: 47 65 6f 6d 28 70 43 6f 6e 73 74 72 61 69 6e 74  Geom(pConstraint
64d0: 2d 3e 70 47 65 6f 6d 2c 20 6e 43 6f 6f 72 64 2c  ->pGeom, nCoord,
64e0: 20 61 43 6f 6f 72 64 2c 20 70 62 52 65 73 29 3b   aCoord, pbRes);
64f0: 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 43 75 72 73 6f  .}../* .** Curso
6500: 72 20 70 43 75 72 73 6f 72 20 63 75 72 72 65 6e  r pCursor curren
6510: 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  tly points to a 
6520: 63 65 6c 6c 20 69 6e 20 61 20 6e 6f 6e 2d 6c 65  cell in a non-le
6530: 61 66 20 70 61 67 65 2e 0a 2a 2a 20 53 65 74 20  af page..** Set 
6540: 2a 70 62 45 6f 66 20 74 6f 20 74 72 75 65 20 69  *pbEof to true i
6550: 66 20 74 68 65 20 73 75 62 2d 74 72 65 65 20 68  f the sub-tree h
6560: 65 61 64 65 64 20 62 79 20 74 68 65 20 63 65 6c  eaded by the cel
6570: 6c 20 69 73 20 66 69 6c 74 65 72 65 64 0a 2a 2a  l is filtered.**
6580: 20 28 65 78 63 6c 75 64 65 64 29 20 62 79 20 74   (excluded) by t
6590: 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69  he constraints i
65a0: 6e 20 74 68 65 20 70 43 75 72 73 6f 72 2d 3e 61  n the pCursor->a
65b0: 43 6f 6e 73 74 72 61 69 6e 74 5b 5d 20 0a 2a 2a  Constraint[] .**
65c0: 20 61 72 72 61 79 2c 20 6f 72 20 66 61 6c 73 65   array, or false
65d0: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a   otherwise..**.*
65e0: 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
65f0: 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  OK if successful
6600: 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72   or an SQLite er
6610: 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 65  ror code if an e
6620: 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 20 77  rror.** occurs w
6630: 69 74 68 69 6e 20 61 20 67 65 6f 6d 65 74 72 79  ithin a geometry
6640: 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74   callback..*/.st
6650: 61 74 69 63 20 69 6e 74 20 74 65 73 74 52 74 72  atic int testRtr
6660: 65 65 43 65 6c 6c 28 52 74 72 65 65 20 2a 70 52  eeCell(Rtree *pR
6670: 74 72 65 65 2c 20 52 74 72 65 65 43 75 72 73 6f  tree, RtreeCurso
6680: 72 20 2a 70 43 75 72 73 6f 72 2c 20 69 6e 74 20  r *pCursor, int 
6690: 2a 70 62 45 6f 66 29 7b 0a 20 20 52 74 72 65 65  *pbEof){.  Rtree
66a0: 43 65 6c 6c 20 63 65 6c 6c 3b 0a 20 20 69 6e 74  Cell cell;.  int
66b0: 20 69 69 3b 0a 20 20 69 6e 74 20 62 52 65 73 20   ii;.  int bRes 
66c0: 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  = 0;.  int rc = 
66d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 6e 6f  SQLITE_OK;..  no
66e0: 64 65 47 65 74 43 65 6c 6c 28 70 52 74 72 65 65  deGetCell(pRtree
66f0: 2c 20 70 43 75 72 73 6f 72 2d 3e 70 4e 6f 64 65  , pCursor->pNode
6700: 2c 20 70 43 75 72 73 6f 72 2d 3e 69 43 65 6c 6c  , pCursor->iCell
6710: 2c 20 26 63 65 6c 6c 29 3b 0a 20 20 66 6f 72 28  , &cell);.  for(
6720: 69 69 3d 30 3b 20 62 52 65 73 3d 3d 30 20 26 26  ii=0; bRes==0 &&
6730: 20 69 69 3c 70 43 75 72 73 6f 72 2d 3e 6e 43 6f   ii<pCursor->nCo
6740: 6e 73 74 72 61 69 6e 74 3b 20 69 69 2b 2b 29 7b  nstraint; ii++){
6750: 0a 20 20 20 20 52 74 72 65 65 43 6f 6e 73 74 72  .    RtreeConstr
6760: 61 69 6e 74 20 2a 70 20 3d 20 26 70 43 75 72 73  aint *p = &pCurs
6770: 6f 72 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b  or->aConstraint[
6780: 69 69 5d 3b 0a 20 20 20 20 52 74 72 65 65 44 56  ii];.    RtreeDV
6790: 61 6c 75 65 20 63 65 6c 6c 5f 6d 69 6e 20 3d 20  alue cell_min = 
67a0: 44 43 4f 4f 52 44 28 63 65 6c 6c 2e 61 43 6f 6f  DCOORD(cell.aCoo
67b0: 72 64 5b 28 70 2d 3e 69 43 6f 6f 72 64 3e 3e 31  rd[(p->iCoord>>1
67c0: 29 2a 32 5d 29 3b 0a 20 20 20 20 52 74 72 65 65  )*2]);.    Rtree
67d0: 44 56 61 6c 75 65 20 63 65 6c 6c 5f 6d 61 78 20  DValue cell_max 
67e0: 3d 20 44 43 4f 4f 52 44 28 63 65 6c 6c 2e 61 43  = DCOORD(cell.aC
67f0: 6f 6f 72 64 5b 28 70 2d 3e 69 43 6f 6f 72 64 3e  oord[(p->iCoord>
6800: 3e 31 29 2a 32 2b 31 5d 29 3b 0a 0a 20 20 20 20  >1)*2+1]);..    
6810: 61 73 73 65 72 74 28 70 2d 3e 6f 70 3d 3d 52 54  assert(p->op==RT
6820: 52 45 45 5f 4c 45 20 7c 7c 20 70 2d 3e 6f 70 3d  REE_LE || p->op=
6830: 3d 52 54 52 45 45 5f 4c 54 20 7c 7c 20 70 2d 3e  =RTREE_LT || p->
6840: 6f 70 3d 3d 52 54 52 45 45 5f 47 45 20 0a 20 20  op==RTREE_GE .  
6850: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6f 70 3d 3d        || p->op==
6860: 52 54 52 45 45 5f 47 54 20 7c 7c 20 70 2d 3e 6f  RTREE_GT || p->o
6870: 70 3d 3d 52 54 52 45 45 5f 45 51 20 7c 7c 20 70  p==RTREE_EQ || p
6880: 2d 3e 6f 70 3d 3d 52 54 52 45 45 5f 4d 41 54 43  ->op==RTREE_MATC
6890: 48 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 73 77  H.    );..    sw
68a0: 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20  itch( p->op ){. 
68b0: 20 20 20 20 20 63 61 73 65 20 52 54 52 45 45 5f       case RTREE_
68c0: 4c 45 3a 20 63 61 73 65 20 52 54 52 45 45 5f 4c  LE: case RTREE_L
68d0: 54 3a 20 0a 20 20 20 20 20 20 20 20 62 52 65 73  T: .        bRes
68e0: 20 3d 20 70 2d 3e 72 56 61 6c 75 65 3c 63 65 6c   = p->rValue<cel
68f0: 6c 5f 6d 69 6e 3b 20 0a 20 20 20 20 20 20 20 20  l_min; .        
6900: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61  break;..      ca
6910: 73 65 20 52 54 52 45 45 5f 47 45 3a 20 63 61 73  se RTREE_GE: cas
6920: 65 20 52 54 52 45 45 5f 47 54 3a 20 0a 20 20 20  e RTREE_GT: .   
6930: 20 20 20 20 20 62 52 65 73 20 3d 20 70 2d 3e 72       bRes = p->r
6940: 56 61 6c 75 65 3e 63 65 6c 6c 5f 6d 61 78 3b 20  Value>cell_max; 
6950: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
6960: 0a 20 20 20 20 20 20 63 61 73 65 20 52 54 52 45  .      case RTRE
6970: 45 5f 45 51 3a 0a 20 20 20 20 20 20 20 20 62 52  E_EQ:.        bR
6980: 65 73 20 3d 20 28 70 2d 3e 72 56 61 6c 75 65 3e  es = (p->rValue>
6990: 63 65 6c 6c 5f 6d 61 78 20 7c 7c 20 70 2d 3e 72  cell_max || p->r
69a0: 56 61 6c 75 65 3c 63 65 6c 6c 5f 6d 69 6e 29 3b  Value<cell_min);
69b0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
69c0: 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20  .      default: 
69d0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
69e0: 28 20 70 2d 3e 6f 70 3d 3d 52 54 52 45 45 5f 4d  ( p->op==RTREE_M
69f0: 41 54 43 48 20 29 3b 0a 20 20 20 20 20 20 20 20  ATCH );.        
6a00: 72 63 20 3d 20 74 65 73 74 52 74 72 65 65 47 65  rc = testRtreeGe
6a10: 6f 6d 28 70 52 74 72 65 65 2c 20 70 2c 20 26 63  om(pRtree, p, &c
6a20: 65 6c 6c 2c 20 26 62 52 65 73 29 3b 0a 20 20 20  ell, &bRes);.   
6a30: 20 20 20 20 20 62 52 65 73 20 3d 20 21 62 52 65       bRes = !bRe
6a40: 73 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  s;.        break
6a50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6a60: 20 20 7d 0a 0a 20 20 2a 70 62 45 6f 66 20 3d 20    }..  *pbEof = 
6a70: 62 52 65 73 3b 0a 20 20 72 65 74 75 72 6e 20 72  bRes;.  return r
6a80: 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 65 73  c;.}../* .** Tes
6a90: 74 20 69 66 20 74 68 65 20 63 65 6c 6c 20 74 68  t if the cell th
6aa0: 61 74 20 63 75 72 73 6f 72 20 70 43 75 72 73 6f  at cursor pCurso
6ab0: 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
6ac0: 74 73 20 74 6f 0a 2a 2a 20 77 6f 75 6c 64 20 62  ts to.** would b
6ad0: 65 20 66 69 6c 74 65 72 65 64 20 28 65 78 63 6c  e filtered (excl
6ae0: 75 64 65 64 29 20 62 79 20 74 68 65 20 63 6f 6e  uded) by the con
6af0: 73 74 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20  straints in the 
6b00: 0a 2a 2a 20 70 43 75 72 73 6f 72 2d 3e 61 43 6f  .** pCursor->aCo
6b10: 6e 73 74 72 61 69 6e 74 5b 5d 20 61 72 72 61 79  nstraint[] array
6b20: 2e 20 49 66 20 73 6f 2c 20 73 65 74 20 2a 70 62  . If so, set *pb
6b30: 45 6f 66 20 74 6f 20 74 72 75 65 20 62 65 66 6f  Eof to true befo
6b40: 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2e  re.** returning.
6b50: 20 49 66 20 74 68 65 20 63 65 6c 6c 20 69 73 20   If the cell is 
6b60: 6e 6f 74 20 66 69 6c 74 65 72 65 64 20 28 65 78  not filtered (ex
6b70: 63 6c 75 64 65 64 29 20 62 79 20 74 68 65 20 63  cluded) by the c
6b80: 6f 6e 73 74 72 61 69 6e 74 73 2c 0a 2a 2a 20 73  onstraints,.** s
6b90: 65 74 20 70 62 45 6f 66 20 74 6f 20 7a 65 72 6f  et pbEof to zero
6ba0: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
6bb0: 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63  QLITE_OK if succ
6bc0: 65 73 73 66 75 6c 20 6f 72 20 61 6e 20 53 51 4c  essful or an SQL
6bd0: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
6be0: 66 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63  f an error.** oc
6bf0: 63 75 72 73 20 77 69 74 68 69 6e 20 61 20 67 65  curs within a ge
6c00: 6f 6d 65 74 72 79 20 63 61 6c 6c 62 61 63 6b 2e  ometry callback.
6c10: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
6c20: 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61  tion assumes tha
6c30: 74 20 74 68 65 20 63 65 6c 6c 20 69 73 20 70 61  t the cell is pa
6c40: 72 74 20 6f 66 20 61 20 6c 65 61 66 20 6e 6f 64  rt of a leaf nod
6c50: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
6c60: 20 74 65 73 74 52 74 72 65 65 45 6e 74 72 79 28   testRtreeEntry(
6c70: 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c 20 52  Rtree *pRtree, R
6c80: 74 72 65 65 43 75 72 73 6f 72 20 2a 70 43 75 72  treeCursor *pCur
6c90: 73 6f 72 2c 20 69 6e 74 20 2a 70 62 45 6f 66 29  sor, int *pbEof)
6ca0: 7b 0a 20 20 52 74 72 65 65 43 65 6c 6c 20 63 65  {.  RtreeCell ce
6cb0: 6c 6c 3b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20  ll;.  int ii;.  
6cc0: 2a 70 62 45 6f 66 20 3d 20 30 3b 0a 0a 20 20 6e  *pbEof = 0;..  n
6cd0: 6f 64 65 47 65 74 43 65 6c 6c 28 70 52 74 72 65  odeGetCell(pRtre
6ce0: 65 2c 20 70 43 75 72 73 6f 72 2d 3e 70 4e 6f 64  e, pCursor->pNod
6cf0: 65 2c 20 70 43 75 72 73 6f 72 2d 3e 69 43 65 6c  e, pCursor->iCel
6d00: 6c 2c 20 26 63 65 6c 6c 29 3b 0a 20 20 66 6f 72  l, &cell);.  for
6d10: 28 69 69 3d 30 3b 20 69 69 3c 70 43 75 72 73 6f  (ii=0; ii<pCurso
6d20: 72 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  r->nConstraint; 
6d30: 69 69 2b 2b 29 7b 0a 20 20 20 20 52 74 72 65 65  ii++){.    Rtree
6d40: 43 6f 6e 73 74 72 61 69 6e 74 20 2a 70 20 3d 20  Constraint *p = 
6d50: 26 70 43 75 72 73 6f 72 2d 3e 61 43 6f 6e 73 74  &pCursor->aConst
6d60: 72 61 69 6e 74 5b 69 69 5d 3b 0a 20 20 20 20 52  raint[ii];.    R
6d70: 74 72 65 65 44 56 61 6c 75 65 20 63 6f 6f 72 64  treeDValue coord
6d80: 20 3d 20 44 43 4f 4f 52 44 28 63 65 6c 6c 2e 61   = DCOORD(cell.a
6d90: 43 6f 6f 72 64 5b 70 2d 3e 69 43 6f 6f 72 64 5d  Coord[p->iCoord]
6da0: 29 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a  );.    int res;.
6db0: 20 20 20 20 61 73 73 65 72 74 28 70 2d 3e 6f 70      assert(p->op
6dc0: 3d 3d 52 54 52 45 45 5f 4c 45 20 7c 7c 20 70 2d  ==RTREE_LE || p-
6dd0: 3e 6f 70 3d 3d 52 54 52 45 45 5f 4c 54 20 7c 7c  >op==RTREE_LT ||
6de0: 20 70 2d 3e 6f 70 3d 3d 52 54 52 45 45 5f 47 45   p->op==RTREE_GE
6df0: 20 0a 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e   .        || p->
6e00: 6f 70 3d 3d 52 54 52 45 45 5f 47 54 20 7c 7c 20  op==RTREE_GT || 
6e10: 70 2d 3e 6f 70 3d 3d 52 54 52 45 45 5f 45 51 20  p->op==RTREE_EQ 
6e20: 7c 7c 20 70 2d 3e 6f 70 3d 3d 52 54 52 45 45 5f  || p->op==RTREE_
6e30: 4d 41 54 43 48 0a 20 20 20 20 29 3b 0a 20 20 20  MATCH.    );.   
6e40: 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29   switch( p->op )
6e50: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 52 54 52  {.      case RTR
6e60: 45 45 5f 4c 45 3a 20 72 65 73 20 3d 20 28 63 6f  EE_LE: res = (co
6e70: 6f 72 64 3c 3d 70 2d 3e 72 56 61 6c 75 65 29 3b  ord<=p->rValue);
6e80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
6e90: 73 65 20 52 54 52 45 45 5f 4c 54 3a 20 72 65 73  se RTREE_LT: res
6ea0: 20 3d 20 28 63 6f 6f 72 64 3c 70 2d 3e 72 56 61   = (coord<p->rVa
6eb0: 6c 75 65 29 3b 20 20 62 72 65 61 6b 3b 0a 20 20  lue);  break;.  
6ec0: 20 20 20 20 63 61 73 65 20 52 54 52 45 45 5f 47      case RTREE_G
6ed0: 45 3a 20 72 65 73 20 3d 20 28 63 6f 6f 72 64 3e  E: res = (coord>
6ee0: 3d 70 2d 3e 72 56 61 6c 75 65 29 3b 20 62 72 65  =p->rValue); bre
6ef0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 52  ak;.      case R
6f00: 54 52 45 45 5f 47 54 3a 20 72 65 73 20 3d 20 28  TREE_GT: res = (
6f10: 63 6f 6f 72 64 3e 70 2d 3e 72 56 61 6c 75 65 29  coord>p->rValue)
6f20: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ;  break;.      
6f30: 63 61 73 65 20 52 54 52 45 45 5f 45 51 3a 20 72  case RTREE_EQ: r
6f40: 65 73 20 3d 20 28 63 6f 6f 72 64 3d 3d 70 2d 3e  es = (coord==p->
6f50: 72 56 61 6c 75 65 29 3b 20 62 72 65 61 6b 3b 0a  rValue); break;.
6f60: 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b        default: {
6f70: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 3b  .        int rc;
6f80: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
6f90: 20 70 2d 3e 6f 70 3d 3d 52 54 52 45 45 5f 4d 41   p->op==RTREE_MA
6fa0: 54 43 48 20 29 3b 0a 20 20 20 20 20 20 20 20 72  TCH );.        r
6fb0: 63 20 3d 20 74 65 73 74 52 74 72 65 65 47 65 6f  c = testRtreeGeo
6fc0: 6d 28 70 52 74 72 65 65 2c 20 70 2c 20 26 63 65  m(pRtree, p, &ce
6fd0: 6c 6c 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 20  ll, &res);.     
6fe0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
6ff0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
7000: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
7010: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
7020: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
7030: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 72 65    }..    if( !re
7040: 73 20 29 7b 0a 20 20 20 20 20 20 2a 70 62 45 6f  s ){.      *pbEo
7050: 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74  f = 1;.      ret
7060: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
7070: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
7080: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
7090: 0a 2f 2a 0a 2a 2a 20 43 75 72 73 6f 72 20 70 43  ./*.** Cursor pC
70a0: 75 72 73 6f 72 20 63 75 72 72 65 6e 74 6c 79 20  ursor currently 
70b0: 70 6f 69 6e 74 73 20 61 74 20 61 20 6e 6f 64 65  points at a node
70c0: 20 74 68 61 74 20 68 65 61 64 73 20 61 20 73 75   that heads a su
70d0: 62 2d 74 72 65 65 20 6f 66 0a 2a 2a 20 68 65 69  b-tree of.** hei
70e0: 67 68 74 20 69 48 65 69 67 68 74 20 28 69 66 20  ght iHeight (if 
70f0: 69 48 65 69 67 68 74 3d 3d 30 2c 20 74 68 65 6e  iHeight==0, then
7100: 20 74 68 65 20 6e 6f 64 65 20 69 73 20 61 20 6c   the node is a l
7110: 65 61 66 29 2e 20 44 65 73 63 65 6e 64 0a 2a 2a  eaf). Descend.**
7120: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
7130: 20 6c 65 66 74 2d 6d 6f 73 74 20 63 65 6c 6c 20   left-most cell 
7140: 6f 66 20 74 68 65 20 73 75 62 2d 74 72 65 65 20  of the sub-tree 
7150: 74 68 61 74 20 6d 61 74 63 68 65 73 20 74 68 65  that matches the
7160: 20 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20   .** configured 
7170: 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 2a 2f 0a  constraints..*/.
7180: 73 74 61 74 69 63 20 69 6e 74 20 64 65 73 63 65  static int desce
7190: 6e 64 54 6f 43 65 6c 6c 28 0a 20 20 52 74 72 65  ndToCell(.  Rtre
71a0: 65 20 2a 70 52 74 72 65 65 2c 20 0a 20 20 52 74  e *pRtree, .  Rt
71b0: 72 65 65 43 75 72 73 6f 72 20 2a 70 43 75 72 73  reeCursor *pCurs
71c0: 6f 72 2c 20 0a 20 20 69 6e 74 20 69 48 65 69 67  or, .  int iHeig
71d0: 68 74 2c 0a 20 20 69 6e 74 20 2a 70 45 6f 66 20  ht,.  int *pEof 
71e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71f0: 2f 2a 20 4f 55 54 3a 20 53 65 74 20 74 6f 20 74  /* OUT: Set to t
7200: 72 75 65 20 69 66 20 63 61 6e 6e 6f 74 20 64 65  rue if cannot de
7210: 73 63 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e  scend */.){.  in
7220: 74 20 69 73 45 6f 66 3b 0a 20 20 69 6e 74 20 72  t isEof;.  int r
7230: 63 3b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 52  c;.  int ii;.  R
7240: 74 72 65 65 4e 6f 64 65 20 2a 70 43 68 69 6c 64  treeNode *pChild
7250: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ;.  sqlite3_int6
7260: 34 20 69 52 6f 77 69 64 3b 0a 0a 20 20 52 74 72  4 iRowid;..  Rtr
7270: 65 65 4e 6f 64 65 20 2a 70 53 61 76 65 64 4e 6f  eeNode *pSavedNo
7280: 64 65 20 3d 20 70 43 75 72 73 6f 72 2d 3e 70 4e  de = pCursor->pN
7290: 6f 64 65 3b 0a 20 20 69 6e 74 20 69 53 61 76 65  ode;.  int iSave
72a0: 64 43 65 6c 6c 20 3d 20 70 43 75 72 73 6f 72 2d  dCell = pCursor-
72b0: 3e 69 43 65 6c 6c 3b 0a 0a 20 20 61 73 73 65 72  >iCell;..  asser
72c0: 74 28 20 69 48 65 69 67 68 74 3e 3d 30 20 29 3b  t( iHeight>=0 );
72d0: 0a 0a 20 20 69 66 28 20 69 48 65 69 67 68 74 3d  ..  if( iHeight=
72e0: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 74  =0 ){.    rc = t
72f0: 65 73 74 52 74 72 65 65 45 6e 74 72 79 28 70 52  estRtreeEntry(pR
7300: 74 72 65 65 2c 20 70 43 75 72 73 6f 72 2c 20 26  tree, pCursor, &
7310: 69 73 45 6f 66 29 3b 0a 20 20 7d 65 6c 73 65 7b  isEof);.  }else{
7320: 0a 20 20 20 20 72 63 20 3d 20 74 65 73 74 52 74  .    rc = testRt
7330: 72 65 65 43 65 6c 6c 28 70 52 74 72 65 65 2c 20  reeCell(pRtree, 
7340: 70 43 75 72 73 6f 72 2c 20 26 69 73 45 6f 66 29  pCursor, &isEof)
7350: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
7360: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 45  SQLITE_OK || isE
7370: 6f 66 20 7c 7c 20 69 48 65 69 67 68 74 3d 3d 30  of || iHeight==0
7380: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 64 65 73   ){.    goto des
7390: 63 65 6e 64 5f 74 6f 5f 63 65 6c 6c 5f 6f 75 74  cend_to_cell_out
73a0: 3b 0a 20 20 7d 0a 0a 20 20 69 52 6f 77 69 64 20  ;.  }..  iRowid 
73b0: 3d 20 6e 6f 64 65 47 65 74 52 6f 77 69 64 28 70  = nodeGetRowid(p
73c0: 52 74 72 65 65 2c 20 70 43 75 72 73 6f 72 2d 3e  Rtree, pCursor->
73d0: 70 4e 6f 64 65 2c 20 70 43 75 72 73 6f 72 2d 3e  pNode, pCursor->
73e0: 69 43 65 6c 6c 29 3b 0a 20 20 72 63 20 3d 20 6e  iCell);.  rc = n
73f0: 6f 64 65 41 63 71 75 69 72 65 28 70 52 74 72 65  odeAcquire(pRtre
7400: 65 2c 20 69 52 6f 77 69 64 2c 20 70 43 75 72 73  e, iRowid, pCurs
7410: 6f 72 2d 3e 70 4e 6f 64 65 2c 20 26 70 43 68 69  or->pNode, &pChi
7420: 6c 64 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ld);.  if( rc!=S
7430: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7440: 67 6f 74 6f 20 64 65 73 63 65 6e 64 5f 74 6f 5f  goto descend_to_
7450: 63 65 6c 6c 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  cell_out;.  }.. 
7460: 20 6e 6f 64 65 52 65 6c 65 61 73 65 28 70 52 74   nodeRelease(pRt
7470: 72 65 65 2c 20 70 43 75 72 73 6f 72 2d 3e 70 4e  ree, pCursor->pN
7480: 6f 64 65 29 3b 0a 20 20 70 43 75 72 73 6f 72 2d  ode);.  pCursor-
7490: 3e 70 4e 6f 64 65 20 3d 20 70 43 68 69 6c 64 3b  >pNode = pChild;
74a0: 0a 20 20 69 73 45 6f 66 20 3d 20 31 3b 0a 20 20  .  isEof = 1;.  
74b0: 66 6f 72 28 69 69 3d 30 3b 20 69 73 45 6f 66 20  for(ii=0; isEof 
74c0: 26 26 20 69 69 3c 4e 43 45 4c 4c 28 70 43 68 69  && ii<NCELL(pChi
74d0: 6c 64 29 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  ld); ii++){.    
74e0: 70 43 75 72 73 6f 72 2d 3e 69 43 65 6c 6c 20 3d  pCursor->iCell =
74f0: 20 69 69 3b 0a 20 20 20 20 72 63 20 3d 20 64 65   ii;.    rc = de
7500: 73 63 65 6e 64 54 6f 43 65 6c 6c 28 70 52 74 72  scendToCell(pRtr
7510: 65 65 2c 20 70 43 75 72 73 6f 72 2c 20 69 48 65  ee, pCursor, iHe
7520: 69 67 68 74 2d 31 2c 20 26 69 73 45 6f 66 29 3b  ight-1, &isEof);
7530: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
7540: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
7550: 67 6f 74 6f 20 64 65 73 63 65 6e 64 5f 74 6f 5f  goto descend_to_
7560: 63 65 6c 6c 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  cell_out;.    }.
7570: 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 45 6f 66    }..  if( isEof
7580: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
7590: 70 43 75 72 73 6f 72 2d 3e 70 4e 6f 64 65 3d 3d  pCursor->pNode==
75a0: 70 43 68 69 6c 64 20 29 3b 0a 20 20 20 20 6e 6f  pChild );.    no
75b0: 64 65 52 65 66 65 72 65 6e 63 65 28 70 53 61 76  deReference(pSav
75c0: 65 64 4e 6f 64 65 29 3b 0a 20 20 20 20 6e 6f 64  edNode);.    nod
75d0: 65 52 65 6c 65 61 73 65 28 70 52 74 72 65 65 2c  eRelease(pRtree,
75e0: 20 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 70 43   pChild);.    pC
75f0: 75 72 73 6f 72 2d 3e 70 4e 6f 64 65 20 3d 20 70  ursor->pNode = p
7600: 53 61 76 65 64 4e 6f 64 65 3b 0a 20 20 20 20 70  SavedNode;.    p
7610: 43 75 72 73 6f 72 2d 3e 69 43 65 6c 6c 20 3d 20  Cursor->iCell = 
7620: 69 53 61 76 65 64 43 65 6c 6c 3b 0a 20 20 7d 0a  iSavedCell;.  }.
7630: 0a 64 65 73 63 65 6e 64 5f 74 6f 5f 63 65 6c 6c  .descend_to_cell
7640: 5f 6f 75 74 3a 0a 20 20 2a 70 45 6f 66 20 3d 20  _out:.  *pEof = 
7650: 69 73 45 6f 66 3b 0a 20 20 72 65 74 75 72 6e 20  isEof;.  return 
7660: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 65  rc;.}../*.** One
7670: 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 69 6e   of the cells in
7680: 20 6e 6f 64 65 20 70 4e 6f 64 65 20 69 73 20 67   node pNode is g
7690: 75 61 72 61 6e 74 65 65 64 20 74 6f 20 68 61 76  uaranteed to hav
76a0: 65 20 61 20 36 34 2d 62 69 74 20 0a 2a 2a 20 69  e a 64-bit .** i
76b0: 6e 74 65 67 65 72 20 76 61 6c 75 65 20 65 71 75  nteger value equ
76c0: 61 6c 20 74 6f 20 69 52 6f 77 69 64 2e 20 52 65  al to iRowid. Re
76d0: 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
76e0: 66 20 74 68 69 73 20 63 65 6c 6c 2e 0a 2a 2f 0a  f this cell..*/.
76f0: 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 64 65 52  static int nodeR
7700: 6f 77 69 64 49 6e 64 65 78 28 0a 20 20 52 74 72  owidIndex(.  Rtr
7710: 65 65 20 2a 70 52 74 72 65 65 2c 20 0a 20 20 52  ee *pRtree, .  R
7720: 74 72 65 65 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c  treeNode *pNode,
7730: 20 0a 20 20 69 36 34 20 69 52 6f 77 69 64 2c 0a   .  i64 iRowid,.
7740: 20 20 69 6e 74 20 2a 70 69 49 6e 64 65 78 0a 29    int *piIndex.)
7750: 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e  {.  int ii;.  in
7760: 74 20 6e 43 65 6c 6c 20 3d 20 4e 43 45 4c 4c 28  t nCell = NCELL(
7770: 70 4e 6f 64 65 29 3b 0a 20 20 66 6f 72 28 69 69  pNode);.  for(ii
7780: 3d 30 3b 20 69 69 3c 6e 43 65 6c 6c 3b 20 69 69  =0; ii<nCell; ii
7790: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 6e 6f 64  ++){.    if( nod
77a0: 65 47 65 74 52 6f 77 69 64 28 70 52 74 72 65 65  eGetRowid(pRtree
77b0: 2c 20 70 4e 6f 64 65 2c 20 69 69 29 3d 3d 69 52  , pNode, ii)==iR
77c0: 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 2a 70  owid ){.      *p
77d0: 69 49 6e 64 65 78 20 3d 20 69 69 3b 0a 20 20 20  iIndex = ii;.   
77e0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
77f0: 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
7800: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
7810: 4f 52 52 55 50 54 5f 56 54 41 42 3b 0a 7d 0a 0a  ORRUPT_VTAB;.}..
7820: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
7830: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63 65   index of the ce
7840: 6c 6c 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20  ll containing a 
7850: 70 6f 69 6e 74 65 72 20 74 6f 20 6e 6f 64 65 20  pointer to node 
7860: 70 4e 6f 64 65 0a 2a 2a 20 69 6e 20 69 74 73 20  pNode.** in its 
7870: 70 61 72 65 6e 74 2e 20 49 66 20 70 4e 6f 64 65  parent. If pNode
7880: 20 69 73 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64   is the root nod
7890: 65 2c 20 72 65 74 75 72 6e 20 2d 31 2e 0a 2a 2f  e, return -1..*/
78a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 64 65  .static int node
78b0: 50 61 72 65 6e 74 49 6e 64 65 78 28 52 74 72 65  ParentIndex(Rtre
78c0: 65 20 2a 70 52 74 72 65 65 2c 20 52 74 72 65 65  e *pRtree, Rtree
78d0: 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 20 69 6e 74  Node *pNode, int
78e0: 20 2a 70 69 49 6e 64 65 78 29 7b 0a 20 20 52 74   *piIndex){.  Rt
78f0: 72 65 65 4e 6f 64 65 20 2a 70 50 61 72 65 6e 74  reeNode *pParent
7900: 20 3d 20 70 4e 6f 64 65 2d 3e 70 50 61 72 65 6e   = pNode->pParen
7910: 74 3b 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74  t;.  if( pParent
7920: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6e   ){.    return n
7930: 6f 64 65 52 6f 77 69 64 49 6e 64 65 78 28 70 52  odeRowidIndex(pR
7940: 74 72 65 65 2c 20 70 50 61 72 65 6e 74 2c 20 70  tree, pParent, p
7950: 4e 6f 64 65 2d 3e 69 4e 6f 64 65 2c 20 70 69 49  Node->iNode, piI
7960: 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 2a 70 69  ndex);.  }.  *pi
7970: 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20 72 65  Index = -1;.  re
7980: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
7990: 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 74 72 65 65 20  }../* .** Rtree 
79a0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f  virtual table mo
79b0: 64 75 6c 65 20 78 4e 65 78 74 20 6d 65 74 68 6f  dule xNext metho
79c0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
79d0: 20 72 74 72 65 65 4e 65 78 74 28 73 71 6c 69 74   rtreeNext(sqlit
79e0: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
79f0: 70 56 74 61 62 43 75 72 73 6f 72 29 7b 0a 20 20  pVtabCursor){.  
7a00: 52 74 72 65 65 20 2a 70 52 74 72 65 65 20 3d 20  Rtree *pRtree = 
7a10: 28 52 74 72 65 65 20 2a 29 28 70 56 74 61 62 43  (Rtree *)(pVtabC
7a20: 75 72 73 6f 72 2d 3e 70 56 74 61 62 29 3b 0a 20  ursor->pVtab);. 
7a30: 20 52 74 72 65 65 43 75 72 73 6f 72 20 2a 70 43   RtreeCursor *pC
7a40: 73 72 20 3d 20 28 52 74 72 65 65 43 75 72 73 6f  sr = (RtreeCurso
7a50: 72 20 2a 29 70 56 74 61 62 43 75 72 73 6f 72 3b  r *)pVtabCursor;
7a60: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
7a70: 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 52 74 72  TE_OK;..  /* Rtr
7a80: 65 65 43 75 72 73 6f 72 2e 70 4e 6f 64 65 20 6d  eeCursor.pNode m
7a90: 75 73 74 20 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e  ust not be NULL.
7aa0: 20 49 66 20 69 73 20 69 73 20 4e 55 4c 4c 2c 20   If is is NULL, 
7ab0: 74 68 65 6e 20 74 68 69 73 20 63 75 72 73 6f 72  then this cursor
7ac0: 20 69 73 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79   is.  ** already
7ad0: 20 61 74 20 45 4f 46 2e 20 49 74 20 69 73 20 61   at EOF. It is a
7ae0: 67 61 69 6e 73 74 20 74 68 65 20 72 75 6c 65 73  gainst the rules
7af0: 20 74 6f 20 63 61 6c 6c 20 74 68 65 20 78 4e 65   to call the xNe
7b00: 78 74 28 29 20 6d 65 74 68 6f 64 20 6f 66 0a 20  xt() method of. 
7b10: 20 2a 2a 20 61 20 63 75 72 73 6f 72 20 74 68 61   ** a cursor tha
7b20: 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 72 65  t has already re
7b30: 61 63 68 65 64 20 45 4f 46 2e 0a 20 20 2a 2f 0a  ached EOF..  */.
7b40: 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e    assert( pCsr->
7b50: 70 4e 6f 64 65 20 29 3b 0a 0a 20 20 69 66 28 20  pNode );..  if( 
7b60: 70 43 73 72 2d 3e 69 53 74 72 61 74 65 67 79 3d  pCsr->iStrategy=
7b70: 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  =1 ){.    /* Thi
7b80: 73 20 22 73 63 61 6e 22 20 69 73 20 61 20 64 69  s "scan" is a di
7b90: 72 65 63 74 20 6c 6f 6f 6b 75 70 20 62 79 20 72  rect lookup by r
7ba0: 6f 77 69 64 2e 20 54 68 65 72 65 20 69 73 20 6e  owid. There is n
7bb0: 6f 20 6e 65 78 74 20 65 6e 74 72 79 2e 20 2a 2f  o next entry. */
7bc0: 0a 20 20 20 20 6e 6f 64 65 52 65 6c 65 61 73 65  .    nodeRelease
7bd0: 28 70 52 74 72 65 65 2c 20 70 43 73 72 2d 3e 70  (pRtree, pCsr->p
7be0: 4e 6f 64 65 29 3b 0a 20 20 20 20 70 43 73 72 2d  Node);.    pCsr-
7bf0: 3e 70 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 7d 65  >pNode = 0;.  }e
7c00: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 6f 76 65  lse{.    /* Move
7c10: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74   to the next ent
7c20: 72 79 20 74 68 61 74 20 6d 61 74 63 68 65 73 20  ry that matches 
7c30: 74 68 65 20 63 6f 6e 66 69 67 75 72 65 64 20 63  the configured c
7c40: 6f 6e 73 74 72 61 69 6e 74 73 2e 20 2a 2f 0a 20  onstraints. */. 
7c50: 20 20 20 69 6e 74 20 69 48 65 69 67 68 74 20 3d     int iHeight =
7c60: 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70   0;.    while( p
7c70: 43 73 72 2d 3e 70 4e 6f 64 65 20 29 7b 0a 20 20  Csr->pNode ){.  
7c80: 20 20 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70      RtreeNode *p
7c90: 4e 6f 64 65 20 3d 20 70 43 73 72 2d 3e 70 4e 6f  Node = pCsr->pNo
7ca0: 64 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43  de;.      int nC
7cb0: 65 6c 6c 20 3d 20 4e 43 45 4c 4c 28 70 4e 6f 64  ell = NCELL(pNod
7cc0: 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 43  e);.      for(pC
7cd0: 73 72 2d 3e 69 43 65 6c 6c 2b 2b 3b 20 70 43 73  sr->iCell++; pCs
7ce0: 72 2d 3e 69 43 65 6c 6c 3c 6e 43 65 6c 6c 3b 20  r->iCell<nCell; 
7cf0: 70 43 73 72 2d 3e 69 43 65 6c 6c 2b 2b 29 7b 0a  pCsr->iCell++){.
7d00: 20 20 20 20 20 20 20 20 69 6e 74 20 69 73 45 6f          int isEo
7d10: 66 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  f;.        rc = 
7d20: 64 65 73 63 65 6e 64 54 6f 43 65 6c 6c 28 70 52  descendToCell(pR
7d30: 74 72 65 65 2c 20 70 43 73 72 2c 20 69 48 65 69  tree, pCsr, iHei
7d40: 67 68 74 2c 20 26 69 73 45 6f 66 29 3b 0a 20 20  ght, &isEof);.  
7d50: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
7d60: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 69 73 45 6f  LITE_OK || !isEo
7d70: 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  f ){.          r
7d80: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
7d90: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
7da0: 20 20 70 43 73 72 2d 3e 70 4e 6f 64 65 20 3d 20    pCsr->pNode = 
7db0: 70 4e 6f 64 65 2d 3e 70 50 61 72 65 6e 74 3b 0a  pNode->pParent;.
7dc0: 20 20 20 20 20 20 72 63 20 3d 20 6e 6f 64 65 50        rc = nodeP
7dd0: 61 72 65 6e 74 49 6e 64 65 78 28 70 52 74 72 65  arentIndex(pRtre
7de0: 65 2c 20 70 4e 6f 64 65 2c 20 26 70 43 73 72 2d  e, pNode, &pCsr-
7df0: 3e 69 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 69  >iCell);.      i
7e00: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
7e10: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
7e20: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
7e30: 20 20 20 20 20 6e 6f 64 65 52 65 66 65 72 65 6e       nodeReferen
7e40: 63 65 28 70 43 73 72 2d 3e 70 4e 6f 64 65 29 3b  ce(pCsr->pNode);
7e50: 0a 20 20 20 20 20 20 6e 6f 64 65 52 65 6c 65 61  .      nodeRelea
7e60: 73 65 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65  se(pRtree, pNode
7e70: 29 3b 0a 20 20 20 20 20 20 69 48 65 69 67 68 74  );.      iHeight
7e80: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ++;.    }.  }.. 
7e90: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
7ea0: 2a 20 0a 2a 2a 20 52 74 72 65 65 20 76 69 72 74  * .** Rtree virt
7eb0: 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65  ual table module
7ec0: 20 78 52 6f 77 69 64 20 6d 65 74 68 6f 64 2e 0a   xRowid method..
7ed0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 74  */.static int rt
7ee0: 72 65 65 52 6f 77 69 64 28 73 71 6c 69 74 65 33  reeRowid(sqlite3
7ef0: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56  _vtab_cursor *pV
7f00: 74 61 62 43 75 72 73 6f 72 2c 20 73 71 6c 69 74  tabCursor, sqlit
7f10: 65 5f 69 6e 74 36 34 20 2a 70 52 6f 77 69 64 29  e_int64 *pRowid)
7f20: 7b 0a 20 20 52 74 72 65 65 20 2a 70 52 74 72 65  {.  Rtree *pRtre
7f30: 65 20 3d 20 28 52 74 72 65 65 20 2a 29 70 56 74  e = (Rtree *)pVt
7f40: 61 62 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 3b  abCursor->pVtab;
7f50: 0a 20 20 52 74 72 65 65 43 75 72 73 6f 72 20 2a  .  RtreeCursor *
7f60: 70 43 73 72 20 3d 20 28 52 74 72 65 65 43 75 72  pCsr = (RtreeCur
7f70: 73 6f 72 20 2a 29 70 56 74 61 62 43 75 72 73 6f  sor *)pVtabCurso
7f80: 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 70 43 73  r;..  assert(pCs
7f90: 72 2d 3e 70 4e 6f 64 65 29 3b 0a 20 20 2a 70 52  r->pNode);.  *pR
7fa0: 6f 77 69 64 20 3d 20 6e 6f 64 65 47 65 74 52 6f  owid = nodeGetRo
7fb0: 77 69 64 28 70 52 74 72 65 65 2c 20 70 43 73 72  wid(pRtree, pCsr
7fc0: 2d 3e 70 4e 6f 64 65 2c 20 70 43 73 72 2d 3e 69  ->pNode, pCsr->i
7fd0: 43 65 6c 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e  Cell);..  return
7fe0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
7ff0: 2a 20 0a 2a 2a 20 52 74 72 65 65 20 76 69 72 74  * .** Rtree virt
8000: 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65  ual table module
8010: 20 78 43 6f 6c 75 6d 6e 20 6d 65 74 68 6f 64 2e   xColumn method.
8020: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
8030: 74 72 65 65 43 6f 6c 75 6d 6e 28 73 71 6c 69 74  treeColumn(sqlit
8040: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
8050: 63 75 72 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6e  cur, sqlite3_con
8060: 74 65 78 74 20 2a 63 74 78 2c 20 69 6e 74 20 69  text *ctx, int i
8070: 29 7b 0a 20 20 52 74 72 65 65 20 2a 70 52 74 72  ){.  Rtree *pRtr
8080: 65 65 20 3d 20 28 52 74 72 65 65 20 2a 29 63 75  ee = (Rtree *)cu
8090: 72 2d 3e 70 56 74 61 62 3b 0a 20 20 52 74 72 65  r->pVtab;.  Rtre
80a0: 65 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20  eCursor *pCsr = 
80b0: 28 52 74 72 65 65 43 75 72 73 6f 72 20 2a 29 63  (RtreeCursor *)c
80c0: 75 72 3b 0a 0a 20 20 69 66 28 20 69 3d 3d 30 20  ur;..  if( i==0 
80d0: 29 7b 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69  ){.    i64 iRowi
80e0: 64 20 3d 20 6e 6f 64 65 47 65 74 52 6f 77 69 64  d = nodeGetRowid
80f0: 28 70 52 74 72 65 65 2c 20 70 43 73 72 2d 3e 70  (pRtree, pCsr->p
8100: 4e 6f 64 65 2c 20 70 43 73 72 2d 3e 69 43 65 6c  Node, pCsr->iCel
8110: 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  l);.    sqlite3_
8120: 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 74 78  result_int64(ctx
8130: 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 7d 65 6c  , iRowid);.  }el
8140: 73 65 7b 0a 20 20 20 20 52 74 72 65 65 43 6f 6f  se{.    RtreeCoo
8150: 72 64 20 63 3b 0a 20 20 20 20 6e 6f 64 65 47 65  rd c;.    nodeGe
8160: 74 43 6f 6f 72 64 28 70 52 74 72 65 65 2c 20 70  tCoord(pRtree, p
8170: 43 73 72 2d 3e 70 4e 6f 64 65 2c 20 70 43 73 72  Csr->pNode, pCsr
8180: 2d 3e 69 43 65 6c 6c 2c 20 69 2d 31 2c 20 26 63  ->iCell, i-1, &c
8190: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
81a0: 45 5f 52 54 52 45 45 5f 49 4e 54 5f 4f 4e 4c 59  E_RTREE_INT_ONLY
81b0: 0a 20 20 20 20 69 66 28 20 70 52 74 72 65 65 2d  .    if( pRtree-
81c0: 3e 65 43 6f 6f 72 64 54 79 70 65 3d 3d 52 54 52  >eCoordType==RTR
81d0: 45 45 5f 43 4f 4f 52 44 5f 52 45 41 4c 33 32 20  EE_COORD_REAL32 
81e0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
81f0: 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63  _result_double(c
8200: 74 78 2c 20 63 2e 66 29 3b 0a 20 20 20 20 7d 65  tx, c.f);.    }e
8210: 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b  lse.#endif.    {
8220: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
8230: 52 74 72 65 65 2d 3e 65 43 6f 6f 72 64 54 79 70  Rtree->eCoordTyp
8240: 65 3d 3d 52 54 52 45 45 5f 43 4f 4f 52 44 5f 49  e==RTREE_COORD_I
8250: 4e 54 33 32 20 29 3b 0a 20 20 20 20 20 20 73 71  NT32 );.      sq
8260: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
8270: 28 63 74 78 2c 20 63 2e 69 29 3b 0a 20 20 20 20  (ctx, c.i);.    
8280: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
8290: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
82a0: 20 0a 2a 2a 20 55 73 65 20 6e 6f 64 65 41 63 71   .** Use nodeAcq
82b0: 75 69 72 65 28 29 20 74 6f 20 6f 62 74 61 69 6e  uire() to obtain
82c0: 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 20 63   the leaf node c
82d0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 72 65  ontaining the re
82e0: 63 6f 72 64 20 77 69 74 68 20 0a 2a 2a 20 72 6f  cord with .** ro
82f0: 77 69 64 20 69 52 6f 77 69 64 2e 20 49 66 20 73  wid iRowid. If s
8300: 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 2a  uccessful, set *
8310: 70 70 4c 65 61 66 20 74 6f 20 70 6f 69 6e 74 20  ppLeaf to point 
8320: 74 6f 20 74 68 65 20 6e 6f 64 65 20 61 6e 64 0a  to the node and.
8330: 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ** return SQLITE
8340: 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73  _OK. If there is
8350: 20 6e 6f 20 73 75 63 68 20 72 65 63 6f 72 64 20   no such record 
8360: 69 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 73 65  in the table, se
8370: 74 0a 2a 2a 20 2a 70 70 4c 65 61 66 20 74 6f 20  t.** *ppLeaf to 
8380: 30 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  0 and return SQL
8390: 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 65 72  ITE_OK. If an er
83a0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20  ror occurs, set 
83b0: 2a 70 70 4c 65 61 66 0a 2a 2a 20 74 6f 20 7a 65  *ppLeaf.** to ze
83c0: 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e  ro and return an
83d0: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
83e0: 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
83f0: 74 20 66 69 6e 64 4c 65 61 66 4e 6f 64 65 28 52  t findLeafNode(R
8400: 74 72 65 65 20 2a 70 52 74 72 65 65 2c 20 69 36  tree *pRtree, i6
8410: 34 20 69 52 6f 77 69 64 2c 20 52 74 72 65 65 4e  4 iRowid, RtreeN
8420: 6f 64 65 20 2a 2a 70 70 4c 65 61 66 29 7b 0a 20  ode **ppLeaf){. 
8430: 20 69 6e 74 20 72 63 3b 0a 20 20 2a 70 70 4c 65   int rc;.  *ppLe
8440: 61 66 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  af = 0;.  sqlite
8450: 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 52 74  3_bind_int64(pRt
8460: 72 65 65 2d 3e 70 52 65 61 64 52 6f 77 69 64 2c  ree->pReadRowid,
8470: 20 31 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 69   1, iRowid);.  i
8480: 66 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  f( sqlite3_step(
8490: 70 52 74 72 65 65 2d 3e 70 52 65 61 64 52 6f 77  pRtree->pReadRow
84a0: 69 64 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  id)==SQLITE_ROW 
84b0: 29 7b 0a 20 20 20 20 69 36 34 20 69 4e 6f 64 65  ){.    i64 iNode
84c0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
84d0: 6e 5f 69 6e 74 36 34 28 70 52 74 72 65 65 2d 3e  n_int64(pRtree->
84e0: 70 52 65 61 64 52 6f 77 69 64 2c 20 30 29 3b 0a  pReadRowid, 0);.
84f0: 20 20 20 20 72 63 20 3d 20 6e 6f 64 65 41 63 71      rc = nodeAcq
8500: 75 69 72 65 28 70 52 74 72 65 65 2c 20 69 4e 6f  uire(pRtree, iNo
8510: 64 65 2c 20 30 2c 20 70 70 4c 65 61 66 29 3b 0a  de, 0, ppLeaf);.
8520: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65      sqlite3_rese
8530: 74 28 70 52 74 72 65 65 2d 3e 70 52 65 61 64 52  t(pRtree->pReadR
8540: 6f 77 69 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  owid);.  }else{.
8550: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
8560: 5f 72 65 73 65 74 28 70 52 74 72 65 65 2d 3e 70  _reset(pRtree->p
8570: 52 65 61 64 52 6f 77 69 64 29 3b 0a 20 20 7d 0a  ReadRowid);.  }.
8580: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
8590: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
85a0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
85b0: 20 63 6f 6e 66 69 67 75 72 65 20 74 68 65 20 52   configure the R
85c0: 74 72 65 65 43 6f 6e 73 74 72 61 69 6e 74 20 6f  treeConstraint o
85d0: 62 6a 65 63 74 20 70 61 73 73 65 64 0a 2a 2a 20  bject passed.** 
85e0: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
85f0: 67 75 6d 65 6e 74 20 66 6f 72 20 61 20 4d 41 54  gument for a MAT
8600: 43 48 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 54  CH constraint. T
8610: 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  he value passed 
8620: 61 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  as the.** first 
8630: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
8640: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 65   function is the
8650: 20 72 69 67 68 74 2d 68 61 6e 64 20 6f 70 65 72   right-hand oper
8660: 61 6e 64 20 74 6f 20 74 68 65 20 4d 41 54 43 48  and to the MATCH
8670: 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f  .** operator..*/
8680: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 73 65  .static int dese
8690: 72 69 61 6c 69 7a 65 47 65 6f 6d 65 74 72 79 28  rializeGeometry(
86a0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
86b0: 56 61 6c 75 65 2c 20 52 74 72 65 65 43 6f 6e 73  Value, RtreeCons
86c0: 74 72 61 69 6e 74 20 2a 70 43 6f 6e 73 29 7b 0a  traint *pCons){.
86d0: 20 20 52 74 72 65 65 4d 61 74 63 68 41 72 67 20    RtreeMatchArg 
86e0: 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 74  *p;.  sqlite3_rt
86f0: 72 65 65 5f 67 65 6f 6d 65 74 72 79 20 2a 70 47  ree_geometry *pG
8700: 65 6f 6d 3b 0a 20 20 69 6e 74 20 6e 42 6c 6f 62  eom;.  int nBlob
8710: 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
8720: 61 74 20 76 61 6c 75 65 20 69 73 20 61 63 74 75  at value is actu
8730: 61 6c 6c 79 20 61 20 62 6c 6f 62 2e 20 2a 2f 0a  ally a blob. */.
8740: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61    if( sqlite3_va
8750: 6c 75 65 5f 74 79 70 65 28 70 56 61 6c 75 65 29  lue_type(pValue)
8760: 21 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29 20  !=SQLITE_BLOB ) 
8770: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
8780: 52 4f 52 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ROR;..  /* Check
8790: 20 74 68 61 74 20 74 68 65 20 62 6c 6f 62 20 69   that the blob i
87a0: 73 20 72 6f 75 67 68 6c 79 20 74 68 65 20 72 69  s roughly the ri
87b0: 67 68 74 20 73 69 7a 65 2e 20 2a 2f 0a 20 20 6e  ght size. */.  n
87c0: 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 76  Blob = sqlite3_v
87d0: 61 6c 75 65 5f 62 79 74 65 73 28 70 56 61 6c 75  alue_bytes(pValu
87e0: 65 29 3b 0a 20 20 69 66 28 20 6e 42 6c 6f 62 3c  e);.  if( nBlob<
87f0: 28 69 6e 74 29 73 69 7a 65 6f 66 28 52 74 72 65  (int)sizeof(Rtre
8800: 65 4d 61 74 63 68 41 72 67 29 20 0a 20 20 20 7c  eMatchArg) .   |
8810: 7c 20 28 28 6e 42 6c 6f 62 2d 73 69 7a 65 6f 66  | ((nBlob-sizeof
8820: 28 52 74 72 65 65 4d 61 74 63 68 41 72 67 29 29  (RtreeMatchArg))
8830: 25 73 69 7a 65 6f 66 28 52 74 72 65 65 44 56 61  %sizeof(RtreeDVa
8840: 6c 75 65 29 29 21 3d 30 0a 20 20 29 7b 0a 20 20  lue))!=0.  ){.  
8850: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8860: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70 47  ERROR;.  }..  pG
8870: 65 6f 6d 20 3d 20 28 73 71 6c 69 74 65 33 5f 72  eom = (sqlite3_r
8880: 74 72 65 65 5f 67 65 6f 6d 65 74 72 79 20 2a 29  tree_geometry *)
8890: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 0a  sqlite3_malloc(.
88a0: 20 20 20 20 20 20 73 69 7a 65 6f 66 28 73 71 6c        sizeof(sql
88b0: 69 74 65 33 5f 72 74 72 65 65 5f 67 65 6f 6d 65  ite3_rtree_geome
88c0: 74 72 79 29 20 2b 20 6e 42 6c 6f 62 0a 20 20 29  try) + nBlob.  )
88d0: 3b 0a 20 20 69 66 28 20 21 70 47 65 6f 6d 20 29  ;.  if( !pGeom )
88e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
88f0: 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70  OMEM;.  memset(p
8900: 47 65 6f 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Geom, 0, sizeof(
8910: 73 71 6c 69 74 65 33 5f 72 74 72 65 65 5f 67 65  sqlite3_rtree_ge
8920: 6f 6d 65 74 72 79 29 29 3b 0a 20 20 70 20 3d 20  ometry));.  p = 
8930: 28 52 74 72 65 65 4d 61 74 63 68 41 72 67 20 2a  (RtreeMatchArg *
8940: 29 26 70 47 65 6f 6d 5b 31 5d 3b 0a 0a 20 20 6d  )&pGeom[1];..  m
8950: 65 6d 63 70 79 28 70 2c 20 73 71 6c 69 74 65 33  emcpy(p, sqlite3
8960: 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 70 56 61 6c  _value_blob(pVal
8970: 75 65 29 2c 20 6e 42 6c 6f 62 29 3b 0a 20 20 69  ue), nBlob);.  i
8980: 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 52 54 52  f( p->magic!=RTR
8990: 45 45 5f 47 45 4f 4d 45 54 52 59 5f 4d 41 47 49  EE_GEOMETRY_MAGI
89a0: 43 20 0a 20 20 20 7c 7c 20 6e 42 6c 6f 62 21 3d  C .   || nBlob!=
89b0: 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 52 74 72  (int)(sizeof(Rtr
89c0: 65 65 4d 61 74 63 68 41 72 67 29 20 2b 20 28 70  eeMatchArg) + (p
89d0: 2d 3e 6e 50 61 72 61 6d 2d 31 29 2a 73 69 7a 65  ->nParam-1)*size
89e0: 6f 66 28 52 74 72 65 65 44 56 61 6c 75 65 29 29  of(RtreeDValue))
89f0: 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  .  ){.    sqlite
8a00: 33 5f 66 72 65 65 28 70 47 65 6f 6d 29 3b 0a 20  3_free(pGeom);. 
8a10: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8a20: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70  _ERROR;.  }..  p
8a30: 47 65 6f 6d 2d 3e 70 43 6f 6e 74 65 78 74 20 3d  Geom->pContext =
8a40: 20 70 2d 3e 70 43 6f 6e 74 65 78 74 3b 0a 20 20   p->pContext;.  
8a50: 70 47 65 6f 6d 2d 3e 6e 50 61 72 61 6d 20 3d 20  pGeom->nParam = 
8a60: 70 2d 3e 6e 50 61 72 61 6d 3b 0a 20 20 70 47 65  p->nParam;.  pGe
8a70: 6f 6d 2d 3e 61 50 61 72 61 6d 20 3d 20 70 2d 3e  om->aParam = p->
8a80: 61 50 61 72 61 6d 3b 0a 0a 20 20 70 43 6f 6e 73  aParam;..  pCons
8a90: 2d 3e 78 47 65 6f 6d 20 3d 20 70 2d 3e 78 47 65  ->xGeom = p->xGe
8aa0: 6f 6d 3b 0a 20 20 70 43 6f 6e 73 2d 3e 70 47 65  om;.  pCons->pGe
8ab0: 6f 6d 20 3d 20 70 47 65 6f 6d 3b 0a 20 20 72 65  om = pGeom;.  re
8ac0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
8ad0: 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 74 72 65 65 20  }../* .** Rtree 
8ae0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f  virtual table mo
8af0: 64 75 6c 65 20 78 46 69 6c 74 65 72 20 6d 65 74  dule xFilter met
8b00: 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  hod..*/.static i
8b10: 6e 74 20 72 74 72 65 65 46 69 6c 74 65 72 28 0a  nt rtreeFilter(.
8b20: 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63    sqlite3_vtab_c
8b30: 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73  ursor *pVtabCurs
8b40: 6f 72 2c 20 0a 20 20 69 6e 74 20 69 64 78 4e 75  or, .  int idxNu
8b50: 6d 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 69  m, const char *i
8b60: 64 78 53 74 72 2c 0a 20 20 69 6e 74 20 61 72 67  dxStr,.  int arg
8b70: 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
8b80: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 52 74 72   **argv.){.  Rtr
8b90: 65 65 20 2a 70 52 74 72 65 65 20 3d 20 28 52 74  ee *pRtree = (Rt
8ba0: 72 65 65 20 2a 29 70 56 74 61 62 43 75 72 73 6f  ree *)pVtabCurso
8bb0: 72 2d 3e 70 56 74 61 62 3b 0a 20 20 52 74 72 65  r->pVtab;.  Rtre
8bc0: 65 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20  eCursor *pCsr = 
8bd0: 28 52 74 72 65 65 43 75 72 73 6f 72 20 2a 29 70  (RtreeCursor *)p
8be0: 56 74 61 62 43 75 72 73 6f 72 3b 0a 0a 20 20 52  VtabCursor;..  R
8bf0: 74 72 65 65 4e 6f 64 65 20 2a 70 52 6f 6f 74 20  treeNode *pRoot 
8c00: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 69 3b 0a 20  = 0;.  int ii;. 
8c10: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
8c20: 5f 4f 4b 3b 0a 0a 20 20 72 74 72 65 65 52 65 66  _OK;..  rtreeRef
8c30: 65 72 65 6e 63 65 28 70 52 74 72 65 65 29 3b 0a  erence(pRtree);.
8c40: 0a 20 20 66 72 65 65 43 75 72 73 6f 72 43 6f 6e  .  freeCursorCon
8c50: 73 74 72 61 69 6e 74 73 28 70 43 73 72 29 3b 0a  straints(pCsr);.
8c60: 20 20 70 43 73 72 2d 3e 69 53 74 72 61 74 65 67    pCsr->iStrateg
8c70: 79 20 3d 20 69 64 78 4e 75 6d 3b 0a 0a 20 20 69  y = idxNum;..  i
8c80: 66 28 20 69 64 78 4e 75 6d 3d 3d 31 20 29 7b 0a  f( idxNum==1 ){.
8c90: 20 20 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63      /* Special c
8ca0: 61 73 65 20 2d 20 6c 6f 6f 6b 75 70 20 62 79 20  ase - lookup by 
8cb0: 72 6f 77 69 64 2e 20 2a 2f 0a 20 20 20 20 52 74  rowid. */.    Rt
8cc0: 72 65 65 4e 6f 64 65 20 2a 70 4c 65 61 66 3b 20  reeNode *pLeaf; 
8cd0: 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 66 20 6f         /* Leaf o
8ce0: 6e 20 77 68 69 63 68 20 74 68 65 20 72 65 71 75  n which the requ
8cf0: 69 72 65 64 20 63 65 6c 6c 20 72 65 73 69 64 65  ired cell reside
8d00: 73 20 2a 2f 0a 20 20 20 20 69 36 34 20 69 52 6f  s */.    i64 iRo
8d10: 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  wid = sqlite3_va
8d20: 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 30  lue_int64(argv[0
8d30: 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e  ]);.    rc = fin
8d40: 64 4c 65 61 66 4e 6f 64 65 28 70 52 74 72 65 65  dLeafNode(pRtree
8d50: 2c 20 69 52 6f 77 69 64 2c 20 26 70 4c 65 61 66  , iRowid, &pLeaf
8d60: 29 3b 0a 20 20 20 20 70 43 73 72 2d 3e 70 4e 6f  );.    pCsr->pNo
8d70: 64 65 20 3d 20 70 4c 65 61 66 3b 20 0a 20 20 20  de = pLeaf; .   
8d80: 20 69 66 28 20 70 4c 65 61 66 20 29 7b 0a 20 20   if( pLeaf ){.  
8d90: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
8da0: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
8db0: 20 20 20 72 63 20 3d 20 6e 6f 64 65 52 6f 77 69     rc = nodeRowi
8dc0: 64 49 6e 64 65 78 28 70 52 74 72 65 65 2c 20 70  dIndex(pRtree, p
8dd0: 4c 65 61 66 2c 20 69 52 6f 77 69 64 2c 20 26 70  Leaf, iRowid, &p
8de0: 43 73 72 2d 3e 69 43 65 6c 6c 29 3b 0a 20 20 20  Csr->iCell);.   
8df0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
8e00: 2f 2a 20 4e 6f 72 6d 61 6c 20 63 61 73 65 20 2d  /* Normal case -
8e10: 20 72 2d 74 72 65 65 20 73 63 61 6e 2e 20 53 65   r-tree scan. Se
8e20: 74 20 75 70 20 74 68 65 20 52 74 72 65 65 43 75  t up the RtreeCu
8e30: 72 73 6f 72 2e 61 43 6f 6e 73 74 72 61 69 6e 74  rsor.aConstraint
8e40: 20 61 72 72 61 79 20 0a 20 20 20 20 2a 2a 20 77   array .    ** w
8e50: 69 74 68 20 74 68 65 20 63 6f 6e 66 69 67 75 72  ith the configur
8e60: 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20  ed constraints. 
8e70: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
8e80: 61 72 67 63 3e 30 20 29 7b 0a 20 20 20 20 20 20  argc>0 ){.      
8e90: 70 43 73 72 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  pCsr->aConstrain
8ea0: 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  t = sqlite3_mall
8eb0: 6f 63 28 73 69 7a 65 6f 66 28 52 74 72 65 65 43  oc(sizeof(RtreeC
8ec0: 6f 6e 73 74 72 61 69 6e 74 29 2a 61 72 67 63 29  onstraint)*argc)
8ed0: 3b 0a 20 20 20 20 20 20 70 43 73 72 2d 3e 6e 43  ;.      pCsr->nC
8ee0: 6f 6e 73 74 72 61 69 6e 74 20 3d 20 61 72 67 63  onstraint = argc
8ef0: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 73  ;.      if( !pCs
8f00: 72 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 20 29  r->aConstraint )
8f10: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
8f20: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
8f30: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8f40: 20 20 6d 65 6d 73 65 74 28 70 43 73 72 2d 3e 61    memset(pCsr->a
8f50: 43 6f 6e 73 74 72 61 69 6e 74 2c 20 30 2c 20 73  Constraint, 0, s
8f60: 69 7a 65 6f 66 28 52 74 72 65 65 43 6f 6e 73 74  izeof(RtreeConst
8f70: 72 61 69 6e 74 29 2a 61 72 67 63 29 3b 0a 20 20  raint)*argc);.  
8f80: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 69        assert( (i
8f90: 64 78 53 74 72 3d 3d 30 20 26 26 20 61 72 67 63  dxStr==0 && argc
8fa0: 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20 20  ==0).           
8fb0: 20 20 20 20 20 7c 7c 20 28 69 64 78 53 74 72 20       || (idxStr 
8fc0: 26 26 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 69  && (int)strlen(i
8fd0: 64 78 53 74 72 29 3d 3d 61 72 67 63 2a 32 29 20  dxStr)==argc*2) 
8fe0: 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
8ff0: 69 3d 30 3b 20 69 69 3c 61 72 67 63 3b 20 69 69  i=0; ii<argc; ii
9000: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 52  ++){.          R
9010: 74 72 65 65 43 6f 6e 73 74 72 61 69 6e 74 20 2a  treeConstraint *
9020: 70 20 3d 20 26 70 43 73 72 2d 3e 61 43 6f 6e 73  p = &pCsr->aCons
9030: 74 72 61 69 6e 74 5b 69 69 5d 3b 0a 20 20 20 20  traint[ii];.    
9040: 20 20 20 20 20 20 70 2d 3e 6f 70 20 3d 20 69 64        p->op = id
9050: 78 53 74 72 5b 69 69 2a 32 5d 3b 0a 20 20 20 20  xStr[ii*2];.    
9060: 20 20 20 20 20 20 70 2d 3e 69 43 6f 6f 72 64 20        p->iCoord 
9070: 3d 20 69 64 78 53 74 72 5b 69 69 2a 32 2b 31 5d  = idxStr[ii*2+1]
9080: 2d 27 61 27 3b 0a 20 20 20 20 20 20 20 20 20 20  -'a';.          
9090: 69 66 28 20 70 2d 3e 6f 70 3d 3d 52 54 52 45 45  if( p->op==RTREE
90a0: 5f 4d 41 54 43 48 20 29 7b 0a 20 20 20 20 20 20  _MATCH ){.      
90b0: 20 20 20 20 20 20 2f 2a 20 41 20 4d 41 54 43 48        /* A MATCH
90c0: 20 6f 70 65 72 61 74 6f 72 2e 20 54 68 65 20 72   operator. The r
90d0: 69 67 68 74 2d 68 61 6e 64 2d 73 69 64 65 20 6d  ight-hand-side m
90e0: 75 73 74 20 62 65 20 61 20 62 6c 6f 62 20 74 68  ust be a blob th
90f0: 61 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  at.            *
9100: 2a 20 63 61 6e 20 62 65 20 63 61 73 74 20 69 6e  * can be cast in
9110: 74 6f 20 61 6e 20 52 74 72 65 65 4d 61 74 63 68  to an RtreeMatch
9120: 41 72 67 20 6f 62 6a 65 63 74 2e 20 4f 6e 65 20  Arg object. One 
9130: 63 72 65 61 74 65 64 20 75 73 69 6e 67 0a 20 20  created using.  
9140: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 20            ** an 
9150: 73 71 6c 69 74 65 33 5f 72 74 72 65 65 5f 67 65  sqlite3_rtree_ge
9160: 6f 6d 65 74 72 79 5f 63 61 6c 6c 62 61 63 6b 28  ometry_callback(
9170: 29 20 53 51 4c 20 75 73 65 72 20 66 75 6e 63 74  ) SQL user funct
9180: 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ion..           
9190: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
91a0: 72 63 20 3d 20 64 65 73 65 72 69 61 6c 69 7a 65  rc = deserialize
91b0: 47 65 6f 6d 65 74 72 79 28 61 72 67 76 5b 69 69  Geometry(argv[ii
91c0: 5d 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 20  ], p);.         
91d0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
91e0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
91f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9200: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
9210: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64       }else{.#ifd
9220: 65 66 20 53 51 4c 49 54 45 5f 52 54 52 45 45 5f  ef SQLITE_RTREE_
9230: 49 4e 54 5f 4f 4e 4c 59 0a 20 20 20 20 20 20 20  INT_ONLY.       
9240: 20 20 20 20 20 70 2d 3e 72 56 61 6c 75 65 20 3d       p->rValue =
9250: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
9260: 6e 74 36 34 28 61 72 67 76 5b 69 69 5d 29 3b 0a  nt64(argv[ii]);.
9270: 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20  #else.          
9280: 20 20 70 2d 3e 72 56 61 6c 75 65 20 3d 20 73 71    p->rValue = sq
9290: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62  lite3_value_doub
92a0: 6c 65 28 61 72 67 76 5b 69 69 5d 29 3b 0a 23 65  le(argv[ii]);.#e
92b0: 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 7d  ndif.          }
92c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
92d0: 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
92e0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
92f0: 4b 20 29 7b 0a 20 20 20 20 20 20 70 43 73 72 2d  K ){.      pCsr-
9300: 3e 70 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  >pNode = 0;.    
9310: 20 20 72 63 20 3d 20 6e 6f 64 65 41 63 71 75 69    rc = nodeAcqui
9320: 72 65 28 70 52 74 72 65 65 2c 20 31 2c 20 30 2c  re(pRtree, 1, 0,
9330: 20 26 70 52 6f 6f 74 29 3b 0a 20 20 20 20 7d 0a   &pRoot);.    }.
9340: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
9350: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
9360: 6e 74 20 69 73 45 6f 66 20 3d 20 31 3b 0a 20 20  nt isEof = 1;.  
9370: 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20      int nCell = 
9380: 4e 43 45 4c 4c 28 70 52 6f 6f 74 29 3b 0a 20 20  NCELL(pRoot);.  
9390: 20 20 20 20 70 43 73 72 2d 3e 70 4e 6f 64 65 20      pCsr->pNode 
93a0: 3d 20 70 52 6f 6f 74 3b 0a 20 20 20 20 20 20 66  = pRoot;.      f
93b0: 6f 72 28 70 43 73 72 2d 3e 69 43 65 6c 6c 3d 30  or(pCsr->iCell=0
93c0: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
93d0: 26 26 20 70 43 73 72 2d 3e 69 43 65 6c 6c 3c 6e  && pCsr->iCell<n
93e0: 43 65 6c 6c 3b 20 70 43 73 72 2d 3e 69 43 65 6c  Cell; pCsr->iCel
93f0: 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73  l++){.        as
9400: 73 65 72 74 28 20 70 43 73 72 2d 3e 70 4e 6f 64  sert( pCsr->pNod
9410: 65 3d 3d 70 52 6f 6f 74 20 29 3b 0a 20 20 20 20  e==pRoot );.    
9420: 20 20 20 20 72 63 20 3d 20 64 65 73 63 65 6e 64      rc = descend
9430: 54 6f 43 65 6c 6c 28 70 52 74 72 65 65 2c 20 70  ToCell(pRtree, p
9440: 43 73 72 2c 20 70 52 74 72 65 65 2d 3e 69 44 65  Csr, pRtree->iDe
9450: 70 74 68 2c 20 26 69 73 45 6f 66 29 3b 0a 20 20  pth, &isEof);.  
9460: 20 20 20 20 20 20 69 66 28 20 21 69 73 45 6f 66        if( !isEof
9470: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72   ){.          br
9480: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
9490: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
94a0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
94b0: 26 20 69 73 45 6f 66 20 29 7b 0a 20 20 20 20 20  & isEof ){.     
94c0: 20 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d     assert( pCsr-
94d0: 3e 70 4e 6f 64 65 3d 3d 70 52 6f 6f 74 20 29 3b  >pNode==pRoot );
94e0: 0a 20 20 20 20 20 20 20 20 6e 6f 64 65 52 65 6c  .        nodeRel
94f0: 65 61 73 65 28 70 52 74 72 65 65 2c 20 70 52 6f  ease(pRtree, pRo
9500: 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 70 43 73  ot);.        pCs
9510: 72 2d 3e 70 4e 6f 64 65 20 3d 20 30 3b 0a 20 20  r->pNode = 0;.  
9520: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
9530: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
9540: 4b 20 7c 7c 20 21 70 43 73 72 2d 3e 70 4e 6f 64  K || !pCsr->pNod
9550: 65 20 7c 7c 20 70 43 73 72 2d 3e 69 43 65 6c 6c  e || pCsr->iCell
9560: 3c 4e 43 45 4c 4c 28 70 43 73 72 2d 3e 70 4e 6f  <NCELL(pCsr->pNo
9570: 64 65 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  de) );.    }.  }
9580: 0a 0a 20 20 72 74 72 65 65 52 65 6c 65 61 73 65  ..  rtreeRelease
9590: 28 70 52 74 72 65 65 29 3b 0a 20 20 72 65 74 75  (pRtree);.  retu
95a0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
95b0: 53 65 74 20 74 68 65 20 70 49 64 78 49 6e 66 6f  Set the pIdxInfo
95c0: 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 20  ->estimatedRows 
95d0: 76 61 72 69 61 62 6c 65 20 74 6f 20 6e 52 6f 77  variable to nRow
95e0: 2e 20 55 6e 6c 65 73 73 20 74 68 69 73 0a 2a 2a  . Unless this.**
95f0: 20 65 78 74 65 6e 73 69 6f 6e 20 69 73 20 63 75   extension is cu
9600: 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 75 73  rrently being us
9610: 65 64 20 62 79 20 61 20 76 65 72 73 69 6f 6e 20  ed by a version 
9620: 6f 66 20 53 51 4c 69 74 65 20 74 6f 6f 20 6f 6c  of SQLite too ol
9630: 64 20 74 6f 0a 2a 2a 20 73 75 70 70 6f 72 74 20  d to.** support 
9640: 65 73 74 69 6d 61 74 65 64 52 6f 77 73 2e 20 49  estimatedRows. I
9650: 6e 20 74 68 61 74 20 63 61 73 65 20 74 68 69 73  n that case this
9660: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
9670: 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
9680: 76 6f 69 64 20 73 65 74 45 73 74 69 6d 61 74 65  void setEstimate
9690: 64 52 6f 77 73 28 73 71 6c 69 74 65 33 5f 69 6e  dRows(sqlite3_in
96a0: 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e  dex_info *pIdxIn
96b0: 66 6f 2c 20 69 36 34 20 6e 52 6f 77 29 7b 0a 23  fo, i64 nRow){.#
96c0: 69 66 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f  if SQLITE_VERSIO
96d0: 4e 5f 4e 55 4d 42 45 52 3e 3d 33 30 30 38 30 30  N_NUMBER>=300800
96e0: 32 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  2.  if( sqlite3_
96f0: 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65  libversion_numbe
9700: 72 28 29 3e 3d 33 30 30 38 30 30 32 20 29 7b 0a  r()>=3008002 ){.
9710: 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73      pIdxInfo->es
9720: 74 69 6d 61 74 65 64 52 6f 77 73 20 3d 20 6e 52  timatedRows = nR
9730: 6f 77 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  ow;.  }.#endif.}
9740: 0a 0a 2f 2a 0a 2a 2a 20 52 74 72 65 65 20 76 69  ../*.** Rtree vi
9750: 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75  rtual table modu
9760: 6c 65 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65  le xBestIndex me
9770: 74 68 6f 64 2e 20 54 68 65 72 65 20 61 72 65 20  thod. There are 
9780: 74 68 72 65 65 0a 2a 2a 20 74 61 62 6c 65 20 73  three.** table s
9790: 63 61 6e 20 73 74 72 61 74 65 67 69 65 73 20 74  can strategies t
97a0: 6f 20 63 68 6f 6f 73 65 20 66 72 6f 6d 20 28 69  o choose from (i
97b0: 6e 20 6f 72 64 65 72 20 66 72 6f 6d 20 6d 6f 73  n order from mos
97c0: 74 20 74 6f 20 0a 2a 2a 20 6c 65 61 73 74 20 64  t to .** least d
97d0: 65 73 69 72 61 62 6c 65 29 3a 0a 2a 2a 0a 2a 2a  esirable):.**.**
97e0: 20 20 20 69 64 78 4e 75 6d 20 20 20 20 20 69 64     idxNum     id
97f0: 78 53 74 72 20 20 20 20 20 20 20 20 53 74 72 61  xStr        Stra
9800: 74 65 67 79 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d  tegy.**   ------
9810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
9840: 20 20 31 20 20 20 20 20 20 20 20 55 6e 75 73 65    1        Unuse
9850: 64 20 20 20 20 20 20 20 20 44 69 72 65 63 74 20  d        Direct 
9860: 6c 6f 6f 6b 75 70 20 62 79 20 72 6f 77 69 64 2e  lookup by rowid.
9870: 0a 2a 2a 20 20 20 20 20 32 20 20 20 20 20 20 20  .**     2       
9880: 20 53 65 65 20 62 65 6c 6f 77 20 20 20 20 20 52   See below     R
9890: 2d 74 72 65 65 20 71 75 65 72 79 20 6f 72 20 66  -tree query or f
98a0: 75 6c 6c 2d 74 61 62 6c 65 20 73 63 61 6e 2e 0a  ull-table scan..
98b0: 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  **   -----------
98c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
98d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
98e0: 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 49 66 20 73  -----.**.** If s
98f0: 74 72 61 74 65 67 79 20 31 20 69 73 20 75 73 65  trategy 1 is use
9900: 64 2c 20 74 68 65 6e 20 69 64 78 53 74 72 20 69  d, then idxStr i
9910: 73 20 6e 6f 74 20 6d 65 61 6e 69 6e 67 66 75 6c  s not meaningful
9920: 2e 20 49 66 20 73 74 72 61 74 65 67 79 0a 2a 2a  . If strategy.**
9930: 20 32 20 69 73 20 75 73 65 64 2c 20 69 64 78 53   2 is used, idxS
9940: 74 72 20 69 73 20 66 6f 72 6d 61 74 74 65 64 20  tr is formatted 
9950: 74 6f 20 63 6f 6e 74 61 69 6e 20 32 20 62 79 74  to contain 2 byt
9960: 65 73 20 66 6f 72 20 65 61 63 68 20 0a 2a 2a 20  es for each .** 
9970: 63 6f 6e 73 74 72 61 69 6e 74 20 75 73 65 64 2e  constraint used.
9980: 20 54 68 65 20 66 69 72 73 74 20 74 77 6f 20 62   The first two b
9990: 79 74 65 73 20 6f 66 20 69 64 78 53 74 72 20 63  ytes of idxStr c
99a0: 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 0a 2a 2a  orrespond to .**
99b0: 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
99c0: 69 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  in sqlite3_index
99d0: 5f 69 6e 66 6f 2e 61 43 6f 6e 73 74 72 61 69 6e  _info.aConstrain
99e0: 74 55 73 61 67 65 5b 5d 20 77 69 74 68 0a 2a 2a  tUsage[] with.**
99f0: 20 28 61 72 67 76 49 6e 64 65 78 3d 3d 31 29 20   (argvIndex==1) 
9a00: 65 74 63 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  etc..**.** The f
9a10: 69 72 73 74 20 6f 66 20 65 61 63 68 20 70 61 69  irst of each pai
9a20: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 69 64  r of bytes in id
9a30: 78 53 74 72 20 69 64 65 6e 74 69 66 69 65 73 20  xStr identifies 
9a40: 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a  the constraint.*
9a50: 2a 20 6f 70 65 72 61 74 6f 72 20 61 73 20 66 6f  * operator as fo
9a60: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f  llows:.**.**   O
9a70: 70 65 72 61 74 6f 72 20 20 20 20 42 79 74 65 20  perator    Byte 
9a80: 56 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d  Value.**   -----
9a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9aa0: 2d 0a 2a 2a 20 20 20 20 20 20 3d 20 20 20 20 20  -.**      =     
9ab0: 20 20 20 30 78 34 31 20 28 27 41 27 29 0a 2a 2a     0x41 ('A').**
9ac0: 20 20 20 20 20 3c 3d 20 20 20 20 20 20 20 20 30       <=        0
9ad0: 78 34 32 20 28 27 42 27 29 0a 2a 2a 20 20 20 20  x42 ('B').**    
9ae0: 20 20 3c 20 20 20 20 20 20 20 20 30 78 34 33 20    <        0x43 
9af0: 28 27 43 27 29 0a 2a 2a 20 20 20 20 20 3e 3d 20  ('C').**     >= 
9b00: 20 20 20 20 20 20 20 30 78 34 34 20 28 27 44 27         0x44 ('D'
9b10: 29 0a 2a 2a 20 20 20 20 20 20 3e 20 20 20 20 20  ).**      >     
9b20: 20 20 20 30 78 34 35 20 28 27 45 27 29 0a 2a 2a     0x45 ('E').**
9b30: 20 20 20 4d 41 54 43 48 20 20 20 20 20 20 20 30     MATCH       0
9b40: 78 34 36 20 28 27 46 27 29 0a 2a 2a 20 20 20 2d  x46 ('F').**   -
9b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9b60: 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 54 68 65 20  -----.**.** The 
9b70: 73 65 63 6f 6e 64 20 6f 66 20 65 61 63 68 20 70  second of each p
9b80: 61 69 72 20 6f 66 20 62 79 74 65 73 20 69 64 65  air of bytes ide
9b90: 6e 74 69 66 69 65 73 20 74 68 65 20 63 6f 6f 72  ntifies the coor
9ba0: 64 69 6e 61 74 65 20 63 6f 6c 75 6d 6e 0a 2a 2a  dinate column.**
9bb0: 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 63 6f   to which the co
9bc0: 6e 73 74 72 61 69 6e 74 20 61 70 70 6c 69 65 73  nstraint applies
9bd0: 2e 20 54 68 65 20 6c 65 66 74 6d 6f 73 74 20 63  . The leftmost c
9be0: 6f 6f 72 64 69 6e 61 74 65 20 63 6f 6c 75 6d 6e  oordinate column
9bf0: 0a 2a 2a 20 69 73 20 27 61 27 2c 20 74 68 65 20  .** is 'a', the 
9c00: 73 65 63 6f 6e 64 20 66 72 6f 6d 20 74 68 65 20  second from the 
9c10: 6c 65 66 74 20 27 62 27 20 65 74 63 2e 0a 2a 2f  left 'b' etc..*/
9c20: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 74 72 65  .static int rtre
9c30: 65 42 65 73 74 49 6e 64 65 78 28 73 71 6c 69 74  eBestIndex(sqlit
9c40: 65 33 5f 76 74 61 62 20 2a 74 61 62 2c 20 73 71  e3_vtab *tab, sq
9c50: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
9c60: 20 2a 70 49 64 78 49 6e 66 6f 29 7b 0a 20 20 52   *pIdxInfo){.  R
9c70: 74 72 65 65 20 2a 70 52 74 72 65 65 20 3d 20 28  tree *pRtree = (
9c80: 52 74 72 65 65 2a 29 74 61 62 3b 0a 20 20 69 6e  Rtree*)tab;.  in
9c90: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
9ca0: 3b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 36  ;.  int ii;.  i6
9cb0: 34 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 20 20  4 nRow;         
9cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9cd0: 20 45 73 74 69 6d 61 74 65 64 20 72 6f 77 73 20   Estimated rows 
9ce0: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
9cf0: 20 73 63 61 6e 20 2a 2f 0a 0a 20 20 69 6e 74 20   scan */..  int 
9d00: 69 49 64 78 20 3d 20 30 3b 0a 20 20 63 68 61 72  iIdx = 0;.  char
9d10: 20 7a 49 64 78 53 74 72 5b 52 54 52 45 45 5f 4d   zIdxStr[RTREE_M
9d20: 41 58 5f 44 49 4d 45 4e 53 49 4f 4e 53 2a 38 2b  AX_DIMENSIONS*8+
9d30: 31 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 7a 49 64  1];.  memset(zId
9d40: 78 53 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  xStr, 0, sizeof(
9d50: 7a 49 64 78 53 74 72 29 29 3b 0a 0a 20 20 61 73  zIdxStr));..  as
9d60: 73 65 72 74 28 20 70 49 64 78 49 6e 66 6f 2d 3e  sert( pIdxInfo->
9d70: 69 64 78 53 74 72 3d 3d 30 20 29 3b 0a 20 20 66  idxStr==0 );.  f
9d80: 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 49 64 78  or(ii=0; ii<pIdx
9d90: 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
9da0: 74 20 26 26 20 69 49 64 78 3c 28 69 6e 74 29 28  t && iIdx<(int)(
9db0: 73 69 7a 65 6f 66 28 7a 49 64 78 53 74 72 29 2d  sizeof(zIdxStr)-
9dc0: 31 29 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73  1); ii++){.    s
9dd0: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
9de0: 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a  dex_constraint *
9df0: 70 20 3d 20 26 70 49 64 78 49 6e 66 6f 2d 3e 61  p = &pIdxInfo->a
9e00: 43 6f 6e 73 74 72 61 69 6e 74 5b 69 69 5d 3b 0a  Constraint[ii];.
9e10: 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 73 61 62  .    if( p->usab
9e20: 6c 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e  le && p->iColumn
9e30: 3d 3d 30 20 26 26 20 70 2d 3e 6f 70 3d 3d 53 51  ==0 && p->op==SQ
9e40: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
9e50: 52 41 49 4e 54 5f 45 51 20 29 7b 0a 20 20 20 20  RAINT_EQ ){.    
9e60: 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61 6e 20    /* We have an 
9e70: 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
9e80: 69 6e 74 20 6f 6e 20 74 68 65 20 72 6f 77 69 64  int on the rowid
9e90: 2e 20 55 73 65 20 73 74 72 61 74 65 67 79 20 31  . Use strategy 1
9ea0: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a  . */.      int j
9eb0: 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d  j;.      for(jj=
9ec0: 30 3b 20 6a 6a 3c 69 69 3b 20 6a 6a 2b 2b 29 7b  0; jj<ii; jj++){
9ed0: 0a 20 20 20 20 20 20 20 20 70 49 64 78 49 6e 66  .        pIdxInf
9ee0: 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
9ef0: 61 67 65 5b 6a 6a 5d 2e 61 72 67 76 49 6e 64 65  age[jj].argvInde
9f00: 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  x = 0;.        p
9f10: 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
9f20: 61 69 6e 74 55 73 61 67 65 5b 6a 6a 5d 2e 6f 6d  aintUsage[jj].om
9f30: 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  it = 0;.      }.
9f40: 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e        pIdxInfo->
9f50: 69 64 78 4e 75 6d 20 3d 20 31 3b 0a 20 20 20 20  idxNum = 1;.    
9f60: 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e    pIdxInfo->aCon
9f70: 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 69 5d  straintUsage[ii]
9f80: 2e 61 72 67 76 49 6e 64 65 78 20 3d 20 31 3b 0a  .argvIndex = 1;.
9f90: 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e        pIdxInfo->
9fa0: 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
9fb0: 5b 6a 6a 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a 0a  [jj].omit = 1;..
9fc0: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 74        /* This st
9fd0: 72 61 74 65 67 79 20 69 6e 76 6f 6c 76 65 73 20  rategy involves 
9fe0: 61 20 74 77 6f 20 72 6f 77 69 64 20 6c 6f 6f 6b  a two rowid look
9ff0: 75 70 73 20 6f 6e 20 61 6e 20 42 2d 54 72 65 65  ups on an B-Tree
a000: 20 73 74 72 75 63 74 75 72 65 73 0a 20 20 20 20   structures.    
a010: 20 20 2a 2a 20 61 6e 64 20 74 68 65 6e 20 61 20    ** and then a 
a020: 6c 69 6e 65 61 72 20 73 65 61 72 63 68 20 6f 66  linear search of
a030: 20 61 6e 20 52 2d 54 72 65 65 20 6e 6f 64 65 2e   an R-Tree node.
a040: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20   This should be 
a050: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64  .      ** consid
a060: 65 72 65 64 20 61 6c 6d 6f 73 74 20 61 73 20 71  ered almost as q
a070: 75 69 63 6b 20 61 73 20 61 20 64 69 72 65 63 74  uick as a direct
a080: 20 72 6f 77 69 64 20 6c 6f 6f 6b 75 70 20 28 66   rowid lookup (f
a090: 6f 72 20 77 68 69 63 68 20 0a 20 20 20 20 20 20  or which .      
a0a0: 2a 2a 20 73 71 6c 69 74 65 20 75 73 65 73 20 61  ** sqlite uses a
a0b0: 6e 20 69 6e 74 65 72 6e 61 6c 20 63 6f 73 74 20  n internal cost 
a0c0: 6f 66 20 30 2e 30 29 2e 20 49 74 20 69 73 20 65  of 0.0). It is e
a0d0: 78 70 65 63 74 65 64 20 74 6f 20 72 65 74 75 72  xpected to retur
a0e0: 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 69 6e  n.      ** a sin
a0f0: 67 6c 65 20 72 6f 77 2e 0a 20 20 20 20 20 20 2a  gle row..      *
a100: 2f 20 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66  / .      pIdxInf
a110: 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  o->estimatedCost
a120: 20 3d 20 33 30 2e 30 3b 0a 20 20 20 20 20 20 73   = 30.0;.      s
a130: 65 74 45 73 74 69 6d 61 74 65 64 52 6f 77 73 28  etEstimatedRows(
a140: 70 49 64 78 49 6e 66 6f 2c 20 31 29 3b 0a 20 20  pIdxInfo, 1);.  
a150: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
a160: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  E_OK;.    }..   
a170: 20 69 66 28 20 70 2d 3e 75 73 61 62 6c 65 20 26   if( p->usable &
a180: 26 20 28 70 2d 3e 69 43 6f 6c 75 6d 6e 3e 30 20  & (p->iColumn>0 
a190: 7c 7c 20 70 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45  || p->op==SQLITE
a1a0: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
a1b0: 54 5f 4d 41 54 43 48 29 20 29 7b 0a 20 20 20 20  T_MATCH) ){.    
a1c0: 20 20 75 38 20 6f 70 3b 0a 20 20 20 20 20 20 73    u8 op;.      s
a1d0: 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a  witch( p->op ){.
a1e0: 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
a1f0: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
a200: 41 49 4e 54 5f 45 51 3a 20 6f 70 20 3d 20 52 54  AINT_EQ: op = RT
a210: 52 45 45 5f 45 51 3b 20 62 72 65 61 6b 3b 0a 20  REE_EQ; break;. 
a220: 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
a230: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
a240: 49 4e 54 5f 47 54 3a 20 6f 70 20 3d 20 52 54 52  INT_GT: op = RTR
a250: 45 45 5f 47 54 3b 20 62 72 65 61 6b 3b 0a 20 20  EE_GT; break;.  
a260: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
a270: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
a280: 4e 54 5f 4c 45 3a 20 6f 70 20 3d 20 52 54 52 45  NT_LE: op = RTRE
a290: 45 5f 4c 45 3b 20 62 72 65 61 6b 3b 0a 20 20 20  E_LE; break;.   
a2a0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
a2b0: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
a2c0: 54 5f 4c 54 3a 20 6f 70 20 3d 20 52 54 52 45 45  T_LT: op = RTREE
a2d0: 5f 4c 54 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  _LT; break;.    
a2e0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
a2f0: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
a300: 5f 47 45 3a 20 6f 70 20 3d 20 52 54 52 45 45 5f  _GE: op = RTREE_
a310: 47 45 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  GE; break;.     
a320: 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
a330: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a340: 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  >op==SQLITE_INDE
a350: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54  X_CONSTRAINT_MAT
a360: 43 48 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  CH );.          
a370: 6f 70 20 3d 20 52 54 52 45 45 5f 4d 41 54 43 48  op = RTREE_MATCH
a380: 3b 20 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  ; .          bre
a390: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
a3a0: 20 20 7a 49 64 78 53 74 72 5b 69 49 64 78 2b 2b    zIdxStr[iIdx++
a3b0: 5d 20 3d 20 6f 70 3b 0a 20 20 20 20 20 20 7a 49  ] = op;.      zI
a3c0: 64 78 53 74 72 5b 69 49 64 78 2b 2b 5d 20 3d 20  dxStr[iIdx++] = 
a3d0: 70 2d 3e 69 43 6f 6c 75 6d 6e 20 2d 20 31 20 2b  p->iColumn - 1 +
a3e0: 20 27 61 27 3b 0a 20 20 20 20 20 20 70 49 64 78   'a';.      pIdx
a3f0: 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
a400: 74 55 73 61 67 65 5b 69 69 5d 2e 61 72 67 76 49  tUsage[ii].argvI
a410: 6e 64 65 78 20 3d 20 28 69 49 64 78 2f 32 29 3b  ndex = (iIdx/2);
a420: 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  .      pIdxInfo-
a430: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
a440: 65 5b 69 69 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a  e[ii].omit = 1;.
a450: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 49 64      }.  }..  pId
a460: 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20  xInfo->idxNum = 
a470: 32 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e  2;.  pIdxInfo->n
a480: 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
a490: 3d 20 31 3b 0a 20 20 69 66 28 20 69 49 64 78 3e  = 1;.  if( iIdx>
a4a0: 30 20 26 26 20 30 3d 3d 28 70 49 64 78 49 6e 66  0 && 0==(pIdxInf
a4b0: 6f 2d 3e 69 64 78 53 74 72 20 3d 20 73 71 6c 69  o->idxStr = sqli
a4c0: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
a4d0: 2c 20 7a 49 64 78 53 74 72 29 29 20 29 7b 0a 20  , zIdxStr)) ){. 
a4e0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a4f0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 6e  _NOMEM;.  }..  n
a500: 52 6f 77 20 3d 20 70 52 74 72 65 65 2d 3e 6e 52  Row = pRtree->nR
a510: 6f 77 45 73 74 20 2f 20 28 69 49 64 78 20 2b 20  owEst / (iIdx + 
a520: 31 29 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e  1);.  pIdxInfo->
a530: 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20  estimatedCost = 
a540: 28 64 6f 75 62 6c 65 29 36 2e 30 20 2a 20 28 64  (double)6.0 * (d
a550: 6f 75 62 6c 65 29 6e 52 6f 77 3b 0a 20 20 73 65  ouble)nRow;.  se
a560: 74 45 73 74 69 6d 61 74 65 64 52 6f 77 73 28 70  tEstimatedRows(p
a570: 49 64 78 49 6e 66 6f 2c 20 6e 52 6f 77 29 3b 0a  IdxInfo, nRow);.
a580: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
a590: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
a5a0: 65 20 4e 2d 64 69 6d 65 6e 73 69 6f 6e 61 6c 20  e N-dimensional 
a5b0: 76 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 63 65  volumn of the ce
a5c0: 6c 6c 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 2e  ll stored in *p.
a5d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 52 74 72 65 65  .*/.static Rtree
a5e0: 44 56 61 6c 75 65 20 63 65 6c 6c 41 72 65 61 28  DValue cellArea(
a5f0: 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c 20 52  Rtree *pRtree, R
a600: 74 72 65 65 43 65 6c 6c 20 2a 70 29 7b 0a 20 20  treeCell *p){.  
a610: 52 74 72 65 65 44 56 61 6c 75 65 20 61 72 65 61  RtreeDValue area
a620: 20 3d 20 28 52 74 72 65 65 44 56 61 6c 75 65 29   = (RtreeDValue)
a630: 31 3b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 66  1;.  int ii;.  f
a640: 6f 72 28 69 69 3d 30 3b 20 69 69 3c 28 70 52 74  or(ii=0; ii<(pRt
a650: 72 65 65 2d 3e 6e 44 69 6d 2a 32 29 3b 20 69 69  ree->nDim*2); ii
a660: 2b 3d 32 29 7b 0a 20 20 20 20 61 72 65 61 20 3d  +=2){.    area =
a670: 20 28 61 72 65 61 20 2a 20 28 44 43 4f 4f 52 44   (area * (DCOORD
a680: 28 70 2d 3e 61 43 6f 6f 72 64 5b 69 69 2b 31 5d  (p->aCoord[ii+1]
a690: 29 20 2d 20 44 43 4f 4f 52 44 28 70 2d 3e 61 43  ) - DCOORD(p->aC
a6a0: 6f 6f 72 64 5b 69 69 5d 29 29 29 3b 0a 20 20 7d  oord[ii])));.  }
a6b0: 0a 20 20 72 65 74 75 72 6e 20 61 72 65 61 3b 0a  .  return area;.
a6c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
a6d0: 74 68 65 20 6d 61 72 67 69 6e 20 6c 65 6e 67 74  the margin lengt
a6e0: 68 20 6f 66 20 63 65 6c 6c 20 70 2e 20 54 68 65  h of cell p. The
a6f0: 20 6d 61 72 67 69 6e 20 6c 65 6e 67 74 68 20 69   margin length i
a700: 73 20 74 68 65 20 73 75 6d 0a 2a 2a 20 6f 66 20  s the sum.** of 
a710: 74 68 65 20 6f 62 6a 65 63 74 73 20 73 69 7a 65  the objects size
a720: 20 69 6e 20 65 61 63 68 20 64 69 6d 65 6e 73 69   in each dimensi
a730: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 52 74  on..*/.static Rt
a740: 72 65 65 44 56 61 6c 75 65 20 63 65 6c 6c 4d 61  reeDValue cellMa
a750: 72 67 69 6e 28 52 74 72 65 65 20 2a 70 52 74 72  rgin(Rtree *pRtr
a760: 65 65 2c 20 52 74 72 65 65 43 65 6c 6c 20 2a 70  ee, RtreeCell *p
a770: 29 7b 0a 20 20 52 74 72 65 65 44 56 61 6c 75 65  ){.  RtreeDValue
a780: 20 6d 61 72 67 69 6e 20 3d 20 28 52 74 72 65 65   margin = (Rtree
a790: 44 56 61 6c 75 65 29 30 3b 0a 20 20 69 6e 74 20  DValue)0;.  int 
a7a0: 69 69 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20  ii;.  for(ii=0; 
a7b0: 69 69 3c 28 70 52 74 72 65 65 2d 3e 6e 44 69 6d  ii<(pRtree->nDim
a7c0: 2a 32 29 3b 20 69 69 2b 3d 32 29 7b 0a 20 20 20  *2); ii+=2){.   
a7d0: 20 6d 61 72 67 69 6e 20 2b 3d 20 28 44 43 4f 4f   margin += (DCOO
a7e0: 52 44 28 70 2d 3e 61 43 6f 6f 72 64 5b 69 69 2b  RD(p->aCoord[ii+
a7f0: 31 5d 29 20 2d 20 44 43 4f 4f 52 44 28 70 2d 3e  1]) - DCOORD(p->
a800: 61 43 6f 6f 72 64 5b 69 69 5d 29 29 3b 0a 20 20  aCoord[ii]));.  
a810: 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 72 67 69  }.  return margi
a820: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 6f 72  n;.}../*.** Stor
a830: 65 20 74 68 65 20 75 6e 69 6f 6e 20 6f 66 20 63  e the union of c
a840: 65 6c 6c 73 20 70 31 20 61 6e 64 20 70 32 20 69  ells p1 and p2 i
a850: 6e 20 70 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  n p1..*/.static 
a860: 76 6f 69 64 20 63 65 6c 6c 55 6e 69 6f 6e 28 52  void cellUnion(R
a870: 74 72 65 65 20 2a 70 52 74 72 65 65 2c 20 52 74  tree *pRtree, Rt
a880: 72 65 65 43 65 6c 6c 20 2a 70 31 2c 20 52 74 72  reeCell *p1, Rtr
a890: 65 65 43 65 6c 6c 20 2a 70 32 29 7b 0a 20 20 69  eeCell *p2){.  i
a8a0: 6e 74 20 69 69 3b 0a 20 20 69 66 28 20 70 52 74  nt ii;.  if( pRt
a8b0: 72 65 65 2d 3e 65 43 6f 6f 72 64 54 79 70 65 3d  ree->eCoordType=
a8c0: 3d 52 54 52 45 45 5f 43 4f 4f 52 44 5f 52 45 41  =RTREE_COORD_REA
a8d0: 4c 33 32 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  L32 ){.    for(i
a8e0: 69 3d 30 3b 20 69 69 3c 28 70 52 74 72 65 65 2d  i=0; ii<(pRtree-
a8f0: 3e 6e 44 69 6d 2a 32 29 3b 20 69 69 2b 3d 32 29  >nDim*2); ii+=2)
a900: 7b 0a 20 20 20 20 20 20 70 31 2d 3e 61 43 6f 6f  {.      p1->aCoo
a910: 72 64 5b 69 69 5d 2e 66 20 3d 20 4d 49 4e 28 70  rd[ii].f = MIN(p
a920: 31 2d 3e 61 43 6f 6f 72 64 5b 69 69 5d 2e 66 2c  1->aCoord[ii].f,
a930: 20 70 32 2d 3e 61 43 6f 6f 72 64 5b 69 69 5d 2e   p2->aCoord[ii].
a940: 66 29 3b 0a 20 20 20 20 20 20 70 31 2d 3e 61 43  f);.      p1->aC
a950: 6f 6f 72 64 5b 69 69 2b 31 5d 2e 66 20 3d 20 4d  oord[ii+1].f = M
a960: 41 58 28 70 31 2d 3e 61 43 6f 6f 72 64 5b 69 69  AX(p1->aCoord[ii
a970: 2b 31 5d 2e 66 2c 20 70 32 2d 3e 61 43 6f 6f 72  +1].f, p2->aCoor
a980: 64 5b 69 69 2b 31 5d 2e 66 29 3b 0a 20 20 20 20  d[ii+1].f);.    
a990: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  }.  }else{.    f
a9a0: 6f 72 28 69 69 3d 30 3b 20 69 69 3c 28 70 52 74  or(ii=0; ii<(pRt
a9b0: 72 65 65 2d 3e 6e 44 69 6d 2a 32 29 3b 20 69 69  ree->nDim*2); ii
a9c0: 2b 3d 32 29 7b 0a 20 20 20 20 20 20 70 31 2d 3e  +=2){.      p1->
a9d0: 61 43 6f 6f 72 64 5b 69 69 5d 2e 69 20 3d 20 4d  aCoord[ii].i = M
a9e0: 49 4e 28 70 31 2d 3e 61 43 6f 6f 72 64 5b 69 69  IN(p1->aCoord[ii
a9f0: 5d 2e 69 2c 20 70 32 2d 3e 61 43 6f 6f 72 64 5b  ].i, p2->aCoord[
aa00: 69 69 5d 2e 69 29 3b 0a 20 20 20 20 20 20 70 31  ii].i);.      p1
aa10: 2d 3e 61 43 6f 6f 72 64 5b 69 69 2b 31 5d 2e 69  ->aCoord[ii+1].i
aa20: 20 3d 20 4d 41 58 28 70 31 2d 3e 61 43 6f 6f 72   = MAX(p1->aCoor
aa30: 64 5b 69 69 2b 31 5d 2e 69 2c 20 70 32 2d 3e 61  d[ii+1].i, p2->a
aa40: 43 6f 6f 72 64 5b 69 69 2b 31 5d 2e 69 29 3b 0a  Coord[ii+1].i);.
aa50: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
aa60: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
aa70: 66 20 74 68 65 20 61 72 65 61 20 63 6f 76 65 72  f the area cover
aa80: 65 64 20 62 79 20 70 32 20 69 73 20 61 20 73 75  ed by p2 is a su
aa90: 62 73 65 74 20 6f 66 20 74 68 65 20 61 72 65 61  bset of the area
aaa0: 20 63 6f 76 65 72 65 64 0a 2a 2a 20 62 79 20 70   covered.** by p
aab0: 31 2e 20 46 61 6c 73 65 20 6f 74 68 65 72 77 69  1. False otherwi
aac0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
aad0: 74 20 63 65 6c 6c 43 6f 6e 74 61 69 6e 73 28 52  t cellContains(R
aae0: 74 72 65 65 20 2a 70 52 74 72 65 65 2c 20 52 74  tree *pRtree, Rt
aaf0: 72 65 65 43 65 6c 6c 20 2a 70 31 2c 20 52 74 72  reeCell *p1, Rtr
ab00: 65 65 43 65 6c 6c 20 2a 70 32 29 7b 0a 20 20 69  eeCell *p2){.  i
ab10: 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20 69 73 49  nt ii;.  int isI
ab20: 6e 74 20 3d 20 28 70 52 74 72 65 65 2d 3e 65 43  nt = (pRtree->eC
ab30: 6f 6f 72 64 54 79 70 65 3d 3d 52 54 52 45 45 5f  oordType==RTREE_
ab40: 43 4f 4f 52 44 5f 49 4e 54 33 32 29 3b 0a 20 20  COORD_INT32);.  
ab50: 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 28 70 52  for(ii=0; ii<(pR
ab60: 74 72 65 65 2d 3e 6e 44 69 6d 2a 32 29 3b 20 69  tree->nDim*2); i
ab70: 69 2b 3d 32 29 7b 0a 20 20 20 20 52 74 72 65 65  i+=2){.    Rtree
ab80: 43 6f 6f 72 64 20 2a 61 31 20 3d 20 26 70 31 2d  Coord *a1 = &p1-
ab90: 3e 61 43 6f 6f 72 64 5b 69 69 5d 3b 0a 20 20 20  >aCoord[ii];.   
aba0: 20 52 74 72 65 65 43 6f 6f 72 64 20 2a 61 32 20   RtreeCoord *a2 
abb0: 3d 20 26 70 32 2d 3e 61 43 6f 6f 72 64 5b 69 69  = &p2->aCoord[ii
abc0: 5d 3b 0a 20 20 20 20 69 66 28 20 28 21 69 73 49  ];.    if( (!isI
abd0: 6e 74 20 26 26 20 28 61 32 5b 30 5d 2e 66 3c 61  nt && (a2[0].f<a
abe0: 31 5b 30 5d 2e 66 20 7c 7c 20 61 32 5b 31 5d 2e  1[0].f || a2[1].
abf0: 66 3e 61 31 5b 31 5d 2e 66 29 29 20 0a 20 20 20  f>a1[1].f)) .   
ac00: 20 20 7c 7c 20 28 20 69 73 49 6e 74 20 26 26 20    || ( isInt && 
ac10: 28 61 32 5b 30 5d 2e 69 3c 61 31 5b 30 5d 2e 69  (a2[0].i<a1[0].i
ac20: 20 7c 7c 20 61 32 5b 31 5d 2e 69 3e 61 31 5b 31   || a2[1].i>a1[1
ac30: 5d 2e 69 29 29 20 0a 20 20 20 20 29 7b 0a 20 20  ].i)) .    ){.  
ac40: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
ac50: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
ac60: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   1;.}../*.** Ret
ac70: 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 63  urn the amount c
ac80: 65 6c 6c 20 70 20 77 6f 75 6c 64 20 67 72 6f 77  ell p would grow
ac90: 20 62 79 20 69 66 20 69 74 20 77 65 72 65 20 75   by if it were u
aca0: 6e 69 6f 6e 65 64 20 77 69 74 68 20 70 43 65 6c  nioned with pCel
acb0: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 52 74 72  l..*/.static Rtr
acc0: 65 65 44 56 61 6c 75 65 20 63 65 6c 6c 47 72 6f  eeDValue cellGro
acd0: 77 74 68 28 52 74 72 65 65 20 2a 70 52 74 72 65  wth(Rtree *pRtre
ace0: 65 2c 20 52 74 72 65 65 43 65 6c 6c 20 2a 70 2c  e, RtreeCell *p,
acf0: 20 52 74 72 65 65 43 65 6c 6c 20 2a 70 43 65 6c   RtreeCell *pCel
ad00: 6c 29 7b 0a 20 20 52 74 72 65 65 44 56 61 6c 75  l){.  RtreeDValu
ad10: 65 20 61 72 65 61 3b 0a 20 20 52 74 72 65 65 43  e area;.  RtreeC
ad20: 65 6c 6c 20 63 65 6c 6c 3b 0a 20 20 6d 65 6d 63  ell cell;.  memc
ad30: 70 79 28 26 63 65 6c 6c 2c 20 70 2c 20 73 69 7a  py(&cell, p, siz
ad40: 65 6f 66 28 52 74 72 65 65 43 65 6c 6c 29 29 3b  eof(RtreeCell));
ad50: 0a 20 20 61 72 65 61 20 3d 20 63 65 6c 6c 41 72  .  area = cellAr
ad60: 65 61 28 70 52 74 72 65 65 2c 20 26 63 65 6c 6c  ea(pRtree, &cell
ad70: 29 3b 0a 20 20 63 65 6c 6c 55 6e 69 6f 6e 28 70  );.  cellUnion(p
ad80: 52 74 72 65 65 2c 20 26 63 65 6c 6c 2c 20 70 43  Rtree, &cell, pC
ad90: 65 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  ell);.  return (
ada0: 63 65 6c 6c 41 72 65 61 28 70 52 74 72 65 65 2c  cellArea(pRtree,
adb0: 20 26 63 65 6c 6c 29 2d 61 72 65 61 29 3b 0a 7d   &cell)-area);.}
adc0: 0a 0a 23 69 66 20 56 41 52 49 41 4e 54 5f 52 53  ..#if VARIANT_RS
add0: 54 41 52 54 52 45 45 5f 43 48 4f 4f 53 45 53 55  TARTREE_CHOOSESU
ade0: 42 54 52 45 45 20 7c 7c 20 56 41 52 49 41 4e 54  BTREE || VARIANT
adf0: 5f 52 53 54 41 52 54 52 45 45 5f 53 50 4c 49 54  _RSTARTREE_SPLIT
ae00: 0a 73 74 61 74 69 63 20 52 74 72 65 65 44 56 61  .static RtreeDVa
ae10: 6c 75 65 20 63 65 6c 6c 4f 76 65 72 6c 61 70 28  lue cellOverlap(
ae20: 0a 20 20 52 74 72 65 65 20 2a 70 52 74 72 65 65  .  Rtree *pRtree
ae30: 2c 20 0a 20 20 52 74 72 65 65 43 65 6c 6c 20 2a  , .  RtreeCell *
ae40: 70 2c 20 0a 20 20 52 74 72 65 65 43 65 6c 6c 20  p, .  RtreeCell 
ae50: 2a 61 43 65 6c 6c 2c 20 0a 20 20 69 6e 74 20 6e  *aCell, .  int n
ae60: 43 65 6c 6c 2c 20 0a 20 20 69 6e 74 20 69 45 78  Cell, .  int iEx
ae70: 63 6c 75 64 65 0a 29 7b 0a 20 20 69 6e 74 20 69  clude.){.  int i
ae80: 69 3b 0a 20 20 52 74 72 65 65 44 56 61 6c 75 65  i;.  RtreeDValue
ae90: 20 6f 76 65 72 6c 61 70 20 3d 20 30 2e 30 3b 0a   overlap = 0.0;.
aea0: 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e    for(ii=0; ii<n
aeb0: 43 65 6c 6c 3b 20 69 69 2b 2b 29 7b 0a 23 69 66  Cell; ii++){.#if
aec0: 20 56 41 52 49 41 4e 54 5f 52 53 54 41 52 54 52   VARIANT_RSTARTR
aed0: 45 45 5f 43 48 4f 4f 53 45 53 55 42 54 52 45 45  EE_CHOOSESUBTREE
aee0: 0a 20 20 20 20 69 66 28 20 69 69 21 3d 69 45 78  .    if( ii!=iEx
aef0: 63 6c 75 64 65 20 29 0a 23 65 6c 73 65 0a 20 20  clude ).#else.  
af00: 20 20 61 73 73 65 72 74 28 20 69 45 78 63 6c 75    assert( iExclu
af10: 64 65 3d 3d 2d 31 20 29 3b 0a 20 20 20 20 55 4e  de==-1 );.    UN
af20: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69  USED_PARAMETER(i
af30: 45 78 63 6c 75 64 65 29 3b 0a 23 65 6e 64 69 66  Exclude);.#endif
af40: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74  .    {.      int
af50: 20 6a 6a 3b 0a 20 20 20 20 20 20 52 74 72 65 65   jj;.      Rtree
af60: 44 56 61 6c 75 65 20 6f 20 3d 20 28 52 74 72 65  DValue o = (Rtre
af70: 65 44 56 61 6c 75 65 29 31 3b 0a 20 20 20 20 20  eDValue)1;.     
af80: 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 28 70   for(jj=0; jj<(p
af90: 52 74 72 65 65 2d 3e 6e 44 69 6d 2a 32 29 3b 20  Rtree->nDim*2); 
afa0: 6a 6a 2b 3d 32 29 7b 0a 20 20 20 20 20 20 20 20  jj+=2){.        
afb0: 52 74 72 65 65 44 56 61 6c 75 65 20 78 31 2c 20  RtreeDValue x1, 
afc0: 78 32 3b 0a 0a 20 20 20 20 20 20 20 20 78 31 20  x2;..        x1 
afd0: 3d 20 4d 41 58 28 44 43 4f 4f 52 44 28 70 2d 3e  = MAX(DCOORD(p->
afe0: 61 43 6f 6f 72 64 5b 6a 6a 5d 29 2c 20 44 43 4f  aCoord[jj]), DCO
aff0: 4f 52 44 28 61 43 65 6c 6c 5b 69 69 5d 2e 61 43  ORD(aCell[ii].aC
b000: 6f 6f 72 64 5b 6a 6a 5d 29 29 3b 0a 20 20 20 20  oord[jj]));.    
b010: 20 20 20 20 78 32 20 3d 20 4d 49 4e 28 44 43 4f      x2 = MIN(DCO
b020: 4f 52 44 28 70 2d 3e 61 43 6f 6f 72 64 5b 6a 6a  ORD(p->aCoord[jj
b030: 2b 31 5d 29 2c 20 44 43 4f 4f 52 44 28 61 43 65  +1]), DCOORD(aCe
b040: 6c 6c 5b 69 69 5d 2e 61 43 6f 6f 72 64 5b 6a 6a  ll[ii].aCoord[jj
b050: 2b 31 5d 29 29 3b 0a 0a 20 20 20 20 20 20 20 20  +1]));..        
b060: 69 66 28 20 78 32 3c 78 31 20 29 7b 0a 20 20 20  if( x2<x1 ){.   
b070: 20 20 20 20 20 20 20 6f 20 3d 20 30 2e 30 3b 0a         o = 0.0;.
b080: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
b090: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
b0a0: 20 20 20 20 20 20 20 20 20 20 6f 20 3d 20 6f 20            o = o 
b0b0: 2a 20 28 78 32 2d 78 31 29 3b 0a 20 20 20 20 20  * (x2-x1);.     
b0c0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
b0d0: 20 20 20 6f 76 65 72 6c 61 70 20 2b 3d 20 6f 3b     overlap += o;
b0e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
b0f0: 75 72 6e 20 6f 76 65 72 6c 61 70 3b 0a 7d 0a 23  urn overlap;.}.#
b100: 65 6e 64 69 66 0a 0a 23 69 66 20 56 41 52 49 41  endif..#if VARIA
b110: 4e 54 5f 52 53 54 41 52 54 52 45 45 5f 43 48 4f  NT_RSTARTREE_CHO
b120: 4f 53 45 53 55 42 54 52 45 45 0a 73 74 61 74 69  OSESUBTREE.stati
b130: 63 20 52 74 72 65 65 44 56 61 6c 75 65 20 63 65  c RtreeDValue ce
b140: 6c 6c 4f 76 65 72 6c 61 70 45 6e 6c 61 72 67 65  llOverlapEnlarge
b150: 6d 65 6e 74 28 0a 20 20 52 74 72 65 65 20 2a 70  ment(.  Rtree *p
b160: 52 74 72 65 65 2c 20 0a 20 20 52 74 72 65 65 43  Rtree, .  RtreeC
b170: 65 6c 6c 20 2a 70 2c 20 0a 20 20 52 74 72 65 65  ell *p, .  Rtree
b180: 43 65 6c 6c 20 2a 70 49 6e 73 65 72 74 2c 20 0a  Cell *pInsert, .
b190: 20 20 52 74 72 65 65 43 65 6c 6c 20 2a 61 43 65    RtreeCell *aCe
b1a0: 6c 6c 2c 20 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  ll, .  int nCell
b1b0: 2c 20 0a 20 20 69 6e 74 20 69 45 78 63 6c 75 64  , .  int iExclud
b1c0: 65 0a 29 7b 0a 20 20 52 74 72 65 65 44 56 61 6c  e.){.  RtreeDVal
b1d0: 75 65 20 62 65 66 6f 72 65 2c 20 61 66 74 65 72  ue before, after
b1e0: 3b 0a 20 20 62 65 66 6f 72 65 20 3d 20 63 65 6c  ;.  before = cel
b1f0: 6c 4f 76 65 72 6c 61 70 28 70 52 74 72 65 65 2c  lOverlap(pRtree,
b200: 20 70 2c 20 61 43 65 6c 6c 2c 20 6e 43 65 6c 6c   p, aCell, nCell
b210: 2c 20 69 45 78 63 6c 75 64 65 29 3b 0a 20 20 63  , iExclude);.  c
b220: 65 6c 6c 55 6e 69 6f 6e 28 70 52 74 72 65 65 2c  ellUnion(pRtree,
b230: 20 70 2c 20 70 49 6e 73 65 72 74 29 3b 0a 20 20   p, pInsert);.  
b240: 61 66 74 65 72 20 3d 20 63 65 6c 6c 4f 76 65 72  after = cellOver
b250: 6c 61 70 28 70 52 74 72 65 65 2c 20 70 2c 20 61  lap(pRtree, p, a
b260: 43 65 6c 6c 2c 20 6e 43 65 6c 6c 2c 20 69 45 78  Cell, nCell, iEx
b270: 63 6c 75 64 65 29 3b 0a 20 20 72 65 74 75 72 6e  clude);.  return
b280: 20 28 61 66 74 65 72 2d 62 65 66 6f 72 65 29 3b   (after-before);
b290: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
b2a0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
b2b0: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 43  implements the C
b2c0: 68 6f 6f 73 65 4c 65 61 66 20 61 6c 67 6f 72 69  hooseLeaf algori
b2d0: 74 68 6d 20 66 72 6f 6d 20 47 75 74 6d 61 6e 5b  thm from Gutman[
b2e0: 38 34 5d 2e 0a 2a 2a 20 43 68 6f 6f 73 65 53 75  84]..** ChooseSu
b2f0: 62 54 72 65 65 20 69 6e 20 72 2a 74 72 65 65 20  bTree in r*tree 
b300: 74 65 72 6d 69 6e 6f 6c 6f 67 79 2e 0a 2a 2f 0a  terminology..*/.
b310: 73 74 61 74 69 63 20 69 6e 74 20 43 68 6f 6f 73  static int Choos
b320: 65 4c 65 61 66 28 0a 20 20 52 74 72 65 65 20 2a  eLeaf(.  Rtree *
b330: 70 52 74 72 65 65 2c 20 20 20 20 20 20 20 20 20  pRtree,         
b340: 20 20 20 20 20 20 2f 2a 20 52 74 72 65 65 20 74        /* Rtree t
b350: 61 62 6c 65 20 2a 2f 0a 20 20 52 74 72 65 65 43  able */.  RtreeC
b360: 65 6c 6c 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20  ell *pCell,     
b370: 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c 20 74         /* Cell t
b380: 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 72 74  o insert into rt
b390: 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 48 65  ree */.  int iHe
b3a0: 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20  ight,           
b3b0: 20 20 20 20 20 20 2f 2a 20 48 65 69 67 68 74 20        /* Height 
b3c0: 6f 66 20 73 75 62 2d 74 72 65 65 20 72 6f 6f 74  of sub-tree root
b3d0: 65 64 20 61 74 20 70 43 65 6c 6c 20 2a 2f 0a 20  ed at pCell */. 
b3e0: 20 52 74 72 65 65 4e 6f 64 65 20 2a 2a 70 70 4c   RtreeNode **ppL
b3f0: 65 61 66 20 20 20 20 20 20 20 20 20 20 20 2f 2a  eaf           /*
b400: 20 4f 55 54 3a 20 53 65 6c 65 63 74 65 64 20 6c   OUT: Selected l
b410: 65 61 66 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20  eaf page */.){. 
b420: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69   int rc;.  int i
b430: 69 3b 0a 20 20 52 74 72 65 65 4e 6f 64 65 20 2a  i;.  RtreeNode *
b440: 70 4e 6f 64 65 3b 0a 20 20 72 63 20 3d 20 6e 6f  pNode;.  rc = no
b450: 64 65 41 63 71 75 69 72 65 28 70 52 74 72 65 65  deAcquire(pRtree
b460: 2c 20 31 2c 20 30 2c 20 26 70 4e 6f 64 65 29 3b  , 1, 0, &pNode);
b470: 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 72 63  ..  for(ii=0; rc
b480: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
b490: 69 3c 28 70 52 74 72 65 65 2d 3e 69 44 65 70 74  i<(pRtree->iDept
b4a0: 68 2d 69 48 65 69 67 68 74 29 3b 20 69 69 2b 2b  h-iHeight); ii++
b4b0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c  ){.    int iCell
b4c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  ;.    sqlite3_in
b4d0: 74 36 34 20 69 42 65 73 74 20 3d 20 30 3b 0a 0a  t64 iBest = 0;..
b4e0: 20 20 20 20 52 74 72 65 65 44 56 61 6c 75 65 20      RtreeDValue 
b4f0: 66 4d 69 6e 47 72 6f 77 74 68 20 3d 20 30 2e 30  fMinGrowth = 0.0
b500: 3b 0a 20 20 20 20 52 74 72 65 65 44 56 61 6c 75  ;.    RtreeDValu
b510: 65 20 66 4d 69 6e 41 72 65 61 20 3d 20 30 2e 30  e fMinArea = 0.0
b520: 3b 0a 23 69 66 20 56 41 52 49 41 4e 54 5f 52 53  ;.#if VARIANT_RS
b530: 54 41 52 54 52 45 45 5f 43 48 4f 4f 53 45 53 55  TARTREE_CHOOSESU
b540: 42 54 52 45 45 0a 20 20 20 20 52 74 72 65 65 44  BTREE.    RtreeD
b550: 56 61 6c 75 65 20 66 4d 69 6e 4f 76 65 72 6c 61  Value fMinOverla
b560: 70 20 3d 20 30 2e 30 3b 0a 20 20 20 20 52 74 72  p = 0.0;.    Rtr
b570: 65 65 44 56 61 6c 75 65 20 6f 76 65 72 6c 61 70  eeDValue overlap
b580: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 6e  ;.#endif..    in
b590: 74 20 6e 43 65 6c 6c 20 3d 20 4e 43 45 4c 4c 28  t nCell = NCELL(
b5a0: 70 4e 6f 64 65 29 3b 0a 20 20 20 20 52 74 72 65  pNode);.    Rtre
b5b0: 65 43 65 6c 6c 20 63 65 6c 6c 3b 0a 20 20 20 20  eCell cell;.    
b5c0: 52 74 72 65 65 4e 6f 64 65 20 2a 70 43 68 69 6c  RtreeNode *pChil
b5d0: 64 3b 0a 0a 20 20 20 20 52 74 72 65 65 43 65 6c  d;..    RtreeCel
b5e0: 6c 20 2a 61 43 65 6c 6c 20 3d 20 30 3b 0a 0a 23  l *aCell = 0;..#
b5f0: 69 66 20 56 41 52 49 41 4e 54 5f 52 53 54 41 52  if VARIANT_RSTAR
b600: 54 52 45 45 5f 43 48 4f 4f 53 45 53 55 42 54 52  TREE_CHOOSESUBTR
b610: 45 45 0a 20 20 20 20 69 66 28 20 69 69 3d 3d 28  EE.    if( ii==(
b620: 70 52 74 72 65 65 2d 3e 69 44 65 70 74 68 2d 31  pRtree->iDepth-1
b630: 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a  ) ){.      int j
b640: 6a 3b 0a 20 20 20 20 20 20 61 43 65 6c 6c 20 3d  j;.      aCell =
b650: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
b660: 73 69 7a 65 6f 66 28 52 74 72 65 65 43 65 6c 6c  sizeof(RtreeCell
b670: 29 2a 6e 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20  )*nCell);.      
b680: 69 66 28 20 21 61 43 65 6c 6c 20 29 7b 0a 20 20  if( !aCell ){.  
b690: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
b6a0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
b6b0: 20 6e 6f 64 65 52 65 6c 65 61 73 65 28 70 52 74   nodeRelease(pRt
b6c0: 72 65 65 2c 20 70 4e 6f 64 65 29 3b 0a 20 20 20  ree, pNode);.   
b6d0: 20 20 20 20 20 70 4e 6f 64 65 20 3d 20 30 3b 0a       pNode = 0;.
b6e0: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
b6f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b700: 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 6e 43 65  for(jj=0; jj<nCe
b710: 6c 6c 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20  ll; jj++){.     
b720: 20 20 20 6e 6f 64 65 47 65 74 43 65 6c 6c 28 70     nodeGetCell(p
b730: 52 74 72 65 65 2c 20 70 4e 6f 64 65 2c 20 6a 6a  Rtree, pNode, jj
b740: 2c 20 26 61 43 65 6c 6c 5b 6a 6a 5d 29 3b 0a 20  , &aCell[jj]);. 
b750: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
b760: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65  dif..    /* Sele
b770: 63 74 20 74 68 65 20 63 68 69 6c 64 20 6e 6f 64  ct the child nod
b780: 65 20 77 68 69 63 68 20 77 69 6c 6c 20 62 65 20  e which will be 
b790: 65 6e 6c 61 72 67 65 64 20 74 68 65 20 6c 65 61  enlarged the lea
b7a0: 73 74 20 69 66 20 70 43 65 6c 6c 0a 20 20 20 20  st if pCell.    
b7b0: 2a 2a 20 69 73 20 69 6e 73 65 72 74 65 64 20 69  ** is inserted i
b7c0: 6e 74 6f 20 69 74 2e 20 52 65 73 6f 6c 76 65 20  nto it. Resolve 
b7d0: 74 69 65 73 20 62 79 20 63 68 6f 6f 73 69 6e 67  ties by choosing
b7e0: 20 74 68 65 20 65 6e 74 72 79 20 77 69 74 68 0a   the entry with.
b7f0: 20 20 20 20 2a 2a 20 74 68 65 20 73 6d 61 6c 6c      ** the small
b800: 65 73 74 20 61 72 65 61 2e 0a 20 20 20 20 2a 2f  est area..    */
b810: 0a 20 20 20 20 66 6f 72 28 69 43 65 6c 6c 3d 30  .    for(iCell=0
b820: 3b 20 69 43 65 6c 6c 3c 6e 43 65 6c 6c 3b 20 69  ; iCell<nCell; i
b830: 43 65 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69  Cell++){.      i
b840: 6e 74 20 62 42 65 73 74 20 3d 20 30 3b 0a 20 20  nt bBest = 0;.  
b850: 20 20 20 20 52 74 72 65 65 44 56 61 6c 75 65 20      RtreeDValue 
b860: 67 72 6f 77 74 68 3b 0a 20 20 20 20 20 20 52 74  growth;.      Rt
b870: 72 65 65 44 56 61 6c 75 65 20 61 72 65 61 3b 0a  reeDValue area;.
b880: 20 20 20 20 20 20 6e 6f 64 65 47 65 74 43 65 6c        nodeGetCel
b890: 6c 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65 2c  l(pRtree, pNode,
b8a0: 20 69 43 65 6c 6c 2c 20 26 63 65 6c 6c 29 3b 0a   iCell, &cell);.
b8b0: 20 20 20 20 20 20 67 72 6f 77 74 68 20 3d 20 63        growth = c
b8c0: 65 6c 6c 47 72 6f 77 74 68 28 70 52 74 72 65 65  ellGrowth(pRtree
b8d0: 2c 20 26 63 65 6c 6c 2c 20 70 43 65 6c 6c 29 3b  , &cell, pCell);
b8e0: 0a 20 20 20 20 20 20 61 72 65 61 20 3d 20 63 65  .      area = ce
b8f0: 6c 6c 41 72 65 61 28 70 52 74 72 65 65 2c 20 26  llArea(pRtree, &
b900: 63 65 6c 6c 29 3b 0a 0a 23 69 66 20 56 41 52 49  cell);..#if VARI
b910: 41 4e 54 5f 52 53 54 41 52 54 52 45 45 5f 43 48  ANT_RSTARTREE_CH
b920: 4f 4f 53 45 53 55 42 54 52 45 45 0a 20 20 20 20  OOSESUBTREE.    
b930: 20 20 69 66 28 20 69 69 3d 3d 28 70 52 74 72 65    if( ii==(pRtre
b940: 65 2d 3e 69 44 65 70 74 68 2d 31 29 20 29 7b 0a  e->iDepth-1) ){.
b950: 20 20 20 20 20 20 20 20 6f 76 65 72 6c 61 70 20          overlap 
b960: 3d 20 63 65 6c 6c 4f 76 65 72 6c 61 70 45 6e 6c  = cellOverlapEnl
b970: 61 72 67 65 6d 65 6e 74 28 70 52 74 72 65 65 2c  argement(pRtree,
b980: 26 63 65 6c 6c 2c 70 43 65 6c 6c 2c 61 43 65 6c  &cell,pCell,aCel
b990: 6c 2c 6e 43 65 6c 6c 2c 69 43 65 6c 6c 29 3b 0a  l,nCell,iCell);.
b9a0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
b9b0: 20 20 20 20 20 6f 76 65 72 6c 61 70 20 3d 20 30       overlap = 0
b9c0: 2e 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  .0;.      }.    
b9d0: 20 20 69 66 28 20 28 69 43 65 6c 6c 3d 3d 30 29    if( (iCell==0)
b9e0: 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 6f 76 65   .       || (ove
b9f0: 72 6c 61 70 3c 66 4d 69 6e 4f 76 65 72 6c 61 70  rlap<fMinOverlap
ba00: 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 6f 76  ) .       || (ov
ba10: 65 72 6c 61 70 3d 3d 66 4d 69 6e 4f 76 65 72 6c  erlap==fMinOverl
ba20: 61 70 20 26 26 20 67 72 6f 77 74 68 3c 66 4d 69  ap && growth<fMi
ba30: 6e 47 72 6f 77 74 68 29 0a 20 20 20 20 20 20 20  nGrowth).       
ba40: 7c 7c 20 28 6f 76 65 72 6c 61 70 3d 3d 66 4d 69  || (overlap==fMi
ba50: 6e 4f 76 65 72 6c 61 70 20 26 26 20 67 72 6f 77  nOverlap && grow
ba60: 74 68 3d 3d 66 4d 69 6e 47 72 6f 77 74 68 20 26  th==fMinGrowth &
ba70: 26 20 61 72 65 61 3c 66 4d 69 6e 41 72 65 61 29  & area<fMinArea)
ba80: 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
ba90: 20 20 62 42 65 73 74 20 3d 20 31 3b 0a 20 20 20    bBest = 1;.   
baa0: 20 20 20 20 20 66 4d 69 6e 4f 76 65 72 6c 61 70       fMinOverlap
bab0: 20 3d 20 6f 76 65 72 6c 61 70 3b 0a 20 20 20 20   = overlap;.    
bac0: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20    }.#else.      
bad0: 69 66 28 20 69 43 65 6c 6c 3d 3d 30 7c 7c 67 72  if( iCell==0||gr
bae0: 6f 77 74 68 3c 66 4d 69 6e 47 72 6f 77 74 68 7c  owth<fMinGrowth|
baf0: 7c 28 67 72 6f 77 74 68 3d 3d 66 4d 69 6e 47 72  |(growth==fMinGr
bb00: 6f 77 74 68 20 26 26 20 61 72 65 61 3c 66 4d 69  owth && area<fMi
bb10: 6e 41 72 65 61 29 20 29 7b 0a 20 20 20 20 20 20  nArea) ){.      
bb20: 20 20 62 42 65 73 74 20 3d 20 31 3b 0a 20 20 20    bBest = 1;.   
bb30: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
bb40: 20 20 69 66 28 20 62 42 65 73 74 20 29 7b 0a 20    if( bBest ){. 
bb50: 20 20 20 20 20 20 20 66 4d 69 6e 47 72 6f 77 74         fMinGrowt
bb60: 68 20 3d 20 67 72 6f 77 74 68 3b 0a 20 20 20 20  h = growth;.    
bb70: 20 20 20 20 66 4d 69 6e 41 72 65 61 20 3d 20 61      fMinArea = a
bb80: 72 65 61 3b 0a 20 20 20 20 20 20 20 20 69 42 65  rea;.        iBe
bb90: 73 74 20 3d 20 63 65 6c 6c 2e 69 52 6f 77 69 64  st = cell.iRowid
bba0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
bbb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
bbc0: 65 28 61 43 65 6c 6c 29 3b 0a 20 20 20 20 72 63  e(aCell);.    rc
bbd0: 20 3d 20 6e 6f 64 65 41 63 71 75 69 72 65 28 70   = nodeAcquire(p
bbe0: 52 74 72 65 65 2c 20 69 42 65 73 74 2c 20 70 4e  Rtree, iBest, pN
bbf0: 6f 64 65 2c 20 26 70 43 68 69 6c 64 29 3b 0a 20  ode, &pChild);. 
bc00: 20 20 20 6e 6f 64 65 52 65 6c 65 61 73 65 28 70     nodeRelease(p
bc10: 52 74 72 65 65 2c 20 70 4e 6f 64 65 29 3b 0a 20  Rtree, pNode);. 
bc20: 20 20 20 70 4e 6f 64 65 20 3d 20 70 43 68 69 6c     pNode = pChil
bc30: 64 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70 4c 65 61  d;.  }..  *ppLea
bc40: 66 20 3d 20 70 4e 6f 64 65 3b 0a 20 20 72 65 74  f = pNode;.  ret
bc50: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
bc60: 20 41 20 63 65 6c 6c 20 77 69 74 68 20 74 68 65   A cell with the
bc70: 20 73 61 6d 65 20 63 6f 6e 74 65 6e 74 20 61 73   same content as
bc80: 20 70 43 65 6c 6c 20 68 61 73 20 6a 75 73 74 20   pCell has just 
bc90: 62 65 65 6e 20 69 6e 73 65 72 74 65 64 20 69 6e  been inserted in
bca0: 74 6f 0a 2a 2a 20 74 68 65 20 6e 6f 64 65 20 70  to.** the node p
bcb0: 4e 6f 64 65 2e 20 54 68 69 73 20 66 75 6e 63 74  Node. This funct
bcc0: 69 6f 6e 20 75 70 64 61 74 65 73 20 74 68 65 20  ion updates the 
bcd0: 62 6f 75 6e 64 69 6e 67 20 62 6f 78 20 63 65 6c  bounding box cel
bce0: 6c 73 20 69 6e 0a 2a 2a 20 61 6c 6c 20 61 6e 63  ls in.** all anc
bcf0: 65 73 74 6f 72 20 65 6c 65 6d 65 6e 74 73 2e 0a  estor elements..
bd00: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 41 64  */.static int Ad
bd10: 6a 75 73 74 54 72 65 65 28 0a 20 20 52 74 72 65  justTree(.  Rtre
bd20: 65 20 2a 70 52 74 72 65 65 2c 20 20 20 20 20 20  e *pRtree,      
bd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bd40: 20 52 74 72 65 65 20 74 61 62 6c 65 20 2a 2f 0a   Rtree table */.
bd50: 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 4e 6f    RtreeNode *pNo
bd60: 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  de,             
bd70: 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 61 6e      /* Adjust an
bd80: 63 65 73 74 72 79 20 6f 66 20 74 68 69 73 20 6e  cestry of this n
bd90: 6f 64 65 2e 20 2a 2f 0a 20 20 52 74 72 65 65 43  ode. */.  RtreeC
bda0: 65 6c 6c 20 2a 70 43 65 6c 6c 20 20 20 20 20 20  ell *pCell      
bdb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
bdc0: 68 69 73 20 63 65 6c 6c 20 77 61 73 20 6a 75 73  his cell was jus
bdd0: 74 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 29 7b  t inserted */.){
bde0: 0a 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 20  .  RtreeNode *p 
bdf0: 3d 20 70 4e 6f 64 65 3b 0a 20 20 77 68 69 6c 65  = pNode;.  while
be00: 28 20 70 2d 3e 70 50 61 72 65 6e 74 20 29 7b 0a  ( p->pParent ){.
be10: 20 20 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70      RtreeNode *p
be20: 50 61 72 65 6e 74 20 3d 20 70 2d 3e 70 50 61 72  Parent = p->pPar
be30: 65 6e 74 3b 0a 20 20 20 20 52 74 72 65 65 43 65  ent;.    RtreeCe
be40: 6c 6c 20 63 65 6c 6c 3b 0a 20 20 20 20 69 6e 74  ll cell;.    int
be50: 20 69 43 65 6c 6c 3b 0a 0a 20 20 20 20 69 66 28   iCell;..    if(
be60: 20 6e 6f 64 65 50 61 72 65 6e 74 49 6e 64 65 78   nodeParentIndex
be70: 28 70 52 74 72 65 65 2c 20 70 2c 20 26 69 43 65  (pRtree, p, &iCe
be80: 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ll) ){.      ret
be90: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
bea0: 50 54 5f 56 54 41 42 3b 0a 20 20 20 20 7d 0a 0a  PT_VTAB;.    }..
beb0: 20 20 20 20 6e 6f 64 65 47 65 74 43 65 6c 6c 28      nodeGetCell(
bec0: 70 52 74 72 65 65 2c 20 70 50 61 72 65 6e 74 2c  pRtree, pParent,
bed0: 20 69 43 65 6c 6c 2c 20 26 63 65 6c 6c 29 3b 0a   iCell, &cell);.
bee0: 20 20 20 20 69 66 28 20 21 63 65 6c 6c 43 6f 6e      if( !cellCon
bef0: 74 61 69 6e 73 28 70 52 74 72 65 65 2c 20 26 63  tains(pRtree, &c
bf00: 65 6c 6c 2c 20 70 43 65 6c 6c 29 20 29 7b 0a 20  ell, pCell) ){. 
bf10: 20 20 20 20 20 63 65 6c 6c 55 6e 69 6f 6e 28 70       cellUnion(p
bf20: 52 74 72 65 65 2c 20 26 63 65 6c 6c 2c 20 70 43  Rtree, &cell, pC
bf30: 65 6c 6c 29 3b 0a 20 20 20 20 20 20 6e 6f 64 65  ell);.      node
bf40: 4f 76 65 72 77 72 69 74 65 43 65 6c 6c 28 70 52  OverwriteCell(pR
bf50: 74 72 65 65 2c 20 70 50 61 72 65 6e 74 2c 20 26  tree, pParent, &
bf60: 63 65 6c 6c 2c 20 69 43 65 6c 6c 29 3b 0a 20 20  cell, iCell);.  
bf70: 20 20 7d 0a 20 0a 20 20 20 20 70 20 3d 20 70 50    }. .    p = pP
bf80: 61 72 65 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74  arent;.  }.  ret
bf90: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
bfa0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6d 61  ../*.** Write ma
bfb0: 70 70 69 6e 67 20 28 69 52 6f 77 69 64 2d 3e 69  pping (iRowid->i
bfc0: 4e 6f 64 65 29 20 74 6f 20 74 68 65 20 3c 72 74  Node) to the <rt
bfd0: 72 65 65 3e 5f 72 6f 77 69 64 20 74 61 62 6c 65  ree>_rowid table
bfe0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bff0: 72 6f 77 69 64 57 72 69 74 65 28 52 74 72 65 65  rowidWrite(Rtree
c000: 20 2a 70 52 74 72 65 65 2c 20 73 71 6c 69 74 65   *pRtree, sqlite
c010: 33 5f 69 6e 74 36 34 20 69 52 6f 77 69 64 2c 20  3_int64 iRowid, 
c020: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4e  sqlite3_int64 iN
c030: 6f 64 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ode){.  sqlite3_
c040: 62 69 6e 64 5f 69 6e 74 36 34 28 70 52 74 72 65  bind_int64(pRtre
c050: 65 2d 3e 70 57 72 69 74 65 52 6f 77 69 64 2c 20  e->pWriteRowid, 
c060: 31 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 73 71  1, iRowid);.  sq
c070: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
c080: 28 70 52 74 72 65 65 2d 3e 70 57 72 69 74 65 52  (pRtree->pWriteR
c090: 6f 77 69 64 2c 20 32 2c 20 69 4e 6f 64 65 29 3b  owid, 2, iNode);
c0a0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  .  sqlite3_step(
c0b0: 70 52 74 72 65 65 2d 3e 70 57 72 69 74 65 52 6f  pRtree->pWriteRo
c0c0: 77 69 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  wid);.  return s
c0d0: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 52 74  qlite3_reset(pRt
c0e0: 72 65 65 2d 3e 70 57 72 69 74 65 52 6f 77 69 64  ree->pWriteRowid
c0f0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  );.}../*.** Writ
c100: 65 20 6d 61 70 70 69 6e 67 20 28 69 4e 6f 64 65  e mapping (iNode
c110: 2d 3e 69 50 61 72 29 20 74 6f 20 74 68 65 20 3c  ->iPar) to the <
c120: 72 74 72 65 65 3e 5f 70 61 72 65 6e 74 20 74 61  rtree>_parent ta
c130: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
c140: 6e 74 20 70 61 72 65 6e 74 57 72 69 74 65 28 52  nt parentWrite(R
c150: 74 72 65 65 20 2a 70 52 74 72 65 65 2c 20 73 71  tree *pRtree, sq
c160: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4e 6f 64  lite3_int64 iNod
c170: 65 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  e, sqlite3_int64
c180: 20 69 50 61 72 29 7b 0a 20 20 73 71 6c 69 74 65   iPar){.  sqlite
c190: 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 52 74  3_bind_int64(pRt
c1a0: 72 65 65 2d 3e 70 57 72 69 74 65 50 61 72 65 6e  ree->pWriteParen
c1b0: 74 2c 20 31 2c 20 69 4e 6f 64 65 29 3b 0a 20 20  t, 1, iNode);.  
c1c0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
c1d0: 36 34 28 70 52 74 72 65 65 2d 3e 70 57 72 69 74  64(pRtree->pWrit
c1e0: 65 50 61 72 65 6e 74 2c 20 32 2c 20 69 50 61 72  eParent, 2, iPar
c1f0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65  );.  sqlite3_ste
c200: 70 28 70 52 74 72 65 65 2d 3e 70 57 72 69 74 65  p(pRtree->pWrite
c210: 50 61 72 65 6e 74 29 3b 0a 20 20 72 65 74 75 72  Parent);.  retur
c220: 6e 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  n sqlite3_reset(
c230: 70 52 74 72 65 65 2d 3e 70 57 72 69 74 65 50 61  pRtree->pWritePa
c240: 72 65 6e 74 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  rent);.}..static
c250: 20 69 6e 74 20 72 74 72 65 65 49 6e 73 65 72 74   int rtreeInsert
c260: 43 65 6c 6c 28 52 74 72 65 65 20 2a 2c 20 52 74  Cell(Rtree *, Rt
c270: 72 65 65 4e 6f 64 65 20 2a 2c 20 52 74 72 65 65  reeNode *, Rtree
c280: 43 65 6c 6c 20 2a 2c 20 69 6e 74 29 3b 0a 0a 23  Cell *, int);..#
c290: 69 66 20 56 41 52 49 41 4e 54 5f 47 55 54 54 4d  if VARIANT_GUTTM
c2a0: 41 4e 5f 4c 49 4e 45 41 52 5f 53 50 4c 49 54 0a  AN_LINEAR_SPLIT.
c2b0: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
c2c0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 69 6e 65  tion of the line
c2d0: 61 72 20 76 61 72 69 61 6e 74 20 6f 66 20 74 68  ar variant of th
c2e0: 65 20 50 69 63 6b 4e 65 78 74 28 29 20 66 75 6e  e PickNext() fun
c2f0: 63 74 69 6f 6e 20 66 72 6f 6d 0a 2a 2a 20 47 75  ction from.** Gu
c300: 74 74 6d 61 6e 5b 38 34 5d 2e 0a 2a 2f 0a 73 74  ttman[84]..*/.st
c310: 61 74 69 63 20 52 74 72 65 65 43 65 6c 6c 20 2a  atic RtreeCell *
c320: 4c 69 6e 65 61 72 50 69 63 6b 4e 65 78 74 28 0a  LinearPickNext(.
c330: 20 20 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c    Rtree *pRtree,
c340: 0a 20 20 52 74 72 65 65 43 65 6c 6c 20 2a 61 43  .  RtreeCell *aC
c350: 65 6c 6c 2c 20 0a 20 20 69 6e 74 20 6e 43 65 6c  ell, .  int nCel
c360: 6c 2c 20 0a 20 20 52 74 72 65 65 43 65 6c 6c 20  l, .  RtreeCell 
c370: 2a 70 4c 65 66 74 42 6f 78 2c 20 0a 20 20 52 74  *pLeftBox, .  Rt
c380: 72 65 65 43 65 6c 6c 20 2a 70 52 69 67 68 74 42  reeCell *pRightB
c390: 6f 78 2c 0a 20 20 69 6e 74 20 2a 61 69 55 73 65  ox,.  int *aiUse
c3a0: 64 0a 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20  d.){.  int ii;. 
c3b0: 20 66 6f 72 28 69 69 3d 30 3b 20 61 69 55 73 65   for(ii=0; aiUse
c3c0: 64 5b 69 69 5d 3b 20 69 69 2b 2b 29 3b 0a 20 20  d[ii]; ii++);.  
c3d0: 61 69 55 73 65 64 5b 69 69 5d 20 3d 20 31 3b 0a  aiUsed[ii] = 1;.
c3e0: 20 20 72 65 74 75 72 6e 20 26 61 43 65 6c 6c 5b    return &aCell[
c3f0: 69 69 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  ii];.}../*.** Im
c400: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
c410: 74 68 65 20 6c 69 6e 65 61 72 20 76 61 72 69 61  the linear varia
c420: 6e 74 20 6f 66 20 74 68 65 20 50 69 63 6b 53 65  nt of the PickSe
c430: 65 64 73 28 29 20 66 75 6e 63 74 69 6f 6e 20 66  eds() function f
c440: 72 6f 6d 0a 2a 2a 20 47 75 74 74 6d 61 6e 5b 38  rom.** Guttman[8
c450: 34 5d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  4]..*/.static vo
c460: 69 64 20 4c 69 6e 65 61 72 50 69 63 6b 53 65 65  id LinearPickSee
c470: 64 73 28 0a 20 20 52 74 72 65 65 20 2a 70 52 74  ds(.  Rtree *pRt
c480: 72 65 65 2c 0a 20 20 52 74 72 65 65 43 65 6c 6c  ree,.  RtreeCell
c490: 20 2a 61 43 65 6c 6c 2c 20 0a 20 20 69 6e 74 20   *aCell, .  int 
c4a0: 6e 43 65 6c 6c 2c 20 0a 20 20 69 6e 74 20 2a 70  nCell, .  int *p
c4b0: 69 4c 65 66 74 53 65 65 64 2c 20 0a 20 20 69 6e  iLeftSeed, .  in
c4c0: 74 20 2a 70 69 52 69 67 68 74 53 65 65 64 0a 29  t *piRightSeed.)
c4d0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
c4e0: 20 69 4c 65 66 74 53 65 65 64 20 3d 20 30 3b 0a   iLeftSeed = 0;.
c4f0: 20 20 69 6e 74 20 69 52 69 67 68 74 53 65 65 64    int iRightSeed
c500: 20 3d 20 31 3b 0a 20 20 52 74 72 65 65 44 56 61   = 1;.  RtreeDVa
c510: 6c 75 65 20 6d 61 78 4e 6f 72 6d 61 6c 49 6e 6e  lue maxNormalInn
c520: 65 72 57 69 64 74 68 20 3d 20 28 52 74 72 65 65  erWidth = (Rtree
c530: 44 56 61 6c 75 65 29 30 3b 0a 0a 20 20 2f 2a 20  DValue)0;..  /* 
c540: 50 69 63 6b 20 74 77 6f 20 22 73 65 65 64 22 20  Pick two "seed" 
c550: 63 65 6c 6c 73 20 66 72 6f 6d 20 74 68 65 20 61  cells from the a
c560: 72 72 61 79 20 6f 66 20 63 65 6c 6c 73 2e 20 54  rray of cells. T
c570: 68 65 20 61 6c 67 6f 72 69 74 68 6d 20 75 73 65  he algorithm use
c580: 64 0a 20 20 2a 2a 20 68 65 72 65 20 69 73 20 74  d.  ** here is t
c590: 68 65 20 4c 69 6e 65 61 72 50 69 63 6b 53 65 65  he LinearPickSee
c5a0: 64 73 20 61 6c 67 6f 72 69 74 68 6d 20 66 72 6f  ds algorithm fro
c5b0: 6d 20 47 75 74 6d 61 6e 5b 31 39 38 34 5d 2e 20  m Gutman[1984]. 
c5c0: 54 68 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63 65  The .  ** indice
c5d0: 73 20 6f 66 20 74 68 65 20 74 77 6f 20 73 65 65  s of the two see
c5e0: 64 20 63 65 6c 6c 73 20 69 6e 20 74 68 65 20 61  d cells in the a
c5f0: 72 72 61 79 20 61 72 65 20 73 74 6f 72 65 64 20  rray are stored 
c600: 69 6e 20 6c 6f 63 61 6c 0a 20 20 2a 2a 20 76 61  in local.  ** va
c610: 72 69 61 62 6c 65 73 20 69 4c 65 66 74 53 65 65  riables iLeftSee
c620: 6b 20 61 6e 64 20 69 52 69 67 68 74 53 65 65 64  k and iRightSeed
c630: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
c640: 3b 20 69 3c 70 52 74 72 65 65 2d 3e 6e 44 69 6d  ; i<pRtree->nDim
c650: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 52 74 72 65  ; i++){.    Rtre
c660: 65 44 56 61 6c 75 65 20 78 31 20 3d 20 44 43 4f  eDValue x1 = DCO
c670: 4f 52 44 28 61 43 65 6c 6c 5b 30 5d 2e 61 43 6f  ORD(aCell[0].aCo
c680: 6f 72 64 5b 69 2a 32 5d 29 3b 0a 20 20 20 20 52  ord[i*2]);.    R
c690: 74 72 65 65 44 56 61 6c 75 65 20 78 32 20 3d 20  treeDValue x2 = 
c6a0: 44 43 4f 4f 52 44 28 61 43 65 6c 6c 5b 30 5d 2e  DCOORD(aCell[0].
c6b0: 61 43 6f 6f 72 64 5b 69 2a 32 2b 31 5d 29 3b 0a  aCoord[i*2+1]);.
c6c0: 20 20 20 20 52 74 72 65 65 44 56 61 6c 75 65 20      RtreeDValue 
c6d0: 78 33 20 3d 20 78 31 3b 0a 20 20 20 20 52 74 72  x3 = x1;.    Rtr
c6e0: 65 65 44 56 61 6c 75 65 20 78 34 20 3d 20 78 32  eeDValue x4 = x2
c6f0: 3b 0a 20 20 20 20 69 6e 74 20 6a 6a 3b 0a 0a 20  ;.    int jj;.. 
c700: 20 20 20 69 6e 74 20 69 43 65 6c 6c 4c 65 66 74     int iCellLeft
c710: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 43   = 0;.    int iC
c720: 65 6c 6c 52 69 67 68 74 20 3d 20 30 3b 0a 0a 20  ellRight = 0;.. 
c730: 20 20 20 66 6f 72 28 6a 6a 3d 31 3b 20 6a 6a 3c     for(jj=1; jj<
c740: 6e 43 65 6c 6c 3b 20 6a 6a 2b 2b 29 7b 0a 20 20  nCell; jj++){.  
c750: 20 20 20 20 52 74 72 65 65 44 56 61 6c 75 65 20      RtreeDValue 
c760: 6c 65 66 74 20 3d 20 44 43 4f 4f 52 44 28 61 43  left = DCOORD(aC
c770: 65 6c 6c 5b 6a 6a 5d 2e 61 43 6f 6f 72 64 5b 69  ell[jj].aCoord[i
c780: 2a 32 5d 29 3b 0a 20 20 20 20 20 20 52 74 72 65  *2]);.      Rtre
c790: 65 44 56 61 6c 75 65 20 72 69 67 68 74 20 3d 20  eDValue right = 
c7a0: 44 43 4f 4f 52 44 28 61 43 65 6c 6c 5b 6a 6a 5d  DCOORD(aCell[jj]
c7b0: 2e 61 43 6f 6f 72 64 5b 69 2a 32 2b 31 5d 29 3b  .aCoord[i*2+1]);
c7c0: 0a 0a 20 20 20 20 20 20 69 66 28 20 6c 65 66 74  ..      if( left
c7d0: 3c 78 31 20 29 20 78 31 20 3d 20 6c 65 66 74 3b  <x1 ) x1 = left;
c7e0: 0a 20 20 20 20 20 20 69 66 28 20 72 69 67 68 74  .      if( right
c7f0: 3e 78 34 20 29 20 78 34 20 3d 20 72 69 67 68 74  >x4 ) x4 = right
c800: 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65 66 74  ;.      if( left
c810: 3e 78 33 20 29 7b 0a 20 20 20 20 20 20 20 20 78  >x3 ){.        x
c820: 33 20 3d 20 6c 65 66 74 3b 0a 20 20 20 20 20 20  3 = left;.      
c830: 20 20 69 43 65 6c 6c 52 69 67 68 74 20 3d 20 6a    iCellRight = j
c840: 6a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  j;.      }.     
c850: 20 69 66 28 20 72 69 67 68 74 3c 78 32 20 29 7b   if( right<x2 ){
c860: 0a 20 20 20 20 20 20 20 20 78 32 20 3d 20 72 69  .        x2 = ri
c870: 67 68 74 3b 0a 20 20 20 20 20 20 20 20 69 43 65  ght;.        iCe
c880: 6c 6c 4c 65 66 74 20 3d 20 6a 6a 3b 0a 20 20 20  llLeft = jj;.   
c890: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
c8a0: 69 66 28 20 78 34 21 3d 78 31 20 29 7b 0a 20 20  if( x4!=x1 ){.  
c8b0: 20 20 20 20 52 74 72 65 65 44 56 61 6c 75 65 20      RtreeDValue 
c8c0: 6e 6f 72 6d 61 6c 77 69 64 74 68 20 3d 20 28 78  normalwidth = (x
c8d0: 33 20 2d 20 78 32 29 20 2f 20 28 78 34 20 2d 20  3 - x2) / (x4 - 
c8e0: 78 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  x1);.      if( n
c8f0: 6f 72 6d 61 6c 77 69 64 74 68 3e 6d 61 78 4e 6f  ormalwidth>maxNo
c900: 72 6d 61 6c 49 6e 6e 65 72 57 69 64 74 68 20 29  rmalInnerWidth )
c910: 7b 0a 20 20 20 20 20 20 20 20 69 4c 65 66 74 53  {.        iLeftS
c920: 65 65 64 20 3d 20 69 43 65 6c 6c 4c 65 66 74 3b  eed = iCellLeft;
c930: 0a 20 20 20 20 20 20 20 20 69 52 69 67 68 74 53  .        iRightS
c940: 65 65 64 20 3d 20 69 43 65 6c 6c 52 69 67 68 74  eed = iCellRight
c950: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c960: 20 20 7d 0a 0a 20 20 2a 70 69 4c 65 66 74 53 65    }..  *piLeftSe
c970: 65 64 20 3d 20 69 4c 65 66 74 53 65 65 64 3b 0a  ed = iLeftSeed;.
c980: 20 20 2a 70 69 52 69 67 68 74 53 65 65 64 20 3d    *piRightSeed =
c990: 20 69 52 69 67 68 74 53 65 65 64 3b 0a 7d 0a 23   iRightSeed;.}.#
c9a0: 65 6e 64 69 66 20 2f 2a 20 56 41 52 49 41 4e 54  endif /* VARIANT
c9b0: 5f 47 55 54 54 4d 41 4e 5f 4c 49 4e 45 41 52 5f  _GUTTMAN_LINEAR_
c9c0: 53 50 4c 49 54 20 2a 2f 0a 0a 23 69 66 20 56 41  SPLIT */..#if VA
c9d0: 52 49 41 4e 54 5f 47 55 54 54 4d 41 4e 5f 51 55  RIANT_GUTTMAN_QU
c9e0: 41 44 52 41 54 49 43 5f 53 50 4c 49 54 0a 2f 2a  ADRATIC_SPLIT./*
c9f0: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
ca00: 6f 6e 20 6f 66 20 74 68 65 20 71 75 61 64 72 61  on of the quadra
ca10: 74 69 63 20 76 61 72 69 61 6e 74 20 6f 66 20 74  tic variant of t
ca20: 68 65 20 50 69 63 6b 4e 65 78 74 28 29 20 66 75  he PickNext() fu
ca30: 6e 63 74 69 6f 6e 20 66 72 6f 6d 0a 2a 2a 20 47  nction from.** G
ca40: 75 74 74 6d 61 6e 5b 38 34 5d 2e 0a 2a 2f 0a 73  uttman[84]..*/.s
ca50: 74 61 74 69 63 20 52 74 72 65 65 43 65 6c 6c 20  tatic RtreeCell 
ca60: 2a 51 75 61 64 72 61 74 69 63 50 69 63 6b 4e 65  *QuadraticPickNe
ca70: 78 74 28 0a 20 20 52 74 72 65 65 20 2a 70 52 74  xt(.  Rtree *pRt
ca80: 72 65 65 2c 0a 20 20 52 74 72 65 65 43 65 6c 6c  ree,.  RtreeCell
ca90: 20 2a 61 43 65 6c 6c 2c 20 0a 20 20 69 6e 74 20   *aCell, .  int 
caa0: 6e 43 65 6c 6c 2c 20 0a 20 20 52 74 72 65 65 43  nCell, .  RtreeC
cab0: 65 6c 6c 20 2a 70 4c 65 66 74 42 6f 78 2c 20 0a  ell *pLeftBox, .
cac0: 20 20 52 74 72 65 65 43 65 6c 6c 20 2a 70 52 69    RtreeCell *pRi
cad0: 67 68 74 42 6f 78 2c 0a 20 20 69 6e 74 20 2a 61  ghtBox,.  int *a
cae0: 69 55 73 65 64 0a 29 7b 0a 20 20 23 64 65 66 69  iUsed.){.  #defi
caf0: 6e 65 20 46 41 42 53 28 61 29 20 28 28 61 29 3c  ne FABS(a) ((a)<
cb00: 30 2e 30 3f 2d 31 2e 30 2a 28 61 29 3a 28 61 29  0.0?-1.0*(a):(a)
cb10: 29 0a 0a 20 20 69 6e 74 20 69 53 65 6c 65 63 74  )..  int iSelect
cb20: 20 3d 20 2d 31 3b 0a 20 20 52 74 72 65 65 44 56   = -1;.  RtreeDV
cb30: 61 6c 75 65 20 66 44 69 66 66 3b 0a 20 20 69 6e  alue fDiff;.  in
cb40: 74 20 69 69 3b 0a 20 20 66 6f 72 28 69 69 3d 30  t ii;.  for(ii=0
cb50: 3b 20 69 69 3c 6e 43 65 6c 6c 3b 20 69 69 2b 2b  ; ii<nCell; ii++
cb60: 29 7b 0a 20 20 20 20 69 66 28 20 61 69 55 73 65  ){.    if( aiUse
cb70: 64 5b 69 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  d[ii]==0 ){.    
cb80: 20 20 52 74 72 65 65 44 56 61 6c 75 65 20 6c 65    RtreeDValue le
cb90: 66 74 20 3d 20 63 65 6c 6c 47 72 6f 77 74 68 28  ft = cellGrowth(
cba0: 70 52 74 72 65 65 2c 20 70 4c 65 66 74 42 6f 78  pRtree, pLeftBox
cbb0: 2c 20 26 61 43 65 6c 6c 5b 69 69 5d 29 3b 0a 20  , &aCell[ii]);. 
cbc0: 20 20 20 20 20 52 74 72 65 65 44 56 61 6c 75 65       RtreeDValue
cbd0: 20 72 69 67 68 74 20 3d 20 63 65 6c 6c 47 72 6f   right = cellGro
cbe0: 77 74 68 28 70 52 74 72 65 65 2c 20 70 4c 65 66  wth(pRtree, pLef
cbf0: 74 42 6f 78 2c 20 26 61 43 65 6c 6c 5b 69 69 5d  tBox, &aCell[ii]
cc00: 29 3b 0a 20 20 20 20 20 20 52 74 72 65 65 44 56  );.      RtreeDV
cc10: 61 6c 75 65 20 64 69 66 66 20 3d 20 46 41 42 53  alue diff = FABS
cc20: 28 72 69 67 68 74 2d 6c 65 66 74 29 3b 0a 20 20  (right-left);.  
cc30: 20 20 20 20 69 66 28 20 69 53 65 6c 65 63 74 3c      if( iSelect<
cc40: 30 20 7c 7c 20 64 69 66 66 3e 66 44 69 66 66 20  0 || diff>fDiff 
cc50: 29 7b 0a 20 20 20 20 20 20 20 20 66 44 69 66 66  ){.        fDiff
cc60: 20 3d 20 64 69 66 66 3b 0a 20 20 20 20 20 20 20   = diff;.       
cc70: 20 69 53 65 6c 65 63 74 20 3d 20 69 69 3b 0a 20   iSelect = ii;. 
cc80: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
cc90: 0a 20 20 61 69 55 73 65 64 5b 69 53 65 6c 65 63  .  aiUsed[iSelec
cca0: 74 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e  t] = 1;.  return
ccb0: 20 26 61 43 65 6c 6c 5b 69 53 65 6c 65 63 74 5d   &aCell[iSelect]
ccc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
ccd0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
cce0: 20 71 75 61 64 72 61 74 69 63 20 76 61 72 69 61   quadratic varia
ccf0: 6e 74 20 6f 66 20 74 68 65 20 50 69 63 6b 53 65  nt of the PickSe
cd00: 65 64 73 28 29 20 66 75 6e 63 74 69 6f 6e 20 66  eds() function f
cd10: 72 6f 6d 0a 2a 2a 20 47 75 74 74 6d 61 6e 5b 38  rom.** Guttman[8
cd20: 34 5d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  4]..*/.static vo
cd30: 69 64 20 51 75 61 64 72 61 74 69 63 50 69 63 6b  id QuadraticPick
cd40: 53 65 65 64 73 28 0a 20 20 52 74 72 65 65 20 2a  Seeds(.  Rtree *
cd50: 70 52 74 72 65 65 2c 0a 20 20 52 74 72 65 65 43  pRtree,.  RtreeC
cd60: 65 6c 6c 20 2a 61 43 65 6c 6c 2c 20 0a 20 20 69  ell *aCell, .  i
cd70: 6e 74 20 6e 43 65 6c 6c 2c 20 0a 20 20 69 6e 74  nt nCell, .  int
cd80: 20 2a 70 69 4c 65 66 74 53 65 65 64 2c 20 0a 20   *piLeftSeed, . 
cd90: 20 69 6e 74 20 2a 70 69 52 69 67 68 74 53 65 65   int *piRightSee
cda0: 64 0a 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20  d.){.  int ii;. 
cdb0: 20 69 6e 74 20 6a 6a 3b 0a 0a 20 20 69 6e 74 20   int jj;..  int 
cdc0: 69 4c 65 66 74 53 65 65 64 20 3d 20 30 3b 0a 20  iLeftSeed = 0;. 
cdd0: 20 69 6e 74 20 69 52 69 67 68 74 53 65 65 64 20   int iRightSeed 
cde0: 3d 20 31 3b 0a 20 20 52 74 72 65 65 44 56 61 6c  = 1;.  RtreeDVal
cdf0: 75 65 20 66 57 61 73 74 65 20 3d 20 30 2e 30 3b  ue fWaste = 0.0;
ce00: 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  ..  for(ii=0; ii
ce10: 3c 6e 43 65 6c 6c 3b 20 69 69 2b 2b 29 7b 0a 20  <nCell; ii++){. 
ce20: 20 20 20 66 6f 72 28 6a 6a 3d 69 69 2b 31 3b 20     for(jj=ii+1; 
ce30: 6a 6a 3c 6e 43 65 6c 6c 3b 20 6a 6a 2b 2b 29 7b  jj<nCell; jj++){
ce40: 0a 20 20 20 20 20 20 52 74 72 65 65 44 56 61 6c  .      RtreeDVal
ce50: 75 65 20 72 69 67 68 74 20 3d 20 63 65 6c 6c 41  ue right = cellA
ce60: 72 65 61 28 70 52 74 72 65 65 2c 20 26 61 43 65  rea(pRtree, &aCe
ce70: 6c 6c 5b 6a 6a 5d 29 3b 0a 20 20 20 20 20 20 52  ll[jj]);.      R
ce80: 74 72 65 65 44 56 61 6c 75 65 20 67 72 6f 77 74  treeDValue growt
ce90: 68 20 3d 20 63 65 6c 6c 47 72 6f 77 74 68 28 70  h = cellGrowth(p
cea0: 52 74 72 65 65 2c 20 26 61 43 65 6c 6c 5b 69 69  Rtree, &aCell[ii
ceb0: 5d 2c 20 26 61 43 65 6c 6c 5b 6a 6a 5d 29 3b 0a  ], &aCell[jj]);.
cec0: 20 20 20 20 20 20 52 74 72 65 65 44 56 61 6c 75        RtreeDValu
ced0: 65 20 77 61 73 74 65 20 3d 20 67 72 6f 77 74 68  e waste = growth
cee0: 20 2d 20 72 69 67 68 74 3b 0a 0a 20 20 20 20 20   - right;..     
cef0: 20 69 66 28 20 77 61 73 74 65 3e 66 57 61 73 74   if( waste>fWast
cf00: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 65  e ){.        iLe
cf10: 66 74 53 65 65 64 20 3d 20 69 69 3b 0a 20 20 20  ftSeed = ii;.   
cf20: 20 20 20 20 20 69 52 69 67 68 74 53 65 65 64 20       iRightSeed 
cf30: 3d 20 6a 6a 3b 0a 20 20 20 20 20 20 20 20 66 57  = jj;.        fW
cf40: 61 73 74 65 20 3d 20 77 61 73 74 65 3b 0a 20 20  aste = waste;.  
cf50: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
cf60: 0a 20 20 2a 70 69 4c 65 66 74 53 65 65 64 20 3d  .  *piLeftSeed =
cf70: 20 69 4c 65 66 74 53 65 65 64 3b 0a 20 20 2a 70   iLeftSeed;.  *p
cf80: 69 52 69 67 68 74 53 65 65 64 20 3d 20 69 52 69  iRightSeed = iRi
cf90: 67 68 74 53 65 65 64 3b 0a 7d 0a 23 65 6e 64 69  ghtSeed;.}.#endi
cfa0: 66 20 2f 2a 20 56 41 52 49 41 4e 54 5f 47 55 54  f /* VARIANT_GUT
cfb0: 54 4d 41 4e 5f 51 55 41 44 52 41 54 49 43 5f 53  TMAN_QUADRATIC_S
cfc0: 50 4c 49 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  PLIT */../*.** A
cfd0: 72 67 75 6d 65 6e 74 73 20 61 49 64 78 2c 20 61  rguments aIdx, a
cfe0: 44 69 73 74 61 6e 63 65 20 61 6e 64 20 61 53 70  Distance and aSp
cff0: 61 72 65 20 61 6c 6c 20 70 6f 69 6e 74 20 74 6f  are all point to
d000: 20 61 72 72 61 79 73 20 6f 66 20 73 69 7a 65 0a   arrays of size.
d010: 2a 2a 20 6e 49 64 78 2e 20 54 68 65 20 61 49 64  ** nIdx. The aId
d020: 78 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73  x array contains
d030: 20 74 68 65 20 73 65 74 20 6f 66 20 69 6e 74 65   the set of inte
d040: 67 65 72 73 20 66 72 6f 6d 20 30 20 74 6f 20 0a  gers from 0 to .
d050: 2a 2a 20 28 6e 49 64 78 2d 31 29 20 69 6e 20 6e  ** (nIdx-1) in n
d060: 6f 20 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64  o particular ord
d070: 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  er. This functio
d080: 6e 20 73 6f 72 74 73 20 74 68 65 20 76 61 6c 75  n sorts the valu
d090: 65 73 0a 2a 2a 20 69 6e 20 61 49 64 78 20 61 63  es.** in aIdx ac
d0a0: 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 69  cording to the i
d0b0: 6e 64 65 78 65 64 20 76 61 6c 75 65 73 20 69 6e  ndexed values in
d0c0: 20 61 44 69 73 74 61 6e 63 65 2e 20 46 6f 72 0a   aDistance. For.
d0d0: 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75  ** example, assu
d0e0: 6d 69 6e 67 20 74 68 65 20 69 6e 70 75 74 73 3a  ming the inputs:
d0f0: 0a 2a 2a 0a 2a 2a 20 20 20 61 49 64 78 20 20 20  .**.**   aIdx   
d100: 20 20 20 3d 20 7b 20 30 2c 20 20 20 31 2c 20 20     = { 0,   1,  
d110: 20 32 2c 20 20 20 33 20 7d 0a 2a 2a 20 20 20 61   2,   3 }.**   a
d120: 44 69 73 74 61 6e 63 65 20 3d 20 7b 20 35 2e 30  Distance = { 5.0
d130: 2c 20 32 2e 30 2c 20 37 2e 30 2c 20 36 2e 30 20  , 2.0, 7.0, 6.0 
d140: 7d 0a 2a 2a 0a 2a 2a 20 74 68 69 73 20 66 75 6e  }.**.** this fun
d150: 63 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20 61  ction sets the a
d160: 49 64 78 20 61 72 72 61 79 20 74 6f 20 63 6f 6e  Idx array to con
d170: 74 61 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 49  tain:.**.**   aI
d180: 64 78 20 20 20 20 20 20 3d 20 7b 20 30 2c 20 20  dx      = { 0,  
d190: 20 31 2c 20 20 20 32 2c 20 20 20 33 20 7d 0a 2a   1,   2,   3 }.*
d1a0: 2a 0a 2a 2a 20 54 68 65 20 61 53 70 61 72 65 20  *.** The aSpare 
d1b0: 61 72 72 61 79 20 69 73 20 75 73 65 64 20 61 73  array is used as
d1c0: 20 74 65 6d 70 6f 72 61 72 79 20 77 6f 72 6b 69   temporary worki
d1d0: 6e 67 20 73 70 61 63 65 20 62 79 20 74 68 65 0a  ng space by the.
d1e0: 2a 2a 20 73 6f 72 74 69 6e 67 20 61 6c 67 6f 72  ** sorting algor
d1f0: 69 74 68 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ithm..*/.static 
d200: 76 6f 69 64 20 53 6f 72 74 42 79 44 69 73 74 61  void SortByDista
d210: 6e 63 65 28 0a 20 20 69 6e 74 20 2a 61 49 64 78  nce(.  int *aIdx
d220: 2c 20 0a 20 20 69 6e 74 20 6e 49 64 78 2c 20 0a  , .  int nIdx, .
d230: 20 20 52 74 72 65 65 44 56 61 6c 75 65 20 2a 61    RtreeDValue *a
d240: 44 69 73 74 61 6e 63 65 2c 20 0a 20 20 69 6e 74  Distance, .  int
d250: 20 2a 61 53 70 61 72 65 0a 29 7b 0a 20 20 69 66   *aSpare.){.  if
d260: 28 20 6e 49 64 78 3e 31 20 29 7b 0a 20 20 20 20  ( nIdx>1 ){.    
d270: 69 6e 74 20 69 4c 65 66 74 20 3d 20 30 3b 0a 20  int iLeft = 0;. 
d280: 20 20 20 69 6e 74 20 69 52 69 67 68 74 20 3d 20     int iRight = 
d290: 30 3b 0a 0a 20 20 20 20 69 6e 74 20 6e 4c 65 66  0;..    int nLef
d2a0: 74 20 3d 20 6e 49 64 78 2f 32 3b 0a 20 20 20 20  t = nIdx/2;.    
d2b0: 69 6e 74 20 6e 52 69 67 68 74 20 3d 20 6e 49 64  int nRight = nId
d2c0: 78 2d 6e 4c 65 66 74 3b 0a 20 20 20 20 69 6e 74  x-nLeft;.    int
d2d0: 20 2a 61 4c 65 66 74 20 3d 20 61 49 64 78 3b 0a   *aLeft = aIdx;.
d2e0: 20 20 20 20 69 6e 74 20 2a 61 52 69 67 68 74 20      int *aRight 
d2f0: 3d 20 26 61 49 64 78 5b 6e 4c 65 66 74 5d 3b 0a  = &aIdx[nLeft];.
d300: 0a 20 20 20 20 53 6f 72 74 42 79 44 69 73 74 61  .    SortByDista
d310: 6e 63 65 28 61 4c 65 66 74 2c 20 6e 4c 65 66 74  nce(aLeft, nLeft
d320: 2c 20 61 44 69 73 74 61 6e 63 65 2c 20 61 53 70  , aDistance, aSp
d330: 61 72 65 29 3b 0a 20 20 20 20 53 6f 72 74 42 79  are);.    SortBy
d340: 44 69 73 74 61 6e 63 65 28 61 52 69 67 68 74 2c  Distance(aRight,
d350: 20 6e 52 69 67 68 74 2c 20 61 44 69 73 74 61 6e   nRight, aDistan
d360: 63 65 2c 20 61 53 70 61 72 65 29 3b 0a 0a 20 20  ce, aSpare);..  
d370: 20 20 6d 65 6d 63 70 79 28 61 53 70 61 72 65 2c    memcpy(aSpare,
d380: 20 61 4c 65 66 74 2c 20 73 69 7a 65 6f 66 28 69   aLeft, sizeof(i
d390: 6e 74 29 2a 6e 4c 65 66 74 29 3b 0a 20 20 20 20  nt)*nLeft);.    
d3a0: 61 4c 65 66 74 20 3d 20 61 53 70 61 72 65 3b 0a  aLeft = aSpare;.
d3b0: 0a 20 20 20 20 77 68 69 6c 65 28 20 69 4c 65 66  .    while( iLef
d3c0: 74 3c 6e 4c 65 66 74 20 7c 7c 20 69 52 69 67 68  t<nLeft || iRigh
d3d0: 74 3c 6e 52 69 67 68 74 20 29 7b 0a 20 20 20 20  t<nRight ){.    
d3e0: 20 20 69 66 28 20 69 4c 65 66 74 3d 3d 6e 4c 65    if( iLeft==nLe
d3f0: 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 49  ft ){.        aI
d400: 64 78 5b 69 4c 65 66 74 2b 69 52 69 67 68 74 5d  dx[iLeft+iRight]
d410: 20 3d 20 61 52 69 67 68 74 5b 69 52 69 67 68 74   = aRight[iRight
d420: 5d 3b 0a 20 20 20 20 20 20 20 20 69 52 69 67 68  ];.        iRigh
d430: 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  t++;.      }else
d440: 20 69 66 28 20 69 52 69 67 68 74 3d 3d 6e 52 69   if( iRight==nRi
d450: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ght ){.        a
d460: 49 64 78 5b 69 4c 65 66 74 2b 69 52 69 67 68 74  Idx[iLeft+iRight
d470: 5d 20 3d 20 61 4c 65 66 74 5b 69 4c 65 66 74 5d  ] = aLeft[iLeft]
d480: 3b 0a 20 20 20 20 20 20 20 20 69 4c 65 66 74 2b  ;.        iLeft+
d490: 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  +;.      }else{.
d4a0: 20 20 20 20 20 20 20 20 52 74 72 65 65 44 56 61          RtreeDVa
d4b0: 6c 75 65 20 66 4c 65 66 74 20 3d 20 61 44 69 73  lue fLeft = aDis
d4c0: 74 61 6e 63 65 5b 61 4c 65 66 74 5b 69 4c 65 66  tance[aLeft[iLef
d4d0: 74 5d 5d 3b 0a 20 20 20 20 20 20 20 20 52 74 72  t]];.        Rtr
d4e0: 65 65 44 56 61 6c 75 65 20 66 52 69 67 68 74 20  eeDValue fRight 
d4f0: 3d 20 61 44 69 73 74 61 6e 63 65 5b 61 52 69 67  = aDistance[aRig
d500: 68 74 5b 69 52 69 67 68 74 5d 5d 3b 0a 20 20 20  ht[iRight]];.   
d510: 20 20 20 20 20 69 66 28 20 66 4c 65 66 74 3c 66       if( fLeft<f
d520: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20  Right ){.       
d530: 20 20 20 61 49 64 78 5b 69 4c 65 66 74 2b 69 52     aIdx[iLeft+iR
d540: 69 67 68 74 5d 20 3d 20 61 4c 65 66 74 5b 69 4c  ight] = aLeft[iL
d550: 65 66 74 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  eft];.          
d560: 69 4c 65 66 74 2b 2b 3b 0a 20 20 20 20 20 20 20  iLeft++;.       
d570: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
d580: 20 20 61 49 64 78 5b 69 4c 65 66 74 2b 69 52 69    aIdx[iLeft+iRi
d590: 67 68 74 5d 20 3d 20 61 52 69 67 68 74 5b 69 52  ght] = aRight[iR
d5a0: 69 67 68 74 5d 3b 0a 20 20 20 20 20 20 20 20 20  ight];.         
d5b0: 20 69 52 69 67 68 74 2b 2b 3b 0a 20 20 20 20 20   iRight++;.     
d5c0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
d5d0: 20 7d 0a 0a 23 69 66 20 30 0a 20 20 20 20 2f 2a   }..#if 0.    /*
d5e0: 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
d5f0: 73 6f 72 74 20 77 6f 72 6b 65 64 20 2a 2f 0a 20  sort worked */. 
d600: 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a     {.      int j
d610: 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d  j;.      for(jj=
d620: 31 3b 20 6a 6a 3c 6e 49 64 78 3b 20 6a 6a 2b 2b  1; jj<nIdx; jj++
d630: 29 7b 0a 20 20 20 20 20 20 20 20 52 74 72 65 65  ){.        Rtree
d640: 44 56 61 6c 75 65 20 6c 65 66 74 20 3d 20 61 44  DValue left = aD
d650: 69 73 74 61 6e 63 65 5b 61 49 64 78 5b 6a 6a 2d  istance[aIdx[jj-
d660: 31 5d 5d 3b 0a 20 20 20 20 20 20 20 20 52 74 72  1]];.        Rtr
d670: 65 65 44 56 61 6c 75 65 20 72 69 67 68 74 20 3d  eeDValue right =
d680: 20 61 44 69 73 74 61 6e 63 65 5b 61 49 64 78 5b   aDistance[aIdx[
d690: 6a 6a 5d 5d 3b 0a 20 20 20 20 20 20 20 20 61 73  jj]];.        as
d6a0: 73 65 72 74 28 20 6c 65 66 74 3c 3d 72 69 67 68  sert( left<=righ
d6b0: 74 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  t );.      }.   
d6c0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a   }.#endif.  }.}.
d6d0: 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 73  ./*.** Arguments
d6e0: 20 61 49 64 78 2c 20 61 43 65 6c 6c 20 61 6e 64   aIdx, aCell and
d6f0: 20 61 53 70 61 72 65 20 61 6c 6c 20 70 6f 69 6e   aSpare all poin
d700: 74 20 74 6f 20 61 72 72 61 79 73 20 6f 66 20 73  t to arrays of s
d710: 69 7a 65 0a 2a 2a 20 6e 49 64 78 2e 20 54 68 65  ize.** nIdx. The
d720: 20 61 49 64 78 20 61 72 72 61 79 20 63 6f 6e 74   aIdx array cont
d730: 61 69 6e 73 20 74 68 65 20 73 65 74 20 6f 66 20  ains the set of 
d740: 69 6e 74 65 67 65 72 73 20 66 72 6f 6d 20 30 20  integers from 0 
d750: 74 6f 20 0a 2a 2a 20 28 6e 49 64 78 2d 31 29 20  to .** (nIdx-1) 
d760: 69 6e 20 6e 6f 20 70 61 72 74 69 63 75 6c 61 72  in no particular
d770: 20 6f 72 64 65 72 2e 20 54 68 69 73 20 66 75 6e   order. This fun
d780: 63 74 69 6f 6e 20 73 6f 72 74 73 20 74 68 65 20  ction sorts the 
d790: 76 61 6c 75 65 73 0a 2a 2a 20 69 6e 20 61 49 64  values.** in aId
d7a0: 78 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 64  x according to d
d7b0: 69 6d 65 6e 73 69 6f 6e 20 69 44 69 6d 20 6f 66  imension iDim of
d7c0: 20 74 68 65 20 63 65 6c 6c 73 20 69 6e 20 61 43   the cells in aC
d7d0: 65 6c 6c 2e 20 54 68 65 0a 2a 2a 20 6d 69 6e 69  ell. The.** mini
d7e0: 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 64 69 6d  mum value of dim
d7f0: 65 6e 73 69 6f 6e 20 69 44 69 6d 20 69 73 20 63  ension iDim is c
d800: 6f 6e 73 69 64 65 72 65 64 20 66 69 72 73 74 2c  onsidered first,
d810: 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20   the.** maximum 
d820: 75 73 65 64 20 74 6f 20 62 72 65 61 6b 20 74 69  used to break ti
d830: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 53  es..**.** The aS
d840: 70 61 72 65 20 61 72 72 61 79 20 69 73 20 75 73  pare array is us
d850: 65 64 20 61 73 20 74 65 6d 70 6f 72 61 72 79 20  ed as temporary 
d860: 77 6f 72 6b 69 6e 67 20 73 70 61 63 65 20 62 79  working space by
d870: 20 74 68 65 0a 2a 2a 20 73 6f 72 74 69 6e 67 20   the.** sorting 
d880: 61 6c 67 6f 72 69 74 68 6d 2e 0a 2a 2f 0a 73 74  algorithm..*/.st
d890: 61 74 69 63 20 76 6f 69 64 20 53 6f 72 74 42 79  atic void SortBy
d8a0: 44 69 6d 65 6e 73 69 6f 6e 28 0a 20 20 52 74 72  Dimension(.  Rtr
d8b0: 65 65 20 2a 70 52 74 72 65 65 2c 0a 20 20 69 6e  ee *pRtree,.  in
d8c0: 74 20 2a 61 49 64 78 2c 20 0a 20 20 69 6e 74 20  t *aIdx, .  int 
d8d0: 6e 49 64 78 2c 20 0a 20 20 69 6e 74 20 69 44 69  nIdx, .  int iDi
d8e0: 6d 2c 20 0a 20 20 52 74 72 65 65 43 65 6c 6c 20  m, .  RtreeCell 
d8f0: 2a 61 43 65 6c 6c 2c 20 0a 20 20 69 6e 74 20 2a  *aCell, .  int *
d900: 61 53 70 61 72 65 0a 29 7b 0a 20 20 69 66 28 20  aSpare.){.  if( 
d910: 6e 49 64 78 3e 31 20 29 7b 0a 0a 20 20 20 20 69  nIdx>1 ){..    i
d920: 6e 74 20 69 4c 65 66 74 20 3d 20 30 3b 0a 20 20  nt iLeft = 0;.  
d930: 20 20 69 6e 74 20 69 52 69 67 68 74 20 3d 20 30    int iRight = 0
d940: 3b 0a 0a 20 20 20 20 69 6e 74 20 6e 4c 65 66 74  ;..    int nLeft
d950: 20 3d 20 6e 49 64 78 2f 32 3b 0a 20 20 20 20 69   = nIdx/2;.    i
d960: 6e 74 20 6e 52 69 67 68 74 20 3d 20 6e 49 64 78  nt nRight = nIdx
d970: 2d 6e 4c 65 66 74 3b 0a 20 20 20 20 69 6e 74 20  -nLeft;.    int 
d980: 2a 61 4c 65 66 74 20 3d 20 61 49 64 78 3b 0a 20  *aLeft = aIdx;. 
d990: 20 20 20 69 6e 74 20 2a 61 52 69 67 68 74 20 3d     int *aRight =
d9a0: 20 26 61 49 64 78 5b 6e 4c 65 66 74 5d 3b 0a 0a   &aIdx[nLeft];..
d9b0: 20 20 20 20 53 6f 72 74 42 79 44 69 6d 65 6e 73      SortByDimens
d9c0: 69 6f 6e 28 70 52 74 72 65 65 2c 20 61 4c 65 66  ion(pRtree, aLef
d9d0: 74 2c 20 6e 4c 65 66 74 2c 20 69 44 69 6d 2c 20  t, nLeft, iDim, 
d9e0: 61 43 65 6c 6c 2c 20 61 53 70 61 72 65 29 3b 0a  aCell, aSpare);.
d9f0: 20 20 20 20 53 6f 72 74 42 79 44 69 6d 65 6e 73      SortByDimens
da00: 69 6f 6e 28 70 52 74 72 65 65 2c 20 61 52 69 67  ion(pRtree, aRig
da10: 68 74 2c 20 6e 52 69 67 68 74 2c 20 69 44 69 6d  ht, nRight, iDim
da20: 2c 20 61 43 65 6c 6c 2c 20 61 53 70 61 72 65 29  , aCell, aSpare)
da30: 3b 0a 0a 20 20 20 20 6d 65 6d 63 70 79 28 61 53  ;..    memcpy(aS
da40: 70 61 72 65 2c 20 61 4c 65 66 74 2c 20 73 69 7a  pare, aLeft, siz
da50: 65 6f 66 28 69 6e 74 29 2a 6e 4c 65 66 74 29 3b  eof(int)*nLeft);
da60: 0a 20 20 20 20 61 4c 65 66 74 20 3d 20 61 53 70  .    aLeft = aSp
da70: 61 72 65 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  are;.    while( 
da80: 69 4c 65 66 74 3c 6e 4c 65 66 74 20 7c 7c 20 69  iLeft<nLeft || i
da90: 52 69 67 68 74 3c 6e 52 69 67 68 74 20 29 7b 0a  Right<nRight ){.
daa0: 20 20 20 20 20 20 52 74 72 65 65 44 56 61 6c 75        RtreeDValu
dab0: 65 20 78 6c 65 66 74 31 20 3d 20 44 43 4f 4f 52  e xleft1 = DCOOR
dac0: 44 28 61 43 65 6c 6c 5b 61 4c 65 66 74 5b 69 4c  D(aCell[aLeft[iL
dad0: 65 66 74 5d 5d 2e 61 43 6f 6f 72 64 5b 69 44 69  eft]].aCoord[iDi
dae0: 6d 2a 32 5d 29 3b 0a 20 20 20 20 20 20 52 74 72  m*2]);.      Rtr
daf0: 65 65 44 56 61 6c 75 65 20 78 6c 65 66 74 32 20  eeDValue xleft2 
db00: 3d 20 44 43 4f 4f 52 44 28 61 43 65 6c 6c 5b 61  = DCOORD(aCell[a
db10: 4c 65 66 74 5b 69 4c 65 66 74 5d 5d 2e 61 43 6f  Left[iLeft]].aCo
db20: 6f 72 64 5b 69 44 69 6d 2a 32 2b 31 5d 29 3b 0a  ord[iDim*2+1]);.
db30: 20 20 20 20 20 20 52 74 72 65 65 44 56 61 6c 75        RtreeDValu
db40: 65 20 78 72 69 67 68 74 31 20 3d 20 44 43 4f 4f  e xright1 = DCOO
db50: 52 44 28 61 43 65 6c 6c 5b 61 52 69 67 68 74 5b  RD(aCell[aRight[
db60: 69 52 69 67 68 74 5d 5d 2e 61 43 6f 6f 72 64 5b  iRight]].aCoord[
db70: 69 44 69 6d 2a 32 5d 29 3b 0a 20 20 20 20 20 20  iDim*2]);.      
db80: 52 74 72 65 65 44 56 61 6c 75 65 20 78 72 69 67  RtreeDValue xrig
db90: 68 74 32 20 3d 20 44 43 4f 4f 52 44 28 61 43 65  ht2 = DCOORD(aCe
dba0: 6c 6c 5b 61 52 69 67 68 74 5b 69 52 69 67 68 74  ll[aRight[iRight
dbb0: 5d 5d 2e 61 43 6f 6f 72 64 5b 69 44 69 6d 2a 32  ]].aCoord[iDim*2
dbc0: 2b 31 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  +1]);.      if( 
dbd0: 28 69 4c 65 66 74 21 3d 6e 4c 65 66 74 29 20 26  (iLeft!=nLeft) &
dbe0: 26 20 28 28 69 52 69 67 68 74 3d 3d 6e 52 69 67  & ((iRight==nRig
dbf0: 68 74 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 78  ht).       || (x
dc00: 6c 65 66 74 31 3c 78 72 69 67 68 74 31 29 0a 20  left1<xright1). 
dc10: 20 20 20 20 20 20 7c 7c 20 28 78 6c 65 66 74 31        || (xleft1
dc20: 3d 3d 78 72 69 67 68 74 31 20 26 26 20 78 6c 65  ==xright1 && xle
dc30: 66 74 32 3c 78 72 69 67 68 74 32 29 0a 20 20 20  ft2<xright2).   
dc40: 20 20 20 29 29 7b 0a 20 20 20 20 20 20 20 20 61     )){.        a
dc50: 49 64 78 5b 69 4c 65 66 74 2b 69 52 69 67 68 74  Idx[iLeft+iRight
dc60: 5d 20 3d 20 61 4c 65 66 74 5b 69 4c 65 66 74 5d  ] = aLeft[iLeft]
dc70: 3b 0a 20 20 20 20 20 20 20 20 69 4c 65 66 74 2b  ;.        iLeft+
dc80: 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  +;.      }else{.
dc90: 20 20 20 20 20 20 20 20 61 49 64 78 5b 69 4c 65          aIdx[iLe
dca0: 66 74 2b 69 52 69 67 68 74 5d 20 3d 20 61 52 69  ft+iRight] = aRi
dcb0: 67 68 74 5b 69 52 69 67 68 74 5d 3b 0a 20 20 20  ght[iRight];.   
dcc0: 20 20 20 20 20 69 52 69 67 68 74 2b 2b 3b 0a 20       iRight++;. 
dcd0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69       }.    }..#i
dce0: 66 20 30 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  f 0.    /* Check
dcf0: 20 74 68 61 74 20 74 68 65 20 73 6f 72 74 20 77   that the sort w
dd00: 6f 72 6b 65 64 20 2a 2f 0a 20 20 20 20 7b 0a 20  orked */.    {. 
dd10: 20 20 20 20 20 69 6e 74 20 6a 6a 3b 0a 20 20 20       int jj;.   
dd20: 20 20 20 66 6f 72 28 6a 6a 3d 31 3b 20 6a 6a 3c     for(jj=1; jj<
dd30: 6e 49 64 78 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20  nIdx; jj++){.   
dd40: 20 20 20 20 20 52 74 72 65 65 44 56 61 6c 75 65       RtreeDValue
dd50: 20 78 6c 65 66 74 31 20 3d 20 61 43 65 6c 6c 5b   xleft1 = aCell[
dd60: 61 49 64 78 5b 6a 6a 2d 31 5d 5d 2e 61 43 6f 6f  aIdx[jj-1]].aCoo
dd70: 72 64 5b 69 44 69 6d 2a 32 5d 3b 0a 20 20 20 20  rd[iDim*2];.    
dd80: 20 20 20 20 52 74 72 65 65 44 56 61 6c 75 65 20      RtreeDValue 
dd90: 78 6c 65 66 74 32 20 3d 20 61 43 65 6c 6c 5b 61  xleft2 = aCell[a
dda0: 49 64 78 5b 6a 6a 2d 31 5d 5d 2e 61 43 6f 6f 72  Idx[jj-1]].aCoor
ddb0: 64 5b 69 44 69 6d 2a 32 2b 31 5d 3b 0a 20 20 20  d[iDim*2+1];.   
ddc0: 20 20 20 20 20 52 74 72 65 65 44 56 61 6c 75 65       RtreeDValue
ddd0: 20 78 72 69 67 68 74 31 20 3d 20 61 43 65 6c 6c   xright1 = aCell
dde0: 5b 61 49 64 78 5b 6a 6a 5d 5d 2e 61 43 6f 6f 72  [aIdx[jj]].aCoor
ddf0: 64 5b 69 44 69 6d 2a 32 5d 3b 0a 20 20 20 20 20  d[iDim*2];.     
de00: 20 20 20 52 74 72 65 65 44 56 61 6c 75 65 20 78     RtreeDValue x
de10: 72 69 67 68 74 32 20 3d 20 61 43 65 6c 6c 5b 61  right2 = aCell[a
de20: 49 64 78 5b 6a 6a 5d 5d 2e 61 43 6f 6f 72 64 5b  Idx[jj]].aCoord[
de30: 69 44 69 6d 2a 32 2b 31 5d 3b 0a 20 20 20 20 20  iDim*2+1];.     
de40: 20 20 20 61 73 73 65 72 74 28 20 78 6c 65 66 74     assert( xleft
de50: 31 3c 3d 78 72 69 67 68 74 31 20 26 26 20 28 78  1<=xright1 && (x
de60: 6c 65 66 74 31 3c 78 72 69 67 68 74 31 20 7c 7c  left1<xright1 ||
de70: 20 78 6c 65 66 74 32 3c 3d 78 72 69 67 68 74 32   xleft2<=xright2
de80: 29 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ) );.      }.   
de90: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a   }.#endif.  }.}.
dea0: 0a 23 69 66 20 56 41 52 49 41 4e 54 5f 52 53 54  .#if VARIANT_RST
deb0: 41 52 54 52 45 45 5f 53 50 4c 49 54 0a 2f 2a 0a  ARTREE_SPLIT./*.
dec0: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
ded0: 6e 20 6f 66 20 74 68 65 20 52 2a 2d 74 72 65 65  n of the R*-tree
dee0: 20 76 61 72 69 61 6e 74 20 6f 66 20 53 70 6c 69   variant of Spli
def0: 74 4e 6f 64 65 20 66 72 6f 6d 20 42 65 63 6b 6d  tNode from Beckm
df00: 61 6e 5b 31 39 39 30 5d 2e 0a 2a 2f 0a 73 74 61  an[1990]..*/.sta
df10: 74 69 63 20 69 6e 74 20 73 70 6c 69 74 4e 6f 64  tic int splitNod
df20: 65 53 74 61 72 74 72 65 65 28 0a 20 20 52 74 72  eStartree(.  Rtr
df30: 65 65 20 2a 70 52 74 72 65 65 2c 0a 20 20 52 74  ee *pRtree,.  Rt
df40: 72 65 65 43 65 6c 6c 20 2a 61 43 65 6c 6c 2c 0a  reeCell *aCell,.
df50: 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 0a 20 20 52    int nCell,.  R
df60: 74 72 65 65 4e 6f 64 65 20 2a 70 4c 65 66 74 2c  treeNode *pLeft,
df70: 0a 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 52  .  RtreeNode *pR
df80: 69 67 68 74 2c 0a 20 20 52 74 72 65 65 43 65 6c  ight,.  RtreeCel
df90: 6c 20 2a 70 42 62 6f 78 4c 65 66 74 2c 0a 20 20  l *pBboxLeft,.  
dfa0: 52 74 72 65 65 43 65 6c 6c 20 2a 70 42 62 6f 78  RtreeCell *pBbox
dfb0: 52 69 67 68 74 0a 29 7b 0a 20 20 69 6e 74 20 2a  Right.){.  int *
dfc0: 2a 61 61 53 6f 72 74 65 64 3b 0a 20 20 69 6e 74  *aaSorted;.  int
dfd0: 20 2a 61 53 70 61 72 65 3b 0a 20 20 69 6e 74 20   *aSpare;.  int 
dfe0: 69 69 3b 0a 0a 20 20 69 6e 74 20 69 42 65 73 74  ii;..  int iBest
dff0: 44 69 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  Dim = 0;.  int i
e000: 42 65 73 74 53 70 6c 69 74 20 3d 20 30 3b 0a 20  BestSplit = 0;. 
e010: 20 52 74 72 65 65 44 56 61 6c 75 65 20 66 42 65   RtreeDValue fBe
e020: 73 74 4d 61 72 67 69 6e 20 3d 20 30 2e 30 3b 0a  stMargin = 0.0;.
e030: 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28  .  int nByte = (
e040: 70 52 74 72 65 65 2d 3e 6e 44 69 6d 2b 31 29 2a  pRtree->nDim+1)*
e050: 28 73 69 7a 65 6f 66 28 69 6e 74 2a 29 2b 6e 43  (sizeof(int*)+nC
e060: 65 6c 6c 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29  ell*sizeof(int))
e070: 3b 0a 0a 20 20 61 61 53 6f 72 74 65 64 20 3d 20  ;..  aaSorted = 
e080: 28 69 6e 74 20 2a 2a 29 73 71 6c 69 74 65 33 5f  (int **)sqlite3_
e090: 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20  malloc(nByte);. 
e0a0: 20 69 66 28 20 21 61 61 53 6f 72 74 65 64 20 29   if( !aaSorted )
e0b0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
e0c0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a  ITE_NOMEM;.  }..
e0d0: 20 20 61 53 70 61 72 65 20 3d 20 26 28 28 69 6e    aSpare = &((in
e0e0: 74 20 2a 29 26 61 61 53 6f 72 74 65 64 5b 70 52  t *)&aaSorted[pR
e0f0: 74 72 65 65 2d 3e 6e 44 69 6d 5d 29 5b 70 52 74  tree->nDim])[pRt
e100: 72 65 65 2d 3e 6e 44 69 6d 2a 6e 43 65 6c 6c 5d  ree->nDim*nCell]
e110: 3b 0a 20 20 6d 65 6d 73 65 74 28 61 61 53 6f 72  ;.  memset(aaSor
e120: 74 65 64 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a  ted, 0, nByte);.
e130: 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
e140: 52 74 72 65 65 2d 3e 6e 44 69 6d 3b 20 69 69 2b  Rtree->nDim; ii+
e150: 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 6a 3b 0a  +){.    int jj;.
e160: 20 20 20 20 61 61 53 6f 72 74 65 64 5b 69 69 5d      aaSorted[ii]
e170: 20 3d 20 26 28 28 69 6e 74 20 2a 29 26 61 61 53   = &((int *)&aaS
e180: 6f 72 74 65 64 5b 70 52 74 72 65 65 2d 3e 6e 44  orted[pRtree->nD
e190: 69 6d 5d 29 5b 69 69 2a 6e 43 65 6c 6c 5d 3b 0a  im])[ii*nCell];.
e1a0: 20 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a      for(jj=0; jj
e1b0: 3c 6e 43 65 6c 6c 3b 20 6a 6a 2b 2b 29 7b 0a 20  <nCell; jj++){. 
e1c0: 20 20 20 20 20 61 61 53 6f 72 74 65 64 5b 69 69       aaSorted[ii
e1d0: 5d 5b 6a 6a 5d 20 3d 20 6a 6a 3b 0a 20 20 20 20  ][jj] = jj;.    
e1e0: 7d 0a 20 20 20 20 53 6f 72 74 42 79 44 69 6d 65  }.    SortByDime
e1f0: 6e 73 69 6f 6e 28 70 52 74 72 65 65 2c 20 61 61  nsion(pRtree, aa
e200: 53 6f 72 74 65 64 5b 69 69 5d 2c 20 6e 43 65 6c  Sorted[ii], nCel
e210: 6c 2c 20 69 69 2c 20 61 43 65 6c 6c 2c 20 61 53  l, ii, aCell, aS
e220: 70 61 72 65 29 3b 0a 20 20 7d 0a 0a 20 20 66 6f  pare);.  }..  fo
e230: 72 28 69 69 3d 30 3b 20 69 69 3c 70 52 74 72 65  r(ii=0; ii<pRtre
e240: 65 2d 3e 6e 44 69 6d 3b 20 69 69 2b 2b 29 7b 0a  e->nDim; ii++){.
e250: 20 20 20 20 52 74 72 65 65 44 56 61 6c 75 65 20      RtreeDValue 
e260: 6d 61 72 67 69 6e 20 3d 20 30 2e 30 3b 0a 20 20  margin = 0.0;.  
e270: 20 20 52 74 72 65 65 44 56 61 6c 75 65 20 66 42    RtreeDValue fB
e280: 65 73 74 4f 76 65 72 6c 61 70 20 3d 20 30 2e 30  estOverlap = 0.0
e290: 3b 0a 20 20 20 20 52 74 72 65 65 44 56 61 6c 75  ;.    RtreeDValu
e2a0: 65 20 66 42 65 73 74 41 72 65 61 20 3d 20 30 2e  e fBestArea = 0.
e2b0: 30 3b 0a 20 20 20 20 69 6e 74 20 69 42 65 73 74  0;.    int iBest
e2c0: 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e  Left = 0;.    in
e2d0: 74 20 6e 4c 65 66 74 3b 0a 0a 20 20 20 20 66 6f  t nLeft;..    fo
e2e0: 72 28 0a 20 20 20 20 20 20 6e 4c 65 66 74 3d 52  r(.      nLeft=R
e2f0: 54 52 45 45 5f 4d 49 4e 43 45 4c 4c 53 28 70 52  TREE_MINCELLS(pR
e300: 74 72 65 65 29 3b 20 0a 20 20 20 20 20 20 6e 4c  tree); .      nL
e310: 65 66 74 3c 3d 28 6e 43 65 6c 6c 2d 52 54 52 45  eft<=(nCell-RTRE
e320: 45 5f 4d 49 4e 43 45 4c 4c 53 28 70 52 74 72 65  E_MINCELLS(pRtre
e330: 65 29 29 3b 20 0a 20 20 20 20 20 20 6e 4c 65 66  e)); .      nLef
e340: 74 2b 2b 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  t++.    ){.     
e350: 20 52 74 72 65 65 43 65 6c 6c 20 6c 65 66 74 3b   RtreeCell left;
e360: 0a 20 20 20 20 20 20 52 74 72 65 65 43 65 6c 6c  .      RtreeCell
e370: 20 72 69 67 68 74 3b 0a 20 20 20 20 20 20 69 6e   right;.      in
e380: 74 20 6b 6b 3b 0a 20 20 20 20 20 20 52 74 72 65  t kk;.      Rtre
e390: 65 44 56 61 6c 75 65 20 6f 76 65 72 6c 61 70 3b  eDValue overlap;
e3a0: 0a 20 20 20 20 20 20 52 74 72 65 65 44 56 61 6c  .      RtreeDVal
e3b0: 75 65 20 61 72 65 61 3b 0a 0a 20 20 20 20 20 20  ue area;..      
e3c0: 6d 65 6d 63 70 79 28 26 6c 65 66 74 2c 20 26 61  memcpy(&left, &a
e3d0: 43 65 6c 6c 5b 61 61 53 6f 72 74 65 64 5b 69 69  Cell[aaSorted[ii
e3e0: 5d 5b 30 5d 5d 2c 20 73 69 7a 65 6f 66 28 52 74  ][0]], sizeof(Rt
e3f0: 72 65 65 43 65 6c 6c 29 29 3b 0a 20 20 20 20 20  reeCell));.     
e400: 20 6d 65 6d 63 70 79 28 26 72 69 67 68 74 2c 20   memcpy(&right, 
e410: 26 61 43 65 6c 6c 5b 61 61 53 6f 72 74 65 64 5b  &aCell[aaSorted[
e420: 69 69 5d 5b 6e 43 65 6c 6c 2d 31 5d 5d 2c 20 73  ii][nCell-1]], s
e430: 69 7a 65 6f 66 28 52 74 72 65 65 43 65 6c 6c 29  izeof(RtreeCell)
e440: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 6b 3d  );.      for(kk=
e450: 31 3b 20 6b 6b 3c 28 6e 43 65 6c 6c 2d 31 29 3b  1; kk<(nCell-1);
e460: 20 6b 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   kk++){.        
e470: 69 66 28 20 6b 6b 3c 6e 4c 65 66 74 20 29 7b 0a  if( kk<nLeft ){.
e480: 20 20 20 20 20 20 20 20 20 20 63 65 6c 6c 55 6e            cellUn
e490: 69 6f 6e 28 70 52 74 72 65 65 2c 20 26 6c 65 66  ion(pRtree, &lef
e4a0: 74 2c 20 26 61 43 65 6c 6c 5b 61 61 53 6f 72 74  t, &aCell[aaSort
e4b0: 65 64 5b 69 69 5d 5b 6b 6b 5d 5d 29 3b 0a 20 20  ed[ii][kk]]);.  
e4c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e4d0: 20 20 20 20 20 20 20 63 65 6c 6c 55 6e 69 6f 6e         cellUnion
e4e0: 28 70 52 74 72 65 65 2c 20 26 72 69 67 68 74 2c  (pRtree, &right,
e4f0: 20 26 61 43 65 6c 6c 5b 61 61 53 6f 72 74 65 64   &aCell[aaSorted
e500: 5b 69 69 5d 5b 6b 6b 5d 5d 29 3b 0a 20 20 20 20  [ii][kk]]);.    
e510: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
e520: 20 20 20 20 6d 61 72 67 69 6e 20 2b 3d 20 63 65      margin += ce
e530: 6c 6c 4d 61 72 67 69 6e 28 70 52 74 72 65 65 2c  llMargin(pRtree,
e540: 20 26 6c 65 66 74 29 3b 0a 20 20 20 20 20 20 6d   &left);.      m
e550: 61 72 67 69 6e 20 2b 3d 20 63 65 6c 6c 4d 61 72  argin += cellMar
e560: 67 69 6e 28 70 52 74 72 65 65 2c 20 26 72 69 67  gin(pRtree, &rig
e570: 68 74 29 3b 0a 20 20 20 20 20 20 6f 76 65 72 6c  ht);.      overl
e580: 61 70 20 3d 20 63 65 6c 6c 4f 76 65 72 6c 61 70  ap = cellOverlap
e590: 28 70 52 74 72 65 65 2c 20 26 6c 65 66 74 2c 20  (pRtree, &left, 
e5a0: 26 72 69 67 68 74 2c 20 31 2c 20 2d 31 29 3b 0a  &right, 1, -1);.
e5b0: 20 20 20 20 20 20 61 72 65 61 20 3d 20 63 65 6c        area = cel
e5c0: 6c 41 72 65 61 28 70 52 74 72 65 65 2c 20 26 6c  lArea(pRtree, &l
e5d0: 65 66 74 29 20 2b 20 63 65 6c 6c 41 72 65 61 28  eft) + cellArea(
e5e0: 70 52 74 72 65 65 2c 20 26 72 69 67 68 74 29 3b  pRtree, &right);
e5f0: 0a 20 20 20 20 20 20 69 66 28 20 28 6e 4c 65 66  .      if( (nLef
e600: 74 3d 3d 52 54 52 45 45 5f 4d 49 4e 43 45 4c 4c  t==RTREE_MINCELL
e610: 53 28 70 52 74 72 65 65 29 29 0a 20 20 20 20 20  S(pRtree)).     
e620: 20 20 7c 7c 20 28 6f 76 65 72 6c 61 70 3c 66 42    || (overlap<fB
e630: 65 73 74 4f 76 65 72 6c 61 70 29 0a 20 20 20 20  estOverlap).    
e640: 20 20 20 7c 7c 20 28 6f 76 65 72 6c 61 70 3d 3d     || (overlap==
e650: 66 42 65 73 74 4f 76 65 72 6c 61 70 20 26 26 20  fBestOverlap && 
e660: 61 72 65 61 3c 66 42 65 73 74 41 72 65 61 29 0a  area<fBestArea).
e670: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
e680: 20 69 42 65 73 74 4c 65 66 74 20 3d 20 6e 4c 65   iBestLeft = nLe
e690: 66 74 3b 0a 20 20 20 20 20 20 20 20 66 42 65 73  ft;.        fBes
e6a0: 74 4f 76 65 72 6c 61 70 20 3d 20 6f 76 65 72 6c  tOverlap = overl
e6b0: 61 70 3b 0a 20 20 20 20 20 20 20 20 66 42 65 73  ap;.        fBes
e6c0: 74 41 72 65 61 20 3d 20 61 72 65 61 3b 0a 20 20  tArea = area;.  
e6d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
e6e0: 20 69 66 28 20 69 69 3d 3d 30 20 7c 7c 20 6d 61   if( ii==0 || ma
e6f0: 72 67 69 6e 3c 66 42 65 73 74 4d 61 72 67 69 6e  rgin<fBestMargin
e700: 20 29 7b 0a 20 20 20 20 20 20 69 42 65 73 74 44   ){.      iBestD
e710: 69 6d 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 66  im = ii;.      f
e720: 42 65 73 74 4d 61 72 67 69 6e 20 3d 20 6d 61 72  BestMargin = mar
e730: 67 69 6e 3b 0a 20 20 20 20 20 20 69 42 65 73 74  gin;.      iBest
e740: 53 70 6c 69 74 20 3d 20 69 42 65 73 74 4c 65 66  Split = iBestLef
e750: 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
e760: 6d 65 6d 63 70 79 28 70 42 62 6f 78 4c 65 66 74  memcpy(pBboxLeft
e770: 2c 20 26 61 43 65 6c 6c 5b 61 61 53 6f 72 74 65  , &aCell[aaSorte
e780: 64 5b 69 42 65 73 74 44 69 6d 5d 5b 30 5d 5d 2c  d[iBestDim][0]],
e790: 20 73 69 7a 65 6f 66 28 52 74 72 65 65 43 65 6c   sizeof(RtreeCel
e7a0: 6c 29 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 42  l));.  memcpy(pB
e7b0: 62 6f 78 52 69 67 68 74 2c 20 26 61 43 65 6c 6c  boxRight, &aCell
e7c0: 5b 61 61 53 6f 72 74 65 64 5b 69 42 65 73 74 44  [aaSorted[iBestD
e7d0: 69 6d 5d 5b 69 42 65 73 74 53 70 6c 69 74 5d 5d  im][iBestSplit]]
e7e0: 2c 20 73 69 7a 65 6f 66 28 52 74 72 65 65 43 65  , sizeof(RtreeCe
e7f0: 6c 6c 29 29 3b 0a 20 20 66 6f 72 28 69 69 3d 30  ll));.  for(ii=0
e800: 3b 20 69 69 3c 6e 43 65 6c 6c 3b 20 69 69 2b 2b  ; ii<nCell; ii++
e810: 29 7b 0a 20 20 20 20 52 74 72 65 65 4e 6f 64 65  ){.    RtreeNode
e820: 20 2a 70 54 61 72 67 65 74 20 3d 20 28 69 69 3c   *pTarget = (ii<
e830: 69 42 65 73 74 53 70 6c 69 74 29 3f 70 4c 65 66  iBestSplit)?pLef
e840: 74 3a 70 52 69 67 68 74 3b 0a 20 20 20 20 52 74  t:pRight;.    Rt
e850: 72 65 65 43 65 6c 6c 20 2a 70 42 62 6f 78 20 3d  reeCell *pBbox =
e860: 20 28 69 69 3c 69 42 65 73 74 53 70 6c 69 74 29   (ii<iBestSplit)
e870: 3f 70 42 62 6f 78 4c 65 66 74 3a 70 42 62 6f 78  ?pBboxLeft:pBbox
e880: 52 69 67 68 74 3b 0a 20 20 20 20 52 74 72 65 65  Right;.    Rtree
e890: 43 65 6c 6c 20 2a 70 43 65 6c 6c 20 3d 20 26 61  Cell *pCell = &a
e8a0: 43 65 6c 6c 5b 61 61 53 6f 72 74 65 64 5b 69 42  Cell[aaSorted[iB
e8b0: 65 73 74 44 69 6d 5d 5b 69 69 5d 5d 3b 0a 20 20  estDim][ii]];.  
e8c0: 20 20 6e 6f 64 65 49 6e 73 65 72 74 43 65 6c 6c    nodeInsertCell
e8d0: 28 70 52 74 72 65 65 2c 20 70 54 61 72 67 65 74  (pRtree, pTarget
e8e0: 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 63 65  , pCell);.    ce
e8f0: 6c 6c 55 6e 69 6f 6e 28 70 52 74 72 65 65 2c 20  llUnion(pRtree, 
e900: 70 42 62 6f 78 2c 20 70 43 65 6c 6c 29 3b 0a 20  pBbox, pCell);. 
e910: 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   }..  sqlite3_fr
e920: 65 65 28 61 61 53 6f 72 74 65 64 29 3b 0a 20 20  ee(aaSorted);.  
e930: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
e940: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  ;.}.#endif..#if 
e950: 56 41 52 49 41 4e 54 5f 47 55 54 54 4d 41 4e 5f  VARIANT_GUTTMAN_
e960: 53 50 4c 49 54 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  SPLIT./*.** Impl
e970: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
e980: 65 20 72 65 67 75 6c 61 72 20 52 2d 74 72 65 65  e regular R-tree
e990: 20 53 70 6c 69 74 4e 6f 64 65 20 66 72 6f 6d 20   SplitNode from 
e9a0: 47 75 74 74 6d 61 6e 5b 31 39 38 34 5d 2e 0a 2a  Guttman[1984]..*
e9b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 70 6c  /.static int spl
e9c0: 69 74 4e 6f 64 65 47 75 74 74 6d 61 6e 28 0a 20  itNodeGuttman(. 
e9d0: 20 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c 0a   Rtree *pRtree,.
e9e0: 20 20 52 74 72 65 65 43 65 6c 6c 20 2a 61 43 65    RtreeCell *aCe
e9f0: 6c 6c 2c 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c  ll,.  int nCell,
ea00: 0a 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 4c  .  RtreeNode *pL
ea10: 65 66 74 2c 0a 20 20 52 74 72 65 65 4e 6f 64 65  eft,.  RtreeNode
ea20: 20 2a 70 52 69 67 68 74 2c 0a 20 20 52 74 72 65   *pRight,.  Rtre
ea30: 65 43 65 6c 6c 20 2a 70 42 62 6f 78 4c 65 66 74  eCell *pBboxLeft
ea40: 2c 0a 20 20 52 74 72 65 65 43 65 6c 6c 20 2a 70  ,.  RtreeCell *p
ea50: 42 62 6f 78 52 69 67 68 74 0a 29 7b 0a 20 20 69  BboxRight.){.  i
ea60: 6e 74 20 69 4c 65 66 74 53 65 65 64 20 3d 20 30  nt iLeftSeed = 0
ea70: 3b 0a 20 20 69 6e 74 20 69 52 69 67 68 74 53 65  ;.  int iRightSe
ea80: 65 64 20 3d 20 31 3b 0a 20 20 69 6e 74 20 2a 61  ed = 1;.  int *a
ea90: 69 55 73 65 64 3b 0a 20 20 69 6e 74 20 69 3b 0a  iUsed;.  int i;.
eaa0: 0a 20 20 61 69 55 73 65 64 20 3d 20 73 71 6c 69  .  aiUsed = sqli
eab0: 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  te3_malloc(sizeo
eac0: 66 28 69 6e 74 29 2a 6e 43 65 6c 6c 29 3b 0a 20  f(int)*nCell);. 
ead0: 20 69 66 28 20 21 61 69 55 73 65 64 20 29 7b 0a   if( !aiUsed ){.
eae0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
eaf0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d  E_NOMEM;.  }.  m
eb00: 65 6d 73 65 74 28 61 69 55 73 65 64 2c 20 30 2c  emset(aiUsed, 0,
eb10: 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 43 65   sizeof(int)*nCe
eb20: 6c 6c 29 3b 0a 0a 20 20 50 69 63 6b 53 65 65 64  ll);..  PickSeed
eb30: 73 28 70 52 74 72 65 65 2c 20 61 43 65 6c 6c 2c  s(pRtree, aCell,
eb40: 20 6e 43 65 6c 6c 2c 20 26 69 4c 65 66 74 53 65   nCell, &iLeftSe
eb50: 65 64 2c 20 26 69 52 69 67 68 74 53 65 65 64 29  ed, &iRightSeed)
eb60: 3b 0a 0a 20 20 6d 65 6d 63 70 79 28 70 42 62 6f  ;..  memcpy(pBbo
eb70: 78 4c 65 66 74 2c 20 26 61 43 65 6c 6c 5b 69 4c  xLeft, &aCell[iL
eb80: 65 66 74 53 65 65 64 5d 2c 20 73 69 7a 65 6f 66  eftSeed], sizeof
eb90: 28 52 74 72 65 65 43 65 6c 6c 29 29 3b 0a 20 20  (RtreeCell));.  
eba0: 6d 65 6d 63 70 79 28 70 42 62 6f 78 52 69 67 68  memcpy(pBboxRigh
ebb0: 74 2c 20 26 61 43 65 6c 6c 5b 69 52 69 67 68 74  t, &aCell[iRight
ebc0: 53 65 65 64 5d 2c 20 73 69 7a 65 6f 66 28 52 74  Seed], sizeof(Rt
ebd0: 72 65 65 43 65 6c 6c 29 29 3b 0a 20 20 6e 6f 64  reeCell));.  nod
ebe0: 65 49 6e 73 65 72 74 43 65 6c 6c 28 70 52 74 72  eInsertCell(pRtr
ebf0: 65 65 2c 20 70 4c 65 66 74 2c 20 26 61 43 65 6c  ee, pLeft, &aCel
ec00: 6c 5b 69 4c 65 66 74 53 65 65 64 5d 29 3b 0a 20  l[iLeftSeed]);. 
ec10: 20 6e 6f 64 65 49 6e 73 65 72 74 43 65 6c 6c 28   nodeInsertCell(
ec20: 70 52 74 72 65 65 2c 20 70 52 69 67 68 74 2c 20  pRtree, pRight, 
ec30: 26 61 43 65 6c 6c 5b 69 52 69 67 68 74 53 65 65  &aCell[iRightSee
ec40: 64 5d 29 3b 0a 20 20 61 69 55 73 65 64 5b 69 4c  d]);.  aiUsed[iL
ec50: 65 66 74 53 65 65 64 5d 20 3d 20 31 3b 0a 20 20  eftSeed] = 1;.  
ec60: 61 69 55 73 65 64 5b 69 52 69 67 68 74 53 65 65  aiUsed[iRightSee
ec70: 64 5d 20 3d 20 31 3b 0a 0a 20 20 66 6f 72 28 69  d] = 1;..  for(i
ec80: 3d 6e 43 65 6c 6c 2d 32 3b 20 69 3e 30 3b 20 69  =nCell-2; i>0; i
ec90: 2d 2d 29 7b 0a 20 20 20 20 52 74 72 65 65 43 65  --){.    RtreeCe
eca0: 6c 6c 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 70  ll *pNext;.    p
ecb0: 4e 65 78 74 20 3d 20 50 69 63 6b 4e 65 78 74 28  Next = PickNext(
ecc0: 70 52 74 72 65 65 2c 20 61 43 65 6c 6c 2c 20 6e  pRtree, aCell, n
ecd0: 43 65 6c 6c 2c 20 70 42 62 6f 78 4c 65 66 74 2c  Cell, pBboxLeft,
ece0: 20 70 42 62 6f 78 52 69 67 68 74 2c 20 61 69 55   pBboxRight, aiU
ecf0: 73 65 64 29 3b 0a 20 20 20 20 52 74 72 65 65 44  sed);.    RtreeD
ed00: 56 61 6c 75 65 20 64 69 66 66 20 3d 20 20 0a 20  Value diff =  . 
ed10: 20 20 20 20 20 63 65 6c 6c 47 72 6f 77 74 68 28       cellGrowth(
ed20: 70 52 74 72 65 65 2c 20 70 42 62 6f 78 4c 65 66  pRtree, pBboxLef
ed30: 74 2c 20 70 4e 65 78 74 29 20 2d 20 0a 20 20 20  t, pNext) - .   
ed40: 20 20 20 63 65 6c 6c 47 72 6f 77 74 68 28 70 52     cellGrowth(pR
ed50: 74 72 65 65 2c 20 70 42 62 6f 78 52 69 67 68 74  tree, pBboxRight
ed60: 2c 20 70 4e 65 78 74 29 0a 20 20 20 20 3b 0a 20  , pNext).    ;. 
ed70: 20 20 20 69 66 28 20 28 52 54 52 45 45 5f 4d 49     if( (RTREE_MI
ed80: 4e 43 45 4c 4c 53 28 70 52 74 72 65 65 29 2d 4e  NCELLS(pRtree)-N
ed90: 43 45 4c 4c 28 70 52 69 67 68 74 29 3d 3d 69 29  CELL(pRight)==i)
eda0: 0a 20 20 20 20 20 7c 7c 20 28 64 69 66 66 3e 30  .     || (diff>0
edb0: 2e 30 20 26 26 20 28 52 54 52 45 45 5f 4d 49 4e  .0 && (RTREE_MIN
edc0: 43 45 4c 4c 53 28 70 52 74 72 65 65 29 2d 4e 43  CELLS(pRtree)-NC
edd0: 45 4c 4c 28 70 4c 65 66 74 29 21 3d 69 29 29 0a  ELL(pLeft)!=i)).
ede0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 6e 6f 64      ){.      nod
edf0: 65 49 6e 73 65 72 74 43 65 6c 6c 28 70 52 74 72  eInsertCell(pRtr
ee00: 65 65 2c 20 70 52 69 67 68 74 2c 20 70 4e 65 78  ee, pRight, pNex
ee10: 74 29 3b 0a 20 20 20 20 20 20 63 65 6c 6c 55 6e  t);.      cellUn
ee20: 69 6f 6e 28 70 52 74 72 65 65 2c 20 70 42 62 6f  ion(pRtree, pBbo
ee30: 78 52 69 67 68 74 2c 20 70 4e 65 78 74 29 3b 0a  xRight, pNext);.
ee40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ee50: 20 6e 6f 64 65 49 6e 73 65 72 74 43 65 6c 6c 28   nodeInsertCell(
ee60: 70 52 74 72 65 65 2c 20 70 4c 65 66 74 2c 20 70  pRtree, pLeft, p
ee70: 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 63 65 6c  Next);.      cel
ee80: 6c 55 6e 69 6f 6e 28 70 52 74 72 65 65 2c 20 70  lUnion(pRtree, p
ee90: 42 62 6f 78 4c 65 66 74 2c 20 70 4e 65 78 74 29  BboxLeft, pNext)
eea0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73  ;.    }.  }..  s
eeb0: 71 6c 69 74 65 33 5f 66 72 65 65 28 61 69 55 73  qlite3_free(aiUs
eec0: 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ed);.  return SQ
eed0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
eee0: 66 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 75 70  f..static int up
eef0: 64 61 74 65 4d 61 70 70 69 6e 67 28 0a 20 20 52  dateMapping(.  R
ef00: 74 72 65 65 20 2a 70 52 74 72 65 65 2c 20 0a 20  tree *pRtree, . 
ef10: 20 69 36 34 20 69 52 6f 77 69 64 2c 20 0a 20 20   i64 iRowid, .  
ef20: 52 74 72 65 65 4e 6f 64 65 20 2a 70 4e 6f 64 65  RtreeNode *pNode
ef30: 2c 20 0a 20 20 69 6e 74 20 69 48 65 69 67 68 74  , .  int iHeight
ef40: 0a 29 7b 0a 20 20 69 6e 74 20 28 2a 78 53 65 74  .){.  int (*xSet
ef50: 4d 61 70 70 69 6e 67 29 28 52 74 72 65 65 20 2a  Mapping)(Rtree *
ef60: 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 2c  , sqlite3_int64,
ef70: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 3b   sqlite3_int64);
ef80: 0a 20 20 78 53 65 74 4d 61 70 70 69 6e 67 20 3d  .  xSetMapping =
ef90: 20 28 28 69 48 65 69 67 68 74 3d 3d 30 29 3f 72   ((iHeight==0)?r
efa0: 6f 77 69 64 57 72 69 74 65 3a 70 61 72 65 6e 74  owidWrite:parent
efb0: 57 72 69 74 65 29 3b 0a 20 20 69 66 28 20 69 48  Write);.  if( iH
efc0: 65 69 67 68 74 3e 30 20 29 7b 0a 20 20 20 20 52  eight>0 ){.    R
efd0: 74 72 65 65 4e 6f 64 65 20 2a 70 43 68 69 6c 64  treeNode *pChild
efe0: 20 3d 20 6e 6f 64 65 48 61 73 68 4c 6f 6f 6b 75   = nodeHashLooku
eff0: 70 28 70 52 74 72 65 65 2c 20 69 52 6f 77 69 64  p(pRtree, iRowid
f000: 29 3b 0a 20 20 20 20 69 66 28 20 70 43 68 69 6c  );.    if( pChil
f010: 64 20 29 7b 0a 20 20 20 20 20 20 6e 6f 64 65 52  d ){.      nodeR
f020: 65 6c 65 61 73 65 28 70 52 74 72 65 65 2c 20 70  elease(pRtree, p
f030: 43 68 69 6c 64 2d 3e 70 50 61 72 65 6e 74 29 3b  Child->pParent);
f040: 0a 20 20 20 20 20 20 6e 6f 64 65 52 65 66 65 72  .      nodeRefer
f050: 65 6e 63 65 28 70 4e 6f 64 65 29 3b 0a 20 20 20  ence(pNode);.   
f060: 20 20 20 70 43 68 69 6c 64 2d 3e 70 50 61 72 65     pChild->pPare
f070: 6e 74 20 3d 20 70 4e 6f 64 65 3b 0a 20 20 20 20  nt = pNode;.    
f080: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 78  }.  }.  return x
f090: 53 65 74 4d 61 70 70 69 6e 67 28 70 52 74 72 65  SetMapping(pRtre
f0a0: 65 2c 20 69 52 6f 77 69 64 2c 20 70 4e 6f 64 65  e, iRowid, pNode
f0b0: 2d 3e 69 4e 6f 64 65 29 3b 0a 7d 0a 0a 73 74 61  ->iNode);.}..sta
f0c0: 74 69 63 20 69 6e 74 20 53 70 6c 69 74 4e 6f 64  tic int SplitNod
f0d0: 65 28 0a 20 20 52 74 72 65 65 20 2a 70 52 74 72  e(.  Rtree *pRtr
f0e0: 65 65 2c 0a 20 20 52 74 72 65 65 4e 6f 64 65 20  ee,.  RtreeNode 
f0f0: 2a 70 4e 6f 64 65 2c 0a 20 20 52 74 72 65 65 43  *pNode,.  RtreeC
f100: 65 6c 6c 20 2a 70 43 65 6c 6c 2c 0a 20 20 69 6e  ell *pCell,.  in
f110: 74 20 69 48 65 69 67 68 74 0a 29 7b 0a 20 20 69  t iHeight.){.  i
f120: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 65 77 43  nt i;.  int newC
f130: 65 6c 6c 49 73 52 69 67 68 74 20 3d 20 30 3b 0a  ellIsRight = 0;.
f140: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
f150: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 43 65  TE_OK;.  int nCe
f160: 6c 6c 20 3d 20 4e 43 45 4c 4c 28 70 4e 6f 64 65  ll = NCELL(pNode
f170: 29 3b 0a 20 20 52 74 72 65 65 43 65 6c 6c 20 2a  );.  RtreeCell *
f180: 61 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 2a 61 69  aCell;.  int *ai
f190: 55 73 65 64 3b 0a 0a 20 20 52 74 72 65 65 4e 6f  Used;..  RtreeNo
f1a0: 64 65 20 2a 70 4c 65 66 74 20 3d 20 30 3b 0a 20  de *pLeft = 0;. 
f1b0: 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 52 69 67   RtreeNode *pRig
f1c0: 68 74 20 3d 20 30 3b 0a 0a 20 20 52 74 72 65 65  ht = 0;..  Rtree
f1d0: 43 65 6c 6c 20 6c 65 66 74 62 62 6f 78 3b 0a 20  Cell leftbbox;. 
f1e0: 20 52 74 72 65 65 43 65 6c 6c 20 72 69 67 68 74   RtreeCell right
f1f0: 62 62 6f 78 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  bbox;..  /* Allo
f200: 63 61 74 65 20 61 6e 20 61 72 72 61 79 20 61 6e  cate an array an
f210: 64 20 70 6f 70 75 6c 61 74 65 20 69 74 20 77 69  d populate it wi
f220: 74 68 20 61 20 63 6f 70 79 20 6f 66 20 70 43 65  th a copy of pCe
f230: 6c 6c 20 61 6e 64 20 0a 20 20 2a 2a 20 61 6c 6c  ll and .  ** all
f240: 20 63 65 6c 6c 73 20 66 72 6f 6d 20 6e 6f 64 65   cells from node
f250: 20 70 4c 65 66 74 2e 20 54 68 65 6e 20 7a 65 72   pLeft. Then zer
f260: 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6e  o the original n
f270: 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 43 65 6c  ode..  */.  aCel
f280: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  l = sqlite3_mall
f290: 6f 63 28 28 73 69 7a 65 6f 66 28 52 74 72 65 65  oc((sizeof(Rtree
f2a0: 43 65 6c 6c 29 2b 73 69 7a 65 6f 66 28 69 6e 74  Cell)+sizeof(int
f2b0: 29 29 2a 28 6e 43 65 6c 6c 2b 31 29 29 3b 0a 20  ))*(nCell+1));. 
f2c0: 20 69 66 28 20 21 61 43 65 6c 6c 20 29 7b 0a 20   if( !aCell ){. 
f2d0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
f2e0: 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 73  OMEM;.    goto s
f2f0: 70 6c 69 74 6e 6f 64 65 5f 6f 75 74 3b 0a 20 20  plitnode_out;.  
f300: 7d 0a 20 20 61 69 55 73 65 64 20 3d 20 28 69 6e  }.  aiUsed = (in
f310: 74 20 2a 29 26 61 43 65 6c 6c 5b 6e 43 65 6c 6c  t *)&aCell[nCell
f320: 2b 31 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 61 69  +1];.  memset(ai
f330: 55 73 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Used, 0, sizeof(
f340: 69 6e 74 29 2a 28 6e 43 65 6c 6c 2b 31 29 29 3b  int)*(nCell+1));
f350: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
f360: 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e  ell; i++){.    n
f370: 6f 64 65 47 65 74 43 65 6c 6c 28 70 52 74 72 65  odeGetCell(pRtre
f380: 65 2c 20 70 4e 6f 64 65 2c 20 69 2c 20 26 61 43  e, pNode, i, &aC
f390: 65 6c 6c 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 6e  ell[i]);.  }.  n
f3a0: 6f 64 65 5a 65 72 6f 28 70 52 74 72 65 65 2c 20  odeZero(pRtree, 
f3b0: 70 4e 6f 64 65 29 3b 0a 20 20 6d 65 6d 63 70 79  pNode);.  memcpy
f3c0: 28 26 61 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20  (&aCell[nCell], 
f3d0: 70 43 65 6c 6c 2c 20 73 69 7a 65 6f 66 28 52 74  pCell, sizeof(Rt
f3e0: 72 65 65 43 65 6c 6c 29 29 3b 0a 20 20 6e 43 65  reeCell));.  nCe
f3f0: 6c 6c 2b 2b 3b 0a 0a 20 20 69 66 28 20 70 4e 6f  ll++;..  if( pNo
f400: 64 65 2d 3e 69 4e 6f 64 65 3d 3d 31 20 29 7b 0a  de->iNode==1 ){.
f410: 20 20 20 20 70 52 69 67 68 74 20 3d 20 6e 6f 64      pRight = nod
f420: 65 4e 65 77 28 70 52 74 72 65 65 2c 20 70 4e 6f  eNew(pRtree, pNo
f430: 64 65 29 3b 0a 20 20 20 20 70 4c 65 66 74 20 3d  de);.    pLeft =
f440: 20 6e 6f 64 65 4e 65 77 28 70 52 74 72 65 65 2c   nodeNew(pRtree,
f450: 20 70 4e 6f 64 65 29 3b 0a 20 20 20 20 70 52 74   pNode);.    pRt
f460: 72 65 65 2d 3e 69 44 65 70 74 68 2b 2b 3b 0a 20  ree->iDepth++;. 
f470: 20 20 20 70 4e 6f 64 65 2d 3e 69 73 44 69 72 74     pNode->isDirt
f480: 79 20 3d 20 31 3b 0a 20 20 20 20 77 72 69 74 65  y = 1;.    write
f490: 49 6e 74 31 36 28 70 4e 6f 64 65 2d 3e 7a 44 61  Int16(pNode->zDa
f4a0: 74 61 2c 20 70 52 74 72 65 65 2d 3e 69 44 65 70  ta, pRtree->iDep
f4b0: 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  th);.  }else{.  
f4c0: 20 20 70 4c 65 66 74 20 3d 20 70 4e 6f 64 65 3b    pLeft = pNode;
f4d0: 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20 6e 6f  .    pRight = no
f4e0: 64 65 4e 65 77 28 70 52 74 72 65 65 2c 20 70 4c  deNew(pRtree, pL
f4f0: 65 66 74 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20  eft->pParent);. 
f500: 20 20 20 6e 6f 64 65 52 65 66 65 72 65 6e 63 65     nodeReference
f510: 28 70 4c 65 66 74 29 3b 0a 20 20 7d 0a 0a 20 20  (pLeft);.  }..  
f520: 69 66 28 20 21 70 4c 65 66 74 20 7c 7c 20 21 70  if( !pLeft || !p
f530: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 72 63 20  Right ){.    rc 
f540: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
f550: 20 20 20 20 67 6f 74 6f 20 73 70 6c 69 74 6e 6f      goto splitno
f560: 64 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 6d  de_out;.  }..  m
f570: 65 6d 73 65 74 28 70 4c 65 66 74 2d 3e 7a 44 61  emset(pLeft->zDa
f580: 74 61 2c 20 30 2c 20 70 52 74 72 65 65 2d 3e 69  ta, 0, pRtree->i
f590: 4e 6f 64 65 53 69 7a 65 29 3b 0a 20 20 6d 65 6d  NodeSize);.  mem
f5a0: 73 65 74 28 70 52 69 67 68 74 2d 3e 7a 44 61 74  set(pRight->zDat
f5b0: 61 2c 20 30 2c 20 70 52 74 72 65 65 2d 3e 69 4e  a, 0, pRtree->iN
f5c0: 6f 64 65 53 69 7a 65 29 3b 0a 0a 20 20 72 63 20  odeSize);..  rc 
f5d0: 3d 20 41 73 73 69 67 6e 43 65 6c 6c 73 28 70 52  = AssignCells(pR
f5e0: 74 72 65 65 2c 20 61 43 65 6c 6c 2c 20 6e 43 65  tree, aCell, nCe
f5f0: 6c 6c 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  ll, pLeft, pRigh
f600: 74 2c 20 26 6c 65 66 74 62 62 6f 78 2c 20 26 72  t, &leftbbox, &r
f610: 69 67 68 74 62 62 6f 78 29 3b 0a 20 20 69 66 28  ightbbox);.  if(
f620: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
f630: 7b 0a 20 20 20 20 67 6f 74 6f 20 73 70 6c 69 74  {.    goto split
f640: 6e 6f 64 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  node_out;.  }.. 
f650: 20 2f 2a 20 45 6e 73 75 72 65 20 62 6f 74 68 20   /* Ensure both 
f660: 63 68 69 6c 64 20 6e 6f 64 65 73 20 68 61 76 65  child nodes have
f670: 20 6e 6f 64 65 20 6e 75 6d 62 65 72 73 20 61 73   node numbers as
f680: 73 69 67 6e 65 64 20 74 6f 20 74 68 65 6d 20 62  signed to them b
f690: 79 20 63 61 6c 6c 69 6e 67 0a 20 20 2a 2a 20 6e  y calling.  ** n
f6a0: 6f 64 65 57 72 69 74 65 28 29 2e 20 4e 6f 64 65  odeWrite(). Node
f6b0: 20 70 52 69 67 68 74 20 61 6c 77 61 79 73 20 6e   pRight always n
f6c0: 65 65 64 73 20 61 20 6e 6f 64 65 20 6e 75 6d 62  eeds a node numb
f6d0: 65 72 2c 20 61 73 20 69 74 20 77 61 73 20 63 72  er, as it was cr
f6e0: 65 61 74 65 64 0a 20 20 2a 2a 20 62 79 20 6e 6f  eated.  ** by no
f6f0: 64 65 4e 65 77 28 29 20 61 62 6f 76 65 2e 20 42  deNew() above. B
f700: 75 74 20 6e 6f 64 65 20 70 4c 65 66 74 20 73 6f  ut node pLeft so
f710: 6d 65 74 69 6d 65 73 20 61 6c 72 65 61 64 79 20  metimes already 
f720: 68 61 73 20 61 20 6e 6f 64 65 20 6e 75 6d 62 65  has a node numbe
f730: 72 2e 0a 20 20 2a 2a 20 49 6e 20 74 68 69 73 20  r..  ** In this 
f740: 63 61 73 65 20 61 76 6f 69 64 20 74 68 65 20 61  case avoid the a
f750: 6c 6c 20 74 6f 20 6e 6f 64 65 57 72 69 74 65 28  ll to nodeWrite(
f760: 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53 51  )..  */.  if( SQ
f770: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 6e  LITE_OK!=(rc = n
f780: 6f 64 65 57 72 69 74 65 28 70 52 74 72 65 65 2c  odeWrite(pRtree,
f790: 20 70 52 69 67 68 74 29 29 0a 20 20 20 7c 7c 20   pRight)).   || 
f7a0: 28 30 3d 3d 70 4c 65 66 74 2d 3e 69 4e 6f 64 65  (0==pLeft->iNode
f7b0: 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   && SQLITE_OK!=(
f7c0: 72 63 20 3d 20 6e 6f 64 65 57 72 69 74 65 28 70  rc = nodeWrite(p
f7d0: 52 74 72 65 65 2c 20 70 4c 65 66 74 29 29 29 0a  Rtree, pLeft))).
f7e0: 20 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 70    ){.    goto sp
f7f0: 6c 69 74 6e 6f 64 65 5f 6f 75 74 3b 0a 20 20 7d  litnode_out;.  }
f800: 0a 0a 20 20 72 69 67 68 74 62 62 6f 78 2e 69 52  ..  rightbbox.iR
f810: 6f 77 69 64 20 3d 20 70 52 69 67 68 74 2d 3e 69  owid = pRight->i
f820: 4e 6f 64 65 3b 0a 20 20 6c 65 66 74 62 62 6f 78  Node;.  leftbbox
f830: 2e 69 52 6f 77 69 64 20 3d 20 70 4c 65 66 74 2d  .iRowid = pLeft-
f840: 3e 69 4e 6f 64 65 3b 0a 0a 20 20 69 66 28 20 70  >iNode;..  if( p
f850: 4e 6f 64 65 2d 3e 69 4e 6f 64 65 3d 3d 31 20 29  Node->iNode==1 )
f860: 7b 0a 20 20 20 20 72 63 20 3d 20 72 74 72 65 65  {.    rc = rtree
f870: 49 6e 73 65 72 74 43 65 6c 6c 28 70 52 74 72 65  InsertCell(pRtre
f880: 65 2c 20 70 4c 65 66 74 2d 3e 70 50 61 72 65 6e  e, pLeft->pParen
f890: 74 2c 20 26 6c 65 66 74 62 62 6f 78 2c 20 69 48  t, &leftbbox, iH
f8a0: 65 69 67 68 74 2b 31 29 3b 0a 20 20 20 20 69 66  eight+1);.    if
f8b0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
f8c0: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 70  ){.      goto sp
f8d0: 6c 69 74 6e 6f 64 65 5f 6f 75 74 3b 0a 20 20 20  litnode_out;.   
f8e0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
f8f0: 52 74 72 65 65 4e 6f 64 65 20 2a 70 50 61 72 65  RtreeNode *pPare
f900: 6e 74 20 3d 20 70 4c 65 66 74 2d 3e 70 50 61 72  nt = pLeft->pPar
f910: 65 6e 74 3b 0a 20 20 20 20 69 6e 74 20 69 43 65  ent;.    int iCe
f920: 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6e 6f 64  ll;.    rc = nod
f930: 65 50 61 72 65 6e 74 49 6e 64 65 78 28 70 52 74  eParentIndex(pRt
f940: 72 65 65 2c 20 70 4c 65 66 74 2c 20 26 69 43 65  ree, pLeft, &iCe
f950: 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ll);.    if( rc=
f960: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
f970: 20 20 20 20 6e 6f 64 65 4f 76 65 72 77 72 69 74      nodeOverwrit
f980: 65 43 65 6c 6c 28 70 52 74 72 65 65 2c 20 70 50  eCell(pRtree, pP
f990: 61 72 65 6e 74 2c 20 26 6c 65 66 74 62 62 6f 78  arent, &leftbbox
f9a0: 2c 20 69 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20  , iCell);.      
f9b0: 72 63 20 3d 20 41 64 6a 75 73 74 54 72 65 65 28  rc = AdjustTree(
f9c0: 70 52 74 72 65 65 2c 20 70 50 61 72 65 6e 74 2c  pRtree, pParent,
f9d0: 20 26 6c 65 66 74 62 62 6f 78 29 3b 0a 20 20 20   &leftbbox);.   
f9e0: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
f9f0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
fa00: 20 20 67 6f 74 6f 20 73 70 6c 69 74 6e 6f 64 65    goto splitnode
fa10: 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _out;.    }.  }.
fa20: 20 20 69 66 28 20 28 72 63 20 3d 20 72 74 72 65    if( (rc = rtre
fa30: 65 49 6e 73 65 72 74 43 65 6c 6c 28 70 52 74 72  eInsertCell(pRtr
fa40: 65 65 2c 20 70 52 69 67 68 74 2d 3e 70 50 61 72  ee, pRight->pPar
fa50: 65 6e 74 2c 20 26 72 69 67 68 74 62 62 6f 78 2c  ent, &rightbbox,
fa60: 20 69 48 65 69 67 68 74 2b 31 29 29 20 29 7b 0a   iHeight+1)) ){.
fa70: 20 20 20 20 67 6f 74 6f 20 73 70 6c 69 74 6e 6f      goto splitno
fa80: 64 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 66  de_out;.  }..  f
fa90: 6f 72 28 69 3d 30 3b 20 69 3c 4e 43 45 4c 4c 28  or(i=0; i<NCELL(
faa0: 70 52 69 67 68 74 29 3b 20 69 2b 2b 29 7b 0a 20  pRight); i++){. 
fab0: 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20     i64 iRowid = 
fac0: 6e 6f 64 65 47 65 74 52 6f 77 69 64 28 70 52 74  nodeGetRowid(pRt
fad0: 72 65 65 2c 20 70 52 69 67 68 74 2c 20 69 29 3b  ree, pRight, i);
fae0: 0a 20 20 20 20 72 63 20 3d 20 75 70 64 61 74 65  .    rc = update
faf0: 4d 61 70 70 69 6e 67 28 70 52 74 72 65 65 2c 20  Mapping(pRtree, 
fb00: 69 52 6f 77 69 64 2c 20 70 52 69 67 68 74 2c 20  iRowid, pRight, 
fb10: 69 48 65 69 67 68 74 29 3b 0a 20 20 20 20 69 66  iHeight);.    if
fb20: 28 20 69 52 6f 77 69 64 3d 3d 70 43 65 6c 6c 2d  ( iRowid==pCell-
fb30: 3e 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  >iRowid ){.     
fb40: 20 6e 65 77 43 65 6c 6c 49 73 52 69 67 68 74 20   newCellIsRight 
fb50: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
fb60: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
fb70: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
fb80: 70 6c 69 74 6e 6f 64 65 5f 6f 75 74 3b 0a 20 20  plitnode_out;.  
fb90: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e    }.  }.  if( pN
fba0: 6f 64 65 2d 3e 69 4e 6f 64 65 3d 3d 31 20 29 7b  ode->iNode==1 ){
fbb0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
fbc0: 4e 43 45 4c 4c 28 70 4c 65 66 74 29 3b 20 69 2b  NCELL(pLeft); i+
fbd0: 2b 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69 52  +){.      i64 iR
fbe0: 6f 77 69 64 20 3d 20 6e 6f 64 65 47 65 74 52 6f  owid = nodeGetRo
fbf0: 77 69 64 28 70 52 74 72 65 65 2c 20 70 4c 65 66  wid(pRtree, pLef
fc00: 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 72 63 20  t, i);.      rc 
fc10: 3d 20 75 70 64 61 74 65 4d 61 70 70 69 6e 67 28  = updateMapping(
fc20: 70 52 74 72 65 65 2c 20 69 52 6f 77 69 64 2c 20  pRtree, iRowid, 
fc30: 70 4c 65 66 74 2c 20 69 48 65 69 67 68 74 29 3b  pLeft, iHeight);
fc40: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
fc50: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
fc60: 20 20 20 20 67 6f 74 6f 20 73 70 6c 69 74 6e 6f      goto splitno
fc70: 64 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  de_out;.      }.
fc80: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
fc90: 28 20 6e 65 77 43 65 6c 6c 49 73 52 69 67 68 74  ( newCellIsRight
fca0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
fcb0: 75 70 64 61 74 65 4d 61 70 70 69 6e 67 28 70 52  updateMapping(pR
fcc0: 74 72 65 65 2c 20 70 43 65 6c 6c 2d 3e 69 52 6f  tree, pCell->iRo
fcd0: 77 69 64 2c 20 70 4c 65 66 74 2c 20 69 48 65 69  wid, pLeft, iHei
fce0: 67 68 74 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ght);.  }..  if(
fcf0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
fd00: 7b 0a 20 20 20 20 72 63 20 3d 20 6e 6f 64 65 52  {.    rc = nodeR
fd10: 65 6c 65 61 73 65 28 70 52 74 72 65 65 2c 20 70  elease(pRtree, p
fd20: 52 69 67 68 74 29 3b 0a 20 20 20 20 70 52 69 67  Right);.    pRig
fd30: 68 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  ht = 0;.  }.  if
fd40: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
fd50: 29 7b 0a 20 20 20 20 72 63 20 3d 20 6e 6f 64 65  ){.    rc = node
fd60: 52 65 6c 65 61 73 65 28 70 52 74 72 65 65 2c 20  Release(pRtree, 
fd70: 70 4c 65 66 74 29 3b 0a 20 20 20 20 70 4c 65 66  pLeft);.    pLef
fd80: 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 73 70 6c 69  t = 0;.  }..spli
fd90: 74 6e 6f 64 65 5f 6f 75 74 3a 0a 20 20 6e 6f 64  tnode_out:.  nod
fda0: 65 52 65 6c 65 61 73 65 28 70 52 74 72 65 65 2c  eRelease(pRtree,
fdb0: 20 70 52 69 67 68 74 29 3b 0a 20 20 6e 6f 64 65   pRight);.  node
fdc0: 52 65 6c 65 61 73 65 28 70 52 74 72 65 65 2c 20  Release(pRtree, 
fdd0: 70 4c 65 66 74 29 3b 0a 20 20 73 71 6c 69 74 65  pLeft);.  sqlite
fde0: 33 5f 66 72 65 65 28 61 43 65 6c 6c 29 3b 0a 20  3_free(aCell);. 
fdf0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
fe00: 2a 0a 2a 2a 20 49 66 20 6e 6f 64 65 20 70 4c 65  *.** If node pLe
fe10: 61 66 20 69 73 20 6e 6f 74 20 74 68 65 20 72 6f  af is not the ro
fe20: 6f 74 20 6f 66 20 74 68 65 20 72 2d 74 72 65 65  ot of the r-tree
fe30: 20 61 6e 64 20 69 74 73 20 70 50 61 72 65 6e 74   and its pParent
fe40: 20 70 6f 69 6e 74 65 72 20 69 73 20 0a 2a 2a 20   pointer is .** 
fe50: 73 74 69 6c 6c 20 4e 55 4c 4c 2c 20 6c 6f 61 64  still NULL, load
fe60: 20 61 6c 6c 20 61 6e 63 65 73 74 6f 72 20 6e 6f   all ancestor no
fe70: 64 65 73 20 6f 66 20 70 4c 65 61 66 20 69 6e 74  des of pLeaf int
fe80: 6f 20 6d 65 6d 6f 72 79 20 61 6e 64 20 70 6f 70  o memory and pop
fe90: 75 6c 61 74 65 0a 2a 2a 20 74 68 65 20 70 4c 65  ulate.** the pLe
fea0: 61 66 2d 3e 70 50 61 72 65 6e 74 20 63 68 61 69  af->pParent chai
feb0: 6e 20 61 6c 6c 20 74 68 65 20 77 61 79 20 75 70  n all the way up
fec0: 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64   to the root nod
fed0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70  e..**.** This op
fee0: 65 72 61 74 69 6f 6e 20 69 73 20 72 65 71 75 69  eration is requi
fef0: 72 65 64 20 77 68 65 6e 20 61 20 72 6f 77 20 69  red when a row i
ff00: 73 20 64 65 6c 65 74 65 64 20 28 6f 72 20 75 70  s deleted (or up
ff10: 64 61 74 65 64 20 2d 20 61 6e 20 75 70 64 61 74  dated - an updat
ff20: 65 0a 2a 2a 20 69 73 20 69 6d 70 6c 65 6d 65 6e  e.** is implemen
ff30: 74 65 64 20 61 73 20 61 20 64 65 6c 65 74 65 20  ted as a delete 
ff40: 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 20 69  followed by an i
ff50: 6e 73 65 72 74 29 2e 20 53 51 4c 69 74 65 20 70  nsert). SQLite p
ff60: 72 6f 76 69 64 65 73 20 74 68 65 0a 2a 2a 20 72  rovides the.** r
ff70: 6f 77 69 64 20 6f 66 20 74 68 65 20 72 6f 77 20  owid of the row 
ff80: 74 6f 20 64 65 6c 65 74 65 2c 20 77 68 69 63 68  to delete, which
ff90: 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
ffa0: 66 69 6e 64 20 74 68 65 20 6c 65 61 66 20 6f 6e  find the leaf on
ffb0: 20 77 68 69 63 68 0a 2a 2a 20 74 68 65 20 65 6e   which.** the en
ffc0: 74 72 79 20 72 65 73 69 64 65 73 20 28 61 72 67  try resides (arg
ffd0: 75 6d 65 6e 74 20 70 4c 65 61 66 29 2e 20 4f 6e  ument pLeaf). On
ffe0: 63 65 20 74 68 65 20 6c 65 61 66 20 69 73 20 6c  ce the leaf is l
fff0: 6f 63 61 74 65 64 2c 20 74 68 69 73 20 0a 2a 2a  ocated, this .**
10000 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
10010 6c 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  led to determine
10020 20 69 74 73 20 61 6e 63 65 73 74 72 79 2e 0a 2a   its ancestry..*
10030 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 78  /.static int fix
10040 4c 65 61 66 50 61 72 65 6e 74 28 52 74 72 65 65  LeafParent(Rtree
10050 20 2a 70 52 74 72 65 65 2c 20 52 74 72 65 65 4e   *pRtree, RtreeN
10060 6f 64 65 20 2a 70 4c 65 61 66 29 7b 0a 20 20 69  ode *pLeaf){.  i
10070 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
10080 4b 3b 0a 20 20 52 74 72 65 65 4e 6f 64 65 20 2a  K;.  RtreeNode *
10090 70 43 68 69 6c 64 20 3d 20 70 4c 65 61 66 3b 0a  pChild = pLeaf;.
100a0 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
100b0 49 54 45 5f 4f 4b 20 26 26 20 70 43 68 69 6c 64  ITE_OK && pChild
100c0 2d 3e 69 4e 6f 64 65 21 3d 31 20 26 26 20 70 43  ->iNode!=1 && pC
100d0 68 69 6c 64 2d 3e 70 50 61 72 65 6e 74 3d 3d 30  hild->pParent==0
100e0 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 20   ){.    int rc2 
100f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
10100 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
10110 5f 72 65 73 65 74 28 29 20 72 65 74 75 72 6e 20  _reset() return 
10120 63 6f 64 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69  code */.    sqli
10130 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
10140 52 74 72 65 65 2d 3e 70 52 65 61 64 50 61 72 65  Rtree->pReadPare
10150 6e 74 2c 20 31 2c 20 70 43 68 69 6c 64 2d 3e 69  nt, 1, pChild->i
10160 4e 6f 64 65 29 3b 0a 20 20 20 20 72 63 20 3d 20  Node);.    rc = 
10170 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 52 74  sqlite3_step(pRt
10180 72 65 65 2d 3e 70 52 65 61 64 50 61 72 65 6e 74  ree->pReadParent
10190 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
101a0 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
101b0 20 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 54     RtreeNode *pT
101c0 65 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  est;           /
101d0 2a 20 55 73 65 64 20 74 6f 20 74 65 73 74 20 66  * Used to test f
101e0 6f 72 20 72 65 66 65 72 65 6e 63 65 20 6c 6f 6f  or reference loo
101f0 70 73 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20  ps */.      i64 
10200 69 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  iNode;          
10210 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 64 65 20          /* Node 
10220 6e 75 6d 62 65 72 20 6f 66 20 70 61 72 65 6e 74  number of parent
10230 20 6e 6f 64 65 20 2a 2f 0a 0a 20 20 20 20 20 20   node */..      
10240 2f 2a 20 42 65 66 6f 72 65 20 73 65 74 74 69 6e  /* Before settin
10250 67 20 70 43 68 69 6c 64 2d 3e 70 50 61 72 65 6e  g pChild->pParen
10260 74 2c 20 74 65 73 74 20 74 68 61 74 20 77 65 20  t, test that we 
10270 61 72 65 20 6e 6f 74 20 63 72 65 61 74 69 6e 67  are not creating
10280 20 61 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70   a.      ** loop
10290 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 28   of references (
102a0 61 73 20 77 65 20 77 6f 75 6c 64 20 69 66 2c 20  as we would if, 
102b0 73 61 79 2c 20 70 43 68 69 6c 64 3d 3d 70 50 61  say, pChild==pPa
102c0 72 65 6e 74 29 2e 20 57 65 20 64 6f 6e 27 74 0a  rent). We don't.
102d0 20 20 20 20 20 20 2a 2a 20 77 61 6e 74 20 74 6f        ** want to
102e0 20 64 6f 20 74 68 69 73 20 61 73 20 69 74 20 6c   do this as it l
102f0 65 61 64 73 20 74 6f 20 61 20 6d 65 6d 6f 72 79  eads to a memory
10300 20 6c 65 61 6b 20 77 68 65 6e 20 74 72 79 69 6e   leak when tryin
10310 67 20 74 6f 20 64 65 6c 65 74 65 0a 20 20 20 20  g to delete.    
10320 20 20 2a 2a 20 74 68 65 20 72 65 66 65 72 65 6e    ** the referen
10330 63 65 64 20 63 6f 75 6e 74 65 64 20 6e 6f 64 65  ced counted node
10340 20 73 74 72 75 63 74 75 72 65 73 2e 0a 20 20 20   structures..   
10350 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 4e 6f 64     */.      iNod
10360 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  e = sqlite3_colu
10370 6d 6e 5f 69 6e 74 36 34 28 70 52 74 72 65 65 2d  mn_int64(pRtree-
10380 3e 70 52 65 61 64 50 61 72 65 6e 74 2c 20 30 29  >pReadParent, 0)
10390 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 54 65 73  ;.      for(pTes
103a0 74 3d 70 4c 65 61 66 3b 20 70 54 65 73 74 20 26  t=pLeaf; pTest &
103b0 26 20 70 54 65 73 74 2d 3e 69 4e 6f 64 65 21 3d  & pTest->iNode!=
103c0 69 4e 6f 64 65 3b 20 70 54 65 73 74 3d 70 54 65  iNode; pTest=pTe
103d0 73 74 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20  st->pParent);.  
103e0 20 20 20 20 69 66 28 20 21 70 54 65 73 74 20 29      if( !pTest )
103f0 7b 0a 20 20 20 20 20 20 20 20 72 63 32 20 3d 20  {.        rc2 = 
10400 6e 6f 64 65 41 63 71 75 69 72 65 28 70 52 74 72  nodeAcquire(pRtr
10410 65 65 2c 20 69 4e 6f 64 65 2c 20 30 2c 20 26 70  ee, iNode, 0, &p
10420 43 68 69 6c 64 2d 3e 70 50 61 72 65 6e 74 29 3b  Child->pParent);
10430 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
10440 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
10450 72 65 73 65 74 28 70 52 74 72 65 65 2d 3e 70 52  reset(pRtree->pR
10460 65 61 64 50 61 72 65 6e 74 29 3b 0a 20 20 20 20  eadParent);.    
10470 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
10480 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20  K ) rc = rc2;.  
10490 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
104a0 5f 4f 4b 20 26 26 20 21 70 43 68 69 6c 64 2d 3e  _OK && !pChild->
104b0 70 50 61 72 65 6e 74 20 29 20 72 63 20 3d 20 53  pParent ) rc = S
104c0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54  QLITE_CORRUPT_VT
104d0 41 42 3b 0a 20 20 20 20 70 43 68 69 6c 64 20 3d  AB;.    pChild =
104e0 20 70 43 68 69 6c 64 2d 3e 70 50 61 72 65 6e 74   pChild->pParent
104f0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
10500 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  c;.}..static int
10510 20 64 65 6c 65 74 65 43 65 6c 6c 28 52 74 72 65   deleteCell(Rtre
10520 65 20 2a 2c 20 52 74 72 65 65 4e 6f 64 65 20 2a  e *, RtreeNode *
10530 2c 20 69 6e 74 2c 20 69 6e 74 29 3b 0a 0a 73 74  , int, int);..st
10540 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76 65 4e  atic int removeN
10550 6f 64 65 28 52 74 72 65 65 20 2a 70 52 74 72 65  ode(Rtree *pRtre
10560 65 2c 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 4e  e, RtreeNode *pN
10570 6f 64 65 2c 20 69 6e 74 20 69 48 65 69 67 68 74  ode, int iHeight
10580 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
10590 6e 74 20 72 63 32 3b 0a 20 20 52 74 72 65 65 4e  nt rc2;.  RtreeN
105a0 6f 64 65 20 2a 70 50 61 72 65 6e 74 20 3d 20 30  ode *pParent = 0
105b0 3b 0a 20 20 69 6e 74 20 69 43 65 6c 6c 3b 0a 0a  ;.  int iCell;..
105c0 20 20 61 73 73 65 72 74 28 20 70 4e 6f 64 65 2d    assert( pNode-
105d0 3e 6e 52 65 66 3d 3d 31 20 29 3b 0a 0a 20 20 2f  >nRef==1 );..  /
105e0 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 65 6e 74  * Remove the ent
105f0 72 79 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74  ry in the parent
10600 20 63 65 6c 6c 2e 20 2a 2f 0a 20 20 72 63 20 3d   cell. */.  rc =
10610 20 6e 6f 64 65 50 61 72 65 6e 74 49 6e 64 65 78   nodeParentIndex
10620 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65 2c 20  (pRtree, pNode, 
10630 26 69 43 65 6c 6c 29 3b 0a 20 20 69 66 28 20 72  &iCell);.  if( r
10640 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
10650 20 20 20 20 70 50 61 72 65 6e 74 20 3d 20 70 4e      pParent = pN
10660 6f 64 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20  ode->pParent;.  
10670 20 20 70 4e 6f 64 65 2d 3e 70 50 61 72 65 6e 74    pNode->pParent
10680 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 64   = 0;.    rc = d
10690 65 6c 65 74 65 43 65 6c 6c 28 70 52 74 72 65 65  eleteCell(pRtree
106a0 2c 20 70 50 61 72 65 6e 74 2c 20 69 43 65 6c 6c  , pParent, iCell
106b0 2c 20 69 48 65 69 67 68 74 2b 31 29 3b 0a 20 20  , iHeight+1);.  
106c0 7d 0a 20 20 72 63 32 20 3d 20 6e 6f 64 65 52 65  }.  rc2 = nodeRe
106d0 6c 65 61 73 65 28 70 52 74 72 65 65 2c 20 70 50  lease(pRtree, pP
106e0 61 72 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63  arent);.  if( rc
106f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
10700 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d     rc = rc2;.  }
10710 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
10720 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
10730 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
10740 20 52 65 6d 6f 76 65 20 74 68 65 20 78 78 78 5f   Remove the xxx_
10750 6e 6f 64 65 20 65 6e 74 72 79 2e 20 2a 2f 0a 20  node entry. */. 
10760 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
10770 74 36 34 28 70 52 74 72 65 65 2d 3e 70 44 65 6c  t64(pRtree->pDel
10780 65 74 65 4e 6f 64 65 2c 20 31 2c 20 70 4e 6f 64  eteNode, 1, pNod
10790 65 2d 3e 69 4e 6f 64 65 29 3b 0a 20 20 73 71 6c  e->iNode);.  sql
107a0 69 74 65 33 5f 73 74 65 70 28 70 52 74 72 65 65  ite3_step(pRtree
107b0 2d 3e 70 44 65 6c 65 74 65 4e 6f 64 65 29 3b 0a  ->pDeleteNode);.
107c0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
107d0 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72  =(rc = sqlite3_r
107e0 65 73 65 74 28 70 52 74 72 65 65 2d 3e 70 44 65  eset(pRtree->pDe
107f0 6c 65 74 65 4e 6f 64 65 29 29 20 29 7b 0a 20 20  leteNode)) ){.  
10800 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
10810 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68  ..  /* Remove th
10820 65 20 78 78 78 5f 70 61 72 65 6e 74 20 65 6e 74  e xxx_parent ent
10830 72 79 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ry. */.  sqlite3
10840 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 52 74 72  _bind_int64(pRtr
10850 65 65 2d 3e 70 44 65 6c 65 74 65 50 61 72 65 6e  ee->pDeleteParen
10860 74 2c 20 31 2c 20 70 4e 6f 64 65 2d 3e 69 4e 6f  t, 1, pNode->iNo
10870 64 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  de);.  sqlite3_s
10880 74 65 70 28 70 52 74 72 65 65 2d 3e 70 44 65 6c  tep(pRtree->pDel
10890 65 74 65 50 61 72 65 6e 74 29 3b 0a 20 20 69 66  eteParent);.  if
108a0 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
108b0 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
108c0 28 70 52 74 72 65 65 2d 3e 70 44 65 6c 65 74 65  (pRtree->pDelete
108d0 50 61 72 65 6e 74 29 29 20 29 7b 0a 20 20 20 20  Parent)) ){.    
108e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
108f0 20 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68   .  /* Remove th
10900 65 20 6e 6f 64 65 20 66 72 6f 6d 20 74 68 65 20  e node from the 
10910 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74  in-memory hash t
10920 61 62 6c 65 20 61 6e 64 20 6c 69 6e 6b 20 69 74  able and link it
10930 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 52   into.  ** the R
10940 74 72 65 65 2e 70 44 65 6c 65 74 65 64 20 6c 69  tree.pDeleted li
10950 73 74 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 73  st. Its contents
10960 20 77 69 6c 6c 20 62 65 20 72 65 2d 69 6e 73 65   will be re-inse
10970 72 74 65 64 20 6c 61 74 65 72 20 6f 6e 2e 0a 20  rted later on.. 
10980 20 2a 2f 0a 20 20 6e 6f 64 65 48 61 73 68 44 65   */.  nodeHashDe
10990 6c 65 74 65 28 70 52 74 72 65 65 2c 20 70 4e 6f  lete(pRtree, pNo
109a0 64 65 29 3b 0a 20 20 70 4e 6f 64 65 2d 3e 69 4e  de);.  pNode->iN
109b0 6f 64 65 20 3d 20 69 48 65 69 67 68 74 3b 0a 20  ode = iHeight;. 
109c0 20 70 4e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d 20   pNode->pNext = 
109d0 70 52 74 72 65 65 2d 3e 70 44 65 6c 65 74 65 64  pRtree->pDeleted
109e0 3b 0a 20 20 70 4e 6f 64 65 2d 3e 6e 52 65 66 2b  ;.  pNode->nRef+
109f0 2b 3b 0a 20 20 70 52 74 72 65 65 2d 3e 70 44 65  +;.  pRtree->pDe
10a00 6c 65 74 65 64 20 3d 20 70 4e 6f 64 65 3b 0a 0a  leted = pNode;..
10a10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10a20 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  OK;.}..static in
10a30 74 20 66 69 78 42 6f 75 6e 64 69 6e 67 42 6f 78  t fixBoundingBox
10a40 28 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c 20  (Rtree *pRtree, 
10a50 52 74 72 65 65 4e 6f 64 65 20 2a 70 4e 6f 64 65  RtreeNode *pNode
10a60 29 7b 0a 20 20 52 74 72 65 65 4e 6f 64 65 20 2a  ){.  RtreeNode *
10a70 70 50 61 72 65 6e 74 20 3d 20 70 4e 6f 64 65 2d  pParent = pNode-
10a80 3e 70 50 61 72 65 6e 74 3b 0a 20 20 69 6e 74 20  >pParent;.  int 
10a90 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
10aa0 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74 20 29  .  if( pParent )
10ab0 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 0a 20  {.    int ii; . 
10ac0 20 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 4e     int nCell = N
10ad0 43 45 4c 4c 28 70 4e 6f 64 65 29 3b 0a 20 20 20  CELL(pNode);.   
10ae0 20 52 74 72 65 65 43 65 6c 6c 20 62 6f 78 3b 20   RtreeCell box; 
10af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6f             /* Bo
10b10 75 6e 64 69 6e 67 20 62 6f 78 20 66 6f 72 20 70  unding box for p
10b20 4e 6f 64 65 20 2a 2f 0a 20 20 20 20 6e 6f 64 65  Node */.    node
10b30 47 65 74 43 65 6c 6c 28 70 52 74 72 65 65 2c 20  GetCell(pRtree, 
10b40 70 4e 6f 64 65 2c 20 30 2c 20 26 62 6f 78 29 3b  pNode, 0, &box);
10b50 0a 20 20 20 20 66 6f 72 28 69 69 3d 31 3b 20 69  .    for(ii=1; i
10b60 69 3c 6e 43 65 6c 6c 3b 20 69 69 2b 2b 29 7b 0a  i<nCell; ii++){.
10b70 20 20 20 20 20 20 52 74 72 65 65 43 65 6c 6c 20        RtreeCell 
10b80 63 65 6c 6c 3b 0a 20 20 20 20 20 20 6e 6f 64 65  cell;.      node
10b90 47 65 74 43 65 6c 6c 28 70 52 74 72 65 65 2c 20  GetCell(pRtree, 
10ba0 70 4e 6f 64 65 2c 20 69 69 2c 20 26 63 65 6c 6c  pNode, ii, &cell
10bb0 29 3b 0a 20 20 20 20 20 20 63 65 6c 6c 55 6e 69  );.      cellUni
10bc0 6f 6e 28 70 52 74 72 65 65 2c 20 26 62 6f 78 2c  on(pRtree, &box,
10bd0 20 26 63 65 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20   &cell);.    }. 
10be0 20 20 20 62 6f 78 2e 69 52 6f 77 69 64 20 3d 20     box.iRowid = 
10bf0 70 4e 6f 64 65 2d 3e 69 4e 6f 64 65 3b 0a 20 20  pNode->iNode;.  
10c00 20 20 72 63 20 3d 20 6e 6f 64 65 50 61 72 65 6e    rc = nodeParen
10c10 74 49 6e 64 65 78 28 70 52 74 72 65 65 2c 20 70  tIndex(pRtree, p
10c20 4e 6f 64 65 2c 20 26 69 69 29 3b 0a 20 20 20 20  Node, &ii);.    
10c30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
10c40 4b 20 29 7b 0a 20 20 20 20 20 20 6e 6f 64 65 4f  K ){.      nodeO
10c50 76 65 72 77 72 69 74 65 43 65 6c 6c 28 70 52 74  verwriteCell(pRt
10c60 72 65 65 2c 20 70 50 61 72 65 6e 74 2c 20 26 62  ree, pParent, &b
10c70 6f 78 2c 20 69 69 29 3b 0a 20 20 20 20 20 20 72  ox, ii);.      r
10c80 63 20 3d 20 66 69 78 42 6f 75 6e 64 69 6e 67 42  c = fixBoundingB
10c90 6f 78 28 70 52 74 72 65 65 2c 20 70 50 61 72 65  ox(pRtree, pPare
10ca0 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  nt);.    }.  }. 
10cb0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
10cc0 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20  *.** Delete the 
10cd0 63 65 6c 6c 20 61 74 20 69 6e 64 65 78 20 69 43  cell at index iC
10ce0 65 6c 6c 20 6f 66 20 6e 6f 64 65 20 70 4e 6f 64  ell of node pNod
10cf0 65 2e 20 41 66 74 65 72 20 72 65 6d 6f 76 69 6e  e. After removin
10d00 67 20 74 68 65 0a 2a 2a 20 63 65 6c 6c 2c 20 61  g the.** cell, a
10d10 64 6a 75 73 74 20 74 68 65 20 72 2d 74 72 65 65  djust the r-tree
10d20 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20   data structure 
10d30 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a  if required..*/.
10d40 73 74 61 74 69 63 20 69 6e 74 20 64 65 6c 65 74  static int delet
10d50 65 43 65 6c 6c 28 52 74 72 65 65 20 2a 70 52 74  eCell(Rtree *pRt
10d60 72 65 65 2c 20 52 74 72 65 65 4e 6f 64 65 20 2a  ree, RtreeNode *
10d70 70 4e 6f 64 65 2c 20 69 6e 74 20 69 43 65 6c 6c  pNode, int iCell
10d80 2c 20 69 6e 74 20 69 48 65 69 67 68 74 29 7b 0a  , int iHeight){.
10d90 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 50 61    RtreeNode *pPa
10da0 72 65 6e 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  rent;.  int rc;.
10db0 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
10dc0 21 3d 28 72 63 20 3d 20 66 69 78 4c 65 61 66 50  !=(rc = fixLeafP
10dd0 61 72 65 6e 74 28 70 52 74 72 65 65 2c 20 70 4e  arent(pRtree, pN
10de0 6f 64 65 29 29 20 29 7b 0a 20 20 20 20 72 65 74  ode)) ){.    ret
10df0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
10e00 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 63 65 6c  * Remove the cel
10e10 6c 20 66 72 6f 6d 20 74 68 65 20 6e 6f 64 65 2e  l from the node.
10e20 20 54 68 69 73 20 63 61 6c 6c 20 6a 75 73 74 20   This call just 
10e30 6d 6f 76 65 73 20 62 79 74 65 73 20 61 72 6f 75  moves bytes arou
10e40 6e 64 0a 20 20 2a 2a 20 74 68 65 20 69 6e 2d 6d  nd.  ** the in-m
10e50 65 6d 6f 72 79 20 6e 6f 64 65 20 69 6d 61 67 65  emory node image
10e60 2c 20 73 6f 20 69 74 20 63 61 6e 6e 6f 74 20 66  , so it cannot f
10e70 61 69 6c 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 64 65  ail..  */.  node
10e80 44 65 6c 65 74 65 43 65 6c 6c 28 70 52 74 72 65  DeleteCell(pRtre
10e90 65 2c 20 70 4e 6f 64 65 2c 20 69 43 65 6c 6c 29  e, pNode, iCell)
10ea0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e  ;..  /* If the n
10eb0 6f 64 65 20 69 73 20 6e 6f 74 20 74 68 65 20 74  ode is not the t
10ec0 72 65 65 20 72 6f 6f 74 20 61 6e 64 20 6e 6f 77  ree root and now
10ed0 20 68 61 73 20 6c 65 73 73 20 74 68 61 6e 20 74   has less than t
10ee0 68 65 20 6d 69 6e 69 6d 75 6d 0a 20 20 2a 2a 20  he minimum.  ** 
10ef0 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 2c  number of cells,
10f00 20 72 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20   remove it from 
10f10 74 68 65 20 74 72 65 65 2e 20 4f 74 68 65 72 77  the tree. Otherw
10f20 69 73 65 2c 20 75 70 64 61 74 65 20 74 68 65 0a  ise, update the.
10f30 20 20 2a 2a 20 63 65 6c 6c 20 69 6e 20 74 68 65    ** cell in the
10f40 20 70 61 72 65 6e 74 20 6e 6f 64 65 20 73 6f 20   parent node so 
10f50 74 68 61 74 20 69 74 20 74 69 67 68 74 6c 79 20  that it tightly 
10f60 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 75 70 64  contains the upd
10f70 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 64 65 2e 0a  ated.  ** node..
10f80 20 20 2a 2f 0a 20 20 70 50 61 72 65 6e 74 20 3d    */.  pParent =
10f90 20 70 4e 6f 64 65 2d 3e 70 50 61 72 65 6e 74 3b   pNode->pParent;
10fa0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65  .  assert( pPare
10fb0 6e 74 20 7c 7c 20 70 4e 6f 64 65 2d 3e 69 4e 6f  nt || pNode->iNo
10fc0 64 65 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 70  de==1 );.  if( p
10fd0 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 69 66  Parent ){.    if
10fe0 28 20 4e 43 45 4c 4c 28 70 4e 6f 64 65 29 3c 52  ( NCELL(pNode)<R
10ff0 54 52 45 45 5f 4d 49 4e 43 45 4c 4c 53 28 70 52  TREE_MINCELLS(pR
11000 74 72 65 65 29 20 29 7b 0a 20 20 20 20 20 20 72  tree) ){.      r
11010 63 20 3d 20 72 65 6d 6f 76 65 4e 6f 64 65 28 70  c = removeNode(p
11020 52 74 72 65 65 2c 20 70 4e 6f 64 65 2c 20 69 48  Rtree, pNode, iH
11030 65 69 67 68 74 29 3b 0a 20 20 20 20 7d 65 6c 73  eight);.    }els
11040 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 69  e{.      rc = fi
11050 78 42 6f 75 6e 64 69 6e 67 42 6f 78 28 70 52 74  xBoundingBox(pRt
11060 72 65 65 2c 20 70 4e 6f 64 65 29 3b 0a 20 20 20  ree, pNode);.   
11070 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
11080 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69   rc;.}..static i
11090 6e 74 20 52 65 69 6e 73 65 72 74 28 0a 20 20 52  nt Reinsert(.  R
110a0 74 72 65 65 20 2a 70 52 74 72 65 65 2c 20 0a 20  tree *pRtree, . 
110b0 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 4e 6f 64   RtreeNode *pNod
110c0 65 2c 20 0a 20 20 52 74 72 65 65 43 65 6c 6c 20  e, .  RtreeCell 
110d0 2a 70 43 65 6c 6c 2c 20 0a 20 20 69 6e 74 20 69  *pCell, .  int i
110e0 48 65 69 67 68 74 0a 29 7b 0a 20 20 69 6e 74 20  Height.){.  int 
110f0 2a 61 4f 72 64 65 72 3b 0a 20 20 69 6e 74 20 2a  *aOrder;.  int *
11100 61 53 70 61 72 65 3b 0a 20 20 52 74 72 65 65 43  aSpare;.  RtreeC
11110 65 6c 6c 20 2a 61 43 65 6c 6c 3b 0a 20 20 52 74  ell *aCell;.  Rt
11120 72 65 65 44 56 61 6c 75 65 20 2a 61 44 69 73 74  reeDValue *aDist
11130 61 6e 63 65 3b 0a 20 20 69 6e 74 20 6e 43 65 6c  ance;.  int nCel
11140 6c 3b 0a 20 20 52 74 72 65 65 44 56 61 6c 75 65  l;.  RtreeDValue
11150 20 61 43 65 6e 74 65 72 43 6f 6f 72 64 5b 52 54   aCenterCoord[RT
11160 52 45 45 5f 4d 41 58 5f 44 49 4d 45 4e 53 49 4f  REE_MAX_DIMENSIO
11170 4e 53 5d 3b 0a 20 20 69 6e 74 20 69 44 69 6d 3b  NS];.  int iDim;
11180 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74  .  int ii;.  int
11190 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
111a0 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 6d 65 6d  .  int n;..  mem
111b0 73 65 74 28 61 43 65 6e 74 65 72 43 6f 6f 72 64  set(aCenterCoord
111c0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 52 74 72 65  , 0, sizeof(Rtre
111d0 65 44 56 61 6c 75 65 29 2a 52 54 52 45 45 5f 4d  eDValue)*RTREE_M
111e0 41 58 5f 44 49 4d 45 4e 53 49 4f 4e 53 29 3b 0a  AX_DIMENSIONS);.
111f0 0a 20 20 6e 43 65 6c 6c 20 3d 20 4e 43 45 4c 4c  .  nCell = NCELL
11200 28 70 4e 6f 64 65 29 2b 31 3b 0a 20 20 6e 20 3d  (pNode)+1;.  n =
11210 20 28 6e 43 65 6c 6c 2b 31 29 26 28 7e 31 29 3b   (nCell+1)&(~1);
11220 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
11230 74 68 65 20 62 75 66 66 65 72 73 20 75 73 65 64  the buffers used
11240 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74 69   by this operati
11250 6f 6e 2e 20 54 68 65 20 61 6c 6c 6f 63 61 74 69  on. The allocati
11260 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65 6c 69 6e  on is.  ** relin
11270 71 75 69 73 68 65 64 20 62 65 66 6f 72 65 20 74  quished before t
11280 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
11290 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61 43 65  urns..  */.  aCe
112a0 6c 6c 20 3d 20 28 52 74 72 65 65 43 65 6c 6c 20  ll = (RtreeCell 
112b0 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
112c0 28 6e 20 2a 20 28 0a 20 20 20 20 73 69 7a 65 6f  (n * (.    sizeo
112d0 66 28 52 74 72 65 65 43 65 6c 6c 29 20 20 20 20  f(RtreeCell)    
112e0 20 2b 20 20 20 20 20 20 20 20 20 2f 2a 20 61 43   +         /* aC
112f0 65 6c 6c 20 61 72 72 61 79 20 2a 2f 0a 20 20 20  ell array */.   
11300 20 73 69 7a 65 6f 66 28 69 6e 74 29 20 20 20 20   sizeof(int)    
11310 20 20 20 20 20 20 20 2b 20 20 20 20 20 20 20 20         +        
11320 20 2f 2a 20 61 4f 72 64 65 72 20 61 72 72 61 79   /* aOrder array
11330 20 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28 69   */.    sizeof(i
11340 6e 74 29 20 20 20 20 20 20 20 20 20 20 20 2b 20  nt)           + 
11350 20 20 20 20 20 20 20 20 2f 2a 20 61 53 70 61 72          /* aSpar
11360 65 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 73  e array */.    s
11370 69 7a 65 6f 66 28 52 74 72 65 65 44 56 61 6c 75  izeof(RtreeDValu
11380 65 29 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e)             /
11390 2a 20 61 44 69 73 74 61 6e 63 65 20 61 72 72 61  * aDistance arra
113a0 79 20 2a 2f 0a 20 20 29 29 3b 0a 20 20 69 66 28  y */.  ));.  if(
113b0 20 21 61 43 65 6c 6c 20 29 7b 0a 20 20 20 20 72   !aCell ){.    r
113c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
113d0 45 4d 3b 0a 20 20 7d 0a 20 20 61 4f 72 64 65 72  EM;.  }.  aOrder
113e0 20 20 20 20 3d 20 28 69 6e 74 20 2a 29 26 61 43      = (int *)&aC
113f0 65 6c 6c 5b 6e 5d 3b 0a 20 20 61 53 70 61 72 65  ell[n];.  aSpare
11400 20 20 20 20 3d 20 28 69 6e 74 20 2a 29 26 61 4f      = (int *)&aO
11410 72 64 65 72 5b 6e 5d 3b 0a 20 20 61 44 69 73 74  rder[n];.  aDist
11420 61 6e 63 65 20 3d 20 28 52 74 72 65 65 44 56 61  ance = (RtreeDVa
11430 6c 75 65 20 2a 29 26 61 53 70 61 72 65 5b 6e 5d  lue *)&aSpare[n]
11440 3b 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  ;..  for(ii=0; i
11450 69 3c 6e 43 65 6c 6c 3b 20 69 69 2b 2b 29 7b 0a  i<nCell; ii++){.
11460 20 20 20 20 69 66 28 20 69 69 3d 3d 28 6e 43 65      if( ii==(nCe
11470 6c 6c 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 6d  ll-1) ){.      m
11480 65 6d 63 70 79 28 26 61 43 65 6c 6c 5b 69 69 5d  emcpy(&aCell[ii]
11490 2c 20 70 43 65 6c 6c 2c 20 73 69 7a 65 6f 66 28  , pCell, sizeof(
114a0 52 74 72 65 65 43 65 6c 6c 29 29 3b 0a 20 20 20  RtreeCell));.   
114b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 6f   }else{.      no
114c0 64 65 47 65 74 43 65 6c 6c 28 70 52 74 72 65 65  deGetCell(pRtree
114d0 2c 20 70 4e 6f 64 65 2c 20 69 69 2c 20 26 61 43  , pNode, ii, &aC
114e0 65 6c 6c 5b 69 69 5d 29 3b 0a 20 20 20 20 7d 0a  ell[ii]);.    }.
114f0 20 20 20 20 61 4f 72 64 65 72 5b 69 69 5d 20 3d      aOrder[ii] =
11500 20 69 69 3b 0a 20 20 20 20 66 6f 72 28 69 44 69   ii;.    for(iDi
11510 6d 3d 30 3b 20 69 44 69 6d 3c 70 52 74 72 65 65  m=0; iDim<pRtree
11520 2d 3e 6e 44 69 6d 3b 20 69 44 69 6d 2b 2b 29 7b  ->nDim; iDim++){
11530 0a 20 20 20 20 20 20 61 43 65 6e 74 65 72 43 6f  .      aCenterCo
11540 6f 72 64 5b 69 44 69 6d 5d 20 2b 3d 20 44 43 4f  ord[iDim] += DCO
11550 4f 52 44 28 61 43 65 6c 6c 5b 69 69 5d 2e 61 43  ORD(aCell[ii].aC
11560 6f 6f 72 64 5b 69 44 69 6d 2a 32 5d 29 3b 0a 20  oord[iDim*2]);. 
11570 20 20 20 20 20 61 43 65 6e 74 65 72 43 6f 6f 72       aCenterCoor
11580 64 5b 69 44 69 6d 5d 20 2b 3d 20 44 43 4f 4f 52  d[iDim] += DCOOR
11590 44 28 61 43 65 6c 6c 5b 69 69 5d 2e 61 43 6f 6f  D(aCell[ii].aCoo
115a0 72 64 5b 69 44 69 6d 2a 32 2b 31 5d 29 3b 0a 20  rd[iDim*2+1]);. 
115b0 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69     }.  }.  for(i
115c0 44 69 6d 3d 30 3b 20 69 44 69 6d 3c 70 52 74 72  Dim=0; iDim<pRtr
115d0 65 65 2d 3e 6e 44 69 6d 3b 20 69 44 69 6d 2b 2b  ee->nDim; iDim++
115e0 29 7b 0a 20 20 20 20 61 43 65 6e 74 65 72 43 6f  ){.    aCenterCo
115f0 6f 72 64 5b 69 44 69 6d 5d 20 3d 20 28 61 43 65  ord[iDim] = (aCe
11600 6e 74 65 72 43 6f 6f 72 64 5b 69 44 69 6d 5d 2f  nterCoord[iDim]/
11610 28 6e 43 65 6c 6c 2a 28 52 74 72 65 65 44 56 61  (nCell*(RtreeDVa
11620 6c 75 65 29 32 29 29 3b 0a 20 20 7d 0a 0a 20 20  lue)2));.  }..  
11630 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 43 65  for(ii=0; ii<nCe
11640 6c 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 61  ll; ii++){.    a
11650 44 69 73 74 61 6e 63 65 5b 69 69 5d 20 3d 20 30  Distance[ii] = 0
11660 2e 30 3b 0a 20 20 20 20 66 6f 72 28 69 44 69 6d  .0;.    for(iDim
11670 3d 30 3b 20 69 44 69 6d 3c 70 52 74 72 65 65 2d  =0; iDim<pRtree-
11680 3e 6e 44 69 6d 3b 20 69 44 69 6d 2b 2b 29 7b 0a  >nDim; iDim++){.
11690 20 20 20 20 20 20 52 74 72 65 65 44 56 61 6c 75        RtreeDValu
116a0 65 20 63 6f 6f 72 64 20 3d 20 28 44 43 4f 4f 52  e coord = (DCOOR
116b0 44 28 61 43 65 6c 6c 5b 69 69 5d 2e 61 43 6f 6f  D(aCell[ii].aCoo
116c0 72 64 5b 69 44 69 6d 2a 32 2b 31 5d 29 20 2d 20  rd[iDim*2+1]) - 
116d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
116e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
116f0 44 43 4f 4f 52 44 28 61 43 65 6c 6c 5b 69 69 5d  DCOORD(aCell[ii]
11700 2e 61 43 6f 6f 72 64 5b 69 44 69 6d 2a 32 5d 29  .aCoord[iDim*2])
11710 29 3b 0a 20 20 20 20 20 20 61 44 69 73 74 61 6e  );.      aDistan
11720 63 65 5b 69 69 5d 20 2b 3d 20 28 63 6f 6f 72 64  ce[ii] += (coord
11730 2d 61 43 65 6e 74 65 72 43 6f 6f 72 64 5b 69 44  -aCenterCoord[iD
11740 69 6d 5d 29 2a 28 63 6f 6f 72 64 2d 61 43 65 6e  im])*(coord-aCen
11750 74 65 72 43 6f 6f 72 64 5b 69 44 69 6d 5d 29 3b  terCoord[iDim]);
11760 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 53 6f  .    }.  }..  So
11770 72 74 42 79 44 69 73 74 61 6e 63 65 28 61 4f 72  rtByDistance(aOr
11780 64 65 72 2c 20 6e 43 65 6c 6c 2c 20 61 44 69 73  der, nCell, aDis
11790 74 61 6e 63 65 2c 20 61 53 70 61 72 65 29 3b 0a  tance, aSpare);.
117a0 20 20 6e 6f 64 65 5a 65 72 6f 28 70 52 74 72 65    nodeZero(pRtre
117b0 65 2c 20 70 4e 6f 64 65 29 3b 0a 0a 20 20 66 6f  e, pNode);..  fo
117c0 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  r(ii=0; rc==SQLI
117d0 54 45 5f 4f 4b 20 26 26 20 69 69 3c 28 6e 43 65  TE_OK && ii<(nCe
117e0 6c 6c 2d 28 52 54 52 45 45 5f 4d 49 4e 43 45 4c  ll-(RTREE_MINCEL
117f0 4c 53 28 70 52 74 72 65 65 29 2b 31 29 29 3b 20  LS(pRtree)+1)); 
11800 69 69 2b 2b 29 7b 0a 20 20 20 20 52 74 72 65 65  ii++){.    Rtree
11810 43 65 6c 6c 20 2a 70 20 3d 20 26 61 43 65 6c 6c  Cell *p = &aCell
11820 5b 61 4f 72 64 65 72 5b 69 69 5d 5d 3b 0a 20 20  [aOrder[ii]];.  
11830 20 20 6e 6f 64 65 49 6e 73 65 72 74 43 65 6c 6c    nodeInsertCell
11840 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65 2c 20  (pRtree, pNode, 
11850 70 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  p);.    if( p->i
11860 52 6f 77 69 64 3d 3d 70 43 65 6c 6c 2d 3e 69 52  Rowid==pCell->iR
11870 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 69 66  owid ){.      if
11880 28 20 69 48 65 69 67 68 74 3d 3d 30 20 29 7b 0a  ( iHeight==0 ){.
11890 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 6f 77          rc = row
118a0 69 64 57 72 69 74 65 28 70 52 74 72 65 65 2c 20  idWrite(pRtree, 
118b0 70 2d 3e 69 52 6f 77 69 64 2c 20 70 4e 6f 64 65  p->iRowid, pNode
118c0 2d 3e 69 4e 6f 64 65 29 3b 0a 20 20 20 20 20 20  ->iNode);.      
118d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
118e0 63 20 3d 20 70 61 72 65 6e 74 57 72 69 74 65 28  c = parentWrite(
118f0 70 52 74 72 65 65 2c 20 70 2d 3e 69 52 6f 77 69  pRtree, p->iRowi
11900 64 2c 20 70 4e 6f 64 65 2d 3e 69 4e 6f 64 65 29  d, pNode->iNode)
11910 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11920 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
11930 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
11940 63 20 3d 20 66 69 78 42 6f 75 6e 64 69 6e 67 42  c = fixBoundingB
11950 6f 78 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65  ox(pRtree, pNode
11960 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 3b 20 72  );.  }.  for(; r
11970 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
11980 69 69 3c 6e 43 65 6c 6c 3b 20 69 69 2b 2b 29 7b  ii<nCell; ii++){
11990 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 61 20 6e  .    /* Find a n
119a0 6f 64 65 20 74 6f 20 73 74 6f 72 65 20 74 68 69  ode to store thi
119b0 73 20 63 65 6c 6c 20 69 6e 2e 20 70 4e 6f 64 65  s cell in. pNode
119c0 2d 3e 69 4e 6f 64 65 20 63 75 72 72 65 6e 74 6c  ->iNode currentl
119d0 79 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 2a  y contains.    *
119e0 2a 20 74 68 65 20 68 65 69 67 68 74 20 6f 66 20  * the height of 
119f0 74 68 65 20 73 75 62 2d 74 72 65 65 20 68 65 61  the sub-tree hea
11a00 64 65 64 20 62 79 20 74 68 65 20 63 65 6c 6c 2e  ded by the cell.
11a10 0a 20 20 20 20 2a 2f 0a 20 20 20 20 52 74 72 65  .    */.    Rtre
11a20 65 4e 6f 64 65 20 2a 70 49 6e 73 65 72 74 3b 0a  eNode *pInsert;.
11a30 20 20 20 20 52 74 72 65 65 43 65 6c 6c 20 2a 70      RtreeCell *p
11a40 20 3d 20 26 61 43 65 6c 6c 5b 61 4f 72 64 65 72   = &aCell[aOrder
11a50 5b 69 69 5d 5d 3b 0a 20 20 20 20 72 63 20 3d 20  [ii]];.    rc = 
11a60 43 68 6f 6f 73 65 4c 65 61 66 28 70 52 74 72 65  ChooseLeaf(pRtre
11a70 65 2c 20 70 2c 20 69 48 65 69 67 68 74 2c 20 26  e, p, iHeight, &
11a80 70 49 6e 73 65 72 74 29 3b 0a 20 20 20 20 69 66  pInsert);.    if
11a90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
11aa0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32  ){.      int rc2
11ab0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 74 72  ;.      rc = rtr
11ac0 65 65 49 6e 73 65 72 74 43 65 6c 6c 28 70 52 74  eeInsertCell(pRt
11ad0 72 65 65 2c 20 70 49 6e 73 65 72 74 2c 20 70 2c  ree, pInsert, p,
11ae0 20 69 48 65 69 67 68 74 29 3b 0a 20 20 20 20 20   iHeight);.     
11af0 20 72 63 32 20 3d 20 6e 6f 64 65 52 65 6c 65 61   rc2 = nodeRelea
11b00 73 65 28 70 52 74 72 65 65 2c 20 70 49 6e 73 65  se(pRtree, pInse
11b10 72 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  rt);.      if( r
11b20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
11b30 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 63 32          rc = rc2
11b40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11b50 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66    }..  sqlite3_f
11b60 72 65 65 28 61 43 65 6c 6c 29 3b 0a 20 20 72 65  ree(aCell);.  re
11b70 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
11b80 2a 20 49 6e 73 65 72 74 20 63 65 6c 6c 20 70 43  * Insert cell pC
11b90 65 6c 6c 20 69 6e 74 6f 20 6e 6f 64 65 20 70 4e  ell into node pN
11ba0 6f 64 65 2e 20 4e 6f 64 65 20 70 4e 6f 64 65 20  ode. Node pNode 
11bb0 69 73 20 74 68 65 20 68 65 61 64 20 6f 66 20 61  is the head of a
11bc0 20 0a 2a 2a 20 73 75 62 74 72 65 65 20 69 48 65   .** subtree iHe
11bd0 69 67 68 74 20 68 69 67 68 20 28 6c 65 61 66 20  ight high (leaf 
11be0 6e 6f 64 65 73 20 68 61 76 65 20 69 48 65 69 67  nodes have iHeig
11bf0 68 74 3d 3d 30 29 2e 0a 2a 2f 0a 73 74 61 74 69  ht==0)..*/.stati
11c00 63 20 69 6e 74 20 72 74 72 65 65 49 6e 73 65 72  c int rtreeInser
11c10 74 43 65 6c 6c 28 0a 20 20 52 74 72 65 65 20 2a  tCell(.  Rtree *
11c20 70 52 74 72 65 65 2c 0a 20 20 52 74 72 65 65 4e  pRtree,.  RtreeN
11c30 6f 64 65 20 2a 70 4e 6f 64 65 2c 0a 20 20 52 74  ode *pNode,.  Rt
11c40 72 65 65 43 65 6c 6c 20 2a 70 43 65 6c 6c 2c 0a  reeCell *pCell,.
11c50 20 20 69 6e 74 20 69 48 65 69 67 68 74 0a 29 7b    int iHeight.){
11c60 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
11c70 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 48 65  TE_OK;.  if( iHe
11c80 69 67 68 74 3e 30 20 29 7b 0a 20 20 20 20 52 74  ight>0 ){.    Rt
11c90 72 65 65 4e 6f 64 65 20 2a 70 43 68 69 6c 64 20  reeNode *pChild 
11ca0 3d 20 6e 6f 64 65 48 61 73 68 4c 6f 6f 6b 75 70  = nodeHashLookup
11cb0 28 70 52 74 72 65 65 2c 20 70 43 65 6c 6c 2d 3e  (pRtree, pCell->
11cc0 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 69 66 28  iRowid);.    if(
11cd0 20 70 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20   pChild ){.     
11ce0 20 6e 6f 64 65 52 65 6c 65 61 73 65 28 70 52 74   nodeRelease(pRt
11cf0 72 65 65 2c 20 70 43 68 69 6c 64 2d 3e 70 50 61  ree, pChild->pPa
11d00 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 6e 6f 64  rent);.      nod
11d10 65 52 65 66 65 72 65 6e 63 65 28 70 4e 6f 64 65  eReference(pNode
11d20 29 3b 0a 20 20 20 20 20 20 70 43 68 69 6c 64 2d  );.      pChild-
11d30 3e 70 50 61 72 65 6e 74 20 3d 20 70 4e 6f 64 65  >pParent = pNode
11d40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
11d50 28 20 6e 6f 64 65 49 6e 73 65 72 74 43 65 6c 6c  ( nodeInsertCell
11d60 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65 2c 20  (pRtree, pNode, 
11d70 70 43 65 6c 6c 29 20 29 7b 0a 23 69 66 20 56 41  pCell) ){.#if VA
11d80 52 49 41 4e 54 5f 52 53 54 41 52 54 52 45 45 5f  RIANT_RSTARTREE_
11d90 52 45 49 4e 53 45 52 54 0a 20 20 20 20 69 66 28  REINSERT.    if(
11da0 20 69 48 65 69 67 68 74 3c 3d 70 52 74 72 65 65   iHeight<=pRtree
11db0 2d 3e 69 52 65 69 6e 73 65 72 74 48 65 69 67 68  ->iReinsertHeigh
11dc0 74 20 7c 7c 20 70 4e 6f 64 65 2d 3e 69 4e 6f 64  t || pNode->iNod
11dd0 65 3d 3d 31 29 7b 0a 20 20 20 20 20 20 72 63 20  e==1){.      rc 
11de0 3d 20 53 70 6c 69 74 4e 6f 64 65 28 70 52 74 72  = SplitNode(pRtr
11df0 65 65 2c 20 70 4e 6f 64 65 2c 20 70 43 65 6c 6c  ee, pNode, pCell
11e00 2c 20 69 48 65 69 67 68 74 29 3b 0a 20 20 20 20  , iHeight);.    
11e10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 52 74  }else{.      pRt
11e20 72 65 65 2d 3e 69 52 65 69 6e 73 65 72 74 48 65  ree->iReinsertHe
11e30 69 67 68 74 20 3d 20 69 48 65 69 67 68 74 3b 0a  ight = iHeight;.
11e40 20 20 20 20 20 20 72 63 20 3d 20 52 65 69 6e 73        rc = Reins
11e50 65 72 74 28 70 52 74 72 65 65 2c 20 70 4e 6f 64  ert(pRtree, pNod
11e60 65 2c 20 70 43 65 6c 6c 2c 20 69 48 65 69 67 68  e, pCell, iHeigh
11e70 74 29 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a  t);.    }.#else.
11e80 20 20 20 20 72 63 20 3d 20 53 70 6c 69 74 4e 6f      rc = SplitNo
11e90 64 65 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65  de(pRtree, pNode
11ea0 2c 20 70 43 65 6c 6c 2c 20 69 48 65 69 67 68 74  , pCell, iHeight
11eb0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73  );.#endif.  }els
11ec0 65 7b 0a 20 20 20 20 72 63 20 3d 20 41 64 6a 75  e{.    rc = Adju
11ed0 73 74 54 72 65 65 28 70 52 74 72 65 65 2c 20 70  stTree(pRtree, p
11ee0 4e 6f 64 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20  Node, pCell);.  
11ef0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
11f00 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
11f10 20 69 48 65 69 67 68 74 3d 3d 30 20 29 7b 0a 20   iHeight==0 ){. 
11f20 20 20 20 20 20 20 20 72 63 20 3d 20 72 6f 77 69         rc = rowi
11f30 64 57 72 69 74 65 28 70 52 74 72 65 65 2c 20 70  dWrite(pRtree, p
11f40 43 65 6c 6c 2d 3e 69 52 6f 77 69 64 2c 20 70 4e  Cell->iRowid, pN
11f50 6f 64 65 2d 3e 69 4e 6f 64 65 29 3b 0a 20 20 20  ode->iNode);.   
11f60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11f70 20 20 72 63 20 3d 20 70 61 72 65 6e 74 57 72 69    rc = parentWri
11f80 74 65 28 70 52 74 72 65 65 2c 20 70 43 65 6c 6c  te(pRtree, pCell
11f90 2d 3e 69 52 6f 77 69 64 2c 20 70 4e 6f 64 65 2d  ->iRowid, pNode-
11fa0 3e 69 4e 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d  >iNode);.      }
11fb0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
11fc0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69  urn rc;.}..stati
11fd0 63 20 69 6e 74 20 72 65 69 6e 73 65 72 74 4e 6f  c int reinsertNo
11fe0 64 65 43 6f 6e 74 65 6e 74 28 52 74 72 65 65 20  deContent(Rtree 
11ff0 2a 70 52 74 72 65 65 2c 20 52 74 72 65 65 4e 6f  *pRtree, RtreeNo
12000 64 65 20 2a 70 4e 6f 64 65 29 7b 0a 20 20 69 6e  de *pNode){.  in
12010 74 20 69 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d  t ii;.  int rc =
12020 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
12030 74 20 6e 43 65 6c 6c 20 3d 20 4e 43 45 4c 4c 28  t nCell = NCELL(
12040 70 4e 6f 64 65 29 3b 0a 0a 20 20 66 6f 72 28 69  pNode);..  for(i
12050 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
12060 4f 4b 20 26 26 20 69 69 3c 6e 43 65 6c 6c 3b 20  OK && ii<nCell; 
12070 69 69 2b 2b 29 7b 0a 20 20 20 20 52 74 72 65 65  ii++){.    Rtree
12080 4e 6f 64 65 20 2a 70 49 6e 73 65 72 74 3b 0a 20  Node *pInsert;. 
12090 20 20 20 52 74 72 65 65 43 65 6c 6c 20 63 65 6c     RtreeCell cel
120a0 6c 3b 0a 20 20 20 20 6e 6f 64 65 47 65 74 43 65  l;.    nodeGetCe
120b0 6c 6c 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65  ll(pRtree, pNode
120c0 2c 20 69 69 2c 20 26 63 65 6c 6c 29 3b 0a 0a 20  , ii, &cell);.. 
120d0 20 20 20 2f 2a 20 46 69 6e 64 20 61 20 6e 6f 64     /* Find a nod
120e0 65 20 74 6f 20 73 74 6f 72 65 20 74 68 69 73 20  e to store this 
120f0 63 65 6c 6c 20 69 6e 2e 20 70 4e 6f 64 65 2d 3e  cell in. pNode->
12100 69 4e 6f 64 65 20 63 75 72 72 65 6e 74 6c 79 20  iNode currently 
12110 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 2a 2a 20  contains.    ** 
12120 74 68 65 20 68 65 69 67 68 74 20 6f 66 20 74 68  the height of th
12130 65 20 73 75 62 2d 74 72 65 65 20 68 65 61 64 65  e sub-tree heade
12140 64 20 62 79 20 74 68 65 20 63 65 6c 6c 2e 0a 20  d by the cell.. 
12150 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 43     */.    rc = C
12160 68 6f 6f 73 65 4c 65 61 66 28 70 52 74 72 65 65  hooseLeaf(pRtree
12170 2c 20 26 63 65 6c 6c 2c 20 28 69 6e 74 29 70 4e  , &cell, (int)pN
12180 6f 64 65 2d 3e 69 4e 6f 64 65 2c 20 26 70 49 6e  ode->iNode, &pIn
12190 73 65 72 74 29 3b 0a 20 20 20 20 69 66 28 20 72  sert);.    if( r
121a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
121b0 20 20 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20        int rc2;. 
121c0 20 20 20 20 20 72 63 20 3d 20 72 74 72 65 65 49       rc = rtreeI
121d0 6e 73 65 72 74 43 65 6c 6c 28 70 52 74 72 65 65  nsertCell(pRtree
121e0 2c 20 70 49 6e 73 65 72 74 2c 20 26 63 65 6c 6c  , pInsert, &cell
121f0 2c 20 28 69 6e 74 29 70 4e 6f 64 65 2d 3e 69 4e  , (int)pNode->iN
12200 6f 64 65 29 3b 0a 20 20 20 20 20 20 72 63 32 20  ode);.      rc2 
12210 3d 20 6e 6f 64 65 52 65 6c 65 61 73 65 28 70 52  = nodeRelease(pR
12220 74 72 65 65 2c 20 70 49 6e 73 65 72 74 29 3b 0a  tree, pInsert);.
12230 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
12240 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12250 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20     rc = rc2;.   
12260 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
12270 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
12280 2a 0a 2a 2a 20 53 65 6c 65 63 74 20 61 20 63 75  *.** Select a cu
12290 72 72 65 6e 74 6c 79 20 75 6e 75 73 65 64 20 72  rrently unused r
122a0 6f 77 69 64 20 66 6f 72 20 61 20 6e 65 77 20 72  owid for a new r
122b0 2d 74 72 65 65 20 72 65 63 6f 72 64 2e 0a 2a 2f  -tree record..*/
122c0 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77 52  .static int newR
122d0 6f 77 69 64 28 52 74 72 65 65 20 2a 70 52 74 72  owid(Rtree *pRtr
122e0 65 65 2c 20 69 36 34 20 2a 70 69 52 6f 77 69 64  ee, i64 *piRowid
122f0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
12300 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c  qlite3_bind_null
12310 28 70 52 74 72 65 65 2d 3e 70 57 72 69 74 65 52  (pRtree->pWriteR
12320 6f 77 69 64 2c 20 31 29 3b 0a 20 20 73 71 6c 69  owid, 1);.  sqli
12330 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 52  te3_bind_null(pR
12340 74 72 65 65 2d 3e 70 57 72 69 74 65 52 6f 77 69  tree->pWriteRowi
12350 64 2c 20 32 29 3b 0a 20 20 73 71 6c 69 74 65 33  d, 2);.  sqlite3
12360 5f 73 74 65 70 28 70 52 74 72 65 65 2d 3e 70 57  _step(pRtree->pW
12370 72 69 74 65 52 6f 77 69 64 29 3b 0a 20 20 72 63  riteRowid);.  rc
12380 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
12390 28 70 52 74 72 65 65 2d 3e 70 57 72 69 74 65 52  (pRtree->pWriteR
123a0 6f 77 69 64 29 3b 0a 20 20 2a 70 69 52 6f 77 69  owid);.  *piRowi
123b0 64 20 3d 20 73 71 6c 69 74 65 33 5f 6c 61 73 74  d = sqlite3_last
123c0 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 70 52  _insert_rowid(pR
123d0 74 72 65 65 2d 3e 64 62 29 3b 0a 20 20 72 65 74  tree->db);.  ret
123e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
123f0 20 52 65 6d 6f 76 65 20 74 68 65 20 65 6e 74 72   Remove the entr
12400 79 20 77 69 74 68 20 72 6f 77 69 64 3d 69 44 65  y with rowid=iDe
12410 6c 65 74 65 20 66 72 6f 6d 20 74 68 65 20 72 2d  lete from the r-
12420 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e 0a  tree structure..
12430 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 74  */.static int rt
12440 72 65 65 44 65 6c 65 74 65 52 6f 77 69 64 28 52  reeDeleteRowid(R
12450 74 72 65 65 20 2a 70 52 74 72 65 65 2c 20 73 71  tree *pRtree, sq
12460 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 44 65 6c  lite3_int64 iDel
12470 65 74 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ete){.  int rc; 
12480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12490 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
124a0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 52 74 72 65  n code */.  Rtre
124b0 65 4e 6f 64 65 20 2a 70 4c 65 61 66 20 3d 20 30  eNode *pLeaf = 0
124c0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ;           /* L
124d0 65 61 66 20 6e 6f 64 65 20 63 6f 6e 74 61 69 6e  eaf node contain
124e0 69 6e 67 20 72 65 63 6f 72 64 20 69 44 65 6c 65  ing record iDele
124f0 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  te */.  int iCel
12500 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
12510 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
12520 20 6f 66 20 69 44 65 6c 65 74 65 20 63 65 6c 6c   of iDelete cell
12530 20 69 6e 20 70 4c 65 61 66 20 2a 2f 0a 20 20 52   in pLeaf */.  R
12540 74 72 65 65 4e 6f 64 65 20 2a 70 52 6f 6f 74 3b  treeNode *pRoot;
12550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12560 2a 20 52 6f 6f 74 20 6e 6f 64 65 20 6f 66 20 72  * Root node of r
12570 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a  tree structure *
12580 2f 0a 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20  /...  /* Obtain 
12590 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
125a0 68 65 20 72 6f 6f 74 20 6e 6f 64 65 20 74 6f 20  he root node to 
125b0 69 6e 69 74 69 61 6c 69 7a 65 20 52 74 72 65 65  initialize Rtree
125c0 2e 69 44 65 70 74 68 20 2a 2f 0a 20 20 72 63 20  .iDepth */.  rc 
125d0 3d 20 6e 6f 64 65 41 63 71 75 69 72 65 28 70 52  = nodeAcquire(pR
125e0 74 72 65 65 2c 20 31 2c 20 30 2c 20 26 70 52 6f  tree, 1, 0, &pRo
125f0 6f 74 29 3b 0a 0a 20 20 2f 2a 20 4f 62 74 61 69  ot);..  /* Obtai
12600 6e 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  n a reference to
12610 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 20 74   the leaf node t
12620 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
12630 20 65 6e 74 72 79 20 0a 20 20 2a 2a 20 61 62 6f   entry .  ** abo
12640 75 74 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64  ut to be deleted
12650 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  . .  */.  if( rc
12660 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
12670 20 20 20 72 63 20 3d 20 66 69 6e 64 4c 65 61 66     rc = findLeaf
12680 4e 6f 64 65 28 70 52 74 72 65 65 2c 20 69 44 65  Node(pRtree, iDe
12690 6c 65 74 65 2c 20 26 70 4c 65 61 66 29 3b 0a 20  lete, &pLeaf);. 
126a0 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20   }..  /* Delete 
126b0 74 68 65 20 63 65 6c 6c 20 69 6e 20 71 75 65 73  the cell in ques
126c0 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 6c 65  tion from the le
126d0 61 66 20 6e 6f 64 65 2e 20 2a 2f 0a 20 20 69 66  af node. */.  if
126e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
126f0 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a  ){.    int rc2;.
12700 20 20 20 20 72 63 20 3d 20 6e 6f 64 65 52 6f 77      rc = nodeRow
12710 69 64 49 6e 64 65 78 28 70 52 74 72 65 65 2c 20  idIndex(pRtree, 
12720 70 4c 65 61 66 2c 20 69 44 65 6c 65 74 65 2c 20  pLeaf, iDelete, 
12730 26 69 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28  &iCell);.    if(
12740 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
12750 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 64 65 6c  {.      rc = del
12760 65 74 65 43 65 6c 6c 28 70 52 74 72 65 65 2c 20  eteCell(pRtree, 
12770 70 4c 65 61 66 2c 20 69 43 65 6c 6c 2c 20 30 29  pLeaf, iCell, 0)
12780 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 32 20  ;.    }.    rc2 
12790 3d 20 6e 6f 64 65 52 65 6c 65 61 73 65 28 70 52  = nodeRelease(pR
127a0 74 72 65 65 2c 20 70 4c 65 61 66 29 3b 0a 20 20  tree, pLeaf);.  
127b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
127c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
127d0 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 20 20 7d  = rc2;.    }.  }
127e0 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68  ..  /* Delete th
127f0 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
12800 65 6e 74 72 79 20 69 6e 20 74 68 65 20 3c 72 74  entry in the <rt
12810 72 65 65 3e 5f 72 6f 77 69 64 20 74 61 62 6c 65  ree>_rowid table
12820 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53  . */.  if( rc==S
12830 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12840 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
12850 36 34 28 70 52 74 72 65 65 2d 3e 70 44 65 6c 65  64(pRtree->pDele
12860 74 65 52 6f 77 69 64 2c 20 31 2c 20 69 44 65 6c  teRowid, 1, iDel
12870 65 74 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ete);.    sqlite
12880 33 5f 73 74 65 70 28 70 52 74 72 65 65 2d 3e 70  3_step(pRtree->p
12890 44 65 6c 65 74 65 52 6f 77 69 64 29 3b 0a 20 20  DeleteRowid);.  
128a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
128b0 65 73 65 74 28 70 52 74 72 65 65 2d 3e 70 44 65  eset(pRtree->pDe
128c0 6c 65 74 65 52 6f 77 69 64 29 3b 0a 20 20 7d 0a  leteRowid);.  }.
128d0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74  .  /* Check if t
128e0 68 65 20 72 6f 6f 74 20 6e 6f 64 65 20 6e 6f 77  he root node now
128f0 20 68 61 73 20 65 78 61 63 74 6c 79 20 6f 6e 65   has exactly one
12900 20 63 68 69 6c 64 2e 20 49 66 20 73 6f 2c 20 72   child. If so, r
12910 65 6d 6f 76 65 0a 20 20 2a 2a 20 69 74 2c 20 73  emove.  ** it, s
12920 63 68 65 64 75 6c 65 20 74 68 65 20 63 6f 6e 74  chedule the cont
12930 65 6e 74 73 20 6f 66 20 74 68 65 20 63 68 69 6c  ents of the chil
12940 64 20 66 6f 72 20 72 65 69 6e 73 65 72 74 69 6f  d for reinsertio
12950 6e 20 61 6e 64 20 0a 20 20 2a 2a 20 72 65 64 75  n and .  ** redu
12960 63 65 20 74 68 65 20 74 72 65 65 20 68 65 69 67  ce the tree heig
12970 68 74 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2a 0a  ht by one..  **.
12980 20 20 2a 2a 20 54 68 69 73 20 69 73 20 65 71 75    ** This is equ
12990 69 76 61 6c 65 6e 74 20 74 6f 20 63 6f 70 79 69  ivalent to copyi
129a0 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ng the contents 
129b0 6f 66 20 74 68 65 20 63 68 69 6c 64 20 69 6e 74  of the child int
129c0 6f 0a 20 20 2a 2a 20 74 68 65 20 72 6f 6f 74 20  o.  ** the root 
129d0 6e 6f 64 65 20 28 74 68 65 20 6f 70 65 72 61 74  node (the operat
129e0 69 6f 6e 20 74 68 61 74 20 47 75 74 6d 61 6e 27  ion that Gutman'
129f0 73 20 70 61 70 65 72 20 73 61 79 73 20 74 6f 20  s paper says to 
12a00 70 65 72 66 6f 72 6d 20 0a 20 20 2a 2a 20 69 6e  perform .  ** in
12a10 20 74 68 69 73 20 73 63 65 6e 61 72 69 6f 29 2e   this scenario).
12a20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
12a30 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 52 74  SQLITE_OK && pRt
12a40 72 65 65 2d 3e 69 44 65 70 74 68 3e 30 20 26 26  ree->iDepth>0 &&
12a50 20 4e 43 45 4c 4c 28 70 52 6f 6f 74 29 3d 3d 31   NCELL(pRoot)==1
12a60 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b   ){.    int rc2;
12a70 0a 20 20 20 20 52 74 72 65 65 4e 6f 64 65 20 2a  .    RtreeNode *
12a80 70 43 68 69 6c 64 3b 0a 20 20 20 20 69 36 34 20  pChild;.    i64 
12a90 69 43 68 69 6c 64 20 3d 20 6e 6f 64 65 47 65 74  iChild = nodeGet
12aa0 52 6f 77 69 64 28 70 52 74 72 65 65 2c 20 70 52  Rowid(pRtree, pR
12ab0 6f 6f 74 2c 20 30 29 3b 0a 20 20 20 20 72 63 20  oot, 0);.    rc 
12ac0 3d 20 6e 6f 64 65 41 63 71 75 69 72 65 28 70 52  = nodeAcquire(pR
12ad0 74 72 65 65 2c 20 69 43 68 69 6c 64 2c 20 70 52  tree, iChild, pR
12ae0 6f 6f 74 2c 20 26 70 43 68 69 6c 64 29 3b 0a 20  oot, &pChild);. 
12af0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
12b00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
12b10 20 3d 20 72 65 6d 6f 76 65 4e 6f 64 65 28 70 52   = removeNode(pR
12b20 74 72 65 65 2c 20 70 43 68 69 6c 64 2c 20 70 52  tree, pChild, pR
12b30 74 72 65 65 2d 3e 69 44 65 70 74 68 2d 31 29 3b  tree->iDepth-1);
12b40 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 32 20 3d  .    }.    rc2 =
12b50 20 6e 6f 64 65 52 65 6c 65 61 73 65 28 70 52 74   nodeRelease(pRt
12b60 72 65 65 2c 20 70 43 68 69 6c 64 29 3b 0a 20 20  ree, pChild);.  
12b70 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
12b80 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a  _OK ) rc = rc2;.
12b90 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
12ba0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
12bb0 52 74 72 65 65 2d 3e 69 44 65 70 74 68 2d 2d 3b  Rtree->iDepth--;
12bc0 0a 20 20 20 20 20 20 77 72 69 74 65 49 6e 74 31  .      writeInt1
12bd0 36 28 70 52 6f 6f 74 2d 3e 7a 44 61 74 61 2c 20  6(pRoot->zData, 
12be0 70 52 74 72 65 65 2d 3e 69 44 65 70 74 68 29 3b  pRtree->iDepth);
12bf0 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 69 73  .      pRoot->is
12c00 44 69 72 74 79 20 3d 20 31 3b 0a 20 20 20 20 7d  Dirty = 1;.    }
12c10 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 2d 69 6e  .  }..  /* Re-in
12c20 73 65 72 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  sert the content
12c30 73 20 6f 66 20 61 6e 79 20 75 6e 64 65 72 66 75  s of any underfu
12c40 6c 6c 20 6e 6f 64 65 73 20 72 65 6d 6f 76 65 64  ll nodes removed
12c50 20 66 72 6f 6d 20 74 68 65 20 74 72 65 65 2e 20   from the tree. 
12c60 2a 2f 0a 20 20 66 6f 72 28 70 4c 65 61 66 3d 70  */.  for(pLeaf=p
12c70 52 74 72 65 65 2d 3e 70 44 65 6c 65 74 65 64 3b  Rtree->pDeleted;
12c80 20 70 4c 65 61 66 3b 20 70 4c 65 61 66 3d 70 52   pLeaf; pLeaf=pR
12c90 74 72 65 65 2d 3e 70 44 65 6c 65 74 65 64 29 7b  tree->pDeleted){
12ca0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
12cb0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
12cc0 72 63 20 3d 20 72 65 69 6e 73 65 72 74 4e 6f 64  rc = reinsertNod
12cd0 65 43 6f 6e 74 65 6e 74 28 70 52 74 72 65 65 2c  eContent(pRtree,
12ce0 20 70 4c 65 61 66 29 3b 0a 20 20 20 20 7d 0a 20   pLeaf);.    }. 
12cf0 20 20 20 70 52 74 72 65 65 2d 3e 70 44 65 6c 65     pRtree->pDele
12d00 74 65 64 20 3d 20 70 4c 65 61 66 2d 3e 70 4e 65  ted = pLeaf->pNe
12d10 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  xt;.    sqlite3_
12d20 66 72 65 65 28 70 4c 65 61 66 29 3b 0a 20 20 7d  free(pLeaf);.  }
12d30 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74  ..  /* Release t
12d40 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  he reference to 
12d50 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2e 20 2a  the root node. *
12d60 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
12d70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
12d80 3d 20 6e 6f 64 65 52 65 6c 65 61 73 65 28 70 52  = nodeRelease(pR
12d90 74 72 65 65 2c 20 70 52 6f 6f 74 29 3b 0a 20 20  tree, pRoot);.  
12da0 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 6f 64 65 52  }else{.    nodeR
12db0 65 6c 65 61 73 65 28 70 52 74 72 65 65 2c 20 70  elease(pRtree, p
12dc0 52 6f 6f 74 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  Root);.  }..  re
12dd0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
12de0 2a 20 52 6f 75 6e 64 69 6e 67 20 63 6f 6e 73 74  * Rounding const
12df0 61 6e 74 73 20 66 6f 72 20 66 6c 6f 61 74 2d 3e  ants for float->
12e00 64 6f 75 62 6c 65 20 63 6f 6e 76 65 72 73 69 6f  double conversio
12e10 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 52 4e  n..*/.#define RN
12e20 44 54 4f 57 41 52 44 53 20 20 28 31 2e 30 20 2d  DTOWARDS  (1.0 -
12e30 20 31 2e 30 2f 38 33 38 38 36 30 38 2e 30 29 20   1.0/8388608.0) 
12e40 20 2f 2a 20 52 6f 75 6e 64 20 74 6f 77 61 72 64   /* Round toward
12e50 73 20 7a 65 72 6f 20 2a 2f 0a 23 64 65 66 69 6e  s zero */.#defin
12e60 65 20 52 4e 44 41 57 41 59 20 20 20 20 20 28 31  e RNDAWAY     (1
12e70 2e 30 20 2b 20 31 2e 30 2f 38 33 38 38 36 30 38  .0 + 1.0/8388608
12e80 2e 30 29 20 20 2f 2a 20 52 6f 75 6e 64 20 61 77  .0)  /* Round aw
12e90 61 79 20 66 72 6f 6d 20 7a 65 72 6f 20 2a 2f 0a  ay from zero */.
12ea0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
12eb0 4c 49 54 45 5f 52 54 52 45 45 5f 49 4e 54 5f 4f  LITE_RTREE_INT_O
12ec0 4e 4c 59 29 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  NLY)./*.** Conve
12ed0 72 74 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61  rt an sqlite3_va
12ee0 6c 75 65 20 69 6e 74 6f 20 61 6e 20 52 74 72 65  lue into an Rtre
12ef0 65 56 61 6c 75 65 20 28 70 72 65 73 75 6d 61 62  eValue (presumab
12f00 6c 79 20 61 20 66 6c 6f 61 74 29 0a 2a 2a 20 77  ly a float).** w
12f10 68 69 6c 65 20 74 61 6b 69 6e 67 20 63 61 72 65  hile taking care
12f20 20 74 6f 20 72 6f 75 6e 64 20 74 6f 77 61 72 64   to round toward
12f30 20 6e 65 67 61 74 69 76 65 20 6f 72 20 70 6f 73   negative or pos
12f40 69 74 69 76 65 2c 20 72 65 73 70 65 63 74 69 76  itive, respectiv
12f50 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 52  ely..*/.static R
12f60 74 72 65 65 56 61 6c 75 65 20 72 74 72 65 65 56  treeValue rtreeV
12f70 61 6c 75 65 44 6f 77 6e 28 73 71 6c 69 74 65 33  alueDown(sqlite3
12f80 5f 76 61 6c 75 65 20 2a 76 29 7b 0a 20 20 64 6f  _value *v){.  do
12f90 75 62 6c 65 20 64 20 3d 20 73 71 6c 69 74 65 33  uble d = sqlite3
12fa0 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 76 29  _value_double(v)
12fb0 3b 0a 20 20 66 6c 6f 61 74 20 66 20 3d 20 28 66  ;.  float f = (f
12fc0 6c 6f 61 74 29 64 3b 0a 20 20 69 66 28 20 66 3e  loat)d;.  if( f>
12fd0 64 20 29 7b 0a 20 20 20 20 66 20 3d 20 28 66 6c  d ){.    f = (fl
12fe0 6f 61 74 29 28 64 2a 28 64 3c 30 20 3f 20 52 4e  oat)(d*(d<0 ? RN
12ff0 44 41 57 41 59 20 3a 20 52 4e 44 54 4f 57 41 52  DAWAY : RNDTOWAR
13000 44 53 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  DS));.  }.  retu
13010 72 6e 20 66 3b 0a 7d 0a 73 74 61 74 69 63 20 52  rn f;.}.static R
13020 74 72 65 65 56 61 6c 75 65 20 72 74 72 65 65 56  treeValue rtreeV
13030 61 6c 75 65 55 70 28 73 71 6c 69 74 65 33 5f 76  alueUp(sqlite3_v
13040 61 6c 75 65 20 2a 76 29 7b 0a 20 20 64 6f 75 62  alue *v){.  doub
13050 6c 65 20 64 20 3d 20 73 71 6c 69 74 65 33 5f 76  le d = sqlite3_v
13060 61 6c 75 65 5f 64 6f 75 62 6c 65 28 76 29 3b 0a  alue_double(v);.
13070 20 20 66 6c 6f 61 74 20 66 20 3d 20 28 66 6c 6f    float f = (flo
13080 61 74 29 64 3b 0a 20 20 69 66 28 20 66 3c 64 20  at)d;.  if( f<d 
13090 29 7b 0a 20 20 20 20 66 20 3d 20 28 66 6c 6f 61  ){.    f = (floa
130a0 74 29 28 64 2a 28 64 3c 30 20 3f 20 52 4e 44 54  t)(d*(d<0 ? RNDT
130b0 4f 57 41 52 44 53 20 3a 20 52 4e 44 41 57 41 59  OWARDS : RNDAWAY
130c0 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ));.  }.  return
130d0 20 66 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   f;.}.#endif /* 
130e0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
130f0 52 54 52 45 45 5f 49 4e 54 5f 4f 4e 4c 59 29 20  RTREE_INT_ONLY) 
13100 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 78  */.../*.** The x
13110 55 70 64 61 74 65 20 6d 65 74 68 6f 64 20 66 6f  Update method fo
13120 72 20 72 74 72 65 65 20 6d 6f 64 75 6c 65 20 76  r rtree module v
13130 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 0a 2a  irtual tables..*
13140 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 74 72  /.static int rtr
13150 65 65 55 70 64 61 74 65 28 0a 20 20 73 71 6c 69  eeUpdate(.  sqli
13160 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 2c  te3_vtab *pVtab,
13170 20 0a 20 20 69 6e 74 20 6e 44 61 74 61 2c 20 0a   .  int nData, .
13180 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
13190 2a 2a 61 7a 44 61 74 61 2c 20 0a 20 20 73 71 6c  **azData, .  sql
131a0 69 74 65 5f 69 6e 74 36 34 20 2a 70 52 6f 77 69  ite_int64 *pRowi
131b0 64 0a 29 7b 0a 20 20 52 74 72 65 65 20 2a 70 52  d.){.  Rtree *pR
131c0 74 72 65 65 20 3d 20 28 52 74 72 65 65 20 2a 29  tree = (Rtree *)
131d0 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 72 63 20  pVtab;.  int rc 
131e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 52  = SQLITE_OK;.  R
131f0 74 72 65 65 43 65 6c 6c 20 63 65 6c 6c 3b 20 20  treeCell cell;  
13200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13210 2a 20 4e 65 77 20 63 65 6c 6c 20 74 6f 20 69 6e  * New cell to in
13220 73 65 72 74 20 69 66 20 6e 44 61 74 61 3e 31 20  sert if nData>1 
13230 2a 2f 0a 20 20 69 6e 74 20 62 48 61 76 65 52 6f  */.  int bHaveRo
13240 77 69 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  wid = 0;        
13250 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31       /* Set to 1
13260 20 61 66 74 65 72 20 6e 65 77 20 72 6f 77 69 64   after new rowid
13270 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 2a   is determined *
13280 2f 0a 0a 20 20 72 74 72 65 65 52 65 66 65 72 65  /..  rtreeRefere
13290 6e 63 65 28 70 52 74 72 65 65 29 3b 0a 20 20 61  nce(pRtree);.  a
132a0 73 73 65 72 74 28 6e 44 61 74 61 3e 3d 31 29 3b  ssert(nData>=1);
132b0 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 61 69 6e  ..  /* Constrain
132c0 74 20 68 61 6e 64 6c 69 6e 67 2e 20 41 20 77 72  t handling. A wr
132d0 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e  ite operation on
132e0 20 61 6e 20 72 2d 74 72 65 65 20 74 61 62 6c 65   an r-tree table
132f0 20 6d 61 79 20 72 65 74 75 72 6e 0a 20 20 2a 2a   may return.  **
13300 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
13310 4e 54 20 66 6f 72 20 74 77 6f 20 72 65 61 73 6f  NT for two reaso
13320 6e 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ns:.  **.  **   
13330 31 2e 20 41 20 64 75 70 6c 69 63 61 74 65 20 72  1. A duplicate r
13340 6f 77 69 64 20 76 61 6c 75 65 2c 20 6f 72 0a 20  owid value, or. 
13350 20 2a 2a 20 20 20 32 2e 20 54 68 65 20 73 75 70   **   2. The sup
13360 70 6c 69 65 64 20 64 61 74 61 20 76 69 6f 6c 61  plied data viola
13370 74 65 73 20 74 68 65 20 22 78 32 3e 3d 78 31 22  tes the "x2>=x1"
13380 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 2a   constraint..  *
13390 2a 0a 20 20 2a 2a 20 49 6e 20 74 68 65 20 66 69  *.  ** In the fi
133a0 72 73 74 20 63 61 73 65 2c 20 69 66 20 74 68 65  rst case, if the
133b0 20 63 6f 6e 66 6c 69 63 74 2d 68 61 6e 64 6c 69   conflict-handli
133c0 6e 67 20 6d 6f 64 65 20 69 73 20 52 45 50 4c 41  ng mode is REPLA
133d0 43 45 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68  CE, then.  ** th
133e0 65 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 72 6f  e conflicting ro
133f0 77 20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65 64  w can be removed
13400 20 62 65 66 6f 72 65 20 70 72 6f 63 65 65 64 69   before proceedi
13410 6e 67 2e 20 49 6e 20 74 68 65 20 73 65 63 6f 6e  ng. In the secon
13420 64 0a 20 20 2a 2a 20 63 61 73 65 2c 20 53 51 4c  d.  ** case, SQL
13430 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 6d  ITE_CONSTRAINT m
13440 75 73 74 20 62 65 20 72 65 74 75 72 6e 65 64 20  ust be returned 
13450 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68  regardless of th
13460 65 0a 20 20 2a 2a 20 63 6f 6e 66 6c 69 63 74 2d  e.  ** conflict-
13470 68 61 6e 64 6c 69 6e 67 20 6d 6f 64 65 20 73 70  handling mode sp
13480 65 63 69 66 69 65 64 20 62 79 20 74 68 65 20 75  ecified by the u
13490 73 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ser..  */.  if( 
134a0 6e 44 61 74 61 3e 31 20 29 7b 0a 20 20 20 20 69  nData>1 ){.    i
134b0 6e 74 20 69 69 3b 0a 0a 20 20 20 20 2f 2a 20 50  nt ii;..    /* P
134c0 6f 70 75 6c 61 74 65 20 74 68 65 20 63 65 6c 6c  opulate the cell
134d0 2e 61 43 6f 6f 72 64 5b 5d 20 61 72 72 61 79 2e  .aCoord[] array.
134e0 20 54 68 65 20 66 69 72 73 74 20 63 6f 6f 72 64   The first coord
134f0 69 6e 61 74 65 20 69 73 20 61 7a 44 61 74 61 5b  inate is azData[
13500 33 5d 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  3]. */.    asser
13510 74 28 20 6e 44 61 74 61 3d 3d 28 70 52 74 72 65  t( nData==(pRtre
13520 65 2d 3e 6e 44 69 6d 2a 32 20 2b 20 33 29 20 29  e->nDim*2 + 3) )
13530 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
13540 5f 52 54 52 45 45 5f 49 4e 54 5f 4f 4e 4c 59 0a  _RTREE_INT_ONLY.
13550 20 20 20 20 69 66 28 20 70 52 74 72 65 65 2d 3e      if( pRtree->
13560 65 43 6f 6f 72 64 54 79 70 65 3d 3d 52 54 52 45  eCoordType==RTRE
13570 45 5f 43 4f 4f 52 44 5f 52 45 41 4c 33 32 20 29  E_COORD_REAL32 )
13580 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30  {.      for(ii=0
13590 3b 20 69 69 3c 28 70 52 74 72 65 65 2d 3e 6e 44  ; ii<(pRtree->nD
135a0 69 6d 2a 32 29 3b 20 69 69 2b 3d 32 29 7b 0a 20  im*2); ii+=2){. 
135b0 20 20 20 20 20 20 20 63 65 6c 6c 2e 61 43 6f 6f         cell.aCoo
135c0 72 64 5b 69 69 5d 2e 66 20 3d 20 72 74 72 65 65  rd[ii].f = rtree
135d0 56 61 6c 75 65 44 6f 77 6e 28 61 7a 44 61 74 61  ValueDown(azData
135e0 5b 69 69 2b 33 5d 29 3b 0a 20 20 20 20 20 20 20  [ii+3]);.       
135f0 20 63 65 6c 6c 2e 61 43 6f 6f 72 64 5b 69 69 2b   cell.aCoord[ii+
13600 31 5d 2e 66 20 3d 20 72 74 72 65 65 56 61 6c 75  1].f = rtreeValu
13610 65 55 70 28 61 7a 44 61 74 61 5b 69 69 2b 34 5d  eUp(azData[ii+4]
13620 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  );.        if( c
13630 65 6c 6c 2e 61 43 6f 6f 72 64 5b 69 69 5d 2e 66  ell.aCoord[ii].f
13640 3e 63 65 6c 6c 2e 61 43 6f 6f 72 64 5b 69 69 2b  >cell.aCoord[ii+
13650 31 5d 2e 66 20 29 7b 0a 20 20 20 20 20 20 20 20  1].f ){.        
13660 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
13670 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20 20  NSTRAINT;.      
13680 20 20 20 20 67 6f 74 6f 20 63 6f 6e 73 74 72 61      goto constra
13690 69 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  int;.        }. 
136a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
136b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20  .#endif.    {.  
136c0 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
136d0 3c 28 70 52 74 72 65 65 2d 3e 6e 44 69 6d 2a 32  <(pRtree->nDim*2
136e0 29 3b 20 69 69 2b 3d 32 29 7b 0a 20 20 20 20 20  ); ii+=2){.     
136f0 20 20 20 63 65 6c 6c 2e 61 43 6f 6f 72 64 5b 69     cell.aCoord[i
13700 69 5d 2e 69 20 3d 20 73 71 6c 69 74 65 33 5f 76  i].i = sqlite3_v
13710 61 6c 75 65 5f 69 6e 74 28 61 7a 44 61 74 61 5b  alue_int(azData[
13720 69 69 2b 33 5d 29 3b 0a 20 20 20 20 20 20 20 20  ii+3]);.        
13730 63 65 6c 6c 2e 61 43 6f 6f 72 64 5b 69 69 2b 31  cell.aCoord[ii+1
13740 5d 2e 69 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  ].i = sqlite3_va
13750 6c 75 65 5f 69 6e 74 28 61 7a 44 61 74 61 5b 69  lue_int(azData[i
13760 69 2b 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  i+4]);.        i
13770 66 28 20 63 65 6c 6c 2e 61 43 6f 6f 72 64 5b 69  f( cell.aCoord[i
13780 69 5d 2e 69 3e 63 65 6c 6c 2e 61 43 6f 6f 72 64  i].i>cell.aCoord
13790 5b 69 69 2b 31 5d 2e 69 20 29 7b 0a 20 20 20 20  [ii+1].i ){.    
137a0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
137b0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20  E_CONSTRAINT;.  
137c0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 63 6f 6e          goto con
137d0 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 20 20 20  straint;.       
137e0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
137f0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 72 6f  ..    /* If a ro
13800 77 69 64 20 76 61 6c 75 65 20 77 61 73 20 73 75  wid value was su
13810 70 70 6c 69 65 64 2c 20 63 68 65 63 6b 20 69 66  pplied, check if
13820 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 70   it is already p
13830 72 65 73 65 6e 74 20 69 6e 20 0a 20 20 20 20 2a  resent in .    *
13840 2a 20 74 68 65 20 74 61 62 6c 65 2e 20 49 66 20  * the table. If 
13850 73 6f 2c 20 74 68 65 20 63 6f 6e 73 74 72 61 69  so, the constrai
13860 6e 74 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a  nt has failed. *
13870 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
13880 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 7a 44  3_value_type(azD
13890 61 74 61 5b 32 5d 29 21 3d 53 51 4c 49 54 45 5f  ata[2])!=SQLITE_
138a0 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 63 65  NULL ){.      ce
138b0 6c 6c 2e 69 52 6f 77 69 64 20 3d 20 73 71 6c 69  ll.iRowid = sqli
138c0 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28  te3_value_int64(
138d0 61 7a 44 61 74 61 5b 32 5d 29 3b 0a 20 20 20 20  azData[2]);.    
138e0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61    if( sqlite3_va
138f0 6c 75 65 5f 74 79 70 65 28 61 7a 44 61 74 61 5b  lue_type(azData[
13900 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  0])==SQLITE_NULL
13910 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74  .       || sqlit
13920 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61  e3_value_int64(a
13930 7a 44 61 74 61 5b 30 5d 29 21 3d 63 65 6c 6c 2e  zData[0])!=cell.
13940 69 52 6f 77 69 64 0a 20 20 20 20 20 20 29 7b 0a  iRowid.      ){.
13950 20 20 20 20 20 20 20 20 69 6e 74 20 73 74 65 70          int step
13960 72 63 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  rc;.        sqli
13970 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
13980 52 74 72 65 65 2d 3e 70 52 65 61 64 52 6f 77 69  Rtree->pReadRowi
13990 64 2c 20 31 2c 20 63 65 6c 6c 2e 69 52 6f 77 69  d, 1, cell.iRowi
139a0 64 29 3b 0a 20 20 20 20 20 20 20 20 73 74 65 70  d);.        step
139b0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  rc = sqlite3_ste
139c0 70 28 70 52 74 72 65 65 2d 3e 70 52 65 61 64 52  p(pRtree->pReadR
139d0 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 72  owid);.        r
139e0 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
139f0 74 28 70 52 74 72 65 65 2d 3e 70 52 65 61 64 52  t(pRtree->pReadR
13a00 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 69  owid);.        i
13a10 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  f( SQLITE_ROW==s
13a20 74 65 70 72 63 20 29 7b 0a 20 20 20 20 20 20 20  teprc ){.       
13a30 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76     if( sqlite3_v
13a40 74 61 62 5f 6f 6e 5f 63 6f 6e 66 6c 69 63 74 28  tab_on_conflict(
13a50 70 52 74 72 65 65 2d 3e 64 62 29 3d 3d 53 51 4c  pRtree->db)==SQL
13a60 49 54 45 5f 52 45 50 4c 41 43 45 20 29 7b 0a 20  ITE_REPLACE ){. 
13a70 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
13a80 72 74 72 65 65 44 65 6c 65 74 65 52 6f 77 69 64  rtreeDeleteRowid
13a90 28 70 52 74 72 65 65 2c 20 63 65 6c 6c 2e 69 52  (pRtree, cell.iR
13aa0 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20  owid);.         
13ab0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
13ac0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
13ad0 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20  CONSTRAINT;.    
13ae0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 63 6f 6e          goto con
13af0 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 20 20 20  straint;.       
13b00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
13b10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 48 61       }.      bHa
13b20 76 65 52 6f 77 69 64 20 3d 20 31 3b 0a 20 20 20  veRowid = 1;.   
13b30 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
13b40 61 7a 44 61 74 61 5b 30 5d 20 69 73 20 6e 6f 74  azData[0] is not
13b50 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 20 76 61 6c   an SQL NULL val
13b60 75 65 2c 20 69 74 20 69 73 20 74 68 65 20 72 6f  ue, it is the ro
13b70 77 69 64 20 6f 66 20 61 0a 20 20 2a 2a 20 72 65  wid of a.  ** re
13b80 63 6f 72 64 20 74 6f 20 64 65 6c 65 74 65 20 66  cord to delete f
13b90 72 6f 6d 20 74 68 65 20 72 2d 74 72 65 65 20 74  rom the r-tree t
13ba0 61 62 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77  able. The follow
13bb0 69 6e 67 20 62 6c 6f 63 6b 20 64 6f 65 73 0a 20  ing block does. 
13bc0 20 2a 2a 20 6a 75 73 74 20 74 68 61 74 2e 0a 20   ** just that.. 
13bd0 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
13be0 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 7a 44  3_value_type(azD
13bf0 61 74 61 5b 30 5d 29 21 3d 53 51 4c 49 54 45 5f  ata[0])!=SQLITE_
13c00 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d  NULL ){.    rc =
13c10 20 72 74 72 65 65 44 65 6c 65 74 65 52 6f 77 69   rtreeDeleteRowi
13c20 64 28 70 52 74 72 65 65 2c 20 73 71 6c 69 74 65  d(pRtree, sqlite
13c30 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 7a  3_value_int64(az
13c40 44 61 74 61 5b 30 5d 29 29 3b 0a 20 20 7d 0a 0a  Data[0]));.  }..
13c50 20 20 2f 2a 20 49 66 20 74 68 65 20 61 7a 44 61    /* If the azDa
13c60 74 61 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61  ta[] array conta
13c70 69 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  ins more than on
13c80 65 20 65 6c 65 6d 65 6e 74 2c 20 65 6c 65 6d 65  e element, eleme
13c90 6e 74 73 0a 20 20 2a 2a 20 28 61 7a 44 61 74 61  nts.  ** (azData
13ca0 5b 32 5d 2e 2e 61 7a 44 61 74 61 5b 61 72 67 63  [2]..azData[argc
13cb0 2d 31 5d 29 20 63 6f 6e 74 61 69 6e 20 61 20 6e  -1]) contain a n
13cc0 65 77 20 72 65 63 6f 72 64 20 74 6f 20 69 6e 73  ew record to ins
13cd0 65 72 74 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68  ert into.  ** th
13ce0 65 20 72 2d 74 72 65 65 20 73 74 72 75 63 74 75  e r-tree structu
13cf0 72 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  re..  */.  if( r
13d00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
13d10 6e 44 61 74 61 3e 31 20 29 7b 0a 20 20 20 20 2f  nData>1 ){.    /
13d20 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77  * Insert the new
13d30 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
13d40 20 72 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20 52   r-tree */.    R
13d50 74 72 65 65 4e 6f 64 65 20 2a 70 4c 65 61 66 20  treeNode *pLeaf 
13d60 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 67  = 0;..    /* Fig
13d70 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f 77 69  ure out the rowi
13d80 64 20 6f 66 20 74 68 65 20 6e 65 77 20 72 6f 77  d of the new row
13d90 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 48 61  . */.    if( bHa
13da0 76 65 52 6f 77 69 64 3d 3d 30 20 29 7b 0a 20 20  veRowid==0 ){.  
13db0 20 20 20 20 72 63 20 3d 20 6e 65 77 52 6f 77 69      rc = newRowi
13dc0 64 28 70 52 74 72 65 65 2c 20 26 63 65 6c 6c 2e  d(pRtree, &cell.
13dd0 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a 20  iRowid);.    }. 
13de0 20 20 20 2a 70 52 6f 77 69 64 20 3d 20 63 65 6c     *pRowid = cel
13df0 6c 2e 69 52 6f 77 69 64 3b 0a 0a 20 20 20 20 69  l.iRowid;..    i
13e00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
13e10 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 43   ){.      rc = C
13e20 68 6f 6f 73 65 4c 65 61 66 28 70 52 74 72 65 65  hooseLeaf(pRtree
13e30 2c 20 26 63 65 6c 6c 2c 20 30 2c 20 26 70 4c 65  , &cell, 0, &pLe
13e40 61 66 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  af);.    }.    i
13e50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
13e60 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
13e70 32 3b 0a 20 20 20 20 20 20 70 52 74 72 65 65 2d  2;.      pRtree-
13e80 3e 69 52 65 69 6e 73 65 72 74 48 65 69 67 68 74  >iReinsertHeight
13e90 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 63 20   = -1;.      rc 
13ea0 3d 20 72 74 72 65 65 49 6e 73 65 72 74 43 65 6c  = rtreeInsertCel
13eb0 6c 28 70 52 74 72 65 65 2c 20 70 4c 65 61 66 2c  l(pRtree, pLeaf,
13ec0 20 26 63 65 6c 6c 2c 20 30 29 3b 0a 20 20 20 20   &cell, 0);.    
13ed0 20 20 72 63 32 20 3d 20 6e 6f 64 65 52 65 6c 65    rc2 = nodeRele
13ee0 61 73 65 28 70 52 74 72 65 65 2c 20 70 4c 65 61  ase(pRtree, pLea
13ef0 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  f);.      if( rc
13f00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
13f10 20 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b         rc = rc2;
13f20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
13f30 20 7d 0a 0a 63 6f 6e 73 74 72 61 69 6e 74 3a 0a   }..constraint:.
13f40 20 20 72 74 72 65 65 52 65 6c 65 61 73 65 28 70    rtreeRelease(p
13f50 52 74 72 65 65 29 3b 0a 20 20 72 65 74 75 72 6e  Rtree);.  return
13f60 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
13f70 65 20 78 52 65 6e 61 6d 65 20 6d 65 74 68 6f 64  e xRename method
13f80 20 66 6f 72 20 72 74 72 65 65 20 6d 6f 64 75 6c   for rtree modul
13f90 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  e virtual tables
13fa0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13fb0 72 74 72 65 65 52 65 6e 61 6d 65 28 73 71 6c 69  rtreeRename(sqli
13fc0 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 2c  te3_vtab *pVtab,
13fd0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 65   const char *zNe
13fe0 77 4e 61 6d 65 29 7b 0a 20 20 52 74 72 65 65 20  wName){.  Rtree 
13ff0 2a 70 52 74 72 65 65 20 3d 20 28 52 74 72 65 65  *pRtree = (Rtree
14000 20 2a 29 70 56 74 61 62 3b 0a 20 20 69 6e 74 20   *)pVtab;.  int 
14010 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
14020 4d 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 20  M;.  char *zSql 
14030 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
14040 66 28 0a 20 20 20 20 22 41 4c 54 45 52 20 54 41  f(.    "ALTER TA
14050 42 4c 45 20 25 51 2e 27 25 71 5f 6e 6f 64 65 27  BLE %Q.'%q_node'
14060 20 20 20 52 45 4e 41 4d 45 20 54 4f 20 5c 22 25     RENAME TO \"%
14070 77 5f 6e 6f 64 65 5c 22 3b 22 0a 20 20 20 20 22  w_node\";".    "
14080 41 4c 54 45 52 20 54 41 42 4c 45 20 25 51 2e 27  ALTER TABLE %Q.'
14090 25 71 5f 70 61 72 65 6e 74 27 20 52 45 4e 41 4d  %q_parent' RENAM
140a0 45 20 54 4f 20 5c 22 25 77 5f 70 61 72 65 6e 74  E TO \"%w_parent
140b0 5c 22 3b 22 0a 20 20 20 20 22 41 4c 54 45 52 20  \";".    "ALTER 
140c0 54 41 42 4c 45 20 25 51 2e 27 25 71 5f 72 6f 77  TABLE %Q.'%q_row
140d0 69 64 27 20 20 52 45 4e 41 4d 45 20 54 4f 20 5c  id'  RENAME TO \
140e0 22 25 77 5f 72 6f 77 69 64 5c 22 3b 22 0a 20 20  "%w_rowid\";".  
140f0 20 20 2c 20 70 52 74 72 65 65 2d 3e 7a 44 62 2c    , pRtree->zDb,
14100 20 70 52 74 72 65 65 2d 3e 7a 4e 61 6d 65 2c 20   pRtree->zName, 
14110 7a 4e 65 77 4e 61 6d 65 20 0a 20 20 20 20 2c 20  zNewName .    , 
14120 70 52 74 72 65 65 2d 3e 7a 44 62 2c 20 70 52 74  pRtree->zDb, pRt
14130 72 65 65 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 65 77  ree->zName, zNew
14140 4e 61 6d 65 20 0a 20 20 20 20 2c 20 70 52 74 72  Name .    , pRtr
14150 65 65 2d 3e 7a 44 62 2c 20 70 52 74 72 65 65 2d  ee->zDb, pRtree-
14160 3e 7a 4e 61 6d 65 2c 20 7a 4e 65 77 4e 61 6d 65  >zName, zNewName
14170 0a 20 20 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c  .  );.  if( zSql
14180 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
14190 69 74 65 33 5f 65 78 65 63 28 70 52 74 72 65 65  ite3_exec(pRtree
141a0 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 30  ->db, zSql, 0, 0
141b0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
141c0 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
141d0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
141e0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
141f0 63 74 69 6f 6e 20 70 6f 70 75 6c 61 74 65 73 20  ction populates 
14200 74 68 65 20 70 52 74 72 65 65 2d 3e 6e 52 6f 77  the pRtree->nRow
14210 45 73 74 20 76 61 72 69 61 62 6c 65 20 77 69 74  Est variable wit
14220 68 20 61 6e 20 65 73 74 69 6d 61 74 65 0a 2a 2a  h an estimate.**
14230 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
14240 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 76 69  f rows in the vi
14250 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 49 66 20  rtual table. If 
14260 70 6f 73 73 69 62 6c 65 2c 20 74 68 69 73 20 69  possible, this i
14270 73 20 62 61 73 65 64 0a 2a 2a 20 6f 6e 20 73 71  s based.** on sq
14280 6c 69 74 65 5f 73 74 61 74 31 20 64 61 74 61 2e  lite_stat1 data.
14290 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65 20   Otherwise, use 
142a0 52 54 52 45 45 5f 44 45 46 41 55 4c 54 5f 52 4f  RTREE_DEFAULT_RO
142b0 57 45 53 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  WEST..*/.static 
142c0 69 6e 74 20 72 74 72 65 65 51 75 65 72 79 53 74  int rtreeQuerySt
142d0 61 74 31 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  at1(sqlite3 *db,
142e0 20 52 74 72 65 65 20 2a 70 52 74 72 65 65 29 7b   Rtree *pRtree){
142f0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
14300 53 71 6c 20 3d 20 22 53 45 4c 45 43 54 20 73 74  Sql = "SELECT st
14310 61 74 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73  at FROM sqlite_s
14320 74 61 74 31 20 57 48 45 52 45 20 74 62 6c 3d 20  tat1 WHERE tbl= 
14330 3f 20 7c 7c 20 27 5f 72 6f 77 69 64 27 22 3b 0a  ? || '_rowid'";.
14340 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
14350 70 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  p;.  int rc;.  i
14360 36 34 20 6e 52 6f 77 20 3d 20 30 3b 0a 0a 20 20  64 nRow = 0;..  
14370 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
14380 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c  pare_v2(db, zSql
14390 2c 20 2d 31 2c 20 26 70 2c 20 30 29 3b 0a 20 20  , -1, &p, 0);.  
143a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
143b0 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
143c0 5f 62 69 6e 64 5f 74 65 78 74 28 70 2c 20 31 2c  _bind_text(p, 1,
143d0 20 70 52 74 72 65 65 2d 3e 7a 4e 61 6d 65 2c 20   pRtree->zName, 
143e0 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  -1, SQLITE_STATI
143f0 43 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  C);.    if( sqli
14400 74 65 33 5f 73 74 65 70 28 70 29 3d 3d 53 51 4c  te3_step(p)==SQL
14410 49 54 45 5f 52 4f 57 20 29 20 6e 52 6f 77 20 3d  ITE_ROW ) nRow =
14420 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
14430 69 6e 74 36 34 28 70 2c 20 30 29 3b 0a 20 20 20  int64(p, 0);.   
14440 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
14450 6e 61 6c 69 7a 65 28 70 29 3b 0a 20 20 7d 65 6c  nalize(p);.  }el
14460 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  se if( rc!=SQLIT
14470 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 72  E_NOMEM ){.    r
14480 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
14490 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
144a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
144b0 66 28 20 6e 52 6f 77 3d 3d 30 20 29 7b 0a 20 20  f( nRow==0 ){.  
144c0 20 20 20 20 70 52 74 72 65 65 2d 3e 6e 52 6f 77      pRtree->nRow
144d0 45 73 74 20 3d 20 52 54 52 45 45 5f 44 45 46 41  Est = RTREE_DEFA
144e0 55 4c 54 5f 52 4f 57 45 53 54 3b 0a 20 20 20 20  ULT_ROWEST;.    
144f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 52 74  }else{.      pRt
14500 72 65 65 2d 3e 6e 52 6f 77 45 73 74 20 3d 20 4d  ree->nRowEst = M
14510 41 58 28 6e 52 6f 77 2c 20 52 54 52 45 45 5f 4d  AX(nRow, RTREE_M
14520 49 4e 5f 52 4f 57 45 53 54 29 3b 0a 20 20 20 20  IN_ROWEST);.    
14530 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
14540 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 73 71  rc;.}..static sq
14550 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 72 74 72  lite3_module rtr
14560 65 65 4d 6f 64 75 6c 65 20 3d 20 7b 0a 20 20 30  eeModule = {.  0
14570 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14580 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56             /* iV
14590 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 72 74 72 65  ersion */.  rtre
145a0 65 43 72 65 61 74 65 2c 20 20 20 20 20 20 20 20  eCreate,        
145b0 20 20 20 20 20 20 20 20 2f 2a 20 78 43 72 65 61          /* xCrea
145c0 74 65 20 2d 20 63 72 65 61 74 65 20 61 20 74 61  te - create a ta
145d0 62 6c 65 20 2a 2f 0a 20 20 72 74 72 65 65 43 6f  ble */.  rtreeCo
145e0 6e 6e 65 63 74 2c 20 20 20 20 20 20 20 20 20 20  nnect,          
145f0 20 20 20 20 20 2f 2a 20 78 43 6f 6e 6e 65 63 74       /* xConnect
14600 20 2d 20 63 6f 6e 6e 65 63 74 20 74 6f 20 61 6e   - connect to an
14610 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20   existing table 
14620 2a 2f 0a 20 20 72 74 72 65 65 42 65 73 74 49 6e  */.  rtreeBestIn
14630 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  dex,            
14640 20 2f 2a 20 78 42 65 73 74 49 6e 64 65 78 20 2d   /* xBestIndex -
14650 20 44 65 74 65 72 6d 69 6e 65 20 73 65 61 72 63   Determine searc
14660 68 20 73 74 72 61 74 65 67 79 20 2a 2f 0a 20 20  h strategy */.  
14670 72 74 72 65 65 44 69 73 63 6f 6e 6e 65 63 74 2c  rtreeDisconnect,
14680 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
14690 44 69 73 63 6f 6e 6e 65 63 74 20 2d 20 44 69 73  Disconnect - Dis
146a0 63 6f 6e 6e 65 63 74 20 66 72 6f 6d 20 61 20 74  connect from a t
146b0 61 62 6c 65 20 2a 2f 0a 20 20 72 74 72 65 65 44  able */.  rtreeD
146c0 65 73 74 72 6f 79 2c 20 20 20 20 20 20 20 20 20  estroy,         
146d0 20 20 20 20 20 20 2f 2a 20 78 44 65 73 74 72 6f        /* xDestro
146e0 79 20 2d 20 44 72 6f 70 20 61 20 74 61 62 6c 65  y - Drop a table
146f0 20 2a 2f 0a 20 20 72 74 72 65 65 4f 70 65 6e 2c   */.  rtreeOpen,
14700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14710 20 20 2f 2a 20 78 4f 70 65 6e 20 2d 20 6f 70 65    /* xOpen - ope
14720 6e 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20  n a cursor */.  
14730 72 74 72 65 65 43 6c 6f 73 65 2c 20 20 20 20 20  rtreeClose,     
14740 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
14750 43 6c 6f 73 65 20 2d 20 63 6c 6f 73 65 20 61 20  Close - close a 
14760 63 75 72 73 6f 72 20 2a 2f 0a 20 20 72 74 72 65  cursor */.  rtre
14770 65 46 69 6c 74 65 72 2c 20 20 20 20 20 20 20 20  eFilter,        
14780 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 74          /* xFilt
14790 65 72 20 2d 20 63 6f 6e 66 69 67 75 72 65 20 73  er - configure s
147a0 63 61 6e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  can constraints 
147b0 2a 2f 0a 20 20 72 74 72 65 65 4e 65 78 74 2c 20  */.  rtreeNext, 
147c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147d0 20 2f 2a 20 78 4e 65 78 74 20 2d 20 61 64 76 61   /* xNext - adva
147e0 6e 63 65 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a  nce a cursor */.
147f0 20 20 72 74 72 65 65 45 6f 66 2c 20 20 20 20 20    rtreeEof,     
14800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14810 20 78 45 6f 66 20 2a 2f 0a 20 20 72 74 72 65 65   xEof */.  rtree
14820 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20  Column,         
14830 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6c 75 6d         /* xColum
14840 6e 20 2d 20 72 65 61 64 20 64 61 74 61 20 2a 2f  n - read data */
14850 0a 20 20 72 74 72 65 65 52 6f 77 69 64 2c 20 20  .  rtreeRowid,  
14860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14870 2a 20 78 52 6f 77 69 64 20 2d 20 72 65 61 64 20  * xRowid - read 
14880 64 61 74 61 20 2a 2f 0a 20 20 72 74 72 65 65 55  data */.  rtreeU
14890 70 64 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  pdate,          
148a0 20 20 20 20 20 20 2f 2a 20 78 55 70 64 61 74 65        /* xUpdate
148b0 20 2d 20 77 72 69 74 65 20 64 61 74 61 20 2a 2f   - write data */
148c0 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
148d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
148e0 2a 20 78 42 65 67 69 6e 20 2d 20 62 65 67 69 6e  * xBegin - begin
148f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   transaction */.
14900 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
14910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14920 20 78 53 79 6e 63 20 2d 20 73 79 6e 63 20 74 72   xSync - sync tr
14930 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 30  ansaction */.  0
14940 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14950 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
14960 6f 6d 6d 69 74 20 2d 20 63 6f 6d 6d 69 74 20 74  ommit - commit t
14970 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  ransaction */.  
14980 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
14990 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
149a0 52 6f 6c 6c 62 61 63 6b 20 2d 20 72 6f 6c 6c 62  Rollback - rollb
149b0 61 63 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ack transaction 
149c0 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
149d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149e0 20 2f 2a 20 78 46 69 6e 64 46 75 6e 63 74 69 6f   /* xFindFunctio
149f0 6e 20 2d 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65  n - function ove
14a00 72 6c 6f 61 64 69 6e 67 20 2a 2f 0a 20 20 72 74  rloading */.  rt
14a10 72 65 65 52 65 6e 61 6d 65 2c 20 20 20 20 20 20  reeRename,      
14a20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65            /* xRe
14a30 6e 61 6d 65 20 2d 20 72 65 6e 61 6d 65 20 74 68  name - rename th
14a40 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 30 2c 20  e table */.  0, 
14a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a60 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 61 76           /* xSav
14a70 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 30 2c 20 20  epoint */.  0,  
14a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a90 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 6c 65          /* xRele
14aa0 61 73 65 20 2a 2f 0a 20 20 30 20 20 20 20 20 20  ase */.  0      
14ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ac0 20 20 20 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63       /* xRollbac
14ad0 6b 54 6f 20 2a 2f 0a 7d 3b 0a 0a 73 74 61 74 69  kTo */.};..stati
14ae0 63 20 69 6e 74 20 72 74 72 65 65 53 71 6c 49 6e  c int rtreeSqlIn
14af0 69 74 28 0a 20 20 52 74 72 65 65 20 2a 70 52 74  it(.  Rtree *pRt
14b00 72 65 65 2c 20 0a 20 20 73 71 6c 69 74 65 33 20  ree, .  sqlite3 
14b10 2a 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68  *db, .  const ch
14b20 61 72 20 2a 7a 44 62 2c 20 0a 20 20 63 6f 6e 73  ar *zDb, .  cons
14b30 74 20 63 68 61 72 20 2a 7a 50 72 65 66 69 78 2c  t char *zPrefix,
14b40 20 0a 20 20 69 6e 74 20 69 73 43 72 65 61 74 65   .  int isCreate
14b50 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
14b60 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 23 64 65  QLITE_OK;..  #de
14b70 66 69 6e 65 20 4e 5f 53 54 41 54 45 4d 45 4e 54  fine N_STATEMENT
14b80 20 39 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73   9.  static cons
14b90 74 20 63 68 61 72 20 2a 61 7a 53 71 6c 5b 4e 5f  t char *azSql[N_
14ba0 53 54 41 54 45 4d 45 4e 54 5d 20 3d 20 7b 0a 20  STATEMENT] = {. 
14bb0 20 20 20 2f 2a 20 52 65 61 64 20 61 6e 64 20 77     /* Read and w
14bc0 72 69 74 65 20 74 68 65 20 78 78 78 5f 6e 6f 64  rite the xxx_nod
14bd0 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 22  e table */.    "
14be0 53 45 4c 45 43 54 20 64 61 74 61 20 46 52 4f 4d  SELECT data FROM
14bf0 20 27 25 71 27 2e 27 25 71 5f 6e 6f 64 65 27 20   '%q'.'%q_node' 
14c00 57 48 45 52 45 20 6e 6f 64 65 6e 6f 20 3d 20 3a  WHERE nodeno = :
14c10 31 22 2c 0a 20 20 20 20 22 49 4e 53 45 52 54 20  1",.    "INSERT 
14c20 4f 52 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20  OR REPLACE INTO 
14c30 27 25 71 27 2e 27 25 71 5f 6e 6f 64 65 27 20 56  '%q'.'%q_node' V
14c40 41 4c 55 45 53 28 3a 31 2c 20 3a 32 29 22 2c 0a  ALUES(:1, :2)",.
14c50 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
14c60 20 27 25 71 27 2e 27 25 71 5f 6e 6f 64 65 27 20   '%q'.'%q_node' 
14c70 57 48 45 52 45 20 6e 6f 64 65 6e 6f 20 3d 20 3a  WHERE nodeno = :
14c80 31 22 2c 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64  1",..    /* Read
14c90 20 61 6e 64 20 77 72 69 74 65 20 74 68 65 20 78   and write the x
14ca0 78 78 5f 72 6f 77 69 64 20 74 61 62 6c 65 20 2a  xx_rowid table *
14cb0 2f 0a 20 20 20 20 22 53 45 4c 45 43 54 20 6e 6f  /.    "SELECT no
14cc0 64 65 6e 6f 20 46 52 4f 4d 20 27 25 71 27 2e 27  deno FROM '%q'.'
14cd0 25 71 5f 72 6f 77 69 64 27 20 57 48 45 52 45 20  %q_rowid' WHERE 
14ce0 72 6f 77 69 64 20 3d 20 3a 31 22 2c 0a 20 20 20  rowid = :1",.   
14cf0 20 22 49 4e 53 45 52 54 20 4f 52 20 52 45 50 4c   "INSERT OR REPL
14d00 41 43 45 20 49 4e 54 4f 20 27 25 71 27 2e 27 25  ACE INTO '%q'.'%
14d10 71 5f 72 6f 77 69 64 27 20 56 41 4c 55 45 53 28  q_rowid' VALUES(
14d20 3a 31 2c 20 3a 32 29 22 2c 0a 20 20 20 20 22 44  :1, :2)",.    "D
14d30 45 4c 45 54 45 20 46 52 4f 4d 20 27 25 71 27 2e  ELETE FROM '%q'.
14d40 27 25 71 5f 72 6f 77 69 64 27 20 57 48 45 52 45  '%q_rowid' WHERE
14d50 20 72 6f 77 69 64 20 3d 20 3a 31 22 2c 0a 0a 20   rowid = :1",.. 
14d60 20 20 20 2f 2a 20 52 65 61 64 20 61 6e 64 20 77     /* Read and w
14d70 72 69 74 65 20 74 68 65 20 78 78 78 5f 70 61 72  rite the xxx_par
14d80 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  ent table */.   
14d90 20 22 53 45 4c 45 43 54 20 70 61 72 65 6e 74 6e   "SELECT parentn
14da0 6f 64 65 20 46 52 4f 4d 20 27 25 71 27 2e 27 25  ode FROM '%q'.'%
14db0 71 5f 70 61 72 65 6e 74 27 20 57 48 45 52 45 20  q_parent' WHERE 
14dc0 6e 6f 64 65 6e 6f 20 3d 20 3a 31 22 2c 0a 20 20  nodeno = :1",.  
14dd0 20 20 22 49 4e 53 45 52 54 20 4f 52 20 52 45 50    "INSERT OR REP
14de0 4c 41 43 45 20 49 4e 54 4f 20 27 25 71 27 2e 27  LACE INTO '%q'.'
14df0 25 71 5f 70 61 72 65 6e 74 27 20 56 41 4c 55 45  %q_parent' VALUE
14e00 53 28 3a 31 2c 20 3a 32 29 22 2c 0a 20 20 20 20  S(:1, :2)",.    
14e10 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 27 25 71  "DELETE FROM '%q
14e20 27 2e 27 25 71 5f 70 61 72 65 6e 74 27 20 57 48  '.'%q_parent' WH
14e30 45 52 45 20 6e 6f 64 65 6e 6f 20 3d 20 3a 31 22  ERE nodeno = :1"
14e40 0a 20 20 7d 3b 0a 20 20 73 71 6c 69 74 65 33 5f  .  };.  sqlite3_
14e50 73 74 6d 74 20 2a 2a 61 70 70 53 74 6d 74 5b 4e  stmt **appStmt[N
14e60 5f 53 54 41 54 45 4d 45 4e 54 5d 3b 0a 20 20 69  _STATEMENT];.  i
14e70 6e 74 20 69 3b 0a 0a 20 20 70 52 74 72 65 65 2d  nt i;..  pRtree-
14e80 3e 64 62 20 3d 20 64 62 3b 0a 0a 20 20 69 66 28  >db = db;..  if(
14e90 20 69 73 43 72 65 61 74 65 20 29 7b 0a 20 20 20   isCreate ){.   
14ea0 20 63 68 61 72 20 2a 7a 43 72 65 61 74 65 20 3d   char *zCreate =
14eb0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
14ec0 28 0a 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  (."CREATE TABLE 
14ed0 5c 22 25 77 5c 22 2e 5c 22 25 77 5f 6e 6f 64 65  \"%w\".\"%w_node
14ee0 5c 22 28 6e 6f 64 65 6e 6f 20 49 4e 54 45 47 45  \"(nodeno INTEGE
14ef0 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 64  R PRIMARY KEY, d
14f00 61 74 61 20 42 4c 4f 42 29 3b 22 0a 22 43 52 45  ata BLOB);"."CRE
14f10 41 54 45 20 54 41 42 4c 45 20 5c 22 25 77 5c 22  ATE TABLE \"%w\"
14f20 2e 5c 22 25 77 5f 72 6f 77 69 64 5c 22 28 72 6f  .\"%w_rowid\"(ro
14f30 77 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d  wid INTEGER PRIM
14f40 41 52 59 20 4b 45 59 2c 20 6e 6f 64 65 6e 6f 20  ARY KEY, nodeno 
14f50 49 4e 54 45 47 45 52 29 3b 22 0a 22 43 52 45 41  INTEGER);"."CREA
14f60 54 45 20 54 41 42 4c 45 20 5c 22 25 77 5c 22 2e  TE TABLE \"%w\".
14f70 5c 22 25 77 5f 70 61 72 65 6e 74 5c 22 28 6e 6f  \"%w_parent\"(no
14f80 64 65 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49  deno INTEGER PRI
14f90 4d 41 52 59 20 4b 45 59 2c 20 70 61 72 65 6e 74  MARY KEY, parent
14fa0 6e 6f 64 65 20 49 4e 54 45 47 45 52 29 3b 22 0a  node INTEGER);".
14fb0 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 27 25 71  "INSERT INTO '%q
14fc0 27 2e 27 25 71 5f 6e 6f 64 65 27 20 56 41 4c 55  '.'%q_node' VALU
14fd0 45 53 28 31 2c 20 7a 65 72 6f 62 6c 6f 62 28 25  ES(1, zeroblob(%
14fe0 64 29 29 22 2c 0a 20 20 20 20 20 20 7a 44 62 2c  d))",.      zDb,
14ff0 20 7a 50 72 65 66 69 78 2c 20 7a 44 62 2c 20 7a   zPrefix, zDb, z
15000 50 72 65 66 69 78 2c 20 7a 44 62 2c 20 7a 50 72  Prefix, zDb, zPr
15010 65 66 69 78 2c 20 7a 44 62 2c 20 7a 50 72 65 66  efix, zDb, zPref
15020 69 78 2c 20 70 52 74 72 65 65 2d 3e 69 4e 6f 64  ix, pRtree->iNod
15030 65 53 69 7a 65 0a 20 20 20 20 29 3b 0a 20 20 20  eSize.    );.   
15040 20 69 66 28 20 21 7a 43 72 65 61 74 65 20 29 7b   if( !zCreate ){
15050 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
15060 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
15070 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
15080 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 43 72 65  e3_exec(db, zCre
15090 61 74 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ate, 0, 0, 0);. 
150a0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
150b0 7a 43 72 65 61 74 65 29 3b 0a 20 20 20 20 69 66  zCreate);.    if
150c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
150d0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
150e0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  rc;.    }.  }.. 
150f0 20 61 70 70 53 74 6d 74 5b 30 5d 20 3d 20 26 70   appStmt[0] = &p
15100 52 74 72 65 65 2d 3e 70 52 65 61 64 4e 6f 64 65  Rtree->pReadNode
15110 3b 0a 20 20 61 70 70 53 74 6d 74 5b 31 5d 20 3d  ;.  appStmt[1] =
15120 20 26 70 52 74 72 65 65 2d 3e 70 57 72 69 74 65   &pRtree->pWrite
15130 4e 6f 64 65 3b 0a 20 20 61 70 70 53 74 6d 74 5b  Node;.  appStmt[
15140 32 5d 20 3d 20 26 70 52 74 72 65 65 2d 3e 70 44  2] = &pRtree->pD
15150 65 6c 65 74 65 4e 6f 64 65 3b 0a 20 20 61 70 70  eleteNode;.  app
15160 53 74 6d 74 5b 33 5d 20 3d 20 26 70 52 74 72 65  Stmt[3] = &pRtre
15170 65 2d 3e 70 52 65 61 64 52 6f 77 69 64 3b 0a 20  e->pReadRowid;. 
15180 20 61 70 70 53 74 6d 74 5b 34 5d 20 3d 20 26 70   appStmt[4] = &p
15190 52 74 72 65 65 2d 3e 70 57 72 69 74 65 52 6f 77  Rtree->pWriteRow
151a0 69 64 3b 0a 20 20 61 70 70 53 74 6d 74 5b 35 5d  id;.  appStmt[5]
151b0 20 3d 20 26 70 52 74 72 65 65 2d 3e 70 44 65 6c   = &pRtree->pDel
151c0 65 74 65 52 6f 77 69 64 3b 0a 20 20 61 70 70 53  eteRowid;.  appS
151d0 74 6d 74 5b 36 5d 20 3d 20 26 70 52 74 72 65 65  tmt[6] = &pRtree
151e0 2d 3e 70 52 65 61 64 50 61 72 65 6e 74 3b 0a 20  ->pReadParent;. 
151f0 20 61 70 70 53 74 6d 74 5b 37 5d 20 3d 20 26 70   appStmt[7] = &p
15200 52 74 72 65 65 2d 3e 70 57 72 69 74 65 50 61 72  Rtree->pWritePar
15210 65 6e 74 3b 0a 20 20 61 70 70 53 74 6d 74 5b 38  ent;.  appStmt[8
15220 5d 20 3d 20 26 70 52 74 72 65 65 2d 3e 70 44 65  ] = &pRtree->pDe
15230 6c 65 74 65 50 61 72 65 6e 74 3b 0a 0a 20 20 72  leteParent;..  r
15240 63 20 3d 20 72 74 72 65 65 51 75 65 72 79 53 74  c = rtreeQuerySt
15250 61 74 31 28 64 62 2c 20 70 52 74 72 65 65 29 3b  at1(db, pRtree);
15260 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 5f  .  for(i=0; i<N_
15270 53 54 41 54 45 4d 45 4e 54 20 26 26 20 72 63 3d  STATEMENT && rc=
15280 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29  =SQLITE_OK; i++)
15290 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c  {.    char *zSql
152a0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
152b0 74 66 28 61 7a 53 71 6c 5b 69 5d 2c 20 7a 44 62  tf(azSql[i], zDb
152c0 2c 20 7a 50 72 65 66 69 78 29 3b 0a 20 20 20 20  , zPrefix);.    
152d0 69 66 28 20 7a 53 71 6c 20 29 7b 0a 20 20 20 20  if( zSql ){.    
152e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
152f0 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53  repare_v2(db, zS
15300 71 6c 2c 20 2d 31 2c 20 61 70 70 53 74 6d 74 5b  ql, -1, appStmt[
15310 69 5d 2c 20 30 29 3b 20 0a 20 20 20 20 7d 65 6c  i], 0); .    }el
15320 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
15330 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
15340 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
15350 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 7d 0a 0a  ree(zSql);.  }..
15360 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
15370 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  /*.** The second
15380 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
15390 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61  s function conta
153a0 69 6e 73 20 74 68 65 20 74 65 78 74 20 6f 66 20  ins the text of 
153b0 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  an SQL statement
153c0 0a 2a 2a 20 74 68 61 74 20 72 65 74 75 72 6e 73  .** that returns
153d0 20 61 20 73 69 6e 67 6c 65 20 69 6e 74 65 67 65   a single intege
153e0 72 20 76 61 6c 75 65 2e 20 54 68 65 20 73 74 61  r value. The sta
153f0 74 65 6d 65 6e 74 20 69 73 20 63 6f 6d 70 69 6c  tement is compil
15400 65 64 20 61 6e 64 20 65 78 65 63 75 74 65 64 0a  ed and executed.
15410 2a 2a 20 75 73 69 6e 67 20 64 61 74 61 62 61 73  ** using databas
15420 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e  e connection db.
15430 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
15440 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75  the integer valu
15450 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 73  e returned.** is
15460 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 69 56   written to *piV
15470 61 6c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  al and SQLITE_OK
15480 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
15490 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20  wise, an SQLite 
154a0 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 73  error.** code is
154b0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
154c0 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 69 56 61  e value of *piVa
154d0 6c 20 61 66 74 65 72 20 72 65 74 75 72 6e 69 6e  l after returnin
154e0 67 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64  g is not defined
154f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15500 67 65 74 49 6e 74 46 72 6f 6d 53 74 6d 74 28 73  getIntFromStmt(s
15510 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
15520 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 69 6e  t char *zSql, in
15530 74 20 2a 70 69 56 61 6c 29 7b 0a 20 20 69 6e 74  t *piVal){.  int
15540 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
15550 45 4d 3b 0a 20 20 69 66 28 20 7a 53 71 6c 20 29  EM;.  if( zSql )
15560 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  {.    sqlite3_st
15570 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
15580 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
15590 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a  prepare_v2(db, z
155a0 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
155b0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d   0);.    if( rc=
155c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
155d0 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52      if( SQLITE_R
155e0 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
155f0 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20  (pStmt) ){.     
15600 20 20 20 2a 70 69 56 61 6c 20 3d 20 73 71 6c 69     *piVal = sqli
15610 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
15620 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  Stmt, 0);.      
15630 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  }.      rc = sql
15640 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
15650 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  tmt);.    }.  }.
15660 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
15670 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
15680 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 72  ion is called fr
15690 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 78 43  om within the xC
156a0 6f 6e 6e 65 63 74 28 29 20 6f 72 20 78 43 72 65  onnect() or xCre
156b0 61 74 65 28 29 20 6d 65 74 68 6f 64 20 74 6f 0a  ate() method to.
156c0 2a 2a 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  ** determine the
156d0 20 6e 6f 64 65 2d 73 69 7a 65 20 75 73 65 64 20   node-size used 
156e0 62 79 20 74 68 65 20 72 74 72 65 65 20 74 61 62  by the rtree tab
156f0 6c 65 20 62 65 69 6e 67 20 63 72 65 61 74 65 64  le being created
15700 20 6f 72 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a   or connected.**
15710 20 74 6f 2e 20 49 66 20 73 75 63 63 65 73 73 66   to. If successf
15720 75 6c 2c 20 70 52 74 72 65 65 2d 3e 69 4e 6f 64  ul, pRtree->iNod
15730 65 53 69 7a 65 20 69 73 20 70 6f 70 75 6c 61 74  eSize is populat
15740 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ed and SQLITE_OK
15750 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 4f 74   returned..** Ot
15760 68 65 72 77 69 73 65 2c 20 61 6e 20 53 51 4c 69  herwise, an SQLi
15770 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
15780 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
15790 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   If this functio
157a0 6e 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65  n is being calle
157b0 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20  d as part of an 
157c0 78 43 6f 6e 6e 65 63 74 28 29 2c 20 74 68 65 6e  xConnect(), then
157d0 20 74 68 65 20 72 74 72 65 65 0a 2a 2a 20 74 61   the rtree.** ta
157e0 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73  ble already exis
157f0 74 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ts. In this case
15800 20 74 68 65 20 6e 6f 64 65 2d 73 69 7a 65 20 69   the node-size i
15810 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
15820 69 6e 73 70 65 63 74 69 6e 67 0a 2a 2a 20 74 68  inspecting.** th
15830 65 20 72 6f 6f 74 20 6e 6f 64 65 20 6f 66 20 74  e root node of t
15840 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 4f  he tree..**.** O
15850 74 68 65 72 77 69 73 65 2c 20 66 6f 72 20 61 6e  therwise, for an
15860 20 78 43 72 65 61 74 65 28 29 2c 20 75 73 65 20   xCreate(), use 
15870 36 34 20 62 79 74 65 73 20 6c 65 73 73 20 74 68  64 bytes less th
15880 61 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  an the database 
15890 70 61 67 65 2d 73 69 7a 65 2e 20 0a 2a 2a 20 54  page-size. .** T
158a0 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74  his ensures that
158b0 20 65 61 63 68 20 6e 6f 64 65 20 69 73 20 73 74   each node is st
158c0 6f 72 65 64 20 6f 6e 20 61 20 73 69 6e 67 6c 65  ored on a single
158d0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20   database page. 
158e0 49 66 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62  If the .** datab
158f0 61 73 65 20 70 61 67 65 2d 73 69 7a 65 20 69 73  ase page-size is
15900 20 73 6f 20 6c 61 72 67 65 20 74 68 61 74 20 6d   so large that m
15910 6f 72 65 20 74 68 61 6e 20 52 54 52 45 45 5f 4d  ore than RTREE_M
15920 41 58 43 45 4c 4c 53 20 65 6e 74 72 69 65 73 20  AXCELLS entries 
15930 0a 2a 2a 20 77 6f 75 6c 64 20 66 69 74 20 69 6e  .** would fit in
15940 20 61 20 73 69 6e 67 6c 65 20 6e 6f 64 65 2c 20   a single node, 
15950 75 73 65 20 61 20 73 6d 61 6c 6c 65 72 20 6e 6f  use a smaller no
15960 64 65 2d 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  de-size..*/.stat
15970 69 63 20 69 6e 74 20 67 65 74 4e 6f 64 65 53 69  ic int getNodeSi
15980 7a 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ze(.  sqlite3 *d
15990 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
159a0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
159b0 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 52 74  e handle */.  Rt
159c0 72 65 65 20 2a 70 52 74 72 65 65 2c 20 20 20 20  ree *pRtree,    
159d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
159e0 20 52 74 72 65 65 20 68 61 6e 64 6c 65 20 2a 2f   Rtree handle */
159f0 0a 20 20 69 6e 74 20 69 73 43 72 65 61 74 65 2c  .  int isCreate,
15a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a10 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 78     /* True for x
15a20 43 72 65 61 74 65 2c 20 66 61 6c 73 65 20 66 6f  Create, false fo
15a30 72 20 78 43 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20  r xConnect */.  
15a40 63 68 61 72 20 2a 2a 70 7a 45 72 72 20 20 20 20  char **pzErr    
15a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a60 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20 6d 65  /* OUT: Error me
15a70 73 73 61 67 65 2c 20 69 66 20 61 6e 79 20 2a 2f  ssage, if any */
15a80 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
15a90 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 66  char *zSql;.  if
15aa0 28 20 69 73 43 72 65 61 74 65 20 29 7b 0a 20 20  ( isCreate ){.  
15ab0 20 20 69 6e 74 20 69 50 61 67 65 53 69 7a 65 20    int iPageSize 
15ac0 3d 20 30 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20  = 0;.    zSql = 
15ad0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
15ae0 22 50 52 41 47 4d 41 20 25 51 2e 70 61 67 65 5f  "PRAGMA %Q.page_
15af0 73 69 7a 65 22 2c 20 70 52 74 72 65 65 2d 3e 7a  size", pRtree->z
15b00 44 62 29 3b 0a 20 20 20 20 72 63 20 3d 20 67 65  Db);.    rc = ge
15b10 74 49 6e 74 46 72 6f 6d 53 74 6d 74 28 64 62 2c  tIntFromStmt(db,
15b20 20 7a 53 71 6c 2c 20 26 69 50 61 67 65 53 69 7a   zSql, &iPageSiz
15b30 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  e);.    if( rc==
15b40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15b50 20 20 20 70 52 74 72 65 65 2d 3e 69 4e 6f 64 65     pRtree->iNode
15b60 53 69 7a 65 20 3d 20 69 50 61 67 65 53 69 7a 65  Size = iPageSize
15b70 2d 36 34 3b 0a 20 20 20 20 20 20 69 66 28 20 28  -64;.      if( (
15b80 34 2b 70 52 74 72 65 65 2d 3e 6e 42 79 74 65 73  4+pRtree->nBytes
15b90 50 65 72 43 65 6c 6c 2a 52 54 52 45 45 5f 4d 41  PerCell*RTREE_MA
15ba0 58 43 45 4c 4c 53 29 3c 70 52 74 72 65 65 2d 3e  XCELLS)<pRtree->
15bb0 69 4e 6f 64 65 53 69 7a 65 20 29 7b 0a 20 20 20  iNodeSize ){.   
15bc0 20 20 20 20 20 70 52 74 72 65 65 2d 3e 69 4e 6f       pRtree->iNo
15bd0 64 65 53 69 7a 65 20 3d 20 34 2b 70 52 74 72 65  deSize = 4+pRtre
15be0 65 2d 3e 6e 42 79 74 65 73 50 65 72 43 65 6c 6c  e->nBytesPerCell
15bf0 2a 52 54 52 45 45 5f 4d 41 58 43 45 4c 4c 53 3b  *RTREE_MAXCELLS;
15c00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
15c10 73 65 7b 0a 20 20 20 20 20 20 2a 70 7a 45 72 72  se{.      *pzErr
15c20 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
15c30 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33  tf("%s", sqlite3
15c40 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20  _errmsg(db));.  
15c50 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
15c60 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
15c70 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  mprintf(.       
15c80 20 22 53 45 4c 45 43 54 20 6c 65 6e 67 74 68 28   "SELECT length(
15c90 64 61 74 61 29 20 46 52 4f 4d 20 27 25 71 27 2e  data) FROM '%q'.
15ca0 27 25 71 5f 6e 6f 64 65 27 20 57 48 45 52 45 20  '%q_node' WHERE 
15cb0 6e 6f 64 65 6e 6f 20 3d 20 31 22 2c 0a 20 20 20  nodeno = 1",.   
15cc0 20 20 20 20 20 70 52 74 72 65 65 2d 3e 7a 44 62       pRtree->zDb
15cd0 2c 20 70 52 74 72 65 65 2d 3e 7a 4e 61 6d 65 0a  , pRtree->zName.
15ce0 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20      );.    rc = 
15cf0 67 65 74 49 6e 74 46 72 6f 6d 53 74 6d 74 28 64  getIntFromStmt(d
15d00 62 2c 20 7a 53 71 6c 2c 20 26 70 52 74 72 65 65  b, zSql, &pRtree
15d10 2d 3e 69 4e 6f 64 65 53 69 7a 65 29 3b 0a 20 20  ->iNodeSize);.  
15d20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15d30 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 7a  _OK ){.      *pz
15d40 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Err = sqlite3_mp
15d50 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69  rintf("%s", sqli
15d60 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b  te3_errmsg(db));
15d70 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71  .    }.  }..  sq
15d80 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
15d90 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
15da0 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75  ../* .** This fu
15db0 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 20 69 6d  nction is the im
15dc0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
15dd0 62 6f 74 68 20 74 68 65 20 78 43 6f 6e 6e 65 63  both the xConnec
15de0 74 20 61 6e 64 20 78 43 72 65 61 74 65 0a 2a 2a  t and xCreate.**
15df0 20 6d 65 74 68 6f 64 73 20 6f 66 20 74 68 65 20   methods of the 
15e00 72 2d 74 72 65 65 20 76 69 72 74 75 61 6c 20 74  r-tree virtual t
15e10 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 61 72  able..**.**   ar
15e20 67 76 5b 30 5d 20 20 20 2d 3e 20 6d 6f 64 75 6c  gv[0]   -> modul
15e30 65 20 6e 61 6d 65 0a 2a 2a 20 20 20 61 72 67 76  e name.**   argv
15e40 5b 31 5d 20 20 20 2d 3e 20 64 61 74 61 62 61 73  [1]   -> databas
15e50 65 20 6e 61 6d 65 0a 2a 2a 20 20 20 61 72 67 76  e name.**   argv
15e60 5b 32 5d 20 20 20 2d 3e 20 74 61 62 6c 65 20 6e  [2]   -> table n
15e70 61 6d 65 0a 2a 2a 20 20 20 61 72 67 76 5b 2e 2e  ame.**   argv[..
15e80 2e 5d 20 2d 3e 20 63 6f 6c 75 6d 6e 20 6e 61 6d  .] -> column nam
15e90 65 73 2e 2e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  es....*/.static 
15ea0 69 6e 74 20 72 74 72 65 65 49 6e 69 74 28 0a 20  int rtreeInit(. 
15eb0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
15ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ed0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
15ee0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
15ef0 20 76 6f 69 64 20 2a 70 41 75 78 2c 20 20 20 20   void *pAux,    
15f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f10 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
15f20 68 65 20 52 54 52 45 45 5f 43 4f 4f 52 44 5f 2a  he RTREE_COORD_*
15f30 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20 20   constants */.  
15f40 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73 74 20  int argc, const 
15f50 63 68 61 72 20 2a 63 6f 6e 73 74 2a 61 72 67 76  char *const*argv
15f60 2c 20 20 20 2f 2a 20 50 61 72 61 6d 65 74 65 72  ,   /* Parameter
15f70 73 20 74 6f 20 43 52 45 41 54 45 20 54 41 42 4c  s to CREATE TABL
15f80 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  E statement */. 
15f90 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a   sqlite3_vtab **
15fa0 70 70 56 74 61 62 2c 20 20 20 20 20 20 20 20 20  ppVtab,         
15fb0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77       /* OUT: New
15fc0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a   virtual table *
15fd0 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72  /.  char **pzErr
15fe0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
15ff0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
16000 45 72 72 6f 72 20 6d 65 73 73 61 67 65 2c 20 69  Error message, i
16010 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 69  f any */.  int i
16020 73 43 72 65 61 74 65 20 20 20 20 20 20 20 20 20  sCreate         
16030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16040 2a 20 54 72 75 65 20 66 6f 72 20 78 43 72 65 61  * True for xCrea
16050 74 65 2c 20 66 61 6c 73 65 20 66 6f 72 20 78 43  te, false for xC
16060 6f 6e 6e 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69  onnect */.){.  i
16070 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
16080 4b 3b 0a 20 20 52 74 72 65 65 20 2a 70 52 74 72  K;.  Rtree *pRtr
16090 65 65 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 20 20  ee;.  int nDb;  
160a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
160b0 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20  ength of string 
160c0 61 72 67 76 5b 31 5d 20 2a 2f 0a 20 20 69 6e 74  argv[1] */.  int
160d0 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20   nName;         
160e0 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
160f0 73 74 72 69 6e 67 20 61 72 67 76 5b 32 5d 20 2a  string argv[2] *
16100 2f 0a 20 20 69 6e 74 20 65 43 6f 6f 72 64 54 79  /.  int eCoordTy
16110 70 65 20 3d 20 28 70 41 75 78 20 3f 20 52 54 52  pe = (pAux ? RTR
16120 45 45 5f 43 4f 4f 52 44 5f 49 4e 54 33 32 20 3a  EE_COORD_INT32 :
16130 20 52 54 52 45 45 5f 43 4f 4f 52 44 5f 52 45 41   RTREE_COORD_REA
16140 4c 33 32 29 3b 0a 0a 20 20 63 6f 6e 73 74 20 63  L32);..  const c
16150 68 61 72 20 2a 61 45 72 72 4d 73 67 5b 5d 20 3d  har *aErrMsg[] =
16160 20 7b 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20   {.    0,       
16170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16190 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
161a0 30 20 2a 2f 0a 20 20 20 20 22 57 72 6f 6e 67 20  0 */.    "Wrong 
161b0 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
161c0 73 20 66 6f 72 20 61 6e 20 72 74 72 65 65 20 74  s for an rtree t
161d0 61 62 6c 65 22 2c 20 20 20 20 20 20 20 20 20 2f  able",         /
161e0 2a 20 31 20 2a 2f 0a 20 20 20 20 22 54 6f 6f 20  * 1 */.    "Too 
161f0 66 65 77 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20  few columns for 
16200 61 6e 20 72 74 72 65 65 20 74 61 62 6c 65 22 2c  an rtree table",
16210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16220 20 2f 2a 20 32 20 2a 2f 0a 20 20 20 20 22 54 6f   /* 2 */.    "To
16230 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 66  o many columns f
16240 6f 72 20 61 6e 20 72 74 72 65 65 20 74 61 62 6c  or an rtree tabl
16250 65 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e"              
16260 20 20 20 2f 2a 20 33 20 2a 2f 0a 20 20 7d 3b 0a     /* 3 */.  };.
16270 0a 20 20 69 6e 74 20 69 45 72 72 20 3d 20 28 61  .  int iErr = (a
16280 72 67 63 3c 36 29 20 3f 20 32 20 3a 20 61 72 67  rgc<6) ? 2 : arg
16290 63 3e 28 52 54 52 45 45 5f 4d 41 58 5f 44 49 4d  c>(RTREE_MAX_DIM
162a0 45 4e 53 49 4f 4e 53 2a 32 2b 34 29 20 3f 20 33  ENSIONS*2+4) ? 3
162b0 20 3a 20 61 72 67 63 25 32 3b 0a 20 20 69 66 28   : argc%2;.  if(
162c0 20 61 45 72 72 4d 73 67 5b 69 45 72 72 5d 20 29   aErrMsg[iErr] )
162d0 7b 0a 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73  {.    *pzErr = s
162e0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
162f0 25 73 22 2c 20 61 45 72 72 4d 73 67 5b 69 45 72  %s", aErrMsg[iEr
16300 72 5d 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  r]);.    return 
16310 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
16320 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  }..  sqlite3_vta
16330 62 5f 63 6f 6e 66 69 67 28 64 62 2c 20 53 51 4c  b_config(db, SQL
16340 49 54 45 5f 56 54 41 42 5f 43 4f 4e 53 54 52 41  ITE_VTAB_CONSTRA
16350 49 4e 54 5f 53 55 50 50 4f 52 54 2c 20 31 29 3b  INT_SUPPORT, 1);
16360 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
16370 74 68 65 20 73 71 6c 69 74 65 33 5f 76 74 61 62  the sqlite3_vtab
16380 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
16390 6e 44 62 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  nDb = (int)strle
163a0 6e 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 6e 4e  n(argv[1]);.  nN
163b0 61 6d 65 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  ame = (int)strle
163c0 6e 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 70 52  n(argv[2]);.  pR
163d0 74 72 65 65 20 3d 20 28 52 74 72 65 65 20 2a 29  tree = (Rtree *)
163e0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73  sqlite3_malloc(s
163f0 69 7a 65 6f 66 28 52 74 72 65 65 29 2b 6e 44 62  izeof(Rtree)+nDb
16400 2b 6e 4e 61 6d 65 2b 32 29 3b 0a 20 20 69 66 28  +nName+2);.  if(
16410 20 21 70 52 74 72 65 65 20 29 7b 0a 20 20 20 20   !pRtree ){.    
16420 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
16430 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  MEM;.  }.  memse
16440 74 28 70 52 74 72 65 65 2c 20 30 2c 20 73 69 7a  t(pRtree, 0, siz
16450 65 6f 66 28 52 74 72 65 65 29 2b 6e 44 62 2b 6e  eof(Rtree)+nDb+n
16460 4e 61 6d 65 2b 32 29 3b 0a 20 20 70 52 74 72 65  Name+2);.  pRtre
16470 65 2d 3e 6e 42 75 73 79 20 3d 20 31 3b 0a 20 20  e->nBusy = 1;.  
16480 70 52 74 72 65 65 2d 3e 62 61 73 65 2e 70 4d 6f  pRtree->base.pMo
16490 64 75 6c 65 20 3d 20 26 72 74 72 65 65 4d 6f 64  dule = &rtreeMod
164a0 75 6c 65 3b 0a 20 20 70 52 74 72 65 65 2d 3e 7a  ule;.  pRtree->z
164b0 44 62 20 3d 20 28 63 68 61 72 20 2a 29 26 70 52  Db = (char *)&pR
164c0 74 72 65 65 5b 31 5d 3b 0a 20 20 70 52 74 72 65  tree[1];.  pRtre
164d0 65 2d 3e 7a 4e 61 6d 65 20 3d 20 26 70 52 74 72  e->zName = &pRtr
164e0 65 65 2d 3e 7a 44 62 5b 6e 44 62 2b 31 5d 3b 0a  ee->zDb[nDb+1];.
164f0 20 20 70 52 74 72 65 65 2d 3e 6e 44 69 6d 20 3d    pRtree->nDim =
16500 20 28 61 72 67 63 2d 34 29 2f 32 3b 0a 20 20 70   (argc-4)/2;.  p
16510 52 74 72 65 65 2d 3e 6e 42 79 74 65 73 50 65 72  Rtree->nBytesPer
16520 43 65 6c 6c 20 3d 20 38 20 2b 20 70 52 74 72 65  Cell = 8 + pRtre
16530 65 2d 3e 6e 44 69 6d 2a 34 2a 32 3b 0a 20 20 70  e->nDim*4*2;.  p
16540 52 74 72 65 65 2d 3e 65 43 6f 6f 72 64 54 79 70  Rtree->eCoordTyp
16550 65 20 3d 20 65 43 6f 6f 72 64 54 79 70 65 3b 0a  e = eCoordType;.
16560 20 20 6d 65 6d 63 70 79 28 70 52 74 72 65 65 2d    memcpy(pRtree-
16570 3e 7a 44 62 2c 20 61 72 67 76 5b 31 5d 2c 20 6e  >zDb, argv[1], n
16580 44 62 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 52  Db);.  memcpy(pR
16590 74 72 65 65 2d 3e 7a 4e 61 6d 65 2c 20 61 72 67  tree->zName, arg
165a0 76 5b 32 5d 2c 20 6e 4e 61 6d 65 29 3b 0a 0a 20  v[2], nName);.. 
165b0 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74   /* Figure out t
165c0 68 65 20 6e 6f 64 65 20 73 69 7a 65 20 74 6f 20  he node size to 
165d0 75 73 65 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 67  use. */.  rc = g
165e0 65 74 4e 6f 64 65 53 69 7a 65 28 64 62 2c 20 70  etNodeSize(db, p
165f0 52 74 72 65 65 2c 20 69 73 43 72 65 61 74 65 2c  Rtree, isCreate,
16600 20 70 7a 45 72 72 29 3b 0a 0a 20 20 2f 2a 20 43   pzErr);..  /* C
16610 72 65 61 74 65 2f 43 6f 6e 6e 65 63 74 20 74 6f  reate/Connect to
16620 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
16630 72 65 6c 61 74 69 6f 6e 61 6c 20 64 61 74 61 62  relational datab
16640 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 0a 20  ase schema. If. 
16650 20 2a 2a 20 74 68 61 74 20 69 73 20 73 75 63 63   ** that is succ
16660 65 73 73 66 75 6c 2c 20 63 61 6c 6c 20 73 71 6c  essful, call sql
16670 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61  ite3_declare_vta
16680 62 28 29 20 74 6f 20 63 6f 6e 66 69 67 75 72 65  b() to configure
16690 0a 20 20 2a 2a 20 74 68 65 20 72 2d 74 72 65 65  .  ** the r-tree
166a0 20 74 61 62 6c 65 20 73 63 68 65 6d 61 2e 0a 20   table schema.. 
166b0 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
166c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
166d0 66 28 20 28 72 63 20 3d 20 72 74 72 65 65 53 71  f( (rc = rtreeSq
166e0 6c 49 6e 69 74 28 70 52 74 72 65 65 2c 20 64 62  lInit(pRtree, db
166f0 2c 20 61 72 67 76 5b 31 5d 2c 20 61 72 67 76 5b  , argv[1], argv[
16700 32 5d 2c 20 69 73 43 72 65 61 74 65 29 29 20 29  2], isCreate)) )
16710 7b 0a 20 20 20 20 20 20 2a 70 7a 45 72 72 20 3d  {.      *pzErr =
16720 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
16730 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65  ("%s", sqlite3_e
16740 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20  rrmsg(db));.    
16750 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61  }else{.      cha
16760 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  r *zSql = sqlite
16770 33 5f 6d 70 72 69 6e 74 66 28 22 43 52 45 41 54  3_mprintf("CREAT
16780 45 20 54 41 42 4c 45 20 78 28 25 73 22 2c 20 61  E TABLE x(%s", a
16790 72 67 76 5b 33 5d 29 3b 0a 20 20 20 20 20 20 63  rgv[3]);.      c
167a0 68 61 72 20 2a 7a 54 6d 70 3b 0a 20 20 20 20 20  har *zTmp;.     
167b0 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 66   int ii;.      f
167c0 6f 72 28 69 69 3d 34 3b 20 7a 53 71 6c 20 26 26  or(ii=4; zSql &&
167d0 20 69 69 3c 61 72 67 63 3b 20 69 69 2b 2b 29 7b   ii<argc; ii++){
167e0 0a 20 20 20 20 20 20 20 20 7a 54 6d 70 20 3d 20  .        zTmp = 
167f0 7a 53 71 6c 3b 0a 20 20 20 20 20 20 20 20 7a 53  zSql;.        zS
16800 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
16810 69 6e 74 66 28 22 25 73 2c 20 25 73 22 2c 20 7a  intf("%s, %s", z
16820 54 6d 70 2c 20 61 72 67 76 5b 69 69 5d 29 3b 0a  Tmp, argv[ii]);.
16830 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
16840 66 72 65 65 28 7a 54 6d 70 29 3b 0a 20 20 20 20  free(zTmp);.    
16850 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 53    }.      if( zS
16860 71 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 54  ql ){.        zT
16870 6d 70 20 3d 20 7a 53 71 6c 3b 0a 20 20 20 20 20  mp = zSql;.     
16880 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
16890 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 29 3b 22  3_mprintf("%s);"
168a0 2c 20 7a 54 6d 70 29 3b 0a 20 20 20 20 20 20 20  , zTmp);.       
168b0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
168c0 6d 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  mp);.      }.   
168d0 20 20 20 69 66 28 20 21 7a 53 71 6c 20 29 7b 0a     if( !zSql ){.
168e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
168f0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
16900 20 7d 65 6c 73 65 20 69 66 28 20 53 51 4c 49 54   }else if( SQLIT
16910 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
16920 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62  te3_declare_vtab
16930 28 64 62 2c 20 7a 53 71 6c 29 29 20 29 7b 0a 20  (db, zSql)) ){. 
16940 20 20 20 20 20 20 20 2a 70 7a 45 72 72 20 3d 20         *pzErr = 
16950 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
16960 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  "%s", sqlite3_er
16970 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20 20  rmsg(db));.     
16980 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
16990 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20  _free(zSql);.   
169a0 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
169b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
169c0 20 20 20 2a 70 70 56 74 61 62 20 3d 20 28 73 71     *ppVtab = (sq
169d0 6c 69 74 65 33 5f 76 74 61 62 20 2a 29 70 52 74  lite3_vtab *)pRt
169e0 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ree;.  }else{.  
169f0 20 20 72 74 72 65 65 52 65 6c 65 61 73 65 28 70    rtreeRelease(p
16a00 52 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65  Rtree);.  }.  re
16a10 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
16a20 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
16a30 6e 20 6f 66 20 61 20 73 63 61 6c 61 72 20 66 75  n of a scalar fu
16a40 6e 63 74 69 6f 6e 20 74 68 61 74 20 64 65 63 6f  nction that deco
16a50 64 65 73 20 72 2d 74 72 65 65 20 6e 6f 64 65 73  des r-tree nodes
16a60 20 74 6f 0a 2a 2a 20 68 75 6d 61 6e 20 72 65 61   to.** human rea
16a70 64 61 62 6c 65 20 73 74 72 69 6e 67 73 2e 20 54  dable strings. T
16a80 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20  his can be used 
16a90 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 61 6e  for debugging an
16aa0 64 20 61 6e 61 6c 79 73 69 73 2e 0a 2a 2a 0a 2a  d analysis..**.*
16ab0 2a 20 54 68 65 20 73 63 61 6c 61 72 20 66 75 6e  * The scalar fun
16ac0 63 74 69 6f 6e 20 74 61 6b 65 73 20 74 77 6f 20  ction takes two 
16ad0 61 72 67 75 6d 65 6e 74 73 2c 20 61 20 62 6c 6f  arguments, a blo
16ae0 62 20 6f 66 20 64 61 74 61 20 63 6f 6e 74 61 69  b of data contai
16af0 6e 69 6e 67 0a 2a 2a 20 61 6e 20 72 2d 74 72 65  ning.** an r-tre
16b00 65 20 6e 6f 64 65 2c 20 61 6e 64 20 74 68 65 20  e node, and the 
16b10 6e 75 6d 62 65 72 20 6f 66 20 64 69 6d 65 6e 73  number of dimens
16b20 69 6f 6e 73 20 74 68 65 20 72 2d 74 72 65 65 20  ions the r-tree 
16b30 69 6e 64 65 78 65 73 2e 0a 2a 2a 20 46 6f 72 20  indexes..** For 
16b40 61 20 74 77 6f 2d 64 69 6d 65 6e 73 69 6f 6e 61  a two-dimensiona
16b50 6c 20 72 2d 74 72 65 65 20 73 74 72 75 63 74 75  l r-tree structu
16b60 72 65 20 63 61 6c 6c 65 64 20 22 72 74 22 2c 20  re called "rt", 
16b70 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 0a 2a  to deserialize.*
16b80 2a 20 61 6c 6c 20 6e 6f 64 65 73 2c 20 61 20 73  * all nodes, a s
16b90 74 61 74 65 6d 65 6e 74 20 6c 69 6b 65 3a 0a 2a  tatement like:.*
16ba0 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 72 74  *.**   SELECT rt
16bb0 72 65 65 6e 6f 64 65 28 32 2c 20 64 61 74 61 29  reenode(2, data)
16bc0 20 46 52 4f 4d 20 72 74 5f 6e 6f 64 65 3b 0a 2a   FROM rt_node;.*
16bd0 2a 0a 2a 2a 20 54 68 65 20 68 75 6d 61 6e 20 72  *.** The human r
16be0 65 61 64 61 62 6c 65 20 73 74 72 69 6e 67 20 74  eadable string t
16bf0 61 6b 65 73 20 74 68 65 20 66 6f 72 6d 20 6f 66  akes the form of
16c00 20 61 20 54 63 6c 20 6c 69 73 74 20 77 69 74 68   a Tcl list with
16c10 20 6f 6e 65 0a 2a 2a 20 65 6e 74 72 79 20 66 6f   one.** entry fo
16c20 72 20 65 61 63 68 20 63 65 6c 6c 20 69 6e 20 74  r each cell in t
16c30 68 65 20 72 2d 74 72 65 65 20 6e 6f 64 65 2e 20  he r-tree node. 
16c40 45 61 63 68 20 65 6e 74 72 79 20 69 73 20 69 74  Each entry is it
16c50 73 65 6c 66 20 61 0a 2a 2a 20 6c 69 73 74 2c 20  self a.** list, 
16c60 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 38  containing the 8
16c70 2d 62 79 74 65 20 72 6f 77 69 64 2f 70 61 67 65  -byte rowid/page
16c80 6e 6f 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74  no followed by t
16c90 68 65 20 0a 2a 2a 20 3c 6e 75 6d 2d 64 69 6d 65  he .** <num-dime
16ca0 6e 73 69 6f 6e 3e 2a 32 20 63 6f 6f 72 64 69 6e  nsion>*2 coordin
16cb0 61 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ates..*/.static 
16cc0 76 6f 69 64 20 72 74 72 65 65 6e 6f 64 65 28 73  void rtreenode(s
16cd0 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
16ce0 63 74 78 2c 20 69 6e 74 20 6e 41 72 67 2c 20 73  ctx, int nArg, s
16cf0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
16d00 70 41 72 67 29 7b 0a 20 20 63 68 61 72 20 2a 7a  pArg){.  char *z
16d10 54 65 78 74 20 3d 20 30 3b 0a 20 20 52 74 72 65  Text = 0;.  Rtre
16d20 65 4e 6f 64 65 20 6e 6f 64 65 3b 0a 20 20 52 74  eNode node;.  Rt
16d30 72 65 65 20 74 72 65 65 3b 0a 20 20 69 6e 74 20  ree tree;.  int 
16d40 69 69 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41  ii;..  UNUSED_PA
16d50 52 41 4d 45 54 45 52 28 6e 41 72 67 29 3b 0a 20  RAMETER(nArg);. 
16d60 20 6d 65 6d 73 65 74 28 26 6e 6f 64 65 2c 20 30   memset(&node, 0
16d70 2c 20 73 69 7a 65 6f 66 28 52 74 72 65 65 4e 6f  , sizeof(RtreeNo
16d80 64 65 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  de));.  memset(&
16d90 74 72 65 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  tree, 0, sizeof(
16da0 52 74 72 65 65 29 29 3b 0a 20 20 74 72 65 65 2e  Rtree));.  tree.
16db0 6e 44 69 6d 20 3d 20 73 71 6c 69 74 65 33 5f 76  nDim = sqlite3_v
16dc0 61 6c 75 65 5f 69 6e 74 28 61 70 41 72 67 5b 30  alue_int(apArg[0
16dd0 5d 29 3b 0a 20 20 74 72 65 65 2e 6e 42 79 74 65  ]);.  tree.nByte
16de0 73 50 65 72 43 65 6c 6c 20 3d 20 38 20 2b 20 38  sPerCell = 8 + 8
16df0 20 2a 20 74 72 65 65 2e 6e 44 69 6d 3b 0a 20 20   * tree.nDim;.  
16e00 6e 6f 64 65 2e 7a 44 61 74 61 20 3d 20 28 75 38  node.zData = (u8
16e10 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   *)sqlite3_value
16e20 5f 62 6c 6f 62 28 61 70 41 72 67 5b 31 5d 29 3b  _blob(apArg[1]);
16e30 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  ..  for(ii=0; ii
16e40 3c 4e 43 45 4c 4c 28 26 6e 6f 64 65 29 3b 20 69  <NCELL(&node); i
16e50 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 7a  i++){.    char z
16e60 43 65 6c 6c 5b 35 31 32 5d 3b 0a 20 20 20 20 69  Cell[512];.    i
16e70 6e 74 20 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20  nt nCell = 0;.  
16e80 20 20 52 74 72 65 65 43 65 6c 6c 20 63 65 6c 6c    RtreeCell cell
16e90 3b 0a 20 20 20 20 69 6e 74 20 6a 6a 3b 0a 0a 20  ;.    int jj;.. 
16ea0 20 20 20 6e 6f 64 65 47 65 74 43 65 6c 6c 28 26     nodeGetCell(&
16eb0 74 72 65 65 2c 20 26 6e 6f 64 65 2c 20 69 69 2c  tree, &node, ii,
16ec0 20 26 63 65 6c 6c 29 3b 0a 20 20 20 20 73 71 6c   &cell);.    sql
16ed0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 35 31  ite3_snprintf(51
16ee0 32 2d 6e 43 65 6c 6c 2c 26 7a 43 65 6c 6c 5b 6e  2-nCell,&zCell[n
16ef0 43 65 6c 6c 5d 2c 22 25 6c 6c 64 22 2c 20 63 65  Cell],"%lld", ce
16f00 6c 6c 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  ll.iRowid);.    
16f10 6e 43 65 6c 6c 20 3d 20 28 69 6e 74 29 73 74 72  nCell = (int)str
16f20 6c 65 6e 28 7a 43 65 6c 6c 29 3b 0a 20 20 20 20  len(zCell);.    
16f30 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 74 72 65  for(jj=0; jj<tre
16f40 65 2e 6e 44 69 6d 2a 32 3b 20 6a 6a 2b 2b 29 7b  e.nDim*2; jj++){
16f50 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16f60 52 54 52 45 45 5f 49 4e 54 5f 4f 4e 4c 59 0a 20  RTREE_INT_ONLY. 
16f70 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
16f80 72 69 6e 74 66 28 35 31 32 2d 6e 43 65 6c 6c 2c  rintf(512-nCell,
16f90 26 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 22  &zCell[nCell], "
16fa0 20 25 66 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %f",.          
16fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 64 6f               (do
16fc0 75 62 6c 65 29 63 65 6c 6c 2e 61 43 6f 6f 72 64  uble)cell.aCoord
16fd0 5b 6a 6a 5d 2e 66 29 3b 0a 23 65 6c 73 65 0a 20  [jj].f);.#else. 
16fe0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
16ff0 72 69 6e 74 66 28 35 31 32 2d 6e 43 65 6c 6c 2c  rintf(512-nCell,
17000 26 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 22  &zCell[nCell], "
17010 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %d",.          
17020 20 20 20 20 20 20 20 20 20 20 20 20 20 63 65 6c               cel
17030 6c 2e 61 43 6f 6f 72 64 5b 6a 6a 5d 2e 69 29 3b  l.aCoord[jj].i);
17040 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e 43  .#endif.      nC
17050 65 6c 6c 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  ell = (int)strle
17060 6e 28 7a 43 65 6c 6c 29 3b 0a 20 20 20 20 7d 0a  n(zCell);.    }.
17070 0a 20 20 20 20 69 66 28 20 7a 54 65 78 74 20 29  .    if( zText )
17080 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54  {.      char *zT
17090 65 78 74 4e 65 77 20 3d 20 73 71 6c 69 74 65 33  extNew = sqlite3
170a0 5f 6d 70 72 69 6e 74 66 28 22 25 73 20 7b 25 73  _mprintf("%s {%s
170b0 7d 22 2c 20 7a 54 65 78 74 2c 20 7a 43 65 6c 6c  }", zText, zCell
170c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
170d0 5f 66 72 65 65 28 7a 54 65 78 74 29 3b 0a 20 20  _free(zText);.  
170e0 20 20 20 20 7a 54 65 78 74 20 3d 20 7a 54 65 78      zText = zTex
170f0 74 4e 65 77 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  tNew;.    }else{
17100 0a 20 20 20 20 20 20 7a 54 65 78 74 20 3d 20 73  .      zText = s
17110 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
17120 7b 25 73 7d 22 2c 20 7a 43 65 6c 6c 29 3b 0a 20  {%s}", zCell);. 
17130 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 73 71     }.  }.  .  sq
17140 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
17150 74 28 63 74 78 2c 20 7a 54 65 78 74 2c 20 2d 31  t(ctx, zText, -1
17160 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b  , sqlite3_free);
17170 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
17180 72 74 72 65 65 64 65 70 74 68 28 73 71 6c 69 74  rtreedepth(sqlit
17190 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c  e3_context *ctx,
171a0 20 69 6e 74 20 6e 41 72 67 2c 20 73 71 6c 69 74   int nArg, sqlit
171b0 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72 67  e3_value **apArg
171c0 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
171d0 4d 45 54 45 52 28 6e 41 72 67 29 3b 0a 20 20 69  METER(nArg);.  i
171e0 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f( sqlite3_value
171f0 5f 74 79 70 65 28 61 70 41 72 67 5b 30 5d 29 21  _type(apArg[0])!
17200 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 0a 20 20  =SQLITE_BLOB .  
17210 20 7c 7c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   || sqlite3_valu
17220 65 5f 62 79 74 65 73 28 61 70 41 72 67 5b 30 5d  e_bytes(apArg[0]
17230 29 3c 32 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c  )<2.  ){.    sql
17240 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
17250 72 28 63 74 78 2c 20 22 49 6e 76 61 6c 69 64 20  r(ctx, "Invalid 
17260 61 72 67 75 6d 65 6e 74 20 74 6f 20 72 74 72 65  argument to rtre
17270 65 64 65 70 74 68 28 29 22 2c 20 2d 31 29 3b 20  edepth()", -1); 
17280 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38  .  }else{.    u8
17290 20 2a 7a 42 6c 6f 62 20 3d 20 28 75 38 20 2a 29   *zBlob = (u8 *)
172a0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
172b0 6f 62 28 61 70 41 72 67 5b 30 5d 29 3b 0a 20 20  ob(apArg[0]);.  
172c0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
172d0 5f 69 6e 74 28 63 74 78 2c 20 72 65 61 64 49 6e  _int(ctx, readIn
172e0 74 31 36 28 7a 42 6c 6f 62 29 29 3b 0a 20 20 7d  t16(zBlob));.  }
172f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  .}../*.** Regist
17300 65 72 20 74 68 65 20 72 2d 74 72 65 65 20 6d 6f  er the r-tree mo
17310 64 75 6c 65 20 77 69 74 68 20 64 61 74 61 62 61  dule with databa
17320 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 20 54 68  se handle db. Th
17330 69 73 20 63 72 65 61 74 65 73 20 74 68 65 0a 2a  is creates the.*
17340 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  * virtual table 
17350 6d 6f 64 75 6c 65 20 22 72 74 72 65 65 22 20 61  module "rtree" a
17360 6e 64 20 74 68 65 20 64 65 62 75 67 67 69 6e 67  nd the debugging
17370 2f 61 6e 61 6c 79 73 69 73 20 73 63 61 6c 61 72  /analysis scalar
17380 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 22 72   .** function "r
17390 74 72 65 65 6e 6f 64 65 22 2e 0a 2a 2f 0a 69 6e  treenode"..*/.in
173a0 74 20 73 71 6c 69 74 65 33 52 74 72 65 65 49 6e  t sqlite3RtreeIn
173b0 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  it(sqlite3 *db){
173c0 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 75 74 66  .  const int utf
173d0 38 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  8 = SQLITE_UTF8;
173e0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63  .  int rc;..  rc
173f0 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
17400 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22  e_function(db, "
17410 72 74 72 65 65 6e 6f 64 65 22 2c 20 32 2c 20 75  rtreenode", 2, u
17420 74 66 38 2c 20 30 2c 20 72 74 72 65 65 6e 6f 64  tf8, 0, rtreenod
17430 65 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  e, 0, 0);.  if( 
17440 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
17450 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
17460 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
17470 6e 28 64 62 2c 20 22 72 74 72 65 65 64 65 70 74  n(db, "rtreedept
17480 68 22 2c 20 31 2c 20 75 74 66 38 2c 20 30 2c 72  h", 1, utf8, 0,r
17490 74 72 65 65 64 65 70 74 68 2c 20 30 2c 20 30 29  treedepth, 0, 0)
174a0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
174b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66  SQLITE_OK ){.#if
174c0 64 65 66 20 53 51 4c 49 54 45 5f 52 54 52 45 45  def SQLITE_RTREE
174d0 5f 49 4e 54 5f 4f 4e 4c 59 0a 20 20 20 20 76 6f  _INT_ONLY.    vo
174e0 69 64 20 2a 63 20 3d 20 28 76 6f 69 64 20 2a 29  id *c = (void *)
174f0 52 54 52 45 45 5f 43 4f 4f 52 44 5f 49 4e 54 33  RTREE_COORD_INT3
17500 32 3b 0a 23 65 6c 73 65 0a 20 20 20 20 76 6f 69  2;.#else.    voi
17510 64 20 2a 63 20 3d 20 28 76 6f 69 64 20 2a 29 52  d *c = (void *)R
17520 54 52 45 45 5f 43 4f 4f 52 44 5f 52 45 41 4c 33  TREE_COORD_REAL3
17530 32 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63  2;.#endif.    rc
17540 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
17550 65 5f 6d 6f 64 75 6c 65 5f 76 32 28 64 62 2c 20  e_module_v2(db, 
17560 22 72 74 72 65 65 22 2c 20 26 72 74 72 65 65 4d  "rtree", &rtreeM
17570 6f 64 75 6c 65 2c 20 63 2c 20 30 29 3b 0a 20 20  odule, c, 0);.  
17580 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
17590 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 76 6f 69  TE_OK ){.    voi
175a0 64 20 2a 63 20 3d 20 28 76 6f 69 64 20 2a 29 52  d *c = (void *)R
175b0 54 52 45 45 5f 43 4f 4f 52 44 5f 49 4e 54 33 32  TREE_COORD_INT32
175c0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
175d0 65 33 5f 63 72 65 61 74 65 5f 6d 6f 64 75 6c 65  e3_create_module
175e0 5f 76 32 28 64 62 2c 20 22 72 74 72 65 65 5f 69  _v2(db, "rtree_i
175f0 33 32 22 2c 20 26 72 74 72 65 65 4d 6f 64 75 6c  32", &rtreeModul
17600 65 2c 20 63 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  e, c, 0);.  }.. 
17610 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
17620 2a 0a 2a 2a 20 41 20 76 65 72 73 69 6f 6e 20 6f  *.** A version o
17630 66 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29  f sqlite3_free()
17640 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65   that can be use
17650 64 20 61 73 20 61 20 63 61 6c 6c 62 61 63 6b 2e  d as a callback.
17660 20 54 68 69 73 20 69 73 20 75 73 65 64 0a 2a 2a   This is used.**
17670 20 69 6e 20 74 77 6f 20 70 6c 61 63 65 73 20 2d   in two places -
17680 20 61 73 20 74 68 65 20 64 65 73 74 72 75 63 74   as the destruct
17690 6f 72 20 66 6f 72 20 74 68 65 20 62 6c 6f 62 20  or for the blob 
176a0 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
176b0 79 20 74 68 65 0a 2a 2a 20 69 6e 76 6f 63 61 74  y the.** invocat
176c0 69 6f 6e 20 6f 66 20 61 20 67 65 6f 6d 65 74 72  ion of a geometr
176d0 79 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e 64 20  y function, and 
176e0 61 73 20 74 68 65 20 64 65 73 74 72 75 63 74 6f  as the destructo
176f0 72 20 66 6f 72 20 74 68 65 20 67 65 6f 6d 65 74  r for the geomet
17700 72 79 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20  ry.** functions 
17710 74 68 65 6d 73 65 6c 76 65 73 2e 0a 2a 2f 0a 73  themselves..*/.s
17720 74 61 74 69 63 20 76 6f 69 64 20 64 6f 53 71 6c  tatic void doSql
17730 69 74 65 33 46 72 65 65 28 76 6f 69 64 20 2a 70  ite3Free(void *p
17740 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  ){.  sqlite3_fre
17750 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  e(p);.}../*.** E
17760 61 63 68 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ach call to sqli
17770 74 65 33 5f 72 74 72 65 65 5f 67 65 6f 6d 65 74  te3_rtree_geomet
17780 72 79 5f 63 61 6c 6c 62 61 63 6b 28 29 20 63 72  ry_callback() cr
17790 65 61 74 65 73 20 61 6e 20 6f 72 64 69 6e 61 72  eates an ordinar
177a0 79 20 53 51 4c 69 74 65 0a 2a 2a 20 73 63 61 6c  y SQLite.** scal
177b0 61 72 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e  ar user function
177c0 2e 20 54 68 69 73 20 43 20 66 75 6e 63 74 69 6f  . This C functio
177d0 6e 20 69 73 20 74 68 65 20 63 61 6c 6c 62 61 63  n is the callbac
177e0 6b 20 75 73 65 64 20 66 6f 72 20 61 6c 6c 20 73  k used for all s
177f0 75 63 68 0a 2a 2a 20 72 65 67 69 73 74 65 72 65  uch.** registere
17800 64 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 2e  d SQL functions.
17810 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 61 6c 61  .**.** The scala
17820 72 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 73  r user functions
17830 20 72 65 74 75 72 6e 20 61 20 62 6c 6f 62 20 74   return a blob t
17840 68 61 74 20 69 73 20 69 6e 74 65 72 70 72 65 74  hat is interpret
17850 65 64 20 62 79 20 72 2d 74 72 65 65 0a 2a 2a 20  ed by r-tree.** 
17860 74 61 62 6c 65 20 4d 41 54 43 48 20 6f 70 65 72  table MATCH oper
17870 61 74 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ators..*/.static
17880 20 76 6f 69 64 20 67 65 6f 6d 43 61 6c 6c 62 61   void geomCallba
17890 63 6b 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  ck(sqlite3_conte
178a0 78 74 20 2a 63 74 78 2c 20 69 6e 74 20 6e 41 72  xt *ctx, int nAr
178b0 67 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  g, sqlite3_value
178c0 20 2a 2a 61 41 72 67 29 7b 0a 20 20 52 74 72 65   **aArg){.  Rtre
178d0 65 47 65 6f 6d 43 61 6c 6c 62 61 63 6b 20 2a 70  eGeomCallback *p
178e0 47 65 6f 6d 43 74 78 20 3d 20 28 52 74 72 65 65  GeomCtx = (Rtree
178f0 47 65 6f 6d 43 61 6c 6c 62 61 63 6b 20 2a 29 73  GeomCallback *)s
17900 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
17910 28 63 74 78 29 3b 0a 20 20 52 74 72 65 65 4d 61  (ctx);.  RtreeMa
17920 74 63 68 41 72 67 20 2a 70 42 6c 6f 62 3b 0a 20  tchArg *pBlob;. 
17930 20 69 6e 74 20 6e 42 6c 6f 62 3b 0a 0a 20 20 6e   int nBlob;..  n
17940 42 6c 6f 62 20 3d 20 73 69 7a 65 6f 66 28 52 74  Blob = sizeof(Rt
17950 72 65 65 4d 61 74 63 68 41 72 67 29 20 2b 20 28  reeMatchArg) + (
17960 6e 41 72 67 2d 31 29 2a 73 69 7a 65 6f 66 28 52  nArg-1)*sizeof(R
17970 74 72 65 65 44 56 61 6c 75 65 29 3b 0a 20 20 70  treeDValue);.  p
17980 42 6c 6f 62 20 3d 20 28 52 74 72 65 65 4d 61 74  Blob = (RtreeMat
17990 63 68 41 72 67 20 2a 29 73 71 6c 69 74 65 33 5f  chArg *)sqlite3_
179a0 6d 61 6c 6c 6f 63 28 6e 42 6c 6f 62 29 3b 0a 20  malloc(nBlob);. 
179b0 20 69 66 28 20 21 70 42 6c 6f 62 20 29 7b 0a 20   if( !pBlob ){. 
179c0 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
179d0 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 74  t_error_nomem(ct
179e0 78 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  x);.  }else{.   
179f0 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 42 6c 6f   int i;.    pBlo
17a00 62 2d 3e 6d 61 67 69 63 20 3d 20 52 54 52 45 45  b->magic = RTREE
17a10 5f 47 45 4f 4d 45 54 52 59 5f 4d 41 47 49 43 3b  _GEOMETRY_MAGIC;
17a20 0a 20 20 20 20 70 42 6c 6f 62 2d 3e 78 47 65 6f  .    pBlob->xGeo
17a30 6d 20 3d 20 70 47 65 6f 6d 43 74 78 2d 3e 78 47  m = pGeomCtx->xG
17a40 65 6f 6d 3b 0a 20 20 20 20 70 42 6c 6f 62 2d 3e  eom;.    pBlob->
17a50 70 43 6f 6e 74 65 78 74 20 3d 20 70 47 65 6f 6d  pContext = pGeom
17a60 43 74 78 2d 3e 70 43 6f 6e 74 65 78 74 3b 0a 20  Ctx->pContext;. 
17a70 20 20 20 70 42 6c 6f 62 2d 3e 6e 50 61 72 61 6d     pBlob->nParam
17a80 20 3d 20 6e 41 72 67 3b 0a 20 20 20 20 66 6f 72   = nArg;.    for
17a90 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
17aa0 2b 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  +){.#ifdef SQLIT
17ab0 45 5f 52 54 52 45 45 5f 49 4e 54 5f 4f 4e 4c 59  E_RTREE_INT_ONLY
17ac0 0a 20 20 20 20 20 20 70 42 6c 6f 62 2d 3e 61 50  .      pBlob->aP
17ad0 61 72 61 6d 5b 69 5d 20 3d 20 73 71 6c 69 74 65  aram[i] = sqlite
17ae0 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 41  3_value_int64(aA
17af0 72 67 5b 69 5d 29 3b 0a 23 65 6c 73 65 0a 20 20  rg[i]);.#else.  
17b00 20 20 20 20 70 42 6c 6f 62 2d 3e 61 50 61 72 61      pBlob->aPara
17b10 6d 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 5f 76  m[i] = sqlite3_v
17b20 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 41 72 67  alue_double(aArg
17b30 5b 69 5d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  [i]);.#endif.   
17b40 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72   }.    sqlite3_r
17b50 65 73 75 6c 74 5f 62 6c 6f 62 28 63 74 78 2c 20  esult_blob(ctx, 
17b60 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 2c 20 64 6f  pBlob, nBlob, do
17b70 53 71 6c 69 74 65 33 46 72 65 65 29 3b 0a 20 20  Sqlite3Free);.  
17b80 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  }.}../*.** Regis
17b90 74 65 72 20 61 20 6e 65 77 20 67 65 6f 6d 65 74  ter a new geomet
17ba0 72 79 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  ry function for 
17bb0 75 73 65 20 77 69 74 68 20 74 68 65 20 72 2d 74  use with the r-t
17bc0 72 65 65 20 4d 41 54 43 48 20 6f 70 65 72 61 74  ree MATCH operat
17bd0 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  or..*/.int sqlit
17be0 65 33 5f 72 74 72 65 65 5f 67 65 6f 6d 65 74 72  e3_rtree_geometr
17bf0 79 5f 63 61 6c 6c 62 61 63 6b 28 0a 20 20 73 71  y_callback(.  sq
17c00 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e  lite3 *db,.  con
17c10 73 74 20 63 68 61 72 20 2a 7a 47 65 6f 6d 2c 0a  st char *zGeom,.
17c20 20 20 69 6e 74 20 28 2a 78 47 65 6f 6d 29 28 73    int (*xGeom)(s
17c30 71 6c 69 74 65 33 5f 72 74 72 65 65 5f 67 65 6f  qlite3_rtree_geo
17c40 6d 65 74 72 79 20 2a 2c 20 69 6e 74 2c 20 52 74  metry *, int, Rt
17c50 72 65 65 44 56 61 6c 75 65 20 2a 2c 20 69 6e 74  reeDValue *, int
17c60 20 2a 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f   *),.  void *pCo
17c70 6e 74 65 78 74 0a 29 7b 0a 20 20 52 74 72 65 65  ntext.){.  Rtree
17c80 47 65 6f 6d 43 61 6c 6c 62 61 63 6b 20 2a 70 47  GeomCallback *pG
17c90 65 6f 6d 43 74 78 3b 20 20 20 20 20 20 2f 2a 20  eomCtx;      /* 
17ca0 43 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 66  Context object f
17cb0 6f 72 20 6e 65 77 20 75 73 65 72 2d 66 75 6e 63  or new user-func
17cc0 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c  tion */..  /* Al
17cd0 6c 6f 63 61 74 65 20 61 6e 64 20 70 6f 70 75 6c  locate and popul
17ce0 61 74 65 20 74 68 65 20 63 6f 6e 74 65 78 74 20  ate the context 
17cf0 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 70 47 65  object. */.  pGe
17d00 6f 6d 43 74 78 20 3d 20 28 52 74 72 65 65 47 65  omCtx = (RtreeGe
17d10 6f 6d 43 61 6c 6c 62 61 63 6b 20 2a 29 73 71 6c  omCallback *)sql
17d20 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65  ite3_malloc(size
17d30 6f 66 28 52 74 72 65 65 47 65 6f 6d 43 61 6c 6c  of(RtreeGeomCall
17d40 62 61 63 6b 29 29 3b 0a 20 20 69 66 28 20 21 70  back));.  if( !p
17d50 47 65 6f 6d 43 74 78 20 29 20 72 65 74 75 72 6e  GeomCtx ) return
17d60 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
17d70 20 70 47 65 6f 6d 43 74 78 2d 3e 78 47 65 6f 6d   pGeomCtx->xGeom
17d80 20 3d 20 78 47 65 6f 6d 3b 0a 20 20 70 47 65 6f   = xGeom;.  pGeo
17d90 6d 43 74 78 2d 3e 70 43 6f 6e 74 65 78 74 20 3d  mCtx->pContext =
17da0 20 70 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a   pContext;..  /*
17db0 20 43 72 65 61 74 65 20 74 68 65 20 6e 65 77 20   Create the new 
17dc0 75 73 65 72 2d 66 75 6e 63 74 69 6f 6e 2e 20 52  user-function. R
17dd0 65 67 69 73 74 65 72 20 61 20 64 65 73 74 72 75  egister a destru
17de0 63 74 6f 72 20 66 75 6e 63 74 69 6f 6e 20 74 6f  ctor function to
17df0 20 64 65 6c 65 74 65 0a 20 20 2a 2a 20 74 68 65   delete.  ** the
17e00 20 63 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74 20   context object 
17e10 77 68 65 6e 20 69 74 20 69 73 20 6e 6f 20 6c 6f  when it is no lo
17e20 6e 67 65 72 20 72 65 71 75 69 72 65 64 2e 20 20  nger required.  
17e30 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  */.  return sqli
17e40 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
17e50 69 6f 6e 5f 76 32 28 64 62 2c 20 7a 47 65 6f 6d  ion_v2(db, zGeom
17e60 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 41 4e 59  , -1, SQLITE_ANY
17e70 2c 20 0a 20 20 20 20 20 20 28 76 6f 69 64 20 2a  , .      (void *
17e80 29 70 47 65 6f 6d 43 74 78 2c 20 67 65 6f 6d 43  )pGeomCtx, geomC
17e90 61 6c 6c 62 61 63 6b 2c 20 30 2c 20 30 2c 20 64  allback, 0, 0, d
17ea0 6f 53 71 6c 69 74 65 33 46 72 65 65 0a 20 20 29  oSqlite3Free.  )
17eb0 3b 0a 7d 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  ;.}..#if !SQLITE
17ec0 5f 43 4f 52 45 0a 23 69 66 64 65 66 20 5f 57 49  _CORE.#ifdef _WI
17ed0 4e 33 32 0a 5f 5f 64 65 63 6c 73 70 65 63 28 64  N32.__declspec(d
17ee0 6c 6c 65 78 70 6f 72 74 29 0a 23 65 6e 64 69 66  llexport).#endif
17ef0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 72 74 72  .int sqlite3_rtr
17f00 65 65 5f 69 6e 69 74 28 0a 20 20 73 71 6c 69 74  ee_init(.  sqlit
17f10 65 33 20 2a 64 62 2c 0a 20 20 63 68 61 72 20 2a  e3 *db,.  char *
17f20 2a 70 7a 45 72 72 4d 73 67 2c 0a 20 20 63 6f 6e  *pzErrMsg,.  con
17f30 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72  st sqlite3_api_r
17f40 6f 75 74 69 6e 65 73 20 2a 70 41 70 69 0a 29 7b  outines *pApi.){
17f50 0a 20 20 53 51 4c 49 54 45 5f 45 58 54 45 4e 53  .  SQLITE_EXTENS
17f60 49 4f 4e 5f 49 4e 49 54 32 28 70 41 70 69 29 0a  ION_INIT2(pApi).
17f70 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
17f80 52 74 72 65 65 49 6e 69 74 28 64 62 29 3b 0a 7d  RtreeInit(db);.}
17f90 0a 23 65 6e 64 69 66 0a 0a 23 65 6e 64 69 66 0a  .#endif..#endif.