/ Hex Artifact Content
Login

Artifact bc61010e978b5b8ae6dbb90274a2fbb5db5ff5e2880b5c6e8abd48eea77264db:


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 5c 0a 20 20 7c 7c 20 28 64  _CORE) \.  || (d
0910: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
0920: 41 42 4c 45 5f 52 54 52 45 45 29 20 26 26 20 21  ABLE_RTREE) && !
0930: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
0940: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
0950: 29 29 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ))..#ifndef SQLI
0960: 54 45 5f 43 4f 52 45 0a 20 20 23 69 6e 63 6c 75  TE_CORE.  #inclu
0970: 64 65 20 22 73 71 6c 69 74 65 33 65 78 74 2e 68  de "sqlite3ext.h
0980: 22 0a 20 20 53 51 4c 49 54 45 5f 45 58 54 45 4e  ".  SQLITE_EXTEN
0990: 53 49 4f 4e 5f 49 4e 49 54 31 0a 23 65 6c 73 65  SION_INIT1.#else
09a0: 0a 20 20 23 69 6e 63 6c 75 64 65 20 22 73 71 6c  .  #include "sql
09b0: 69 74 65 33 2e 68 22 0a 23 65 6e 64 69 66 0a 0a  ite3.h".#endif..
09c0: 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67  #include <string
09d0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73  .h>.#include <as
09e0: 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  sert.h>.#include
09f0: 20 3c 73 74 64 69 6f 2e 68 3e 0a 0a 23 69 66 6e   <stdio.h>..#ifn
0a00: 64 65 66 20 53 51 4c 49 54 45 5f 41 4d 41 4c 47  def SQLITE_AMALG
0a10: 41 4d 41 54 49 4f 4e 0a 23 69 6e 63 6c 75 64 65  AMATION.#include
0a20: 20 22 73 71 6c 69 74 65 33 72 74 72 65 65 2e 68   "sqlite3rtree.h
0a30: 22 0a 74 79 70 65 64 65 66 20 73 71 6c 69 74 65  ".typedef sqlite
0a40: 33 5f 69 6e 74 36 34 20 69 36 34 3b 0a 74 79 70  3_int64 i64;.typ
0a50: 65 64 65 66 20 73 71 6c 69 74 65 33 5f 75 69 6e  edef sqlite3_uin
0a60: 74 36 34 20 75 36 34 3b 0a 74 79 70 65 64 65 66  t64 u64;.typedef
0a70: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 75   unsigned char u
0a80: 38 3b 0a 74 79 70 65 64 65 66 20 75 6e 73 69 67  8;.typedef unsig
0a90: 6e 65 64 20 73 68 6f 72 74 20 75 31 36 3b 0a 74  ned short u16;.t
0aa0: 79 70 65 64 65 66 20 75 6e 73 69 67 6e 65 64 20  ypedef unsigned 
0ab0: 69 6e 74 20 75 33 32 3b 0a 23 65 6e 64 69 66 0a  int u32;.#endif.
0ac0: 0a 2f 2a 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ./*  The followi
0ad0: 6e 67 20 6d 61 63 72 6f 20 69 73 20 75 73 65 64  ng macro is used
0ae0: 20 74 6f 20 73 75 70 70 72 65 73 73 20 63 6f 6d   to suppress com
0af0: 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 2e 0a  piler warnings..
0b00: 2a 2f 0a 23 69 66 6e 64 65 66 20 55 4e 55 53 45  */.#ifndef UNUSE
0b10: 44 5f 50 41 52 41 4d 45 54 45 52 0a 23 20 64 65  D_PARAMETER.# de
0b20: 66 69 6e 65 20 55 4e 55 53 45 44 5f 50 41 52 41  fine UNUSED_PARA
0b30: 4d 45 54 45 52 28 78 29 20 28 76 6f 69 64 29 28  METER(x) (void)(
0b40: 78 29 0a 23 65 6e 64 69 66 0a 0a 74 79 70 65 64  x).#endif..typed
0b50: 65 66 20 73 74 72 75 63 74 20 52 74 72 65 65 20  ef struct Rtree 
0b60: 52 74 72 65 65 3b 0a 74 79 70 65 64 65 66 20 73  Rtree;.typedef s
0b70: 74 72 75 63 74 20 52 74 72 65 65 43 75 72 73 6f  truct RtreeCurso
0b80: 72 20 52 74 72 65 65 43 75 72 73 6f 72 3b 0a 74  r RtreeCursor;.t
0b90: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 52 74  ypedef struct Rt
0ba0: 72 65 65 4e 6f 64 65 20 52 74 72 65 65 4e 6f 64  reeNode RtreeNod
0bb0: 65 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  e;.typedef struc
0bc0: 74 20 52 74 72 65 65 43 65 6c 6c 20 52 74 72 65  t RtreeCell Rtre
0bd0: 65 43 65 6c 6c 3b 0a 74 79 70 65 64 65 66 20 73  eCell;.typedef s
0be0: 74 72 75 63 74 20 52 74 72 65 65 43 6f 6e 73 74  truct RtreeConst
0bf0: 72 61 69 6e 74 20 52 74 72 65 65 43 6f 6e 73 74  raint RtreeConst
0c00: 72 61 69 6e 74 3b 0a 74 79 70 65 64 65 66 20 73  raint;.typedef s
0c10: 74 72 75 63 74 20 52 74 72 65 65 4d 61 74 63 68  truct RtreeMatch
0c20: 41 72 67 20 52 74 72 65 65 4d 61 74 63 68 41 72  Arg RtreeMatchAr
0c30: 67 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  g;.typedef struc
0c40: 74 20 52 74 72 65 65 47 65 6f 6d 43 61 6c 6c 62  t RtreeGeomCallb
0c50: 61 63 6b 20 52 74 72 65 65 47 65 6f 6d 43 61 6c  ack RtreeGeomCal
0c60: 6c 62 61 63 6b 3b 0a 74 79 70 65 64 65 66 20 75  lback;.typedef u
0c70: 6e 69 6f 6e 20 52 74 72 65 65 43 6f 6f 72 64 20  nion RtreeCoord 
0c80: 52 74 72 65 65 43 6f 6f 72 64 3b 0a 74 79 70 65  RtreeCoord;.type
0c90: 64 65 66 20 73 74 72 75 63 74 20 52 74 72 65 65  def struct Rtree
0ca0: 53 65 61 72 63 68 50 6f 69 6e 74 20 52 74 72 65  SearchPoint Rtre
0cb0: 65 53 65 61 72 63 68 50 6f 69 6e 74 3b 0a 0a 2f  eSearchPoint;../
0cc0: 2a 20 54 68 65 20 72 74 72 65 65 20 6d 61 79 20  * The rtree may 
0cd0: 68 61 76 65 20 62 65 74 77 65 65 6e 20 31 20 61  have between 1 a
0ce0: 6e 64 20 52 54 52 45 45 5f 4d 41 58 5f 44 49 4d  nd RTREE_MAX_DIM
0cf0: 45 4e 53 49 4f 4e 53 20 64 69 6d 65 6e 73 69 6f  ENSIONS dimensio
0d00: 6e 73 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 52  ns. */.#define R
0d10: 54 52 45 45 5f 4d 41 58 5f 44 49 4d 45 4e 53 49  TREE_MAX_DIMENSI
0d20: 4f 4e 53 20 35 0a 0a 2f 2a 20 53 69 7a 65 20 6f  ONS 5../* Size o
0d30: 66 20 68 61 73 68 20 74 61 62 6c 65 20 52 74 72  f hash table Rtr
0d40: 65 65 2e 61 48 61 73 68 2e 20 54 68 69 73 20 68  ee.aHash. This h
0d50: 61 73 68 20 74 61 62 6c 65 20 69 73 20 6e 6f 74  ash table is not
0d60: 20 65 78 70 65 63 74 65 64 20 74 6f 0a 2a 2a 20   expected to.** 
0d70: 65 76 65 72 20 63 6f 6e 74 61 69 6e 20 76 65 72  ever contain ver
0d80: 79 20 6d 61 6e 79 20 65 6e 74 72 69 65 73 2c 20  y many entries, 
0d90: 73 6f 20 61 20 66 69 78 65 64 20 6e 75 6d 62 65  so a fixed numbe
0da0: 72 20 6f 66 20 62 75 63 6b 65 74 73 20 69 73 20  r of buckets is 
0db0: 0a 2a 2a 20 75 73 65 64 2e 0a 2a 2f 0a 23 64 65  .** used..*/.#de
0dc0: 66 69 6e 65 20 48 41 53 48 53 49 5a 45 20 39 37  fine HASHSIZE 97
0dd0: 0a 0a 2f 2a 20 54 68 65 20 78 42 65 73 74 49 6e  ../* The xBestIn
0de0: 64 65 78 20 6d 65 74 68 6f 64 20 6f 66 20 74 68  dex method of th
0df0: 69 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  is virtual table
0e00: 20 72 65 71 75 69 72 65 73 20 61 6e 20 65 73 74   requires an est
0e10: 69 6d 61 74 65 20 6f 66 0a 2a 2a 20 74 68 65 20  imate of.** the 
0e20: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
0e30: 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  n the virtual ta
0e40: 62 6c 65 20 74 6f 20 63 61 6c 63 75 6c 61 74 65  ble to calculate
0e50: 20 74 68 65 20 63 6f 73 74 73 20 6f 66 0a 2a 2a   the costs of.**
0e60: 20 76 61 72 69 6f 75 73 20 73 74 72 61 74 65 67   various strateg
0e70: 69 65 73 2e 20 49 66 20 70 6f 73 73 69 62 6c 65  ies. If possible
0e80: 2c 20 74 68 69 73 20 65 73 74 69 6d 61 74 65 20  , this estimate 
0e90: 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 74  is loaded from t
0ea0: 68 65 0a 2a 2a 20 73 71 6c 69 74 65 5f 73 74 61  he.** sqlite_sta
0eb0: 74 31 20 74 61 62 6c 65 20 28 77 69 74 68 20 52  t1 table (with R
0ec0: 54 52 45 45 5f 4d 49 4e 5f 52 4f 57 45 53 54 20  TREE_MIN_ROWEST 
0ed0: 61 73 20 61 20 68 61 72 64 2d 63 6f 64 65 64 20  as a hard-coded 
0ee0: 6d 69 6e 69 6d 75 6d 29 2e 0a 2a 2a 20 4f 74 68  minimum)..** Oth
0ef0: 65 72 77 69 73 65 2c 20 69 66 20 6e 6f 20 73 71  erwise, if no sq
0f00: 6c 69 74 65 5f 73 74 61 74 31 20 65 6e 74 72 79  lite_stat1 entry
0f10: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 75   is available, u
0f20: 73 65 20 0a 2a 2a 20 52 54 52 45 45 5f 44 45 46  se .** RTREE_DEF
0f30: 41 55 4c 54 5f 52 4f 57 45 53 54 2e 0a 2a 2f 0a  AULT_ROWEST..*/.
0f40: 23 64 65 66 69 6e 65 20 52 54 52 45 45 5f 44 45  #define RTREE_DE
0f50: 46 41 55 4c 54 5f 52 4f 57 45 53 54 20 31 30 34  FAULT_ROWEST 104
0f60: 38 35 37 36 0a 23 64 65 66 69 6e 65 20 52 54 52  8576.#define RTR
0f70: 45 45 5f 4d 49 4e 5f 52 4f 57 45 53 54 20 20 20  EE_MIN_ROWEST   
0f80: 20 20 20 20 20 20 31 30 30 0a 0a 2f 2a 20 0a 2a        100../* .*
0f90: 2a 20 41 6e 20 72 74 72 65 65 20 76 69 72 74 75  * An rtree virtu
0fa0: 61 6c 2d 74 61 62 6c 65 20 6f 62 6a 65 63 74 2e  al-table object.
0fb0: 0a 2a 2f 0a 73 74 72 75 63 74 20 52 74 72 65 65  .*/.struct Rtree
0fc0: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61   {.  sqlite3_vta
0fd0: 62 20 62 61 73 65 3b 20 20 20 20 20 20 20 20 20  b base;         
0fe0: 20 2f 2a 20 42 61 73 65 20 63 6c 61 73 73 2e 20   /* Base class. 
0ff0: 20 4d 75 73 74 20 62 65 20 66 69 72 73 74 20 2a   Must be first *
1000: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
1010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1020: 2f 2a 20 48 6f 73 74 20 64 61 74 61 62 61 73 65  /* Host database
1030: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
1040: 20 69 6e 74 20 69 4e 6f 64 65 53 69 7a 65 3b 20   int iNodeSize; 
1050: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1060: 53 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66  Size in bytes of
1070: 20 65 61 63 68 20 6e 6f 64 65 20 69 6e 20 74 68   each node in th
1080: 65 20 6e 6f 64 65 20 74 61 62 6c 65 20 2a 2f 0a  e node table */.
1090: 20 20 75 38 20 6e 44 69 6d 3b 20 20 20 20 20 20    u8 nDim;      
10a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10b0: 20 4e 75 6d 62 65 72 20 6f 66 20 64 69 6d 65 6e   Number of dimen
10c0: 73 69 6f 6e 73 20 2a 2f 0a 20 20 75 38 20 6e 44  sions */.  u8 nD
10d0: 69 6d 32 3b 20 20 20 20 20 20 20 20 20 20 20 20  im2;            
10e0: 20 20 20 20 20 20 20 2f 2a 20 54 77 69 63 65 20         /* Twice 
10f0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 64 69  the number of di
1100: 6d 65 6e 73 69 6f 6e 73 20 2a 2f 0a 20 20 75 38  mensions */.  u8
1110: 20 65 43 6f 6f 72 64 54 79 70 65 3b 20 20 20 20   eCoordType;    
1120: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 54 52            /* RTR
1130: 45 45 5f 43 4f 4f 52 44 5f 52 45 41 4c 33 32 20  EE_COORD_REAL32 
1140: 6f 72 20 52 54 52 45 45 5f 43 4f 4f 52 44 5f 49  or RTREE_COORD_I
1150: 4e 54 33 32 20 2a 2f 0a 20 20 75 38 20 6e 42 79  NT32 */.  u8 nBy
1160: 74 65 73 50 65 72 43 65 6c 6c 3b 20 20 20 20 20  tesPerCell;     
1170: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 63        /* Bytes c
1180: 6f 6e 73 75 6d 65 64 20 70 65 72 20 63 65 6c 6c  onsumed per cell
1190: 20 2a 2f 0a 20 20 75 38 20 69 6e 57 72 54 72 61   */.  u8 inWrTra
11a0: 6e 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ns;             
11b0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 73    /* True if ins
11c0: 69 64 65 20 77 72 69 74 65 20 74 72 61 6e 73 61  ide write transa
11d0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
11e0: 44 65 70 74 68 3b 20 20 20 20 20 20 20 20 20 20  Depth;          
11f0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
1200: 74 20 64 65 70 74 68 20 6f 66 20 74 68 65 20 72  t depth of the r
1210: 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  -tree structure 
1220: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b 20  */.  char *zDb; 
1230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1240: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 64 61 74 61   /* Name of data
1250: 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  base containing 
1260: 72 2d 74 72 65 65 20 74 61 62 6c 65 20 2a 2f 0a  r-tree table */.
1270: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20    char *zName;  
1280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1290: 20 4e 61 6d 65 20 6f 66 20 72 2d 74 72 65 65 20   Name of r-tree 
12a0: 74 61 62 6c 65 20 2a 2f 20 0a 20 20 75 33 32 20  table */ .  u32 
12b0: 6e 42 75 73 79 3b 20 20 20 20 20 20 20 20 20 20  nBusy;          
12c0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
12d0: 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 75 73 65  nt number of use
12e0: 72 73 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  rs of this struc
12f0: 74 75 72 65 20 2a 2f 0a 20 20 69 36 34 20 6e 52  ture */.  i64 nR
1300: 6f 77 45 73 74 3b 20 20 20 20 20 20 20 20 20 20  owEst;          
1310: 20 20 20 20 20 20 2f 2a 20 45 73 74 69 6d 61 74        /* Estimat
1320: 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ed number of row
1330: 73 20 69 6e 20 74 68 69 73 20 74 61 62 6c 65 20  s in this table 
1340: 2a 2f 0a 20 20 75 33 32 20 6e 43 75 72 73 6f 72  */.  u32 nCursor
1350: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1360: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 70   /* Number of op
1370: 65 6e 20 63 75 72 73 6f 72 73 20 2a 2f 0a 0a 20  en cursors */.. 
1380: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6e 6f 64 65   /* List of node
1390: 73 20 72 65 6d 6f 76 65 64 20 64 75 72 69 6e 67  s removed during
13a0: 20 61 20 43 6f 6e 64 65 6e 73 65 54 72 65 65 20   a CondenseTree 
13b0: 6f 70 65 72 61 74 69 6f 6e 2e 20 4c 69 73 74 20  operation. List 
13c0: 69 73 0a 20 20 2a 2a 20 6c 69 6e 6b 65 64 20 74  is.  ** linked t
13d0: 6f 67 65 74 68 65 72 20 76 69 61 20 74 68 65 20  ogether via the 
13e0: 70 6f 69 6e 74 65 72 20 6e 6f 72 6d 61 6c 6c 79  pointer normally
13f0: 20 75 73 65 64 20 66 6f 72 20 68 61 73 68 20 63   used for hash c
1400: 68 61 69 6e 73 20 2d 0a 20 20 2a 2a 20 52 74 72  hains -.  ** Rtr
1410: 65 65 4e 6f 64 65 2e 70 4e 65 78 74 2e 20 52 74  eeNode.pNext. Rt
1420: 72 65 65 4e 6f 64 65 2e 69 4e 6f 64 65 20 73 74  reeNode.iNode st
1430: 6f 72 65 73 20 74 68 65 20 64 65 70 74 68 20 6f  ores the depth o
1440: 66 20 74 68 65 20 73 75 62 2d 74 72 65 65 20 0a  f the sub-tree .
1450: 20 20 2a 2a 20 68 65 61 64 65 64 20 62 79 20 74    ** headed by t
1460: 68 65 20 6e 6f 64 65 20 28 6c 65 61 66 20 6e 6f  he node (leaf no
1470: 64 65 73 20 68 61 76 65 20 52 74 72 65 65 4e 6f  des have RtreeNo
1480: 64 65 2e 69 4e 6f 64 65 3d 3d 30 29 2e 0a 20 20  de.iNode==0)..  
1490: 2a 2f 0a 20 20 52 74 72 65 65 4e 6f 64 65 20 2a  */.  RtreeNode *
14a0: 70 44 65 6c 65 74 65 64 3b 0a 20 20 69 6e 74 20  pDeleted;.  int 
14b0: 69 52 65 69 6e 73 65 72 74 48 65 69 67 68 74 3b  iReinsertHeight;
14c0: 20 20 20 20 20 20 20 20 2f 2a 20 48 65 69 67 68          /* Heigh
14d0: 74 20 6f 66 20 73 75 62 2d 74 72 65 65 73 20 52  t of sub-trees R
14e0: 65 69 6e 73 65 72 74 28 29 20 68 61 73 20 72 75  einsert() has ru
14f0: 6e 20 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 42 6c  n on */..  /* Bl
1500: 6f 62 20 49 2f 4f 20 6f 6e 20 78 78 78 5f 6e 6f  ob I/O on xxx_no
1510: 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
1520: 62 6c 6f 62 20 2a 70 4e 6f 64 65 42 6c 6f 62 3b  blob *pNodeBlob;
1530: 0a 0a 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74  ..  /* Statement
1540: 73 20 74 6f 20 72 65 61 64 2f 77 72 69 74 65 2f  s to read/write/
1550: 64 65 6c 65 74 65 20 61 20 72 65 63 6f 72 64 20  delete a record 
1560: 66 72 6f 6d 20 78 78 78 5f 6e 6f 64 65 20 2a 2f  from xxx_node */
1570: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
1580: 2a 70 57 72 69 74 65 4e 6f 64 65 3b 0a 20 20 73  *pWriteNode;.  s
1590: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 44 65  qlite3_stmt *pDe
15a0: 6c 65 74 65 4e 6f 64 65 3b 0a 0a 20 20 2f 2a 20  leteNode;..  /* 
15b0: 53 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 72 65  Statements to re
15c0: 61 64 2f 77 72 69 74 65 2f 64 65 6c 65 74 65 20  ad/write/delete 
15d0: 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 78 78  a record from xx
15e0: 78 5f 72 6f 77 69 64 20 2a 2f 0a 20 20 73 71 6c  x_rowid */.  sql
15f0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 52 65 61 64  ite3_stmt *pRead
1600: 52 6f 77 69 64 3b 0a 20 20 73 71 6c 69 74 65 33  Rowid;.  sqlite3
1610: 5f 73 74 6d 74 20 2a 70 57 72 69 74 65 52 6f 77  _stmt *pWriteRow
1620: 69 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  id;.  sqlite3_st
1630: 6d 74 20 2a 70 44 65 6c 65 74 65 52 6f 77 69 64  mt *pDeleteRowid
1640: 3b 0a 0a 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e  ;..  /* Statemen
1650: 74 73 20 74 6f 20 72 65 61 64 2f 77 72 69 74 65  ts to read/write
1660: 2f 64 65 6c 65 74 65 20 61 20 72 65 63 6f 72 64  /delete a record
1670: 20 66 72 6f 6d 20 78 78 78 5f 70 61 72 65 6e 74   from xxx_parent
1680: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
1690: 6d 74 20 2a 70 52 65 61 64 50 61 72 65 6e 74 3b  mt *pReadParent;
16a0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
16b0: 2a 70 57 72 69 74 65 50 61 72 65 6e 74 3b 0a 20  *pWriteParent;. 
16c0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
16d0: 44 65 6c 65 74 65 50 61 72 65 6e 74 3b 0a 0a 20  DeleteParent;.. 
16e0: 20 52 74 72 65 65 4e 6f 64 65 20 2a 61 48 61 73   RtreeNode *aHas
16f0: 68 5b 48 41 53 48 53 49 5a 45 5d 3b 20 2f 2a 20  h[HASHSIZE]; /* 
1700: 48 61 73 68 20 74 61 62 6c 65 20 6f 66 20 69 6e  Hash table of in
1710: 2d 6d 65 6d 6f 72 79 20 6e 6f 64 65 73 2e 20 2a  -memory nodes. *
1720: 2f 20 0a 7d 3b 0a 0a 2f 2a 20 50 6f 73 73 69 62  / .};../* Possib
1730: 6c 65 20 76 61 6c 75 65 73 20 66 6f 72 20 52 74  le values for Rt
1740: 72 65 65 2e 65 43 6f 6f 72 64 54 79 70 65 3a 20  ree.eCoordType: 
1750: 2a 2f 0a 23 64 65 66 69 6e 65 20 52 54 52 45 45  */.#define RTREE
1760: 5f 43 4f 4f 52 44 5f 52 45 41 4c 33 32 20 30 0a  _COORD_REAL32 0.
1770: 23 64 65 66 69 6e 65 20 52 54 52 45 45 5f 43 4f  #define RTREE_CO
1780: 4f 52 44 5f 49 4e 54 33 32 20 20 31 0a 0a 2f 2a  ORD_INT32  1../*
1790: 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 52 54  .** If SQLITE_RT
17a0: 52 45 45 5f 49 4e 54 5f 4f 4e 4c 59 20 69 73 20  REE_INT_ONLY is 
17b0: 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 74 68  defined, then th
17c0: 69 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  is virtual table
17d0: 20 77 69 6c 6c 0a 2a 2a 20 6f 6e 6c 79 20 64 65   will.** only de
17e0: 61 6c 20 77 69 74 68 20 69 6e 74 65 67 65 72 20  al with integer 
17f0: 63 6f 6f 72 64 69 6e 61 74 65 73 2e 20 20 4e 6f  coordinates.  No
1800: 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
1810: 6f 70 65 72 61 74 69 6f 6e 73 0a 2a 2a 20 77 69  operations.** wi
1820: 6c 6c 20 62 65 20 64 6f 6e 65 2e 0a 2a 2f 0a 23  ll be done..*/.#
1830: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 52 54 52  ifdef SQLITE_RTR
1840: 45 45 5f 49 4e 54 5f 4f 4e 4c 59 0a 20 20 74 79  EE_INT_ONLY.  ty
1850: 70 65 64 65 66 20 73 71 6c 69 74 65 33 5f 69 6e  pedef sqlite3_in
1860: 74 36 34 20 52 74 72 65 65 44 56 61 6c 75 65 3b  t64 RtreeDValue;
1870: 20 20 20 20 20 20 20 2f 2a 20 48 69 67 68 20 61         /* High a
1880: 63 63 75 72 61 63 79 20 63 6f 6f 72 64 69 6e 61  ccuracy coordina
1890: 74 65 20 2a 2f 0a 20 20 74 79 70 65 64 65 66 20  te */.  typedef 
18a0: 69 6e 74 20 52 74 72 65 65 56 61 6c 75 65 3b 20  int RtreeValue; 
18b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c0: 20 2f 2a 20 4c 6f 77 20 61 63 63 75 72 61 63 79   /* Low accuracy
18d0: 20 63 6f 6f 72 64 69 6e 61 74 65 20 2a 2f 0a 23   coordinate */.#
18e0: 20 64 65 66 69 6e 65 20 52 54 52 45 45 5f 5a 45   define RTREE_ZE
18f0: 52 4f 20 30 0a 23 65 6c 73 65 0a 20 20 74 79 70  RO 0.#else.  typ
1900: 65 64 65 66 20 64 6f 75 62 6c 65 20 52 74 72 65  edef double Rtre
1910: 65 44 56 61 6c 75 65 3b 20 20 20 20 20 20 20 20  eDValue;        
1920: 20 20 20 20 20 20 2f 2a 20 48 69 67 68 20 61 63        /* High ac
1930: 63 75 72 61 63 79 20 63 6f 6f 72 64 69 6e 61 74  curacy coordinat
1940: 65 20 2a 2f 0a 20 20 74 79 70 65 64 65 66 20 66  e */.  typedef f
1950: 6c 6f 61 74 20 52 74 72 65 65 56 61 6c 75 65 3b  loat RtreeValue;
1960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1970: 2f 2a 20 4c 6f 77 20 61 63 63 75 72 61 63 79 20  /* Low accuracy 
1980: 63 6f 6f 72 64 69 6e 61 74 65 20 2a 2f 0a 23 20  coordinate */.# 
1990: 64 65 66 69 6e 65 20 52 54 52 45 45 5f 5a 45 52  define RTREE_ZER
19a0: 4f 20 30 2e 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  O 0.0.#endif../*
19b0: 0a 2a 2a 20 57 68 65 6e 20 64 6f 69 6e 67 20 61  .** When doing a
19c0: 20 73 65 61 72 63 68 20 6f 66 20 61 6e 20 72 2d   search of an r-
19d0: 74 72 65 65 2c 20 69 6e 73 74 61 6e 63 65 73 20  tree, instances 
19e0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
19f0: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 72 65   structure.** re
1a00: 63 6f 72 64 20 69 6e 74 65 72 6d 65 64 69 61 74  cord intermediat
1a10: 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 74  e results from t
1a20: 68 65 20 74 72 65 65 20 77 61 6c 6b 2e 0a 2a 2a  he tree walk..**
1a30: 0a 2a 2a 20 54 68 65 20 69 64 20 69 73 20 61 6c  .** The id is al
1a40: 77 61 79 73 20 61 20 6e 6f 64 65 2d 69 64 2e 20  ways a node-id. 
1a50: 20 46 6f 72 20 69 4c 65 76 65 6c 3e 3d 31 20 74   For iLevel>=1 t
1a60: 68 65 20 69 64 20 69 73 20 74 68 65 20 6e 6f 64  he id is the nod
1a70: 65 2d 69 64 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  e-id of.** the n
1a80: 6f 64 65 20 74 68 61 74 20 74 68 65 20 52 74 72  ode that the Rtr
1a90: 65 65 53 65 61 72 63 68 50 6f 69 6e 74 20 72 65  eeSearchPoint re
1aa0: 70 72 65 73 65 6e 74 73 2e 20 20 57 68 65 6e 20  presents.  When 
1ab0: 69 4c 65 76 65 6c 3d 3d 30 2c 20 68 6f 77 65 76  iLevel==0, howev
1ac0: 65 72 2c 0a 2a 2a 20 74 68 65 20 69 64 20 69 73  er,.** the id is
1ad0: 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 6e   of the parent n
1ae0: 6f 64 65 20 61 6e 64 20 74 68 65 20 63 65 6c 6c  ode and the cell
1af0: 20 74 68 61 74 20 52 74 72 65 65 53 65 61 72 63   that RtreeSearc
1b00: 68 50 6f 69 6e 74 0a 2a 2a 20 72 65 70 72 65 73  hPoint.** repres
1b10: 65 6e 74 73 20 69 73 20 74 68 65 20 69 43 65 6c  ents is the iCel
1b20: 6c 2d 74 68 20 65 6e 74 72 79 20 69 6e 20 74 68  l-th entry in th
1b30: 65 20 70 61 72 65 6e 74 20 6e 6f 64 65 2e 0a 2a  e parent node..*
1b40: 2f 0a 73 74 72 75 63 74 20 52 74 72 65 65 53 65  /.struct RtreeSe
1b50: 61 72 63 68 50 6f 69 6e 74 20 7b 0a 20 20 52 74  archPoint {.  Rt
1b60: 72 65 65 44 56 61 6c 75 65 20 72 53 63 6f 72 65  reeDValue rScore
1b70: 3b 20 20 20 20 2f 2a 20 54 68 65 20 73 63 6f 72  ;    /* The scor
1b80: 65 20 66 6f 72 20 74 68 69 73 20 6e 6f 64 65 2e  e for this node.
1b90: 20 20 53 6d 61 6c 6c 65 73 74 20 67 6f 65 73 20    Smallest goes 
1ba0: 66 69 72 73 74 2e 20 2a 2f 0a 20 20 73 71 6c 69  first. */.  sqli
1bb0: 74 65 33 5f 69 6e 74 36 34 20 69 64 3b 20 20 20  te3_int64 id;   
1bc0: 20 20 20 2f 2a 20 4e 6f 64 65 20 49 44 20 2a 2f     /* Node ID */
1bd0: 0a 20 20 75 38 20 69 4c 65 76 65 6c 3b 20 20 20  .  u8 iLevel;   
1be0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 3d 65            /* 0=e
1bf0: 6e 74 72 69 65 73 2e 20 20 31 3d 6c 65 61 66 20  ntries.  1=leaf 
1c00: 6e 6f 64 65 2e 20 20 32 2b 20 66 6f 72 20 68 69  node.  2+ for hi
1c10: 67 68 65 72 20 2a 2f 0a 20 20 75 38 20 65 57 69  gher */.  u8 eWi
1c20: 74 68 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20  thin;           
1c30: 20 2f 2a 20 50 41 52 54 4c 59 5f 57 49 54 48 49   /* PARTLY_WITHI
1c40: 4e 20 6f 72 20 46 55 4c 4c 59 5f 57 49 54 48 49  N or FULLY_WITHI
1c50: 4e 20 2a 2f 0a 20 20 75 38 20 69 43 65 6c 6c 3b  N */.  u8 iCell;
1c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c70: 20 43 65 6c 6c 20 69 6e 64 65 78 20 77 69 74 68   Cell index with
1c80: 69 6e 20 74 68 65 20 6e 6f 64 65 20 2a 2f 0a 7d  in the node */.}
1c90: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e  ;../*.** The min
1ca0: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63  imum number of c
1cb0: 65 6c 6c 73 20 61 6c 6c 6f 77 65 64 20 66 6f 72  ells allowed for
1cc0: 20 61 20 6e 6f 64 65 20 69 73 20 61 20 74 68 69   a node is a thi
1cd0: 72 64 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6d 61  rd of the .** ma
1ce0: 78 69 6d 75 6d 2e 20 49 6e 20 47 75 74 6d 61 6e  ximum. In Gutman
1cf0: 27 73 20 6e 6f 74 61 74 69 6f 6e 3a 0a 2a 2a 0a  's notation:.**.
1d00: 2a 2a 20 20 20 20 20 6d 20 3d 20 4d 2f 33 0a 2a  **     m = M/3.*
1d10: 2a 0a 2a 2a 20 49 66 20 61 6e 20 52 2a 2d 74 72  *.** If an R*-tr
1d20: 65 65 20 22 52 65 69 6e 73 65 72 74 22 20 6f 70  ee "Reinsert" op
1d30: 65 72 61 74 69 6f 6e 20 69 73 20 72 65 71 75 69  eration is requi
1d40: 72 65 64 2c 20 74 68 65 20 73 61 6d 65 20 6e 75  red, the same nu
1d50: 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73  mber of.** cells
1d60: 20 61 72 65 20 72 65 6d 6f 76 65 64 20 66 72 6f   are removed fro
1d70: 6d 20 74 68 65 20 6f 76 65 72 66 75 6c 6c 20 6e  m the overfull n
1d80: 6f 64 65 20 61 6e 64 20 72 65 69 6e 73 65 72 74  ode and reinsert
1d90: 65 64 20 69 6e 74 6f 20 74 68 65 20 74 72 65 65  ed into the tree
1da0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 52 54 52  ..*/.#define RTR
1db0: 45 45 5f 4d 49 4e 43 45 4c 4c 53 28 70 29 20 28  EE_MINCELLS(p) (
1dc0: 28 28 28 70 29 2d 3e 69 4e 6f 64 65 53 69 7a 65  (((p)->iNodeSize
1dd0: 2d 34 29 2f 28 70 29 2d 3e 6e 42 79 74 65 73 50  -4)/(p)->nBytesP
1de0: 65 72 43 65 6c 6c 29 2f 33 29 0a 23 64 65 66 69  erCell)/3).#defi
1df0: 6e 65 20 52 54 52 45 45 5f 52 45 49 4e 53 45 52  ne RTREE_REINSER
1e00: 54 28 70 29 20 52 54 52 45 45 5f 4d 49 4e 43 45  T(p) RTREE_MINCE
1e10: 4c 4c 53 28 70 29 0a 23 64 65 66 69 6e 65 20 52  LLS(p).#define R
1e20: 54 52 45 45 5f 4d 41 58 43 45 4c 4c 53 20 35 31  TREE_MAXCELLS 51
1e30: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 6d 61 6c  ../*.** The smal
1e40: 6c 65 73 74 20 70 6f 73 73 69 62 6c 65 20 6e 6f  lest possible no
1e50: 64 65 2d 73 69 7a 65 20 69 73 20 28 35 31 32 2d  de-size is (512-
1e60: 36 34 29 3d 3d 34 34 38 20 62 79 74 65 73 2e 20  64)==448 bytes. 
1e70: 41 6e 64 20 74 68 65 20 6c 61 72 67 65 73 74 0a  And the largest.
1e80: 2a 2a 20 73 75 70 70 6f 72 74 65 64 20 63 65 6c  ** supported cel
1e90: 6c 20 73 69 7a 65 20 69 73 20 34 38 20 62 79 74  l size is 48 byt
1ea0: 65 73 20 28 38 20 62 79 74 65 20 72 6f 77 69 64  es (8 byte rowid
1eb0: 20 2b 20 74 65 6e 20 34 20 62 79 74 65 20 63 6f   + ten 4 byte co
1ec0: 6f 72 64 69 6e 61 74 65 73 29 2e 0a 2a 2a 20 54  ordinates)..** T
1ed0: 68 65 72 65 66 6f 72 65 20 61 6c 6c 20 6e 6f 6e  herefore all non
1ee0: 2d 72 6f 6f 74 20 6e 6f 64 65 73 20 6d 75 73 74  -root nodes must
1ef0: 20 63 6f 6e 74 61 69 6e 20 61 74 20 6c 65 61 73   contain at leas
1f00: 74 20 33 20 65 6e 74 72 69 65 73 2e 20 53 69 6e  t 3 entries. Sin
1f10: 63 65 20 0a 2a 2a 20 33 5e 34 30 20 69 73 20 67  ce .** 3^40 is g
1f20: 72 65 61 74 65 72 20 74 68 61 6e 20 32 5e 36 34  reater than 2^64
1f30: 2c 20 61 6e 20 72 2d 74 72 65 65 20 73 74 72 75  , an r-tree stru
1f40: 63 74 75 72 65 20 61 6c 77 61 79 73 20 68 61 73  cture always has
1f50: 20 61 20 64 65 70 74 68 20 6f 66 0a 2a 2a 20 34   a depth of.** 4
1f60: 30 20 6f 72 20 6c 65 73 73 2e 0a 2a 2f 0a 23 64  0 or less..*/.#d
1f70: 65 66 69 6e 65 20 52 54 52 45 45 5f 4d 41 58 5f  efine RTREE_MAX_
1f80: 44 45 50 54 48 20 34 30 0a 0a 0a 2f 2a 0a 2a 2a  DEPTH 40.../*.**
1f90: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
1fa0: 65 73 20 69 6e 20 74 68 65 20 63 75 72 73 6f 72  es in the cursor
1fb0: 20 52 74 72 65 65 4e 6f 64 65 20 63 61 63 68 65   RtreeNode cache
1fc0: 2e 20 20 54 68 65 20 66 69 72 73 74 20 65 6e 74  .  The first ent
1fd0: 72 79 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f  ry is.** used to
1fe0: 20 63 61 63 68 65 20 74 68 65 20 52 74 72 65 65   cache the Rtree
1ff0: 4e 6f 64 65 20 66 6f 72 20 52 74 72 65 65 43 75  Node for RtreeCu
2000: 72 73 6f 72 2e 73 50 6f 69 6e 74 2e 20 20 54 68  rsor.sPoint.  Th
2010: 65 20 72 65 6d 61 69 6e 69 6e 67 0a 2a 2a 20 65  e remaining.** e
2020: 6e 74 72 69 65 73 20 63 61 63 68 65 20 74 68 65  ntries cache the
2030: 20 52 74 72 65 65 4e 6f 64 65 20 66 6f 72 20 74   RtreeNode for t
2040: 68 65 20 66 69 72 73 74 20 65 6c 65 6d 65 6e 74  he first element
2050: 73 20 6f 66 20 74 68 65 20 70 72 69 6f 72 69 74  s of the priorit
2060: 79 20 71 75 65 75 65 2e 0a 2a 2f 0a 23 64 65 66  y queue..*/.#def
2070: 69 6e 65 20 52 54 52 45 45 5f 43 41 43 48 45 5f  ine RTREE_CACHE_
2080: 53 5a 20 20 35 0a 0a 2f 2a 20 0a 2a 2a 20 41 6e  SZ  5../* .** An
2090: 20 72 74 72 65 65 20 63 75 72 73 6f 72 20 6f 62   rtree cursor ob
20a0: 6a 65 63 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ject..*/.struct 
20b0: 52 74 72 65 65 43 75 72 73 6f 72 20 7b 0a 20 20  RtreeCursor {.  
20c0: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
20d0: 73 6f 72 20 62 61 73 65 3b 20 20 20 20 20 20 20  sor base;       
20e0: 20 20 2f 2a 20 42 61 73 65 20 63 6c 61 73 73 2e    /* Base class.
20f0: 20 20 4d 75 73 74 20 62 65 20 66 69 72 73 74 20    Must be first 
2100: 2a 2f 0a 20 20 75 38 20 61 74 45 4f 46 3b 20 20  */.  u8 atEOF;  
2110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2120: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2130: 66 20 61 74 20 65 6e 64 20 6f 66 20 73 65 61 72  f at end of sear
2140: 63 68 20 2a 2f 0a 20 20 75 38 20 62 50 6f 69 6e  ch */.  u8 bPoin
2150: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
2160: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2170: 65 20 69 66 20 73 50 6f 69 6e 74 20 69 73 20 76  e if sPoint is v
2180: 61 6c 69 64 20 2a 2f 0a 20 20 69 6e 74 20 69 53  alid */.  int iS
2190: 74 72 61 74 65 67 79 3b 20 20 20 20 20 20 20 20  trategy;        
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
21b0: 6f 70 79 20 6f 66 20 69 64 78 4e 75 6d 20 73 65  opy of idxNum se
21c0: 61 72 63 68 20 70 61 72 61 6d 65 74 65 72 20 2a  arch parameter *
21d0: 2f 0a 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61  /.  int nConstra
21e0: 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  int;            
21f0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2200: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 43  of entries in aC
2210: 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 52  onstraint */.  R
2220: 74 72 65 65 43 6f 6e 73 74 72 61 69 6e 74 20 2a  treeConstraint *
2230: 61 43 6f 6e 73 74 72 61 69 6e 74 3b 20 20 20 20  aConstraint;    
2240: 20 2f 2a 20 53 65 61 72 63 68 20 63 6f 6e 73 74   /* Search const
2250: 72 61 69 6e 74 73 2e 20 2a 2f 0a 20 20 69 6e 74  raints. */.  int
2260: 20 6e 50 6f 69 6e 74 41 6c 6c 6f 63 3b 20 20 20   nPointAlloc;   
2270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2280: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74  * Number of slot
2290: 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
22a0: 61 50 6f 69 6e 74 5b 5d 20 2a 2f 0a 20 20 69 6e  aPoint[] */.  in
22b0: 74 20 6e 50 6f 69 6e 74 3b 20 20 20 20 20 20 20  t nPoint;       
22c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 6c 6f  /* Number of slo
22e0: 74 73 20 75 73 65 64 20 69 6e 20 61 50 6f 69 6e  ts used in aPoin
22f0: 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 4c  t[] */.  int mxL
2300: 65 76 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20  evel;           
2310: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 4c             /* iL
2320: 65 76 65 6c 20 76 61 6c 75 65 20 66 6f 72 20 72  evel value for r
2330: 6f 6f 74 20 6f 66 20 74 68 65 20 74 72 65 65 20  oot of the tree 
2340: 2a 2f 0a 20 20 52 74 72 65 65 53 65 61 72 63 68  */.  RtreeSearch
2350: 50 6f 69 6e 74 20 2a 61 50 6f 69 6e 74 3b 20 20  Point *aPoint;  
2360: 20 20 20 20 20 20 20 2f 2a 20 50 72 69 6f 72 69         /* Priori
2370: 74 79 20 71 75 65 75 65 20 66 6f 72 20 73 65 61  ty queue for sea
2380: 72 63 68 20 70 6f 69 6e 74 73 20 2a 2f 0a 20 20  rch points */.  
2390: 52 74 72 65 65 53 65 61 72 63 68 50 6f 69 6e 74  RtreeSearchPoint
23a0: 20 73 50 6f 69 6e 74 3b 20 20 20 20 20 20 20 20   sPoint;        
23b0: 20 20 2f 2a 20 43 61 63 68 65 64 20 6e 65 78 74    /* Cached next
23c0: 20 73 65 61 72 63 68 20 70 6f 69 6e 74 20 2a 2f   search point */
23d0: 0a 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 61 4e  .  RtreeNode *aN
23e0: 6f 64 65 5b 52 54 52 45 45 5f 43 41 43 48 45 5f  ode[RTREE_CACHE_
23f0: 53 5a 5d 3b 20 2f 2a 20 52 74 72 65 65 20 6e 6f  SZ]; /* Rtree no
2400: 64 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 75 33  de cache */.  u3
2410: 32 20 61 6e 51 75 65 75 65 5b 52 54 52 45 45 5f  2 anQueue[RTREE_
2420: 4d 41 58 5f 44 45 50 54 48 2b 31 5d 3b 20 20 20  MAX_DEPTH+1];   
2430: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 71 75 65  /* Number of que
2440: 75 65 64 20 65 6e 74 72 69 65 73 20 62 79 20 69  ued entries by i
2450: 4c 65 76 65 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20  Level */.};../* 
2460: 52 65 74 75 72 6e 20 74 68 65 20 52 74 72 65 65  Return the Rtree
2470: 20 6f 66 20 61 20 52 74 72 65 65 43 75 72 73 6f   of a RtreeCurso
2480: 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 52 54 52  r */.#define RTR
2490: 45 45 5f 4f 46 5f 43 55 52 53 4f 52 28 58 29 20  EE_OF_CURSOR(X) 
24a0: 20 20 28 28 52 74 72 65 65 2a 29 28 28 58 29 2d    ((Rtree*)((X)-
24b0: 3e 62 61 73 65 2e 70 56 74 61 62 29 29 0a 0a 2f  >base.pVtab))../
24c0: 2a 0a 2a 2a 20 41 20 63 6f 6f 72 64 69 6e 61 74  *.** A coordinat
24d0: 65 20 63 61 6e 20 62 65 20 65 69 74 68 65 72 20  e can be either 
24e0: 61 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  a floating point
24f0: 20 6e 75 6d 62 65 72 20 6f 72 20 61 20 69 6e 74   number or a int
2500: 65 67 65 72 2e 20 20 41 6c 6c 0a 2a 2a 20 63 6f  eger.  All.** co
2510: 6f 72 64 69 6e 61 74 65 73 20 77 69 74 68 69 6e  ordinates within
2520: 20 61 20 73 69 6e 67 6c 65 20 52 2d 54 72 65 65   a single R-Tree
2530: 20 61 72 65 20 61 6c 77 61 79 73 20 6f 66 20 74   are always of t
2540: 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2f  he same time..*/
2550: 0a 75 6e 69 6f 6e 20 52 74 72 65 65 43 6f 6f 72  .union RtreeCoor
2560: 64 20 7b 0a 20 20 52 74 72 65 65 56 61 6c 75 65  d {.  RtreeValue
2570: 20 66 3b 20 20 20 20 20 20 2f 2a 20 46 6c 6f 61   f;      /* Floa
2580: 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65  ting point value
2590: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
25a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65           /* Inte
25b0: 67 65 72 20 76 61 6c 75 65 20 2a 2f 0a 20 20 75  ger value */.  u
25c0: 33 32 20 75 3b 20 20 20 20 20 20 20 20 20 20 20  32 u;           
25d0: 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 66 6f    /* Unsigned fo
25e0: 72 20 62 79 74 65 2d 6f 72 64 65 72 20 63 6f 6e  r byte-order con
25f0: 76 65 72 73 69 6f 6e 73 20 2a 2f 0a 7d 3b 0a 0a  versions */.};..
2600: 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  /*.** The argume
2610: 6e 74 20 69 73 20 61 6e 20 52 74 72 65 65 43 6f  nt is an RtreeCo
2620: 6f 72 64 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ord. Return the 
2630: 76 61 6c 75 65 20 73 74 6f 72 65 64 20 77 69 74  value stored wit
2640: 68 69 6e 20 74 68 65 20 52 74 72 65 65 43 6f 6f  hin the RtreeCoo
2650: 72 64 0a 2a 2a 20 66 6f 72 6d 61 74 74 65 64 20  rd.** formatted 
2660: 61 73 20 61 20 52 74 72 65 65 44 56 61 6c 75 65  as a RtreeDValue
2670: 20 28 64 6f 75 62 6c 65 20 6f 72 20 69 6e 74 36   (double or int6
2680: 34 29 2e 20 54 68 69 73 20 6d 61 63 72 6f 20 61  4). This macro a
2690: 73 73 75 6d 65 73 20 74 68 61 74 20 6c 6f 63 61  ssumes that loca
26a0: 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 70 52  l.** variable pR
26b0: 74 72 65 65 20 70 6f 69 6e 74 73 20 74 6f 20 74  tree points to t
26c0: 68 65 20 52 74 72 65 65 20 73 74 72 75 63 74 75  he Rtree structu
26d0: 72 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  re associated wi
26e0: 74 68 20 74 68 65 0a 2a 2a 20 52 74 72 65 65 43  th the.** RtreeC
26f0: 6f 6f 72 64 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  oord..*/.#ifdef 
2700: 53 51 4c 49 54 45 5f 52 54 52 45 45 5f 49 4e 54  SQLITE_RTREE_INT
2710: 5f 4f 4e 4c 59 0a 23 20 64 65 66 69 6e 65 20 44  _ONLY.# define D
2720: 43 4f 4f 52 44 28 63 6f 6f 72 64 29 20 28 28 52  COORD(coord) ((R
2730: 74 72 65 65 44 56 61 6c 75 65 29 63 6f 6f 72 64  treeDValue)coord
2740: 2e 69 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  .i).#else.# defi
2750: 6e 65 20 44 43 4f 4f 52 44 28 63 6f 6f 72 64 29  ne DCOORD(coord)
2760: 20 28 20 20 20 20 20 20 20 20 20 20 20 20 20 20   (              
2770: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
2780: 20 20 20 28 70 52 74 72 65 65 2d 3e 65 43 6f 6f     (pRtree->eCoo
2790: 72 64 54 79 70 65 3d 3d 52 54 52 45 45 5f 43 4f  rdType==RTREE_CO
27a0: 4f 52 44 5f 52 45 41 4c 33 32 29 20 3f 20 20 20  ORD_REAL32) ?   
27b0: 20 20 20 5c 0a 20 20 20 20 20 20 28 28 64 6f 75     \.      ((dou
27c0: 62 6c 65 29 63 6f 6f 72 64 2e 66 29 20 3a 20 20  ble)coord.f) :  
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e0: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 20           \.     
27f0: 20 28 28 64 6f 75 62 6c 65 29 63 6f 6f 72 64 2e   ((double)coord.
2800: 69 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i)              
2810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
2820: 0a 20 20 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  .  ).#endif../*.
2830: 2a 2a 20 41 20 73 65 61 72 63 68 20 63 6f 6e 73  ** A search cons
2840: 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73 74 72 75 63  traint..*/.struc
2850: 74 20 52 74 72 65 65 43 6f 6e 73 74 72 61 69 6e  t RtreeConstrain
2860: 74 20 7b 0a 20 20 69 6e 74 20 69 43 6f 6f 72 64  t {.  int iCoord
2870: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2880: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
2890: 66 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 63 6f  f constrained co
28a0: 6f 72 64 69 6e 61 74 65 20 2a 2f 0a 20 20 69 6e  ordinate */.  in
28b0: 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28d0: 20 43 6f 6e 73 74 72 61 69 6e 69 6e 67 20 6f 70   Constraining op
28e0: 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 6e 69  eration */.  uni
28f0: 6f 6e 20 7b 0a 20 20 20 20 52 74 72 65 65 44 56  on {.    RtreeDV
2900: 61 6c 75 65 20 72 56 61 6c 75 65 3b 20 20 20 20  alue rValue;    
2910: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73           /* Cons
2920: 74 72 61 69 6e 74 20 76 61 6c 75 65 2e 20 2a 2f  traint value. */
2930: 0a 20 20 20 20 69 6e 74 20 28 2a 78 47 65 6f 6d  .    int (*xGeom
2940: 29 28 73 71 6c 69 74 65 33 5f 72 74 72 65 65 5f  )(sqlite3_rtree_
2950: 67 65 6f 6d 65 74 72 79 2a 2c 69 6e 74 2c 52 74  geometry*,int,Rt
2960: 72 65 65 44 56 61 6c 75 65 2a 2c 69 6e 74 2a 29  reeDValue*,int*)
2970: 3b 0a 20 20 20 20 69 6e 74 20 28 2a 78 51 75 65  ;.    int (*xQue
2980: 72 79 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f  ryFunc)(sqlite3_
2990: 72 74 72 65 65 5f 71 75 65 72 79 5f 69 6e 66 6f  rtree_query_info
29a0: 2a 29 3b 0a 20 20 7d 20 75 3b 0a 20 20 73 71 6c  *);.  } u;.  sql
29b0: 69 74 65 33 5f 72 74 72 65 65 5f 71 75 65 72 79  ite3_rtree_query
29c0: 5f 69 6e 66 6f 20 2a 70 49 6e 66 6f 3b 20 20 2f  _info *pInfo;  /
29d0: 2a 20 78 47 65 6f 6d 20 61 6e 64 20 78 51 75 65  * xGeom and xQue
29e0: 72 79 46 75 6e 63 20 61 72 67 75 6d 65 6e 74 20  ryFunc argument 
29f0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 50 6f 73 73 69 62  */.};../* Possib
2a00: 6c 65 20 76 61 6c 75 65 73 20 66 6f 72 20 52 74  le values for Rt
2a10: 72 65 65 43 6f 6e 73 74 72 61 69 6e 74 2e 6f 70  reeConstraint.op
2a20: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 52 54 52 45   */.#define RTRE
2a30: 45 5f 45 51 20 20 20 20 30 78 34 31 20 20 2f 2a  E_EQ    0x41  /*
2a40: 20 41 20 2a 2f 0a 23 64 65 66 69 6e 65 20 52 54   A */.#define RT
2a50: 52 45 45 5f 4c 45 20 20 20 20 30 78 34 32 20 20  REE_LE    0x42  
2a60: 2f 2a 20 42 20 2a 2f 0a 23 64 65 66 69 6e 65 20  /* B */.#define 
2a70: 52 54 52 45 45 5f 4c 54 20 20 20 20 30 78 34 33  RTREE_LT    0x43
2a80: 20 20 2f 2a 20 43 20 2a 2f 0a 23 64 65 66 69 6e    /* C */.#defin
2a90: 65 20 52 54 52 45 45 5f 47 45 20 20 20 20 30 78  e RTREE_GE    0x
2aa0: 34 34 20 20 2f 2a 20 44 20 2a 2f 0a 23 64 65 66  44  /* D */.#def
2ab0: 69 6e 65 20 52 54 52 45 45 5f 47 54 20 20 20 20  ine RTREE_GT    
2ac0: 30 78 34 35 20 20 2f 2a 20 45 20 2a 2f 0a 23 64  0x45  /* E */.#d
2ad0: 65 66 69 6e 65 20 52 54 52 45 45 5f 4d 41 54 43  efine RTREE_MATC
2ae0: 48 20 30 78 34 36 20 20 2f 2a 20 46 3a 20 4f 6c  H 0x46  /* F: Ol
2af0: 64 2d 73 74 79 6c 65 20 73 71 6c 69 74 65 33 5f  d-style sqlite3_
2b00: 72 74 72 65 65 5f 67 65 6f 6d 65 74 72 79 5f 63  rtree_geometry_c
2b10: 61 6c 6c 62 61 63 6b 28 29 20 2a 2f 0a 23 64 65  allback() */.#de
2b20: 66 69 6e 65 20 52 54 52 45 45 5f 51 55 45 52 59  fine RTREE_QUERY
2b30: 20 30 78 34 37 20 20 2f 2a 20 47 3a 20 4e 65 77   0x47  /* G: New
2b40: 2d 73 74 79 6c 65 20 73 71 6c 69 74 65 33 5f 72  -style sqlite3_r
2b50: 74 72 65 65 5f 71 75 65 72 79 5f 63 61 6c 6c 62  tree_query_callb
2b60: 61 63 6b 28 29 20 2a 2f 0a 0a 0a 2f 2a 20 0a 2a  ack() */.../* .*
2b70: 2a 20 41 6e 20 72 74 72 65 65 20 73 74 72 75 63  * An rtree struc
2b80: 74 75 72 65 20 6e 6f 64 65 2e 0a 2a 2f 0a 73 74  ture node..*/.st
2b90: 72 75 63 74 20 52 74 72 65 65 4e 6f 64 65 20 7b  ruct RtreeNode {
2ba0: 0a 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 50  .  RtreeNode *pP
2bb0: 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20 2f  arent;         /
2bc0: 2a 20 50 61 72 65 6e 74 20 6e 6f 64 65 20 2a 2f  * Parent node */
2bd0: 0a 20 20 69 36 34 20 69 4e 6f 64 65 3b 20 20 20  .  i64 iNode;   
2be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2bf0: 2a 20 54 68 65 20 6e 6f 64 65 20 6e 75 6d 62 65  * The node numbe
2c00: 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b  r */.  int nRef;
2c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c20: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2c30: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
2c40: 69 73 20 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  is node */.  int
2c50: 20 69 73 44 69 72 74 79 3b 20 20 20 20 20 20 20   isDirty;       
2c60: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2c70: 20 69 66 20 74 68 65 20 6e 6f 64 65 20 6e 65 65   if the node nee
2c80: 64 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ds to be written
2c90: 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 20 20 75 38   to disk */.  u8
2ca0: 20 2a 7a 44 61 74 61 3b 20 20 20 20 20 20 20 20   *zData;        
2cb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
2cc0: 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 6f 64 65  tent of the node
2cd0: 2c 20 61 73 20 73 68 6f 75 6c 64 20 62 65 20 6f  , as should be o
2ce0: 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 52 74 72 65  n disk */.  Rtre
2cf0: 65 4e 6f 64 65 20 2a 70 4e 65 78 74 3b 20 20 20  eNode *pNext;   
2d00: 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
2d10: 6e 6f 64 65 20 69 6e 20 74 68 69 73 20 68 61 73  node in this has
2d20: 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69  h collision chai
2d30: 6e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 52 65 74 75  n */.};../* Retu
2d40: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
2d50: 20 63 65 6c 6c 73 20 69 6e 20 61 20 6e 6f 64 65   cells in a node
2d60: 20 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 43 45    */.#define NCE
2d70: 4c 4c 28 70 4e 6f 64 65 29 20 72 65 61 64 49 6e  LL(pNode) readIn
2d80: 74 31 36 28 26 28 70 4e 6f 64 65 29 2d 3e 7a 44  t16(&(pNode)->zD
2d90: 61 74 61 5b 32 5d 29 0a 0a 2f 2a 20 0a 2a 2a 20  ata[2])../* .** 
2da0: 41 20 73 69 6e 67 6c 65 20 63 65 6c 6c 20 66 72  A single cell fr
2db0: 6f 6d 20 61 20 6e 6f 64 65 2c 20 64 65 73 65 72  om a node, deser
2dc0: 69 61 6c 69 7a 65 64 0a 2a 2f 0a 73 74 72 75 63  ialized.*/.struc
2dd0: 74 20 52 74 72 65 65 43 65 6c 6c 20 7b 0a 20 20  t RtreeCell {.  
2de0: 69 36 34 20 69 52 6f 77 69 64 3b 20 20 20 20 20  i64 iRowid;     
2df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2e10: 6f 64 65 20 6f 72 20 65 6e 74 72 79 20 49 44 20  ode or entry ID 
2e20: 2a 2f 0a 20 20 52 74 72 65 65 43 6f 6f 72 64 20  */.  RtreeCoord 
2e30: 61 43 6f 6f 72 64 5b 52 54 52 45 45 5f 4d 41 58  aCoord[RTREE_MAX
2e40: 5f 44 49 4d 45 4e 53 49 4f 4e 53 2a 32 5d 3b 20  _DIMENSIONS*2]; 
2e50: 20 2f 2a 20 42 6f 75 6e 64 69 6e 67 20 62 6f 78   /* Bounding box
2e60: 20 63 6f 6f 72 64 69 6e 61 74 65 73 20 2a 2f 0a   coordinates */.
2e70: 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  };.../*.** This 
2e80: 6f 62 6a 65 63 74 20 62 65 63 6f 6d 65 73 20 74  object becomes t
2e90: 68 65 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f  he sqlite3_user_
2ea0: 64 61 74 61 28 29 20 66 6f 72 20 74 68 65 20 53  data() for the S
2eb0: 51 4c 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20  QL functions.** 
2ec0: 74 68 61 74 20 61 72 65 20 63 72 65 61 74 65 64  that are created
2ed0: 20 62 79 20 73 71 6c 69 74 65 33 5f 72 74 72 65   by sqlite3_rtre
2ee0: 65 5f 67 65 6f 6d 65 74 72 79 5f 63 61 6c 6c 62  e_geometry_callb
2ef0: 61 63 6b 28 29 20 61 6e 64 0a 2a 2a 20 73 71 6c  ack() and.** sql
2f00: 69 74 65 33 5f 72 74 72 65 65 5f 71 75 65 72 79  ite3_rtree_query
2f10: 5f 63 61 6c 6c 62 61 63 6b 28 29 20 61 6e 64 20  _callback() and 
2f20: 77 68 69 63 68 20 61 70 70 65 61 72 20 6f 6e 20  which appear on 
2f30: 74 68 65 20 72 69 67 68 74 20 6f 66 20 4d 41 54  the right of MAT
2f40: 43 48 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20  CH.** operators 
2f50: 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 73  in order to cons
2f60: 74 72 61 69 6e 20 61 20 73 65 61 72 63 68 2e 0a  train a search..
2f70: 2a 2a 0a 2a 2a 20 78 47 65 6f 6d 20 61 6e 64 20  **.** xGeom and 
2f80: 78 51 75 65 72 79 46 75 6e 63 20 61 72 65 20 74  xQueryFunc are t
2f90: 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63  he callback func
2fa0: 74 69 6f 6e 73 2e 20 20 45 78 61 63 74 6c 79 20  tions.  Exactly 
2fb0: 6f 6e 65 20 6f 66 20 0a 2a 2a 20 78 47 65 6f 6d  one of .** xGeom
2fc0: 20 61 6e 64 20 78 51 75 65 72 79 46 75 6e 63 20   and xQueryFunc 
2fd0: 66 69 65 6c 64 73 20 69 73 20 6e 6f 6e 2d 4e 55  fields is non-NU
2fe0: 4c 4c 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  LL, depending on
2ff0: 20 77 68 65 74 68 65 72 20 74 68 65 0a 2a 2a 20   whether the.** 
3000: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 77 61 73  SQL function was
3010: 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 73   created using s
3020: 71 6c 69 74 65 33 5f 72 74 72 65 65 5f 67 65 6f  qlite3_rtree_geo
3030: 6d 65 74 72 79 5f 63 61 6c 6c 62 61 63 6b 28 29  metry_callback()
3040: 20 6f 72 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 72   or.** sqlite3_r
3050: 74 72 65 65 5f 71 75 65 72 79 5f 63 61 6c 6c 62  tree_query_callb
3060: 61 63 6b 28 29 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  ack()..** .** Th
3070: 69 73 20 6f 62 6a 65 63 74 20 69 73 20 64 65 6c  is object is del
3080: 65 74 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  eted automatical
3090: 6c 79 20 62 79 20 74 68 65 20 64 65 73 74 72 75  ly by the destru
30a0: 63 74 6f 72 20 6d 65 63 68 61 6e 69 73 6d 20 69  ctor mechanism i
30b0: 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72 65  n.** sqlite3_cre
30c0: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28  ate_function_v2(
30d0: 29 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 52 74 72  )..*/.struct Rtr
30e0: 65 65 47 65 6f 6d 43 61 6c 6c 62 61 63 6b 20 7b  eeGeomCallback {
30f0: 0a 20 20 69 6e 74 20 28 2a 78 47 65 6f 6d 29 28  .  int (*xGeom)(
3100: 73 71 6c 69 74 65 33 5f 72 74 72 65 65 5f 67 65  sqlite3_rtree_ge
3110: 6f 6d 65 74 72 79 2a 2c 20 69 6e 74 2c 20 52 74  ometry*, int, Rt
3120: 72 65 65 44 56 61 6c 75 65 2a 2c 20 69 6e 74 2a  reeDValue*, int*
3130: 29 3b 0a 20 20 69 6e 74 20 28 2a 78 51 75 65 72  );.  int (*xQuer
3140: 79 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 72  yFunc)(sqlite3_r
3150: 74 72 65 65 5f 71 75 65 72 79 5f 69 6e 66 6f 2a  tree_query_info*
3160: 29 3b 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 73  );.  void (*xDes
3170: 74 72 75 63 74 6f 72 29 28 76 6f 69 64 2a 29 3b  tructor)(void*);
3180: 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78  .  void *pContex
3190: 74 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  t;.};../*.** An 
31a0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
31b0: 20 73 74 72 75 63 74 75 72 65 20 28 69 6e 20 74   structure (in t
31c0: 68 65 20 66 6f 72 6d 20 6f 66 20 61 20 42 4c 4f  he form of a BLO
31d0: 42 29 20 69 73 20 72 65 74 75 72 6e 65 64 20 62  B) is returned b
31e0: 79 0a 2a 2a 20 74 68 65 20 53 51 4c 20 66 75 6e  y.** the SQL fun
31f0: 63 74 69 6f 6e 73 20 74 68 61 74 20 73 71 6c 69  ctions that sqli
3200: 74 65 33 5f 72 74 72 65 65 5f 67 65 6f 6d 65 74  te3_rtree_geomet
3210: 72 79 5f 63 61 6c 6c 62 61 63 6b 28 29 20 61 6e  ry_callback() an
3220: 64 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 72 74 72  d.** sqlite3_rtr
3230: 65 65 5f 71 75 65 72 79 5f 63 61 6c 6c 62 61 63  ee_query_callbac
3240: 6b 28 29 20 63 72 65 61 74 65 2c 20 61 6e 64 20  k() create, and 
3250: 69 73 20 72 65 61 64 20 61 73 20 74 68 65 20 72  is read as the r
3260: 69 67 68 74 2d 68 61 6e 64 0a 2a 2a 20 6f 70 65  ight-hand.** ope
3270: 72 61 6e 64 20 74 6f 20 74 68 65 20 4d 41 54 43  rand to the MATC
3280: 48 20 6f 70 65 72 61 74 6f 72 20 6f 66 20 61 6e  H operator of an
3290: 20 52 2d 54 72 65 65 2e 0a 2a 2f 0a 73 74 72 75   R-Tree..*/.stru
32a0: 63 74 20 52 74 72 65 65 4d 61 74 63 68 41 72 67  ct RtreeMatchArg
32b0: 20 7b 0a 20 20 75 33 32 20 69 53 69 7a 65 3b 20   {.  u32 iSize; 
32c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32d0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 69 73   /* Size of this
32e0: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 52 74 72   object */.  Rtr
32f0: 65 65 47 65 6f 6d 43 61 6c 6c 62 61 63 6b 20 63  eeGeomCallback c
3300: 62 3b 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f  b;       /* Info
3310: 20 61 62 6f 75 74 20 74 68 65 20 63 61 6c 6c 62   about the callb
3320: 61 63 6b 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ack functions */
3330: 0a 20 20 69 6e 74 20 6e 50 61 72 61 6d 3b 20 20  .  int nParam;  
3340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3350: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 72 61  * Number of para
3360: 6d 65 74 65 72 73 20 74 6f 20 74 68 65 20 53 51  meters to the SQ
3370: 4c 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  L function */.  
3380: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
3390: 61 70 53 71 6c 50 61 72 61 6d 3b 20 2f 2a 20 4f  apSqlParam; /* O
33a0: 72 69 67 69 6e 61 6c 20 53 51 4c 20 70 61 72 61  riginal SQL para
33b0: 6d 65 74 65 72 20 76 61 6c 75 65 73 20 2a 2f 0a  meter values */.
33c0: 20 20 52 74 72 65 65 44 56 61 6c 75 65 20 61 50    RtreeDValue aP
33d0: 61 72 61 6d 5b 31 5d 3b 20 20 20 20 20 20 2f 2a  aram[1];      /*
33e0: 20 56 61 6c 75 65 73 20 66 6f 72 20 70 61 72 61   Values for para
33f0: 6d 65 74 65 72 73 20 74 6f 20 74 68 65 20 53 51  meters to the SQ
3400: 4c 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 7d 3b  L function */.};
3410: 0a 0a 23 69 66 6e 64 65 66 20 4d 41 58 0a 23 20  ..#ifndef MAX.# 
3420: 64 65 66 69 6e 65 20 4d 41 58 28 78 2c 79 29 20  define MAX(x,y) 
3430: 28 28 78 29 20 3c 20 28 79 29 20 3f 20 28 79 29  ((x) < (y) ? (y)
3440: 20 3a 20 28 78 29 29 0a 23 65 6e 64 69 66 0a 23   : (x)).#endif.#
3450: 69 66 6e 64 65 66 20 4d 49 4e 0a 23 20 64 65 66  ifndef MIN.# def
3460: 69 6e 65 20 4d 49 4e 28 78 2c 79 29 20 28 28 78  ine MIN(x,y) ((x
3470: 29 20 3e 20 28 79 29 20 3f 20 28 79 29 20 3a 20  ) > (y) ? (y) : 
3480: 28 78 29 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  (x)).#endif../* 
3490: 57 68 61 74 20 76 65 72 73 69 6f 6e 20 6f 66 20  What version of 
34a0: 47 43 43 20 69 73 20 62 65 69 6e 67 20 75 73 65  GCC is being use
34b0: 64 2e 20 20 30 20 6d 65 61 6e 73 20 47 43 43 20  d.  0 means GCC 
34c0: 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 75 73 65  is not being use
34d0: 64 20 2e 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  d ..** Note that
34e0: 20 74 68 65 20 47 43 43 5f 56 45 52 53 49 4f 4e   the GCC_VERSION
34f0: 20 6d 61 63 72 6f 20 77 69 6c 6c 20 61 6c 73 6f   macro will also
3500: 20 62 65 20 73 65 74 20 63 6f 72 72 65 63 74 6c   be set correctl
3510: 79 20 77 68 65 6e 20 75 73 69 6e 67 0a 2a 2a 20  y when using.** 
3520: 63 6c 61 6e 67 2c 20 73 69 6e 63 65 20 63 6c 61  clang, since cla
3530: 6e 67 20 77 6f 72 6b 73 20 68 61 72 64 20 74 6f  ng works hard to
3540: 20 62 65 20 67 63 63 20 63 6f 6d 70 61 74 69 62   be gcc compatib
3550: 6c 65 2e 20 20 53 6f 20 74 68 65 20 67 63 63 0a  le.  So the gcc.
3560: 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  ** optimizations
3570: 20 77 69 6c 6c 20 61 6c 73 6f 20 77 6f 72 6b 20   will also work 
3580: 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 77  when compiling w
3590: 69 74 68 20 63 6c 61 6e 67 2e 0a 2a 2f 0a 23 69  ith clang..*/.#i
35a0: 66 6e 64 65 66 20 47 43 43 5f 56 45 52 53 49 4f  fndef GCC_VERSIO
35b0: 4e 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  N.#if defined(__
35c0: 47 4e 55 43 5f 5f 29 20 26 26 20 21 64 65 66 69  GNUC__) && !defi
35d0: 6e 65 64 28 53 51 4c 49 54 45 5f 44 49 53 41 42  ned(SQLITE_DISAB
35e0: 4c 45 5f 49 4e 54 52 49 4e 53 49 43 29 0a 23 20  LE_INTRINSIC).# 
35f0: 64 65 66 69 6e 65 20 47 43 43 5f 56 45 52 53 49  define GCC_VERSI
3600: 4f 4e 20 28 5f 5f 47 4e 55 43 5f 5f 2a 31 30 30  ON (__GNUC__*100
3610: 30 30 30 30 2b 5f 5f 47 4e 55 43 5f 4d 49 4e 4f  0000+__GNUC_MINO
3620: 52 5f 5f 2a 31 30 30 30 2b 5f 5f 47 4e 55 43 5f  R__*1000+__GNUC_
3630: 50 41 54 43 48 4c 45 56 45 4c 5f 5f 29 0a 23 65  PATCHLEVEL__).#e
3640: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 47 43 43  lse.# define GCC
3650: 5f 56 45 52 53 49 4f 4e 20 30 0a 23 65 6e 64 69  _VERSION 0.#endi
3660: 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 54 68 65  f.#endif../* The
3670: 20 74 65 73 74 63 61 73 65 28 29 20 6d 61 63 72   testcase() macr
3680: 6f 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79  o should already
3690: 20 62 65 20 64 65 66 69 6e 65 64 20 69 6e 20 74   be defined in t
36a0: 68 65 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 2e  he amalgamation.
36b0: 20 20 49 66 0a 2a 2a 20 69 74 20 69 73 20 6e 6f    If.** it is no
36c0: 74 2c 20 6d 61 6b 65 20 69 74 20 61 20 6e 6f 2d  t, make it a no-
36d0: 6f 70 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  op..*/.#ifndef S
36e0: 51 4c 49 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49  QLITE_AMALGAMATI
36f0: 4f 4e 0a 23 20 64 65 66 69 6e 65 20 74 65 73 74  ON.# define test
3700: 63 61 73 65 28 58 29 0a 23 65 6e 64 69 66 0a 0a  case(X).#endif..
3710: 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20 74 6f 20  /*.** Macros to 
3720: 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  determine whethe
3730: 72 20 74 68 65 20 6d 61 63 68 69 6e 65 20 69 73  r the machine is
3740: 20 62 69 67 20 6f 72 20 6c 69 74 74 6c 65 20 65   big or little e
3750: 6e 64 69 61 6e 2c 0a 2a 2a 20 61 6e 64 20 77 68  ndian,.** and wh
3760: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 61  ether or not tha
3770: 74 20 64 65 74 65 72 6d 69 6e 61 74 69 6f 6e 20  t determination 
3780: 69 73 20 72 75 6e 2d 74 69 6d 65 20 6f 72 20 63  is run-time or c
3790: 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 0a 2a 2a 0a  ompile-time..**.
37a0: 2a 2a 20 46 6f 72 20 62 65 73 74 20 70 65 72 66  ** For best perf
37b0: 6f 72 6d 61 6e 63 65 2c 20 61 6e 20 61 74 74 65  ormance, an atte
37c0: 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 67  mpt is made to g
37d0: 75 65 73 73 20 61 74 20 74 68 65 20 62 79 74 65  uess at the byte
37e0: 2d 6f 72 64 65 72 0a 2a 2a 20 75 73 69 6e 67 20  -order.** using 
37f0: 43 2d 70 72 65 70 72 6f 63 65 73 73 6f 72 20 6d  C-preprocessor m
3800: 61 63 72 6f 73 2e 20 20 49 66 20 74 68 61 74 20  acros.  If that 
3810: 69 73 20 75 6e 73 75 63 63 65 73 73 66 75 6c 2c  is unsuccessful,
3820: 20 6f 72 20 69 66 0a 2a 2a 20 2d 44 53 51 4c 49   or if.** -DSQLI
3830: 54 45 5f 52 55 4e 54 49 4d 45 5f 42 59 54 45 4f  TE_RUNTIME_BYTEO
3840: 52 44 45 52 3d 31 20 69 73 20 73 65 74 2c 20 74  RDER=1 is set, t
3850: 68 65 6e 20 62 79 74 65 2d 6f 72 64 65 72 20 69  hen byte-order i
3860: 73 20 64 65 74 65 72 6d 69 6e 65 64 0a 2a 2a 20  s determined.** 
3870: 61 74 20 72 75 6e 2d 74 69 6d 65 2e 0a 2a 2f 0a  at run-time..*/.
3880: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 42  #ifndef SQLITE_B
3890: 59 54 45 4f 52 44 45 52 0a 23 69 66 20 64 65 66  YTEORDER.#if def
38a0: 69 6e 65 64 28 69 33 38 36 29 20 20 20 20 20 7c  ined(i386)     |
38b0: 7c 20 64 65 66 69 6e 65 64 28 5f 5f 69 33 38 36  | defined(__i386
38c0: 5f 5f 29 20 20 20 7c 7c 20 64 65 66 69 6e 65 64  __)   || defined
38d0: 28 5f 4d 5f 49 58 38 36 29 20 7c 7c 20 20 20 20  (_M_IX86) ||    
38e0: 5c 0a 20 20 20 20 64 65 66 69 6e 65 64 28 5f 5f  \.    defined(__
38f0: 78 38 36 5f 36 34 29 20 7c 7c 20 64 65 66 69 6e  x86_64) || defin
3900: 65 64 28 5f 5f 78 38 36 5f 36 34 5f 5f 29 20 7c  ed(__x86_64__) |
3910: 7c 20 64 65 66 69 6e 65 64 28 5f 4d 5f 58 36 34  | defined(_M_X64
3920: 29 20 20 7c 7c 20 20 20 20 5c 0a 20 20 20 20 64  )  ||    \.    d
3930: 65 66 69 6e 65 64 28 5f 4d 5f 41 4d 44 36 34 29  efined(_M_AMD64)
3940: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 4d 5f 41   || defined(_M_A
3950: 52 4d 29 20 20 20 20 20 7c 7c 20 64 65 66 69 6e  RM)     || defin
3960: 65 64 28 5f 5f 78 38 36 29 20 20 20 7c 7c 20 20  ed(__x86)   ||  
3970: 20 20 5c 0a 20 20 20 20 64 65 66 69 6e 65 64 28    \.    defined(
3980: 5f 5f 61 72 6d 5f 5f 29 0a 23 20 64 65 66 69 6e  __arm__).# defin
3990: 65 20 53 51 4c 49 54 45 5f 42 59 54 45 4f 52 44  e SQLITE_BYTEORD
39a0: 45 52 20 20 20 20 31 32 33 34 0a 23 65 6c 69 66  ER    1234.#elif
39b0: 20 64 65 66 69 6e 65 64 28 73 70 61 72 63 29 20   defined(sparc) 
39c0: 20 20 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f     || defined(__
39d0: 70 70 63 5f 5f 29 0a 23 20 64 65 66 69 6e 65 20  ppc__).# define 
39e0: 53 51 4c 49 54 45 5f 42 59 54 45 4f 52 44 45 52  SQLITE_BYTEORDER
39f0: 20 20 20 20 34 33 32 31 0a 23 65 6c 73 65 0a 23      4321.#else.#
3a00: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 42   define SQLITE_B
3a10: 59 54 45 4f 52 44 45 52 20 20 20 20 30 20 20 20  YTEORDER    0   
3a20: 20 20 2f 2a 20 30 20 6d 65 61 6e 73 20 22 75 6e    /* 0 means "un
3a30: 6b 6e 6f 77 6e 20 61 74 20 63 6f 6d 70 69 6c 65  known at compile
3a40: 2d 74 69 6d 65 22 20 2a 2f 0a 23 65 6e 64 69 66  -time" */.#endif
3a50: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 20 57 68 61  .#endif.../* Wha
3a60: 74 20 76 65 72 73 69 6f 6e 20 6f 66 20 4d 53 56  t version of MSV
3a70: 43 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 2e  C is being used.
3a80: 20 20 30 20 6d 65 61 6e 73 20 4d 53 56 43 20 69    0 means MSVC i
3a90: 73 20 6e 6f 74 20 62 65 69 6e 67 20 75 73 65 64  s not being used
3aa0: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4d 53 56 43   */.#ifndef MSVC
3ab0: 5f 56 45 52 53 49 4f 4e 0a 23 69 66 20 64 65 66  _VERSION.#if def
3ac0: 69 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29 20 26  ined(_MSC_VER) &
3ad0: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
3ae0: 45 5f 44 49 53 41 42 4c 45 5f 49 4e 54 52 49 4e  E_DISABLE_INTRIN
3af0: 53 49 43 29 0a 23 20 64 65 66 69 6e 65 20 4d 53  SIC).# define MS
3b00: 56 43 5f 56 45 52 53 49 4f 4e 20 5f 4d 53 43 5f  VC_VERSION _MSC_
3b10: 56 45 52 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  VER.#else.# defi
3b20: 6e 65 20 4d 53 56 43 5f 56 45 52 53 49 4f 4e 20  ne MSVC_VERSION 
3b30: 30 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  0.#endif.#endif.
3b40: 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 73  ./*.** Functions
3b50: 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20   to deserialize 
3b60: 61 20 31 36 20 62 69 74 20 69 6e 74 65 67 65 72  a 16 bit integer
3b70: 2c 20 33 32 20 62 69 74 20 72 65 61 6c 20 6e 75  , 32 bit real nu
3b80: 6d 62 65 72 20 61 6e 64 0a 2a 2a 20 36 34 20 62  mber and.** 64 b
3b90: 69 74 20 69 6e 74 65 67 65 72 2e 20 54 68 65 20  it integer. The 
3ba0: 64 65 73 65 72 69 61 6c 69 7a 65 64 20 76 61 6c  deserialized val
3bb0: 75 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ue is returned..
3bc0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
3bd0: 61 64 49 6e 74 31 36 28 75 38 20 2a 70 29 7b 0a  adInt16(u8 *p){.
3be0: 20 20 72 65 74 75 72 6e 20 28 70 5b 30 5d 3c 3c    return (p[0]<<
3bf0: 38 29 20 2b 20 70 5b 31 5d 3b 0a 7d 0a 73 74 61  8) + p[1];.}.sta
3c00: 74 69 63 20 76 6f 69 64 20 72 65 61 64 43 6f 6f  tic void readCoo
3c10: 72 64 28 75 38 20 2a 70 2c 20 52 74 72 65 65 43  rd(u8 *p, RtreeC
3c20: 6f 6f 72 64 20 2a 70 43 6f 6f 72 64 29 7b 0a 20  oord *pCoord){. 
3c30: 20 61 73 73 65 72 74 28 20 28 28 28 28 63 68 61   assert( ((((cha
3c40: 72 2a 29 70 29 20 2d 20 28 63 68 61 72 2a 29 30  r*)p) - (char*)0
3c50: 29 26 33 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 70  )&3)==0 );  /* p
3c60: 20 69 73 20 61 6c 77 61 79 73 20 34 2d 62 79 74   is always 4-byt
3c70: 65 20 61 6c 69 67 6e 65 64 20 2a 2f 0a 23 69 66  e aligned */.#if
3c80: 20 53 51 4c 49 54 45 5f 42 59 54 45 4f 52 44 45   SQLITE_BYTEORDE
3c90: 52 3d 3d 31 32 33 34 20 26 26 20 4d 53 56 43 5f  R==1234 && MSVC_
3ca0: 56 45 52 53 49 4f 4e 3e 3d 31 33 30 30 0a 20 20  VERSION>=1300.  
3cb0: 70 43 6f 6f 72 64 2d 3e 75 20 3d 20 5f 62 79 74  pCoord->u = _byt
3cc0: 65 73 77 61 70 5f 75 6c 6f 6e 67 28 2a 28 75 33  eswap_ulong(*(u3
3cd0: 32 2a 29 70 29 3b 0a 23 65 6c 69 66 20 53 51 4c  2*)p);.#elif SQL
3ce0: 49 54 45 5f 42 59 54 45 4f 52 44 45 52 3d 3d 31  ITE_BYTEORDER==1
3cf0: 32 33 34 20 26 26 20 47 43 43 5f 56 45 52 53 49  234 && GCC_VERSI
3d00: 4f 4e 3e 3d 34 30 30 33 30 30 30 0a 20 20 70 43  ON>=4003000.  pC
3d10: 6f 6f 72 64 2d 3e 75 20 3d 20 5f 5f 62 75 69 6c  oord->u = __buil
3d20: 74 69 6e 5f 62 73 77 61 70 33 32 28 2a 28 75 33  tin_bswap32(*(u3
3d30: 32 2a 29 70 29 3b 0a 23 65 6c 69 66 20 53 51 4c  2*)p);.#elif SQL
3d40: 49 54 45 5f 42 59 54 45 4f 52 44 45 52 3d 3d 34  ITE_BYTEORDER==4
3d50: 33 32 31 0a 20 20 70 43 6f 6f 72 64 2d 3e 75 20  321.  pCoord->u 
3d60: 3d 20 2a 28 75 33 32 2a 29 70 3b 0a 23 65 6c 73  = *(u32*)p;.#els
3d70: 65 0a 20 20 70 43 6f 6f 72 64 2d 3e 75 20 3d 20  e.  pCoord->u = 
3d80: 28 0a 20 20 20 20 28 28 28 75 33 32 29 70 5b 30  (.    (((u32)p[0
3d90: 5d 29 20 3c 3c 20 32 34 29 20 2b 20 0a 20 20 20  ]) << 24) + .   
3da0: 20 28 28 28 75 33 32 29 70 5b 31 5d 29 20 3c 3c   (((u32)p[1]) <<
3db0: 20 31 36 29 20 2b 20 0a 20 20 20 20 28 28 28 75   16) + .    (((u
3dc0: 33 32 29 70 5b 32 5d 29 20 3c 3c 20 20 38 29 20  32)p[2]) <<  8) 
3dd0: 2b 20 0a 20 20 20 20 28 28 28 75 33 32 29 70 5b  + .    (((u32)p[
3de0: 33 5d 29 20 3c 3c 20 20 30 29 0a 20 20 29 3b 0a  3]) <<  0).  );.
3df0: 23 65 6e 64 69 66 0a 7d 0a 73 74 61 74 69 63 20  #endif.}.static 
3e00: 69 36 34 20 72 65 61 64 49 6e 74 36 34 28 75 38  i64 readInt64(u8
3e10: 20 2a 70 29 7b 0a 23 69 66 20 53 51 4c 49 54 45   *p){.#if SQLITE
3e20: 5f 42 59 54 45 4f 52 44 45 52 3d 3d 31 32 33 34  _BYTEORDER==1234
3e30: 20 26 26 20 4d 53 56 43 5f 56 45 52 53 49 4f 4e   && MSVC_VERSION
3e40: 3e 3d 31 33 30 30 0a 20 20 75 36 34 20 78 3b 0a  >=1300.  u64 x;.
3e50: 20 20 6d 65 6d 63 70 79 28 26 78 2c 20 70 2c 20    memcpy(&x, p, 
3e60: 38 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 69 36  8);.  return (i6
3e70: 34 29 5f 62 79 74 65 73 77 61 70 5f 75 69 6e 74  4)_byteswap_uint
3e80: 36 34 28 78 29 3b 0a 23 65 6c 69 66 20 53 51 4c  64(x);.#elif SQL
3e90: 49 54 45 5f 42 59 54 45 4f 52 44 45 52 3d 3d 31  ITE_BYTEORDER==1
3ea0: 32 33 34 20 26 26 20 47 43 43 5f 56 45 52 53 49  234 && GCC_VERSI
3eb0: 4f 4e 3e 3d 34 30 30 33 30 30 30 0a 20 20 75 36  ON>=4003000.  u6
3ec0: 34 20 78 3b 0a 20 20 6d 65 6d 63 70 79 28 26 78  4 x;.  memcpy(&x
3ed0: 2c 20 70 2c 20 38 29 3b 0a 20 20 72 65 74 75 72  , p, 8);.  retur
3ee0: 6e 20 28 69 36 34 29 5f 5f 62 75 69 6c 74 69 6e  n (i64)__builtin
3ef0: 5f 62 73 77 61 70 36 34 28 78 29 3b 0a 23 65 6c  _bswap64(x);.#el
3f00: 69 66 20 53 51 4c 49 54 45 5f 42 59 54 45 4f 52  if SQLITE_BYTEOR
3f10: 44 45 52 3d 3d 34 33 32 31 0a 20 20 69 36 34 20  DER==4321.  i64 
3f20: 78 3b 0a 20 20 6d 65 6d 63 70 79 28 26 78 2c 20  x;.  memcpy(&x, 
3f30: 70 2c 20 38 29 3b 0a 20 20 72 65 74 75 72 6e 20  p, 8);.  return 
3f40: 78 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72  x;.#else.  retur
3f50: 6e 20 28 69 36 34 29 28 0a 20 20 20 20 28 28 28  n (i64)(.    (((
3f60: 75 36 34 29 70 5b 30 5d 29 20 3c 3c 20 35 36 29  u64)p[0]) << 56)
3f70: 20 2b 20 0a 20 20 20 20 28 28 28 75 36 34 29 70   + .    (((u64)p
3f80: 5b 31 5d 29 20 3c 3c 20 34 38 29 20 2b 20 0a 20  [1]) << 48) + . 
3f90: 20 20 20 28 28 28 75 36 34 29 70 5b 32 5d 29 20     (((u64)p[2]) 
3fa0: 3c 3c 20 34 30 29 20 2b 20 0a 20 20 20 20 28 28  << 40) + .    ((
3fb0: 28 75 36 34 29 70 5b 33 5d 29 20 3c 3c 20 33 32  (u64)p[3]) << 32
3fc0: 29 20 2b 20 0a 20 20 20 20 28 28 28 75 36 34 29  ) + .    (((u64)
3fd0: 70 5b 34 5d 29 20 3c 3c 20 32 34 29 20 2b 20 0a  p[4]) << 24) + .
3fe0: 20 20 20 20 28 28 28 75 36 34 29 70 5b 35 5d 29      (((u64)p[5])
3ff0: 20 3c 3c 20 31 36 29 20 2b 20 0a 20 20 20 20 28   << 16) + .    (
4000: 28 28 75 36 34 29 70 5b 36 5d 29 20 3c 3c 20 20  ((u64)p[6]) <<  
4010: 38 29 20 2b 20 0a 20 20 20 20 28 28 28 75 36 34  8) + .    (((u64
4020: 29 70 5b 37 5d 29 20 3c 3c 20 20 30 29 0a 20 20  )p[7]) <<  0).  
4030: 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  );.#endif.}../*.
4040: 2a 2a 20 46 75 6e 63 74 69 6f 6e 73 20 74 6f 20  ** Functions to 
4050: 73 65 72 69 61 6c 69 7a 65 20 61 20 31 36 20 62  serialize a 16 b
4060: 69 74 20 69 6e 74 65 67 65 72 2c 20 33 32 20 62  it integer, 32 b
4070: 69 74 20 72 65 61 6c 20 6e 75 6d 62 65 72 20 61  it real number a
4080: 6e 64 0a 2a 2a 20 36 34 20 62 69 74 20 69 6e 74  nd.** 64 bit int
4090: 65 67 65 72 2e 20 54 68 65 20 76 61 6c 75 65 20  eger. The value 
40a0: 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20  returned is the 
40b0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
40c0: 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 74 68  written.** to th
40d0: 65 20 61 72 67 75 6d 65 6e 74 20 62 75 66 66 65  e argument buffe
40e0: 72 20 28 61 6c 77 61 79 73 20 32 2c 20 34 20 61  r (always 2, 4 a
40f0: 6e 64 20 38 20 72 65 73 70 65 63 74 69 76 65 6c  nd 8 respectivel
4100: 79 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  y)..*/.static vo
4110: 69 64 20 77 72 69 74 65 49 6e 74 31 36 28 75 38  id writeInt16(u8
4120: 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20 70   *p, int i){.  p
4130: 5b 30 5d 20 3d 20 28 69 3e 3e 20 38 29 26 30 78  [0] = (i>> 8)&0x
4140: 46 46 3b 0a 20 20 70 5b 31 5d 20 3d 20 28 69 3e  FF;.  p[1] = (i>
4150: 3e 20 30 29 26 30 78 46 46 3b 0a 7d 0a 73 74 61  > 0)&0xFF;.}.sta
4160: 74 69 63 20 69 6e 74 20 77 72 69 74 65 43 6f 6f  tic int writeCoo
4170: 72 64 28 75 38 20 2a 70 2c 20 52 74 72 65 65 43  rd(u8 *p, RtreeC
4180: 6f 6f 72 64 20 2a 70 43 6f 6f 72 64 29 7b 0a 20  oord *pCoord){. 
4190: 20 75 33 32 20 69 3b 0a 20 20 61 73 73 65 72 74   u32 i;.  assert
41a0: 28 20 28 28 28 28 63 68 61 72 2a 29 70 29 20 2d  ( ((((char*)p) -
41b0: 20 28 63 68 61 72 2a 29 30 29 26 33 29 3d 3d 30   (char*)0)&3)==0
41c0: 20 29 3b 20 20 2f 2a 20 70 20 69 73 20 61 6c 77   );  /* p is alw
41d0: 61 79 73 20 34 2d 62 79 74 65 20 61 6c 69 67 6e  ays 4-byte align
41e0: 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ed */.  assert( 
41f0: 73 69 7a 65 6f 66 28 52 74 72 65 65 43 6f 6f 72  sizeof(RtreeCoor
4200: 64 29 3d 3d 34 20 29 3b 0a 20 20 61 73 73 65 72  d)==4 );.  asser
4210: 74 28 20 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d  t( sizeof(u32)==
4220: 34 20 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  4 );.#if SQLITE_
4230: 42 59 54 45 4f 52 44 45 52 3d 3d 31 32 33 34 20  BYTEORDER==1234 
4240: 26 26 20 47 43 43 5f 56 45 52 53 49 4f 4e 3e 3d  && GCC_VERSION>=
4250: 34 30 30 33 30 30 30 0a 20 20 69 20 3d 20 5f 5f  4003000.  i = __
4260: 62 75 69 6c 74 69 6e 5f 62 73 77 61 70 33 32 28  builtin_bswap32(
4270: 70 43 6f 6f 72 64 2d 3e 75 29 3b 0a 20 20 6d 65  pCoord->u);.  me
4280: 6d 63 70 79 28 70 2c 20 26 69 2c 20 34 29 3b 0a  mcpy(p, &i, 4);.
4290: 23 65 6c 69 66 20 53 51 4c 49 54 45 5f 42 59 54  #elif SQLITE_BYT
42a0: 45 4f 52 44 45 52 3d 3d 31 32 33 34 20 26 26 20  EORDER==1234 && 
42b0: 4d 53 56 43 5f 56 45 52 53 49 4f 4e 3e 3d 31 33  MSVC_VERSION>=13
42c0: 30 30 0a 20 20 69 20 3d 20 5f 62 79 74 65 73 77  00.  i = _bytesw
42d0: 61 70 5f 75 6c 6f 6e 67 28 70 43 6f 6f 72 64 2d  ap_ulong(pCoord-
42e0: 3e 75 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 2c  >u);.  memcpy(p,
42f0: 20 26 69 2c 20 34 29 3b 0a 23 65 6c 69 66 20 53   &i, 4);.#elif S
4300: 51 4c 49 54 45 5f 42 59 54 45 4f 52 44 45 52 3d  QLITE_BYTEORDER=
4310: 3d 34 33 32 31 0a 20 20 69 20 3d 20 70 43 6f 6f  =4321.  i = pCoo
4320: 72 64 2d 3e 75 3b 0a 20 20 6d 65 6d 63 70 79 28  rd->u;.  memcpy(
4330: 70 2c 20 26 69 2c 20 34 29 3b 0a 23 65 6c 73 65  p, &i, 4);.#else
4340: 0a 20 20 69 20 3d 20 70 43 6f 6f 72 64 2d 3e 75  .  i = pCoord->u
4350: 3b 0a 20 20 70 5b 30 5d 20 3d 20 28 69 3e 3e 32  ;.  p[0] = (i>>2
4360: 34 29 26 30 78 46 46 3b 0a 20 20 70 5b 31 5d 20  4)&0xFF;.  p[1] 
4370: 3d 20 28 69 3e 3e 31 36 29 26 30 78 46 46 3b 0a  = (i>>16)&0xFF;.
4380: 20 20 70 5b 32 5d 20 3d 20 28 69 3e 3e 20 38 29    p[2] = (i>> 8)
4390: 26 30 78 46 46 3b 0a 20 20 70 5b 33 5d 20 3d 20  &0xFF;.  p[3] = 
43a0: 28 69 3e 3e 20 30 29 26 30 78 46 46 3b 0a 23 65  (i>> 0)&0xFF;.#e
43b0: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 34 3b  ndif.  return 4;
43c0: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  .}.static int wr
43d0: 69 74 65 49 6e 74 36 34 28 75 38 20 2a 70 2c 20  iteInt64(u8 *p, 
43e0: 69 36 34 20 69 29 7b 0a 23 69 66 20 53 51 4c 49  i64 i){.#if SQLI
43f0: 54 45 5f 42 59 54 45 4f 52 44 45 52 3d 3d 31 32  TE_BYTEORDER==12
4400: 33 34 20 26 26 20 47 43 43 5f 56 45 52 53 49 4f  34 && GCC_VERSIO
4410: 4e 3e 3d 34 30 30 33 30 30 30 0a 20 20 69 20 3d  N>=4003000.  i =
4420: 20 28 69 36 34 29 5f 5f 62 75 69 6c 74 69 6e 5f   (i64)__builtin_
4430: 62 73 77 61 70 36 34 28 28 75 36 34 29 69 29 3b  bswap64((u64)i);
4440: 0a 20 20 6d 65 6d 63 70 79 28 70 2c 20 26 69 2c  .  memcpy(p, &i,
4450: 20 38 29 3b 0a 23 65 6c 69 66 20 53 51 4c 49 54   8);.#elif SQLIT
4460: 45 5f 42 59 54 45 4f 52 44 45 52 3d 3d 31 32 33  E_BYTEORDER==123
4470: 34 20 26 26 20 4d 53 56 43 5f 56 45 52 53 49 4f  4 && MSVC_VERSIO
4480: 4e 3e 3d 31 33 30 30 0a 20 20 69 20 3d 20 28 69  N>=1300.  i = (i
4490: 36 34 29 5f 62 79 74 65 73 77 61 70 5f 75 69 6e  64)_byteswap_uin
44a0: 74 36 34 28 28 75 36 34 29 69 29 3b 0a 20 20 6d  t64((u64)i);.  m
44b0: 65 6d 63 70 79 28 70 2c 20 26 69 2c 20 38 29 3b  emcpy(p, &i, 8);
44c0: 0a 23 65 6c 69 66 20 53 51 4c 49 54 45 5f 42 59  .#elif SQLITE_BY
44d0: 54 45 4f 52 44 45 52 3d 3d 34 33 32 31 0a 20 20  TEORDER==4321.  
44e0: 6d 65 6d 63 70 79 28 70 2c 20 26 69 2c 20 38 29  memcpy(p, &i, 8)
44f0: 3b 0a 23 65 6c 73 65 0a 20 20 70 5b 30 5d 20 3d  ;.#else.  p[0] =
4500: 20 28 69 3e 3e 35 36 29 26 30 78 46 46 3b 0a 20   (i>>56)&0xFF;. 
4510: 20 70 5b 31 5d 20 3d 20 28 69 3e 3e 34 38 29 26   p[1] = (i>>48)&
4520: 30 78 46 46 3b 0a 20 20 70 5b 32 5d 20 3d 20 28  0xFF;.  p[2] = (
4530: 69 3e 3e 34 30 29 26 30 78 46 46 3b 0a 20 20 70  i>>40)&0xFF;.  p
4540: 5b 33 5d 20 3d 20 28 69 3e 3e 33 32 29 26 30 78  [3] = (i>>32)&0x
4550: 46 46 3b 0a 20 20 70 5b 34 5d 20 3d 20 28 69 3e  FF;.  p[4] = (i>
4560: 3e 32 34 29 26 30 78 46 46 3b 0a 20 20 70 5b 35  >24)&0xFF;.  p[5
4570: 5d 20 3d 20 28 69 3e 3e 31 36 29 26 30 78 46 46  ] = (i>>16)&0xFF
4580: 3b 0a 20 20 70 5b 36 5d 20 3d 20 28 69 3e 3e 20  ;.  p[6] = (i>> 
4590: 38 29 26 30 78 46 46 3b 0a 20 20 70 5b 37 5d 20  8)&0xFF;.  p[7] 
45a0: 3d 20 28 69 3e 3e 20 30 29 26 30 78 46 46 3b 0a  = (i>> 0)&0xFF;.
45b0: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
45c0: 38 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72  8;.}../*.** Incr
45d0: 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65  ement the refere
45e0: 6e 63 65 20 63 6f 75 6e 74 20 6f 66 20 6e 6f 64  nce count of nod
45f0: 65 20 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  e p..*/.static v
4600: 6f 69 64 20 6e 6f 64 65 52 65 66 65 72 65 6e 63  oid nodeReferenc
4610: 65 28 52 74 72 65 65 4e 6f 64 65 20 2a 70 29 7b  e(RtreeNode *p){
4620: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
4630: 70 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 7d  p->nRef++;.  }.}
4640: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  ../*.** Clear th
4650: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 6e 6f 64  e content of nod
4660: 65 20 70 20 28 73 65 74 20 61 6c 6c 20 62 79 74  e p (set all byt
4670: 65 73 20 74 6f 20 30 78 30 30 29 2e 0a 2a 2f 0a  es to 0x00)..*/.
4680: 73 74 61 74 69 63 20 76 6f 69 64 20 6e 6f 64 65  static void node
4690: 5a 65 72 6f 28 52 74 72 65 65 20 2a 70 52 74 72  Zero(Rtree *pRtr
46a0: 65 65 2c 20 52 74 72 65 65 4e 6f 64 65 20 2a 70  ee, RtreeNode *p
46b0: 29 7b 0a 20 20 6d 65 6d 73 65 74 28 26 70 2d 3e  ){.  memset(&p->
46c0: 7a 44 61 74 61 5b 32 5d 2c 20 30 2c 20 70 52 74  zData[2], 0, pRt
46d0: 72 65 65 2d 3e 69 4e 6f 64 65 53 69 7a 65 2d 32  ree->iNodeSize-2
46e0: 29 3b 0a 20 20 70 2d 3e 69 73 44 69 72 74 79 20  );.  p->isDirty 
46f0: 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  = 1;.}../*.** Gi
4700: 76 65 6e 20 61 20 6e 6f 64 65 20 6e 75 6d 62 65  ven a node numbe
4710: 72 20 69 4e 6f 64 65 2c 20 72 65 74 75 72 6e 20  r iNode, return 
4720: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
4730: 67 20 6b 65 79 20 74 6f 20 75 73 65 0a 2a 2a 20  g key to use.** 
4740: 69 6e 20 74 68 65 20 52 74 72 65 65 2e 61 48 61  in the Rtree.aHa
4750: 73 68 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  sh table..*/.sta
4760: 74 69 63 20 69 6e 74 20 6e 6f 64 65 48 61 73 68  tic int nodeHash
4770: 28 69 36 34 20 69 4e 6f 64 65 29 7b 0a 20 20 72  (i64 iNode){.  r
4780: 65 74 75 72 6e 20 69 4e 6f 64 65 20 25 20 48 41  eturn iNode % HA
4790: 53 48 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  SHSIZE;.}../*.**
47a0: 20 53 65 61 72 63 68 20 74 68 65 20 6e 6f 64 65   Search the node
47b0: 20 68 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20   hash table for 
47c0: 6e 6f 64 65 20 69 4e 6f 64 65 2e 20 49 66 20 66  node iNode. If f
47d0: 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 61 20 70  ound, return a p
47e0: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 69 74 2e  ointer.** to it.
47f0: 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
4800: 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rn 0..*/.static 
4810: 52 74 72 65 65 4e 6f 64 65 20 2a 6e 6f 64 65 48  RtreeNode *nodeH
4820: 61 73 68 4c 6f 6f 6b 75 70 28 52 74 72 65 65 20  ashLookup(Rtree 
4830: 2a 70 52 74 72 65 65 2c 20 69 36 34 20 69 4e 6f  *pRtree, i64 iNo
4840: 64 65 29 7b 0a 20 20 52 74 72 65 65 4e 6f 64 65  de){.  RtreeNode
4850: 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 52 74   *p;.  for(p=pRt
4860: 72 65 65 2d 3e 61 48 61 73 68 5b 6e 6f 64 65 48  ree->aHash[nodeH
4870: 61 73 68 28 69 4e 6f 64 65 29 5d 3b 20 70 20 26  ash(iNode)]; p &
4880: 26 20 70 2d 3e 69 4e 6f 64 65 21 3d 69 4e 6f 64  & p->iNode!=iNod
4890: 65 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 3b 0a  e; p=p->pNext);.
48a0: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
48b0: 2a 0a 2a 2a 20 41 64 64 20 6e 6f 64 65 20 70 4e  *.** Add node pN
48c0: 6f 64 65 20 74 6f 20 74 68 65 20 6e 6f 64 65 20  ode to the node 
48d0: 68 61 73 68 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73  hash table..*/.s
48e0: 74 61 74 69 63 20 76 6f 69 64 20 6e 6f 64 65 48  tatic void nodeH
48f0: 61 73 68 49 6e 73 65 72 74 28 52 74 72 65 65 20  ashInsert(Rtree 
4900: 2a 70 52 74 72 65 65 2c 20 52 74 72 65 65 4e 6f  *pRtree, RtreeNo
4910: 64 65 20 2a 70 4e 6f 64 65 29 7b 0a 20 20 69 6e  de *pNode){.  in
4920: 74 20 69 48 61 73 68 3b 0a 20 20 61 73 73 65 72  t iHash;.  asser
4930: 74 28 20 70 4e 6f 64 65 2d 3e 70 4e 65 78 74 3d  t( pNode->pNext=
4940: 3d 30 20 29 3b 0a 20 20 69 48 61 73 68 20 3d 20  =0 );.  iHash = 
4950: 6e 6f 64 65 48 61 73 68 28 70 4e 6f 64 65 2d 3e  nodeHash(pNode->
4960: 69 4e 6f 64 65 29 3b 0a 20 20 70 4e 6f 64 65 2d  iNode);.  pNode-
4970: 3e 70 4e 65 78 74 20 3d 20 70 52 74 72 65 65 2d  >pNext = pRtree-
4980: 3e 61 48 61 73 68 5b 69 48 61 73 68 5d 3b 0a 20  >aHash[iHash];. 
4990: 20 70 52 74 72 65 65 2d 3e 61 48 61 73 68 5b 69   pRtree->aHash[i
49a0: 48 61 73 68 5d 20 3d 20 70 4e 6f 64 65 3b 0a 7d  Hash] = pNode;.}
49b0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 6e  ../*.** Remove n
49c0: 6f 64 65 20 70 4e 6f 64 65 20 66 72 6f 6d 20 74  ode pNode from t
49d0: 68 65 20 6e 6f 64 65 20 68 61 73 68 20 74 61 62  he node hash tab
49e0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
49f0: 69 64 20 6e 6f 64 65 48 61 73 68 44 65 6c 65 74  id nodeHashDelet
4a00: 65 28 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c  e(Rtree *pRtree,
4a10: 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 4e 6f 64   RtreeNode *pNod
4a20: 65 29 7b 0a 20 20 52 74 72 65 65 4e 6f 64 65 20  e){.  RtreeNode 
4a30: 2a 2a 70 70 3b 0a 20 20 69 66 28 20 70 4e 6f 64  **pp;.  if( pNod
4a40: 65 2d 3e 69 4e 6f 64 65 21 3d 30 20 29 7b 0a 20  e->iNode!=0 ){. 
4a50: 20 20 20 70 70 20 3d 20 26 70 52 74 72 65 65 2d     pp = &pRtree-
4a60: 3e 61 48 61 73 68 5b 6e 6f 64 65 48 61 73 68 28  >aHash[nodeHash(
4a70: 70 4e 6f 64 65 2d 3e 69 4e 6f 64 65 29 5d 3b 0a  pNode->iNode)];.
4a80: 20 20 20 20 66 6f 72 28 20 3b 20 28 2a 70 70 29      for( ; (*pp)
4a90: 21 3d 70 4e 6f 64 65 3b 20 70 70 20 3d 20 26 28  !=pNode; pp = &(
4aa0: 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b 20 61 73  *pp)->pNext){ as
4ab0: 73 65 72 74 28 2a 70 70 29 3b 20 7d 0a 20 20 20  sert(*pp); }.   
4ac0: 20 2a 70 70 20 3d 20 70 4e 6f 64 65 2d 3e 70 4e   *pp = pNode->pN
4ad0: 65 78 74 3b 0a 20 20 20 20 70 4e 6f 64 65 2d 3e  ext;.    pNode->
4ae0: 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d  pNext = 0;.  }.}
4af0: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
4b00: 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 65 77 20   and return new 
4b10: 72 2d 74 72 65 65 20 6e 6f 64 65 2e 20 49 6e 69  r-tree node. Ini
4b20: 74 69 61 6c 6c 79 2c 20 28 52 74 72 65 65 4e 6f  tially, (RtreeNo
4b30: 64 65 2e 69 4e 6f 64 65 3d 3d 30 29 2c 0a 2a 2a  de.iNode==0),.**
4b40: 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74   indicating that
4b50: 20 6e 6f 64 65 20 68 61 73 20 6e 6f 74 20 79 65   node has not ye
4b60: 74 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20  t been assigned 
4b70: 61 20 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20 49  a node number. I
4b80: 74 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e 65 64  t is.** assigned
4b90: 20 61 20 6e 6f 64 65 20 6e 75 6d 62 65 72 20 77   a node number w
4ba0: 68 65 6e 20 6e 6f 64 65 57 72 69 74 65 28 29 20  hen nodeWrite() 
4bb0: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 77 72 69  is called to wri
4bc0: 74 65 20 74 68 65 0a 2a 2a 20 6e 6f 64 65 20 63  te the.** node c
4bd0: 6f 6e 74 65 6e 74 73 20 6f 75 74 20 74 6f 20 74  ontents out to t
4be0: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  he database..*/.
4bf0: 73 74 61 74 69 63 20 52 74 72 65 65 4e 6f 64 65  static RtreeNode
4c00: 20 2a 6e 6f 64 65 4e 65 77 28 52 74 72 65 65 20   *nodeNew(Rtree 
4c10: 2a 70 52 74 72 65 65 2c 20 52 74 72 65 65 4e 6f  *pRtree, RtreeNo
4c20: 64 65 20 2a 70 50 61 72 65 6e 74 29 7b 0a 20 20  de *pParent){.  
4c30: 52 74 72 65 65 4e 6f 64 65 20 2a 70 4e 6f 64 65  RtreeNode *pNode
4c40: 3b 0a 20 20 70 4e 6f 64 65 20 3d 20 28 52 74 72  ;.  pNode = (Rtr
4c50: 65 65 4e 6f 64 65 20 2a 29 73 71 6c 69 74 65 33  eeNode *)sqlite3
4c60: 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 52  _malloc(sizeof(R
4c70: 74 72 65 65 4e 6f 64 65 29 20 2b 20 70 52 74 72  treeNode) + pRtr
4c80: 65 65 2d 3e 69 4e 6f 64 65 53 69 7a 65 29 3b 0a  ee->iNodeSize);.
4c90: 20 20 69 66 28 20 70 4e 6f 64 65 20 29 7b 0a 20    if( pNode ){. 
4ca0: 20 20 20 6d 65 6d 73 65 74 28 70 4e 6f 64 65 2c     memset(pNode,
4cb0: 20 30 2c 20 73 69 7a 65 6f 66 28 52 74 72 65 65   0, sizeof(Rtree
4cc0: 4e 6f 64 65 29 20 2b 20 70 52 74 72 65 65 2d 3e  Node) + pRtree->
4cd0: 69 4e 6f 64 65 53 69 7a 65 29 3b 0a 20 20 20 20  iNodeSize);.    
4ce0: 70 4e 6f 64 65 2d 3e 7a 44 61 74 61 20 3d 20 28  pNode->zData = (
4cf0: 75 38 20 2a 29 26 70 4e 6f 64 65 5b 31 5d 3b 0a  u8 *)&pNode[1];.
4d00: 20 20 20 20 70 4e 6f 64 65 2d 3e 6e 52 65 66 20      pNode->nRef 
4d10: 3d 20 31 3b 0a 20 20 20 20 70 4e 6f 64 65 2d 3e  = 1;.    pNode->
4d20: 70 50 61 72 65 6e 74 20 3d 20 70 50 61 72 65 6e  pParent = pParen
4d30: 74 3b 0a 20 20 20 20 70 4e 6f 64 65 2d 3e 69 73  t;.    pNode->is
4d40: 44 69 72 74 79 20 3d 20 31 3b 0a 20 20 20 20 6e  Dirty = 1;.    n
4d50: 6f 64 65 52 65 66 65 72 65 6e 63 65 28 70 50 61  odeReference(pPa
4d60: 72 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74  rent);.  }.  ret
4d70: 75 72 6e 20 70 4e 6f 64 65 3b 0a 7d 0a 0a 2f 2a  urn pNode;.}../*
4d80: 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 52 74  .** Clear the Rt
4d90: 72 65 65 2e 70 4e 6f 64 65 42 6c 6f 62 20 6f 62  ree.pNodeBlob ob
4da0: 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ject.*/.static v
4db0: 6f 69 64 20 6e 6f 64 65 42 6c 6f 62 52 65 73 65  oid nodeBlobRese
4dc0: 74 28 52 74 72 65 65 20 2a 70 52 74 72 65 65 29  t(Rtree *pRtree)
4dd0: 7b 0a 20 20 69 66 28 20 70 52 74 72 65 65 2d 3e  {.  if( pRtree->
4de0: 70 4e 6f 64 65 42 6c 6f 62 20 26 26 20 70 52 74  pNodeBlob && pRt
4df0: 72 65 65 2d 3e 69 6e 57 72 54 72 61 6e 73 3d 3d  ree->inWrTrans==
4e00: 30 20 26 26 20 70 52 74 72 65 65 2d 3e 6e 43 75  0 && pRtree->nCu
4e10: 72 73 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73  rsor==0 ){.    s
4e20: 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c  qlite3_blob *pBl
4e30: 6f 62 20 3d 20 70 52 74 72 65 65 2d 3e 70 4e 6f  ob = pRtree->pNo
4e40: 64 65 42 6c 6f 62 3b 0a 20 20 20 20 70 52 74 72  deBlob;.    pRtr
4e50: 65 65 2d 3e 70 4e 6f 64 65 42 6c 6f 62 20 3d 20  ee->pNodeBlob = 
4e60: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  0;.    sqlite3_b
4e70: 6c 6f 62 5f 63 6c 6f 73 65 28 70 42 6c 6f 62 29  lob_close(pBlob)
4e80: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  ;.  }.}../*.** O
4e90: 62 74 61 69 6e 20 61 20 72 65 66 65 72 65 6e 63  btain a referenc
4ea0: 65 20 74 6f 20 61 6e 20 72 2d 74 72 65 65 20 6e  e to an r-tree n
4eb0: 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
4ec0: 6e 74 20 6e 6f 64 65 41 63 71 75 69 72 65 28 0a  nt nodeAcquire(.
4ed0: 20 20 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c    Rtree *pRtree,
4ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4ef0: 52 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  R-tree structure
4f00: 20 2a 2f 0a 20 20 69 36 34 20 69 4e 6f 64 65 2c   */.  i64 iNode,
4f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f20: 20 2f 2a 20 4e 6f 64 65 20 6e 75 6d 62 65 72 20   /* Node number 
4f30: 74 6f 20 6c 6f 61 64 20 2a 2f 0a 20 20 52 74 72  to load */.  Rtr
4f40: 65 65 4e 6f 64 65 20 2a 70 50 61 72 65 6e 74 2c  eeNode *pParent,
4f50: 20 20 20 20 20 20 20 20 2f 2a 20 45 69 74 68 65          /* Eithe
4f60: 72 20 74 68 65 20 70 61 72 65 6e 74 20 6e 6f 64  r the parent nod
4f70: 65 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 52  e or NULL */.  R
4f80: 74 72 65 65 4e 6f 64 65 20 2a 2a 70 70 4e 6f 64  treeNode **ppNod
4f90: 65 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54  e         /* OUT
4fa0: 3a 20 41 63 71 75 69 72 65 64 20 6e 6f 64 65 20  : Acquired node 
4fb0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
4fc0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 52 74   SQLITE_OK;.  Rt
4fd0: 72 65 65 4e 6f 64 65 20 2a 70 4e 6f 64 65 20 3d  reeNode *pNode =
4fe0: 20 30 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   0;..  /* Check 
4ff0: 69 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  if the requested
5000: 20 6e 6f 64 65 20 69 73 20 61 6c 72 65 61 64 79   node is already
5010: 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62   in the hash tab
5020: 6c 65 2e 20 49 66 20 73 6f 2c 0a 20 20 2a 2a 20  le. If so,.  ** 
5030: 69 6e 63 72 65 61 73 65 20 69 74 73 20 72 65 66  increase its ref
5040: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 61 6e 64  erence count and
5050: 20 72 65 74 75 72 6e 20 69 74 2e 0a 20 20 2a 2f   return it..  */
5060: 0a 20 20 69 66 28 20 28 70 4e 6f 64 65 20 3d 20  .  if( (pNode = 
5070: 6e 6f 64 65 48 61 73 68 4c 6f 6f 6b 75 70 28 70  nodeHashLookup(p
5080: 52 74 72 65 65 2c 20 69 4e 6f 64 65 29 29 20 29  Rtree, iNode)) )
5090: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
50a0: 50 61 72 65 6e 74 20 7c 7c 20 21 70 4e 6f 64 65  Parent || !pNode
50b0: 2d 3e 70 50 61 72 65 6e 74 20 7c 7c 20 70 4e 6f  ->pParent || pNo
50c0: 64 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 70 50 61  de->pParent==pPa
50d0: 72 65 6e 74 20 29 3b 0a 20 20 20 20 69 66 28 20  rent );.    if( 
50e0: 70 50 61 72 65 6e 74 20 26 26 20 21 70 4e 6f 64  pParent && !pNod
50f0: 65 2d 3e 70 50 61 72 65 6e 74 20 29 7b 0a 20 20  e->pParent ){.  
5100: 20 20 20 20 6e 6f 64 65 52 65 66 65 72 65 6e 63      nodeReferenc
5110: 65 28 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20  e(pParent);.    
5120: 20 20 70 4e 6f 64 65 2d 3e 70 50 61 72 65 6e 74    pNode->pParent
5130: 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20 20 20   = pParent;.    
5140: 7d 0a 20 20 20 20 70 4e 6f 64 65 2d 3e 6e 52 65  }.    pNode->nRe
5150: 66 2b 2b 3b 0a 20 20 20 20 2a 70 70 4e 6f 64 65  f++;.    *ppNode
5160: 20 3d 20 70 4e 6f 64 65 3b 0a 20 20 20 20 72 65   = pNode;.    re
5170: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
5180: 20 20 7d 0a 0a 20 20 69 66 28 20 70 52 74 72 65    }..  if( pRtre
5190: 65 2d 3e 70 4e 6f 64 65 42 6c 6f 62 20 29 7b 0a  e->pNodeBlob ){.
51a0: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62      sqlite3_blob
51b0: 20 2a 70 42 6c 6f 62 20 3d 20 70 52 74 72 65 65   *pBlob = pRtree
51c0: 2d 3e 70 4e 6f 64 65 42 6c 6f 62 3b 0a 20 20 20  ->pNodeBlob;.   
51d0: 20 70 52 74 72 65 65 2d 3e 70 4e 6f 64 65 42 6c   pRtree->pNodeBl
51e0: 6f 62 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  ob = 0;.    rc =
51f0: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65   sqlite3_blob_re
5200: 6f 70 65 6e 28 70 42 6c 6f 62 2c 20 69 4e 6f 64  open(pBlob, iNod
5210: 65 29 3b 0a 20 20 20 20 70 52 74 72 65 65 2d 3e  e);.    pRtree->
5220: 70 4e 6f 64 65 42 6c 6f 62 20 3d 20 70 42 6c 6f  pNodeBlob = pBlo
5230: 62 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  b;.    if( rc ){
5240: 0a 20 20 20 20 20 20 6e 6f 64 65 42 6c 6f 62 52  .      nodeBlobR
5250: 65 73 65 74 28 70 52 74 72 65 65 29 3b 0a 20 20  eset(pRtree);.  
5260: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
5270: 54 45 5f 4e 4f 4d 45 4d 20 29 20 72 65 74 75 72  TE_NOMEM ) retur
5280: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
5290: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
52a0: 70 52 74 72 65 65 2d 3e 70 4e 6f 64 65 42 6c 6f  pRtree->pNodeBlo
52b0: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72  b==0 ){.    char
52c0: 20 2a 7a 54 61 62 20 3d 20 73 71 6c 69 74 65 33   *zTab = sqlite3
52d0: 5f 6d 70 72 69 6e 74 66 28 22 25 73 5f 6e 6f 64  _mprintf("%s_nod
52e0: 65 22 2c 20 70 52 74 72 65 65 2d 3e 7a 4e 61 6d  e", pRtree->zNam
52f0: 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 61 62  e);.    if( zTab
5300: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
5310: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 72  ITE_NOMEM;.    r
5320: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
5330: 5f 6f 70 65 6e 28 70 52 74 72 65 65 2d 3e 64 62  _open(pRtree->db
5340: 2c 20 70 52 74 72 65 65 2d 3e 7a 44 62 2c 20 7a  , pRtree->zDb, z
5350: 54 61 62 2c 20 22 64 61 74 61 22 2c 20 69 4e 6f  Tab, "data", iNo
5360: 64 65 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  de, 0,.         
5370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5380: 20 20 26 70 52 74 72 65 65 2d 3e 70 4e 6f 64 65    &pRtree->pNode
5390: 42 6c 6f 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  Blob);.    sqlit
53a0: 65 33 5f 66 72 65 65 28 7a 54 61 62 29 3b 0a 20  e3_free(zTab);. 
53b0: 20 7d 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20   }.  if( rc ){. 
53c0: 20 20 20 6e 6f 64 65 42 6c 6f 62 52 65 73 65 74     nodeBlobReset
53d0: 28 70 52 74 72 65 65 29 3b 0a 20 20 20 20 2a 70  (pRtree);.    *p
53e0: 70 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 2f  pNode = 0;.    /
53f0: 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6f  * If unable to o
5400: 70 65 6e 20 61 6e 20 73 71 6c 69 74 65 33 5f 62  pen an sqlite3_b
5410: 6c 6f 62 20 6f 6e 20 74 68 65 20 64 65 73 69 72  lob on the desir
5420: 65 64 20 72 6f 77 2c 20 74 68 61 74 20 63 61 6e  ed row, that can
5430: 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 62 65 20   only.    ** be 
5440: 62 65 63 61 75 73 65 20 74 68 65 20 73 68 61 64  because the shad
5450: 6f 77 20 74 61 62 6c 65 73 20 68 6f 6c 64 20 65  ow tables hold e
5460: 72 72 6f 6e 65 6f 75 73 20 64 61 74 61 2e 20 2a  rroneous data. *
5470: 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
5480: 4c 49 54 45 5f 45 52 52 4f 52 20 29 20 72 63 20  LITE_ERROR ) rc 
5490: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
54a0: 5f 56 54 41 42 3b 0a 20 20 7d 65 6c 73 65 20 69  _VTAB;.  }else i
54b0: 66 28 20 70 52 74 72 65 65 2d 3e 69 4e 6f 64 65  f( pRtree->iNode
54c0: 53 69 7a 65 3d 3d 73 71 6c 69 74 65 33 5f 62 6c  Size==sqlite3_bl
54d0: 6f 62 5f 62 79 74 65 73 28 70 52 74 72 65 65 2d  ob_bytes(pRtree-
54e0: 3e 70 4e 6f 64 65 42 6c 6f 62 29 20 29 7b 0a 20  >pNodeBlob) ){. 
54f0: 20 20 20 70 4e 6f 64 65 20 3d 20 28 52 74 72 65     pNode = (Rtre
5500: 65 4e 6f 64 65 20 2a 29 73 71 6c 69 74 65 33 5f  eNode *)sqlite3_
5510: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 52 74  malloc(sizeof(Rt
5520: 72 65 65 4e 6f 64 65 29 2b 70 52 74 72 65 65 2d  reeNode)+pRtree-
5530: 3e 69 4e 6f 64 65 53 69 7a 65 29 3b 0a 20 20 20  >iNodeSize);.   
5540: 20 69 66 28 20 21 70 4e 6f 64 65 20 29 7b 0a 20   if( !pNode ){. 
5550: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
5560: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
5570: 65 7b 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e  e{.      pNode->
5580: 70 50 61 72 65 6e 74 20 3d 20 70 50 61 72 65 6e  pParent = pParen
5590: 74 3b 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e  t;.      pNode->
55a0: 7a 44 61 74 61 20 3d 20 28 75 38 20 2a 29 26 70  zData = (u8 *)&p
55b0: 4e 6f 64 65 5b 31 5d 3b 0a 20 20 20 20 20 20 70  Node[1];.      p
55c0: 4e 6f 64 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  Node->nRef = 1;.
55d0: 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 69 4e 6f        pNode->iNo
55e0: 64 65 20 3d 20 69 4e 6f 64 65 3b 0a 20 20 20 20  de = iNode;.    
55f0: 20 20 70 4e 6f 64 65 2d 3e 69 73 44 69 72 74 79    pNode->isDirty
5600: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 6f 64   = 0;.      pNod
5610: 65 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  e->pNext = 0;.  
5620: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
5630: 5f 62 6c 6f 62 5f 72 65 61 64 28 70 52 74 72 65  _blob_read(pRtre
5640: 65 2d 3e 70 4e 6f 64 65 42 6c 6f 62 2c 20 70 4e  e->pNodeBlob, pN
5650: 6f 64 65 2d 3e 7a 44 61 74 61 2c 0a 20 20 20 20  ode->zData,.    
5660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5670: 20 20 20 20 20 20 20 20 20 70 52 74 72 65 65 2d           pRtree-
5680: 3e 69 4e 6f 64 65 53 69 7a 65 2c 20 30 29 3b 0a  >iNodeSize, 0);.
5690: 20 20 20 20 20 20 6e 6f 64 65 52 65 66 65 72 65        nodeRefere
56a0: 6e 63 65 28 70 50 61 72 65 6e 74 29 3b 0a 20 20  nce(pParent);.  
56b0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
56c0: 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 20 77   the root node w
56d0: 61 73 20 6a 75 73 74 20 6c 6f 61 64 65 64 2c 20  as just loaded, 
56e0: 73 65 74 20 70 52 74 72 65 65 2d 3e 69 44 65 70  set pRtree->iDep
56f0: 74 68 20 74 6f 20 74 68 65 20 68 65 69 67 68 74  th to the height
5700: 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 72 2d 74  .  ** of the r-t
5710: 72 65 65 20 73 74 72 75 63 74 75 72 65 2e 20 41  ree structure. A
5720: 20 68 65 69 67 68 74 20 6f 66 20 7a 65 72 6f 20   height of zero 
5730: 6d 65 61 6e 73 20 61 6c 6c 20 64 61 74 61 20 69  means all data i
5740: 73 20 73 74 6f 72 65 64 20 6f 6e 0a 20 20 2a 2a  s stored on.  **
5750: 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2e 20   the root node. 
5760: 41 20 68 65 69 67 68 74 20 6f 66 20 6f 6e 65 20  A height of one 
5770: 6d 65 61 6e 73 20 74 68 65 20 63 68 69 6c 64 72  means the childr
5780: 65 6e 20 6f 66 20 74 68 65 20 72 6f 6f 74 20 6e  en of the root n
5790: 6f 64 65 0a 20 20 2a 2a 20 61 72 65 20 74 68 65  ode.  ** are the
57a0: 20 6c 65 61 76 65 73 2c 20 61 6e 64 20 73 6f 20   leaves, and so 
57b0: 6f 6e 2e 20 49 66 20 74 68 65 20 64 65 70 74 68  on. If the depth
57c0: 20 61 73 20 73 70 65 63 69 66 69 65 64 20 6f 6e   as specified on
57d0: 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 0a 20   the root node. 
57e0: 20 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74   ** is greater t
57f0: 68 61 6e 20 52 54 52 45 45 5f 4d 41 58 5f 44 45  han RTREE_MAX_DE
5800: 50 54 48 2c 20 74 68 65 20 72 2d 74 72 65 65 20  PTH, the r-tree 
5810: 73 74 72 75 63 74 75 72 65 20 6d 75 73 74 20 62  structure must b
5820: 65 20 63 6f 72 72 75 70 74 2e 0a 20 20 2a 2f 0a  e corrupt..  */.
5830: 20 20 69 66 28 20 70 4e 6f 64 65 20 26 26 20 69    if( pNode && i
5840: 4e 6f 64 65 3d 3d 31 20 29 7b 0a 20 20 20 20 70  Node==1 ){.    p
5850: 52 74 72 65 65 2d 3e 69 44 65 70 74 68 20 3d 20  Rtree->iDepth = 
5860: 72 65 61 64 49 6e 74 31 36 28 70 4e 6f 64 65 2d  readInt16(pNode-
5870: 3e 7a 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28  >zData);.    if(
5880: 20 70 52 74 72 65 65 2d 3e 69 44 65 70 74 68 3e   pRtree->iDepth>
5890: 52 54 52 45 45 5f 4d 41 58 5f 44 45 50 54 48 20  RTREE_MAX_DEPTH 
58a0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
58b0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54 41  LITE_CORRUPT_VTA
58c0: 42 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  B;.    }.  }..  
58d0: 2f 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 68  /* If no error h
58e0: 61 73 20 6f 63 63 75 72 72 65 64 20 73 6f 20 66  as occurred so f
58f0: 61 72 2c 20 63 68 65 63 6b 20 69 66 20 74 68 65  ar, check if the
5900: 20 22 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72   "number of entr
5910: 69 65 73 22 0a 20 20 2a 2a 20 66 69 65 6c 64 20  ies".  ** field 
5920: 6f 6e 20 74 68 65 20 6e 6f 64 65 20 69 73 20 74  on the node is t
5930: 6f 6f 20 6c 61 72 67 65 2e 20 49 66 20 73 6f 2c  oo large. If so,
5940: 20 73 65 74 20 74 68 65 20 72 65 74 75 72 6e 20   set the return 
5950: 63 6f 64 65 20 74 6f 20 0a 20 20 2a 2a 20 53 51  code to .  ** SQ
5960: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54 41  LITE_CORRUPT_VTA
5970: 42 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e  B..  */.  if( pN
5980: 6f 64 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ode && rc==SQLIT
5990: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
59a0: 4e 43 45 4c 4c 28 70 4e 6f 64 65 29 3e 28 28 70  NCELL(pNode)>((p
59b0: 52 74 72 65 65 2d 3e 69 4e 6f 64 65 53 69 7a 65  Rtree->iNodeSize
59c0: 2d 34 29 2f 70 52 74 72 65 65 2d 3e 6e 42 79 74  -4)/pRtree->nByt
59d0: 65 73 50 65 72 43 65 6c 6c 29 20 29 7b 0a 20 20  esPerCell) ){.  
59e0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
59f0: 43 4f 52 52 55 50 54 5f 56 54 41 42 3b 0a 20 20  CORRUPT_VTAB;.  
5a00: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
5a10: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
5a20: 20 20 20 20 69 66 28 20 70 4e 6f 64 65 21 3d 30      if( pNode!=0
5a30: 20 29 7b 0a 20 20 20 20 20 20 6e 6f 64 65 48 61   ){.      nodeHa
5a40: 73 68 49 6e 73 65 72 74 28 70 52 74 72 65 65 2c  shInsert(pRtree,
5a50: 20 70 4e 6f 64 65 29 3b 0a 20 20 20 20 7d 65 6c   pNode);.    }el
5a60: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
5a70: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54  QLITE_CORRUPT_VT
5a80: 41 42 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70  AB;.    }.    *p
5a90: 70 4e 6f 64 65 20 3d 20 70 4e 6f 64 65 3b 0a 20  pNode = pNode;. 
5aa0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
5ab0: 74 65 33 5f 66 72 65 65 28 70 4e 6f 64 65 29 3b  te3_free(pNode);
5ac0: 0a 20 20 20 20 2a 70 70 4e 6f 64 65 20 3d 20 30  .    *ppNode = 0
5ad0: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
5ae0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 76 65  rc;.}../*.** Ove
5af0: 72 77 72 69 74 65 20 63 65 6c 6c 20 69 43 65 6c  rwrite cell iCel
5b00: 6c 20 6f 66 20 6e 6f 64 65 20 70 4e 6f 64 65 20  l of node pNode 
5b10: 77 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74  with the content
5b20: 73 20 6f 66 20 70 43 65 6c 6c 2e 0a 2a 2f 0a 73  s of pCell..*/.s
5b30: 74 61 74 69 63 20 76 6f 69 64 20 6e 6f 64 65 4f  tatic void nodeO
5b40: 76 65 72 77 72 69 74 65 43 65 6c 6c 28 0a 20 20  verwriteCell(.  
5b50: 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c 20 20  Rtree *pRtree,  
5b60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
5b70: 65 20 6f 76 65 72 61 6c 6c 20 52 2d 54 72 65 65  e overall R-Tree
5b80: 20 2a 2f 0a 20 20 52 74 72 65 65 4e 6f 64 65 20   */.  RtreeNode 
5b90: 2a 70 4e 6f 64 65 2c 20 20 20 20 20 20 20 20 20  *pNode,         
5ba0: 20 2f 2a 20 54 68 65 20 6e 6f 64 65 20 69 6e 74   /* The node int
5bb0: 6f 20 77 68 69 63 68 20 74 68 65 20 63 65 6c 6c  o which the cell
5bc0: 20 69 73 20 74 6f 20 62 65 20 77 72 69 74 74 65   is to be writte
5bd0: 6e 20 2a 2f 0a 20 20 52 74 72 65 65 43 65 6c 6c  n */.  RtreeCell
5be0: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
5bf0: 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 74 6f    /* The cell to
5c00: 20 77 72 69 74 65 20 2a 2f 0a 20 20 69 6e 74 20   write */.  int 
5c10: 69 43 65 6c 6c 20 20 20 20 20 20 20 20 20 20 20  iCell           
5c20: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
5c30: 69 6e 74 6f 20 70 4e 6f 64 65 20 69 6e 74 6f 20  into pNode into 
5c40: 77 68 69 63 68 20 70 43 65 6c 6c 20 69 73 20 77  which pCell is w
5c50: 72 69 74 74 65 6e 20 2a 2f 0a 29 7b 0a 20 20 69  ritten */.){.  i
5c60: 6e 74 20 69 69 3b 0a 20 20 75 38 20 2a 70 20 3d  nt ii;.  u8 *p =
5c70: 20 26 70 4e 6f 64 65 2d 3e 7a 44 61 74 61 5b 34   &pNode->zData[4
5c80: 20 2b 20 70 52 74 72 65 65 2d 3e 6e 42 79 74 65   + pRtree->nByte
5c90: 73 50 65 72 43 65 6c 6c 2a 69 43 65 6c 6c 5d 3b  sPerCell*iCell];
5ca0: 0a 20 20 70 20 2b 3d 20 77 72 69 74 65 49 6e 74  .  p += writeInt
5cb0: 36 34 28 70 2c 20 70 43 65 6c 6c 2d 3e 69 52 6f  64(p, pCell->iRo
5cc0: 77 69 64 29 3b 0a 20 20 66 6f 72 28 69 69 3d 30  wid);.  for(ii=0
5cd0: 3b 20 69 69 3c 70 52 74 72 65 65 2d 3e 6e 44 69  ; ii<pRtree->nDi
5ce0: 6d 32 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 70  m2; ii++){.    p
5cf0: 20 2b 3d 20 77 72 69 74 65 43 6f 6f 72 64 28 70   += writeCoord(p
5d00: 2c 20 26 70 43 65 6c 6c 2d 3e 61 43 6f 6f 72 64  , &pCell->aCoord
5d10: 5b 69 69 5d 29 3b 0a 20 20 7d 0a 20 20 70 4e 6f  [ii]);.  }.  pNo
5d20: 64 65 2d 3e 69 73 44 69 72 74 79 20 3d 20 31 3b  de->isDirty = 1;
5d30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
5d40: 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68 20 69   the cell with i
5d50: 6e 64 65 78 20 69 43 65 6c 6c 20 66 72 6f 6d 20  ndex iCell from 
5d60: 6e 6f 64 65 20 70 4e 6f 64 65 2e 0a 2a 2f 0a 73  node pNode..*/.s
5d70: 74 61 74 69 63 20 76 6f 69 64 20 6e 6f 64 65 44  tatic void nodeD
5d80: 65 6c 65 74 65 43 65 6c 6c 28 52 74 72 65 65 20  eleteCell(Rtree 
5d90: 2a 70 52 74 72 65 65 2c 20 52 74 72 65 65 4e 6f  *pRtree, RtreeNo
5da0: 64 65 20 2a 70 4e 6f 64 65 2c 20 69 6e 74 20 69  de *pNode, int i
5db0: 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 44 73  Cell){.  u8 *pDs
5dc0: 74 20 3d 20 26 70 4e 6f 64 65 2d 3e 7a 44 61 74  t = &pNode->zDat
5dd0: 61 5b 34 20 2b 20 70 52 74 72 65 65 2d 3e 6e 42  a[4 + pRtree->nB
5de0: 79 74 65 73 50 65 72 43 65 6c 6c 2a 69 43 65 6c  ytesPerCell*iCel
5df0: 6c 5d 3b 0a 20 20 75 38 20 2a 70 53 72 63 20 3d  l];.  u8 *pSrc =
5e00: 20 26 70 44 73 74 5b 70 52 74 72 65 65 2d 3e 6e   &pDst[pRtree->n
5e10: 42 79 74 65 73 50 65 72 43 65 6c 6c 5d 3b 0a 20  BytesPerCell];. 
5e20: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 4e 43   int nByte = (NC
5e30: 45 4c 4c 28 70 4e 6f 64 65 29 20 2d 20 69 43 65  ELL(pNode) - iCe
5e40: 6c 6c 20 2d 20 31 29 20 2a 20 70 52 74 72 65 65  ll - 1) * pRtree
5e50: 2d 3e 6e 42 79 74 65 73 50 65 72 43 65 6c 6c 3b  ->nBytesPerCell;
5e60: 0a 20 20 6d 65 6d 6d 6f 76 65 28 70 44 73 74 2c  .  memmove(pDst,
5e70: 20 70 53 72 63 2c 20 6e 42 79 74 65 29 3b 0a 20   pSrc, nByte);. 
5e80: 20 77 72 69 74 65 49 6e 74 31 36 28 26 70 4e 6f   writeInt16(&pNo
5e90: 64 65 2d 3e 7a 44 61 74 61 5b 32 5d 2c 20 4e 43  de->zData[2], NC
5ea0: 45 4c 4c 28 70 4e 6f 64 65 29 2d 31 29 3b 0a 20  ELL(pNode)-1);. 
5eb0: 20 70 4e 6f 64 65 2d 3e 69 73 44 69 72 74 79 20   pNode->isDirty 
5ec0: 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  = 1;.}../*.** In
5ed0: 73 65 72 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  sert the content
5ee0: 73 20 6f 66 20 63 65 6c 6c 20 70 43 65 6c 6c 20  s of cell pCell 
5ef0: 69 6e 74 6f 20 6e 6f 64 65 20 70 4e 6f 64 65 2e  into node pNode.
5f00: 20 49 66 20 74 68 65 20 69 6e 73 65 72 74 0a 2a   If the insert.*
5f10: 2a 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  * is successful,
5f20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
5f30: 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  K..**.** If ther
5f40: 65 20 69 73 20 6e 6f 74 20 65 6e 6f 75 67 68 20  e is not enough 
5f50: 66 72 65 65 20 73 70 61 63 65 20 69 6e 20 70 4e  free space in pN
5f60: 6f 64 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ode, return SQLI
5f70: 54 45 5f 46 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74  TE_FULL..*/.stat
5f80: 69 63 20 69 6e 74 20 6e 6f 64 65 49 6e 73 65 72  ic int nodeInser
5f90: 74 43 65 6c 6c 28 0a 20 20 52 74 72 65 65 20 2a  tCell(.  Rtree *
5fa0: 70 52 74 72 65 65 2c 20 20 20 20 20 20 20 20 20  pRtree,         
5fb0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 76         /* The ov
5fc0: 65 72 61 6c 6c 20 52 2d 54 72 65 65 20 2a 2f 0a  erall R-Tree */.
5fd0: 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 4e 6f    RtreeNode *pNo
5fe0: 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  de,             
5ff0: 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63 65 6c  /* Write new cel
6000: 6c 20 69 6e 74 6f 20 74 68 69 73 20 6e 6f 64 65  l into this node
6010: 20 2a 2f 0a 20 20 52 74 72 65 65 43 65 6c 6c 20   */.  RtreeCell 
6020: 2a 70 43 65 6c 6c 20 20 20 20 20 20 20 20 20 20  *pCell          
6030: 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20      /* The cell 
6040: 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 20 2a  to be inserted *
6050: 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  /.){.  int nCell
6060: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6070: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
6080: 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  number of cells 
6090: 69 6e 20 70 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e  in pNode */.  in
60a0: 74 20 6e 4d 61 78 43 65 6c 6c 3b 20 20 20 20 20  t nMaxCell;     
60b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
60c0: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
60d0: 20 63 65 6c 6c 73 20 66 6f 72 20 70 4e 6f 64 65   cells for pNode
60e0: 20 2a 2f 0a 0a 20 20 6e 4d 61 78 43 65 6c 6c 20   */..  nMaxCell 
60f0: 3d 20 28 70 52 74 72 65 65 2d 3e 69 4e 6f 64 65  = (pRtree->iNode
6100: 53 69 7a 65 2d 34 29 2f 70 52 74 72 65 65 2d 3e  Size-4)/pRtree->
6110: 6e 42 79 74 65 73 50 65 72 43 65 6c 6c 3b 0a 20  nBytesPerCell;. 
6120: 20 6e 43 65 6c 6c 20 3d 20 4e 43 45 4c 4c 28 70   nCell = NCELL(p
6130: 4e 6f 64 65 29 3b 0a 0a 20 20 61 73 73 65 72 74  Node);..  assert
6140: 28 20 6e 43 65 6c 6c 3c 3d 6e 4d 61 78 43 65 6c  ( nCell<=nMaxCel
6150: 6c 20 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c  l );.  if( nCell
6160: 3c 6e 4d 61 78 43 65 6c 6c 20 29 7b 0a 20 20 20  <nMaxCell ){.   
6170: 20 6e 6f 64 65 4f 76 65 72 77 72 69 74 65 43 65   nodeOverwriteCe
6180: 6c 6c 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65  ll(pRtree, pNode
6190: 2c 20 70 43 65 6c 6c 2c 20 6e 43 65 6c 6c 29 3b  , pCell, nCell);
61a0: 0a 20 20 20 20 77 72 69 74 65 49 6e 74 31 36 28  .    writeInt16(
61b0: 26 70 4e 6f 64 65 2d 3e 7a 44 61 74 61 5b 32 5d  &pNode->zData[2]
61c0: 2c 20 6e 43 65 6c 6c 2b 31 29 3b 0a 20 20 20 20  , nCell+1);.    
61d0: 70 4e 6f 64 65 2d 3e 69 73 44 69 72 74 79 20 3d  pNode->isDirty =
61e0: 20 31 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72   1;.  }..  retur
61f0: 6e 20 28 6e 43 65 6c 6c 3d 3d 6e 4d 61 78 43 65  n (nCell==nMaxCe
6200: 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  ll);.}../*.** If
6210: 20 74 68 65 20 6e 6f 64 65 20 69 73 20 64 69 72   the node is dir
6220: 74 79 2c 20 77 72 69 74 65 20 69 74 20 6f 75 74  ty, write it out
6230: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
6240: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6250: 6e 6f 64 65 57 72 69 74 65 28 52 74 72 65 65 20  nodeWrite(Rtree 
6260: 2a 70 52 74 72 65 65 2c 20 52 74 72 65 65 4e 6f  *pRtree, RtreeNo
6270: 64 65 20 2a 70 4e 6f 64 65 29 7b 0a 20 20 69 6e  de *pNode){.  in
6280: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
6290: 3b 0a 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 69  ;.  if( pNode->i
62a0: 73 44 69 72 74 79 20 29 7b 0a 20 20 20 20 73 71  sDirty ){.    sq
62b0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 20 3d 20  lite3_stmt *p = 
62c0: 70 52 74 72 65 65 2d 3e 70 57 72 69 74 65 4e 6f  pRtree->pWriteNo
62d0: 64 65 3b 0a 20 20 20 20 69 66 28 20 70 4e 6f 64  de;.    if( pNod
62e0: 65 2d 3e 69 4e 6f 64 65 20 29 7b 0a 20 20 20 20  e->iNode ){.    
62f0: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
6300: 6e 74 36 34 28 70 2c 20 31 2c 20 70 4e 6f 64 65  nt64(p, 1, pNode
6310: 2d 3e 69 4e 6f 64 65 29 3b 0a 20 20 20 20 7d 65  ->iNode);.    }e
6320: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
6330: 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 2c 20  e3_bind_null(p, 
6340: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  1);.    }.    sq
6350: 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28  lite3_bind_blob(
6360: 70 2c 20 32 2c 20 70 4e 6f 64 65 2d 3e 7a 44 61  p, 2, pNode->zDa
6370: 74 61 2c 20 70 52 74 72 65 65 2d 3e 69 4e 6f 64  ta, pRtree->iNod
6380: 65 53 69 7a 65 2c 20 53 51 4c 49 54 45 5f 53 54  eSize, SQLITE_ST
6390: 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74  ATIC);.    sqlit
63a0: 65 33 5f 73 74 65 70 28 70 29 3b 0a 20 20 20 20  e3_step(p);.    
63b0: 70 4e 6f 64 65 2d 3e 69 73 44 69 72 74 79 20 3d  pNode->isDirty =
63c0: 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   0;.    rc = sql
63d0: 69 74 65 33 5f 72 65 73 65 74 28 70 29 3b 0a 20  ite3_reset(p);. 
63e0: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
63f0: 6e 75 6c 6c 28 70 2c 20 32 29 3b 0a 20 20 20 20  null(p, 2);.    
6400: 69 66 28 20 70 4e 6f 64 65 2d 3e 69 4e 6f 64 65  if( pNode->iNode
6410: 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ==0 && rc==SQLIT
6420: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 4e  E_OK ){.      pN
6430: 6f 64 65 2d 3e 69 4e 6f 64 65 20 3d 20 73 71 6c  ode->iNode = sql
6440: 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74  ite3_last_insert
6450: 5f 72 6f 77 69 64 28 70 52 74 72 65 65 2d 3e 64  _rowid(pRtree->d
6460: 62 29 3b 0a 20 20 20 20 20 20 6e 6f 64 65 48 61  b);.      nodeHa
6470: 73 68 49 6e 73 65 72 74 28 70 52 74 72 65 65 2c  shInsert(pRtree,
6480: 20 70 4e 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20   pNode);.    }. 
6490: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
64a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
64b0: 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
64c0: 61 20 6e 6f 64 65 2e 20 49 66 20 74 68 65 20 6e  a node. If the n
64d0: 6f 64 65 20 69 73 20 64 69 72 74 79 20 61 6e 64  ode is dirty and
64e0: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 0a 2a   the reference.*
64f0: 2a 20 63 6f 75 6e 74 20 64 72 6f 70 73 20 74 6f  * count drops to
6500: 20 7a 65 72 6f 2c 20 74 68 65 20 6e 6f 64 65 20   zero, the node 
6510: 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
6520: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
6530: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  .*/.static int n
6540: 6f 64 65 52 65 6c 65 61 73 65 28 52 74 72 65 65  odeRelease(Rtree
6550: 20 2a 70 52 74 72 65 65 2c 20 52 74 72 65 65 4e   *pRtree, RtreeN
6560: 6f 64 65 20 2a 70 4e 6f 64 65 29 7b 0a 20 20 69  ode *pNode){.  i
6570: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
6580: 4b 3b 0a 20 20 69 66 28 20 70 4e 6f 64 65 20 29  K;.  if( pNode )
6590: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  {.    assert( pN
65a0: 6f 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  ode->nRef>0 );. 
65b0: 20 20 20 70 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d     pNode->nRef--
65c0: 3b 0a 20 20 20 20 69 66 28 20 70 4e 6f 64 65 2d  ;.    if( pNode-
65d0: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
65e0: 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 69 4e 6f    if( pNode->iNo
65f0: 64 65 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  de==1 ){.       
6600: 20 70 52 74 72 65 65 2d 3e 69 44 65 70 74 68 20   pRtree->iDepth 
6610: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = -1;.      }.  
6620: 20 20 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 70      if( pNode->p
6630: 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  Parent ){.      
6640: 20 20 72 63 20 3d 20 6e 6f 64 65 52 65 6c 65 61    rc = nodeRelea
6650: 73 65 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65  se(pRtree, pNode
6660: 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20  ->pParent);.    
6670: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
6680: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
6690: 20 20 20 20 20 20 20 72 63 20 3d 20 6e 6f 64 65         rc = node
66a0: 57 72 69 74 65 28 70 52 74 72 65 65 2c 20 70 4e  Write(pRtree, pN
66b0: 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ode);.      }.  
66c0: 20 20 20 20 6e 6f 64 65 48 61 73 68 44 65 6c 65      nodeHashDele
66d0: 74 65 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65  te(pRtree, pNode
66e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
66f0: 5f 66 72 65 65 28 70 4e 6f 64 65 29 3b 0a 20 20  _free(pNode);.  
6700: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
6710: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
6720: 74 75 72 6e 20 74 68 65 20 36 34 2d 62 69 74 20  turn the 64-bit 
6730: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 61 73  integer value as
6740: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 65  sociated with ce
6750: 6c 6c 20 69 43 65 6c 6c 20 6f 66 0a 2a 2a 20 6e  ll iCell of.** n
6760: 6f 64 65 20 70 4e 6f 64 65 2e 20 49 66 20 70 4e  ode pNode. If pN
6770: 6f 64 65 20 69 73 20 61 20 6c 65 61 66 20 6e 6f  ode is a leaf no
6780: 64 65 2c 20 74 68 69 73 20 69 73 20 61 20 72 6f  de, this is a ro
6790: 77 69 64 2e 20 49 66 20 69 74 20 69 73 0a 2a 2a  wid. If it is.**
67a0: 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64   an internal nod
67b0: 65 2c 20 74 68 65 6e 20 74 68 65 20 36 34 2d 62  e, then the 64-b
67c0: 69 74 20 69 6e 74 65 67 65 72 20 69 73 20 61 20  it integer is a 
67d0: 63 68 69 6c 64 20 70 61 67 65 20 6e 75 6d 62 65  child page numbe
67e0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34  r..*/.static i64
67f0: 20 6e 6f 64 65 47 65 74 52 6f 77 69 64 28 0a 20   nodeGetRowid(. 
6800: 20 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c 20   Rtree *pRtree, 
6810: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 76 65        /* The ove
6820: 72 61 6c 6c 20 52 2d 54 72 65 65 20 2a 2f 0a 20  rall R-Tree */. 
6830: 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 4e 6f 64   RtreeNode *pNod
6840: 65 2c 20 20 20 20 2f 2a 20 54 68 65 20 6e 6f 64  e,    /* The nod
6850: 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20  e from which to 
6860: 65 78 74 72 61 63 74 20 74 68 65 20 49 44 20 2a  extract the ID *
6870: 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 20 20 20  /.  int iCell   
6880: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
6890: 63 65 6c 6c 20 69 6e 64 65 78 20 66 72 6f 6d 20  cell index from 
68a0: 77 68 69 63 68 20 74 6f 20 65 78 74 72 61 63 74  which to extract
68b0: 20 74 68 65 20 49 44 20 2a 2f 0a 29 7b 0a 20 20   the ID */.){.  
68c0: 61 73 73 65 72 74 28 20 69 43 65 6c 6c 3c 4e 43  assert( iCell<NC
68d0: 45 4c 4c 28 70 4e 6f 64 65 29 20 29 3b 0a 20 20  ELL(pNode) );.  
68e0: 72 65 74 75 72 6e 20 72 65 61 64 49 6e 74 36 34  return readInt64
68f0: 28 26 70 4e 6f 64 65 2d 3e 7a 44 61 74 61 5b 34  (&pNode->zData[4
6900: 20 2b 20 70 52 74 72 65 65 2d 3e 6e 42 79 74 65   + pRtree->nByte
6910: 73 50 65 72 43 65 6c 6c 2a 69 43 65 6c 6c 5d 29  sPerCell*iCell])
6920: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
6930: 6e 20 63 6f 6f 72 64 69 6e 61 74 65 20 69 43 6f  n coordinate iCo
6940: 6f 72 64 20 66 72 6f 6d 20 63 65 6c 6c 20 69 43  ord from cell iC
6950: 65 6c 6c 20 69 6e 20 6e 6f 64 65 20 70 4e 6f 64  ell in node pNod
6960: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
6970: 64 20 6e 6f 64 65 47 65 74 43 6f 6f 72 64 28 0a  d nodeGetCoord(.
6980: 20 20 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c    Rtree *pRtree,
6990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
69a0: 2a 20 54 68 65 20 6f 76 65 72 61 6c 6c 20 52 2d  * The overall R-
69b0: 54 72 65 65 20 2a 2f 0a 20 20 52 74 72 65 65 4e  Tree */.  RtreeN
69c0: 6f 64 65 20 2a 70 4e 6f 64 65 2c 20 20 20 20 20  ode *pNode,     
69d0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 6f         /* The no
69e0: 64 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f  de from which to
69f0: 20 65 78 74 72 61 63 74 20 61 20 63 6f 6f 72 64   extract a coord
6a00: 69 6e 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69  inate */.  int i
6a10: 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
6a20: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
6a30: 6e 64 65 78 20 6f 66 20 74 68 65 20 63 65 6c 6c  ndex of the cell
6a40: 20 77 69 74 68 69 6e 20 74 68 65 20 6e 6f 64 65   within the node
6a50: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6f 72 64   */.  int iCoord
6a60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6a70: 20 20 20 2f 2a 20 57 68 69 63 68 20 63 6f 6f 72     /* Which coor
6a80: 64 69 6e 61 74 65 20 74 6f 20 65 78 74 72 61 63  dinate to extrac
6a90: 74 20 2a 2f 0a 20 20 52 74 72 65 65 43 6f 6f 72  t */.  RtreeCoor
6aa0: 64 20 2a 70 43 6f 6f 72 64 20 20 20 20 20 20 20  d *pCoord       
6ab0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 70 61 63      /* OUT: Spac
6ac0: 65 20 74 6f 20 77 72 69 74 65 20 72 65 73 75 6c  e to write resul
6ad0: 74 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 72 65 61  t to */.){.  rea
6ae0: 64 43 6f 6f 72 64 28 26 70 4e 6f 64 65 2d 3e 7a  dCoord(&pNode->z
6af0: 44 61 74 61 5b 31 32 20 2b 20 70 52 74 72 65 65  Data[12 + pRtree
6b00: 2d 3e 6e 42 79 74 65 73 50 65 72 43 65 6c 6c 2a  ->nBytesPerCell*
6b10: 69 43 65 6c 6c 20 2b 20 34 2a 69 43 6f 6f 72 64  iCell + 4*iCoord
6b20: 5d 2c 20 70 43 6f 6f 72 64 29 3b 0a 7d 0a 0a 2f  ], pCoord);.}../
6b30: 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65  *.** Deserialize
6b40: 20 63 65 6c 6c 20 69 43 65 6c 6c 20 6f 66 20 6e   cell iCell of n
6b50: 6f 64 65 20 70 4e 6f 64 65 2e 20 50 6f 70 75 6c  ode pNode. Popul
6b60: 61 74 65 20 74 68 65 20 73 74 72 75 63 74 75 72  ate the structur
6b70: 65 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20  e pointed.** to 
6b80: 62 79 20 70 43 65 6c 6c 20 77 69 74 68 20 74 68  by pCell with th
6b90: 65 20 72 65 73 75 6c 74 73 2e 0a 2a 2f 0a 73 74  e results..*/.st
6ba0: 61 74 69 63 20 76 6f 69 64 20 6e 6f 64 65 47 65  atic void nodeGe
6bb0: 74 43 65 6c 6c 28 0a 20 20 52 74 72 65 65 20 2a  tCell(.  Rtree *
6bc0: 70 52 74 72 65 65 2c 20 20 20 20 20 20 20 20 20  pRtree,         
6bd0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 76 65        /* The ove
6be0: 72 61 6c 6c 20 52 2d 54 72 65 65 20 2a 2f 0a 20  rall R-Tree */. 
6bf0: 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 4e 6f 64   RtreeNode *pNod
6c00: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e,            /*
6c10: 20 54 68 65 20 6e 6f 64 65 20 63 6f 6e 74 61 69   The node contai
6c20: 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 74 6f  ning the cell to
6c30: 20 62 65 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e   be read */.  in
6c40: 74 20 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20  t iCell,        
6c50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
6c60: 64 65 78 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  dex of the cell 
6c70: 77 69 74 68 69 6e 20 74 68 65 20 6e 6f 64 65 20  within the node 
6c80: 2a 2f 0a 20 20 52 74 72 65 65 43 65 6c 6c 20 2a  */.  RtreeCell *
6c90: 70 43 65 6c 6c 20 20 20 20 20 20 20 20 20 20 20  pCell           
6ca0: 20 20 2f 2a 20 4f 55 54 3a 20 57 72 69 74 65 20    /* OUT: Write 
6cb0: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
6cc0: 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 75  s here */.){.  u
6cd0: 38 20 2a 70 44 61 74 61 3b 0a 20 20 52 74 72 65  8 *pData;.  Rtre
6ce0: 65 43 6f 6f 72 64 20 2a 70 43 6f 6f 72 64 3b 0a  eCoord *pCoord;.
6cf0: 20 20 69 6e 74 20 69 69 20 3d 20 30 3b 0a 20 20    int ii = 0;.  
6d00: 70 43 65 6c 6c 2d 3e 69 52 6f 77 69 64 20 3d 20  pCell->iRowid = 
6d10: 6e 6f 64 65 47 65 74 52 6f 77 69 64 28 70 52 74  nodeGetRowid(pRt
6d20: 72 65 65 2c 20 70 4e 6f 64 65 2c 20 69 43 65 6c  ree, pNode, iCel
6d30: 6c 29 3b 0a 20 20 70 44 61 74 61 20 3d 20 70 4e  l);.  pData = pN
6d40: 6f 64 65 2d 3e 7a 44 61 74 61 20 2b 20 28 31 32  ode->zData + (12
6d50: 20 2b 20 70 52 74 72 65 65 2d 3e 6e 42 79 74 65   + pRtree->nByte
6d60: 73 50 65 72 43 65 6c 6c 2a 69 43 65 6c 6c 29 3b  sPerCell*iCell);
6d70: 0a 20 20 70 43 6f 6f 72 64 20 3d 20 70 43 65 6c  .  pCoord = pCel
6d80: 6c 2d 3e 61 43 6f 6f 72 64 3b 0a 20 20 64 6f 7b  l->aCoord;.  do{
6d90: 0a 20 20 20 20 72 65 61 64 43 6f 6f 72 64 28 70  .    readCoord(p
6da0: 44 61 74 61 2c 20 26 70 43 6f 6f 72 64 5b 69 69  Data, &pCoord[ii
6db0: 5d 29 3b 0a 20 20 20 20 72 65 61 64 43 6f 6f 72  ]);.    readCoor
6dc0: 64 28 70 44 61 74 61 2b 34 2c 20 26 70 43 6f 6f  d(pData+4, &pCoo
6dd0: 72 64 5b 69 69 2b 31 5d 29 3b 0a 20 20 20 20 70  rd[ii+1]);.    p
6de0: 44 61 74 61 20 2b 3d 20 38 3b 0a 20 20 20 20 69  Data += 8;.    i
6df0: 69 20 2b 3d 20 32 3b 0a 20 20 7d 77 68 69 6c 65  i += 2;.  }while
6e00: 28 20 69 69 3c 70 52 74 72 65 65 2d 3e 6e 44 69  ( ii<pRtree->nDi
6e10: 6d 32 20 29 3b 0a 7d 0a 0a 0a 2f 2a 20 46 6f 72  m2 );.}.../* For
6e20: 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
6e30: 20 66 6f 72 20 74 68 65 20 66 75 6e 63 74 69 6f   for the functio
6e40: 6e 20 74 68 61 74 20 64 6f 65 73 20 74 68 65 20  n that does the 
6e50: 77 6f 72 6b 20 6f 66 0a 2a 2a 20 74 68 65 20 76  work of.** the v
6e60: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64  irtual table mod
6e70: 75 6c 65 20 78 43 72 65 61 74 65 28 29 20 61 6e  ule xCreate() an
6e80: 64 20 78 43 6f 6e 6e 65 63 74 28 29 20 6d 65 74  d xConnect() met
6e90: 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  hods..*/.static 
6ea0: 69 6e 74 20 72 74 72 65 65 49 6e 69 74 28 0a 20  int rtreeInit(. 
6eb0: 20 73 71 6c 69 74 65 33 20 2a 2c 20 76 6f 69 64   sqlite3 *, void
6ec0: 20 2a 2c 20 69 6e 74 2c 20 63 6f 6e 73 74 20 63   *, int, const c
6ed0: 68 61 72 20 2a 63 6f 6e 73 74 2a 2c 20 73 71 6c  har *const*, sql
6ee0: 69 74 65 33 5f 76 74 61 62 20 2a 2a 2c 20 63 68  ite3_vtab **, ch
6ef0: 61 72 20 2a 2a 2c 20 69 6e 74 0a 29 3b 0a 0a 2f  ar **, int.);../
6f00: 2a 20 0a 2a 2a 20 52 74 72 65 65 20 76 69 72 74  * .** Rtree virt
6f10: 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65  ual table module
6f20: 20 78 43 72 65 61 74 65 20 6d 65 74 68 6f 64 2e   xCreate method.
6f30: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
6f40: 74 72 65 65 43 72 65 61 74 65 28 0a 20 20 73 71  treeCreate(.  sq
6f50: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69  lite3 *db,.  voi
6f60: 64 20 2a 70 41 75 78 2c 0a 20 20 69 6e 74 20 61  d *pAux,.  int a
6f70: 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rgc, const char 
6f80: 2a 63 6f 6e 73 74 2a 61 72 67 76 2c 0a 20 20 73  *const*argv,.  s
6f90: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a 70 70  qlite3_vtab **pp
6fa0: 56 74 61 62 2c 0a 20 20 63 68 61 72 20 2a 2a 70  Vtab,.  char **p
6fb0: 7a 45 72 72 0a 29 7b 0a 20 20 72 65 74 75 72 6e  zErr.){.  return
6fc0: 20 72 74 72 65 65 49 6e 69 74 28 64 62 2c 20 70   rtreeInit(db, p
6fd0: 41 75 78 2c 20 61 72 67 63 2c 20 61 72 67 76 2c  Aux, argc, argv,
6fe0: 20 70 70 56 74 61 62 2c 20 70 7a 45 72 72 2c 20   ppVtab, pzErr, 
6ff0: 31 29 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 74  1);.}../* .** Rt
7000: 72 65 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ree virtual tabl
7010: 65 20 6d 6f 64 75 6c 65 20 78 43 6f 6e 6e 65 63  e module xConnec
7020: 74 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61  t method..*/.sta
7030: 74 69 63 20 69 6e 74 20 72 74 72 65 65 43 6f 6e  tic int rtreeCon
7040: 6e 65 63 74 28 0a 20 20 73 71 6c 69 74 65 33 20  nect(.  sqlite3 
7050: 2a 64 62 2c 0a 20 20 76 6f 69 64 20 2a 70 41 75  *db,.  void *pAu
7060: 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 63  x,.  int argc, c
7070: 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74  onst char *const
7080: 2a 61 72 67 76 2c 0a 20 20 73 71 6c 69 74 65 33  *argv,.  sqlite3
7090: 5f 76 74 61 62 20 2a 2a 70 70 56 74 61 62 2c 0a  _vtab **ppVtab,.
70a0: 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29    char **pzErr.)
70b0: 7b 0a 20 20 72 65 74 75 72 6e 20 72 74 72 65 65  {.  return rtree
70c0: 49 6e 69 74 28 64 62 2c 20 70 41 75 78 2c 20 61  Init(db, pAux, a
70d0: 72 67 63 2c 20 61 72 67 76 2c 20 70 70 56 74 61  rgc, argv, ppVta
70e0: 62 2c 20 70 7a 45 72 72 2c 20 30 29 3b 0a 7d 0a  b, pzErr, 0);.}.
70f0: 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74  ./*.** Increment
7100: 20 74 68 65 20 72 2d 74 72 65 65 20 72 65 66 65   the r-tree refe
7110: 72 65 6e 63 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a  rence count..*/.
7120: 73 74 61 74 69 63 20 76 6f 69 64 20 72 74 72 65  static void rtre
7130: 65 52 65 66 65 72 65 6e 63 65 28 52 74 72 65 65  eReference(Rtree
7140: 20 2a 70 52 74 72 65 65 29 7b 0a 20 20 70 52 74   *pRtree){.  pRt
7150: 72 65 65 2d 3e 6e 42 75 73 79 2b 2b 3b 0a 7d 0a  ree->nBusy++;.}.
7160: 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74  ./*.** Decrement
7170: 20 74 68 65 20 72 2d 74 72 65 65 20 72 65 66 65   the r-tree refe
7180: 72 65 6e 63 65 20 63 6f 75 6e 74 2e 20 57 68 65  rence count. Whe
7190: 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  n the reference 
71a0: 63 6f 75 6e 74 20 72 65 61 63 68 65 73 0a 2a 2a  count reaches.**
71b0: 20 7a 65 72 6f 20 74 68 65 20 73 74 72 75 63 74   zero the struct
71c0: 75 72 65 20 69 73 20 64 65 6c 65 74 65 64 2e 0a  ure is deleted..
71d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
71e0: 74 72 65 65 52 65 6c 65 61 73 65 28 52 74 72 65  treeRelease(Rtre
71f0: 65 20 2a 70 52 74 72 65 65 29 7b 0a 20 20 70 52  e *pRtree){.  pR
7200: 74 72 65 65 2d 3e 6e 42 75 73 79 2d 2d 3b 0a 20  tree->nBusy--;. 
7210: 20 69 66 28 20 70 52 74 72 65 65 2d 3e 6e 42 75   if( pRtree->nBu
7220: 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 70 52 74  sy==0 ){.    pRt
7230: 72 65 65 2d 3e 69 6e 57 72 54 72 61 6e 73 20 3d  ree->inWrTrans =
7240: 20 30 3b 0a 20 20 20 20 70 52 74 72 65 65 2d 3e   0;.    pRtree->
7250: 6e 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20  nCursor = 0;.   
7260: 20 6e 6f 64 65 42 6c 6f 62 52 65 73 65 74 28 70   nodeBlobReset(p
7270: 52 74 72 65 65 29 3b 0a 20 20 20 20 73 71 6c 69  Rtree);.    sqli
7280: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 52 74  te3_finalize(pRt
7290: 72 65 65 2d 3e 70 57 72 69 74 65 4e 6f 64 65 29  ree->pWriteNode)
72a0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
72b0: 6e 61 6c 69 7a 65 28 70 52 74 72 65 65 2d 3e 70  nalize(pRtree->p
72c0: 44 65 6c 65 74 65 4e 6f 64 65 29 3b 0a 20 20 20  DeleteNode);.   
72d0: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
72e0: 65 28 70 52 74 72 65 65 2d 3e 70 52 65 61 64 52  e(pRtree->pReadR
72f0: 6f 77 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  owid);.    sqlit
7300: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 52 74 72  e3_finalize(pRtr
7310: 65 65 2d 3e 70 57 72 69 74 65 52 6f 77 69 64 29  ee->pWriteRowid)
7320: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
7330: 6e 61 6c 69 7a 65 28 70 52 74 72 65 65 2d 3e 70  nalize(pRtree->p
7340: 44 65 6c 65 74 65 52 6f 77 69 64 29 3b 0a 20 20  DeleteRowid);.  
7350: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
7360: 7a 65 28 70 52 74 72 65 65 2d 3e 70 52 65 61 64  ze(pRtree->pRead
7370: 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 73 71 6c  Parent);.    sql
7380: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 52  ite3_finalize(pR
7390: 74 72 65 65 2d 3e 70 57 72 69 74 65 50 61 72 65  tree->pWritePare
73a0: 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  nt);.    sqlite3
73b0: 5f 66 69 6e 61 6c 69 7a 65 28 70 52 74 72 65 65  _finalize(pRtree
73c0: 2d 3e 70 44 65 6c 65 74 65 50 61 72 65 6e 74 29  ->pDeleteParent)
73d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
73e0: 65 65 28 70 52 74 72 65 65 29 3b 0a 20 20 7d 0a  ee(pRtree);.  }.
73f0: 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 74 72 65 65 20  }../* .** Rtree 
7400: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f  virtual table mo
7410: 64 75 6c 65 20 78 44 69 73 63 6f 6e 6e 65 63 74  dule xDisconnect
7420: 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74   method..*/.stat
7430: 69 63 20 69 6e 74 20 72 74 72 65 65 44 69 73 63  ic int rtreeDisc
7440: 6f 6e 6e 65 63 74 28 73 71 6c 69 74 65 33 5f 76  onnect(sqlite3_v
7450: 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 72  tab *pVtab){.  r
7460: 74 72 65 65 52 65 6c 65 61 73 65 28 28 52 74 72  treeRelease((Rtr
7470: 65 65 20 2a 29 70 56 74 61 62 29 3b 0a 20 20 72  ee *)pVtab);.  r
7480: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
7490: 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 74 72 65 65  .}../* .** Rtree
74a0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d   virtual table m
74b0: 6f 64 75 6c 65 20 78 44 65 73 74 72 6f 79 20 6d  odule xDestroy m
74c0: 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ethod..*/.static
74d0: 20 69 6e 74 20 72 74 72 65 65 44 65 73 74 72 6f   int rtreeDestro
74e0: 79 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a  y(sqlite3_vtab *
74f0: 70 56 74 61 62 29 7b 0a 20 20 52 74 72 65 65 20  pVtab){.  Rtree 
7500: 2a 70 52 74 72 65 65 20 3d 20 28 52 74 72 65 65  *pRtree = (Rtree
7510: 20 2a 29 70 56 74 61 62 3b 0a 20 20 69 6e 74 20   *)pVtab;.  int 
7520: 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 43 72 65  rc;.  char *zCre
7530: 61 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ate = sqlite3_mp
7540: 72 69 6e 74 66 28 0a 20 20 20 20 22 44 52 4f 50  rintf(.    "DROP
7550: 20 54 41 42 4c 45 20 27 25 71 27 2e 27 25 71 5f   TABLE '%q'.'%q_
7560: 6e 6f 64 65 27 3b 22 0a 20 20 20 20 22 44 52 4f  node';".    "DRO
7570: 50 20 54 41 42 4c 45 20 27 25 71 27 2e 27 25 71  P TABLE '%q'.'%q
7580: 5f 72 6f 77 69 64 27 3b 22 0a 20 20 20 20 22 44  _rowid';".    "D
7590: 52 4f 50 20 54 41 42 4c 45 20 27 25 71 27 2e 27  ROP TABLE '%q'.'
75a0: 25 71 5f 70 61 72 65 6e 74 27 3b 22 2c 0a 20 20  %q_parent';",.  
75b0: 20 20 70 52 74 72 65 65 2d 3e 7a 44 62 2c 20 70    pRtree->zDb, p
75c0: 52 74 72 65 65 2d 3e 7a 4e 61 6d 65 2c 20 0a 20  Rtree->zName, . 
75d0: 20 20 20 70 52 74 72 65 65 2d 3e 7a 44 62 2c 20     pRtree->zDb, 
75e0: 70 52 74 72 65 65 2d 3e 7a 4e 61 6d 65 2c 0a 20  pRtree->zName,. 
75f0: 20 20 20 70 52 74 72 65 65 2d 3e 7a 44 62 2c 20     pRtree->zDb, 
7600: 70 52 74 72 65 65 2d 3e 7a 4e 61 6d 65 0a 20 20  pRtree->zName.  
7610: 29 3b 0a 20 20 69 66 28 20 21 7a 43 72 65 61 74  );.  if( !zCreat
7620: 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  e ){.    rc = SQ
7630: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65  LITE_NOMEM;.  }e
7640: 6c 73 65 7b 0a 20 20 20 20 6e 6f 64 65 42 6c 6f  lse{.    nodeBlo
7650: 62 52 65 73 65 74 28 70 52 74 72 65 65 29 3b 0a  bReset(pRtree);.
7660: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
7670: 5f 65 78 65 63 28 70 52 74 72 65 65 2d 3e 64 62  _exec(pRtree->db
7680: 2c 20 7a 43 72 65 61 74 65 2c 20 30 2c 20 30 2c  , zCreate, 0, 0,
7690: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
76a0: 5f 66 72 65 65 28 7a 43 72 65 61 74 65 29 3b 0a  _free(zCreate);.
76b0: 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
76c0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
76d0: 74 72 65 65 52 65 6c 65 61 73 65 28 70 52 74 72  treeRelease(pRtr
76e0: 65 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ee);.  }..  retu
76f0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  rn rc;.}../* .**
7700: 20 52 74 72 65 65 20 76 69 72 74 75 61 6c 20 74   Rtree virtual t
7710: 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78 4f 70 65  able module xOpe
7720: 6e 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61  n method..*/.sta
7730: 74 69 63 20 69 6e 74 20 72 74 72 65 65 4f 70 65  tic int rtreeOpe
7740: 6e 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a  n(sqlite3_vtab *
7750: 70 56 54 61 62 2c 20 73 71 6c 69 74 65 33 5f 76  pVTab, sqlite3_v
7760: 74 61 62 5f 63 75 72 73 6f 72 20 2a 2a 70 70 43  tab_cursor **ppC
7770: 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20 72 63  ursor){.  int rc
7780: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
7790: 0a 20 20 52 74 72 65 65 20 2a 70 52 74 72 65 65  .  Rtree *pRtree
77a0: 20 3d 20 28 52 74 72 65 65 20 2a 29 70 56 54 61   = (Rtree *)pVTa
77b0: 62 3b 0a 20 20 52 74 72 65 65 43 75 72 73 6f 72  b;.  RtreeCursor
77c0: 20 2a 70 43 73 72 3b 0a 0a 20 20 70 43 73 72 20   *pCsr;..  pCsr 
77d0: 3d 20 28 52 74 72 65 65 43 75 72 73 6f 72 20 2a  = (RtreeCursor *
77e0: 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
77f0: 73 69 7a 65 6f 66 28 52 74 72 65 65 43 75 72 73  sizeof(RtreeCurs
7800: 6f 72 29 29 3b 0a 20 20 69 66 28 20 70 43 73 72  or));.  if( pCsr
7810: 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70   ){.    memset(p
7820: 43 73 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 52  Csr, 0, sizeof(R
7830: 74 72 65 65 43 75 72 73 6f 72 29 29 3b 0a 20 20  treeCursor));.  
7840: 20 20 70 43 73 72 2d 3e 62 61 73 65 2e 70 56 74    pCsr->base.pVt
7850: 61 62 20 3d 20 70 56 54 61 62 3b 0a 20 20 20 20  ab = pVTab;.    
7860: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
7870: 20 20 20 20 70 52 74 72 65 65 2d 3e 6e 43 75 72      pRtree->nCur
7880: 73 6f 72 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70  sor++;.  }.  *pp
7890: 43 75 72 73 6f 72 20 3d 20 28 73 71 6c 69 74 65  Cursor = (sqlite
78a0: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 29  3_vtab_cursor *)
78b0: 70 43 73 72 3b 0a 0a 20 20 72 65 74 75 72 6e 20  pCsr;..  return 
78c0: 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72  rc;.}.../*.** Fr
78d0: 65 65 20 74 68 65 20 52 74 72 65 65 43 75 72 73  ee the RtreeCurs
78e0: 6f 72 2e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 5d  or.aConstraint[]
78f0: 20 61 72 72 61 79 20 61 6e 64 20 69 74 73 20 63   array and its c
7900: 6f 6e 74 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74  ontents..*/.stat
7910: 69 63 20 76 6f 69 64 20 66 72 65 65 43 75 72 73  ic void freeCurs
7920: 6f 72 43 6f 6e 73 74 72 61 69 6e 74 73 28 52 74  orConstraints(Rt
7930: 72 65 65 43 75 72 73 6f 72 20 2a 70 43 73 72 29  reeCursor *pCsr)
7940: 7b 0a 20 20 69 66 28 20 70 43 73 72 2d 3e 61 43  {.  if( pCsr->aC
7950: 6f 6e 73 74 72 61 69 6e 74 20 29 7b 0a 20 20 20  onstraint ){.   
7960: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
7970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7980: 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74  * Used to iterat
7990: 65 20 74 68 72 6f 75 67 68 20 63 6f 6e 73 74 72  e through constr
79a0: 61 69 6e 74 20 61 72 72 61 79 20 2a 2f 0a 20 20  aint array */.  
79b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 73    for(i=0; i<pCs
79c0: 72 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  r->nConstraint; 
79d0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
79e0: 74 65 33 5f 72 74 72 65 65 5f 71 75 65 72 79 5f  te3_rtree_query_
79f0: 69 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 43  info *pInfo = pC
7a00: 73 72 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b  sr->aConstraint[
7a10: 69 5d 2e 70 49 6e 66 6f 3b 0a 20 20 20 20 20 20  i].pInfo;.      
7a20: 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20  if( pInfo ){.   
7a30: 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e       if( pInfo->
7a40: 78 44 65 6c 55 73 65 72 20 29 20 70 49 6e 66 6f  xDelUser ) pInfo
7a50: 2d 3e 78 44 65 6c 55 73 65 72 28 70 49 6e 66 6f  ->xDelUser(pInfo
7a60: 2d 3e 70 55 73 65 72 29 3b 0a 20 20 20 20 20 20  ->pUser);.      
7a70: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
7a80: 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Info);.      }. 
7a90: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
7aa0: 5f 66 72 65 65 28 70 43 73 72 2d 3e 61 43 6f 6e  _free(pCsr->aCon
7ab0: 73 74 72 61 69 6e 74 29 3b 0a 20 20 20 20 70 43  straint);.    pC
7ac0: 73 72 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 20  sr->aConstraint 
7ad0: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a  = 0;.  }.}../* .
7ae0: 2a 2a 20 52 74 72 65 65 20 76 69 72 74 75 61 6c  ** Rtree virtual
7af0: 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78 43   table module xC
7b00: 6c 6f 73 65 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a  lose method..*/.
7b10: 73 74 61 74 69 63 20 69 6e 74 20 72 74 72 65 65  static int rtree
7b20: 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 74  Close(sqlite3_vt
7b30: 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 29 7b  ab_cursor *cur){
7b40: 0a 20 20 52 74 72 65 65 20 2a 70 52 74 72 65 65  .  Rtree *pRtree
7b50: 20 3d 20 28 52 74 72 65 65 20 2a 29 28 63 75 72   = (Rtree *)(cur
7b60: 2d 3e 70 56 74 61 62 29 3b 0a 20 20 69 6e 74 20  ->pVtab);.  int 
7b70: 69 69 3b 0a 20 20 52 74 72 65 65 43 75 72 73 6f  ii;.  RtreeCurso
7b80: 72 20 2a 70 43 73 72 20 3d 20 28 52 74 72 65 65  r *pCsr = (Rtree
7b90: 43 75 72 73 6f 72 20 2a 29 63 75 72 3b 0a 20 20  Cursor *)cur;.  
7ba0: 61 73 73 65 72 74 28 20 70 52 74 72 65 65 2d 3e  assert( pRtree->
7bb0: 6e 43 75 72 73 6f 72 3e 30 20 29 3b 0a 20 20 66  nCursor>0 );.  f
7bc0: 72 65 65 43 75 72 73 6f 72 43 6f 6e 73 74 72 61  reeCursorConstra
7bd0: 69 6e 74 73 28 70 43 73 72 29 3b 0a 20 20 73 71  ints(pCsr);.  sq
7be0: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 73 72 2d  lite3_free(pCsr-
7bf0: 3e 61 50 6f 69 6e 74 29 3b 0a 20 20 66 6f 72 28  >aPoint);.  for(
7c00: 69 69 3d 30 3b 20 69 69 3c 52 54 52 45 45 5f 43  ii=0; ii<RTREE_C
7c10: 41 43 48 45 5f 53 5a 3b 20 69 69 2b 2b 29 20 6e  ACHE_SZ; ii++) n
7c20: 6f 64 65 52 65 6c 65 61 73 65 28 70 52 74 72 65  odeRelease(pRtre
7c30: 65 2c 20 70 43 73 72 2d 3e 61 4e 6f 64 65 5b 69  e, pCsr->aNode[i
7c40: 69 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  i]);.  sqlite3_f
7c50: 72 65 65 28 70 43 73 72 29 3b 0a 20 20 70 52 74  ree(pCsr);.  pRt
7c60: 72 65 65 2d 3e 6e 43 75 72 73 6f 72 2d 2d 3b 0a  ree->nCursor--;.
7c70: 20 20 6e 6f 64 65 42 6c 6f 62 52 65 73 65 74 28    nodeBlobReset(
7c80: 70 52 74 72 65 65 29 3b 0a 20 20 72 65 74 75 72  pRtree);.  retur
7c90: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
7ca0: 2f 2a 0a 2a 2a 20 52 74 72 65 65 20 76 69 72 74  /*.** Rtree virt
7cb0: 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65  ual table module
7cc0: 20 78 45 6f 66 20 6d 65 74 68 6f 64 2e 0a 2a 2a   xEof method..**
7cd0: 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  .** Return non-z
7ce0: 65 72 6f 20 69 66 20 74 68 65 20 63 75 72 73 6f  ero if the curso
7cf0: 72 20 64 6f 65 73 20 6e 6f 74 20 63 75 72 72 65  r does not curre
7d00: 6e 74 6c 79 20 70 6f 69 6e 74 20 74 6f 20 61 20  ntly point to a 
7d10: 76 61 6c 69 64 20 0a 2a 2a 20 72 65 63 6f 72 64  valid .** record
7d20: 20 28 69 2e 65 20 69 66 20 74 68 65 20 73 63 61   (i.e if the sca
7d30: 6e 20 68 61 73 20 66 69 6e 69 73 68 65 64 29 2c  n has finished),
7d40: 20 6f 72 20 7a 65 72 6f 20 6f 74 68 65 72 77 69   or zero otherwi
7d50: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
7d60: 74 20 72 74 72 65 65 45 6f 66 28 73 71 6c 69 74  t rtreeEof(sqlit
7d70: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
7d80: 63 75 72 29 7b 0a 20 20 52 74 72 65 65 43 75 72  cur){.  RtreeCur
7d90: 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 52 74 72  sor *pCsr = (Rtr
7da0: 65 65 43 75 72 73 6f 72 20 2a 29 63 75 72 3b 0a  eeCursor *)cur;.
7db0: 20 20 72 65 74 75 72 6e 20 70 43 73 72 2d 3e 61    return pCsr->a
7dc0: 74 45 4f 46 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  tEOF;.}../*.** C
7dd0: 6f 6e 76 65 72 74 20 72 61 77 20 62 69 74 73 20  onvert raw bits 
7de0: 66 72 6f 6d 20 74 68 65 20 6f 6e 2d 64 69 73 6b  from the on-disk
7df0: 20 52 54 72 65 65 20 72 65 63 6f 72 64 20 69 6e   RTree record in
7e00: 74 6f 20 61 20 63 6f 6f 72 64 69 6e 61 74 65 20  to a coordinate 
7e10: 76 61 6c 75 65 2e 0a 2a 2a 20 54 68 65 20 6f 6e  value..** The on
7e20: 2d 64 69 73 6b 20 66 6f 72 6d 61 74 20 69 73 20  -disk format is 
7e30: 62 69 67 2d 65 6e 64 69 61 6e 20 61 6e 64 20 6e  big-endian and n
7e40: 65 65 64 73 20 74 6f 20 62 65 20 63 6f 6e 76 65  eeds to be conve
7e50: 72 74 65 64 20 66 6f 72 20 6c 69 74 74 6c 65 2d  rted for little-
7e60: 0a 2a 2a 20 65 6e 64 69 61 6e 20 70 6c 61 74 66  .** endian platf
7e70: 6f 72 6d 73 2e 20 20 54 68 65 20 6f 6e 2d 64 69  orms.  The on-di
7e80: 73 6b 20 72 65 63 6f 72 64 20 73 74 6f 72 65 73  sk record stores
7e90: 20 69 6e 74 65 67 65 72 20 63 6f 6f 72 64 69 6e   integer coordin
7ea0: 61 74 65 73 20 69 66 0a 2a 2a 20 65 49 6e 74 20  ates if.** eInt 
7eb0: 69 73 20 74 72 75 65 20 61 6e 64 20 69 74 20 73  is true and it s
7ec0: 74 6f 72 65 73 20 33 32 2d 62 69 74 20 66 6c 6f  tores 32-bit flo
7ed0: 61 74 69 6e 67 20 70 6f 69 6e 74 20 72 65 63 6f  ating point reco
7ee0: 72 64 73 20 69 66 20 65 49 6e 74 20 69 73 0a 2a  rds if eInt is.*
7ef0: 2a 20 66 61 6c 73 65 2e 20 20 61 5b 5d 20 69 73  * false.  a[] is
7f00: 20 74 68 65 20 66 6f 75 72 20 62 79 74 65 73 20   the four bytes 
7f10: 6f 66 20 74 68 65 20 6f 6e 2d 64 69 73 6b 20 72  of the on-disk r
7f20: 65 63 6f 72 64 20 74 6f 20 62 65 20 64 65 63 6f  ecord to be deco
7f30: 64 65 64 2e 0a 2a 2a 20 53 74 6f 72 65 20 74 68  ded..** Store th
7f40: 65 20 72 65 73 75 6c 74 73 20 69 6e 20 22 72 22  e results in "r"
7f50: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72  ..**.** There ar
7f60: 65 20 66 69 76 65 20 76 65 72 73 69 6f 6e 73 20  e five versions 
7f70: 6f 66 20 74 68 69 73 20 6d 61 63 72 6f 2e 20 20  of this macro.  
7f80: 54 68 65 20 6c 61 73 74 20 6f 6e 65 20 69 73 20  The last one is 
7f90: 67 65 6e 65 72 69 63 2e 20 20 54 68 65 0a 2a 2a  generic.  The.**
7fa0: 20 6f 74 68 65 72 20 66 6f 75 72 20 61 72 65 20   other four are 
7fb0: 76 61 72 69 6f 75 73 20 61 72 63 68 69 74 65 63  various architec
7fc0: 74 75 72 65 73 2d 73 70 65 63 69 66 69 63 20 6f  tures-specific o
7fd0: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2e 0a 2a 2f  ptimizations..*/
7fe0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 42 59 54 45  .#if SQLITE_BYTE
7ff0: 4f 52 44 45 52 3d 3d 31 32 33 34 20 26 26 20 4d  ORDER==1234 && M
8000: 53 56 43 5f 56 45 52 53 49 4f 4e 3e 3d 31 33 30  SVC_VERSION>=130
8010: 30 0a 23 64 65 66 69 6e 65 20 52 54 52 45 45 5f  0.#define RTREE_
8020: 44 45 43 4f 44 45 5f 43 4f 4f 52 44 28 65 49 6e  DECODE_COORD(eIn
8030: 74 2c 20 61 2c 20 72 29 20 7b 20 20 20 20 20 20  t, a, r) {      
8040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8050: 20 20 5c 0a 20 20 20 20 52 74 72 65 65 43 6f 6f    \.    RtreeCoo
8060: 72 64 20 63 3b 20 20 20 20 2f 2a 20 43 6f 6f 72  rd c;    /* Coor
8070: 64 69 6e 61 74 65 20 64 65 63 6f 64 65 64 20 2a  dinate decoded *
8080: 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
8090: 20 20 20 20 5c 0a 20 20 20 20 63 2e 75 20 3d 20      \.    c.u = 
80a0: 5f 62 79 74 65 73 77 61 70 5f 75 6c 6f 6e 67 28  _byteswap_ulong(
80b0: 2a 28 75 33 32 2a 29 61 29 3b 20 20 20 20 20 20  *(u32*)a);      
80c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80d0: 20 20 20 20 20 20 5c 0a 20 20 20 20 72 20 3d 20        \.    r = 
80e0: 65 49 6e 74 20 3f 20 28 73 71 6c 69 74 65 33 5f  eInt ? (sqlite3_
80f0: 72 74 72 65 65 5f 64 62 6c 29 63 2e 69 20 3a 20  rtree_dbl)c.i : 
8100: 28 73 71 6c 69 74 65 33 5f 72 74 72 65 65 5f 64  (sqlite3_rtree_d
8110: 62 6c 29 63 2e 66 3b 20 5c 0a 7d 0a 23 65 6c 69  bl)c.f; \.}.#eli
8120: 66 20 53 51 4c 49 54 45 5f 42 59 54 45 4f 52 44  f SQLITE_BYTEORD
8130: 45 52 3d 3d 31 32 33 34 20 26 26 20 47 43 43 5f  ER==1234 && GCC_
8140: 56 45 52 53 49 4f 4e 3e 3d 34 30 30 33 30 30 30  VERSION>=4003000
8150: 0a 23 64 65 66 69 6e 65 20 52 54 52 45 45 5f 44  .#define RTREE_D
8160: 45 43 4f 44 45 5f 43 4f 4f 52 44 28 65 49 6e 74  ECODE_COORD(eInt
8170: 2c 20 61 2c 20 72 29 20 7b 20 20 20 20 20 20 20  , a, r) {       
8180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8190: 20 5c 0a 20 20 20 20 52 74 72 65 65 43 6f 6f 72   \.    RtreeCoor
81a0: 64 20 63 3b 20 20 20 20 2f 2a 20 43 6f 6f 72 64  d c;    /* Coord
81b0: 69 6e 61 74 65 20 64 65 63 6f 64 65 64 20 2a 2f  inate decoded */
81c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81d0: 20 20 20 5c 0a 20 20 20 20 63 2e 75 20 3d 20 5f     \.    c.u = _
81e0: 5f 62 75 69 6c 74 69 6e 5f 62 73 77 61 70 33 32  _builtin_bswap32
81f0: 28 2a 28 75 33 32 2a 29 61 29 3b 20 20 20 20 20  (*(u32*)a);     
8200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8210: 20 20 20 20 20 5c 0a 20 20 20 20 72 20 3d 20 65       \.    r = e
8220: 49 6e 74 20 3f 20 28 73 71 6c 69 74 65 33 5f 72  Int ? (sqlite3_r
8230: 74 72 65 65 5f 64 62 6c 29 63 2e 69 20 3a 20 28  tree_dbl)c.i : (
8240: 73 71 6c 69 74 65 33 5f 72 74 72 65 65 5f 64 62  sqlite3_rtree_db
8250: 6c 29 63 2e 66 3b 20 5c 0a 7d 0a 23 65 6c 69 66  l)c.f; \.}.#elif
8260: 20 53 51 4c 49 54 45 5f 42 59 54 45 4f 52 44 45   SQLITE_BYTEORDE
8270: 52 3d 3d 31 32 33 34 0a 23 64 65 66 69 6e 65 20  R==1234.#define 
8280: 52 54 52 45 45 5f 44 45 43 4f 44 45 5f 43 4f 4f  RTREE_DECODE_COO
8290: 52 44 28 65 49 6e 74 2c 20 61 2c 20 72 29 20 7b  RD(eInt, a, r) {
82a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82b0: 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 52 74          \.    Rt
82c0: 72 65 65 43 6f 6f 72 64 20 63 3b 20 20 20 20 2f  reeCoord c;    /
82d0: 2a 20 43 6f 6f 72 64 69 6e 61 74 65 20 64 65 63  * Coordinate dec
82e0: 6f 64 65 64 20 2a 2f 20 20 20 20 20 20 20 20 20  oded */         
82f0: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
8300: 6d 65 6d 63 70 79 28 26 63 2e 75 2c 61 2c 34 29  memcpy(&c.u,a,4)
8310: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8330: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
8340: 20 20 63 2e 75 20 3d 20 28 28 63 2e 75 3e 3e 32    c.u = ((c.u>>2
8350: 34 29 26 30 78 66 66 29 7c 28 28 63 2e 75 3e 3e  4)&0xff)|((c.u>>
8360: 38 29 26 30 78 66 66 30 30 29 7c 20 20 20 20 20  8)&0xff00)|     
8370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
8380: 20 20 20 20 20 20 20 20 20 20 28 28 63 2e 75 26            ((c.u&
8390: 30 78 66 66 29 3c 3c 32 34 29 7c 28 28 63 2e 75  0xff)<<24)|((c.u
83a0: 26 30 78 66 66 30 30 29 3c 3c 38 29 3b 20 20 20  &0xff00)<<8);   
83b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83c0: 5c 0a 20 20 20 20 72 20 3d 20 65 49 6e 74 20 3f  \.    r = eInt ?
83d0: 20 28 73 71 6c 69 74 65 33 5f 72 74 72 65 65 5f   (sqlite3_rtree_
83e0: 64 62 6c 29 63 2e 69 20 3a 20 28 73 71 6c 69 74  dbl)c.i : (sqlit
83f0: 65 33 5f 72 74 72 65 65 5f 64 62 6c 29 63 2e 66  e3_rtree_dbl)c.f
8400: 3b 20 5c 0a 7d 0a 23 65 6c 69 66 20 53 51 4c 49  ; \.}.#elif SQLI
8410: 54 45 5f 42 59 54 45 4f 52 44 45 52 3d 3d 34 33  TE_BYTEORDER==43
8420: 32 31 0a 23 64 65 66 69 6e 65 20 52 54 52 45 45  21.#define RTREE
8430: 5f 44 45 43 4f 44 45 5f 43 4f 4f 52 44 28 65 49  _DECODE_COORD(eI
8440: 6e 74 2c 20 61 2c 20 72 29 20 7b 20 20 20 20 20  nt, a, r) {     
8450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8460: 20 20 20 5c 0a 20 20 20 20 52 74 72 65 65 43 6f     \.    RtreeCo
8470: 6f 72 64 20 63 3b 20 20 20 20 2f 2a 20 43 6f 6f  ord c;    /* Coo
8480: 72 64 69 6e 61 74 65 20 64 65 63 6f 64 65 64 20  rdinate decoded 
8490: 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
84a0: 20 20 20 20 20 5c 0a 20 20 20 20 6d 65 6d 63 70       \.    memcp
84b0: 79 28 26 63 2e 75 2c 61 2c 34 29 3b 20 20 20 20  y(&c.u,a,4);    
84c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84e0: 20 20 20 20 20 20 20 5c 0a 20 20 20 20 72 20 3d         \.    r =
84f0: 20 65 49 6e 74 20 3f 20 28 73 71 6c 69 74 65 33   eInt ? (sqlite3
8500: 5f 72 74 72 65 65 5f 64 62 6c 29 63 2e 69 20 3a  _rtree_dbl)c.i :
8510: 20 28 73 71 6c 69 74 65 33 5f 72 74 72 65 65 5f   (sqlite3_rtree_
8520: 64 62 6c 29 63 2e 66 3b 20 5c 0a 7d 0a 23 65 6c  dbl)c.f; \.}.#el
8530: 73 65 0a 23 64 65 66 69 6e 65 20 52 54 52 45 45  se.#define RTREE
8540: 5f 44 45 43 4f 44 45 5f 43 4f 4f 52 44 28 65 49  _DECODE_COORD(eI
8550: 6e 74 2c 20 61 2c 20 72 29 20 7b 20 20 20 20 20  nt, a, r) {     
8560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8570: 20 20 20 5c 0a 20 20 20 20 52 74 72 65 65 43 6f     \.    RtreeCo
8580: 6f 72 64 20 63 3b 20 20 20 20 2f 2a 20 43 6f 6f  ord c;    /* Coo
8590: 72 64 69 6e 61 74 65 20 64 65 63 6f 64 65 64 20  rdinate decoded 
85a0: 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
85b0: 20 20 20 20 20 5c 0a 20 20 20 20 63 2e 75 20 3d       \.    c.u =
85c0: 20 28 28 75 33 32 29 61 5b 30 5d 3c 3c 32 34 29   ((u32)a[0]<<24)
85d0: 20 2b 20 28 28 75 33 32 29 61 5b 31 5d 3c 3c 31   + ((u32)a[1]<<1
85e0: 36 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  6)              
85f0: 20 20 20 20 20 20 20 5c 0a 20 20 20 20 20 20 20         \.       
8600: 20 20 20 20 2b 28 28 75 33 32 29 61 5b 32 5d 3c      +((u32)a[2]<
8610: 3c 38 29 20 2b 20 61 5b 33 5d 3b 20 20 20 20 20  <8) + a[3];     
8620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8630: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 72           \.    r
8640: 20 3d 20 65 49 6e 74 20 3f 20 28 73 71 6c 69 74   = eInt ? (sqlit
8650: 65 33 5f 72 74 72 65 65 5f 64 62 6c 29 63 2e 69  e3_rtree_dbl)c.i
8660: 20 3a 20 28 73 71 6c 69 74 65 33 5f 72 74 72 65   : (sqlite3_rtre
8670: 65 5f 64 62 6c 29 63 2e 66 3b 20 5c 0a 7d 0a 23  e_dbl)c.f; \.}.#
8680: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  endif../*.** Che
8690: 63 6b 20 74 68 65 20 52 54 72 65 65 20 6e 6f 64  ck the RTree nod
86a0: 65 20 6f 72 20 65 6e 74 72 79 20 67 69 76 65 6e  e or entry given
86b0: 20 62 79 20 70 43 65 6c 6c 44 61 74 61 20 61 6e   by pCellData an
86c0: 64 20 70 20 61 67 61 69 6e 73 74 20 74 68 65 20  d p against the 
86d0: 4d 41 54 43 48 0a 2a 2a 20 63 6f 6e 73 74 72 61  MATCH.** constra
86e0: 69 6e 74 20 70 43 6f 6e 73 74 72 61 69 6e 74 2e  int pConstraint.
86f0: 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74    .*/.static int
8700: 20 72 74 72 65 65 43 61 6c 6c 62 61 63 6b 43 6f   rtreeCallbackCo
8710: 6e 73 74 72 61 69 6e 74 28 0a 20 20 52 74 72 65  nstraint(.  Rtre
8720: 65 43 6f 6e 73 74 72 61 69 6e 74 20 2a 70 43 6f  eConstraint *pCo
8730: 6e 73 74 72 61 69 6e 74 2c 20 20 2f 2a 20 54 68  nstraint,  /* Th
8740: 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 6f 20  e constraint to 
8750: 74 65 73 74 20 2a 2f 0a 20 20 69 6e 74 20 65 49  test */.  int eI
8760: 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nt,             
8770: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
8780: 20 69 66 20 52 54 72 65 65 20 68 6f 6c 64 69 6e   if RTree holdin
8790: 67 20 69 6e 74 65 67 65 72 20 63 6f 6f 72 64 69  g integer coordi
87a0: 6e 61 74 65 73 20 2a 2f 0a 20 20 75 38 20 2a 70  nates */.  u8 *p
87b0: 43 65 6c 6c 44 61 74 61 2c 20 20 20 20 20 20 20  CellData,       
87c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 61 77            /* Raw
87d0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f   cell content */
87e0: 0a 20 20 52 74 72 65 65 53 65 61 72 63 68 50 6f  .  RtreeSearchPo
87f0: 69 6e 74 20 2a 70 53 65 61 72 63 68 2c 20 20 20  int *pSearch,   
8800: 20 20 2f 2a 20 43 6f 6e 74 61 69 6e 65 72 20 6f    /* Container o
8810: 66 20 74 68 69 73 20 63 65 6c 6c 20 2a 2f 0a 20  f this cell */. 
8820: 20 73 71 6c 69 74 65 33 5f 72 74 72 65 65 5f 64   sqlite3_rtree_d
8830: 62 6c 20 2a 70 72 53 63 6f 72 65 2c 20 20 20 20  bl *prScore,    
8840: 2f 2a 20 4f 55 54 3a 20 73 63 6f 72 65 20 66 6f  /* OUT: score fo
8850: 72 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  r the cell */.  
8860: 69 6e 74 20 2a 70 65 57 69 74 68 69 6e 20 20 20  int *peWithin   
8870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8880: 2a 20 4f 55 54 3a 20 76 69 73 69 62 69 6c 69 74  * OUT: visibilit
8890: 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f  y of the cell */
88a0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 72 74  .){.  sqlite3_rt
88b0: 72 65 65 5f 71 75 65 72 79 5f 69 6e 66 6f 20 2a  ree_query_info *
88c0: 70 49 6e 66 6f 20 3d 20 70 43 6f 6e 73 74 72 61  pInfo = pConstra
88d0: 69 6e 74 2d 3e 70 49 6e 66 6f 3b 20 2f 2a 20 43  int->pInfo; /* C
88e0: 61 6c 6c 62 61 63 6b 20 69 6e 66 6f 20 2a 2f 0a  allback info */.
88f0: 20 20 69 6e 74 20 6e 43 6f 6f 72 64 20 3d 20 70    int nCoord = p
8900: 49 6e 66 6f 2d 3e 6e 43 6f 6f 72 64 3b 20 20 20  Info->nCoord;   
8910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8920: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2e 20 6f          /* No. o
8930: 66 20 63 6f 6f 72 64 69 6e 61 74 65 73 20 2a 2f  f coordinates */
8940: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
8950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8970: 20 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 62 61         /* Callba
8980: 63 6b 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  ck return code *
8990: 2f 0a 20 20 52 74 72 65 65 43 6f 6f 72 64 20 63  /.  RtreeCoord c
89a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
89b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
89c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 61 6e 73          /* Trans
89d0: 6c 61 74 6f 72 20 75 6e 69 6f 6e 20 2a 2f 0a 20  lator union */. 
89e0: 20 73 71 6c 69 74 65 33 5f 72 74 72 65 65 5f 64   sqlite3_rtree_d
89f0: 62 6c 20 61 43 6f 6f 72 64 5b 52 54 52 45 45 5f  bl aCoord[RTREE_
8a00: 4d 41 58 5f 44 49 4d 45 4e 53 49 4f 4e 53 2a 32  MAX_DIMENSIONS*2
8a10: 5d 3b 20 20 20 2f 2a 20 44 65 63 6f 64 65 64 20  ];   /* Decoded 
8a20: 63 6f 6f 72 64 69 6e 61 74 65 73 20 2a 2f 0a 0a  coordinates */..
8a30: 20 20 61 73 73 65 72 74 28 20 70 43 6f 6e 73 74    assert( pConst
8a40: 72 61 69 6e 74 2d 3e 6f 70 3d 3d 52 54 52 45 45  raint->op==RTREE
8a50: 5f 4d 41 54 43 48 20 7c 7c 20 70 43 6f 6e 73 74  _MATCH || pConst
8a60: 72 61 69 6e 74 2d 3e 6f 70 3d 3d 52 54 52 45 45  raint->op==RTREE
8a70: 5f 51 55 45 52 59 20 29 3b 0a 20 20 61 73 73 65  _QUERY );.  asse
8a80: 72 74 28 20 6e 43 6f 6f 72 64 3d 3d 32 20 7c 7c  rt( nCoord==2 ||
8a90: 20 6e 43 6f 6f 72 64 3d 3d 34 20 7c 7c 20 6e 43   nCoord==4 || nC
8aa0: 6f 6f 72 64 3d 3d 36 20 7c 7c 20 6e 43 6f 6f 72  oord==6 || nCoor
8ab0: 64 3d 3d 38 20 7c 7c 20 6e 43 6f 6f 72 64 3d 3d  d==8 || nCoord==
8ac0: 31 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 43 6f  10 );..  if( pCo
8ad0: 6e 73 74 72 61 69 6e 74 2d 3e 6f 70 3d 3d 52 54  nstraint->op==RT
8ae0: 52 45 45 5f 51 55 45 52 59 20 26 26 20 70 53 65  REE_QUERY && pSe
8af0: 61 72 63 68 2d 3e 69 4c 65 76 65 6c 3d 3d 31 20  arch->iLevel==1 
8b00: 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 52  ){.    pInfo->iR
8b10: 6f 77 69 64 20 3d 20 72 65 61 64 49 6e 74 36 34  owid = readInt64
8b20: 28 70 43 65 6c 6c 44 61 74 61 29 3b 0a 20 20 7d  (pCellData);.  }
8b30: 0a 20 20 70 43 65 6c 6c 44 61 74 61 20 2b 3d 20  .  pCellData += 
8b40: 38 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  8;.#ifndef SQLIT
8b50: 45 5f 52 54 52 45 45 5f 49 4e 54 5f 4f 4e 4c 59  E_RTREE_INT_ONLY
8b60: 0a 20 20 69 66 28 20 65 49 6e 74 3d 3d 30 20 29  .  if( eInt==0 )
8b70: 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 6e 43  {.    switch( nC
8b80: 6f 6f 72 64 20 29 7b 0a 20 20 20 20 20 20 63 61  oord ){.      ca
8b90: 73 65 20 31 30 3a 20 20 72 65 61 64 43 6f 6f 72  se 10:  readCoor
8ba0: 64 28 70 43 65 6c 6c 44 61 74 61 2b 33 36 2c 20  d(pCellData+36, 
8bb0: 26 63 29 3b 20 61 43 6f 6f 72 64 5b 39 5d 20 3d  &c); aCoord[9] =
8bc0: 20 63 2e 66 3b 0a 20 20 20 20 20 20 20 20 20 20   c.f;.          
8bd0: 20 20 20 20 20 20 72 65 61 64 43 6f 6f 72 64 28        readCoord(
8be0: 70 43 65 6c 6c 44 61 74 61 2b 33 32 2c 20 26 63  pCellData+32, &c
8bf0: 29 3b 20 61 43 6f 6f 72 64 5b 38 5d 20 3d 20 63  ); aCoord[8] = c
8c00: 2e 66 3b 0a 20 20 20 20 20 20 63 61 73 65 20 38  .f;.      case 8
8c10: 3a 20 20 20 72 65 61 64 43 6f 6f 72 64 28 70 43  :   readCoord(pC
8c20: 65 6c 6c 44 61 74 61 2b 32 38 2c 20 26 63 29 3b  ellData+28, &c);
8c30: 20 61 43 6f 6f 72 64 5b 37 5d 20 3d 20 63 2e 66   aCoord[7] = c.f
8c40: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
8c50: 20 20 72 65 61 64 43 6f 6f 72 64 28 70 43 65 6c    readCoord(pCel
8c60: 6c 44 61 74 61 2b 32 34 2c 20 26 63 29 3b 20 61  lData+24, &c); a
8c70: 43 6f 6f 72 64 5b 36 5d 20 3d 20 63 2e 66 3b 0a  Coord[6] = c.f;.
8c80: 20 20 20 20 20 20 63 61 73 65 20 36 3a 20 20 20        case 6:   
8c90: 72 65 61 64 43 6f 6f 72 64 28 70 43 65 6c 6c 44  readCoord(pCellD
8ca0: 61 74 61 2b 32 30 2c 20 26 63 29 3b 20 61 43 6f  ata+20, &c); aCo
8cb0: 6f 72 64 5b 35 5d 20 3d 20 63 2e 66 3b 0a 20 20  ord[5] = c.f;.  
8cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
8cd0: 61 64 43 6f 6f 72 64 28 70 43 65 6c 6c 44 61 74  adCoord(pCellDat
8ce0: 61 2b 31 36 2c 20 26 63 29 3b 20 61 43 6f 6f 72  a+16, &c); aCoor
8cf0: 64 5b 34 5d 20 3d 20 63 2e 66 3b 0a 20 20 20 20  d[4] = c.f;.    
8d00: 20 20 63 61 73 65 20 34 3a 20 20 20 72 65 61 64    case 4:   read
8d10: 43 6f 6f 72 64 28 70 43 65 6c 6c 44 61 74 61 2b  Coord(pCellData+
8d20: 31 32 2c 20 26 63 29 3b 20 61 43 6f 6f 72 64 5b  12, &c); aCoord[
8d30: 33 5d 20 3d 20 63 2e 66 3b 0a 20 20 20 20 20 20  3] = c.f;.      
8d40: 20 20 20 20 20 20 20 20 20 20 72 65 61 64 43 6f            readCo
8d50: 6f 72 64 28 70 43 65 6c 6c 44 61 74 61 2b 38 2c  ord(pCellData+8,
8d60: 20 20 26 63 29 3b 20 61 43 6f 6f 72 64 5b 32 5d    &c); aCoord[2]
8d70: 20 3d 20 63 2e 66 3b 0a 20 20 20 20 20 20 64 65   = c.f;.      de
8d80: 66 61 75 6c 74 3a 20 20 72 65 61 64 43 6f 6f 72  fault:  readCoor
8d90: 64 28 70 43 65 6c 6c 44 61 74 61 2b 34 2c 20 20  d(pCellData+4,  
8da0: 26 63 29 3b 20 61 43 6f 6f 72 64 5b 31 5d 20 3d  &c); aCoord[1] =
8db0: 20 63 2e 66 3b 0a 20 20 20 20 20 20 20 20 20 20   c.f;.          
8dc0: 20 20 20 20 20 20 72 65 61 64 43 6f 6f 72 64 28        readCoord(
8dd0: 70 43 65 6c 6c 44 61 74 61 2c 20 20 20 20 26 63  pCellData,    &c
8de0: 29 3b 20 61 43 6f 6f 72 64 5b 30 5d 20 3d 20 63  ); aCoord[0] = c
8df0: 2e 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  .f;.    }.  }els
8e00: 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20  e.#endif.  {.   
8e10: 20 73 77 69 74 63 68 28 20 6e 43 6f 6f 72 64 20   switch( nCoord 
8e20: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 31 30  ){.      case 10
8e30: 3a 20 20 72 65 61 64 43 6f 6f 72 64 28 70 43 65  :  readCoord(pCe
8e40: 6c 6c 44 61 74 61 2b 33 36 2c 20 26 63 29 3b 20  llData+36, &c); 
8e50: 61 43 6f 6f 72 64 5b 39 5d 20 3d 20 63 2e 69 3b  aCoord[9] = c.i;
8e60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8e70: 20 72 65 61 64 43 6f 6f 72 64 28 70 43 65 6c 6c   readCoord(pCell
8e80: 44 61 74 61 2b 33 32 2c 20 26 63 29 3b 20 61 43  Data+32, &c); aC
8e90: 6f 6f 72 64 5b 38 5d 20 3d 20 63 2e 69 3b 0a 20  oord[8] = c.i;. 
8ea0: 20 20 20 20 20 63 61 73 65 20 38 3a 20 20 20 72       case 8:   r
8eb0: 65 61 64 43 6f 6f 72 64 28 70 43 65 6c 6c 44 61  eadCoord(pCellDa
8ec0: 74 61 2b 32 38 2c 20 26 63 29 3b 20 61 43 6f 6f  ta+28, &c); aCoo
8ed0: 72 64 5b 37 5d 20 3d 20 63 2e 69 3b 0a 20 20 20  rd[7] = c.i;.   
8ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 61               rea
8ef0: 64 43 6f 6f 72 64 28 70 43 65 6c 6c 44 61 74 61  dCoord(pCellData
8f00: 2b 32 34 2c 20 26 63 29 3b 20 61 43 6f 6f 72 64  +24, &c); aCoord
8f10: 5b 36 5d 20 3d 20 63 2e 69 3b 0a 20 20 20 20 20  [6] = c.i;.     
8f20: 20 63 61 73 65 20 36 3a 20 20 20 72 65 61 64 43   case 6:   readC
8f30: 6f 6f 72 64 28 70 43 65 6c 6c 44 61 74 61 2b 32  oord(pCellData+2
8f40: 30 2c 20 26 63 29 3b 20 61 43 6f 6f 72 64 5b 35  0, &c); aCoord[5
8f50: 5d 20 3d 20 63 2e 69 3b 0a 20 20 20 20 20 20 20  ] = c.i;.       
8f60: 20 20 20 20 20 20 20 20 20 72 65 61 64 43 6f 6f           readCoo
8f70: 72 64 28 70 43 65 6c 6c 44 61 74 61 2b 31 36 2c  rd(pCellData+16,
8f80: 20 26 63 29 3b 20 61 43 6f 6f 72 64 5b 34 5d 20   &c); aCoord[4] 
8f90: 3d 20 63 2e 69 3b 0a 20 20 20 20 20 20 63 61 73  = c.i;.      cas
8fa0: 65 20 34 3a 20 20 20 72 65 61 64 43 6f 6f 72 64  e 4:   readCoord
8fb0: 28 70 43 65 6c 6c 44 61 74 61 2b 31 32 2c 20 26  (pCellData+12, &
8fc0: 63 29 3b 20 61 43 6f 6f 72 64 5b 33 5d 20 3d 20  c); aCoord[3] = 
8fd0: 63 2e 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20  c.i;.           
8fe0: 20 20 20 20 20 72 65 61 64 43 6f 6f 72 64 28 70       readCoord(p
8ff0: 43 65 6c 6c 44 61 74 61 2b 38 2c 20 20 26 63 29  CellData+8,  &c)
9000: 3b 20 61 43 6f 6f 72 64 5b 32 5d 20 3d 20 63 2e  ; aCoord[2] = c.
9010: 69 3b 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74  i;.      default
9020: 3a 20 20 72 65 61 64 43 6f 6f 72 64 28 70 43 65  :  readCoord(pCe
9030: 6c 6c 44 61 74 61 2b 34 2c 20 20 26 63 29 3b 20  llData+4,  &c); 
9040: 61 43 6f 6f 72 64 5b 31 5d 20 3d 20 63 2e 69 3b  aCoord[1] = c.i;
9050: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9060: 20 72 65 61 64 43 6f 6f 72 64 28 70 43 65 6c 6c   readCoord(pCell
9070: 44 61 74 61 2c 20 20 20 20 26 63 29 3b 20 61 43  Data,    &c); aC
9080: 6f 6f 72 64 5b 30 5d 20 3d 20 63 2e 69 3b 0a 20  oord[0] = c.i;. 
9090: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
90a0: 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f 70 3d 3d  Constraint->op==
90b0: 52 54 52 45 45 5f 4d 41 54 43 48 20 29 7b 0a 20  RTREE_MATCH ){. 
90c0: 20 20 20 69 6e 74 20 65 57 69 74 68 69 6e 20 3d     int eWithin =
90d0: 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 70 43 6f   0;.    rc = pCo
90e0: 6e 73 74 72 61 69 6e 74 2d 3e 75 2e 78 47 65 6f  nstraint->u.xGeo
90f0: 6d 28 28 73 71 6c 69 74 65 33 5f 72 74 72 65 65  m((sqlite3_rtree
9100: 5f 67 65 6f 6d 65 74 72 79 2a 29 70 49 6e 66 6f  _geometry*)pInfo
9110: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
9120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9130: 6e 43 6f 6f 72 64 2c 20 61 43 6f 6f 72 64 2c 20  nCoord, aCoord, 
9140: 26 65 57 69 74 68 69 6e 29 3b 0a 20 20 20 20 69  &eWithin);.    i
9150: 66 28 20 65 57 69 74 68 69 6e 3d 3d 30 20 29 20  f( eWithin==0 ) 
9160: 2a 70 65 57 69 74 68 69 6e 20 3d 20 4e 4f 54 5f  *peWithin = NOT_
9170: 57 49 54 48 49 4e 3b 0a 20 20 20 20 2a 70 72 53  WITHIN;.    *prS
9180: 63 6f 72 65 20 3d 20 52 54 52 45 45 5f 5a 45 52  core = RTREE_ZER
9190: 4f 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  O;.  }else{.    
91a0: 70 49 6e 66 6f 2d 3e 61 43 6f 6f 72 64 20 3d 20  pInfo->aCoord = 
91b0: 61 43 6f 6f 72 64 3b 0a 20 20 20 20 70 49 6e 66  aCoord;.    pInf
91c0: 6f 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 53 65 61  o->iLevel = pSea
91d0: 72 63 68 2d 3e 69 4c 65 76 65 6c 20 2d 20 31 3b  rch->iLevel - 1;
91e0: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 72 53 63 6f  .    pInfo->rSco
91f0: 72 65 20 3d 20 70 49 6e 66 6f 2d 3e 72 50 61 72  re = pInfo->rPar
9200: 65 6e 74 53 63 6f 72 65 20 3d 20 70 53 65 61 72  entScore = pSear
9210: 63 68 2d 3e 72 53 63 6f 72 65 3b 0a 20 20 20 20  ch->rScore;.    
9220: 70 49 6e 66 6f 2d 3e 65 57 69 74 68 69 6e 20 3d  pInfo->eWithin =
9230: 20 70 49 6e 66 6f 2d 3e 65 50 61 72 65 6e 74 57   pInfo->eParentW
9240: 69 74 68 69 6e 20 3d 20 70 53 65 61 72 63 68 2d  ithin = pSearch-
9250: 3e 65 57 69 74 68 69 6e 3b 0a 20 20 20 20 72 63  >eWithin;.    rc
9260: 20 3d 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e   = pConstraint->
9270: 75 2e 78 51 75 65 72 79 46 75 6e 63 28 70 49 6e  u.xQueryFunc(pIn
9280: 66 6f 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  fo);.    if( pIn
9290: 66 6f 2d 3e 65 57 69 74 68 69 6e 3c 2a 70 65 57  fo->eWithin<*peW
92a0: 69 74 68 69 6e 20 29 20 2a 70 65 57 69 74 68 69  ithin ) *peWithi
92b0: 6e 20 3d 20 70 49 6e 66 6f 2d 3e 65 57 69 74 68  n = pInfo->eWith
92c0: 69 6e 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 66  in;.    if( pInf
92d0: 6f 2d 3e 72 53 63 6f 72 65 3c 2a 70 72 53 63 6f  o->rScore<*prSco
92e0: 72 65 20 7c 7c 20 2a 70 72 53 63 6f 72 65 3c 52  re || *prScore<R
92f0: 54 52 45 45 5f 5a 45 52 4f 20 29 7b 0a 20 20 20  TREE_ZERO ){.   
9300: 20 20 20 2a 70 72 53 63 6f 72 65 20 3d 20 70 49     *prScore = pI
9310: 6e 66 6f 2d 3e 72 53 63 6f 72 65 3b 0a 20 20 20  nfo->rScore;.   
9320: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
9330: 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 43 68  rc;.}../* .** Ch
9340: 65 63 6b 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  eck the internal
9350: 20 52 54 72 65 65 20 6e 6f 64 65 20 67 69 76 65   RTree node give
9360: 6e 20 62 79 20 70 43 65 6c 6c 44 61 74 61 20 61  n by pCellData a
9370: 67 61 69 6e 73 74 20 63 6f 6e 73 74 72 61 69 6e  gainst constrain
9380: 74 20 70 2e 0a 2a 2a 20 49 66 20 74 68 69 73 20  t p..** If this 
9390: 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f  constraint canno
93a0: 74 20 62 65 20 73 61 74 69 73 66 69 65 64 20 62  t be satisfied b
93b0: 79 20 61 6e 79 20 63 68 69 6c 64 20 77 69 74 68  y any child with
93c0: 69 6e 20 74 68 65 20 6e 6f 64 65 2c 0a 2a 2a 20  in the node,.** 
93d0: 73 65 74 20 2a 70 65 57 69 74 68 69 6e 20 74 6f  set *peWithin to
93e0: 20 4e 4f 54 5f 57 49 54 48 49 4e 2e 0a 2a 2f 0a   NOT_WITHIN..*/.
93f0: 73 74 61 74 69 63 20 76 6f 69 64 20 72 74 72 65  static void rtre
9400: 65 4e 6f 6e 6c 65 61 66 43 6f 6e 73 74 72 61 69  eNonleafConstrai
9410: 6e 74 28 0a 20 20 52 74 72 65 65 43 6f 6e 73 74  nt(.  RtreeConst
9420: 72 61 69 6e 74 20 2a 70 2c 20 20 20 20 20 20 20  raint *p,       
9430: 20 2f 2a 20 54 68 65 20 63 6f 6e 73 74 72 61 69   /* The constrai
9440: 6e 74 20 74 6f 20 74 65 73 74 20 2a 2f 0a 20 20  nt to test */.  
9450: 69 6e 74 20 65 49 6e 74 2c 20 20 20 20 20 20 20  int eInt,       
9460: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
9470: 75 65 20 69 66 20 52 54 72 65 65 20 68 6f 6c 64  ue if RTree hold
9480: 73 20 69 6e 74 65 67 65 72 20 63 6f 6f 72 64 69  s integer coordi
9490: 6e 61 74 65 73 20 2a 2f 0a 20 20 75 38 20 2a 70  nates */.  u8 *p
94a0: 43 65 6c 6c 44 61 74 61 2c 20 20 20 20 20 20 20  CellData,       
94b0: 20 20 20 20 20 20 2f 2a 20 52 61 77 20 63 65 6c        /* Raw cel
94c0: 6c 20 63 6f 6e 74 65 6e 74 20 61 73 20 61 70 70  l content as app
94d0: 65 61 72 73 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a  ears on disk */.
94e0: 20 20 69 6e 74 20 2a 70 65 57 69 74 68 69 6e 20    int *peWithin 
94f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9500: 41 64 6a 75 73 74 20 64 6f 77 6e 77 61 72 64 2c  Adjust downward,
9510: 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 20   as appropriate 
9520: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  */.){.  sqlite3_
9530: 72 74 72 65 65 5f 64 62 6c 20 76 61 6c 3b 20 20  rtree_dbl val;  
9540: 20 20 20 2f 2a 20 43 6f 6f 72 64 69 6e 61 74 65     /* Coordinate
9550: 20 76 61 6c 75 65 20 63 6f 6e 76 65 72 74 20 74   value convert t
9560: 6f 20 61 20 64 6f 75 62 6c 65 20 2a 2f 0a 0a 20  o a double */.. 
9570: 20 2f 2a 20 70 2d 3e 69 43 6f 6f 72 64 20 6d 69   /* p->iCoord mi
9580: 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 65 69 74  ght point to eit
9590: 68 65 72 20 61 20 6c 6f 77 65 72 20 6f 72 20 75  her a lower or u
95a0: 70 70 65 72 20 62 6f 75 6e 64 20 63 6f 6f 72 64  pper bound coord
95b0: 69 6e 61 74 65 0a 20 20 2a 2a 20 69 6e 20 61 20  inate.  ** in a 
95c0: 63 6f 6f 72 64 69 6e 61 74 65 20 70 61 69 72 2e  coordinate pair.
95d0: 20 20 42 75 74 20 6d 61 6b 65 20 70 43 65 6c 6c    But make pCell
95e0: 44 61 74 61 20 70 6f 69 6e 74 20 74 6f 20 74 68  Data point to th
95f0: 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 2e 0a 20  e lower bound.. 
9600: 20 2a 2f 0a 20 20 70 43 65 6c 6c 44 61 74 61 20   */.  pCellData 
9610: 2b 3d 20 38 20 2b 20 34 2a 28 70 2d 3e 69 43 6f  += 8 + 4*(p->iCo
9620: 6f 72 64 26 30 78 66 65 29 3b 0a 0a 20 20 61 73  ord&0xfe);..  as
9630: 73 65 72 74 28 70 2d 3e 6f 70 3d 3d 52 54 52 45  sert(p->op==RTRE
9640: 45 5f 4c 45 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 52  E_LE || p->op==R
9650: 54 52 45 45 5f 4c 54 20 7c 7c 20 70 2d 3e 6f 70  TREE_LT || p->op
9660: 3d 3d 52 54 52 45 45 5f 47 45 20 0a 20 20 20 20  ==RTREE_GE .    
9670: 20 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 52 54 52 45    || p->op==RTRE
9680: 45 5f 47 54 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 52  E_GT || p->op==R
9690: 54 52 45 45 5f 45 51 20 29 3b 0a 20 20 61 73 73  TREE_EQ );.  ass
96a0: 65 72 74 28 20 28 28 28 28 63 68 61 72 2a 29 70  ert( ((((char*)p
96b0: 43 65 6c 6c 44 61 74 61 29 20 2d 20 28 63 68 61  CellData) - (cha
96c0: 72 2a 29 30 29 26 33 29 3d 3d 30 20 29 3b 20 20  r*)0)&3)==0 );  
96d0: 2f 2a 20 34 2d 62 79 74 65 20 61 6c 69 67 6e 65  /* 4-byte aligne
96e0: 64 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70  d */.  switch( p
96f0: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
9700: 20 52 54 52 45 45 5f 4c 45 3a 0a 20 20 20 20 63   RTREE_LE:.    c
9710: 61 73 65 20 52 54 52 45 45 5f 4c 54 3a 0a 20 20  ase RTREE_LT:.  
9720: 20 20 63 61 73 65 20 52 54 52 45 45 5f 45 51 3a    case RTREE_EQ:
9730: 0a 20 20 20 20 20 20 52 54 52 45 45 5f 44 45 43  .      RTREE_DEC
9740: 4f 44 45 5f 43 4f 4f 52 44 28 65 49 6e 74 2c 20  ODE_COORD(eInt, 
9750: 70 43 65 6c 6c 44 61 74 61 2c 20 76 61 6c 29 3b  pCellData, val);
9760: 0a 20 20 20 20 20 20 2f 2a 20 76 61 6c 20 6e 6f  .      /* val no
9770: 77 20 68 6f 6c 64 73 20 74 68 65 20 6c 6f 77 65  w holds the lowe
9780: 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65 20 63  r bound of the c
9790: 6f 6f 72 64 69 6e 61 74 65 20 70 61 69 72 20 2a  oordinate pair *
97a0: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 75  /.      if( p->u
97b0: 2e 72 56 61 6c 75 65 3e 3d 76 61 6c 20 29 20 72  .rValue>=val ) r
97c0: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 69 66 28  eturn;.      if(
97d0: 20 70 2d 3e 6f 70 21 3d 52 54 52 45 45 5f 45 51   p->op!=RTREE_EQ
97e0: 20 29 20 62 72 65 61 6b 3b 20 20 2f 2a 20 52 54   ) break;  /* RT
97f0: 52 45 45 5f 4c 45 20 61 6e 64 20 52 54 52 45 45  REE_LE and RTREE
9800: 5f 4c 54 20 65 6e 64 20 68 65 72 65 20 2a 2f 0a  _LT end here */.
9810: 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
9820: 72 6f 75 67 68 20 66 6f 72 20 74 68 65 20 52 54  rough for the RT
9830: 52 45 45 5f 45 51 20 63 61 73 65 20 2a 2f 0a 0a  REE_EQ case */..
9840: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 2f 2a 20      default: /* 
9850: 52 54 52 45 45 5f 47 54 20 6f 72 20 52 54 52 45  RTREE_GT or RTRE
9860: 45 5f 47 45 2c 20 20 6f 72 20 66 61 6c 6c 74 68  E_GE,  or fallth
9870: 72 6f 75 67 68 20 6f 66 20 52 54 52 45 45 5f 45  rough of RTREE_E
9880: 51 20 2a 2f 0a 20 20 20 20 20 20 70 43 65 6c 6c  Q */.      pCell
9890: 44 61 74 61 20 2b 3d 20 34 3b 0a 20 20 20 20 20  Data += 4;.     
98a0: 20 52 54 52 45 45 5f 44 45 43 4f 44 45 5f 43 4f   RTREE_DECODE_CO
98b0: 4f 52 44 28 65 49 6e 74 2c 20 70 43 65 6c 6c 44  ORD(eInt, pCellD
98c0: 61 74 61 2c 20 76 61 6c 29 3b 0a 20 20 20 20 20  ata, val);.     
98d0: 20 2f 2a 20 76 61 6c 20 6e 6f 77 20 68 6f 6c 64   /* val now hold
98e0: 73 20 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e  s the upper boun
98f0: 64 20 6f 66 20 74 68 65 20 63 6f 6f 72 64 69 6e  d of the coordin
9900: 61 74 65 20 70 61 69 72 20 2a 2f 0a 20 20 20 20  ate pair */.    
9910: 20 20 69 66 28 20 70 2d 3e 75 2e 72 56 61 6c 75    if( p->u.rValu
9920: 65 3c 3d 76 61 6c 20 29 20 72 65 74 75 72 6e 3b  e<=val ) return;
9930: 0a 20 20 7d 0a 20 20 2a 70 65 57 69 74 68 69 6e  .  }.  *peWithin
9940: 20 3d 20 4e 4f 54 5f 57 49 54 48 49 4e 3b 0a 7d   = NOT_WITHIN;.}
9950: 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68  ../*.** Check th
9960: 65 20 6c 65 61 66 20 52 54 72 65 65 20 63 65 6c  e leaf RTree cel
9970: 6c 20 67 69 76 65 6e 20 62 79 20 70 43 65 6c 6c  l given by pCell
9980: 44 61 74 61 20 61 67 61 69 6e 73 74 20 63 6f 6e  Data against con
9990: 73 74 72 61 69 6e 74 20 70 2e 0a 2a 2a 20 49 66  straint p..** If
99a0: 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74   this constraint
99b0: 20 69 73 20 6e 6f 74 20 73 61 74 69 73 66 69 65   is not satisfie
99c0: 64 2c 20 73 65 74 20 2a 70 65 57 69 74 68 69 6e  d, set *peWithin
99d0: 20 74 6f 20 4e 4f 54 5f 57 49 54 48 49 4e 2e 0a   to NOT_WITHIN..
99e0: 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 73 74 72  ** If the constr
99f0: 61 69 6e 74 20 69 73 20 73 61 74 69 73 66 69 65  aint is satisfie
9a00: 64 2c 20 6c 65 61 76 65 20 2a 70 65 57 69 74 68  d, leave *peWith
9a10: 69 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a  in unchanged..**
9a20: 0a 2a 2a 20 54 68 65 20 63 6f 6e 73 74 72 61 69  .** The constrai
9a30: 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  nt is of the for
9a40: 6d 3a 20 20 78 4e 20 6f 70 20 24 76 61 6c 0a 2a  m:  xN op $val.*
9a50: 2a 0a 2a 2a 20 54 68 65 20 6f 70 20 69 73 20 67  *.** The op is g
9a60: 69 76 65 6e 20 62 79 20 70 2d 3e 6f 70 2e 20 20  iven by p->op.  
9a70: 54 68 65 20 78 4e 20 69 73 20 70 2d 3e 69 43 6f  The xN is p->iCo
9a80: 6f 72 64 2d 74 68 20 63 6f 6f 72 64 69 6e 61 74  ord-th coordinat
9a90: 65 20 69 6e 0a 2a 2a 20 70 43 65 6c 6c 44 61 74  e in.** pCellDat
9aa0: 61 2e 20 20 24 76 61 6c 20 69 73 20 67 69 76 65  a.  $val is give
9ab0: 6e 20 62 79 20 70 2d 3e 75 2e 72 56 61 6c 75 65  n by p->u.rValue
9ac0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
9ad0: 20 72 74 72 65 65 4c 65 61 66 43 6f 6e 73 74 72   rtreeLeafConstr
9ae0: 61 69 6e 74 28 0a 20 20 52 74 72 65 65 43 6f 6e  aint(.  RtreeCon
9af0: 73 74 72 61 69 6e 74 20 2a 70 2c 20 20 20 20 20  straint *p,     
9b00: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 73 74 72     /* The constr
9b10: 61 69 6e 74 20 74 6f 20 74 65 73 74 20 2a 2f 0a  aint to test */.
9b20: 20 20 69 6e 74 20 65 49 6e 74 2c 20 20 20 20 20    int eInt,     
9b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9b40: 54 72 75 65 20 69 66 20 52 54 72 65 65 20 68 6f  True if RTree ho
9b50: 6c 64 73 20 69 6e 74 65 67 65 72 20 63 6f 6f 72  lds integer coor
9b60: 64 69 6e 61 74 65 73 20 2a 2f 0a 20 20 75 38 20  dinates */.  u8 
9b70: 2a 70 43 65 6c 6c 44 61 74 61 2c 20 20 20 20 20  *pCellData,     
9b80: 20 20 20 20 20 20 20 20 2f 2a 20 52 61 77 20 63          /* Raw c
9b90: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 73 20 61  ell content as a
9ba0: 70 70 65 61 72 73 20 6f 6e 20 64 69 73 6b 20 2a  ppears on disk *
9bb0: 2f 0a 20 20 69 6e 74 20 2a 70 65 57 69 74 68 69  /.  int *peWithi
9bc0: 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  n              /
9bd0: 2a 20 41 64 6a 75 73 74 20 64 6f 77 6e 77 61 72  * Adjust downwar
9be0: 64 2c 20 61 73 20 61 70 70 72 6f 70 72 69 61 74  d, as appropriat
9bf0: 65 20 2a 2f 0a 29 7b 0a 20 20 52 74 72 65 65 44  e */.){.  RtreeD
9c00: 56 61 6c 75 65 20 78 4e 3b 20 20 20 20 20 20 2f  Value xN;      /
9c10: 2a 20 43 6f 6f 72 64 69 6e 61 74 65 20 76 61 6c  * Coordinate val
9c20: 75 65 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20  ue converted to 
9c30: 61 20 64 6f 75 62 6c 65 20 2a 2f 0a 0a 20 20 61  a double */..  a
9c40: 73 73 65 72 74 28 70 2d 3e 6f 70 3d 3d 52 54 52  ssert(p->op==RTR
9c50: 45 45 5f 4c 45 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  EE_LE || p->op==
9c60: 52 54 52 45 45 5f 4c 54 20 7c 7c 20 70 2d 3e 6f  RTREE_LT || p->o
9c70: 70 3d 3d 52 54 52 45 45 5f 47 45 20 0a 20 20 20  p==RTREE_GE .   
9c80: 20 20 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 52 54 52     || p->op==RTR
9c90: 45 45 5f 47 54 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  EE_GT || p->op==
9ca0: 52 54 52 45 45 5f 45 51 20 29 3b 0a 20 20 70 43  RTREE_EQ );.  pC
9cb0: 65 6c 6c 44 61 74 61 20 2b 3d 20 38 20 2b 20 70  ellData += 8 + p
9cc0: 2d 3e 69 43 6f 6f 72 64 2a 34 3b 0a 20 20 61 73  ->iCoord*4;.  as
9cd0: 73 65 72 74 28 20 28 28 28 28 63 68 61 72 2a 29  sert( ((((char*)
9ce0: 70 43 65 6c 6c 44 61 74 61 29 20 2d 20 28 63 68  pCellData) - (ch
9cf0: 61 72 2a 29 30 29 26 33 29 3d 3d 30 20 29 3b 20  ar*)0)&3)==0 ); 
9d00: 20 2f 2a 20 34 2d 62 79 74 65 20 61 6c 69 67 6e   /* 4-byte align
9d10: 65 64 20 2a 2f 0a 20 20 52 54 52 45 45 5f 44 45  ed */.  RTREE_DE
9d20: 43 4f 44 45 5f 43 4f 4f 52 44 28 65 49 6e 74 2c  CODE_COORD(eInt,
9d30: 20 70 43 65 6c 6c 44 61 74 61 2c 20 78 4e 29 3b   pCellData, xN);
9d40: 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70  .  switch( p->op
9d50: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 52 54 52   ){.    case RTR
9d60: 45 45 5f 4c 45 3a 20 69 66 28 20 78 4e 20 3c 3d  EE_LE: if( xN <=
9d70: 20 70 2d 3e 75 2e 72 56 61 6c 75 65 20 29 20 72   p->u.rValue ) r
9d80: 65 74 75 72 6e 3b 20 20 62 72 65 61 6b 3b 0a 20  eturn;  break;. 
9d90: 20 20 20 63 61 73 65 20 52 54 52 45 45 5f 4c 54     case RTREE_LT
9da0: 3a 20 69 66 28 20 78 4e 20 3c 20 20 70 2d 3e 75  : if( xN <  p->u
9db0: 2e 72 56 61 6c 75 65 20 29 20 72 65 74 75 72 6e  .rValue ) return
9dc0: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;  break;.    ca
9dd0: 73 65 20 52 54 52 45 45 5f 47 45 3a 20 69 66 28  se RTREE_GE: if(
9de0: 20 78 4e 20 3e 3d 20 70 2d 3e 75 2e 72 56 61 6c   xN >= p->u.rVal
9df0: 75 65 20 29 20 72 65 74 75 72 6e 3b 20 20 62 72  ue ) return;  br
9e00: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 52 54  eak;.    case RT
9e10: 52 45 45 5f 47 54 3a 20 69 66 28 20 78 4e 20 3e  REE_GT: if( xN >
9e20: 20 20 70 2d 3e 75 2e 72 56 61 6c 75 65 20 29 20    p->u.rValue ) 
9e30: 72 65 74 75 72 6e 3b 20 20 62 72 65 61 6b 3b 0a  return;  break;.
9e40: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20      default:    
9e50: 20 20 20 69 66 28 20 78 4e 20 3d 3d 20 70 2d 3e     if( xN == p->
9e60: 75 2e 72 56 61 6c 75 65 20 29 20 72 65 74 75 72  u.rValue ) retur
9e70: 6e 3b 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  n;  break;.  }. 
9e80: 20 2a 70 65 57 69 74 68 69 6e 20 3d 20 4e 4f 54   *peWithin = NOT
9e90: 5f 57 49 54 48 49 4e 3b 0a 7d 0a 0a 2f 2a 0a 2a  _WITHIN;.}../*.*
9ea0: 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 63 65 6c  * One of the cel
9eb0: 6c 73 20 69 6e 20 6e 6f 64 65 20 70 4e 6f 64 65  ls in node pNode
9ec0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
9ed0: 6f 20 68 61 76 65 20 61 20 36 34 2d 62 69 74 20  o have a 64-bit 
9ee0: 0a 2a 2a 20 69 6e 74 65 67 65 72 20 76 61 6c 75  .** integer valu
9ef0: 65 20 65 71 75 61 6c 20 74 6f 20 69 52 6f 77 69  e equal to iRowi
9f00: 64 2e 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  d. Return the in
9f10: 64 65 78 20 6f 66 20 74 68 69 73 20 63 65 6c 6c  dex of this cell
9f20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9f30: 6e 6f 64 65 52 6f 77 69 64 49 6e 64 65 78 28 0a  nodeRowidIndex(.
9f40: 20 20 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c    Rtree *pRtree,
9f50: 20 0a 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70   .  RtreeNode *p
9f60: 4e 6f 64 65 2c 20 0a 20 20 69 36 34 20 69 52 6f  Node, .  i64 iRo
9f70: 77 69 64 2c 0a 20 20 69 6e 74 20 2a 70 69 49 6e  wid,.  int *piIn
9f80: 64 65 78 0a 29 7b 0a 20 20 69 6e 74 20 69 69 3b  dex.){.  int ii;
9f90: 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 4e  .  int nCell = N
9fa0: 43 45 4c 4c 28 70 4e 6f 64 65 29 3b 0a 20 20 61  CELL(pNode);.  a
9fb0: 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 32 30 30  ssert( nCell<200
9fc0: 20 29 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20   );.  for(ii=0; 
9fd0: 69 69 3c 6e 43 65 6c 6c 3b 20 69 69 2b 2b 29 7b  ii<nCell; ii++){
9fe0: 0a 20 20 20 20 69 66 28 20 6e 6f 64 65 47 65 74  .    if( nodeGet
9ff0: 52 6f 77 69 64 28 70 52 74 72 65 65 2c 20 70 4e  Rowid(pRtree, pN
a000: 6f 64 65 2c 20 69 69 29 3d 3d 69 52 6f 77 69 64  ode, ii)==iRowid
a010: 20 29 7b 0a 20 20 20 20 20 20 2a 70 69 49 6e 64   ){.      *piInd
a020: 65 78 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 72  ex = ii;.      r
a030: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
a040: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
a050: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
a060: 50 54 5f 56 54 41 42 3b 0a 7d 0a 0a 2f 2a 0a 2a  PT_VTAB;.}../*.*
a070: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64  * Return the ind
a080: 65 78 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63  ex of the cell c
a090: 6f 6e 74 61 69 6e 69 6e 67 20 61 20 70 6f 69 6e  ontaining a poin
a0a0: 74 65 72 20 74 6f 20 6e 6f 64 65 20 70 4e 6f 64  ter to node pNod
a0b0: 65 0a 2a 2a 20 69 6e 20 69 74 73 20 70 61 72 65  e.** in its pare
a0c0: 6e 74 2e 20 49 66 20 70 4e 6f 64 65 20 69 73 20  nt. If pNode is 
a0d0: 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2c 20 72  the root node, r
a0e0: 65 74 75 72 6e 20 2d 31 2e 0a 2a 2f 0a 73 74 61  eturn -1..*/.sta
a0f0: 74 69 63 20 69 6e 74 20 6e 6f 64 65 50 61 72 65  tic int nodePare
a100: 6e 74 49 6e 64 65 78 28 52 74 72 65 65 20 2a 70  ntIndex(Rtree *p
a110: 52 74 72 65 65 2c 20 52 74 72 65 65 4e 6f 64 65  Rtree, RtreeNode
a120: 20 2a 70 4e 6f 64 65 2c 20 69 6e 74 20 2a 70 69   *pNode, int *pi
a130: 49 6e 64 65 78 29 7b 0a 20 20 52 74 72 65 65 4e  Index){.  RtreeN
a140: 6f 64 65 20 2a 70 50 61 72 65 6e 74 20 3d 20 70  ode *pParent = p
a150: 4e 6f 64 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20  Node->pParent;. 
a160: 20 69 66 28 20 70 50 61 72 65 6e 74 20 29 7b 0a   if( pParent ){.
a170: 20 20 20 20 72 65 74 75 72 6e 20 6e 6f 64 65 52      return nodeR
a180: 6f 77 69 64 49 6e 64 65 78 28 70 52 74 72 65 65  owidIndex(pRtree
a190: 2c 20 70 50 61 72 65 6e 74 2c 20 70 4e 6f 64 65  , pParent, pNode
a1a0: 2d 3e 69 4e 6f 64 65 2c 20 70 69 49 6e 64 65 78  ->iNode, piIndex
a1b0: 29 3b 0a 20 20 7d 0a 20 20 2a 70 69 49 6e 64 65  );.  }.  *piInde
a1c0: 78 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e  x = -1;.  return
a1d0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
a1e0: 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f  *.** Compare two
a1f0: 20 73 65 61 72 63 68 20 70 6f 69 6e 74 73 2e 20   search points. 
a200: 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65   Return negative
a210: 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74  , zero, or posit
a220: 69 76 65 20 69 66 20 74 68 65 20 66 69 72 73 74  ive if the first
a230: 0a 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e  .** is less than
a240: 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67  , equal to, or g
a250: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
a260: 73 65 63 6f 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  second..**.** Th
a270: 65 20 72 53 63 6f 72 65 20 69 73 20 74 68 65 20  e rScore is the 
a280: 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 53 6d  primary key.  Sm
a290: 61 6c 6c 65 72 20 72 53 63 6f 72 65 20 76 61 6c  aller rScore val
a2a0: 75 65 73 20 63 6f 6d 65 20 66 69 72 73 74 2e 0a  ues come first..
a2b0: 2a 2a 20 49 66 20 74 68 65 20 72 53 63 6f 72 65  ** If the rScore
a2c0: 20 69 73 20 61 20 74 69 65 2c 20 74 68 65 6e 20   is a tie, then 
a2d0: 75 73 65 20 69 4c 65 76 65 6c 20 61 73 20 74 68  use iLevel as th
a2e0: 65 20 74 69 65 20 62 72 65 61 6b 65 72 20 77 69  e tie breaker wi
a2f0: 74 68 20 73 6d 61 6c 6c 65 72 0a 2a 2a 20 69 4c  th smaller.** iL
a300: 65 76 65 6c 20 76 61 6c 75 65 73 20 63 6f 6d 69  evel values comi
a310: 6e 67 20 66 69 72 73 74 2e 20 20 49 6e 20 74 68  ng first.  In th
a320: 69 73 20 77 61 79 2c 20 69 66 20 72 53 63 6f 72  is way, if rScor
a330: 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 66 6f  e is the same fo
a340: 72 20 61 6c 6c 0a 2a 2a 20 53 65 61 72 63 68 50  r all.** SearchP
a350: 6f 69 6e 74 73 2c 20 74 68 65 6e 20 69 4c 65 76  oints, then iLev
a360: 65 6c 20 62 65 63 6f 6d 65 73 20 74 68 65 20 64  el becomes the d
a370: 65 63 69 64 69 6e 67 20 66 61 63 74 6f 72 20 61  eciding factor a
a380: 6e 64 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a  nd the result.**
a390: 20 69 73 20 61 20 64 65 70 74 68 2d 66 69 72 73   is a depth-firs
a3a0: 74 20 73 65 61 72 63 68 2c 20 77 68 69 63 68 20  t search, which 
a3b0: 69 73 20 74 68 65 20 64 65 73 69 72 65 64 20 64  is the desired d
a3c0: 65 66 61 75 6c 74 20 62 65 68 61 76 69 6f 72 2e  efault behavior.
a3d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
a3e0: 74 72 65 65 53 65 61 72 63 68 50 6f 69 6e 74 43  treeSearchPointC
a3f0: 6f 6d 70 61 72 65 28 0a 20 20 63 6f 6e 73 74 20  ompare(.  const 
a400: 52 74 72 65 65 53 65 61 72 63 68 50 6f 69 6e 74  RtreeSearchPoint
a410: 20 2a 70 41 2c 0a 20 20 63 6f 6e 73 74 20 52 74   *pA,.  const Rt
a420: 72 65 65 53 65 61 72 63 68 50 6f 69 6e 74 20 2a  reeSearchPoint *
a430: 70 42 0a 29 7b 0a 20 20 69 66 28 20 70 41 2d 3e  pB.){.  if( pA->
a440: 72 53 63 6f 72 65 3c 70 42 2d 3e 72 53 63 6f 72  rScore<pB->rScor
a450: 65 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  e ) return -1;. 
a460: 20 69 66 28 20 70 41 2d 3e 72 53 63 6f 72 65 3e   if( pA->rScore>
a470: 70 42 2d 3e 72 53 63 6f 72 65 20 29 20 72 65 74  pB->rScore ) ret
a480: 75 72 6e 20 2b 31 3b 0a 20 20 69 66 28 20 70 41  urn +1;.  if( pA
a490: 2d 3e 69 4c 65 76 65 6c 3c 70 42 2d 3e 69 4c 65  ->iLevel<pB->iLe
a4a0: 76 65 6c 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  vel ) return -1;
a4b0: 0a 20 20 69 66 28 20 70 41 2d 3e 69 4c 65 76 65  .  if( pA->iLeve
a4c0: 6c 3e 70 42 2d 3e 69 4c 65 76 65 6c 20 29 20 72  l>pB->iLevel ) r
a4d0: 65 74 75 72 6e 20 2b 31 3b 0a 20 20 72 65 74 75  eturn +1;.  retu
a4e0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn 0;.}../*.** I
a4f0: 6e 74 65 72 63 68 61 6e 67 65 20 74 77 6f 20 73  nterchange two s
a500: 65 61 72 63 68 20 70 6f 69 6e 74 73 20 69 6e 20  earch points in 
a510: 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61  a cursor..*/.sta
a520: 74 69 63 20 76 6f 69 64 20 72 74 72 65 65 53 65  tic void rtreeSe
a530: 61 72 63 68 50 6f 69 6e 74 53 77 61 70 28 52 74  archPointSwap(Rt
a540: 72 65 65 43 75 72 73 6f 72 20 2a 70 2c 20 69 6e  reeCursor *p, in
a550: 74 20 69 2c 20 69 6e 74 20 6a 29 7b 0a 20 20 52  t i, int j){.  R
a560: 74 72 65 65 53 65 61 72 63 68 50 6f 69 6e 74 20  treeSearchPoint 
a570: 74 20 3d 20 70 2d 3e 61 50 6f 69 6e 74 5b 69 5d  t = p->aPoint[i]
a580: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3c 6a 20  ;.  assert( i<j 
a590: 29 3b 0a 20 20 70 2d 3e 61 50 6f 69 6e 74 5b 69  );.  p->aPoint[i
a5a0: 5d 20 3d 20 70 2d 3e 61 50 6f 69 6e 74 5b 6a 5d  ] = p->aPoint[j]
a5b0: 3b 0a 20 20 70 2d 3e 61 50 6f 69 6e 74 5b 6a 5d  ;.  p->aPoint[j]
a5c0: 20 3d 20 74 3b 0a 20 20 69 2b 2b 3b 20 6a 2b 2b   = t;.  i++; j++
a5d0: 3b 0a 20 20 69 66 28 20 69 3c 52 54 52 45 45 5f  ;.  if( i<RTREE_
a5e0: 43 41 43 48 45 5f 53 5a 20 29 7b 0a 20 20 20 20  CACHE_SZ ){.    
a5f0: 69 66 28 20 6a 3e 3d 52 54 52 45 45 5f 43 41 43  if( j>=RTREE_CAC
a600: 48 45 5f 53 5a 20 29 7b 0a 20 20 20 20 20 20 6e  HE_SZ ){.      n
a610: 6f 64 65 52 65 6c 65 61 73 65 28 52 54 52 45 45  odeRelease(RTREE
a620: 5f 4f 46 5f 43 55 52 53 4f 52 28 70 29 2c 20 70  _OF_CURSOR(p), p
a630: 2d 3e 61 4e 6f 64 65 5b 69 5d 29 3b 0a 20 20 20  ->aNode[i]);.   
a640: 20 20 20 70 2d 3e 61 4e 6f 64 65 5b 69 5d 20 3d     p->aNode[i] =
a650: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
a660: 20 20 20 20 20 52 74 72 65 65 4e 6f 64 65 20 2a       RtreeNode *
a670: 70 54 65 6d 70 20 3d 20 70 2d 3e 61 4e 6f 64 65  pTemp = p->aNode
a680: 5b 69 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4e  [i];.      p->aN
a690: 6f 64 65 5b 69 5d 20 3d 20 70 2d 3e 61 4e 6f 64  ode[i] = p->aNod
a6a0: 65 5b 6a 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 61  e[j];.      p->a
a6b0: 4e 6f 64 65 5b 6a 5d 20 3d 20 70 54 65 6d 70 3b  Node[j] = pTemp;
a6c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
a6d0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
a6e0: 65 61 72 63 68 20 70 6f 69 6e 74 20 77 69 74 68  earch point with
a6f0: 20 74 68 65 20 6c 6f 77 65 73 74 20 63 75 72 72   the lowest curr
a700: 65 6e 74 20 73 63 6f 72 65 2e 0a 2a 2f 0a 73 74  ent score..*/.st
a710: 61 74 69 63 20 52 74 72 65 65 53 65 61 72 63 68  atic RtreeSearch
a720: 50 6f 69 6e 74 20 2a 72 74 72 65 65 53 65 61 72  Point *rtreeSear
a730: 63 68 50 6f 69 6e 74 46 69 72 73 74 28 52 74 72  chPointFirst(Rtr
a740: 65 65 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  eeCursor *pCur){
a750: 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e  .  return pCur->
a760: 62 50 6f 69 6e 74 20 3f 20 26 70 43 75 72 2d 3e  bPoint ? &pCur->
a770: 73 50 6f 69 6e 74 20 3a 20 70 43 75 72 2d 3e 6e  sPoint : pCur->n
a780: 50 6f 69 6e 74 20 3f 20 70 43 75 72 2d 3e 61 50  Point ? pCur->aP
a790: 6f 69 6e 74 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a  oint : 0;.}../*.
a7a0: 2a 2a 20 47 65 74 20 74 68 65 20 52 74 72 65 65  ** Get the Rtree
a7b0: 4e 6f 64 65 20 66 6f 72 20 74 68 65 20 73 65 61  Node for the sea
a7c0: 72 63 68 20 70 6f 69 6e 74 20 77 69 74 68 20 74  rch point with t
a7d0: 68 65 20 6c 6f 77 65 73 74 20 73 63 6f 72 65 2e  he lowest score.
a7e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 52 74 72 65 65  .*/.static Rtree
a7f0: 4e 6f 64 65 20 2a 72 74 72 65 65 4e 6f 64 65 4f  Node *rtreeNodeO
a800: 66 46 69 72 73 74 53 65 61 72 63 68 50 6f 69 6e  fFirstSearchPoin
a810: 74 28 52 74 72 65 65 43 75 72 73 6f 72 20 2a 70  t(RtreeCursor *p
a820: 43 75 72 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  Cur, int *pRC){.
a830: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
a840: 69 64 3b 0a 20 20 69 6e 74 20 69 69 20 3d 20 31  id;.  int ii = 1
a850: 20 2d 20 70 43 75 72 2d 3e 62 50 6f 69 6e 74 3b   - pCur->bPoint;
a860: 0a 20 20 61 73 73 65 72 74 28 20 69 69 3d 3d 30  .  assert( ii==0
a870: 20 7c 7c 20 69 69 3d 3d 31 20 29 3b 0a 20 20 61   || ii==1 );.  a
a880: 73 73 65 72 74 28 20 70 43 75 72 2d 3e 62 50 6f  ssert( pCur->bPo
a890: 69 6e 74 20 7c 7c 20 70 43 75 72 2d 3e 6e 50 6f  int || pCur->nPo
a8a0: 69 6e 74 20 29 3b 0a 20 20 69 66 28 20 70 43 75  int );.  if( pCu
a8b0: 72 2d 3e 61 4e 6f 64 65 5b 69 69 5d 3d 3d 30 20  r->aNode[ii]==0 
a8c0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
a8d0: 52 43 21 3d 30 20 29 3b 0a 20 20 20 20 69 64 20  RC!=0 );.    id 
a8e0: 3d 20 69 69 20 3f 20 70 43 75 72 2d 3e 61 50 6f  = ii ? pCur->aPo
a8f0: 69 6e 74 5b 30 5d 2e 69 64 20 3a 20 70 43 75 72  int[0].id : pCur
a900: 2d 3e 73 50 6f 69 6e 74 2e 69 64 3b 0a 20 20 20  ->sPoint.id;.   
a910: 20 2a 70 52 43 20 3d 20 6e 6f 64 65 41 63 71 75   *pRC = nodeAcqu
a920: 69 72 65 28 52 54 52 45 45 5f 4f 46 5f 43 55 52  ire(RTREE_OF_CUR
a930: 53 4f 52 28 70 43 75 72 29 2c 20 69 64 2c 20 30  SOR(pCur), id, 0
a940: 2c 20 26 70 43 75 72 2d 3e 61 4e 6f 64 65 5b 69  , &pCur->aNode[i
a950: 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  i]);.  }.  retur
a960: 6e 20 70 43 75 72 2d 3e 61 4e 6f 64 65 5b 69 69  n pCur->aNode[ii
a970: 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 75 73 68  ];.}../*.** Push
a980: 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 6f   a new element o
a990: 6e 74 6f 20 74 68 65 20 70 72 69 6f 72 69 74 79  nto the priority
a9a0: 20 71 75 65 75 65 0a 2a 2f 0a 73 74 61 74 69 63   queue.*/.static
a9b0: 20 52 74 72 65 65 53 65 61 72 63 68 50 6f 69 6e   RtreeSearchPoin
a9c0: 74 20 2a 72 74 72 65 65 45 6e 71 75 65 75 65 28  t *rtreeEnqueue(
a9d0: 0a 20 20 52 74 72 65 65 43 75 72 73 6f 72 20 2a  .  RtreeCursor *
a9e0: 70 43 75 72 2c 20 20 20 20 2f 2a 20 54 68 65 20  pCur,    /* The 
a9f0: 63 75 72 73 6f 72 20 2a 2f 0a 20 20 52 74 72 65  cursor */.  Rtre
aa00: 65 44 56 61 6c 75 65 20 72 53 63 6f 72 65 2c 20  eDValue rScore, 
aa10: 20 20 2f 2a 20 53 63 6f 72 65 20 66 6f 72 20 74    /* Score for t
aa20: 68 65 20 6e 65 77 20 73 65 61 72 63 68 20 70 6f  he new search po
aa30: 69 6e 74 20 2a 2f 0a 20 20 75 38 20 69 4c 65 76  int */.  u8 iLev
aa40: 65 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  el             /
aa50: 2a 20 4c 65 76 65 6c 20 66 6f 72 20 74 68 65 20  * Level for the 
aa60: 6e 65 77 20 73 65 61 72 63 68 20 70 6f 69 6e 74  new search point
aa70: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20   */.){.  int i, 
aa80: 6a 3b 0a 20 20 52 74 72 65 65 53 65 61 72 63 68  j;.  RtreeSearch
aa90: 50 6f 69 6e 74 20 2a 70 4e 65 77 3b 0a 20 20 69  Point *pNew;.  i
aaa0: 66 28 20 70 43 75 72 2d 3e 6e 50 6f 69 6e 74 3e  f( pCur->nPoint>
aab0: 3d 70 43 75 72 2d 3e 6e 50 6f 69 6e 74 41 6c 6c  =pCur->nPointAll
aac0: 6f 63 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4e  oc ){.    int nN
aad0: 65 77 20 3d 20 70 43 75 72 2d 3e 6e 50 6f 69 6e  ew = pCur->nPoin
aae0: 74 41 6c 6c 6f 63 2a 32 20 2b 20 38 3b 0a 20 20  tAlloc*2 + 8;.  
aaf0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
ab00: 5f 72 65 61 6c 6c 6f 63 28 70 43 75 72 2d 3e 61  _realloc(pCur->a
ab10: 50 6f 69 6e 74 2c 20 6e 4e 65 77 2a 73 69 7a 65  Point, nNew*size
ab20: 6f 66 28 70 43 75 72 2d 3e 61 50 6f 69 6e 74 5b  of(pCur->aPoint[
ab30: 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  0]));.    if( pN
ab40: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
ab50: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 50 6f 69  ;.    pCur->aPoi
ab60: 6e 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70  nt = pNew;.    p
ab70: 43 75 72 2d 3e 6e 50 6f 69 6e 74 41 6c 6c 6f 63  Cur->nPointAlloc
ab80: 20 3d 20 6e 4e 65 77 3b 0a 20 20 7d 0a 20 20 69   = nNew;.  }.  i
ab90: 20 3d 20 70 43 75 72 2d 3e 6e 50 6f 69 6e 74 2b   = pCur->nPoint+
aba0: 2b 3b 0a 20 20 70 4e 65 77 20 3d 20 70 43 75 72  +;.  pNew = pCur
abb0: 2d 3e 61 50 6f 69 6e 74 20 2b 20 69 3b 0a 20 20  ->aPoint + i;.  
abc0: 70 4e 65 77 2d 3e 72 53 63 6f 72 65 20 3d 20 72  pNew->rScore = r
abd0: 53 63 6f 72 65 3b 0a 20 20 70 4e 65 77 2d 3e 69  Score;.  pNew->i
abe0: 4c 65 76 65 6c 20 3d 20 69 4c 65 76 65 6c 3b 0a  Level = iLevel;.
abf0: 20 20 61 73 73 65 72 74 28 20 69 4c 65 76 65 6c    assert( iLevel
ac00: 3c 3d 52 54 52 45 45 5f 4d 41 58 5f 44 45 50 54  <=RTREE_MAX_DEPT
ac10: 48 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 69 3e  H );.  while( i>
ac20: 30 20 29 7b 0a 20 20 20 20 52 74 72 65 65 53 65  0 ){.    RtreeSe
ac30: 61 72 63 68 50 6f 69 6e 74 20 2a 70 50 61 72 65  archPoint *pPare
ac40: 6e 74 3b 0a 20 20 20 20 6a 20 3d 20 28 69 2d 31  nt;.    j = (i-1
ac50: 29 2f 32 3b 0a 20 20 20 20 70 50 61 72 65 6e 74  )/2;.    pParent
ac60: 20 3d 20 70 43 75 72 2d 3e 61 50 6f 69 6e 74 20   = pCur->aPoint 
ac70: 2b 20 6a 3b 0a 20 20 20 20 69 66 28 20 72 74 72  + j;.    if( rtr
ac80: 65 65 53 65 61 72 63 68 50 6f 69 6e 74 43 6f 6d  eeSearchPointCom
ac90: 70 61 72 65 28 70 4e 65 77 2c 20 70 50 61 72 65  pare(pNew, pPare
aca0: 6e 74 29 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a  nt)>=0 ) break;.
acb0: 20 20 20 20 72 74 72 65 65 53 65 61 72 63 68 50      rtreeSearchP
acc0: 6f 69 6e 74 53 77 61 70 28 70 43 75 72 2c 20 6a  ointSwap(pCur, j
acd0: 2c 20 69 29 3b 0a 20 20 20 20 69 20 3d 20 6a 3b  , i);.    i = j;
ace0: 0a 20 20 20 20 70 4e 65 77 20 3d 20 70 50 61 72  .    pNew = pPar
acf0: 65 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ent;.  }.  retur
ad00: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
ad10: 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
ad20: 52 74 72 65 65 53 65 61 72 63 68 50 6f 69 6e 74  RtreeSearchPoint
ad30: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
ad40: 69 6e 74 65 72 20 74 6f 20 69 74 2e 20 20 52 65  inter to it.  Re
ad50: 74 75 72 6e 0a 2a 2a 20 4e 55 4c 4c 20 69 66 20  turn.** NULL if 
ad60: 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f  malloc fails..*/
ad70: 0a 73 74 61 74 69 63 20 52 74 72 65 65 53 65 61  .static RtreeSea
ad80: 72 63 68 50 6f 69 6e 74 20 2a 72 74 72 65 65 53  rchPoint *rtreeS
ad90: 65 61 72 63 68 50 6f 69 6e 74 4e 65 77 28 0a 20  earchPointNew(. 
ada0: 20 52 74 72 65 65 43 75 72 73 6f 72 20 2a 70 43   RtreeCursor *pC
adb0: 75 72 2c 20 20 20 20 2f 2a 20 54 68 65 20 63 75  ur,    /* The cu
adc0: 72 73 6f 72 20 2a 2f 0a 20 20 52 74 72 65 65 44  rsor */.  RtreeD
add0: 56 61 6c 75 65 20 72 53 63 6f 72 65 2c 20 20 20  Value rScore,   
ade0: 2f 2a 20 53 63 6f 72 65 20 66 6f 72 20 74 68 65  /* Score for the
adf0: 20 6e 65 77 20 73 65 61 72 63 68 20 70 6f 69 6e   new search poin
ae00: 74 20 2a 2f 0a 20 20 75 38 20 69 4c 65 76 65 6c  t */.  u8 iLevel
ae10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ae20: 4c 65 76 65 6c 20 66 6f 72 20 74 68 65 20 6e 65  Level for the ne
ae30: 77 20 73 65 61 72 63 68 20 70 6f 69 6e 74 20 2a  w search point *
ae40: 2f 0a 29 7b 0a 20 20 52 74 72 65 65 53 65 61 72  /.){.  RtreeSear
ae50: 63 68 50 6f 69 6e 74 20 2a 70 4e 65 77 2c 20 2a  chPoint *pNew, *
ae60: 70 46 69 72 73 74 3b 0a 20 20 70 46 69 72 73 74  pFirst;.  pFirst
ae70: 20 3d 20 72 74 72 65 65 53 65 61 72 63 68 50 6f   = rtreeSearchPo
ae80: 69 6e 74 46 69 72 73 74 28 70 43 75 72 29 3b 0a  intFirst(pCur);.
ae90: 20 20 70 43 75 72 2d 3e 61 6e 51 75 65 75 65 5b    pCur->anQueue[
aea0: 69 4c 65 76 65 6c 5d 2b 2b 3b 0a 20 20 69 66 28  iLevel]++;.  if(
aeb0: 20 70 46 69 72 73 74 3d 3d 30 0a 20 20 20 7c 7c   pFirst==0.   ||
aec0: 20 70 46 69 72 73 74 2d 3e 72 53 63 6f 72 65 3e   pFirst->rScore>
aed0: 72 53 63 6f 72 65 20 0a 20 20 20 7c 7c 20 28 70  rScore .   || (p
aee0: 46 69 72 73 74 2d 3e 72 53 63 6f 72 65 3d 3d 72  First->rScore==r
aef0: 53 63 6f 72 65 20 26 26 20 70 46 69 72 73 74 2d  Score && pFirst-
af00: 3e 69 4c 65 76 65 6c 3e 69 4c 65 76 65 6c 29 0a  >iLevel>iLevel).
af10: 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75    ){.    if( pCu
af20: 72 2d 3e 62 50 6f 69 6e 74 20 29 7b 0a 20 20 20  r->bPoint ){.   
af30: 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20     int ii;.     
af40: 20 70 4e 65 77 20 3d 20 72 74 72 65 65 45 6e 71   pNew = rtreeEnq
af50: 75 65 75 65 28 70 43 75 72 2c 20 72 53 63 6f 72  ueue(pCur, rScor
af60: 65 2c 20 69 4c 65 76 65 6c 29 3b 0a 20 20 20 20  e, iLevel);.    
af70: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
af80: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
af90: 69 69 20 3d 20 28 69 6e 74 29 28 70 4e 65 77 20  ii = (int)(pNew 
afa0: 2d 20 70 43 75 72 2d 3e 61 50 6f 69 6e 74 29 20  - pCur->aPoint) 
afb0: 2b 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69  + 1;.      if( i
afc0: 69 3c 52 54 52 45 45 5f 43 41 43 48 45 5f 53 5a  i<RTREE_CACHE_SZ
afd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
afe0: 72 74 28 20 70 43 75 72 2d 3e 61 4e 6f 64 65 5b  rt( pCur->aNode[
aff0: 69 69 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ii]==0 );.      
b000: 20 20 70 43 75 72 2d 3e 61 4e 6f 64 65 5b 69 69    pCur->aNode[ii
b010: 5d 20 3d 20 70 43 75 72 2d 3e 61 4e 6f 64 65 5b  ] = pCur->aNode[
b020: 30 5d 3b 0a 20 20 20 20 20 20 20 7d 65 6c 73 65  0];.       }else
b030: 7b 0a 20 20 20 20 20 20 20 20 6e 6f 64 65 52 65  {.        nodeRe
b040: 6c 65 61 73 65 28 52 54 52 45 45 5f 4f 46 5f 43  lease(RTREE_OF_C
b050: 55 52 53 4f 52 28 70 43 75 72 29 2c 20 70 43 75  URSOR(pCur), pCu
b060: 72 2d 3e 61 4e 6f 64 65 5b 30 5d 29 3b 0a 20 20  r->aNode[0]);.  
b070: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72      }.      pCur
b080: 2d 3e 61 4e 6f 64 65 5b 30 5d 20 3d 20 30 3b 0a  ->aNode[0] = 0;.
b090: 20 20 20 20 20 20 2a 70 4e 65 77 20 3d 20 70 43        *pNew = pC
b0a0: 75 72 2d 3e 73 50 6f 69 6e 74 3b 0a 20 20 20 20  ur->sPoint;.    
b0b0: 7d 0a 20 20 20 20 70 43 75 72 2d 3e 73 50 6f 69  }.    pCur->sPoi
b0c0: 6e 74 2e 72 53 63 6f 72 65 20 3d 20 72 53 63 6f  nt.rScore = rSco
b0d0: 72 65 3b 0a 20 20 20 20 70 43 75 72 2d 3e 73 50  re;.    pCur->sP
b0e0: 6f 69 6e 74 2e 69 4c 65 76 65 6c 20 3d 20 69 4c  oint.iLevel = iL
b0f0: 65 76 65 6c 3b 0a 20 20 20 20 70 43 75 72 2d 3e  evel;.    pCur->
b100: 62 50 6f 69 6e 74 20 3d 20 31 3b 0a 20 20 20 20  bPoint = 1;.    
b110: 72 65 74 75 72 6e 20 26 70 43 75 72 2d 3e 73 50  return &pCur->sP
b120: 6f 69 6e 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  oint;.  }else{. 
b130: 20 20 20 72 65 74 75 72 6e 20 72 74 72 65 65 45     return rtreeE
b140: 6e 71 75 65 75 65 28 70 43 75 72 2c 20 72 53 63  nqueue(pCur, rSc
b150: 6f 72 65 2c 20 69 4c 65 76 65 6c 29 3b 0a 20 20  ore, iLevel);.  
b160: 7d 0a 7d 0a 0a 23 69 66 20 30 0a 2f 2a 20 54 72  }.}..#if 0./* Tr
b170: 61 63 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 66  acing routines f
b180: 6f 72 20 74 68 65 20 52 74 72 65 65 53 65 61 72  or the RtreeSear
b190: 63 68 50 6f 69 6e 74 20 71 75 65 75 65 20 2a 2f  chPoint queue */
b1a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 72 61  .static void tra
b1b0: 63 65 50 6f 69 6e 74 28 52 74 72 65 65 53 65 61  cePoint(RtreeSea
b1c0: 72 63 68 50 6f 69 6e 74 20 2a 70 2c 20 69 6e 74  rchPoint *p, int
b1d0: 20 69 64 78 2c 20 52 74 72 65 65 43 75 72 73 6f   idx, RtreeCurso
b1e0: 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 66 28 20  r *pCur){.  if( 
b1f0: 69 64 78 3c 30 20 29 7b 20 70 72 69 6e 74 66 28  idx<0 ){ printf(
b200: 22 20 73 22 29 3b 20 7d 65 6c 73 65 7b 20 70 72  " s"); }else{ pr
b210: 69 6e 74 66 28 22 25 32 64 22 2c 20 69 64 78 29  intf("%2d", idx)
b220: 3b 20 7d 0a 20 20 70 72 69 6e 74 66 28 22 20 25  ; }.  printf(" %
b230: 64 2e 25 30 35 6c 6c 64 2e 25 30 32 64 20 25 67  d.%05lld.%02d %g
b240: 20 25 64 22 2c 0a 20 20 20 20 70 2d 3e 69 4c 65   %d",.    p->iLe
b250: 76 65 6c 2c 20 70 2d 3e 69 64 2c 20 70 2d 3e 69  vel, p->id, p->i
b260: 43 65 6c 6c 2c 20 70 2d 3e 72 53 63 6f 72 65 2c  Cell, p->rScore,
b270: 20 70 2d 3e 65 57 69 74 68 69 6e 0a 20 20 29 3b   p->eWithin.  );
b280: 0a 20 20 69 64 78 2b 2b 3b 0a 20 20 69 66 28 20  .  idx++;.  if( 
b290: 69 64 78 3c 52 54 52 45 45 5f 43 41 43 48 45 5f  idx<RTREE_CACHE_
b2a0: 53 5a 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66  SZ ){.    printf
b2b0: 28 22 20 25 70 5c 6e 22 2c 20 70 43 75 72 2d 3e  (" %p\n", pCur->
b2c0: 61 4e 6f 64 65 5b 69 64 78 5d 29 3b 0a 20 20 7d  aNode[idx]);.  }
b2d0: 65 6c 73 65 7b 0a 20 20 20 20 70 72 69 6e 74 66  else{.    printf
b2e0: 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 7d 0a 73 74  ("\n");.  }.}.st
b2f0: 61 74 69 63 20 76 6f 69 64 20 74 72 61 63 65 51  atic void traceQ
b300: 75 65 75 65 28 52 74 72 65 65 43 75 72 73 6f 72  ueue(RtreeCursor
b310: 20 2a 70 43 75 72 2c 20 63 6f 6e 73 74 20 63 68   *pCur, const ch
b320: 61 72 20 2a 7a 50 72 65 66 69 78 29 7b 0a 20 20  ar *zPrefix){.  
b330: 69 6e 74 20 69 69 3b 0a 20 20 70 72 69 6e 74 66  int ii;.  printf
b340: 28 22 3d 3d 3d 20 25 39 73 20 22 2c 20 7a 50 72  ("=== %9s ", zPr
b350: 65 66 69 78 29 3b 0a 20 20 69 66 28 20 70 43 75  efix);.  if( pCu
b360: 72 2d 3e 62 50 6f 69 6e 74 20 29 7b 0a 20 20 20  r->bPoint ){.   
b370: 20 74 72 61 63 65 50 6f 69 6e 74 28 26 70 43 75   tracePoint(&pCu
b380: 72 2d 3e 73 50 6f 69 6e 74 2c 20 2d 31 2c 20 70  r->sPoint, -1, p
b390: 43 75 72 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  Cur);.  }.  for(
b3a0: 69 69 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e 6e  ii=0; ii<pCur->n
b3b0: 50 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20  Point; ii++){.  
b3c0: 20 20 69 66 28 20 69 69 3e 30 20 7c 7c 20 70 43    if( ii>0 || pC
b3d0: 75 72 2d 3e 62 50 6f 69 6e 74 20 29 20 70 72 69  ur->bPoint ) pri
b3e0: 6e 74 66 28 22 20 20 20 20 20 20 20 20 20 20 20  ntf("           
b3f0: 20 20 20 22 29 3b 0a 20 20 20 20 74 72 61 63 65     ");.    trace
b400: 50 6f 69 6e 74 28 26 70 43 75 72 2d 3e 61 50 6f  Point(&pCur->aPo
b410: 69 6e 74 5b 69 69 5d 2c 20 69 69 2c 20 70 43 75  int[ii], ii, pCu
b420: 72 29 3b 0a 20 20 7d 0a 7d 0a 23 20 64 65 66 69  r);.  }.}.# defi
b430: 6e 65 20 52 54 52 45 45 5f 51 55 45 55 45 5f 54  ne RTREE_QUEUE_T
b440: 52 41 43 45 28 41 2c 42 29 20 74 72 61 63 65 51  RACE(A,B) traceQ
b450: 75 65 75 65 28 41 2c 42 29 0a 23 65 6c 73 65 0a  ueue(A,B).#else.
b460: 23 20 64 65 66 69 6e 65 20 52 54 52 45 45 5f 51  # define RTREE_Q
b470: 55 45 55 45 5f 54 52 41 43 45 28 41 2c 42 29 20  UEUE_TRACE(A,B) 
b480: 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 23 65    /* no-op */.#e
b490: 6e 64 69 66 0a 0a 2f 2a 20 52 65 6d 6f 76 65 20  ndif../* Remove 
b4a0: 74 68 65 20 73 65 61 72 63 68 20 70 6f 69 6e 74  the search point
b4b0: 20 77 69 74 68 20 74 68 65 20 6c 6f 77 65 73 74   with the lowest
b4c0: 20 63 75 72 72 65 6e 74 20 73 63 6f 72 65 2e 0a   current score..
b4d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
b4e0: 74 72 65 65 53 65 61 72 63 68 50 6f 69 6e 74 50  treeSearchPointP
b4f0: 6f 70 28 52 74 72 65 65 43 75 72 73 6f 72 20 2a  op(RtreeCursor *
b500: 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  p){.  int i, j, 
b510: 6b 2c 20 6e 3b 0a 20 20 69 20 3d 20 31 20 2d 20  k, n;.  i = 1 - 
b520: 70 2d 3e 62 50 6f 69 6e 74 3b 0a 20 20 61 73 73  p->bPoint;.  ass
b530: 65 72 74 28 20 69 3d 3d 30 20 7c 7c 20 69 3d 3d  ert( i==0 || i==
b540: 31 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4e  1 );.  if( p->aN
b550: 6f 64 65 5b 69 5d 20 29 7b 0a 20 20 20 20 6e 6f  ode[i] ){.    no
b560: 64 65 52 65 6c 65 61 73 65 28 52 54 52 45 45 5f  deRelease(RTREE_
b570: 4f 46 5f 43 55 52 53 4f 52 28 70 29 2c 20 70 2d  OF_CURSOR(p), p-
b580: 3e 61 4e 6f 64 65 5b 69 5d 29 3b 0a 20 20 20 20  >aNode[i]);.    
b590: 70 2d 3e 61 4e 6f 64 65 5b 69 5d 20 3d 20 30 3b  p->aNode[i] = 0;
b5a0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 62 50  .  }.  if( p->bP
b5b0: 6f 69 6e 74 20 29 7b 0a 20 20 20 20 70 2d 3e 61  oint ){.    p->a
b5c0: 6e 51 75 65 75 65 5b 70 2d 3e 73 50 6f 69 6e 74  nQueue[p->sPoint
b5d0: 2e 69 4c 65 76 65 6c 5d 2d 2d 3b 0a 20 20 20 20  .iLevel]--;.    
b5e0: 70 2d 3e 62 50 6f 69 6e 74 20 3d 20 30 3b 0a 20  p->bPoint = 0;. 
b5f0: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6e 50   }else if( p->nP
b600: 6f 69 6e 74 20 29 7b 0a 20 20 20 20 70 2d 3e 61  oint ){.    p->a
b610: 6e 51 75 65 75 65 5b 70 2d 3e 61 50 6f 69 6e 74  nQueue[p->aPoint
b620: 5b 30 5d 2e 69 4c 65 76 65 6c 5d 2d 2d 3b 0a 20  [0].iLevel]--;. 
b630: 20 20 20 6e 20 3d 20 2d 2d 70 2d 3e 6e 50 6f 69     n = --p->nPoi
b640: 6e 74 3b 0a 20 20 20 20 70 2d 3e 61 50 6f 69 6e  nt;.    p->aPoin
b650: 74 5b 30 5d 20 3d 20 70 2d 3e 61 50 6f 69 6e 74  t[0] = p->aPoint
b660: 5b 6e 5d 3b 0a 20 20 20 20 69 66 28 20 6e 3c 52  [n];.    if( n<R
b670: 54 52 45 45 5f 43 41 43 48 45 5f 53 5a 2d 31 20  TREE_CACHE_SZ-1 
b680: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4e 6f 64  ){.      p->aNod
b690: 65 5b 31 5d 20 3d 20 70 2d 3e 61 4e 6f 64 65 5b  e[1] = p->aNode[
b6a0: 6e 2b 31 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 61  n+1];.      p->a
b6b0: 4e 6f 64 65 5b 6e 2b 31 5d 20 3d 20 30 3b 0a 20  Node[n+1] = 0;. 
b6c0: 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 30 3b 0a     }.    i = 0;.
b6d0: 20 20 20 20 77 68 69 6c 65 28 20 28 6a 20 3d 20      while( (j = 
b6e0: 69 2a 32 2b 31 29 3c 6e 20 29 7b 0a 20 20 20 20  i*2+1)<n ){.    
b6f0: 20 20 6b 20 3d 20 6a 2b 31 3b 0a 20 20 20 20 20    k = j+1;.     
b700: 20 69 66 28 20 6b 3c 6e 20 26 26 20 72 74 72 65   if( k<n && rtre
b710: 65 53 65 61 72 63 68 50 6f 69 6e 74 43 6f 6d 70  eSearchPointComp
b720: 61 72 65 28 26 70 2d 3e 61 50 6f 69 6e 74 5b 6b  are(&p->aPoint[k
b730: 5d 2c 20 26 70 2d 3e 61 50 6f 69 6e 74 5b 6a 5d  ], &p->aPoint[j]
b740: 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  )<0 ){.        i
b750: 66 28 20 72 74 72 65 65 53 65 61 72 63 68 50 6f  f( rtreeSearchPo
b760: 69 6e 74 43 6f 6d 70 61 72 65 28 26 70 2d 3e 61  intCompare(&p->a
b770: 50 6f 69 6e 74 5b 6b 5d 2c 20 26 70 2d 3e 61 50  Point[k], &p->aP
b780: 6f 69 6e 74 5b 69 5d 29 3c 30 20 29 7b 0a 20 20  oint[i])<0 ){.  
b790: 20 20 20 20 20 20 20 20 72 74 72 65 65 53 65 61          rtreeSea
b7a0: 72 63 68 50 6f 69 6e 74 53 77 61 70 28 70 2c 20  rchPointSwap(p, 
b7b0: 69 2c 20 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  i, k);.         
b7c0: 20 69 20 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20   i = k;.        
b7d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
b7e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
b7f0: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
b800: 20 20 20 20 20 20 20 69 66 28 20 72 74 72 65 65         if( rtree
b810: 53 65 61 72 63 68 50 6f 69 6e 74 43 6f 6d 70 61  SearchPointCompa
b820: 72 65 28 26 70 2d 3e 61 50 6f 69 6e 74 5b 6a 5d  re(&p->aPoint[j]
b830: 2c 20 26 70 2d 3e 61 50 6f 69 6e 74 5b 69 5d 29  , &p->aPoint[i])
b840: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
b850: 72 74 72 65 65 53 65 61 72 63 68 50 6f 69 6e 74  rtreeSearchPoint
b860: 53 77 61 70 28 70 2c 20 69 2c 20 6a 29 3b 0a 20  Swap(p, i, j);. 
b870: 20 20 20 20 20 20 20 20 20 69 20 3d 20 6a 3b 0a           i = j;.
b880: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
b890: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
b8a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b8b0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a  }.    }.  }.}...
b8c0: 2f 2a 0a 2a 2a 20 43 6f 6e 74 69 6e 75 65 20 74  /*.** Continue t
b8d0: 68 65 20 73 65 61 72 63 68 20 6f 6e 20 63 75 72  he search on cur
b8e0: 73 6f 72 20 70 43 75 72 20 75 6e 74 69 6c 20 74  sor pCur until t
b8f0: 68 65 20 66 72 6f 6e 74 20 6f 66 20 74 68 65 20  he front of the 
b900: 71 75 65 75 65 0a 2a 2a 20 63 6f 6e 74 61 69 6e  queue.** contain
b910: 73 20 61 6e 20 65 6e 74 72 79 20 73 75 69 74 61  s an entry suita
b920: 62 6c 65 20 66 6f 72 20 72 65 74 75 72 6e 69 6e  ble for returnin
b930: 67 20 61 73 20 61 20 72 65 73 75 6c 74 2d 73 65  g as a result-se
b940: 74 20 72 6f 77 2c 0a 2a 2a 20 6f 72 20 75 6e 74  t row,.** or unt
b950: 69 6c 20 74 68 65 20 52 74 72 65 65 53 65 61 72  il the RtreeSear
b960: 63 68 50 6f 69 6e 74 20 71 75 65 75 65 20 69 73  chPoint queue is
b970: 20 65 6d 70 74 79 2c 20 69 6e 64 69 63 61 74 69   empty, indicati
b980: 6e 67 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 71  ng that the.** q
b990: 75 65 72 79 20 68 61 73 20 63 6f 6d 70 6c 65 74  uery has complet
b9a0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
b9b0: 74 20 72 74 72 65 65 53 74 65 70 54 6f 4c 65 61  t rtreeStepToLea
b9c0: 66 28 52 74 72 65 65 43 75 72 73 6f 72 20 2a 70  f(RtreeCursor *p
b9d0: 43 75 72 29 7b 0a 20 20 52 74 72 65 65 53 65 61  Cur){.  RtreeSea
b9e0: 72 63 68 50 6f 69 6e 74 20 2a 70 3b 0a 20 20 52  rchPoint *p;.  R
b9f0: 74 72 65 65 20 2a 70 52 74 72 65 65 20 3d 20 52  tree *pRtree = R
ba00: 54 52 45 45 5f 4f 46 5f 43 55 52 53 4f 52 28 70  TREE_OF_CURSOR(p
ba10: 43 75 72 29 3b 0a 20 20 52 74 72 65 65 4e 6f 64  Cur);.  RtreeNod
ba20: 65 20 2a 70 4e 6f 64 65 3b 0a 20 20 69 6e 74 20  e *pNode;.  int 
ba30: 65 57 69 74 68 69 6e 3b 0a 20 20 69 6e 74 20 72  eWithin;.  int r
ba40: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
ba50: 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 69 6e   int nCell;.  in
ba60: 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20  t nConstraint = 
ba70: 70 43 75 72 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  pCur->nConstrain
ba80: 74 3b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69  t;.  int ii;.  i
ba90: 6e 74 20 65 49 6e 74 3b 0a 20 20 52 74 72 65 65  nt eInt;.  Rtree
baa0: 53 65 61 72 63 68 50 6f 69 6e 74 20 78 3b 0a 0a  SearchPoint x;..
bab0: 20 20 65 49 6e 74 20 3d 20 70 52 74 72 65 65 2d    eInt = pRtree-
bac0: 3e 65 43 6f 6f 72 64 54 79 70 65 3d 3d 52 54 52  >eCoordType==RTR
bad0: 45 45 5f 43 4f 4f 52 44 5f 49 4e 54 33 32 3b 0a  EE_COORD_INT32;.
bae0: 20 20 77 68 69 6c 65 28 20 28 70 20 3d 20 72 74    while( (p = rt
baf0: 72 65 65 53 65 61 72 63 68 50 6f 69 6e 74 46 69  reeSearchPointFi
bb00: 72 73 74 28 70 43 75 72 29 29 21 3d 30 20 26 26  rst(pCur))!=0 &&
bb10: 20 70 2d 3e 69 4c 65 76 65 6c 3e 30 20 29 7b 0a   p->iLevel>0 ){.
bb20: 20 20 20 20 70 4e 6f 64 65 20 3d 20 72 74 72 65      pNode = rtre
bb30: 65 4e 6f 64 65 4f 66 46 69 72 73 74 53 65 61 72  eNodeOfFirstSear
bb40: 63 68 50 6f 69 6e 74 28 70 43 75 72 2c 20 26 72  chPoint(pCur, &r
bb50: 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  c);.    if( rc )
bb60: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
bb70: 6e 43 65 6c 6c 20 3d 20 4e 43 45 4c 4c 28 70 4e  nCell = NCELL(pN
bb80: 6f 64 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ode);.    assert
bb90: 28 20 6e 43 65 6c 6c 3c 32 30 30 20 29 3b 0a 20  ( nCell<200 );. 
bba0: 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 69 43 65     while( p->iCe
bbb0: 6c 6c 3c 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  ll<nCell ){.    
bbc0: 20 20 73 71 6c 69 74 65 33 5f 72 74 72 65 65 5f    sqlite3_rtree_
bbd0: 64 62 6c 20 72 53 63 6f 72 65 20 3d 20 28 73 71  dbl rScore = (sq
bbe0: 6c 69 74 65 33 5f 72 74 72 65 65 5f 64 62 6c 29  lite3_rtree_dbl)
bbf0: 2d 31 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 43  -1;.      u8 *pC
bc00: 65 6c 6c 44 61 74 61 20 3d 20 70 4e 6f 64 65 2d  ellData = pNode-
bc10: 3e 7a 44 61 74 61 20 2b 20 28 34 2b 70 52 74 72  >zData + (4+pRtr
bc20: 65 65 2d 3e 6e 42 79 74 65 73 50 65 72 43 65 6c  ee->nBytesPerCel
bc30: 6c 2a 70 2d 3e 69 43 65 6c 6c 29 3b 0a 20 20 20  l*p->iCell);.   
bc40: 20 20 20 65 57 69 74 68 69 6e 20 3d 20 46 55 4c     eWithin = FUL
bc50: 4c 59 5f 57 49 54 48 49 4e 3b 0a 20 20 20 20 20  LY_WITHIN;.     
bc60: 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 43   for(ii=0; ii<nC
bc70: 6f 6e 73 74 72 61 69 6e 74 3b 20 69 69 2b 2b 29  onstraint; ii++)
bc80: 7b 0a 20 20 20 20 20 20 20 20 52 74 72 65 65 43  {.        RtreeC
bc90: 6f 6e 73 74 72 61 69 6e 74 20 2a 70 43 6f 6e 73  onstraint *pCons
bca0: 74 72 61 69 6e 74 20 3d 20 70 43 75 72 2d 3e 61  traint = pCur->a
bcb0: 43 6f 6e 73 74 72 61 69 6e 74 20 2b 20 69 69 3b  Constraint + ii;
bcc0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f  .        if( pCo
bcd0: 6e 73 74 72 61 69 6e 74 2d 3e 6f 70 3e 3d 52 54  nstraint->op>=RT
bce0: 52 45 45 5f 4d 41 54 43 48 20 29 7b 0a 20 20 20  REE_MATCH ){.   
bcf0: 20 20 20 20 20 20 20 72 63 20 3d 20 72 74 72 65         rc = rtre
bd00: 65 43 61 6c 6c 62 61 63 6b 43 6f 6e 73 74 72 61  eCallbackConstra
bd10: 69 6e 74 28 70 43 6f 6e 73 74 72 61 69 6e 74 2c  int(pConstraint,
bd20: 20 65 49 6e 74 2c 20 70 43 65 6c 6c 44 61 74 61   eInt, pCellData
bd30: 2c 20 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , p,.           
bd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd50: 20 20 20 20 20 20 20 20 20 20 20 20 26 72 53 63              &rSc
bd60: 6f 72 65 2c 20 26 65 57 69 74 68 69 6e 29 3b 0a  ore, &eWithin);.
bd70: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
bd80: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
bd90: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
bda0: 70 2d 3e 69 4c 65 76 65 6c 3d 3d 31 20 29 7b 0a  p->iLevel==1 ){.
bdb0: 20 20 20 20 20 20 20 20 20 20 72 74 72 65 65 4c            rtreeL
bdc0: 65 61 66 43 6f 6e 73 74 72 61 69 6e 74 28 70 43  eafConstraint(pC
bdd0: 6f 6e 73 74 72 61 69 6e 74 2c 20 65 49 6e 74 2c  onstraint, eInt,
bde0: 20 70 43 65 6c 6c 44 61 74 61 2c 20 26 65 57 69   pCellData, &eWi
bdf0: 74 68 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d  thin);.        }
be00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
be10: 72 74 72 65 65 4e 6f 6e 6c 65 61 66 43 6f 6e 73  rtreeNonleafCons
be20: 74 72 61 69 6e 74 28 70 43 6f 6e 73 74 72 61 69  traint(pConstrai
be30: 6e 74 2c 20 65 49 6e 74 2c 20 70 43 65 6c 6c 44  nt, eInt, pCellD
be40: 61 74 61 2c 20 26 65 57 69 74 68 69 6e 29 3b 0a  ata, &eWithin);.
be50: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
be60: 20 20 69 66 28 20 65 57 69 74 68 69 6e 3d 3d 4e    if( eWithin==N
be70: 4f 54 5f 57 49 54 48 49 4e 20 29 20 62 72 65 61  OT_WITHIN ) brea
be80: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
be90: 20 70 2d 3e 69 43 65 6c 6c 2b 2b 3b 0a 20 20 20   p->iCell++;.   
bea0: 20 20 20 69 66 28 20 65 57 69 74 68 69 6e 3d 3d     if( eWithin==
beb0: 4e 4f 54 5f 57 49 54 48 49 4e 20 29 20 63 6f 6e  NOT_WITHIN ) con
bec0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 78 2e 69  tinue;.      x.i
bed0: 4c 65 76 65 6c 20 3d 20 70 2d 3e 69 4c 65 76 65  Level = p->iLeve
bee0: 6c 20 2d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  l - 1;.      if(
bef0: 20 78 2e 69 4c 65 76 65 6c 20 29 7b 0a 20 20 20   x.iLevel ){.   
bf00: 20 20 20 20 20 78 2e 69 64 20 3d 20 72 65 61 64       x.id = read
bf10: 49 6e 74 36 34 28 70 43 65 6c 6c 44 61 74 61 29  Int64(pCellData)
bf20: 3b 0a 20 20 20 20 20 20 20 20 78 2e 69 43 65 6c  ;.        x.iCel
bf30: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  l = 0;.      }el
bf40: 73 65 7b 0a 20 20 20 20 20 20 20 20 78 2e 69 64  se{.        x.id
bf50: 20 3d 20 70 2d 3e 69 64 3b 0a 20 20 20 20 20 20   = p->id;.      
bf60: 20 20 78 2e 69 43 65 6c 6c 20 3d 20 70 2d 3e 69    x.iCell = p->i
bf70: 43 65 6c 6c 20 2d 20 31 3b 0a 20 20 20 20 20 20  Cell - 1;.      
bf80: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69  }.      if( p->i
bf90: 43 65 6c 6c 3e 3d 6e 43 65 6c 6c 20 29 7b 0a 20  Cell>=nCell ){. 
bfa0: 20 20 20 20 20 20 20 52 54 52 45 45 5f 51 55 45         RTREE_QUE
bfb0: 55 45 5f 54 52 41 43 45 28 70 43 75 72 2c 20 22  UE_TRACE(pCur, "
bfc0: 50 4f 50 2d 53 3a 22 29 3b 0a 20 20 20 20 20 20  POP-S:");.      
bfd0: 20 20 72 74 72 65 65 53 65 61 72 63 68 50 6f 69    rtreeSearchPoi
bfe0: 6e 74 50 6f 70 28 70 43 75 72 29 3b 0a 20 20 20  ntPop(pCur);.   
bff0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
c000: 53 63 6f 72 65 3c 52 54 52 45 45 5f 5a 45 52 4f  Score<RTREE_ZERO
c010: 20 29 20 72 53 63 6f 72 65 20 3d 20 52 54 52 45   ) rScore = RTRE
c020: 45 5f 5a 45 52 4f 3b 0a 20 20 20 20 20 20 70 20  E_ZERO;.      p 
c030: 3d 20 72 74 72 65 65 53 65 61 72 63 68 50 6f 69  = rtreeSearchPoi
c040: 6e 74 4e 65 77 28 70 43 75 72 2c 20 72 53 63 6f  ntNew(pCur, rSco
c050: 72 65 2c 20 78 2e 69 4c 65 76 65 6c 29 3b 0a 20  re, x.iLevel);. 
c060: 20 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20       if( p==0 ) 
c070: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
c080: 4d 45 4d 3b 0a 20 20 20 20 20 20 70 2d 3e 65 57  MEM;.      p->eW
c090: 69 74 68 69 6e 20 3d 20 28 75 38 29 65 57 69 74  ithin = (u8)eWit
c0a0: 68 69 6e 3b 0a 20 20 20 20 20 20 70 2d 3e 69 64  hin;.      p->id
c0b0: 20 3d 20 78 2e 69 64 3b 0a 20 20 20 20 20 20 70   = x.id;.      p
c0c0: 2d 3e 69 43 65 6c 6c 20 3d 20 78 2e 69 43 65 6c  ->iCell = x.iCel
c0d0: 6c 3b 0a 20 20 20 20 20 20 52 54 52 45 45 5f 51  l;.      RTREE_Q
c0e0: 55 45 55 45 5f 54 52 41 43 45 28 70 43 75 72 2c  UEUE_TRACE(pCur,
c0f0: 20 22 50 55 53 48 2d 53 3a 22 29 3b 0a 20 20 20   "PUSH-S:");.   
c100: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
c110: 20 20 20 20 69 66 28 20 70 2d 3e 69 43 65 6c 6c      if( p->iCell
c120: 3e 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  >=nCell ){.     
c130: 20 52 54 52 45 45 5f 51 55 45 55 45 5f 54 52 41   RTREE_QUEUE_TRA
c140: 43 45 28 70 43 75 72 2c 20 22 50 4f 50 2d 53 65  CE(pCur, "POP-Se
c150: 3a 22 29 3b 0a 20 20 20 20 20 20 72 74 72 65 65  :");.      rtree
c160: 53 65 61 72 63 68 50 6f 69 6e 74 50 6f 70 28 70  SearchPointPop(p
c170: 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Cur);.    }.  }.
c180: 20 20 70 43 75 72 2d 3e 61 74 45 4f 46 20 3d 20    pCur->atEOF = 
c190: 70 3d 3d 30 3b 0a 20 20 72 65 74 75 72 6e 20 53  p==0;.  return S
c1a0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
c1b0: 0a 2a 2a 20 52 74 72 65 65 20 76 69 72 74 75 61  .** Rtree virtua
c1c0: 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78  l table module x
c1d0: 4e 65 78 74 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a  Next method..*/.
c1e0: 73 74 61 74 69 63 20 69 6e 74 20 72 74 72 65 65  static int rtree
c1f0: 4e 65 78 74 28 73 71 6c 69 74 65 33 5f 76 74 61  Next(sqlite3_vta
c200: 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43  b_cursor *pVtabC
c210: 75 72 73 6f 72 29 7b 0a 20 20 52 74 72 65 65 43  ursor){.  RtreeC
c220: 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 52  ursor *pCsr = (R
c230: 74 72 65 65 43 75 72 73 6f 72 20 2a 29 70 56 74  treeCursor *)pVt
c240: 61 62 43 75 72 73 6f 72 3b 0a 20 20 69 6e 74 20  abCursor;.  int 
c250: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
c260: 0a 20 20 2f 2a 20 4d 6f 76 65 20 74 6f 20 74 68  .  /* Move to th
c270: 65 20 6e 65 78 74 20 65 6e 74 72 79 20 74 68 61  e next entry tha
c280: 74 20 6d 61 74 63 68 65 73 20 74 68 65 20 63 6f  t matches the co
c290: 6e 66 69 67 75 72 65 64 20 63 6f 6e 73 74 72 61  nfigured constra
c2a0: 69 6e 74 73 2e 20 2a 2f 0a 20 20 52 54 52 45 45  ints. */.  RTREE
c2b0: 5f 51 55 45 55 45 5f 54 52 41 43 45 28 70 43 73  _QUEUE_TRACE(pCs
c2c0: 72 2c 20 22 50 4f 50 2d 4e 78 3a 22 29 3b 0a 20  r, "POP-Nx:");. 
c2d0: 20 72 74 72 65 65 53 65 61 72 63 68 50 6f 69 6e   rtreeSearchPoin
c2e0: 74 50 6f 70 28 70 43 73 72 29 3b 0a 20 20 72 63  tPop(pCsr);.  rc
c2f0: 20 3d 20 72 74 72 65 65 53 74 65 70 54 6f 4c 65   = rtreeStepToLe
c300: 61 66 28 70 43 73 72 29 3b 0a 20 20 72 65 74 75  af(pCsr);.  retu
c310: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  rn rc;.}../* .**
c320: 20 52 74 72 65 65 20 76 69 72 74 75 61 6c 20 74   Rtree virtual t
c330: 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78 52 6f 77  able module xRow
c340: 69 64 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74  id method..*/.st
c350: 61 74 69 63 20 69 6e 74 20 72 74 72 65 65 52 6f  atic int rtreeRo
c360: 77 69 64 28 73 71 6c 69 74 65 33 5f 76 74 61 62  wid(sqlite3_vtab
c370: 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75  _cursor *pVtabCu
c380: 72 73 6f 72 2c 20 73 71 6c 69 74 65 5f 69 6e 74  rsor, sqlite_int
c390: 36 34 20 2a 70 52 6f 77 69 64 29 7b 0a 20 20 52  64 *pRowid){.  R
c3a0: 74 72 65 65 43 75 72 73 6f 72 20 2a 70 43 73 72  treeCursor *pCsr
c3b0: 20 3d 20 28 52 74 72 65 65 43 75 72 73 6f 72 20   = (RtreeCursor 
c3c0: 2a 29 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20  *)pVtabCursor;. 
c3d0: 20 52 74 72 65 65 53 65 61 72 63 68 50 6f 69 6e   RtreeSearchPoin
c3e0: 74 20 2a 70 20 3d 20 72 74 72 65 65 53 65 61 72  t *p = rtreeSear
c3f0: 63 68 50 6f 69 6e 74 46 69 72 73 74 28 70 43 73  chPointFirst(pCs
c400: 72 29 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r);.  int rc = S
c410: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 52 74 72 65  QLITE_OK;.  Rtre
c420: 65 4e 6f 64 65 20 2a 70 4e 6f 64 65 20 3d 20 72  eNode *pNode = r
c430: 74 72 65 65 4e 6f 64 65 4f 66 46 69 72 73 74 53  treeNodeOfFirstS
c440: 65 61 72 63 68 50 6f 69 6e 74 28 70 43 73 72 2c  earchPoint(pCsr,
c450: 20 26 72 63 29 3b 0a 20 20 69 66 28 20 72 63 3d   &rc);.  if( rc=
c460: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 20  =SQLITE_OK && p 
c470: 29 7b 0a 20 20 20 20 2a 70 52 6f 77 69 64 20 3d  ){.    *pRowid =
c480: 20 6e 6f 64 65 47 65 74 52 6f 77 69 64 28 52 54   nodeGetRowid(RT
c490: 52 45 45 5f 4f 46 5f 43 55 52 53 4f 52 28 70 43  REE_OF_CURSOR(pC
c4a0: 73 72 29 2c 20 70 4e 6f 64 65 2c 20 70 2d 3e 69  sr), pNode, p->i
c4b0: 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Cell);.  }.  ret
c4c0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a  urn rc;.}../* .*
c4d0: 2a 20 52 74 72 65 65 20 76 69 72 74 75 61 6c 20  * Rtree virtual 
c4e0: 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78 43 6f  table module xCo
c4f0: 6c 75 6d 6e 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a  lumn method..*/.
c500: 73 74 61 74 69 63 20 69 6e 74 20 72 74 72 65 65  static int rtree
c510: 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65 33 5f 76  Column(sqlite3_v
c520: 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 2c  tab_cursor *cur,
c530: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
c540: 20 2a 63 74 78 2c 20 69 6e 74 20 69 29 7b 0a 20   *ctx, int i){. 
c550: 20 52 74 72 65 65 20 2a 70 52 74 72 65 65 20 3d   Rtree *pRtree =
c560: 20 28 52 74 72 65 65 20 2a 29 63 75 72 2d 3e 70   (Rtree *)cur->p
c570: 56 74 61 62 3b 0a 20 20 52 74 72 65 65 43 75 72  Vtab;.  RtreeCur
c580: 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 52 74 72  sor *pCsr = (Rtr
c590: 65 65 43 75 72 73 6f 72 20 2a 29 63 75 72 3b 0a  eeCursor *)cur;.
c5a0: 20 20 52 74 72 65 65 53 65 61 72 63 68 50 6f 69    RtreeSearchPoi
c5b0: 6e 74 20 2a 70 20 3d 20 72 74 72 65 65 53 65 61  nt *p = rtreeSea
c5c0: 72 63 68 50 6f 69 6e 74 46 69 72 73 74 28 70 43  rchPointFirst(pC
c5d0: 73 72 29 3b 0a 20 20 52 74 72 65 65 43 6f 6f 72  sr);.  RtreeCoor
c5e0: 64 20 63 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  d c;.  int rc = 
c5f0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 52 74 72  SQLITE_OK;.  Rtr
c600: 65 65 4e 6f 64 65 20 2a 70 4e 6f 64 65 20 3d 20  eeNode *pNode = 
c610: 72 74 72 65 65 4e 6f 64 65 4f 66 46 69 72 73 74  rtreeNodeOfFirst
c620: 53 65 61 72 63 68 50 6f 69 6e 74 28 70 43 73 72  SearchPoint(pCsr
c630: 2c 20 26 72 63 29 3b 0a 0a 20 20 69 66 28 20 72  , &rc);..  if( r
c640: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
c650: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
c660: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
c670: 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20  if( i==0 ){.    
c680: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
c690: 6e 74 36 34 28 63 74 78 2c 20 6e 6f 64 65 47 65  nt64(ctx, nodeGe
c6a0: 74 52 6f 77 69 64 28 70 52 74 72 65 65 2c 20 70  tRowid(pRtree, p
c6b0: 4e 6f 64 65 2c 20 70 2d 3e 69 43 65 6c 6c 29 29  Node, p->iCell))
c6c0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
c6d0: 6f 64 65 47 65 74 43 6f 6f 72 64 28 70 52 74 72  odeGetCoord(pRtr
c6e0: 65 65 2c 20 70 4e 6f 64 65 2c 20 70 2d 3e 69 43  ee, pNode, p->iC
c6f0: 65 6c 6c 2c 20 69 2d 31 2c 20 26 63 29 3b 0a 23  ell, i-1, &c);.#
c700: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 52 54  ifndef SQLITE_RT
c710: 52 45 45 5f 49 4e 54 5f 4f 4e 4c 59 0a 20 20 20  REE_INT_ONLY.   
c720: 20 69 66 28 20 70 52 74 72 65 65 2d 3e 65 43 6f   if( pRtree->eCo
c730: 6f 72 64 54 79 70 65 3d 3d 52 54 52 45 45 5f 43  ordType==RTREE_C
c740: 4f 4f 52 44 5f 52 45 41 4c 33 32 20 29 7b 0a 20  OORD_REAL32 ){. 
c750: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
c760: 75 6c 74 5f 64 6f 75 62 6c 65 28 63 74 78 2c 20  ult_double(ctx, 
c770: 63 2e 66 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a  c.f);.    }else.
c780: 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20  #endif.    {.   
c790: 20 20 20 61 73 73 65 72 74 28 20 70 52 74 72 65     assert( pRtre
c7a0: 65 2d 3e 65 43 6f 6f 72 64 54 79 70 65 3d 3d 52  e->eCoordType==R
c7b0: 54 52 45 45 5f 43 4f 4f 52 44 5f 49 4e 54 33 32  TREE_COORD_INT32
c7c0: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
c7d0: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 74 78  3_result_int(ctx
c7e0: 2c 20 63 2e 69 29 3b 0a 20 20 20 20 7d 0a 20 20  , c.i);.    }.  
c7f0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
c800: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  E_OK;.}../* .** 
c810: 55 73 65 20 6e 6f 64 65 41 63 71 75 69 72 65 28  Use nodeAcquire(
c820: 29 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  ) to obtain the 
c830: 6c 65 61 66 20 6e 6f 64 65 20 63 6f 6e 74 61 69  leaf node contai
c840: 6e 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64 20  ning the record 
c850: 77 69 74 68 20 0a 2a 2a 20 72 6f 77 69 64 20 69  with .** rowid i
c860: 52 6f 77 69 64 2e 20 49 66 20 73 75 63 63 65 73  Rowid. If succes
c870: 73 66 75 6c 2c 20 73 65 74 20 2a 70 70 4c 65 61  sful, set *ppLea
c880: 66 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  f to point to th
c890: 65 20 6e 6f 64 65 20 61 6e 64 0a 2a 2a 20 72 65  e node and.** re
c8a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
c8b0: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73  If there is no s
c8c0: 75 63 68 20 72 65 63 6f 72 64 20 69 6e 20 74 68  uch record in th
c8d0: 65 20 74 61 62 6c 65 2c 20 73 65 74 0a 2a 2a 20  e table, set.** 
c8e0: 2a 70 70 4c 65 61 66 20 74 6f 20 30 20 61 6e 64  *ppLeaf to 0 and
c8f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
c900: 4b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  K. If an error o
c910: 63 63 75 72 73 2c 20 73 65 74 20 2a 70 70 4c 65  ccurs, set *ppLe
c920: 61 66 0a 2a 2a 20 74 6f 20 7a 65 72 6f 20 61 6e  af.** to zero an
c930: 64 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69  d return an SQLi
c940: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  te error code..*
c950: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e  /.static int fin
c960: 64 4c 65 61 66 4e 6f 64 65 28 0a 20 20 52 74 72  dLeafNode(.  Rtr
c970: 65 65 20 2a 70 52 74 72 65 65 2c 20 20 20 20 20  ee *pRtree,     
c980: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 54 72 65           /* RTre
c990: 65 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  e to search */. 
c9a0: 20 69 36 34 20 69 52 6f 77 69 64 2c 20 20 20 20   i64 iRowid,    
c9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c9c0: 54 68 65 20 72 6f 77 69 64 20 73 65 61 72 63 68  The rowid search
c9d0: 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 52 74 72  ing for */.  Rtr
c9e0: 65 65 4e 6f 64 65 20 2a 2a 70 70 4c 65 61 66 2c  eeNode **ppLeaf,
c9f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
ca00: 65 20 74 68 65 20 6e 6f 64 65 20 68 65 72 65 20  e the node here 
ca10: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
ca20: 36 34 20 2a 70 69 4e 6f 64 65 20 20 20 20 20 20  64 *piNode      
ca30: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 6f   /* Write the no
ca40: 64 65 2d 69 64 20 68 65 72 65 20 2a 2f 0a 29 7b  de-id here */.){
ca50: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 2a 70 70  .  int rc;.  *pp
ca60: 4c 65 61 66 20 3d 20 30 3b 0a 20 20 73 71 6c 69  Leaf = 0;.  sqli
ca70: 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
ca80: 52 74 72 65 65 2d 3e 70 52 65 61 64 52 6f 77 69  Rtree->pReadRowi
ca90: 64 2c 20 31 2c 20 69 52 6f 77 69 64 29 3b 0a 20  d, 1, iRowid);. 
caa0: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 65   if( sqlite3_ste
cab0: 70 28 70 52 74 72 65 65 2d 3e 70 52 65 61 64 52  p(pRtree->pReadR
cac0: 6f 77 69 64 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  owid)==SQLITE_RO
cad0: 57 20 29 7b 0a 20 20 20 20 69 36 34 20 69 4e 6f  W ){.    i64 iNo
cae0: 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  de = sqlite3_col
caf0: 75 6d 6e 5f 69 6e 74 36 34 28 70 52 74 72 65 65  umn_int64(pRtree
cb00: 2d 3e 70 52 65 61 64 52 6f 77 69 64 2c 20 30 29  ->pReadRowid, 0)
cb10: 3b 0a 20 20 20 20 69 66 28 20 70 69 4e 6f 64 65  ;.    if( piNode
cb20: 20 29 20 2a 70 69 4e 6f 64 65 20 3d 20 69 4e 6f   ) *piNode = iNo
cb30: 64 65 3b 0a 20 20 20 20 72 63 20 3d 20 6e 6f 64  de;.    rc = nod
cb40: 65 41 63 71 75 69 72 65 28 70 52 74 72 65 65 2c  eAcquire(pRtree,
cb50: 20 69 4e 6f 64 65 2c 20 30 2c 20 70 70 4c 65 61   iNode, 0, ppLea
cb60: 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  f);.    sqlite3_
cb70: 72 65 73 65 74 28 70 52 74 72 65 65 2d 3e 70 52  reset(pRtree->pR
cb80: 65 61 64 52 6f 77 69 64 29 3b 0a 20 20 7d 65 6c  eadRowid);.  }el
cb90: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  se{.    rc = sql
cba0: 69 74 65 33 5f 72 65 73 65 74 28 70 52 74 72 65  ite3_reset(pRtre
cbb0: 65 2d 3e 70 52 65 61 64 52 6f 77 69 64 29 3b 0a  e->pReadRowid);.
cbc0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
cbd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
cbe0: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
cbf0: 64 20 74 6f 20 63 6f 6e 66 69 67 75 72 65 20 74  d to configure t
cc00: 68 65 20 52 74 72 65 65 43 6f 6e 73 74 72 61 69  he RtreeConstrai
cc10: 6e 74 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  nt object passed
cc20: 0a 2a 2a 20 61 73 20 74 68 65 20 73 65 63 6f 6e  .** as the secon
cc30: 64 20 61 72 67 75 6d 65 6e 74 20 66 6f 72 20 61  d argument for a
cc40: 20 4d 41 54 43 48 20 63 6f 6e 73 74 72 61 69 6e   MATCH constrain
cc50: 74 2e 20 54 68 65 20 76 61 6c 75 65 20 70 61 73  t. The value pas
cc60: 73 65 64 20 61 73 20 74 68 65 0a 2a 2a 20 66 69  sed as the.** fi
cc70: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
cc80: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
cc90: 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
cca0: 6f 70 65 72 61 6e 64 20 74 6f 20 74 68 65 20 4d  operand to the M
ccb0: 41 54 43 48 0a 2a 2a 20 6f 70 65 72 61 74 6f 72  ATCH.** operator
ccc0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
ccd0: 64 65 73 65 72 69 61 6c 69 7a 65 47 65 6f 6d 65  deserializeGeome
cce0: 74 72 79 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  try(sqlite3_valu
ccf0: 65 20 2a 70 56 61 6c 75 65 2c 20 52 74 72 65 65  e *pValue, Rtree
cd00: 43 6f 6e 73 74 72 61 69 6e 74 20 2a 70 43 6f 6e  Constraint *pCon
cd10: 73 29 7b 0a 20 20 52 74 72 65 65 4d 61 74 63 68  s){.  RtreeMatch
cd20: 41 72 67 20 2a 70 42 6c 6f 62 2c 20 2a 70 53 72  Arg *pBlob, *pSr
cd30: 63 3b 20 20 20 20 20 20 20 2f 2a 20 42 4c 4f 42  c;       /* BLOB
cd40: 20 72 65 74 75 72 6e 65 64 20 62 79 20 67 65 6f   returned by geo
cd50: 6d 65 74 72 79 20 66 75 6e 63 74 69 6f 6e 20 2a  metry function *
cd60: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 72 74 72 65  /.  sqlite3_rtre
cd70: 65 5f 71 75 65 72 79 5f 69 6e 66 6f 20 2a 70 49  e_query_info *pI
cd80: 6e 66 6f 3b 20 20 20 2f 2a 20 43 61 6c 6c 62 61  nfo;   /* Callba
cd90: 63 6b 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  ck information *
cda0: 2f 0a 0a 20 20 70 53 72 63 20 3d 20 73 71 6c 69  /..  pSrc = sqli
cdb0: 74 65 33 5f 76 61 6c 75 65 5f 70 6f 69 6e 74 65  te3_value_pointe
cdc0: 72 28 70 56 61 6c 75 65 2c 20 22 52 74 72 65 65  r(pValue, "Rtree
cdd0: 4d 61 74 63 68 41 72 67 22 29 3b 0a 20 20 69 66  MatchArg");.  if
cde0: 28 20 70 53 72 63 3d 3d 30 20 29 20 72 65 74 75  ( pSrc==0 ) retu
cdf0: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
ce00: 0a 20 20 70 49 6e 66 6f 20 3d 20 28 73 71 6c 69  .  pInfo = (sqli
ce10: 74 65 33 5f 72 74 72 65 65 5f 71 75 65 72 79 5f  te3_rtree_query_
ce20: 69 6e 66 6f 2a 29 0a 20 20 20 20 20 20 20 20 20  info*).         
ce30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
ce40: 61 6c 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66 28  alloc64( sizeof(
ce50: 2a 70 49 6e 66 6f 29 2b 70 53 72 63 2d 3e 69 53  *pInfo)+pSrc->iS
ce60: 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 21 70 49  ize );.  if( !pI
ce70: 6e 66 6f 20 29 20 72 65 74 75 72 6e 20 53 51 4c  nfo ) return SQL
ce80: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d  ITE_NOMEM;.  mem
ce90: 73 65 74 28 70 49 6e 66 6f 2c 20 30 2c 20 73 69  set(pInfo, 0, si
cea0: 7a 65 6f 66 28 2a 70 49 6e 66 6f 29 29 3b 0a 20  zeof(*pInfo));. 
ceb0: 20 70 42 6c 6f 62 20 3d 20 28 52 74 72 65 65 4d   pBlob = (RtreeM
cec0: 61 74 63 68 41 72 67 2a 29 26 70 49 6e 66 6f 5b  atchArg*)&pInfo[
ced0: 31 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 42 6c  1];.  memcpy(pBl
cee0: 6f 62 2c 20 70 53 72 63 2c 20 70 53 72 63 2d 3e  ob, pSrc, pSrc->
cef0: 69 53 69 7a 65 29 3b 0a 20 20 70 49 6e 66 6f 2d  iSize);.  pInfo-
cf00: 3e 70 43 6f 6e 74 65 78 74 20 3d 20 70 42 6c 6f  >pContext = pBlo
cf10: 62 2d 3e 63 62 2e 70 43 6f 6e 74 65 78 74 3b 0a  b->cb.pContext;.
cf20: 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 72 61 6d 20    pInfo->nParam 
cf30: 3d 20 70 42 6c 6f 62 2d 3e 6e 50 61 72 61 6d 3b  = pBlob->nParam;
cf40: 0a 20 20 70 49 6e 66 6f 2d 3e 61 50 61 72 61 6d  .  pInfo->aParam
cf50: 20 3d 20 70 42 6c 6f 62 2d 3e 61 50 61 72 61 6d   = pBlob->aParam
cf60: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 70 53 71 6c  ;.  pInfo->apSql
cf70: 50 61 72 61 6d 20 3d 20 70 42 6c 6f 62 2d 3e 61  Param = pBlob->a
cf80: 70 53 71 6c 50 61 72 61 6d 3b 0a 0a 20 20 69 66  pSqlParam;..  if
cf90: 28 20 70 42 6c 6f 62 2d 3e 63 62 2e 78 47 65 6f  ( pBlob->cb.xGeo
cfa0: 6d 20 29 7b 0a 20 20 20 20 70 43 6f 6e 73 2d 3e  m ){.    pCons->
cfb0: 75 2e 78 47 65 6f 6d 20 3d 20 70 42 6c 6f 62 2d  u.xGeom = pBlob-
cfc0: 3e 63 62 2e 78 47 65 6f 6d 3b 0a 20 20 7d 65 6c  >cb.xGeom;.  }el
cfd0: 73 65 7b 0a 20 20 20 20 70 43 6f 6e 73 2d 3e 6f  se{.    pCons->o
cfe0: 70 20 3d 20 52 54 52 45 45 5f 51 55 45 52 59 3b  p = RTREE_QUERY;
cff0: 0a 20 20 20 20 70 43 6f 6e 73 2d 3e 75 2e 78 51  .    pCons->u.xQ
d000: 75 65 72 79 46 75 6e 63 20 3d 20 70 42 6c 6f 62  ueryFunc = pBlob
d010: 2d 3e 63 62 2e 78 51 75 65 72 79 46 75 6e 63 3b  ->cb.xQueryFunc;
d020: 0a 20 20 7d 0a 20 20 70 43 6f 6e 73 2d 3e 70 49  .  }.  pCons->pI
d030: 6e 66 6f 20 3d 20 70 49 6e 66 6f 3b 0a 20 20 72  nfo = pInfo;.  r
d040: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
d050: 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 74 72 65 65  .}../* .** Rtree
d060: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d   virtual table m
d070: 6f 64 75 6c 65 20 78 46 69 6c 74 65 72 20 6d 65  odule xFilter me
d080: 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  thod..*/.static 
d090: 69 6e 74 20 72 74 72 65 65 46 69 6c 74 65 72 28  int rtreeFilter(
d0a0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  .  sqlite3_vtab_
d0b0: 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72  cursor *pVtabCur
d0c0: 73 6f 72 2c 20 0a 20 20 69 6e 74 20 69 64 78 4e  sor, .  int idxN
d0d0: 75 6d 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  um, const char *
d0e0: 69 64 78 53 74 72 2c 0a 20 20 69 6e 74 20 61 72  idxStr,.  int ar
d0f0: 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
d100: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 52 74  e **argv.){.  Rt
d110: 72 65 65 20 2a 70 52 74 72 65 65 20 3d 20 28 52  ree *pRtree = (R
d120: 74 72 65 65 20 2a 29 70 56 74 61 62 43 75 72 73  tree *)pVtabCurs
d130: 6f 72 2d 3e 70 56 74 61 62 3b 0a 20 20 52 74 72  or->pVtab;.  Rtr
d140: 65 65 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d  eeCursor *pCsr =
d150: 20 28 52 74 72 65 65 43 75 72 73 6f 72 20 2a 29   (RtreeCursor *)
d160: 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 52  pVtabCursor;.  R
d170: 74 72 65 65 4e 6f 64 65 20 2a 70 52 6f 6f 74 20  treeNode *pRoot 
d180: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 69 3b 0a 20  = 0;.  int ii;. 
d190: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
d1a0: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 43 65 6c 6c  _OK;.  int iCell
d1b0: 20 3d 20 30 3b 0a 0a 20 20 72 74 72 65 65 52 65   = 0;..  rtreeRe
d1c0: 66 65 72 65 6e 63 65 28 70 52 74 72 65 65 29 3b  ference(pRtree);
d1d0: 0a 0a 20 20 2f 2a 20 52 65 73 65 74 20 74 68 65  ..  /* Reset the
d1e0: 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 73   cursor to the s
d1f0: 61 6d 65 20 73 74 61 74 65 20 61 73 20 72 74 72  ame state as rtr
d200: 65 65 4f 70 65 6e 28 29 20 6c 65 61 76 65 73 20  eeOpen() leaves 
d210: 69 74 20 69 6e 2e 20 2a 2f 0a 20 20 66 72 65 65  it in. */.  free
d220: 43 75 72 73 6f 72 43 6f 6e 73 74 72 61 69 6e 74  CursorConstraint
d230: 73 28 70 43 73 72 29 3b 0a 20 20 73 71 6c 69 74  s(pCsr);.  sqlit
d240: 65 33 5f 66 72 65 65 28 70 43 73 72 2d 3e 61 50  e3_free(pCsr->aP
d250: 6f 69 6e 74 29 3b 0a 20 20 6d 65 6d 73 65 74 28  oint);.  memset(
d260: 70 43 73 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pCsr, 0, sizeof(
d270: 52 74 72 65 65 43 75 72 73 6f 72 29 29 3b 0a 20  RtreeCursor));. 
d280: 20 70 43 73 72 2d 3e 62 61 73 65 2e 70 56 74 61   pCsr->base.pVta
d290: 62 20 3d 20 28 73 71 6c 69 74 65 33 5f 76 74 61  b = (sqlite3_vta
d2a0: 62 2a 29 70 52 74 72 65 65 3b 0a 0a 20 20 70 43  b*)pRtree;..  pC
d2b0: 73 72 2d 3e 69 53 74 72 61 74 65 67 79 20 3d 20  sr->iStrategy = 
d2c0: 69 64 78 4e 75 6d 3b 0a 20 20 69 66 28 20 69 64  idxNum;.  if( id
d2d0: 78 4e 75 6d 3d 3d 31 20 29 7b 0a 20 20 20 20 2f  xNum==1 ){.    /
d2e0: 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 20 2d  * Special case -
d2f0: 20 6c 6f 6f 6b 75 70 20 62 79 20 72 6f 77 69 64   lookup by rowid
d300: 2e 20 2a 2f 0a 20 20 20 20 52 74 72 65 65 4e 6f  . */.    RtreeNo
d310: 64 65 20 2a 70 4c 65 61 66 3b 20 20 20 20 20 20  de *pLeaf;      
d320: 20 20 2f 2a 20 4c 65 61 66 20 6f 6e 20 77 68 69    /* Leaf on whi
d330: 63 68 20 74 68 65 20 72 65 71 75 69 72 65 64 20  ch the required 
d340: 63 65 6c 6c 20 72 65 73 69 64 65 73 20 2a 2f 0a  cell resides */.
d350: 20 20 20 20 52 74 72 65 65 53 65 61 72 63 68 50      RtreeSearchP
d360: 6f 69 6e 74 20 2a 70 3b 20 20 20 20 20 2f 2a 20  oint *p;     /* 
d370: 53 65 61 72 63 68 20 70 6f 69 6e 74 20 66 6f 72  Search point for
d380: 20 74 68 65 20 6c 65 61 66 20 2a 2f 0a 20 20 20   the leaf */.   
d390: 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 73 71   i64 iRowid = sq
d3a0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36  lite3_value_int6
d3b0: 34 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  4(argv[0]);.    
d3c0: 69 36 34 20 69 4e 6f 64 65 20 3d 20 30 3b 0a 20  i64 iNode = 0;. 
d3d0: 20 20 20 72 63 20 3d 20 66 69 6e 64 4c 65 61 66     rc = findLeaf
d3e0: 4e 6f 64 65 28 70 52 74 72 65 65 2c 20 69 52 6f  Node(pRtree, iRo
d3f0: 77 69 64 2c 20 26 70 4c 65 61 66 2c 20 26 69 4e  wid, &pLeaf, &iN
d400: 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ode);.    if( rc
d410: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
d420: 4c 65 61 66 21 3d 30 20 29 7b 0a 20 20 20 20 20  Leaf!=0 ){.     
d430: 20 70 20 3d 20 72 74 72 65 65 53 65 61 72 63 68   p = rtreeSearch
d440: 50 6f 69 6e 74 4e 65 77 28 70 43 73 72 2c 20 52  PointNew(pCsr, R
d450: 54 52 45 45 5f 5a 45 52 4f 2c 20 30 29 3b 0a 20  TREE_ZERO, 0);. 
d460: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 21 3d       assert( p!=
d470: 30 20 29 3b 20 20 2f 2a 20 41 6c 77 61 79 73 20  0 );  /* Always 
d480: 72 65 74 75 72 6e 73 20 70 43 73 72 2d 3e 73 50  returns pCsr->sP
d490: 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 70 43  oint */.      pC
d4a0: 73 72 2d 3e 61 4e 6f 64 65 5b 30 5d 20 3d 20 70  sr->aNode[0] = p
d4b0: 4c 65 61 66 3b 0a 20 20 20 20 20 20 70 2d 3e 69  Leaf;.      p->i
d4c0: 64 20 3d 20 69 4e 6f 64 65 3b 0a 20 20 20 20 20  d = iNode;.     
d4d0: 20 70 2d 3e 65 57 69 74 68 69 6e 20 3d 20 50 41   p->eWithin = PA
d4e0: 52 54 4c 59 5f 57 49 54 48 49 4e 3b 0a 20 20 20  RTLY_WITHIN;.   
d4f0: 20 20 20 72 63 20 3d 20 6e 6f 64 65 52 6f 77 69     rc = nodeRowi
d500: 64 49 6e 64 65 78 28 70 52 74 72 65 65 2c 20 70  dIndex(pRtree, p
d510: 4c 65 61 66 2c 20 69 52 6f 77 69 64 2c 20 26 69  Leaf, iRowid, &i
d520: 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70 2d 3e  Cell);.      p->
d530: 69 43 65 6c 6c 20 3d 20 28 75 38 29 69 43 65 6c  iCell = (u8)iCel
d540: 6c 3b 0a 20 20 20 20 20 20 52 54 52 45 45 5f 51  l;.      RTREE_Q
d550: 55 45 55 45 5f 54 52 41 43 45 28 70 43 73 72 2c  UEUE_TRACE(pCsr,
d560: 20 22 50 55 53 48 2d 46 31 3a 22 29 3b 0a 20 20   "PUSH-F1:");.  
d570: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
d580: 43 73 72 2d 3e 61 74 45 4f 46 20 3d 20 31 3b 0a  Csr->atEOF = 1;.
d590: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
d5a0: 20 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 63 61 73     /* Normal cas
d5b0: 65 20 2d 20 72 2d 74 72 65 65 20 73 63 61 6e 2e  e - r-tree scan.
d5c0: 20 53 65 74 20 75 70 20 74 68 65 20 52 74 72 65   Set up the Rtre
d5d0: 65 43 75 72 73 6f 72 2e 61 43 6f 6e 73 74 72 61  eCursor.aConstra
d5e0: 69 6e 74 20 61 72 72 61 79 20 0a 20 20 20 20 2a  int array .    *
d5f0: 2a 20 77 69 74 68 20 74 68 65 20 63 6f 6e 66 69  * with the confi
d600: 67 75 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74  gured constraint
d610: 73 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  s. .    */.    r
d620: 63 20 3d 20 6e 6f 64 65 41 63 71 75 69 72 65 28  c = nodeAcquire(
d630: 70 52 74 72 65 65 2c 20 31 2c 20 30 2c 20 26 70  pRtree, 1, 0, &p
d640: 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66 28 20 72  Root);.    if( r
d650: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
d660: 61 72 67 63 3e 30 20 29 7b 0a 20 20 20 20 20 20  argc>0 ){.      
d670: 70 43 73 72 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  pCsr->aConstrain
d680: 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  t = sqlite3_mall
d690: 6f 63 28 73 69 7a 65 6f 66 28 52 74 72 65 65 43  oc(sizeof(RtreeC
d6a0: 6f 6e 73 74 72 61 69 6e 74 29 2a 61 72 67 63 29  onstraint)*argc)
d6b0: 3b 0a 20 20 20 20 20 20 70 43 73 72 2d 3e 6e 43  ;.      pCsr->nC
d6c0: 6f 6e 73 74 72 61 69 6e 74 20 3d 20 61 72 67 63  onstraint = argc
d6d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 73  ;.      if( !pCs
d6e0: 72 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 20 29  r->aConstraint )
d6f0: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
d700: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
d710: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d720: 20 20 6d 65 6d 73 65 74 28 70 43 73 72 2d 3e 61    memset(pCsr->a
d730: 43 6f 6e 73 74 72 61 69 6e 74 2c 20 30 2c 20 73  Constraint, 0, s
d740: 69 7a 65 6f 66 28 52 74 72 65 65 43 6f 6e 73 74  izeof(RtreeConst
d750: 72 61 69 6e 74 29 2a 61 72 67 63 29 3b 0a 20 20  raint)*argc);.  
d760: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 43 73        memset(pCs
d770: 72 2d 3e 61 6e 51 75 65 75 65 2c 20 30 2c 20 73  r->anQueue, 0, s
d780: 69 7a 65 6f 66 28 75 33 32 29 2a 28 70 52 74 72  izeof(u32)*(pRtr
d790: 65 65 2d 3e 69 44 65 70 74 68 20 2b 20 31 29 29  ee->iDepth + 1))
d7a0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
d7b0: 28 20 28 69 64 78 53 74 72 3d 3d 30 20 26 26 20  ( (idxStr==0 && 
d7c0: 61 72 67 63 3d 3d 30 29 0a 20 20 20 20 20 20 20  argc==0).       
d7d0: 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 64 78           || (idx
d7e0: 53 74 72 20 26 26 20 28 69 6e 74 29 73 74 72 6c  Str && (int)strl
d7f0: 65 6e 28 69 64 78 53 74 72 29 3d 3d 61 72 67 63  en(idxStr)==argc
d800: 2a 32 29 20 29 3b 0a 20 20 20 20 20 20 20 20 66  *2) );.        f
d810: 6f 72 28 69 69 3d 30 3b 20 69 69 3c 61 72 67 63  or(ii=0; ii<argc
d820: 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; ii++){.       
d830: 20 20 20 52 74 72 65 65 43 6f 6e 73 74 72 61 69     RtreeConstrai
d840: 6e 74 20 2a 70 20 3d 20 26 70 43 73 72 2d 3e 61  nt *p = &pCsr->a
d850: 43 6f 6e 73 74 72 61 69 6e 74 5b 69 69 5d 3b 0a  Constraint[ii];.
d860: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6f 70 20            p->op 
d870: 3d 20 69 64 78 53 74 72 5b 69 69 2a 32 5d 3b 0a  = idxStr[ii*2];.
d880: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 43 6f            p->iCo
d890: 6f 72 64 20 3d 20 69 64 78 53 74 72 5b 69 69 2a  ord = idxStr[ii*
d8a0: 32 2b 31 5d 2d 27 30 27 3b 0a 20 20 20 20 20 20  2+1]-'0';.      
d8b0: 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3e 3d 52      if( p->op>=R
d8c0: 54 52 45 45 5f 4d 41 54 43 48 20 29 7b 0a 20 20  TREE_MATCH ){.  
d8d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 4d            /* A M
d8e0: 41 54 43 48 20 6f 70 65 72 61 74 6f 72 2e 20 54  ATCH operator. T
d8f0: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 2d 73 69  he right-hand-si
d900: 64 65 20 6d 75 73 74 20 62 65 20 61 20 62 6c 6f  de must be a blo
d910: 62 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20  b that.         
d920: 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 63 61 73     ** can be cas
d930: 74 20 69 6e 74 6f 20 61 6e 20 52 74 72 65 65 4d  t into an RtreeM
d940: 61 74 63 68 41 72 67 20 6f 62 6a 65 63 74 2e 20  atchArg object. 
d950: 4f 6e 65 20 63 72 65 61 74 65 64 20 75 73 69 6e  One created usin
d960: 67 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  g.            **
d970: 20 61 6e 20 73 71 6c 69 74 65 33 5f 72 74 72 65   an sqlite3_rtre
d980: 65 5f 67 65 6f 6d 65 74 72 79 5f 63 61 6c 6c 62  e_geometry_callb
d990: 61 63 6b 28 29 20 53 51 4c 20 75 73 65 72 20 66  ack() SQL user f
d9a0: 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20  unction..       
d9b0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
d9c0: 20 20 20 20 72 63 20 3d 20 64 65 73 65 72 69 61      rc = deseria
d9d0: 6c 69 7a 65 47 65 6f 6d 65 74 72 79 28 61 72 67  lizeGeometry(arg
d9e0: 76 5b 69 69 5d 2c 20 70 29 3b 0a 20 20 20 20 20  v[ii], p);.     
d9f0: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
da00: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
da10: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
da20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
da30: 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 49             p->pI
da40: 6e 66 6f 2d 3e 6e 43 6f 6f 72 64 20 3d 20 70 52  nfo->nCoord = pR
da50: 74 72 65 65 2d 3e 6e 44 69 6d 32 3b 0a 20 20 20  tree->nDim2;.   
da60: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 49 6e 66           p->pInf
da70: 6f 2d 3e 61 6e 51 75 65 75 65 20 3d 20 70 43 73  o->anQueue = pCs
da80: 72 2d 3e 61 6e 51 75 65 75 65 3b 0a 20 20 20 20  r->anQueue;.    
da90: 20 20 20 20 20 20 20 20 70 2d 3e 70 49 6e 66 6f          p->pInfo
daa0: 2d 3e 6d 78 4c 65 76 65 6c 20 3d 20 70 52 74 72  ->mxLevel = pRtr
dab0: 65 65 2d 3e 69 44 65 70 74 68 20 2b 20 31 3b 0a  ee->iDepth + 1;.
dac0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
dad0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 52  .#ifdef SQLITE_R
dae0: 54 52 45 45 5f 49 4e 54 5f 4f 4e 4c 59 0a 20 20  TREE_INT_ONLY.  
daf0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 75 2e 72            p->u.r
db00: 56 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 5f  Value = sqlite3_
db10: 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76  value_int64(argv
db20: 5b 69 69 5d 29 3b 0a 23 65 6c 73 65 0a 20 20 20  [ii]);.#else.   
db30: 20 20 20 20 20 20 20 20 20 70 2d 3e 75 2e 72 56           p->u.rV
db40: 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 76  alue = sqlite3_v
db50: 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67 76  alue_double(argv
db60: 5b 69 69 5d 29 3b 0a 23 65 6e 64 69 66 0a 20 20  [ii]);.#endif.  
db70: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
db80: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
db90: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
dba0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
dbb0: 20 52 74 72 65 65 53 65 61 72 63 68 50 6f 69 6e   RtreeSearchPoin
dbc0: 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 70  t *pNew;.      p
dbd0: 4e 65 77 20 3d 20 72 74 72 65 65 53 65 61 72 63  New = rtreeSearc
dbe0: 68 50 6f 69 6e 74 4e 65 77 28 70 43 73 72 2c 20  hPointNew(pCsr, 
dbf0: 52 54 52 45 45 5f 5a 45 52 4f 2c 20 28 75 38 29  RTREE_ZERO, (u8)
dc00: 28 70 52 74 72 65 65 2d 3e 69 44 65 70 74 68 2b  (pRtree->iDepth+
dc10: 31 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  1));.      if( p
dc20: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
dc30: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
dc40: 20 20 20 20 70 4e 65 77 2d 3e 69 64 20 3d 20 31      pNew->id = 1
dc50: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 43  ;.      pNew->iC
dc60: 65 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ell = 0;.      p
dc70: 4e 65 77 2d 3e 65 57 69 74 68 69 6e 20 3d 20 50  New->eWithin = P
dc80: 41 52 54 4c 59 5f 57 49 54 48 49 4e 3b 0a 20 20  ARTLY_WITHIN;.  
dc90: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 73 72      assert( pCsr
dca0: 2d 3e 62 50 6f 69 6e 74 3d 3d 31 20 29 3b 0a 20  ->bPoint==1 );. 
dcb0: 20 20 20 20 20 70 43 73 72 2d 3e 61 4e 6f 64 65       pCsr->aNode
dcc0: 5b 30 5d 20 3d 20 70 52 6f 6f 74 3b 0a 20 20 20  [0] = pRoot;.   
dcd0: 20 20 20 70 52 6f 6f 74 20 3d 20 30 3b 0a 20 20     pRoot = 0;.  
dce0: 20 20 20 20 52 54 52 45 45 5f 51 55 45 55 45 5f      RTREE_QUEUE_
dcf0: 54 52 41 43 45 28 70 43 73 72 2c 20 22 50 55 53  TRACE(pCsr, "PUS
dd00: 48 2d 46 6d 3a 22 29 3b 0a 20 20 20 20 20 20 72  H-Fm:");.      r
dd10: 63 20 3d 20 72 74 72 65 65 53 74 65 70 54 6f 4c  c = rtreeStepToL
dd20: 65 61 66 28 70 43 73 72 29 3b 0a 20 20 20 20 7d  eaf(pCsr);.    }
dd30: 0a 20 20 7d 0a 0a 20 20 6e 6f 64 65 52 65 6c 65  .  }..  nodeRele
dd40: 61 73 65 28 70 52 74 72 65 65 2c 20 70 52 6f 6f  ase(pRtree, pRoo
dd50: 74 29 3b 0a 20 20 72 74 72 65 65 52 65 6c 65 61  t);.  rtreeRelea
dd60: 73 65 28 70 52 74 72 65 65 29 3b 0a 20 20 72 65  se(pRtree);.  re
dd70: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
dd80: 2a 20 52 74 72 65 65 20 76 69 72 74 75 61 6c 20  * Rtree virtual 
dd90: 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78 42 65  table module xBe
dda0: 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 2e 20  stIndex method. 
ddb0: 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65 0a  There are three.
ddc0: 2a 2a 20 74 61 62 6c 65 20 73 63 61 6e 20 73 74  ** table scan st
ddd0: 72 61 74 65 67 69 65 73 20 74 6f 20 63 68 6f 6f  rategies to choo
dde0: 73 65 20 66 72 6f 6d 20 28 69 6e 20 6f 72 64 65  se from (in orde
ddf0: 72 20 66 72 6f 6d 20 6d 6f 73 74 20 74 6f 20 0a  r from most to .
de00: 2a 2a 20 6c 65 61 73 74 20 64 65 73 69 72 61 62  ** least desirab
de10: 6c 65 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 64 78  le):.**.**   idx
de20: 4e 75 6d 20 20 20 20 20 69 64 78 53 74 72 20 20  Num     idxStr  
de30: 20 20 20 20 20 20 53 74 72 61 74 65 67 79 0a 2a        Strategy.*
de40: 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
de50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
de60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
de70: 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 31 20 20 20  ----.**     1   
de80: 20 20 20 20 20 55 6e 75 73 65 64 20 20 20 20 20       Unused     
de90: 20 20 20 44 69 72 65 63 74 20 6c 6f 6f 6b 75 70     Direct lookup
dea0: 20 62 79 20 72 6f 77 69 64 2e 0a 2a 2a 20 20 20   by rowid..**   
deb0: 20 20 32 20 20 20 20 20 20 20 20 53 65 65 20 62    2        See b
dec0: 65 6c 6f 77 20 20 20 20 20 52 2d 74 72 65 65 20  elow     R-tree 
ded0: 71 75 65 72 79 20 6f 72 20 66 75 6c 6c 2d 74 61  query or full-ta
dee0: 62 6c 65 20 73 63 61 6e 2e 0a 2a 2a 20 20 20 2d  ble scan..**   -
def0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
df00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
df10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
df20: 2a 2a 0a 2a 2a 20 49 66 20 73 74 72 61 74 65 67  **.** If strateg
df30: 79 20 31 20 69 73 20 75 73 65 64 2c 20 74 68 65  y 1 is used, the
df40: 6e 20 69 64 78 53 74 72 20 69 73 20 6e 6f 74 20  n idxStr is not 
df50: 6d 65 61 6e 69 6e 67 66 75 6c 2e 20 49 66 20 73  meaningful. If s
df60: 74 72 61 74 65 67 79 0a 2a 2a 20 32 20 69 73 20  trategy.** 2 is 
df70: 75 73 65 64 2c 20 69 64 78 53 74 72 20 69 73 20  used, idxStr is 
df80: 66 6f 72 6d 61 74 74 65 64 20 74 6f 20 63 6f 6e  formatted to con
df90: 74 61 69 6e 20 32 20 62 79 74 65 73 20 66 6f 72  tain 2 bytes for
dfa0: 20 65 61 63 68 20 0a 2a 2a 20 63 6f 6e 73 74 72   each .** constr
dfb0: 61 69 6e 74 20 75 73 65 64 2e 20 54 68 65 20 66  aint used. The f
dfc0: 69 72 73 74 20 74 77 6f 20 62 79 74 65 73 20 6f  irst two bytes o
dfd0: 66 20 69 64 78 53 74 72 20 63 6f 72 72 65 73 70  f idxStr corresp
dfe0: 6f 6e 64 20 74 6f 20 0a 2a 2a 20 74 68 65 20 63  ond to .** the c
dff0: 6f 6e 73 74 72 61 69 6e 74 20 69 6e 20 73 71 6c  onstraint in sql
e000: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 2e  ite3_index_info.
e010: 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
e020: 5b 5d 20 77 69 74 68 0a 2a 2a 20 28 61 72 67 76  [] with.** (argv
e030: 49 6e 64 65 78 3d 3d 31 29 20 65 74 63 2e 0a 2a  Index==1) etc..*
e040: 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6f  *.** The first o
e050: 66 20 65 61 63 68 20 70 61 69 72 20 6f 66 20 62  f each pair of b
e060: 79 74 65 73 20 69 6e 20 69 64 78 53 74 72 20 69  ytes in idxStr i
e070: 64 65 6e 74 69 66 69 65 73 20 74 68 65 20 63 6f  dentifies the co
e080: 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 6f 70 65 72  nstraint.** oper
e090: 61 74 6f 72 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  ator as follows:
e0a0: 0a 2a 2a 0a 2a 2a 20 20 20 4f 70 65 72 61 74 6f  .**.**   Operato
e0b0: 72 20 20 20 20 42 79 74 65 20 56 61 6c 75 65 0a  r    Byte Value.
e0c0: 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  **   -----------
e0d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
e0e0: 20 20 20 20 3d 20 20 20 20 20 20 20 20 30 78 34      =        0x4
e0f0: 31 20 28 27 41 27 29 0a 2a 2a 20 20 20 20 20 3c  1 ('A').**     <
e100: 3d 20 20 20 20 20 20 20 20 30 78 34 32 20 28 27  =        0x42 ('
e110: 42 27 29 0a 2a 2a 20 20 20 20 20 20 3c 20 20 20  B').**      <   
e120: 20 20 20 20 20 30 78 34 33 20 28 27 43 27 29 0a       0x43 ('C').
e130: 2a 2a 20 20 20 20 20 3e 3d 20 20 20 20 20 20 20  **     >=       
e140: 20 30 78 34 34 20 28 27 44 27 29 0a 2a 2a 20 20   0x44 ('D').**  
e150: 20 20 20 20 3e 20 20 20 20 20 20 20 20 30 78 34      >        0x4
e160: 35 20 28 27 45 27 29 0a 2a 2a 20 20 20 4d 41 54  5 ('E').**   MAT
e170: 43 48 20 20 20 20 20 20 20 30 78 34 36 20 28 27  CH       0x46 ('
e180: 46 27 29 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d  F').**   -------
e190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
e1a0: 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  **.** The second
e1b0: 20 6f 66 20 65 61 63 68 20 70 61 69 72 20 6f 66   of each pair of
e1c0: 20 62 79 74 65 73 20 69 64 65 6e 74 69 66 69 65   bytes identifie
e1d0: 73 20 74 68 65 20 63 6f 6f 72 64 69 6e 61 74 65  s the coordinate
e1e0: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 77 68   column.** to wh
e1f0: 69 63 68 20 74 68 65 20 63 6f 6e 73 74 72 61 69  ich the constrai
e200: 6e 74 20 61 70 70 6c 69 65 73 2e 20 54 68 65 20  nt applies. The 
e210: 6c 65 66 74 6d 6f 73 74 20 63 6f 6f 72 64 69 6e  leftmost coordin
e220: 61 74 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 73  ate column.** is
e230: 20 27 61 27 2c 20 74 68 65 20 73 65 63 6f 6e 64   'a', the second
e240: 20 66 72 6f 6d 20 74 68 65 20 6c 65 66 74 20 27   from the left '
e250: 62 27 20 65 74 63 2e 0a 2a 2f 0a 73 74 61 74 69  b' etc..*/.stati
e260: 63 20 69 6e 74 20 72 74 72 65 65 42 65 73 74 49  c int rtreeBestI
e270: 6e 64 65 78 28 73 71 6c 69 74 65 33 5f 76 74 61  ndex(sqlite3_vta
e280: 62 20 2a 74 61 62 2c 20 73 71 6c 69 74 65 33 5f  b *tab, sqlite3_
e290: 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78  index_info *pIdx
e2a0: 49 6e 66 6f 29 7b 0a 20 20 52 74 72 65 65 20 2a  Info){.  Rtree *
e2b0: 70 52 74 72 65 65 20 3d 20 28 52 74 72 65 65 2a  pRtree = (Rtree*
e2c0: 29 74 61 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d  )tab;.  int rc =
e2d0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
e2e0: 74 20 69 69 3b 0a 20 20 69 6e 74 20 62 4d 61 74  t ii;.  int bMat
e2f0: 63 68 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ch = 0;         
e300: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
e310: 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20  if there exists 
e320: 61 20 4d 41 54 43 48 20 63 6f 6e 73 74 72 61 69  a MATCH constrai
e330: 6e 74 20 2a 2f 0a 20 20 69 36 34 20 6e 52 6f 77  nt */.  i64 nRow
e340: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e350: 20 20 20 20 20 20 20 20 2f 2a 20 45 73 74 69 6d          /* Estim
e360: 61 74 65 64 20 72 6f 77 73 20 72 65 74 75 72 6e  ated rows return
e370: 65 64 20 62 79 20 74 68 69 73 20 73 63 61 6e 20  ed by this scan 
e380: 2a 2f 0a 0a 20 20 69 6e 74 20 69 49 64 78 20 3d  */..  int iIdx =
e390: 20 30 3b 0a 20 20 63 68 61 72 20 7a 49 64 78 53   0;.  char zIdxS
e3a0: 74 72 5b 52 54 52 45 45 5f 4d 41 58 5f 44 49 4d  tr[RTREE_MAX_DIM
e3b0: 45 4e 53 49 4f 4e 53 2a 38 2b 31 5d 3b 0a 20 20  ENSIONS*8+1];.  
e3c0: 6d 65 6d 73 65 74 28 7a 49 64 78 53 74 72 2c 20  memset(zIdxStr, 
e3d0: 30 2c 20 73 69 7a 65 6f 66 28 7a 49 64 78 53 74  0, sizeof(zIdxSt
e3e0: 72 29 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  r));..  /* Check
e3f0: 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73   if there exists
e400: 20 61 20 4d 41 54 43 48 20 63 6f 6e 73 74 72 61   a MATCH constra
e410: 69 6e 74 20 2d 20 65 76 65 6e 20 61 6e 20 75 6e  int - even an un
e420: 75 73 61 62 6c 65 20 6f 6e 65 2e 20 49 66 20 74  usable one. If t
e430: 68 65 72 65 0a 20 20 2a 2a 20 69 73 2c 20 64 6f  here.  ** is, do
e440: 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 20 74 68   not consider th
e450: 65 20 6c 6f 6f 6b 75 70 2d 62 79 2d 72 6f 77 69  e lookup-by-rowi
e460: 64 20 70 6c 61 6e 20 61 73 20 75 73 69 6e 67 20  d plan as using 
e470: 73 75 63 68 20 61 20 70 6c 61 6e 20 77 6f 75 6c  such a plan woul
e480: 64 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 20 74  d.  ** require t
e490: 68 65 20 56 44 42 45 20 74 6f 20 65 76 61 6c 75  he VDBE to evalu
e4a0: 61 74 65 20 74 68 65 20 4d 41 54 43 48 20 63 6f  ate the MATCH co
e4b0: 6e 73 74 72 61 69 6e 74 2c 20 77 68 69 63 68 20  nstraint, which 
e4c0: 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  is not currently
e4d0: 0a 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20  .  ** possible. 
e4e0: 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  */.  for(ii=0; i
e4f0: 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e  i<pIdxInfo->nCon
e500: 73 74 72 61 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a  straint; ii++){.
e510: 20 20 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f      if( pIdxInfo
e520: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 69  ->aConstraint[ii
e530: 5d 2e 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  ].op==SQLITE_IND
e540: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41  EX_CONSTRAINT_MA
e550: 54 43 48 20 29 7b 0a 20 20 20 20 20 20 62 4d 61  TCH ){.      bMa
e560: 74 63 68 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  tch = 1;.    }. 
e570: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49   }..  assert( pI
e580: 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 3d 3d  dxInfo->idxStr==
e590: 30 20 29 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b  0 );.  for(ii=0;
e5a0: 20 69 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43   ii<pIdxInfo->nC
e5b0: 6f 6e 73 74 72 61 69 6e 74 20 26 26 20 69 49 64  onstraint && iId
e5c0: 78 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 7a  x<(int)(sizeof(z
e5d0: 49 64 78 53 74 72 29 2d 31 29 3b 20 69 69 2b 2b  IdxStr)-1); ii++
e5e0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 71  ){.    struct sq
e5f0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
e600: 74 72 61 69 6e 74 20 2a 70 20 3d 20 26 70 49 64  traint *p = &pId
e610: 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
e620: 6e 74 5b 69 69 5d 3b 0a 0a 20 20 20 20 69 66 28  nt[ii];..    if(
e630: 20 62 4d 61 74 63 68 3d 3d 30 20 26 26 20 70 2d   bMatch==0 && p-
e640: 3e 75 73 61 62 6c 65 20 0a 20 20 20 20 20 26 26  >usable .     &&
e650: 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 26   p->iColumn==0 &
e660: 26 20 70 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f  & p->op==SQLITE_
e670: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
e680: 5f 45 51 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  _EQ .    ){.    
e690: 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61 6e 20    /* We have an 
e6a0: 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
e6b0: 69 6e 74 20 6f 6e 20 74 68 65 20 72 6f 77 69 64  int on the rowid
e6c0: 2e 20 55 73 65 20 73 74 72 61 74 65 67 79 20 31  . Use strategy 1
e6d0: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a  . */.      int j
e6e0: 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d  j;.      for(jj=
e6f0: 30 3b 20 6a 6a 3c 69 69 3b 20 6a 6a 2b 2b 29 7b  0; jj<ii; jj++){
e700: 0a 20 20 20 20 20 20 20 20 70 49 64 78 49 6e 66  .        pIdxInf
e710: 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
e720: 61 67 65 5b 6a 6a 5d 2e 61 72 67 76 49 6e 64 65  age[jj].argvInde
e730: 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  x = 0;.        p
e740: 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
e750: 61 69 6e 74 55 73 61 67 65 5b 6a 6a 5d 2e 6f 6d  aintUsage[jj].om
e760: 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  it = 0;.      }.
e770: 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e        pIdxInfo->
e780: 69 64 78 4e 75 6d 20 3d 20 31 3b 0a 20 20 20 20  idxNum = 1;.    
e790: 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e    pIdxInfo->aCon
e7a0: 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 69 5d  straintUsage[ii]
e7b0: 2e 61 72 67 76 49 6e 64 65 78 20 3d 20 31 3b 0a  .argvIndex = 1;.
e7c0: 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e        pIdxInfo->
e7d0: 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
e7e0: 5b 6a 6a 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a 0a  [jj].omit = 1;..
e7f0: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 74        /* This st
e800: 72 61 74 65 67 79 20 69 6e 76 6f 6c 76 65 73 20  rategy involves 
e810: 61 20 74 77 6f 20 72 6f 77 69 64 20 6c 6f 6f 6b  a two rowid look
e820: 75 70 73 20 6f 6e 20 61 6e 20 42 2d 54 72 65 65  ups on an B-Tree
e830: 20 73 74 72 75 63 74 75 72 65 73 0a 20 20 20 20   structures.    
e840: 20 20 2a 2a 20 61 6e 64 20 74 68 65 6e 20 61 20    ** and then a 
e850: 6c 69 6e 65 61 72 20 73 65 61 72 63 68 20 6f 66  linear search of
e860: 20 61 6e 20 52 2d 54 72 65 65 20 6e 6f 64 65 2e   an R-Tree node.
e870: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20   This should be 
e880: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64  .      ** consid
e890: 65 72 65 64 20 61 6c 6d 6f 73 74 20 61 73 20 71  ered almost as q
e8a0: 75 69 63 6b 20 61 73 20 61 20 64 69 72 65 63 74  uick as a direct
e8b0: 20 72 6f 77 69 64 20 6c 6f 6f 6b 75 70 20 28 66   rowid lookup (f
e8c0: 6f 72 20 77 68 69 63 68 20 0a 20 20 20 20 20 20  or which .      
e8d0: 2a 2a 20 73 71 6c 69 74 65 20 75 73 65 73 20 61  ** sqlite uses a
e8e0: 6e 20 69 6e 74 65 72 6e 61 6c 20 63 6f 73 74 20  n internal cost 
e8f0: 6f 66 20 30 2e 30 29 2e 20 49 74 20 69 73 20 65  of 0.0). It is e
e900: 78 70 65 63 74 65 64 20 74 6f 20 72 65 74 75 72  xpected to retur
e910: 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 69 6e  n.      ** a sin
e920: 67 6c 65 20 72 6f 77 2e 0a 20 20 20 20 20 20 2a  gle row..      *
e930: 2f 20 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66  / .      pIdxInf
e940: 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  o->estimatedCost
e950: 20 3d 20 33 30 2e 30 3b 0a 20 20 20 20 20 20 70   = 30.0;.      p
e960: 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
e970: 65 64 52 6f 77 73 20 3d 20 31 3b 0a 20 20 20 20  edRows = 1;.    
e980: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e990: 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  OK;.    }..    i
e9a0: 66 28 20 70 2d 3e 75 73 61 62 6c 65 20 26 26 20  f( p->usable && 
e9b0: 28 70 2d 3e 69 43 6f 6c 75 6d 6e 3e 30 20 7c 7c  (p->iColumn>0 ||
e9c0: 20 70 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f 49   p->op==SQLITE_I
e9d0: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
e9e0: 4d 41 54 43 48 29 20 29 7b 0a 20 20 20 20 20 20  MATCH) ){.      
e9f0: 75 38 20 6f 70 3b 0a 20 20 20 20 20 20 73 77 69  u8 op;.      swi
ea00: 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20  tch( p->op ){.  
ea10: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
ea20: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
ea30: 4e 54 5f 45 51 3a 20 6f 70 20 3d 20 52 54 52 45  NT_EQ: op = RTRE
ea40: 45 5f 45 51 3b 20 62 72 65 61 6b 3b 0a 20 20 20  E_EQ; break;.   
ea50: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
ea60: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
ea70: 54 5f 47 54 3a 20 6f 70 20 3d 20 52 54 52 45 45  T_GT: op = RTREE
ea80: 5f 47 54 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  _GT; break;.    
ea90: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
eaa0: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
eab0: 5f 4c 45 3a 20 6f 70 20 3d 20 52 54 52 45 45 5f  _LE: op = RTREE_
eac0: 4c 45 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  LE; break;.     
ead0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
eae0: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
eaf0: 4c 54 3a 20 6f 70 20 3d 20 52 54 52 45 45 5f 4c  LT: op = RTREE_L
eb00: 54 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  T; break;.      
eb10: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e    case SQLITE_IN
eb20: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47  DEX_CONSTRAINT_G
eb30: 45 3a 20 6f 70 20 3d 20 52 54 52 45 45 5f 47 45  E: op = RTREE_GE
eb40: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ; break;.       
eb50: 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
eb60: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f      assert( p->o
eb70: 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  p==SQLITE_INDEX_
eb80: 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43 48  CONSTRAINT_MATCH
eb90: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 70   );.          op
eba0: 20 3d 20 52 54 52 45 45 5f 4d 41 54 43 48 3b 20   = RTREE_MATCH; 
ebb0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
ebc0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ebd0: 7a 49 64 78 53 74 72 5b 69 49 64 78 2b 2b 5d 20  zIdxStr[iIdx++] 
ebe0: 3d 20 6f 70 3b 0a 20 20 20 20 20 20 7a 49 64 78  = op;.      zIdx
ebf0: 53 74 72 5b 69 49 64 78 2b 2b 5d 20 3d 20 28 63  Str[iIdx++] = (c
ec00: 68 61 72 29 28 70 2d 3e 69 43 6f 6c 75 6d 6e 20  har)(p->iColumn 
ec10: 2d 20 31 20 2b 20 27 30 27 29 3b 0a 20 20 20 20  - 1 + '0');.    
ec20: 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e    pIdxInfo->aCon
ec30: 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 69 5d  straintUsage[ii]
ec40: 2e 61 72 67 76 49 6e 64 65 78 20 3d 20 28 69 49  .argvIndex = (iI
ec50: 64 78 2f 32 29 3b 0a 20 20 20 20 20 20 70 49 64  dx/2);.      pId
ec60: 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
ec70: 6e 74 55 73 61 67 65 5b 69 69 5d 2e 6f 6d 69 74  ntUsage[ii].omit
ec80: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
ec90: 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78  .  pIdxInfo->idx
eca0: 4e 75 6d 20 3d 20 32 3b 0a 20 20 70 49 64 78 49  Num = 2;.  pIdxI
ecb0: 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
ecc0: 64 78 53 74 72 20 3d 20 31 3b 0a 20 20 69 66 28  dxStr = 1;.  if(
ecd0: 20 69 49 64 78 3e 30 20 26 26 20 30 3d 3d 28 70   iIdx>0 && 0==(p
ece0: 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20  IdxInfo->idxStr 
ecf0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
ed00: 66 28 22 25 73 22 2c 20 7a 49 64 78 53 74 72 29  f("%s", zIdxStr)
ed10: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
ed20: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
ed30: 7d 0a 0a 20 20 6e 52 6f 77 20 3d 20 70 52 74 72  }..  nRow = pRtr
ed40: 65 65 2d 3e 6e 52 6f 77 45 73 74 20 3e 3e 20 28  ee->nRowEst >> (
ed50: 69 49 64 78 2f 32 29 3b 0a 20 20 70 49 64 78 49  iIdx/2);.  pIdxI
ed60: 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  nfo->estimatedCo
ed70: 73 74 20 3d 20 28 64 6f 75 62 6c 65 29 36 2e 30  st = (double)6.0
ed80: 20 2a 20 28 64 6f 75 62 6c 65 29 6e 52 6f 77 3b   * (double)nRow;
ed90: 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74  .  pIdxInfo->est
eda0: 69 6d 61 74 65 64 52 6f 77 73 20 3d 20 6e 52 6f  imatedRows = nRo
edb0: 77 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  w;..  return rc;
edc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
edd0: 20 74 68 65 20 4e 2d 64 69 6d 65 6e 73 69 6f 6e   the N-dimension
ede0: 61 6c 20 76 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  al volumn of the
edf0: 20 63 65 6c 6c 20 73 74 6f 72 65 64 20 69 6e 20   cell stored in 
ee00: 2a 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 52 74  *p..*/.static Rt
ee10: 72 65 65 44 56 61 6c 75 65 20 63 65 6c 6c 41 72  reeDValue cellAr
ee20: 65 61 28 52 74 72 65 65 20 2a 70 52 74 72 65 65  ea(Rtree *pRtree
ee30: 2c 20 52 74 72 65 65 43 65 6c 6c 20 2a 70 29 7b  , RtreeCell *p){
ee40: 0a 20 20 52 74 72 65 65 44 56 61 6c 75 65 20 61  .  RtreeDValue a
ee50: 72 65 61 20 3d 20 28 52 74 72 65 65 44 56 61 6c  rea = (RtreeDVal
ee60: 75 65 29 31 3b 0a 20 20 61 73 73 65 72 74 28 20  ue)1;.  assert( 
ee70: 70 52 74 72 65 65 2d 3e 6e 44 69 6d 3e 3d 31 20  pRtree->nDim>=1 
ee80: 26 26 20 70 52 74 72 65 65 2d 3e 6e 44 69 6d 3c  && pRtree->nDim<
ee90: 3d 35 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  =5 );.#ifndef SQ
eea0: 4c 49 54 45 5f 52 54 52 45 45 5f 49 4e 54 5f 4f  LITE_RTREE_INT_O
eeb0: 4e 4c 59 0a 20 20 69 66 28 20 70 52 74 72 65 65  NLY.  if( pRtree
eec0: 2d 3e 65 43 6f 6f 72 64 54 79 70 65 3d 3d 52 54  ->eCoordType==RT
eed0: 52 45 45 5f 43 4f 4f 52 44 5f 52 45 41 4c 33 32  REE_COORD_REAL32
eee0: 20 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20   ){.    switch( 
eef0: 70 52 74 72 65 65 2d 3e 6e 44 69 6d 20 29 7b 0a  pRtree->nDim ){.
ef00: 20 20 20 20 20 20 63 61 73 65 20 35 3a 20 20 61        case 5:  a
ef10: 72 65 61 20 20 3d 20 70 2d 3e 61 43 6f 6f 72 64  rea  = p->aCoord
ef20: 5b 39 5d 2e 66 20 2d 20 70 2d 3e 61 43 6f 6f 72  [9].f - p->aCoor
ef30: 64 5b 38 5d 2e 66 3b 0a 20 20 20 20 20 20 63 61  d[8].f;.      ca
ef40: 73 65 20 34 3a 20 20 61 72 65 61 20 2a 3d 20 70  se 4:  area *= p
ef50: 2d 3e 61 43 6f 6f 72 64 5b 37 5d 2e 66 20 2d 20  ->aCoord[7].f - 
ef60: 70 2d 3e 61 43 6f 6f 72 64 5b 36 5d 2e 66 3b 0a  p->aCoord[6].f;.
ef70: 20 20 20 20 20 20 63 61 73 65 20 33 3a 20 20 61        case 3:  a
ef80: 72 65 61 20 2a 3d 20 70 2d 3e 61 43 6f 6f 72 64  rea *= p->aCoord
ef90: 5b 35 5d 2e 66 20 2d 20 70 2d 3e 61 43 6f 6f 72  [5].f - p->aCoor
efa0: 64 5b 34 5d 2e 66 3b 0a 20 20 20 20 20 20 63 61  d[4].f;.      ca
efb0: 73 65 20 32 3a 20 20 61 72 65 61 20 2a 3d 20 70  se 2:  area *= p
efc0: 2d 3e 61 43 6f 6f 72 64 5b 33 5d 2e 66 20 2d 20  ->aCoord[3].f - 
efd0: 70 2d 3e 61 43 6f 6f 72 64 5b 32 5d 2e 66 3b 0a  p->aCoord[2].f;.
efe0: 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61        default: a
eff0: 72 65 61 20 2a 3d 20 70 2d 3e 61 43 6f 6f 72 64  rea *= p->aCoord
f000: 5b 31 5d 2e 66 20 2d 20 70 2d 3e 61 43 6f 6f 72  [1].f - p->aCoor
f010: 64 5b 30 5d 2e 66 3b 0a 20 20 20 20 7d 0a 20 20  d[0].f;.    }.  
f020: 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b  }else.#endif.  {
f030: 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 52 74  .    switch( pRt
f040: 72 65 65 2d 3e 6e 44 69 6d 20 29 7b 0a 20 20 20  ree->nDim ){.   
f050: 20 20 20 63 61 73 65 20 35 3a 20 20 61 72 65 61     case 5:  area
f060: 20 20 3d 20 70 2d 3e 61 43 6f 6f 72 64 5b 39 5d    = p->aCoord[9]
f070: 2e 69 20 2d 20 70 2d 3e 61 43 6f 6f 72 64 5b 38  .i - p->aCoord[8
f080: 5d 2e 69 3b 0a 20 20 20 20 20 20 63 61 73 65 20  ].i;.      case 
f090: 34 3a 20 20 61 72 65 61 20 2a 3d 20 70 2d 3e 61  4:  area *= p->a
f0a0: 43 6f 6f 72 64 5b 37 5d 2e 69 20 2d 20 70 2d 3e  Coord[7].i - p->
f0b0: 61 43 6f 6f 72 64 5b 36 5d 2e 69 3b 0a 20 20 20  aCoord[6].i;.   
f0c0: 20 20 20 63 61 73 65 20 33 3a 20 20 61 72 65 61     case 3:  area
f0d0: 20 2a 3d 20 70 2d 3e 61 43 6f 6f 72 64 5b 35 5d   *= p->aCoord[5]
f0e0: 2e 69 20 2d 20 70 2d 3e 61 43 6f 6f 72 64 5b 34  .i - p->aCoord[4
f0f0: 5d 2e 69 3b 0a 20 20 20 20 20 20 63 61 73 65 20  ].i;.      case 
f100: 32 3a 20 20 61 72 65 61 20 2a 3d 20 70 2d 3e 61  2:  area *= p->a
f110: 43 6f 6f 72 64 5b 33 5d 2e 69 20 2d 20 70 2d 3e  Coord[3].i - p->
f120: 61 43 6f 6f 72 64 5b 32 5d 2e 69 3b 0a 20 20 20  aCoord[2].i;.   
f130: 20 20 20 64 65 66 61 75 6c 74 3a 20 61 72 65 61     default: area
f140: 20 2a 3d 20 70 2d 3e 61 43 6f 6f 72 64 5b 31 5d   *= p->aCoord[1]
f150: 2e 69 20 2d 20 70 2d 3e 61 43 6f 6f 72 64 5b 30  .i - p->aCoord[0
f160: 5d 2e 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ].i;.    }.  }. 
f170: 20 72 65 74 75 72 6e 20 61 72 65 61 3b 0a 7d 0a   return area;.}.
f180: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
f190: 65 20 6d 61 72 67 69 6e 20 6c 65 6e 67 74 68 20  e margin length 
f1a0: 6f 66 20 63 65 6c 6c 20 70 2e 20 54 68 65 20 6d  of cell p. The m
f1b0: 61 72 67 69 6e 20 6c 65 6e 67 74 68 20 69 73 20  argin length is 
f1c0: 74 68 65 20 73 75 6d 0a 2a 2a 20 6f 66 20 74 68  the sum.** of th
f1d0: 65 20 6f 62 6a 65 63 74 73 20 73 69 7a 65 20 69  e objects size i
f1e0: 6e 20 65 61 63 68 20 64 69 6d 65 6e 73 69 6f 6e  n each dimension
f1f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 52 74 72 65  ..*/.static Rtre
f200: 65 44 56 61 6c 75 65 20 63 65 6c 6c 4d 61 72 67  eDValue cellMarg
f210: 69 6e 28 52 74 72 65 65 20 2a 70 52 74 72 65 65  in(Rtree *pRtree
f220: 2c 20 52 74 72 65 65 43 65 6c 6c 20 2a 70 29 7b  , RtreeCell *p){
f230: 0a 20 20 52 74 72 65 65 44 56 61 6c 75 65 20 6d  .  RtreeDValue m
f240: 61 72 67 69 6e 20 3d 20 30 3b 0a 20 20 69 6e 74  argin = 0;.  int
f250: 20 69 69 20 3d 20 70 52 74 72 65 65 2d 3e 6e 44   ii = pRtree->nD
f260: 69 6d 32 20 2d 20 32 3b 0a 20 20 64 6f 7b 0a 20  im2 - 2;.  do{. 
f270: 20 20 20 6d 61 72 67 69 6e 20 2b 3d 20 28 44 43     margin += (DC
f280: 4f 4f 52 44 28 70 2d 3e 61 43 6f 6f 72 64 5b 69  OORD(p->aCoord[i
f290: 69 2b 31 5d 29 20 2d 20 44 43 4f 4f 52 44 28 70  i+1]) - DCOORD(p
f2a0: 2d 3e 61 43 6f 6f 72 64 5b 69 69 5d 29 29 3b 0a  ->aCoord[ii]));.
f2b0: 20 20 20 20 69 69 20 2d 3d 20 32 3b 0a 20 20 7d      ii -= 2;.  }
f2c0: 77 68 69 6c 65 28 20 69 69 3e 3d 30 20 29 3b 0a  while( ii>=0 );.
f2d0: 20 20 72 65 74 75 72 6e 20 6d 61 72 67 69 6e 3b    return margin;
f2e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 6f 72 65 20  .}../*.** Store 
f2f0: 74 68 65 20 75 6e 69 6f 6e 20 6f 66 20 63 65 6c  the union of cel
f300: 6c 73 20 70 31 20 61 6e 64 20 70 32 20 69 6e 20  ls p1 and p2 in 
f310: 70 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  p1..*/.static vo
f320: 69 64 20 63 65 6c 6c 55 6e 69 6f 6e 28 52 74 72  id cellUnion(Rtr
f330: 65 65 20 2a 70 52 74 72 65 65 2c 20 52 74 72 65  ee *pRtree, Rtre
f340: 65 43 65 6c 6c 20 2a 70 31 2c 20 52 74 72 65 65  eCell *p1, Rtree
f350: 43 65 6c 6c 20 2a 70 32 29 7b 0a 20 20 69 6e 74  Cell *p2){.  int
f360: 20 69 69 20 3d 20 30 3b 0a 20 20 69 66 28 20 70   ii = 0;.  if( p
f370: 52 74 72 65 65 2d 3e 65 43 6f 6f 72 64 54 79 70  Rtree->eCoordTyp
f380: 65 3d 3d 52 54 52 45 45 5f 43 4f 4f 52 44 5f 52  e==RTREE_COORD_R
f390: 45 41 4c 33 32 20 29 7b 0a 20 20 20 20 64 6f 7b  EAL32 ){.    do{
f3a0: 0a 20 20 20 20 20 20 70 31 2d 3e 61 43 6f 6f 72  .      p1->aCoor
f3b0: 64 5b 69 69 5d 2e 66 20 3d 20 4d 49 4e 28 70 31  d[ii].f = MIN(p1
f3c0: 2d 3e 61 43 6f 6f 72 64 5b 69 69 5d 2e 66 2c 20  ->aCoord[ii].f, 
f3d0: 70 32 2d 3e 61 43 6f 6f 72 64 5b 69 69 5d 2e 66  p2->aCoord[ii].f
f3e0: 29 3b 0a 20 20 20 20 20 20 70 31 2d 3e 61 43 6f  );.      p1->aCo
f3f0: 6f 72 64 5b 69 69 2b 31 5d 2e 66 20 3d 20 4d 41  ord[ii+1].f = MA
f400: 58 28 70 31 2d 3e 61 43 6f 6f 72 64 5b 69 69 2b  X(p1->aCoord[ii+
f410: 31 5d 2e 66 2c 20 70 32 2d 3e 61 43 6f 6f 72 64  1].f, p2->aCoord
f420: 5b 69 69 2b 31 5d 2e 66 29 3b 0a 20 20 20 20 20  [ii+1].f);.     
f430: 20 69 69 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 77   ii += 2;.    }w
f440: 68 69 6c 65 28 20 69 69 3c 70 52 74 72 65 65 2d  hile( ii<pRtree-
f450: 3e 6e 44 69 6d 32 20 29 3b 0a 20 20 7d 65 6c 73  >nDim2 );.  }els
f460: 65 7b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  e{.    do{.     
f470: 20 70 31 2d 3e 61 43 6f 6f 72 64 5b 69 69 5d 2e   p1->aCoord[ii].
f480: 69 20 3d 20 4d 49 4e 28 70 31 2d 3e 61 43 6f 6f  i = MIN(p1->aCoo
f490: 72 64 5b 69 69 5d 2e 69 2c 20 70 32 2d 3e 61 43  rd[ii].i, p2->aC
f4a0: 6f 6f 72 64 5b 69 69 5d 2e 69 29 3b 0a 20 20 20  oord[ii].i);.   
f4b0: 20 20 20 70 31 2d 3e 61 43 6f 6f 72 64 5b 69 69     p1->aCoord[ii
f4c0: 2b 31 5d 2e 69 20 3d 20 4d 41 58 28 70 31 2d 3e  +1].i = MAX(p1->
f4d0: 61 43 6f 6f 72 64 5b 69 69 2b 31 5d 2e 69 2c 20  aCoord[ii+1].i, 
f4e0: 70 32 2d 3e 61 43 6f 6f 72 64 5b 69 69 2b 31 5d  p2->aCoord[ii+1]
f4f0: 2e 69 29 3b 0a 20 20 20 20 20 20 69 69 20 2b 3d  .i);.      ii +=
f500: 20 32 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20   2;.    }while( 
f510: 69 69 3c 70 52 74 72 65 65 2d 3e 6e 44 69 6d 32  ii<pRtree->nDim2
f520: 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   );.  }.}../*.**
f530: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
f540: 74 68 65 20 61 72 65 61 20 63 6f 76 65 72 65 64  the area covered
f550: 20 62 79 20 70 32 20 69 73 20 61 20 73 75 62 73   by p2 is a subs
f560: 65 74 20 6f 66 20 74 68 65 20 61 72 65 61 20 63  et of the area c
f570: 6f 76 65 72 65 64 0a 2a 2a 20 62 79 20 70 31 2e  overed.** by p1.
f580: 20 46 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65   False otherwise
f590: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f5a0: 63 65 6c 6c 43 6f 6e 74 61 69 6e 73 28 52 74 72  cellContains(Rtr
f5b0: 65 65 20 2a 70 52 74 72 65 65 2c 20 52 74 72 65  ee *pRtree, Rtre
f5c0: 65 43 65 6c 6c 20 2a 70 31 2c 20 52 74 72 65 65  eCell *p1, Rtree
f5d0: 43 65 6c 6c 20 2a 70 32 29 7b 0a 20 20 69 6e 74  Cell *p2){.  int
f5e0: 20 69 69 3b 0a 20 20 69 6e 74 20 69 73 49 6e 74   ii;.  int isInt
f5f0: 20 3d 20 28 70 52 74 72 65 65 2d 3e 65 43 6f 6f   = (pRtree->eCoo
f600: 72 64 54 79 70 65 3d 3d 52 54 52 45 45 5f 43 4f  rdType==RTREE_CO
f610: 4f 52 44 5f 49 4e 54 33 32 29 3b 0a 20 20 66 6f  ORD_INT32);.  fo
f620: 72 28 69 69 3d 30 3b 20 69 69 3c 70 52 74 72 65  r(ii=0; ii<pRtre
f630: 65 2d 3e 6e 44 69 6d 32 3b 20 69 69 2b 3d 32 29  e->nDim2; ii+=2)
f640: 7b 0a 20 20 20 20 52 74 72 65 65 43 6f 6f 72 64  {.    RtreeCoord
f650: 20 2a 61 31 20 3d 20 26 70 31 2d 3e 61 43 6f 6f   *a1 = &p1->aCoo
f660: 72 64 5b 69 69 5d 3b 0a 20 20 20 20 52 74 72 65  rd[ii];.    Rtre
f670: 65 43 6f 6f 72 64 20 2a 61 32 20 3d 20 26 70 32  eCoord *a2 = &p2
f680: 2d 3e 61 43 6f 6f 72 64 5b 69 69 5d 3b 0a 20 20  ->aCoord[ii];.  
f690: 20 20 69 66 28 20 28 21 69 73 49 6e 74 20 26 26    if( (!isInt &&
f6a0: 20 28 61 32 5b 30 5d 2e 66 3c 61 31 5b 30 5d 2e   (a2[0].f<a1[0].
f6b0: 66 20 7c 7c 20 61 32 5b 31 5d 2e 66 3e 61 31 5b  f || a2[1].f>a1[
f6c0: 31 5d 2e 66 29 29 20 0a 20 20 20 20 20 7c 7c 20  1].f)) .     || 
f6d0: 28 20 69 73 49 6e 74 20 26 26 20 28 61 32 5b 30  ( isInt && (a2[0
f6e0: 5d 2e 69 3c 61 31 5b 30 5d 2e 69 20 7c 7c 20 61  ].i<a1[0].i || a
f6f0: 32 5b 31 5d 2e 69 3e 61 31 5b 31 5d 2e 69 29 29  2[1].i>a1[1].i))
f700: 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72   .    ){.      r
f710: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
f720: 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
f730: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
f740: 68 65 20 61 6d 6f 75 6e 74 20 63 65 6c 6c 20 70  he amount cell p
f750: 20 77 6f 75 6c 64 20 67 72 6f 77 20 62 79 20 69   would grow by i
f760: 66 20 69 74 20 77 65 72 65 20 75 6e 69 6f 6e 65  f it were unione
f770: 64 20 77 69 74 68 20 70 43 65 6c 6c 2e 0a 2a 2f  d with pCell..*/
f780: 0a 73 74 61 74 69 63 20 52 74 72 65 65 44 56 61  .static RtreeDVa
f790: 6c 75 65 20 63 65 6c 6c 47 72 6f 77 74 68 28 52  lue cellGrowth(R
f7a0: 74 72 65 65 20 2a 70 52 74 72 65 65 2c 20 52 74  tree *pRtree, Rt
f7b0: 72 65 65 43 65 6c 6c 20 2a 70 2c 20 52 74 72 65  reeCell *p, Rtre
f7c0: 65 43 65 6c 6c 20 2a 70 43 65 6c 6c 29 7b 0a 20  eCell *pCell){. 
f7d0: 20 52 74 72 65 65 44 56 61 6c 75 65 20 61 72 65   RtreeDValue are
f7e0: 61 3b 0a 20 20 52 74 72 65 65 43 65 6c 6c 20 63  a;.  RtreeCell c
f7f0: 65 6c 6c 3b 0a 20 20 6d 65 6d 63 70 79 28 26 63  ell;.  memcpy(&c
f800: 65 6c 6c 2c 20 70 2c 20 73 69 7a 65 6f 66 28 52  ell, p, sizeof(R
f810: 74 72 65 65 43 65 6c 6c 29 29 3b 0a 20 20 61 72  treeCell));.  ar
f820: 65 61 20 3d 20 63 65 6c 6c 41 72 65 61 28 70 52  ea = cellArea(pR
f830: 74 72 65 65 2c 20 26 63 65 6c 6c 29 3b 0a 20 20  tree, &cell);.  
f840: 63 65 6c 6c 55 6e 69 6f 6e 28 70 52 74 72 65 65  cellUnion(pRtree
f850: 2c 20 26 63 65 6c 6c 2c 20 70 43 65 6c 6c 29 3b  , &cell, pCell);
f860: 0a 20 20 72 65 74 75 72 6e 20 28 63 65 6c 6c 41  .  return (cellA
f870: 72 65 61 28 70 52 74 72 65 65 2c 20 26 63 65 6c  rea(pRtree, &cel
f880: 6c 29 2d 61 72 65 61 29 3b 0a 7d 0a 0a 73 74 61  l)-area);.}..sta
f890: 74 69 63 20 52 74 72 65 65 44 56 61 6c 75 65 20  tic RtreeDValue 
f8a0: 63 65 6c 6c 4f 76 65 72 6c 61 70 28 0a 20 20 52  cellOverlap(.  R
f8b0: 74 72 65 65 20 2a 70 52 74 72 65 65 2c 20 0a 20  tree *pRtree, . 
f8c0: 20 52 74 72 65 65 43 65 6c 6c 20 2a 70 2c 20 0a   RtreeCell *p, .
f8d0: 20 20 52 74 72 65 65 43 65 6c 6c 20 2a 61 43 65    RtreeCell *aCe
f8e0: 6c 6c 2c 20 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  ll, .  int nCell
f8f0: 0a 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20  .){.  int ii;.  
f900: 52 74 72 65 65 44 56 61 6c 75 65 20 6f 76 65 72  RtreeDValue over
f910: 6c 61 70 20 3d 20 52 54 52 45 45 5f 5a 45 52 4f  lap = RTREE_ZERO
f920: 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  ;.  for(ii=0; ii
f930: 3c 6e 43 65 6c 6c 3b 20 69 69 2b 2b 29 7b 0a 20  <nCell; ii++){. 
f940: 20 20 20 69 6e 74 20 6a 6a 3b 0a 20 20 20 20 52     int jj;.    R
f950: 74 72 65 65 44 56 61 6c 75 65 20 6f 20 3d 20 28  treeDValue o = (
f960: 52 74 72 65 65 44 56 61 6c 75 65 29 31 3b 0a 20  RtreeDValue)1;. 
f970: 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c     for(jj=0; jj<
f980: 70 52 74 72 65 65 2d 3e 6e 44 69 6d 32 3b 20 6a  pRtree->nDim2; j
f990: 6a 2b 3d 32 29 7b 0a 20 20 20 20 20 20 52 74 72  j+=2){.      Rtr
f9a0: 65 65 44 56 61 6c 75 65 20 78 31 2c 20 78 32 3b  eeDValue x1, x2;
f9b0: 0a 20 20 20 20 20 20 78 31 20 3d 20 4d 41 58 28  .      x1 = MAX(
f9c0: 44 43 4f 4f 52 44 28 70 2d 3e 61 43 6f 6f 72 64  DCOORD(p->aCoord
f9d0: 5b 6a 6a 5d 29 2c 20 44 43 4f 4f 52 44 28 61 43  [jj]), DCOORD(aC
f9e0: 65 6c 6c 5b 69 69 5d 2e 61 43 6f 6f 72 64 5b 6a  ell[ii].aCoord[j
f9f0: 6a 5d 29 29 3b 0a 20 20 20 20 20 20 78 32 20 3d  j]));.      x2 =
fa00: 20 4d 49 4e 28 44 43 4f 4f 52 44 28 70 2d 3e 61   MIN(DCOORD(p->a
fa10: 43 6f 6f 72 64 5b 6a 6a 2b 31 5d 29 2c 20 44 43  Coord[jj+1]), DC
fa20: 4f 4f 52 44 28 61 43 65 6c 6c 5b 69 69 5d 2e 61  OORD(aCell[ii].a
fa30: 43 6f 6f 72 64 5b 6a 6a 2b 31 5d 29 29 3b 0a 20  Coord[jj+1]));. 
fa40: 20 20 20 20 20 69 66 28 20 78 32 3c 78 31 20 29       if( x2<x1 )
fa50: 7b 0a 20 20 20 20 20 20 20 20 6f 20 3d 20 28 52  {.        o = (R
fa60: 74 72 65 65 44 56 61 6c 75 65 29 30 3b 0a 20 20  treeDValue)0;.  
fa70: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
fa80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fa90: 20 20 6f 20 3d 20 6f 20 2a 20 28 78 32 2d 78 31    o = o * (x2-x1
faa0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
fab0: 0a 20 20 20 20 6f 76 65 72 6c 61 70 20 2b 3d 20  .    overlap += 
fac0: 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  o;.  }.  return 
fad0: 6f 76 65 72 6c 61 70 3b 0a 7d 0a 0a 0a 2f 2a 0a  overlap;.}.../*.
fae0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
faf0: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
fb00: 43 68 6f 6f 73 65 4c 65 61 66 20 61 6c 67 6f 72  ChooseLeaf algor
fb10: 69 74 68 6d 20 66 72 6f 6d 20 47 75 74 6d 61 6e  ithm from Gutman
fb20: 5b 38 34 5d 2e 0a 2a 2a 20 43 68 6f 6f 73 65 53  [84]..** ChooseS
fb30: 75 62 54 72 65 65 20 69 6e 20 72 2a 74 72 65 65  ubTree in r*tree
fb40: 20 74 65 72 6d 69 6e 6f 6c 6f 67 79 2e 0a 2a 2f   terminology..*/
fb50: 0a 73 74 61 74 69 63 20 69 6e 74 20 43 68 6f 6f  .static int Choo
fb60: 73 65 4c 65 61 66 28 0a 20 20 52 74 72 65 65 20  seLeaf(.  Rtree 
fb70: 2a 70 52 74 72 65 65 2c 20 20 20 20 20 20 20 20  *pRtree,        
fb80: 20 20 20 20 20 20 20 2f 2a 20 52 74 72 65 65 20         /* Rtree 
fb90: 74 61 62 6c 65 20 2a 2f 0a 20 20 52 74 72 65 65  table */.  Rtree
fba0: 43 65 6c 6c 20 2a 70 43 65 6c 6c 2c 20 20 20 20  Cell *pCell,    
fbb0: 20 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c 20          /* Cell 
fbc0: 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 72  to insert into r
fbd0: 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 48  tree */.  int iH
fbe0: 65 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20  eight,          
fbf0: 20 20 20 20 20 20 20 2f 2a 20 48 65 69 67 68 74         /* Height
fc00: 20 6f 66 20 73 75 62 2d 74 72 65 65 20 72 6f 6f   of sub-tree roo
fc10: 74 65 64 20 61 74 20 70 43 65 6c 6c 20 2a 2f 0a  ted at pCell */.
fc20: 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 2a 70 70    RtreeNode **pp
fc30: 4c 65 61 66 20 20 20 20 20 20 20 20 20 20 20 2f  Leaf           /
fc40: 2a 20 4f 55 54 3a 20 53 65 6c 65 63 74 65 64 20  * OUT: Selected 
fc50: 6c 65 61 66 20 70 61 67 65 20 2a 2f 0a 29 7b 0a  leaf page */.){.
fc60: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
fc70: 69 69 3b 0a 20 20 52 74 72 65 65 4e 6f 64 65 20  ii;.  RtreeNode 
fc80: 2a 70 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 72 63  *pNode = 0;.  rc
fc90: 20 3d 20 6e 6f 64 65 41 63 71 75 69 72 65 28 70   = nodeAcquire(p
fca0: 52 74 72 65 65 2c 20 31 2c 20 30 2c 20 26 70 4e  Rtree, 1, 0, &pN
fcb0: 6f 64 65 29 3b 0a 0a 20 20 66 6f 72 28 69 69 3d  ode);..  for(ii=
fcc0: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
fcd0: 20 26 26 20 69 69 3c 28 70 52 74 72 65 65 2d 3e   && ii<(pRtree->
fce0: 69 44 65 70 74 68 2d 69 48 65 69 67 68 74 29 3b  iDepth-iHeight);
fcf0: 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20   ii++){.    int 
fd00: 69 43 65 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74  iCell;.    sqlit
fd10: 65 33 5f 69 6e 74 36 34 20 69 42 65 73 74 20 3d  e3_int64 iBest =
fd20: 20 30 3b 0a 0a 20 20 20 20 52 74 72 65 65 44 56   0;..    RtreeDV
fd30: 61 6c 75 65 20 66 4d 69 6e 47 72 6f 77 74 68 20  alue fMinGrowth 
fd40: 3d 20 52 54 52 45 45 5f 5a 45 52 4f 3b 0a 20 20  = RTREE_ZERO;.  
fd50: 20 20 52 74 72 65 65 44 56 61 6c 75 65 20 66 4d    RtreeDValue fM
fd60: 69 6e 41 72 65 61 20 3d 20 52 54 52 45 45 5f 5a  inArea = RTREE_Z
fd70: 45 52 4f 3b 0a 0a 20 20 20 20 69 6e 74 20 6e 43  ERO;..    int nC
fd80: 65 6c 6c 20 3d 20 4e 43 45 4c 4c 28 70 4e 6f 64  ell = NCELL(pNod
fd90: 65 29 3b 0a 20 20 20 20 52 74 72 65 65 43 65 6c  e);.    RtreeCel
fda0: 6c 20 63 65 6c 6c 3b 0a 20 20 20 20 52 74 72 65  l cell;.    Rtre
fdb0: 65 4e 6f 64 65 20 2a 70 43 68 69 6c 64 3b 0a 0a  eNode *pChild;..
fdc0: 20 20 20 20 52 74 72 65 65 43 65 6c 6c 20 2a 61      RtreeCell *a
fdd0: 43 65 6c 6c 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  Cell = 0;..    /
fde0: 2a 20 53 65 6c 65 63 74 20 74 68 65 20 63 68 69  * Select the chi
fdf0: 6c 64 20 6e 6f 64 65 20 77 68 69 63 68 20 77 69  ld node which wi
fe00: 6c 6c 20 62 65 20 65 6e 6c 61 72 67 65 64 20 74  ll be enlarged t
fe10: 68 65 20 6c 65 61 73 74 20 69 66 20 70 43 65 6c  he least if pCel
fe20: 6c 0a 20 20 20 20 2a 2a 20 69 73 20 69 6e 73 65  l.    ** is inse
fe30: 72 74 65 64 20 69 6e 74 6f 20 69 74 2e 20 52 65  rted into it. Re
fe40: 73 6f 6c 76 65 20 74 69 65 73 20 62 79 20 63 68  solve ties by ch
fe50: 6f 6f 73 69 6e 67 20 74 68 65 20 65 6e 74 72 79  oosing the entry
fe60: 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 74 68 65   with.    ** the
fe70: 20 73 6d 61 6c 6c 65 73 74 20 61 72 65 61 2e 0a   smallest area..
fe80: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
fe90: 43 65 6c 6c 3d 30 3b 20 69 43 65 6c 6c 3c 6e 43  Cell=0; iCell<nC
fea0: 65 6c 6c 3b 20 69 43 65 6c 6c 2b 2b 29 7b 0a 20  ell; iCell++){. 
feb0: 20 20 20 20 20 69 6e 74 20 62 42 65 73 74 20 3d       int bBest =
fec0: 20 30 3b 0a 20 20 20 20 20 20 52 74 72 65 65 44   0;.      RtreeD
fed0: 56 61 6c 75 65 20 67 72 6f 77 74 68 3b 0a 20 20  Value growth;.  
fee0: 20 20 20 20 52 74 72 65 65 44 56 61 6c 75 65 20      RtreeDValue 
fef0: 61 72 65 61 3b 0a 20 20 20 20 20 20 6e 6f 64 65  area;.      node
ff00: 47 65 74 43 65 6c 6c 28 70 52 74 72 65 65 2c 20  GetCell(pRtree, 
ff10: 70 4e 6f 64 65 2c 20 69 43 65 6c 6c 2c 20 26 63  pNode, iCell, &c
ff20: 65 6c 6c 29 3b 0a 20 20 20 20 20 20 67 72 6f 77  ell);.      grow
ff30: 74 68 20 3d 20 63 65 6c 6c 47 72 6f 77 74 68 28  th = cellGrowth(
ff40: 70 52 74 72 65 65 2c 20 26 63 65 6c 6c 2c 20 70  pRtree, &cell, p
ff50: 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 61 72 65  Cell);.      are
ff60: 61 20 3d 20 63 65 6c 6c 41 72 65 61 28 70 52 74  a = cellArea(pRt
ff70: 72 65 65 2c 20 26 63 65 6c 6c 29 3b 0a 20 20 20  ree, &cell);.   
ff80: 20 20 20 69 66 28 20 69 43 65 6c 6c 3d 3d 30 7c     if( iCell==0|
ff90: 7c 67 72 6f 77 74 68 3c 66 4d 69 6e 47 72 6f 77  |growth<fMinGrow
ffa0: 74 68 7c 7c 28 67 72 6f 77 74 68 3d 3d 66 4d 69  th||(growth==fMi
ffb0: 6e 47 72 6f 77 74 68 20 26 26 20 61 72 65 61 3c  nGrowth && area<
ffc0: 66 4d 69 6e 41 72 65 61 29 20 29 7b 0a 20 20 20  fMinArea) ){.   
ffd0: 20 20 20 20 20 62 42 65 73 74 20 3d 20 31 3b 0a       bBest = 1;.
ffe0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
fff0: 28 20 62 42 65 73 74 20 29 7b 0a 20 20 20 20 20  ( bBest ){.     
10000 20 20 20 66 4d 69 6e 47 72 6f 77 74 68 20 3d 20     fMinGrowth = 
10010 67 72 6f 77 74 68 3b 0a 20 20 20 20 20 20 20 20  growth;.        
10020 66 4d 69 6e 41 72 65 61 20 3d 20 61 72 65 61 3b  fMinArea = area;
10030 0a 20 20 20 20 20 20 20 20 69 42 65 73 74 20 3d  .        iBest =
10040 20 63 65 6c 6c 2e 69 52 6f 77 69 64 3b 0a 20 20   cell.iRowid;.  
10050 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
10060 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 43   sqlite3_free(aC
10070 65 6c 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20 6e  ell);.    rc = n
10080 6f 64 65 41 63 71 75 69 72 65 28 70 52 74 72 65  odeAcquire(pRtre
10090 65 2c 20 69 42 65 73 74 2c 20 70 4e 6f 64 65 2c  e, iBest, pNode,
100a0 20 26 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 6e   &pChild);.    n
100b0 6f 64 65 52 65 6c 65 61 73 65 28 70 52 74 72 65  odeRelease(pRtre
100c0 65 2c 20 70 4e 6f 64 65 29 3b 0a 20 20 20 20 70  e, pNode);.    p
100d0 4e 6f 64 65 20 3d 20 70 43 68 69 6c 64 3b 0a 20  Node = pChild;. 
100e0 20 7d 0a 0a 20 20 2a 70 70 4c 65 61 66 20 3d 20   }..  *ppLeaf = 
100f0 70 4e 6f 64 65 3b 0a 20 20 72 65 74 75 72 6e 20  pNode;.  return 
10100 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63  rc;.}../*.** A c
10110 65 6c 6c 20 77 69 74 68 20 74 68 65 20 73 61 6d  ell with the sam
10120 65 20 63 6f 6e 74 65 6e 74 20 61 73 20 70 43 65  e content as pCe
10130 6c 6c 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ll has just been
10140 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 0a 2a   inserted into.*
10150 2a 20 74 68 65 20 6e 6f 64 65 20 70 4e 6f 64 65  * the node pNode
10160 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
10170 75 70 64 61 74 65 73 20 74 68 65 20 62 6f 75 6e  updates the boun
10180 64 69 6e 67 20 62 6f 78 20 63 65 6c 6c 73 20 69  ding box cells i
10190 6e 0a 2a 2a 20 61 6c 6c 20 61 6e 63 65 73 74 6f  n.** all ancesto
101a0 72 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73  r elements..*/.s
101b0 74 61 74 69 63 20 69 6e 74 20 41 64 6a 75 73 74  tatic int Adjust
101c0 54 72 65 65 28 0a 20 20 52 74 72 65 65 20 2a 70  Tree(.  Rtree *p
101d0 52 74 72 65 65 2c 20 20 20 20 20 20 20 20 20 20  Rtree,          
101e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 74 72            /* Rtr
101f0 65 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 52 74  ee table */.  Rt
10200 72 65 65 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 20  reeNode *pNode, 
10210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10220 2f 2a 20 41 64 6a 75 73 74 20 61 6e 63 65 73 74  /* Adjust ancest
10230 72 79 20 6f 66 20 74 68 69 73 20 6e 6f 64 65 2e  ry of this node.
10240 20 2a 2f 0a 20 20 52 74 72 65 65 43 65 6c 6c 20   */.  RtreeCell 
10250 2a 70 43 65 6c 6c 20 20 20 20 20 20 20 20 20 20  *pCell          
10260 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
10270 63 65 6c 6c 20 77 61 73 20 6a 75 73 74 20 69 6e  cell was just in
10280 73 65 72 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 52  serted */.){.  R
10290 74 72 65 65 4e 6f 64 65 20 2a 70 20 3d 20 70 4e  treeNode *p = pN
102a0 6f 64 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d  ode;.  while( p-
102b0 3e 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20  >pParent ){.    
102c0 52 74 72 65 65 4e 6f 64 65 20 2a 70 50 61 72 65  RtreeNode *pPare
102d0 6e 74 20 3d 20 70 2d 3e 70 50 61 72 65 6e 74 3b  nt = p->pParent;
102e0 0a 20 20 20 20 52 74 72 65 65 43 65 6c 6c 20 63  .    RtreeCell c
102f0 65 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 69 43 65  ell;.    int iCe
10300 6c 6c 3b 0a 0a 20 20 20 20 69 66 28 20 6e 6f 64  ll;..    if( nod
10310 65 50 61 72 65 6e 74 49 6e 64 65 78 28 70 52 74  eParentIndex(pRt
10320 72 65 65 2c 20 70 2c 20 26 69 43 65 6c 6c 29 20  ree, p, &iCell) 
10330 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
10340 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56  SQLITE_CORRUPT_V
10350 54 41 42 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  TAB;.    }..    
10360 6e 6f 64 65 47 65 74 43 65 6c 6c 28 70 52 74 72  nodeGetCell(pRtr
10370 65 65 2c 20 70 50 61 72 65 6e 74 2c 20 69 43 65  ee, pParent, iCe
10380 6c 6c 2c 20 26 63 65 6c 6c 29 3b 0a 20 20 20 20  ll, &cell);.    
10390 69 66 28 20 21 63 65 6c 6c 43 6f 6e 74 61 69 6e  if( !cellContain
103a0 73 28 70 52 74 72 65 65 2c 20 26 63 65 6c 6c 2c  s(pRtree, &cell,
103b0 20 70 43 65 6c 6c 29 20 29 7b 0a 20 20 20 20 20   pCell) ){.     
103c0 20 63 65 6c 6c 55 6e 69 6f 6e 28 70 52 74 72 65   cellUnion(pRtre
103d0 65 2c 20 26 63 65 6c 6c 2c 20 70 43 65 6c 6c 29  e, &cell, pCell)
103e0 3b 0a 20 20 20 20 20 20 6e 6f 64 65 4f 76 65 72  ;.      nodeOver
103f0 77 72 69 74 65 43 65 6c 6c 28 70 52 74 72 65 65  writeCell(pRtree
10400 2c 20 70 50 61 72 65 6e 74 2c 20 26 63 65 6c 6c  , pParent, &cell
10410 2c 20 69 43 65 6c 6c 29 3b 0a 20 20 20 20 7d 0a  , iCell);.    }.
10420 20 0a 20 20 20 20 70 20 3d 20 70 50 61 72 65 6e   .    p = pParen
10430 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
10440 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
10450 0a 2a 2a 20 57 72 69 74 65 20 6d 61 70 70 69 6e  .** Write mappin
10460 67 20 28 69 52 6f 77 69 64 2d 3e 69 4e 6f 64 65  g (iRowid->iNode
10470 29 20 74 6f 20 74 68 65 20 3c 72 74 72 65 65 3e  ) to the <rtree>
10480 5f 72 6f 77 69 64 20 74 61 62 6c 65 2e 0a 2a 2f  _rowid table..*/
10490 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f 77 69  .static int rowi
104a0 64 57 72 69 74 65 28 52 74 72 65 65 20 2a 70 52  dWrite(Rtree *pR
104b0 74 72 65 65 2c 20 73 71 6c 69 74 65 33 5f 69 6e  tree, sqlite3_in
104c0 74 36 34 20 69 52 6f 77 69 64 2c 20 73 71 6c 69  t64 iRowid, sqli
104d0 74 65 33 5f 69 6e 74 36 34 20 69 4e 6f 64 65 29  te3_int64 iNode)
104e0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  {.  sqlite3_bind
104f0 5f 69 6e 74 36 34 28 70 52 74 72 65 65 2d 3e 70  _int64(pRtree->p
10500 57 72 69 74 65 52 6f 77 69 64 2c 20 31 2c 20 69  WriteRowid, 1, i
10510 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69 74 65  Rowid);.  sqlite
10520 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 52 74  3_bind_int64(pRt
10530 72 65 65 2d 3e 70 57 72 69 74 65 52 6f 77 69 64  ree->pWriteRowid
10540 2c 20 32 2c 20 69 4e 6f 64 65 29 3b 0a 20 20 73  , 2, iNode);.  s
10550 71 6c 69 74 65 33 5f 73 74 65 70 28 70 52 74 72  qlite3_step(pRtr
10560 65 65 2d 3e 70 57 72 69 74 65 52 6f 77 69 64 29  ee->pWriteRowid)
10570 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
10580 65 33 5f 72 65 73 65 74 28 70 52 74 72 65 65 2d  e3_reset(pRtree-
10590 3e 70 57 72 69 74 65 52 6f 77 69 64 29 3b 0a 7d  >pWriteRowid);.}
105a0 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6d 61  ../*.** Write ma
105b0 70 70 69 6e 67 20 28 69 4e 6f 64 65 2d 3e 69 50  pping (iNode->iP
105c0 61 72 29 20 74 6f 20 74 68 65 20 3c 72 74 72 65  ar) to the <rtre
105d0 65 3e 5f 70 61 72 65 6e 74 20 74 61 62 6c 65 2e  e>_parent table.
105e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
105f0 61 72 65 6e 74 57 72 69 74 65 28 52 74 72 65 65  arentWrite(Rtree
10600 20 2a 70 52 74 72 65 65 2c 20 73 71 6c 69 74 65   *pRtree, sqlite
10610 33 5f 69 6e 74 36 34 20 69 4e 6f 64 65 2c 20 73  3_int64 iNode, s
10620 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 50 61  qlite3_int64 iPa
10630 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69  r){.  sqlite3_bi
10640 6e 64 5f 69 6e 74 36 34 28 70 52 74 72 65 65 2d  nd_int64(pRtree-
10650 3e 70 57 72 69 74 65 50 61 72 65 6e 74 2c 20 31  >pWriteParent, 1
10660 2c 20 69 4e 6f 64 65 29 3b 0a 20 20 73 71 6c 69  , iNode);.  sqli
10670 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
10680 52 74 72 65 65 2d 3e 70 57 72 69 74 65 50 61 72  Rtree->pWritePar
10690 65 6e 74 2c 20 32 2c 20 69 50 61 72 29 3b 0a 20  ent, 2, iPar);. 
106a0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 52   sqlite3_step(pR
106b0 74 72 65 65 2d 3e 70 57 72 69 74 65 50 61 72 65  tree->pWritePare
106c0 6e 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  nt);.  return sq
106d0 6c 69 74 65 33 5f 72 65 73 65 74 28 70 52 74 72  lite3_reset(pRtr
106e0 65 65 2d 3e 70 57 72 69 74 65 50 61 72 65 6e 74  ee->pWriteParent
106f0 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  );.}..static int
10700 20 72 74 72 65 65 49 6e 73 65 72 74 43 65 6c 6c   rtreeInsertCell
10710 28 52 74 72 65 65 20 2a 2c 20 52 74 72 65 65 4e  (Rtree *, RtreeN
10720 6f 64 65 20 2a 2c 20 52 74 72 65 65 43 65 6c 6c  ode *, RtreeCell
10730 20 2a 2c 20 69 6e 74 29 3b 0a 0a 0a 2f 2a 0a 2a   *, int);.../*.*
10740 2a 20 41 72 67 75 6d 65 6e 74 73 20 61 49 64 78  * Arguments aIdx
10750 2c 20 61 44 69 73 74 61 6e 63 65 20 61 6e 64 20  , aDistance and 
10760 61 53 70 61 72 65 20 61 6c 6c 20 70 6f 69 6e 74  aSpare all point
10770 20 74 6f 20 61 72 72 61 79 73 20 6f 66 20 73 69   to arrays of si
10780 7a 65 0a 2a 2a 20 6e 49 64 78 2e 20 54 68 65 20  ze.** nIdx. The 
10790 61 49 64 78 20 61 72 72 61 79 20 63 6f 6e 74 61  aIdx array conta
107a0 69 6e 73 20 74 68 65 20 73 65 74 20 6f 66 20 69  ins the set of i
107b0 6e 74 65 67 65 72 73 20 66 72 6f 6d 20 30 20 74  ntegers from 0 t
107c0 6f 20 0a 2a 2a 20 28 6e 49 64 78 2d 31 29 20 69  o .** (nIdx-1) i
107d0 6e 20 6e 6f 20 70 61 72 74 69 63 75 6c 61 72 20  n no particular 
107e0 6f 72 64 65 72 2e 20 54 68 69 73 20 66 75 6e 63  order. This func
107f0 74 69 6f 6e 20 73 6f 72 74 73 20 74 68 65 20 76  tion sorts the v
10800 61 6c 75 65 73 0a 2a 2a 20 69 6e 20 61 49 64 78  alues.** in aIdx
10810 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
10820 65 20 69 6e 64 65 78 65 64 20 76 61 6c 75 65 73  e indexed values
10830 20 69 6e 20 61 44 69 73 74 61 6e 63 65 2e 20 46   in aDistance. F
10840 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 61  or.** example, a
10850 73 73 75 6d 69 6e 67 20 74 68 65 20 69 6e 70 75  ssuming the inpu
10860 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 49 64 78  ts:.**.**   aIdx
10870 20 20 20 20 20 20 3d 20 7b 20 30 2c 20 20 20 31        = { 0,   1
10880 2c 20 20 20 32 2c 20 20 20 33 20 7d 0a 2a 2a 20  ,   2,   3 }.** 
10890 20 20 61 44 69 73 74 61 6e 63 65 20 3d 20 7b 20    aDistance = { 
108a0 35 2e 30 2c 20 32 2e 30 2c 20 37 2e 30 2c 20 36  5.0, 2.0, 7.0, 6
108b0 2e 30 20 7d 0a 2a 2a 0a 2a 2a 20 74 68 69 73 20  .0 }.**.** this 
108c0 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 74 68  function sets th
108d0 65 20 61 49 64 78 20 61 72 72 61 79 20 74 6f 20  e aIdx array to 
108e0 63 6f 6e 74 61 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20  contain:.**.**  
108f0 20 61 49 64 78 20 20 20 20 20 20 3d 20 7b 20 30   aIdx      = { 0
10900 2c 20 20 20 31 2c 20 20 20 32 2c 20 20 20 33 20  ,   1,   2,   3 
10910 7d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 53 70 61  }.**.** The aSpa
10920 72 65 20 61 72 72 61 79 20 69 73 20 75 73 65 64  re array is used
10930 20 61 73 20 74 65 6d 70 6f 72 61 72 79 20 77 6f   as temporary wo
10940 72 6b 69 6e 67 20 73 70 61 63 65 20 62 79 20 74  rking space by t
10950 68 65 0a 2a 2a 20 73 6f 72 74 69 6e 67 20 61 6c  he.** sorting al
10960 67 6f 72 69 74 68 6d 2e 0a 2a 2f 0a 73 74 61 74  gorithm..*/.stat
10970 69 63 20 76 6f 69 64 20 53 6f 72 74 42 79 44 69  ic void SortByDi
10980 73 74 61 6e 63 65 28 0a 20 20 69 6e 74 20 2a 61  stance(.  int *a
10990 49 64 78 2c 20 0a 20 20 69 6e 74 20 6e 49 64 78  Idx, .  int nIdx
109a0 2c 20 0a 20 20 52 74 72 65 65 44 56 61 6c 75 65  , .  RtreeDValue
109b0 20 2a 61 44 69 73 74 61 6e 63 65 2c 20 0a 20 20   *aDistance, .  
109c0 69 6e 74 20 2a 61 53 70 61 72 65 0a 29 7b 0a 20  int *aSpare.){. 
109d0 20 69 66 28 20 6e 49 64 78 3e 31 20 29 7b 0a 20   if( nIdx>1 ){. 
109e0 20 20 20 69 6e 74 20 69 4c 65 66 74 20 3d 20 30     int iLeft = 0
109f0 3b 0a 20 20 20 20 69 6e 74 20 69 52 69 67 68 74  ;.    int iRight
10a00 20 3d 20 30 3b 0a 0a 20 20 20 20 69 6e 74 20 6e   = 0;..    int n
10a10 4c 65 66 74 20 3d 20 6e 49 64 78 2f 32 3b 0a 20  Left = nIdx/2;. 
10a20 20 20 20 69 6e 74 20 6e 52 69 67 68 74 20 3d 20     int nRight = 
10a30 6e 49 64 78 2d 6e 4c 65 66 74 3b 0a 20 20 20 20  nIdx-nLeft;.    
10a40 69 6e 74 20 2a 61 4c 65 66 74 20 3d 20 61 49 64  int *aLeft = aId
10a50 78 3b 0a 20 20 20 20 69 6e 74 20 2a 61 52 69 67  x;.    int *aRig
10a60 68 74 20 3d 20 26 61 49 64 78 5b 6e 4c 65 66 74  ht = &aIdx[nLeft
10a70 5d 3b 0a 0a 20 20 20 20 53 6f 72 74 42 79 44 69  ];..    SortByDi
10a80 73 74 61 6e 63 65 28 61 4c 65 66 74 2c 20 6e 4c  stance(aLeft, nL
10a90 65 66 74 2c 20 61 44 69 73 74 61 6e 63 65 2c 20  eft, aDistance, 
10aa0 61 53 70 61 72 65 29 3b 0a 20 20 20 20 53 6f 72  aSpare);.    Sor
10ab0 74 42 79 44 69 73 74 61 6e 63 65 28 61 52 69 67  tByDistance(aRig
10ac0 68 74 2c 20 6e 52 69 67 68 74 2c 20 61 44 69 73  ht, nRight, aDis
10ad0 74 61 6e 63 65 2c 20 61 53 70 61 72 65 29 3b 0a  tance, aSpare);.
10ae0 0a 20 20 20 20 6d 65 6d 63 70 79 28 61 53 70 61  .    memcpy(aSpa
10af0 72 65 2c 20 61 4c 65 66 74 2c 20 73 69 7a 65 6f  re, aLeft, sizeo
10b00 66 28 69 6e 74 29 2a 6e 4c 65 66 74 29 3b 0a 20  f(int)*nLeft);. 
10b10 20 20 20 61 4c 65 66 74 20 3d 20 61 53 70 61 72     aLeft = aSpar
10b20 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 69  e;..    while( i
10b30 4c 65 66 74 3c 6e 4c 65 66 74 20 7c 7c 20 69 52  Left<nLeft || iR
10b40 69 67 68 74 3c 6e 52 69 67 68 74 20 29 7b 0a 20  ight<nRight ){. 
10b50 20 20 20 20 20 69 66 28 20 69 4c 65 66 74 3d 3d       if( iLeft==
10b60 6e 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20  nLeft ){.       
10b70 20 61 49 64 78 5b 69 4c 65 66 74 2b 69 52 69 67   aIdx[iLeft+iRig
10b80 68 74 5d 20 3d 20 61 52 69 67 68 74 5b 69 52 69  ht] = aRight[iRi
10b90 67 68 74 5d 3b 0a 20 20 20 20 20 20 20 20 69 52  ght];.        iR
10ba0 69 67 68 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65  ight++;.      }e
10bb0 6c 73 65 20 69 66 28 20 69 52 69 67 68 74 3d 3d  lse if( iRight==
10bc0 6e 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  nRight ){.      
10bd0 20 20 61 49 64 78 5b 69 4c 65 66 74 2b 69 52 69    aIdx[iLeft+iRi
10be0 67 68 74 5d 20 3d 20 61 4c 65 66 74 5b 69 4c 65  ght] = aLeft[iLe
10bf0 66 74 5d 3b 0a 20 20 20 20 20 20 20 20 69 4c 65  ft];.        iLe
10c00 66 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ft++;.      }els
10c10 65 7b 0a 20 20 20 20 20 20 20 20 52 74 72 65 65  e{.        Rtree
10c20 44 56 61 6c 75 65 20 66 4c 65 66 74 20 3d 20 61  DValue fLeft = a
10c30 44 69 73 74 61 6e 63 65 5b 61 4c 65 66 74 5b 69  Distance[aLeft[i
10c40 4c 65 66 74 5d 5d 3b 0a 20 20 20 20 20 20 20 20  Left]];.        
10c50 52 74 72 65 65 44 56 61 6c 75 65 20 66 52 69 67  RtreeDValue fRig
10c60 68 74 20 3d 20 61 44 69 73 74 61 6e 63 65 5b 61  ht = aDistance[a
10c70 52 69 67 68 74 5b 69 52 69 67 68 74 5d 5d 3b 0a  Right[iRight]];.
10c80 20 20 20 20 20 20 20 20 69 66 28 20 66 4c 65 66          if( fLef
10c90 74 3c 66 52 69 67 68 74 20 29 7b 0a 20 20 20 20  t<fRight ){.    
10ca0 20 20 20 20 20 20 61 49 64 78 5b 69 4c 65 66 74        aIdx[iLeft
10cb0 2b 69 52 69 67 68 74 5d 20 3d 20 61 4c 65 66 74  +iRight] = aLeft
10cc0 5b 69 4c 65 66 74 5d 3b 0a 20 20 20 20 20 20 20  [iLeft];.       
10cd0 20 20 20 69 4c 65 66 74 2b 2b 3b 0a 20 20 20 20     iLeft++;.    
10ce0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10cf0 20 20 20 20 20 61 49 64 78 5b 69 4c 65 66 74 2b       aIdx[iLeft+
10d00 69 52 69 67 68 74 5d 20 3d 20 61 52 69 67 68 74  iRight] = aRight
10d10 5b 69 52 69 67 68 74 5d 3b 0a 20 20 20 20 20 20  [iRight];.      
10d20 20 20 20 20 69 52 69 67 68 74 2b 2b 3b 0a 20 20      iRight++;.  
10d30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
10d40 20 20 20 20 7d 0a 0a 23 69 66 20 30 0a 20 20 20      }..#if 0.   
10d50 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
10d60 68 65 20 73 6f 72 74 20 77 6f 72 6b 65 64 20 2a  he sort worked *
10d70 2f 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e  /.    {.      in
10d80 74 20 6a 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28  t jj;.      for(
10d90 6a 6a 3d 31 3b 20 6a 6a 3c 6e 49 64 78 3b 20 6a  jj=1; jj<nIdx; j
10da0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 52 74  j++){.        Rt
10db0 72 65 65 44 56 61 6c 75 65 20 6c 65 66 74 20 3d  reeDValue left =
10dc0 20 61 44 69 73 74 61 6e 63 65 5b 61 49 64 78 5b   aDistance[aIdx[
10dd0 6a 6a 2d 31 5d 5d 3b 0a 20 20 20 20 20 20 20 20  jj-1]];.        
10de0 52 74 72 65 65 44 56 61 6c 75 65 20 72 69 67 68  RtreeDValue righ
10df0 74 20 3d 20 61 44 69 73 74 61 6e 63 65 5b 61 49  t = aDistance[aI
10e00 64 78 5b 6a 6a 5d 5d 3b 0a 20 20 20 20 20 20 20  dx[jj]];.       
10e10 20 61 73 73 65 72 74 28 20 6c 65 66 74 3c 3d 72   assert( left<=r
10e20 69 67 68 74 20 29 3b 0a 20 20 20 20 20 20 7d 0a  ight );.      }.
10e30 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
10e40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  .}../*.** Argume
10e50 6e 74 73 20 61 49 64 78 2c 20 61 43 65 6c 6c 20  nts aIdx, aCell 
10e60 61 6e 64 20 61 53 70 61 72 65 20 61 6c 6c 20 70  and aSpare all p
10e70 6f 69 6e 74 20 74 6f 20 61 72 72 61 79 73 20 6f  oint to arrays o
10e80 66 20 73 69 7a 65 0a 2a 2a 20 6e 49 64 78 2e 20  f size.** nIdx. 
10e90 54 68 65 20 61 49 64 78 20 61 72 72 61 79 20 63  The aIdx array c
10ea0 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 65 74 20  ontains the set 
10eb0 6f 66 20 69 6e 74 65 67 65 72 73 20 66 72 6f 6d  of integers from
10ec0 20 30 20 74 6f 20 0a 2a 2a 20 28 6e 49 64 78 2d   0 to .** (nIdx-
10ed0 31 29 20 69 6e 20 6e 6f 20 70 61 72 74 69 63 75  1) in no particu
10ee0 6c 61 72 20 6f 72 64 65 72 2e 20 54 68 69 73 20  lar order. This 
10ef0 66 75 6e 63 74 69 6f 6e 20 73 6f 72 74 73 20 74  function sorts t
10f00 68 65 20 76 61 6c 75 65 73 0a 2a 2a 20 69 6e 20  he values.** in 
10f10 61 49 64 78 20 61 63 63 6f 72 64 69 6e 67 20 74  aIdx according t
10f20 6f 20 64 69 6d 65 6e 73 69 6f 6e 20 69 44 69 6d  o dimension iDim
10f30 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 69 6e   of the cells in
10f40 20 61 43 65 6c 6c 2e 20 54 68 65 0a 2a 2a 20 6d   aCell. The.** m
10f50 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20  inimum value of 
10f60 64 69 6d 65 6e 73 69 6f 6e 20 69 44 69 6d 20 69  dimension iDim i
10f70 73 20 63 6f 6e 73 69 64 65 72 65 64 20 66 69 72  s considered fir
10f80 73 74 2c 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d  st, the.** maxim
10f90 75 6d 20 75 73 65 64 20 74 6f 20 62 72 65 61 6b  um used to break
10fa0 20 74 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   ties..**.** The
10fb0 20 61 53 70 61 72 65 20 61 72 72 61 79 20 69 73   aSpare array is
10fc0 20 75 73 65 64 20 61 73 20 74 65 6d 70 6f 72 61   used as tempora
10fd0 72 79 20 77 6f 72 6b 69 6e 67 20 73 70 61 63 65  ry working space
10fe0 20 62 79 20 74 68 65 0a 2a 2a 20 73 6f 72 74 69   by the.** sorti
10ff0 6e 67 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 2a 2f  ng algorithm..*/
11000 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53 6f 72  .static void Sor
11010 74 42 79 44 69 6d 65 6e 73 69 6f 6e 28 0a 20 20  tByDimension(.  
11020 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c 0a 20  Rtree *pRtree,. 
11030 20 69 6e 74 20 2a 61 49 64 78 2c 20 0a 20 20 69   int *aIdx, .  i
11040 6e 74 20 6e 49 64 78 2c 20 0a 20 20 69 6e 74 20  nt nIdx, .  int 
11050 69 44 69 6d 2c 20 0a 20 20 52 74 72 65 65 43 65  iDim, .  RtreeCe
11060 6c 6c 20 2a 61 43 65 6c 6c 2c 20 0a 20 20 69 6e  ll *aCell, .  in
11070 74 20 2a 61 53 70 61 72 65 0a 29 7b 0a 20 20 69  t *aSpare.){.  i
11080 66 28 20 6e 49 64 78 3e 31 20 29 7b 0a 0a 20 20  f( nIdx>1 ){..  
11090 20 20 69 6e 74 20 69 4c 65 66 74 20 3d 20 30 3b    int iLeft = 0;
110a0 0a 20 20 20 20 69 6e 74 20 69 52 69 67 68 74 20  .    int iRight 
110b0 3d 20 30 3b 0a 0a 20 20 20 20 69 6e 74 20 6e 4c  = 0;..    int nL
110c0 65 66 74 20 3d 20 6e 49 64 78 2f 32 3b 0a 20 20  eft = nIdx/2;.  
110d0 20 20 69 6e 74 20 6e 52 69 67 68 74 20 3d 20 6e    int nRight = n
110e0 49 64 78 2d 6e 4c 65 66 74 3b 0a 20 20 20 20 69  Idx-nLeft;.    i
110f0 6e 74 20 2a 61 4c 65 66 74 20 3d 20 61 49 64 78  nt *aLeft = aIdx
11100 3b 0a 20 20 20 20 69 6e 74 20 2a 61 52 69 67 68  ;.    int *aRigh
11110 74 20 3d 20 26 61 49 64 78 5b 6e 4c 65 66 74 5d  t = &aIdx[nLeft]
11120 3b 0a 0a 20 20 20 20 53 6f 72 74 42 79 44 69 6d  ;..    SortByDim
11130 65 6e 73 69 6f 6e 28 70 52 74 72 65 65 2c 20 61  ension(pRtree, a
11140 4c 65 66 74 2c 20 6e 4c 65 66 74 2c 20 69 44 69  Left, nLeft, iDi
11150 6d 2c 20 61 43 65 6c 6c 2c 20 61 53 70 61 72 65  m, aCell, aSpare
11160 29 3b 0a 20 20 20 20 53 6f 72 74 42 79 44 69 6d  );.    SortByDim
11170 65 6e 73 69 6f 6e 28 70 52 74 72 65 65 2c 20 61  ension(pRtree, a
11180 52 69 67 68 74 2c 20 6e 52 69 67 68 74 2c 20 69  Right, nRight, i
11190 44 69 6d 2c 20 61 43 65 6c 6c 2c 20 61 53 70 61  Dim, aCell, aSpa
111a0 72 65 29 3b 0a 0a 20 20 20 20 6d 65 6d 63 70 79  re);..    memcpy
111b0 28 61 53 70 61 72 65 2c 20 61 4c 65 66 74 2c 20  (aSpare, aLeft, 
111c0 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 4c 65 66  sizeof(int)*nLef
111d0 74 29 3b 0a 20 20 20 20 61 4c 65 66 74 20 3d 20  t);.    aLeft = 
111e0 61 53 70 61 72 65 3b 0a 20 20 20 20 77 68 69 6c  aSpare;.    whil
111f0 65 28 20 69 4c 65 66 74 3c 6e 4c 65 66 74 20 7c  e( iLeft<nLeft |
11200 7c 20 69 52 69 67 68 74 3c 6e 52 69 67 68 74 20  | iRight<nRight 
11210 29 7b 0a 20 20 20 20 20 20 52 74 72 65 65 44 56  ){.      RtreeDV
11220 61 6c 75 65 20 78 6c 65 66 74 31 20 3d 20 44 43  alue xleft1 = DC
11230 4f 4f 52 44 28 61 43 65 6c 6c 5b 61 4c 65 66 74  OORD(aCell[aLeft
11240 5b 69 4c 65 66 74 5d 5d 2e 61 43 6f 6f 72 64 5b  [iLeft]].aCoord[
11250 69 44 69 6d 2a 32 5d 29 3b 0a 20 20 20 20 20 20  iDim*2]);.      
11260 52 74 72 65 65 44 56 61 6c 75 65 20 78 6c 65 66  RtreeDValue xlef
11270 74 32 20 3d 20 44 43 4f 4f 52 44 28 61 43 65 6c  t2 = DCOORD(aCel
11280 6c 5b 61 4c 65 66 74 5b 69 4c 65 66 74 5d 5d 2e  l[aLeft[iLeft]].
11290 61 43 6f 6f 72 64 5b 69 44 69 6d 2a 32 2b 31 5d  aCoord[iDim*2+1]
112a0 29 3b 0a 20 20 20 20 20 20 52 74 72 65 65 44 56  );.      RtreeDV
112b0 61 6c 75 65 20 78 72 69 67 68 74 31 20 3d 20 44  alue xright1 = D
112c0 43 4f 4f 52 44 28 61 43 65 6c 6c 5b 61 52 69 67  COORD(aCell[aRig
112d0 68 74 5b 69 52 69 67 68 74 5d 5d 2e 61 43 6f 6f  ht[iRight]].aCoo
112e0 72 64 5b 69 44 69 6d 2a 32 5d 29 3b 0a 20 20 20  rd[iDim*2]);.   
112f0 20 20 20 52 74 72 65 65 44 56 61 6c 75 65 20 78     RtreeDValue x
11300 72 69 67 68 74 32 20 3d 20 44 43 4f 4f 52 44 28  right2 = DCOORD(
11310 61 43 65 6c 6c 5b 61 52 69 67 68 74 5b 69 52 69  aCell[aRight[iRi
11320 67 68 74 5d 5d 2e 61 43 6f 6f 72 64 5b 69 44 69  ght]].aCoord[iDi
11330 6d 2a 32 2b 31 5d 29 3b 0a 20 20 20 20 20 20 69  m*2+1]);.      i
11340 66 28 20 28 69 4c 65 66 74 21 3d 6e 4c 65 66 74  f( (iLeft!=nLeft
11350 29 20 26 26 20 28 28 69 52 69 67 68 74 3d 3d 6e  ) && ((iRight==n
11360 52 69 67 68 74 29 0a 20 20 20 20 20 20 20 7c 7c  Right).       ||
11370 20 28 78 6c 65 66 74 31 3c 78 72 69 67 68 74 31   (xleft1<xright1
11380 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 78 6c 65  ).       || (xle
11390 66 74 31 3d 3d 78 72 69 67 68 74 31 20 26 26 20  ft1==xright1 && 
113a0 78 6c 65 66 74 32 3c 78 72 69 67 68 74 32 29 0a  xleft2<xright2).
113b0 20 20 20 20 20 20 29 29 7b 0a 20 20 20 20 20 20        )){.      
113c0 20 20 61 49 64 78 5b 69 4c 65 66 74 2b 69 52 69    aIdx[iLeft+iRi
113d0 67 68 74 5d 20 3d 20 61 4c 65 66 74 5b 69 4c 65  ght] = aLeft[iLe
113e0 66 74 5d 3b 0a 20 20 20 20 20 20 20 20 69 4c 65  ft];.        iLe
113f0 66 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ft++;.      }els
11400 65 7b 0a 20 20 20 20 20 20 20 20 61 49 64 78 5b  e{.        aIdx[
11410 69 4c 65 66 74 2b 69 52 69 67 68 74 5d 20 3d 20  iLeft+iRight] = 
11420 61 52 69 67 68 74 5b 69 52 69 67 68 74 5d 3b 0a  aRight[iRight];.
11430 20 20 20 20 20 20 20 20 69 52 69 67 68 74 2b 2b          iRight++
11440 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11450 0a 23 69 66 20 30 0a 20 20 20 20 2f 2a 20 43 68  .#if 0.    /* Ch
11460 65 63 6b 20 74 68 61 74 20 74 68 65 20 73 6f 72  eck that the sor
11470 74 20 77 6f 72 6b 65 64 20 2a 2f 0a 20 20 20 20  t worked */.    
11480 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 6a 3b 0a  {.      int jj;.
11490 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 31 3b 20        for(jj=1; 
114a0 6a 6a 3c 6e 49 64 78 3b 20 6a 6a 2b 2b 29 7b 0a  jj<nIdx; jj++){.
114b0 20 20 20 20 20 20 20 20 52 74 72 65 65 44 56 61          RtreeDVa
114c0 6c 75 65 20 78 6c 65 66 74 31 20 3d 20 61 43 65  lue xleft1 = aCe
114d0 6c 6c 5b 61 49 64 78 5b 6a 6a 2d 31 5d 5d 2e 61  ll[aIdx[jj-1]].a
114e0 43 6f 6f 72 64 5b 69 44 69 6d 2a 32 5d 3b 0a 20  Coord[iDim*2];. 
114f0 20 20 20 20 20 20 20 52 74 72 65 65 44 56 61 6c         RtreeDVal
11500 75 65 20 78 6c 65 66 74 32 20 3d 20 61 43 65 6c  ue xleft2 = aCel
11510 6c 5b 61 49 64 78 5b 6a 6a 2d 31 5d 5d 2e 61 43  l[aIdx[jj-1]].aC
11520 6f 6f 72 64 5b 69 44 69 6d 2a 32 2b 31 5d 3b 0a  oord[iDim*2+1];.
11530 20 20 20 20 20 20 20 20 52 74 72 65 65 44 56 61          RtreeDVa
11540 6c 75 65 20 78 72 69 67 68 74 31 20 3d 20 61 43  lue xright1 = aC
11550 65 6c 6c 5b 61 49 64 78 5b 6a 6a 5d 5d 2e 61 43  ell[aIdx[jj]].aC
11560 6f 6f 72 64 5b 69 44 69 6d 2a 32 5d 3b 0a 20 20  oord[iDim*2];.  
11570 20 20 20 20 20 20 52 74 72 65 65 44 56 61 6c 75        RtreeDValu
11580 65 20 78 72 69 67 68 74 32 20 3d 20 61 43 65 6c  e xright2 = aCel
11590 6c 5b 61 49 64 78 5b 6a 6a 5d 5d 2e 61 43 6f 6f  l[aIdx[jj]].aCoo
115a0 72 64 5b 69 44 69 6d 2a 32 2b 31 5d 3b 0a 20 20  rd[iDim*2+1];.  
115b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 78 6c        assert( xl
115c0 65 66 74 31 3c 3d 78 72 69 67 68 74 31 20 26 26  eft1<=xright1 &&
115d0 20 28 78 6c 65 66 74 31 3c 78 72 69 67 68 74 31   (xleft1<xright1
115e0 20 7c 7c 20 78 6c 65 66 74 32 3c 3d 78 72 69 67   || xleft2<=xrig
115f0 68 74 32 29 20 29 3b 0a 20 20 20 20 20 20 7d 0a  ht2) );.      }.
11600 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
11610 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
11620 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
11630 52 2a 2d 74 72 65 65 20 76 61 72 69 61 6e 74 20  R*-tree variant 
11640 6f 66 20 53 70 6c 69 74 4e 6f 64 65 20 66 72 6f  of SplitNode fro
11650 6d 20 42 65 63 6b 6d 61 6e 5b 31 39 39 30 5d 2e  m Beckman[1990].
11660 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
11670 70 6c 69 74 4e 6f 64 65 53 74 61 72 74 72 65 65  plitNodeStartree
11680 28 0a 20 20 52 74 72 65 65 20 2a 70 52 74 72 65  (.  Rtree *pRtre
11690 65 2c 0a 20 20 52 74 72 65 65 43 65 6c 6c 20 2a  e,.  RtreeCell *
116a0 61 43 65 6c 6c 2c 0a 20 20 69 6e 74 20 6e 43 65  aCell,.  int nCe
116b0 6c 6c 2c 0a 20 20 52 74 72 65 65 4e 6f 64 65 20  ll,.  RtreeNode 
116c0 2a 70 4c 65 66 74 2c 0a 20 20 52 74 72 65 65 4e  *pLeft,.  RtreeN
116d0 6f 64 65 20 2a 70 52 69 67 68 74 2c 0a 20 20 52  ode *pRight,.  R
116e0 74 72 65 65 43 65 6c 6c 20 2a 70 42 62 6f 78 4c  treeCell *pBboxL
116f0 65 66 74 2c 0a 20 20 52 74 72 65 65 43 65 6c 6c  eft,.  RtreeCell
11700 20 2a 70 42 62 6f 78 52 69 67 68 74 0a 29 7b 0a   *pBboxRight.){.
11710 20 20 69 6e 74 20 2a 2a 61 61 53 6f 72 74 65 64    int **aaSorted
11720 3b 0a 20 20 69 6e 74 20 2a 61 53 70 61 72 65 3b  ;.  int *aSpare;
11730 0a 20 20 69 6e 74 20 69 69 3b 0a 0a 20 20 69 6e  .  int ii;..  in
11740 74 20 69 42 65 73 74 44 69 6d 20 3d 20 30 3b 0a  t iBestDim = 0;.
11750 20 20 69 6e 74 20 69 42 65 73 74 53 70 6c 69 74    int iBestSplit
11760 20 3d 20 30 3b 0a 20 20 52 74 72 65 65 44 56 61   = 0;.  RtreeDVa
11770 6c 75 65 20 66 42 65 73 74 4d 61 72 67 69 6e 20  lue fBestMargin 
11780 3d 20 52 54 52 45 45 5f 5a 45 52 4f 3b 0a 0a 20  = RTREE_ZERO;.. 
11790 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 70 52   int nByte = (pR
117a0 74 72 65 65 2d 3e 6e 44 69 6d 2b 31 29 2a 28 73  tree->nDim+1)*(s
117b0 69 7a 65 6f 66 28 69 6e 74 2a 29 2b 6e 43 65 6c  izeof(int*)+nCel
117c0 6c 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a  l*sizeof(int));.
117d0 0a 20 20 61 61 53 6f 72 74 65 64 20 3d 20 28 69  .  aaSorted = (i
117e0 6e 74 20 2a 2a 29 73 71 6c 69 74 65 33 5f 6d 61  nt **)sqlite3_ma
117f0 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20 69  lloc(nByte);.  i
11800 66 28 20 21 61 61 53 6f 72 74 65 64 20 29 7b 0a  f( !aaSorted ){.
11810 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
11820 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20  E_NOMEM;.  }..  
11830 61 53 70 61 72 65 20 3d 20 26 28 28 69 6e 74 20  aSpare = &((int 
11840 2a 29 26 61 61 53 6f 72 74 65 64 5b 70 52 74 72  *)&aaSorted[pRtr
11850 65 65 2d 3e 6e 44 69 6d 5d 29 5b 70 52 74 72 65  ee->nDim])[pRtre
11860 65 2d 3e 6e 44 69 6d 2a 6e 43 65 6c 6c 5d 3b 0a  e->nDim*nCell];.
11870 20 20 6d 65 6d 73 65 74 28 61 61 53 6f 72 74 65    memset(aaSorte
11880 64 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20  d, 0, nByte);.  
11890 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 52 74  for(ii=0; ii<pRt
118a0 72 65 65 2d 3e 6e 44 69 6d 3b 20 69 69 2b 2b 29  ree->nDim; ii++)
118b0 7b 0a 20 20 20 20 69 6e 74 20 6a 6a 3b 0a 20 20  {.    int jj;.  
118c0 20 20 61 61 53 6f 72 74 65 64 5b 69 69 5d 20 3d    aaSorted[ii] =
118d0 20 26 28 28 69 6e 74 20 2a 29 26 61 61 53 6f 72   &((int *)&aaSor
118e0 74 65 64 5b 70 52 74 72 65 65 2d 3e 6e 44 69 6d  ted[pRtree->nDim
118f0 5d 29 5b 69 69 2a 6e 43 65 6c 6c 5d 3b 0a 20 20  ])[ii*nCell];.  
11900 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 6e    for(jj=0; jj<n
11910 43 65 6c 6c 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20  Cell; jj++){.   
11920 20 20 20 61 61 53 6f 72 74 65 64 5b 69 69 5d 5b     aaSorted[ii][
11930 6a 6a 5d 20 3d 20 6a 6a 3b 0a 20 20 20 20 7d 0a  jj] = jj;.    }.
11940 20 20 20 20 53 6f 72 74 42 79 44 69 6d 65 6e 73      SortByDimens
11950 69 6f 6e 28 70 52 74 72 65 65 2c 20 61 61 53 6f  ion(pRtree, aaSo
11960 72 74 65 64 5b 69 69 5d 2c 20 6e 43 65 6c 6c 2c  rted[ii], nCell,
11970 20 69 69 2c 20 61 43 65 6c 6c 2c 20 61 53 70 61   ii, aCell, aSpa
11980 72 65 29 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28  re);.  }..  for(
11990 69 69 3d 30 3b 20 69 69 3c 70 52 74 72 65 65 2d  ii=0; ii<pRtree-
119a0 3e 6e 44 69 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20  >nDim; ii++){.  
119b0 20 20 52 74 72 65 65 44 56 61 6c 75 65 20 6d 61    RtreeDValue ma
119c0 72 67 69 6e 20 3d 20 52 54 52 45 45 5f 5a 45 52  rgin = RTREE_ZER
119d0 4f 3b 0a 20 20 20 20 52 74 72 65 65 44 56 61 6c  O;.    RtreeDVal
119e0 75 65 20 66 42 65 73 74 4f 76 65 72 6c 61 70 20  ue fBestOverlap 
119f0 3d 20 52 54 52 45 45 5f 5a 45 52 4f 3b 0a 20 20  = RTREE_ZERO;.  
11a00 20 20 52 74 72 65 65 44 56 61 6c 75 65 20 66 42    RtreeDValue fB
11a10 65 73 74 41 72 65 61 20 3d 20 52 54 52 45 45 5f  estArea = RTREE_
11a20 5a 45 52 4f 3b 0a 20 20 20 20 69 6e 74 20 69 42  ZERO;.    int iB
11a30 65 73 74 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20  estLeft = 0;.   
11a40 20 69 6e 74 20 6e 4c 65 66 74 3b 0a 0a 20 20 20   int nLeft;..   
11a50 20 66 6f 72 28 0a 20 20 20 20 20 20 6e 4c 65 66   for(.      nLef
11a60 74 3d 52 54 52 45 45 5f 4d 49 4e 43 45 4c 4c 53  t=RTREE_MINCELLS
11a70 28 70 52 74 72 65 65 29 3b 20 0a 20 20 20 20 20  (pRtree); .     
11a80 20 6e 4c 65 66 74 3c 3d 28 6e 43 65 6c 6c 2d 52   nLeft<=(nCell-R
11a90 54 52 45 45 5f 4d 49 4e 43 45 4c 4c 53 28 70 52  TREE_MINCELLS(pR
11aa0 74 72 65 65 29 29 3b 20 0a 20 20 20 20 20 20 6e  tree)); .      n
11ab0 4c 65 66 74 2b 2b 0a 20 20 20 20 29 7b 0a 20 20  Left++.    ){.  
11ac0 20 20 20 20 52 74 72 65 65 43 65 6c 6c 20 6c 65      RtreeCell le
11ad0 66 74 3b 0a 20 20 20 20 20 20 52 74 72 65 65 43  ft;.      RtreeC
11ae0 65 6c 6c 20 72 69 67 68 74 3b 0a 20 20 20 20 20  ell right;.     
11af0 20 69 6e 74 20 6b 6b 3b 0a 20 20 20 20 20 20 52   int kk;.      R
11b00 74 72 65 65 44 56 61 6c 75 65 20 6f 76 65 72 6c  treeDValue overl
11b10 61 70 3b 0a 20 20 20 20 20 20 52 74 72 65 65 44  ap;.      RtreeD
11b20 56 61 6c 75 65 20 61 72 65 61 3b 0a 0a 20 20 20  Value area;..   
11b30 20 20 20 6d 65 6d 63 70 79 28 26 6c 65 66 74 2c     memcpy(&left,
11b40 20 26 61 43 65 6c 6c 5b 61 61 53 6f 72 74 65 64   &aCell[aaSorted
11b50 5b 69 69 5d 5b 30 5d 5d 2c 20 73 69 7a 65 6f 66  [ii][0]], sizeof
11b60 28 52 74 72 65 65 43 65 6c 6c 29 29 3b 0a 20 20  (RtreeCell));.  
11b70 20 20 20 20 6d 65 6d 63 70 79 28 26 72 69 67 68      memcpy(&righ
11b80 74 2c 20 26 61 43 65 6c 6c 5b 61 61 53 6f 72 74  t, &aCell[aaSort
11b90 65 64 5b 69 69 5d 5b 6e 43 65 6c 6c 2d 31 5d 5d  ed[ii][nCell-1]]
11ba0 2c 20 73 69 7a 65 6f 66 28 52 74 72 65 65 43 65  , sizeof(RtreeCe
11bb0 6c 6c 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  ll));.      for(
11bc0 6b 6b 3d 31 3b 20 6b 6b 3c 28 6e 43 65 6c 6c 2d  kk=1; kk<(nCell-
11bd0 31 29 3b 20 6b 6b 2b 2b 29 7b 0a 20 20 20 20 20  1); kk++){.     
11be0 20 20 20 69 66 28 20 6b 6b 3c 6e 4c 65 66 74 20     if( kk<nLeft 
11bf0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 65 6c  ){.          cel
11c00 6c 55 6e 69 6f 6e 28 70 52 74 72 65 65 2c 20 26  lUnion(pRtree, &
11c10 6c 65 66 74 2c 20 26 61 43 65 6c 6c 5b 61 61 53  left, &aCell[aaS
11c20 6f 72 74 65 64 5b 69 69 5d 5b 6b 6b 5d 5d 29 3b  orted[ii][kk]]);
11c30 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
11c40 20 20 20 20 20 20 20 20 20 20 63 65 6c 6c 55 6e            cellUn
11c50 69 6f 6e 28 70 52 74 72 65 65 2c 20 26 72 69 67  ion(pRtree, &rig
11c60 68 74 2c 20 26 61 43 65 6c 6c 5b 61 61 53 6f 72  ht, &aCell[aaSor
11c70 74 65 64 5b 69 69 5d 5b 6b 6b 5d 5d 29 3b 0a 20  ted[ii][kk]]);. 
11c80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
11c90 0a 20 20 20 20 20 20 6d 61 72 67 69 6e 20 2b 3d  .      margin +=
11ca0 20 63 65 6c 6c 4d 61 72 67 69 6e 28 70 52 74 72   cellMargin(pRtr
11cb0 65 65 2c 20 26 6c 65 66 74 29 3b 0a 20 20 20 20  ee, &left);.    
11cc0 20 20 6d 61 72 67 69 6e 20 2b 3d 20 63 65 6c 6c    margin += cell
11cd0 4d 61 72 67 69 6e 28 70 52 74 72 65 65 2c 20 26  Margin(pRtree, &
11ce0 72 69 67 68 74 29 3b 0a 20 20 20 20 20 20 6f 76  right);.      ov
11cf0 65 72 6c 61 70 20 3d 20 63 65 6c 6c 4f 76 65 72  erlap = cellOver
11d00 6c 61 70 28 70 52 74 72 65 65 2c 20 26 6c 65 66  lap(pRtree, &lef
11d10 74 2c 20 26 72 69 67 68 74 2c 20 31 29 3b 0a 20  t, &right, 1);. 
11d20 20 20 20 20 20 61 72 65 61 20 3d 20 63 65 6c 6c       area = cell
11d30 41 72 65 61 28 70 52 74 72 65 65 2c 20 26 6c 65  Area(pRtree, &le
11d40 66 74 29 20 2b 20 63 65 6c 6c 41 72 65 61 28 70  ft) + cellArea(p
11d50 52 74 72 65 65 2c 20 26 72 69 67 68 74 29 3b 0a  Rtree, &right);.
11d60 20 20 20 20 20 20 69 66 28 20 28 6e 4c 65 66 74        if( (nLeft
11d70 3d 3d 52 54 52 45 45 5f 4d 49 4e 43 45 4c 4c 53  ==RTREE_MINCELLS
11d80 28 70 52 74 72 65 65 29 29 0a 20 20 20 20 20 20  (pRtree)).      
11d90 20 7c 7c 20 28 6f 76 65 72 6c 61 70 3c 66 42 65   || (overlap<fBe
11da0 73 74 4f 76 65 72 6c 61 70 29 0a 20 20 20 20 20  stOverlap).     
11db0 20 20 7c 7c 20 28 6f 76 65 72 6c 61 70 3d 3d 66    || (overlap==f
11dc0 42 65 73 74 4f 76 65 72 6c 61 70 20 26 26 20 61  BestOverlap && a
11dd0 72 65 61 3c 66 42 65 73 74 41 72 65 61 29 0a 20  rea<fBestArea). 
11de0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
11df0 69 42 65 73 74 4c 65 66 74 20 3d 20 6e 4c 65 66  iBestLeft = nLef
11e00 74 3b 0a 20 20 20 20 20 20 20 20 66 42 65 73 74  t;.        fBest
11e10 4f 76 65 72 6c 61 70 20 3d 20 6f 76 65 72 6c 61  Overlap = overla
11e20 70 3b 0a 20 20 20 20 20 20 20 20 66 42 65 73 74  p;.        fBest
11e30 41 72 65 61 20 3d 20 61 72 65 61 3b 0a 20 20 20  Area = area;.   
11e40 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
11e50 69 66 28 20 69 69 3d 3d 30 20 7c 7c 20 6d 61 72  if( ii==0 || mar
11e60 67 69 6e 3c 66 42 65 73 74 4d 61 72 67 69 6e 20  gin<fBestMargin 
11e70 29 7b 0a 20 20 20 20 20 20 69 42 65 73 74 44 69  ){.      iBestDi
11e80 6d 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 66 42  m = ii;.      fB
11e90 65 73 74 4d 61 72 67 69 6e 20 3d 20 6d 61 72 67  estMargin = marg
11ea0 69 6e 3b 0a 20 20 20 20 20 20 69 42 65 73 74 53  in;.      iBestS
11eb0 70 6c 69 74 20 3d 20 69 42 65 73 74 4c 65 66 74  plit = iBestLeft
11ec0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6d  ;.    }.  }..  m
11ed0 65 6d 63 70 79 28 70 42 62 6f 78 4c 65 66 74 2c  emcpy(pBboxLeft,
11ee0 20 26 61 43 65 6c 6c 5b 61 61 53 6f 72 74 65 64   &aCell[aaSorted
11ef0 5b 69 42 65 73 74 44 69 6d 5d 5b 30 5d 5d 2c 20  [iBestDim][0]], 
11f00 73 69 7a 65 6f 66 28 52 74 72 65 65 43 65 6c 6c  sizeof(RtreeCell
11f10 29 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 42 62  ));.  memcpy(pBb
11f20 6f 78 52 69 67 68 74 2c 20 26 61 43 65 6c 6c 5b  oxRight, &aCell[
11f30 61 61 53 6f 72 74 65 64 5b 69 42 65 73 74 44 69  aaSorted[iBestDi
11f40 6d 5d 5b 69 42 65 73 74 53 70 6c 69 74 5d 5d 2c  m][iBestSplit]],
11f50 20 73 69 7a 65 6f 66 28 52 74 72 65 65 43 65 6c   sizeof(RtreeCel
11f60 6c 29 29 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b  l));.  for(ii=0;
11f70 20 69 69 3c 6e 43 65 6c 6c 3b 20 69 69 2b 2b 29   ii<nCell; ii++)
11f80 7b 0a 20 20 20 20 52 74 72 65 65 4e 6f 64 65 20  {.    RtreeNode 
11f90 2a 70 54 61 72 67 65 74 20 3d 20 28 69 69 3c 69  *pTarget = (ii<i
11fa0 42 65 73 74 53 70 6c 69 74 29 3f 70 4c 65 66 74  BestSplit)?pLeft
11fb0 3a 70 52 69 67 68 74 3b 0a 20 20 20 20 52 74 72  :pRight;.    Rtr
11fc0 65 65 43 65 6c 6c 20 2a 70 42 62 6f 78 20 3d 20  eeCell *pBbox = 
11fd0 28 69 69 3c 69 42 65 73 74 53 70 6c 69 74 29 3f  (ii<iBestSplit)?
11fe0 70 42 62 6f 78 4c 65 66 74 3a 70 42 62 6f 78 52  pBboxLeft:pBboxR
11ff0 69 67 68 74 3b 0a 20 20 20 20 52 74 72 65 65 43  ight;.    RtreeC
12000 65 6c 6c 20 2a 70 43 65 6c 6c 20 3d 20 26 61 43  ell *pCell = &aC
12010 65 6c 6c 5b 61 61 53 6f 72 74 65 64 5b 69 42 65  ell[aaSorted[iBe
12020 73 74 44 69 6d 5d 5b 69 69 5d 5d 3b 0a 20 20 20  stDim][ii]];.   
12030 20 6e 6f 64 65 49 6e 73 65 72 74 43 65 6c 6c 28   nodeInsertCell(
12040 70 52 74 72 65 65 2c 20 70 54 61 72 67 65 74 2c  pRtree, pTarget,
12050 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 63 65 6c   pCell);.    cel
12060 6c 55 6e 69 6f 6e 28 70 52 74 72 65 65 2c 20 70  lUnion(pRtree, p
12070 42 62 6f 78 2c 20 70 43 65 6c 6c 29 3b 0a 20 20  Bbox, pCell);.  
12080 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  }..  sqlite3_fre
12090 65 28 61 61 53 6f 72 74 65 64 29 3b 0a 20 20 72  e(aaSorted);.  r
120a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
120b0 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  .}...static int 
120c0 75 70 64 61 74 65 4d 61 70 70 69 6e 67 28 0a 20  updateMapping(. 
120d0 20 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c 20   Rtree *pRtree, 
120e0 0a 20 20 69 36 34 20 69 52 6f 77 69 64 2c 20 0a  .  i64 iRowid, .
120f0 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 4e 6f    RtreeNode *pNo
12100 64 65 2c 20 0a 20 20 69 6e 74 20 69 48 65 69 67  de, .  int iHeig
12110 68 74 0a 29 7b 0a 20 20 69 6e 74 20 28 2a 78 53  ht.){.  int (*xS
12120 65 74 4d 61 70 70 69 6e 67 29 28 52 74 72 65 65  etMapping)(Rtree
12130 20 2a 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36   *, sqlite3_int6
12140 34 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  4, sqlite3_int64
12150 29 3b 0a 20 20 78 53 65 74 4d 61 70 70 69 6e 67  );.  xSetMapping
12160 20 3d 20 28 28 69 48 65 69 67 68 74 3d 3d 30 29   = ((iHeight==0)
12170 3f 72 6f 77 69 64 57 72 69 74 65 3a 70 61 72 65  ?rowidWrite:pare
12180 6e 74 57 72 69 74 65 29 3b 0a 20 20 69 66 28 20  ntWrite);.  if( 
12190 69 48 65 69 67 68 74 3e 30 20 29 7b 0a 20 20 20  iHeight>0 ){.   
121a0 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 43 68 69   RtreeNode *pChi
121b0 6c 64 20 3d 20 6e 6f 64 65 48 61 73 68 4c 6f 6f  ld = nodeHashLoo
121c0 6b 75 70 28 70 52 74 72 65 65 2c 20 69 52 6f 77  kup(pRtree, iRow
121d0 69 64 29 3b 0a 20 20 20 20 69 66 28 20 70 43 68  id);.    if( pCh
121e0 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 6e 6f 64  ild ){.      nod
121f0 65 52 65 6c 65 61 73 65 28 70 52 74 72 65 65 2c  eRelease(pRtree,
12200 20 70 43 68 69 6c 64 2d 3e 70 50 61 72 65 6e 74   pChild->pParent
12210 29 3b 0a 20 20 20 20 20 20 6e 6f 64 65 52 65 66  );.      nodeRef
12220 65 72 65 6e 63 65 28 70 4e 6f 64 65 29 3b 0a 20  erence(pNode);. 
12230 20 20 20 20 20 70 43 68 69 6c 64 2d 3e 70 50 61       pChild->pPa
12240 72 65 6e 74 20 3d 20 70 4e 6f 64 65 3b 0a 20 20  rent = pNode;.  
12250 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
12260 20 78 53 65 74 4d 61 70 70 69 6e 67 28 70 52 74   xSetMapping(pRt
12270 72 65 65 2c 20 69 52 6f 77 69 64 2c 20 70 4e 6f  ree, iRowid, pNo
12280 64 65 2d 3e 69 4e 6f 64 65 29 3b 0a 7d 0a 0a 73  de->iNode);.}..s
12290 74 61 74 69 63 20 69 6e 74 20 53 70 6c 69 74 4e  tatic int SplitN
122a0 6f 64 65 28 0a 20 20 52 74 72 65 65 20 2a 70 52  ode(.  Rtree *pR
122b0 74 72 65 65 2c 0a 20 20 52 74 72 65 65 4e 6f 64  tree,.  RtreeNod
122c0 65 20 2a 70 4e 6f 64 65 2c 0a 20 20 52 74 72 65  e *pNode,.  Rtre
122d0 65 43 65 6c 6c 20 2a 70 43 65 6c 6c 2c 0a 20 20  eCell *pCell,.  
122e0 69 6e 74 20 69 48 65 69 67 68 74 0a 29 7b 0a 20  int iHeight.){. 
122f0 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 65   int i;.  int ne
12300 77 43 65 6c 6c 49 73 52 69 67 68 74 20 3d 20 30  wCellIsRight = 0
12310 3b 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ;..  int rc = SQ
12320 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e  LITE_OK;.  int n
12330 43 65 6c 6c 20 3d 20 4e 43 45 4c 4c 28 70 4e 6f  Cell = NCELL(pNo
12340 64 65 29 3b 0a 20 20 52 74 72 65 65 43 65 6c 6c  de);.  RtreeCell
12350 20 2a 61 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 2a   *aCell;.  int *
12360 61 69 55 73 65 64 3b 0a 0a 20 20 52 74 72 65 65  aiUsed;..  Rtree
12370 4e 6f 64 65 20 2a 70 4c 65 66 74 20 3d 20 30 3b  Node *pLeft = 0;
12380 0a 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 52  .  RtreeNode *pR
12390 69 67 68 74 20 3d 20 30 3b 0a 0a 20 20 52 74 72  ight = 0;..  Rtr
123a0 65 65 43 65 6c 6c 20 6c 65 66 74 62 62 6f 78 3b  eeCell leftbbox;
123b0 0a 20 20 52 74 72 65 65 43 65 6c 6c 20 72 69 67  .  RtreeCell rig
123c0 68 74 62 62 6f 78 3b 0a 0a 20 20 2f 2a 20 41 6c  htbbox;..  /* Al
123d0 6c 6f 63 61 74 65 20 61 6e 20 61 72 72 61 79 20  locate an array 
123e0 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 69 74 20  and populate it 
123f0 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 70  with a copy of p
12400 43 65 6c 6c 20 61 6e 64 20 0a 20 20 2a 2a 20 61  Cell and .  ** a
12410 6c 6c 20 63 65 6c 6c 73 20 66 72 6f 6d 20 6e 6f  ll cells from no
12420 64 65 20 70 4c 65 66 74 2e 20 54 68 65 6e 20 7a  de pLeft. Then z
12430 65 72 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ero the original
12440 20 6e 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 43   node..  */.  aC
12450 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ell = sqlite3_ma
12460 6c 6c 6f 63 28 28 73 69 7a 65 6f 66 28 52 74 72  lloc((sizeof(Rtr
12470 65 65 43 65 6c 6c 29 2b 73 69 7a 65 6f 66 28 69  eeCell)+sizeof(i
12480 6e 74 29 29 2a 28 6e 43 65 6c 6c 2b 31 29 29 3b  nt))*(nCell+1));
12490 0a 20 20 69 66 28 20 21 61 43 65 6c 6c 20 29 7b  .  if( !aCell ){
124a0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
124b0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f  _NOMEM;.    goto
124c0 20 73 70 6c 69 74 6e 6f 64 65 5f 6f 75 74 3b 0a   splitnode_out;.
124d0 20 20 7d 0a 20 20 61 69 55 73 65 64 20 3d 20 28    }.  aiUsed = (
124e0 69 6e 74 20 2a 29 26 61 43 65 6c 6c 5b 6e 43 65  int *)&aCell[nCe
124f0 6c 6c 2b 31 5d 3b 0a 20 20 6d 65 6d 73 65 74 28  ll+1];.  memset(
12500 61 69 55 73 65 64 2c 20 30 2c 20 73 69 7a 65 6f  aiUsed, 0, sizeo
12510 66 28 69 6e 74 29 2a 28 6e 43 65 6c 6c 2b 31 29  f(int)*(nCell+1)
12520 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
12530 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
12540 20 6e 6f 64 65 47 65 74 43 65 6c 6c 28 70 52 74   nodeGetCell(pRt
12550 72 65 65 2c 20 70 4e 6f 64 65 2c 20 69 2c 20 26  ree, pNode, i, &
12560 61 43 65 6c 6c 5b 69 5d 29 3b 0a 20 20 7d 0a 20  aCell[i]);.  }. 
12570 20 6e 6f 64 65 5a 65 72 6f 28 70 52 74 72 65 65   nodeZero(pRtree
12580 2c 20 70 4e 6f 64 65 29 3b 0a 20 20 6d 65 6d 63  , pNode);.  memc
12590 70 79 28 26 61 43 65 6c 6c 5b 6e 43 65 6c 6c 5d  py(&aCell[nCell]
125a0 2c 20 70 43 65 6c 6c 2c 20 73 69 7a 65 6f 66 28  , pCell, sizeof(
125b0 52 74 72 65 65 43 65 6c 6c 29 29 3b 0a 20 20 6e  RtreeCell));.  n
125c0 43 65 6c 6c 2b 2b 3b 0a 0a 20 20 69 66 28 20 70  Cell++;..  if( p
125d0 4e 6f 64 65 2d 3e 69 4e 6f 64 65 3d 3d 31 20 29  Node->iNode==1 )
125e0 7b 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20 6e  {.    pRight = n
125f0 6f 64 65 4e 65 77 28 70 52 74 72 65 65 2c 20 70  odeNew(pRtree, p
12600 4e 6f 64 65 29 3b 0a 20 20 20 20 70 4c 65 66 74  Node);.    pLeft
12610 20 3d 20 6e 6f 64 65 4e 65 77 28 70 52 74 72 65   = nodeNew(pRtre
12620 65 2c 20 70 4e 6f 64 65 29 3b 0a 20 20 20 20 70  e, pNode);.    p
12630 52 74 72 65 65 2d 3e 69 44 65 70 74 68 2b 2b 3b  Rtree->iDepth++;
12640 0a 20 20 20 20 70 4e 6f 64 65 2d 3e 69 73 44 69  .    pNode->isDi
12650 72 74 79 20 3d 20 31 3b 0a 20 20 20 20 77 72 69  rty = 1;.    wri
12660 74 65 49 6e 74 31 36 28 70 4e 6f 64 65 2d 3e 7a  teInt16(pNode->z
12670 44 61 74 61 2c 20 70 52 74 72 65 65 2d 3e 69 44  Data, pRtree->iD
12680 65 70 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  epth);.  }else{.
12690 20 20 20 20 70 4c 65 66 74 20 3d 20 70 4e 6f 64      pLeft = pNod
126a0 65 3b 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20  e;.    pRight = 
126b0 6e 6f 64 65 4e 65 77 28 70 52 74 72 65 65 2c 20  nodeNew(pRtree, 
126c0 70 4c 65 66 74 2d 3e 70 50 61 72 65 6e 74 29 3b  pLeft->pParent);
126d0 0a 20 20 20 20 6e 6f 64 65 52 65 66 65 72 65 6e  .    nodeReferen
126e0 63 65 28 70 4c 65 66 74 29 3b 0a 20 20 7d 0a 0a  ce(pLeft);.  }..
126f0 20 20 69 66 28 20 21 70 4c 65 66 74 20 7c 7c 20    if( !pLeft || 
12700 21 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 72  !pRight ){.    r
12710 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
12720 3b 0a 20 20 20 20 67 6f 74 6f 20 73 70 6c 69 74  ;.    goto split
12730 6e 6f 64 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  node_out;.  }.. 
12740 20 6d 65 6d 73 65 74 28 70 4c 65 66 74 2d 3e 7a   memset(pLeft->z
12750 44 61 74 61 2c 20 30 2c 20 70 52 74 72 65 65 2d  Data, 0, pRtree-
12760 3e 69 4e 6f 64 65 53 69 7a 65 29 3b 0a 20 20 6d  >iNodeSize);.  m
12770 65 6d 73 65 74 28 70 52 69 67 68 74 2d 3e 7a 44  emset(pRight->zD
12780 61 74 61 2c 20 30 2c 20 70 52 74 72 65 65 2d 3e  ata, 0, pRtree->
12790 69 4e 6f 64 65 53 69 7a 65 29 3b 0a 0a 20 20 72  iNodeSize);..  r
127a0 63 20 3d 20 73 70 6c 69 74 4e 6f 64 65 53 74 61  c = splitNodeSta
127b0 72 74 72 65 65 28 70 52 74 72 65 65 2c 20 61 43  rtree(pRtree, aC
127c0 65 6c 6c 2c 20 6e 43 65 6c 6c 2c 20 70 4c 65 66  ell, nCell, pLef
127d0 74 2c 20 70 52 69 67 68 74 2c 0a 20 20 20 20 20  t, pRight,.     
127e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127f0 20 20 20 20 26 6c 65 66 74 62 62 6f 78 2c 20 26      &leftbbox, &
12800 72 69 67 68 74 62 62 6f 78 29 3b 0a 20 20 69 66  rightbbox);.  if
12810 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
12820 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 70 6c 69  ){.    goto spli
12830 74 6e 6f 64 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  tnode_out;.  }..
12840 20 20 2f 2a 20 45 6e 73 75 72 65 20 62 6f 74 68    /* Ensure both
12850 20 63 68 69 6c 64 20 6e 6f 64 65 73 20 68 61 76   child nodes hav
12860 65 20 6e 6f 64 65 20 6e 75 6d 62 65 72 73 20 61  e node numbers a
12870 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65 6d 20  ssigned to them 
12880 62 79 20 63 61 6c 6c 69 6e 67 0a 20 20 2a 2a 20  by calling.  ** 
12890 6e 6f 64 65 57 72 69 74 65 28 29 2e 20 4e 6f 64  nodeWrite(). Nod
128a0 65 20 70 52 69 67 68 74 20 61 6c 77 61 79 73 20  e pRight always 
128b0 6e 65 65 64 73 20 61 20 6e 6f 64 65 20 6e 75 6d  needs a node num
128c0 62 65 72 2c 20 61 73 20 69 74 20 77 61 73 20 63  ber, as it was c
128d0 72 65 61 74 65 64 0a 20 20 2a 2a 20 62 79 20 6e  reated.  ** by n
128e0 6f 64 65 4e 65 77 28 29 20 61 62 6f 76 65 2e 20  odeNew() above. 
128f0 42 75 74 20 6e 6f 64 65 20 70 4c 65 66 74 20 73  But node pLeft s
12900 6f 6d 65 74 69 6d 65 73 20 61 6c 72 65 61 64 79  ometimes already
12910 20 68 61 73 20 61 20 6e 6f 64 65 20 6e 75 6d 62   has a node numb
12920 65 72 2e 0a 20 20 2a 2a 20 49 6e 20 74 68 69 73  er..  ** In this
12930 20 63 61 73 65 20 61 76 6f 69 64 20 74 68 65 20   case avoid the 
12940 61 6c 6c 20 74 6f 20 6e 6f 64 65 57 72 69 74 65  all to nodeWrite
12950 28 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53  ()..  */.  if( S
12960 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
12970 6e 6f 64 65 57 72 69 74 65 28 70 52 74 72 65 65  nodeWrite(pRtree
12980 2c 20 70 52 69 67 68 74 29 29 0a 20 20 20 7c 7c  , pRight)).   ||
12990 20 28 30 3d 3d 70 4c 65 66 74 2d 3e 69 4e 6f 64   (0==pLeft->iNod
129a0 65 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d  e && SQLITE_OK!=
129b0 28 72 63 20 3d 20 6e 6f 64 65 57 72 69 74 65 28  (rc = nodeWrite(
129c0 70 52 74 72 65 65 2c 20 70 4c 65 66 74 29 29 29  pRtree, pLeft)))
129d0 0a 20 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73  .  ){.    goto s
129e0 70 6c 69 74 6e 6f 64 65 5f 6f 75 74 3b 0a 20 20  plitnode_out;.  
129f0 7d 0a 0a 20 20 72 69 67 68 74 62 62 6f 78 2e 69  }..  rightbbox.i
12a00 52 6f 77 69 64 20 3d 20 70 52 69 67 68 74 2d 3e  Rowid = pRight->
12a10 69 4e 6f 64 65 3b 0a 20 20 6c 65 66 74 62 62 6f  iNode;.  leftbbo
12a20 78 2e 69 52 6f 77 69 64 20 3d 20 70 4c 65 66 74  x.iRowid = pLeft
12a30 2d 3e 69 4e 6f 64 65 3b 0a 0a 20 20 69 66 28 20  ->iNode;..  if( 
12a40 70 4e 6f 64 65 2d 3e 69 4e 6f 64 65 3d 3d 31 20  pNode->iNode==1 
12a50 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 74 72 65  ){.    rc = rtre
12a60 65 49 6e 73 65 72 74 43 65 6c 6c 28 70 52 74 72  eInsertCell(pRtr
12a70 65 65 2c 20 70 4c 65 66 74 2d 3e 70 50 61 72 65  ee, pLeft->pPare
12a80 6e 74 2c 20 26 6c 65 66 74 62 62 6f 78 2c 20 69  nt, &leftbbox, i
12a90 48 65 69 67 68 74 2b 31 29 3b 0a 20 20 20 20 69  Height+1);.    i
12aa0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
12ab0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
12ac0 70 6c 69 74 6e 6f 64 65 5f 6f 75 74 3b 0a 20 20  plitnode_out;.  
12ad0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
12ae0 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 50 61 72   RtreeNode *pPar
12af0 65 6e 74 20 3d 20 70 4c 65 66 74 2d 3e 70 50 61  ent = pLeft->pPa
12b00 72 65 6e 74 3b 0a 20 20 20 20 69 6e 74 20 69 43  rent;.    int iC
12b10 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6e 6f  ell;.    rc = no
12b20 64 65 50 61 72 65 6e 74 49 6e 64 65 78 28 70 52  deParentIndex(pR
12b30 74 72 65 65 2c 20 70 4c 65 66 74 2c 20 26 69 43  tree, pLeft, &iC
12b40 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ell);.    if( rc
12b50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
12b60 20 20 20 20 20 6e 6f 64 65 4f 76 65 72 77 72 69       nodeOverwri
12b70 74 65 43 65 6c 6c 28 70 52 74 72 65 65 2c 20 70  teCell(pRtree, p
12b80 50 61 72 65 6e 74 2c 20 26 6c 65 66 74 62 62 6f  Parent, &leftbbo
12b90 78 2c 20 69 43 65 6c 6c 29 3b 0a 20 20 20 20 20  x, iCell);.     
12ba0 20 72 63 20 3d 20 41 64 6a 75 73 74 54 72 65 65   rc = AdjustTree
12bb0 28 70 52 74 72 65 65 2c 20 70 50 61 72 65 6e 74  (pRtree, pParent
12bc0 2c 20 26 6c 65 66 74 62 62 6f 78 29 3b 0a 20 20  , &leftbbox);.  
12bd0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
12be0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12bf0 20 20 20 67 6f 74 6f 20 73 70 6c 69 74 6e 6f 64     goto splitnod
12c00 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  e_out;.    }.  }
12c10 0a 20 20 69 66 28 20 28 72 63 20 3d 20 72 74 72  .  if( (rc = rtr
12c20 65 65 49 6e 73 65 72 74 43 65 6c 6c 28 70 52 74  eeInsertCell(pRt
12c30 72 65 65 2c 20 70 52 69 67 68 74 2d 3e 70 50 61  ree, pRight->pPa
12c40 72 65 6e 74 2c 20 26 72 69 67 68 74 62 62 6f 78  rent, &rightbbox
12c50 2c 20 69 48 65 69 67 68 74 2b 31 29 29 20 29 7b  , iHeight+1)) ){
12c60 0a 20 20 20 20 67 6f 74 6f 20 73 70 6c 69 74 6e  .    goto splitn
12c70 6f 64 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20  ode_out;.  }..  
12c80 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 43 45 4c 4c  for(i=0; i<NCELL
12c90 28 70 52 69 67 68 74 29 3b 20 69 2b 2b 29 7b 0a  (pRight); i++){.
12ca0 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d      i64 iRowid =
12cb0 20 6e 6f 64 65 47 65 74 52 6f 77 69 64 28 70 52   nodeGetRowid(pR
12cc0 74 72 65 65 2c 20 70 52 69 67 68 74 2c 20 69 29  tree, pRight, i)
12cd0 3b 0a 20 20 20 20 72 63 20 3d 20 75 70 64 61 74  ;.    rc = updat
12ce0 65 4d 61 70 70 69 6e 67 28 70 52 74 72 65 65 2c  eMapping(pRtree,
12cf0 20 69 52 6f 77 69 64 2c 20 70 52 69 67 68 74 2c   iRowid, pRight,
12d00 20 69 48 65 69 67 68 74 29 3b 0a 20 20 20 20 69   iHeight);.    i
12d10 66 28 20 69 52 6f 77 69 64 3d 3d 70 43 65 6c 6c  f( iRowid==pCell
12d20 2d 3e 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  ->iRowid ){.    
12d30 20 20 6e 65 77 43 65 6c 6c 49 73 52 69 67 68 74    newCellIsRight
12d40 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
12d50 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
12d60 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
12d70 73 70 6c 69 74 6e 6f 64 65 5f 6f 75 74 3b 0a 20  splitnode_out;. 
12d80 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
12d90 4e 6f 64 65 2d 3e 69 4e 6f 64 65 3d 3d 31 20 29  Node->iNode==1 )
12da0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
12db0 3c 4e 43 45 4c 4c 28 70 4c 65 66 74 29 3b 20 69  <NCELL(pLeft); i
12dc0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69  ++){.      i64 i
12dd0 52 6f 77 69 64 20 3d 20 6e 6f 64 65 47 65 74 52  Rowid = nodeGetR
12de0 6f 77 69 64 28 70 52 74 72 65 65 2c 20 70 4c 65  owid(pRtree, pLe
12df0 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 72 63  ft, i);.      rc
12e00 20 3d 20 75 70 64 61 74 65 4d 61 70 70 69 6e 67   = updateMapping
12e10 28 70 52 74 72 65 65 2c 20 69 52 6f 77 69 64 2c  (pRtree, iRowid,
12e20 20 70 4c 65 66 74 2c 20 69 48 65 69 67 68 74 29   pLeft, iHeight)
12e30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
12e40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12e50 20 20 20 20 20 67 6f 74 6f 20 73 70 6c 69 74 6e       goto splitn
12e60 6f 64 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ode_out;.      }
12e70 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
12e80 66 28 20 6e 65 77 43 65 6c 6c 49 73 52 69 67 68  f( newCellIsRigh
12e90 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  t==0 ){.    rc =
12ea0 20 75 70 64 61 74 65 4d 61 70 70 69 6e 67 28 70   updateMapping(p
12eb0 52 74 72 65 65 2c 20 70 43 65 6c 6c 2d 3e 69 52  Rtree, pCell->iR
12ec0 6f 77 69 64 2c 20 70 4c 65 66 74 2c 20 69 48 65  owid, pLeft, iHe
12ed0 69 67 68 74 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  ight);.  }..  if
12ee0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
12ef0 29 7b 0a 20 20 20 20 72 63 20 3d 20 6e 6f 64 65  ){.    rc = node
12f00 52 65 6c 65 61 73 65 28 70 52 74 72 65 65 2c 20  Release(pRtree, 
12f10 70 52 69 67 68 74 29 3b 0a 20 20 20 20 70 52 69  pRight);.    pRi
12f20 67 68 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  ght = 0;.  }.  i
12f30 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
12f40 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6e 6f 64   ){.    rc = nod
12f50 65 52 65 6c 65 61 73 65 28 70 52 74 72 65 65 2c  eRelease(pRtree,
12f60 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 70 4c 65   pLeft);.    pLe
12f70 66 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 73 70 6c  ft = 0;.  }..spl
12f80 69 74 6e 6f 64 65 5f 6f 75 74 3a 0a 20 20 6e 6f  itnode_out:.  no
12f90 64 65 52 65 6c 65 61 73 65 28 70 52 74 72 65 65  deRelease(pRtree
12fa0 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 6e 6f 64  , pRight);.  nod
12fb0 65 52 65 6c 65 61 73 65 28 70 52 74 72 65 65 2c  eRelease(pRtree,
12fc0 20 70 4c 65 66 74 29 3b 0a 20 20 73 71 6c 69 74   pLeft);.  sqlit
12fd0 65 33 5f 66 72 65 65 28 61 43 65 6c 6c 29 3b 0a  e3_free(aCell);.
12fe0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
12ff0 2f 2a 0a 2a 2a 20 49 66 20 6e 6f 64 65 20 70 4c  /*.** If node pL
13000 65 61 66 20 69 73 20 6e 6f 74 20 74 68 65 20 72  eaf is not the r
13010 6f 6f 74 20 6f 66 20 74 68 65 20 72 2d 74 72 65  oot of the r-tre
13020 65 20 61 6e 64 20 69 74 73 20 70 50 61 72 65 6e  e and its pParen
13030 74 20 70 6f 69 6e 74 65 72 20 69 73 20 0a 2a 2a  t pointer is .**
13040 20 73 74 69 6c 6c 20 4e 55 4c 4c 2c 20 6c 6f 61   still NULL, loa
13050 64 20 61 6c 6c 20 61 6e 63 65 73 74 6f 72 20 6e  d all ancestor n
13060 6f 64 65 73 20 6f 66 20 70 4c 65 61 66 20 69 6e  odes of pLeaf in
13070 74 6f 20 6d 65 6d 6f 72 79 20 61 6e 64 20 70 6f  to memory and po
13080 70 75 6c 61 74 65 0a 2a 2a 20 74 68 65 20 70 4c  pulate.** the pL
13090 65 61 66 2d 3e 70 50 61 72 65 6e 74 20 63 68 61  eaf->pParent cha
130a0 69 6e 20 61 6c 6c 20 74 68 65 20 77 61 79 20 75  in all the way u
130b0 70 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 6e 6f  p to the root no
130c0 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f  de..**.** This o
130d0 70 65 72 61 74 69 6f 6e 20 69 73 20 72 65 71 75  peration is requ
130e0 69 72 65 64 20 77 68 65 6e 20 61 20 72 6f 77 20  ired when a row 
130f0 69 73 20 64 65 6c 65 74 65 64 20 28 6f 72 20 75  is deleted (or u
13100 70 64 61 74 65 64 20 2d 20 61 6e 20 75 70 64 61  pdated - an upda
13110 74 65 0a 2a 2a 20 69 73 20 69 6d 70 6c 65 6d 65  te.** is impleme
13120 6e 74 65 64 20 61 73 20 61 20 64 65 6c 65 74 65  nted as a delete
13130 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 20   followed by an 
13140 69 6e 73 65 72 74 29 2e 20 53 51 4c 69 74 65 20  insert). SQLite 
13150 70 72 6f 76 69 64 65 73 20 74 68 65 0a 2a 2a 20  provides the.** 
13160 72 6f 77 69 64 20 6f 66 20 74 68 65 20 72 6f 77  rowid of the row
13170 20 74 6f 20 64 65 6c 65 74 65 2c 20 77 68 69 63   to delete, whic
13180 68 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  h can be used to
13190 20 66 69 6e 64 20 74 68 65 20 6c 65 61 66 20 6f   find the leaf o
131a0 6e 20 77 68 69 63 68 0a 2a 2a 20 74 68 65 20 65  n which.** the e
131b0 6e 74 72 79 20 72 65 73 69 64 65 73 20 28 61 72  ntry resides (ar
131c0 67 75 6d 65 6e 74 20 70 4c 65 61 66 29 2e 20 4f  gument pLeaf). O
131d0 6e 63 65 20 74 68 65 20 6c 65 61 66 20 69 73 20  nce the leaf is 
131e0 6c 6f 63 61 74 65 64 2c 20 74 68 69 73 20 0a 2a  located, this .*
131f0 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  * function is ca
13200 6c 6c 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  lled to determin
13210 65 20 69 74 73 20 61 6e 63 65 73 74 72 79 2e 0a  e its ancestry..
13220 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
13230 78 4c 65 61 66 50 61 72 65 6e 74 28 52 74 72 65  xLeafParent(Rtre
13240 65 20 2a 70 52 74 72 65 65 2c 20 52 74 72 65 65  e *pRtree, Rtree
13250 4e 6f 64 65 20 2a 70 4c 65 61 66 29 7b 0a 20 20  Node *pLeaf){.  
13260 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
13270 4f 4b 3b 0a 20 20 52 74 72 65 65 4e 6f 64 65 20  OK;.  RtreeNode 
13280 2a 70 43 68 69 6c 64 20 3d 20 70 4c 65 61 66 3b  *pChild = pLeaf;
13290 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
132a0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 43 68 69 6c  LITE_OK && pChil
132b0 64 2d 3e 69 4e 6f 64 65 21 3d 31 20 26 26 20 70  d->iNode!=1 && p
132c0 43 68 69 6c 64 2d 3e 70 50 61 72 65 6e 74 3d 3d  Child->pParent==
132d0 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32  0 ){.    int rc2
132e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
132f0 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
13300 33 5f 72 65 73 65 74 28 29 20 72 65 74 75 72 6e  3_reset() return
13310 20 63 6f 64 65 20 2a 2f 0a 20 20 20 20 73 71 6c   code */.    sql
13320 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
13330 70 52 74 72 65 65 2d 3e 70 52 65 61 64 50 61 72  pRtree->pReadPar
13340 65 6e 74 2c 20 31 2c 20 70 43 68 69 6c 64 2d 3e  ent, 1, pChild->
13350 69 4e 6f 64 65 29 3b 0a 20 20 20 20 72 63 20 3d  iNode);.    rc =
13360 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 52   sqlite3_step(pR
13370 74 72 65 65 2d 3e 70 52 65 61 64 50 61 72 65 6e  tree->pReadParen
13380 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  t);.    if( rc==
13390 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
133a0 20 20 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70      RtreeNode *p
133b0 54 65 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  Test;           
133c0 2f 2a 20 55 73 65 64 20 74 6f 20 74 65 73 74 20  /* Used to test 
133d0 66 6f 72 20 72 65 66 65 72 65 6e 63 65 20 6c 6f  for reference lo
133e0 6f 70 73 20 2a 2f 0a 20 20 20 20 20 20 69 36 34  ops */.      i64
133f0 20 69 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20   iNode;         
13400 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 64 65           /* Node
13410 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 72 65 6e   number of paren
13420 74 20 6e 6f 64 65 20 2a 2f 0a 0a 20 20 20 20 20  t node */..     
13430 20 2f 2a 20 42 65 66 6f 72 65 20 73 65 74 74 69   /* Before setti
13440 6e 67 20 70 43 68 69 6c 64 2d 3e 70 50 61 72 65  ng pChild->pPare
13450 6e 74 2c 20 74 65 73 74 20 74 68 61 74 20 77 65  nt, test that we
13460 20 61 72 65 20 6e 6f 74 20 63 72 65 61 74 69 6e   are not creatin
13470 67 20 61 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f  g a.      ** loo
13480 70 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  p of references 
13490 28 61 73 20 77 65 20 77 6f 75 6c 64 20 69 66 2c  (as we would if,
134a0 20 73 61 79 2c 20 70 43 68 69 6c 64 3d 3d 70 50   say, pChild==pP
134b0 61 72 65 6e 74 29 2e 20 57 65 20 64 6f 6e 27 74  arent). We don't
134c0 0a 20 20 20 20 20 20 2a 2a 20 77 61 6e 74 20 74  .      ** want t
134d0 6f 20 64 6f 20 74 68 69 73 20 61 73 20 69 74 20  o do this as it 
134e0 6c 65 61 64 73 20 74 6f 20 61 20 6d 65 6d 6f 72  leads to a memor
134f0 79 20 6c 65 61 6b 20 77 68 65 6e 20 74 72 79 69  y leak when tryi
13500 6e 67 20 74 6f 20 64 65 6c 65 74 65 0a 20 20 20  ng to delete.   
13510 20 20 20 2a 2a 20 74 68 65 20 72 65 66 65 72 65     ** the refere
13520 6e 63 65 64 20 63 6f 75 6e 74 65 64 20 6e 6f 64  nced counted nod
13530 65 20 73 74 72 75 63 74 75 72 65 73 2e 0a 20 20  e structures..  
13540 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 4e 6f      */.      iNo
13550 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  de = sqlite3_col
13560 75 6d 6e 5f 69 6e 74 36 34 28 70 52 74 72 65 65  umn_int64(pRtree
13570 2d 3e 70 52 65 61 64 50 61 72 65 6e 74 2c 20 30  ->pReadParent, 0
13580 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 54 65  );.      for(pTe
13590 73 74 3d 70 4c 65 61 66 3b 20 70 54 65 73 74 20  st=pLeaf; pTest 
135a0 26 26 20 70 54 65 73 74 2d 3e 69 4e 6f 64 65 21  && pTest->iNode!
135b0 3d 69 4e 6f 64 65 3b 20 70 54 65 73 74 3d 70 54  =iNode; pTest=pT
135c0 65 73 74 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20  est->pParent);. 
135d0 20 20 20 20 20 69 66 28 20 21 70 54 65 73 74 20       if( !pTest 
135e0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 32 20 3d  ){.        rc2 =
135f0 20 6e 6f 64 65 41 63 71 75 69 72 65 28 70 52 74   nodeAcquire(pRt
13600 72 65 65 2c 20 69 4e 6f 64 65 2c 20 30 2c 20 26  ree, iNode, 0, &
13610 70 43 68 69 6c 64 2d 3e 70 50 61 72 65 6e 74 29  pChild->pParent)
13620 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
13630 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13640 5f 72 65 73 65 74 28 70 52 74 72 65 65 2d 3e 70  _reset(pRtree->p
13650 52 65 61 64 50 61 72 65 6e 74 29 3b 0a 20 20 20  ReadParent);.   
13660 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
13670 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20  OK ) rc = rc2;. 
13680 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
13690 45 5f 4f 4b 20 26 26 20 21 70 43 68 69 6c 64 2d  E_OK && !pChild-
136a0 3e 70 50 61 72 65 6e 74 20 29 20 72 63 20 3d 20  >pParent ) rc = 
136b0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56  SQLITE_CORRUPT_V
136c0 54 41 42 3b 0a 20 20 20 20 70 43 68 69 6c 64 20  TAB;.    pChild 
136d0 3d 20 70 43 68 69 6c 64 2d 3e 70 50 61 72 65 6e  = pChild->pParen
136e0 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
136f0 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  rc;.}..static in
13700 74 20 64 65 6c 65 74 65 43 65 6c 6c 28 52 74 72  t deleteCell(Rtr
13710 65 65 20 2a 2c 20 52 74 72 65 65 4e 6f 64 65 20  ee *, RtreeNode 
13720 2a 2c 20 69 6e 74 2c 20 69 6e 74 29 3b 0a 0a 73  *, int, int);..s
13730 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76 65  tatic int remove
13740 4e 6f 64 65 28 52 74 72 65 65 20 2a 70 52 74 72  Node(Rtree *pRtr
13750 65 65 2c 20 52 74 72 65 65 4e 6f 64 65 20 2a 70  ee, RtreeNode *p
13760 4e 6f 64 65 2c 20 69 6e 74 20 69 48 65 69 67 68  Node, int iHeigh
13770 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  t){.  int rc;.  
13780 69 6e 74 20 72 63 32 3b 0a 20 20 52 74 72 65 65  int rc2;.  Rtree
13790 4e 6f 64 65 20 2a 70 50 61 72 65 6e 74 20 3d 20  Node *pParent = 
137a0 30 3b 0a 20 20 69 6e 74 20 69 43 65 6c 6c 3b 0a  0;.  int iCell;.
137b0 0a 20 20 61 73 73 65 72 74 28 20 70 4e 6f 64 65  .  assert( pNode
137c0 2d 3e 6e 52 65 66 3d 3d 31 20 29 3b 0a 0a 20 20  ->nRef==1 );..  
137d0 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 65 6e  /* Remove the en
137e0 74 72 79 20 69 6e 20 74 68 65 20 70 61 72 65 6e  try in the paren
137f0 74 20 63 65 6c 6c 2e 20 2a 2f 0a 20 20 72 63 20  t cell. */.  rc 
13800 3d 20 6e 6f 64 65 50 61 72 65 6e 74 49 6e 64 65  = nodeParentInde
13810 78 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65 2c  x(pRtree, pNode,
13820 20 26 69 43 65 6c 6c 29 3b 0a 20 20 69 66 28 20   &iCell);.  if( 
13830 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
13840 0a 20 20 20 20 70 50 61 72 65 6e 74 20 3d 20 70  .    pParent = p
13850 4e 6f 64 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20  Node->pParent;. 
13860 20 20 20 70 4e 6f 64 65 2d 3e 70 50 61 72 65 6e     pNode->pParen
13870 74 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  t = 0;.    rc = 
13880 64 65 6c 65 74 65 43 65 6c 6c 28 70 52 74 72 65  deleteCell(pRtre
13890 65 2c 20 70 50 61 72 65 6e 74 2c 20 69 43 65 6c  e, pParent, iCel
138a0 6c 2c 20 69 48 65 69 67 68 74 2b 31 29 3b 0a 20  l, iHeight+1);. 
138b0 20 7d 0a 20 20 72 63 32 20 3d 20 6e 6f 64 65 52   }.  rc2 = nodeR
138c0 65 6c 65 61 73 65 28 70 52 74 72 65 65 2c 20 70  elease(pRtree, p
138d0 50 61 72 65 6e 74 29 3b 0a 20 20 69 66 28 20 72  Parent);.  if( r
138e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
138f0 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20      rc = rc2;.  
13900 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
13910 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
13920 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
13930 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 78 78 78  * Remove the xxx
13940 5f 6e 6f 64 65 20 65 6e 74 72 79 2e 20 2a 2f 0a  _node entry. */.
13950 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
13960 6e 74 36 34 28 70 52 74 72 65 65 2d 3e 70 44 65  nt64(pRtree->pDe
13970 6c 65 74 65 4e 6f 64 65 2c 20 31 2c 20 70 4e 6f  leteNode, 1, pNo
13980 64 65 2d 3e 69 4e 6f 64 65 29 3b 0a 20 20 73 71  de->iNode);.  sq
13990 6c 69 74 65 33 5f 73 74 65 70 28 70 52 74 72 65  lite3_step(pRtre
139a0 65 2d 3e 70 44 65 6c 65 74 65 4e 6f 64 65 29 3b  e->pDeleteNode);
139b0 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
139c0 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  !=(rc = sqlite3_
139d0 72 65 73 65 74 28 70 52 74 72 65 65 2d 3e 70 44  reset(pRtree->pD
139e0 65 6c 65 74 65 4e 6f 64 65 29 29 20 29 7b 0a 20  eleteNode)) ){. 
139f0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
13a00 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74  }..  /* Remove t
13a10 68 65 20 78 78 78 5f 70 61 72 65 6e 74 20 65 6e  he xxx_parent en
13a20 74 72 79 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  try. */.  sqlite
13a30 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 52 74  3_bind_int64(pRt
13a40 72 65 65 2d 3e 70 44 65 6c 65 74 65 50 61 72 65  ree->pDeletePare
13a50 6e 74 2c 20 31 2c 20 70 4e 6f 64 65 2d 3e 69 4e  nt, 1, pNode->iN
13a60 6f 64 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ode);.  sqlite3_
13a70 73 74 65 70 28 70 52 74 72 65 65 2d 3e 70 44 65  step(pRtree->pDe
13a80 6c 65 74 65 50 61 72 65 6e 74 29 3b 0a 20 20 69  leteParent);.  i
13a90 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
13aa0 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
13ab0 74 28 70 52 74 72 65 65 2d 3e 70 44 65 6c 65 74  t(pRtree->pDelet
13ac0 65 50 61 72 65 6e 74 29 29 20 29 7b 0a 20 20 20  eParent)) ){.   
13ad0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
13ae0 20 20 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74    .  /* Remove t
13af0 68 65 20 6e 6f 64 65 20 66 72 6f 6d 20 74 68 65  he node from the
13b00 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20   in-memory hash 
13b10 74 61 62 6c 65 20 61 6e 64 20 6c 69 6e 6b 20 69  table and link i
13b20 74 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20  t into.  ** the 
13b30 52 74 72 65 65 2e 70 44 65 6c 65 74 65 64 20 6c  Rtree.pDeleted l
13b40 69 73 74 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74  ist. Its content
13b50 73 20 77 69 6c 6c 20 62 65 20 72 65 2d 69 6e 73  s will be re-ins
13b60 65 72 74 65 64 20 6c 61 74 65 72 20 6f 6e 2e 0a  erted later on..
13b70 20 20 2a 2f 0a 20 20 6e 6f 64 65 48 61 73 68 44    */.  nodeHashD
13b80 65 6c 65 74 65 28 70 52 74 72 65 65 2c 20 70 4e  elete(pRtree, pN
13b90 6f 64 65 29 3b 0a 20 20 70 4e 6f 64 65 2d 3e 69  ode);.  pNode->i
13ba0 4e 6f 64 65 20 3d 20 69 48 65 69 67 68 74 3b 0a  Node = iHeight;.
13bb0 20 20 70 4e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d    pNode->pNext =
13bc0 20 70 52 74 72 65 65 2d 3e 70 44 65 6c 65 74 65   pRtree->pDelete
13bd0 64 3b 0a 20 20 70 4e 6f 64 65 2d 3e 6e 52 65 66  d;.  pNode->nRef
13be0 2b 2b 3b 0a 20 20 70 52 74 72 65 65 2d 3e 70 44  ++;.  pRtree->pD
13bf0 65 6c 65 74 65 64 20 3d 20 70 4e 6f 64 65 3b 0a  eleted = pNode;.
13c00 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
13c10 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  _OK;.}..static i
13c20 6e 74 20 66 69 78 42 6f 75 6e 64 69 6e 67 42 6f  nt fixBoundingBo
13c30 78 28 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c  x(Rtree *pRtree,
13c40 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 4e 6f 64   RtreeNode *pNod
13c50 65 29 7b 0a 20 20 52 74 72 65 65 4e 6f 64 65 20  e){.  RtreeNode 
13c60 2a 70 50 61 72 65 6e 74 20 3d 20 70 4e 6f 64 65  *pParent = pNode
13c70 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 69 6e 74  ->pParent;.  int
13c80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
13c90 20 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74 20   .  if( pParent 
13ca0 29 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 0a  ){.    int ii; .
13cb0 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20      int nCell = 
13cc0 4e 43 45 4c 4c 28 70 4e 6f 64 65 29 3b 0a 20 20  NCELL(pNode);.  
13cd0 20 20 52 74 72 65 65 43 65 6c 6c 20 62 6f 78 3b    RtreeCell box;
13ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13cf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
13d00 6f 75 6e 64 69 6e 67 20 62 6f 78 20 66 6f 72 20  ounding box for 
13d10 70 4e 6f 64 65 20 2a 2f 0a 20 20 20 20 6e 6f 64  pNode */.    nod
13d20 65 47 65 74 43 65 6c 6c 28 70 52 74 72 65 65 2c  eGetCell(pRtree,
13d30 20 70 4e 6f 64 65 2c 20 30 2c 20 26 62 6f 78 29   pNode, 0, &box)
13d40 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 31 3b 20  ;.    for(ii=1; 
13d50 69 69 3c 6e 43 65 6c 6c 3b 20 69 69 2b 2b 29 7b  ii<nCell; ii++){
13d60 0a 20 20 20 20 20 20 52 74 72 65 65 43 65 6c 6c  .      RtreeCell
13d70 20 63 65 6c 6c 3b 0a 20 20 20 20 20 20 6e 6f 64   cell;.      nod
13d80 65 47 65 74 43 65 6c 6c 28 70 52 74 72 65 65 2c  eGetCell(pRtree,
13d90 20 70 4e 6f 64 65 2c 20 69 69 2c 20 26 63 65 6c   pNode, ii, &cel
13da0 6c 29 3b 0a 20 20 20 20 20 20 63 65 6c 6c 55 6e  l);.      cellUn
13db0 69 6f 6e 28 70 52 74 72 65 65 2c 20 26 62 6f 78  ion(pRtree, &box
13dc0 2c 20 26 63 65 6c 6c 29 3b 0a 20 20 20 20 7d 0a  , &cell);.    }.
13dd0 20 20 20 20 62 6f 78 2e 69 52 6f 77 69 64 20 3d      box.iRowid =
13de0 20 70 4e 6f 64 65 2d 3e 69 4e 6f 64 65 3b 0a 20   pNode->iNode;. 
13df0 20 20 20 72 63 20 3d 20 6e 6f 64 65 50 61 72 65     rc = nodePare
13e00 6e 74 49 6e 64 65 78 28 70 52 74 72 65 65 2c 20  ntIndex(pRtree, 
13e10 70 4e 6f 64 65 2c 20 26 69 69 29 3b 0a 20 20 20  pNode, &ii);.   
13e20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
13e30 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 6f 64 65  OK ){.      node
13e40 4f 76 65 72 77 72 69 74 65 43 65 6c 6c 28 70 52  OverwriteCell(pR
13e50 74 72 65 65 2c 20 70 50 61 72 65 6e 74 2c 20 26  tree, pParent, &
13e60 62 6f 78 2c 20 69 69 29 3b 0a 20 20 20 20 20 20  box, ii);.      
13e70 72 63 20 3d 20 66 69 78 42 6f 75 6e 64 69 6e 67  rc = fixBounding
13e80 42 6f 78 28 70 52 74 72 65 65 2c 20 70 50 61 72  Box(pRtree, pPar
13e90 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ent);.    }.  }.
13ea0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
13eb0 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
13ec0 20 63 65 6c 6c 20 61 74 20 69 6e 64 65 78 20 69   cell at index i
13ed0 43 65 6c 6c 20 6f 66 20 6e 6f 64 65 20 70 4e 6f  Cell of node pNo
13ee0 64 65 2e 20 41 66 74 65 72 20 72 65 6d 6f 76 69  de. After removi
13ef0 6e 67 20 74 68 65 0a 2a 2a 20 63 65 6c 6c 2c 20  ng the.** cell, 
13f00 61 64 6a 75 73 74 20 74 68 65 20 72 2d 74 72 65  adjust the r-tre
13f10 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
13f20 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f   if required..*/
13f30 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 6c 65  .static int dele
13f40 74 65 43 65 6c 6c 28 52 74 72 65 65 20 2a 70 52  teCell(Rtree *pR
13f50 74 72 65 65 2c 20 52 74 72 65 65 4e 6f 64 65 20  tree, RtreeNode 
13f60 2a 70 4e 6f 64 65 2c 20 69 6e 74 20 69 43 65 6c  *pNode, int iCel
13f70 6c 2c 20 69 6e 74 20 69 48 65 69 67 68 74 29 7b  l, int iHeight){
13f80 0a 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 50  .  RtreeNode *pP
13f90 61 72 65 6e 74 3b 0a 20 20 69 6e 74 20 72 63 3b  arent;.  int rc;
13fa0 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ..  if( SQLITE_O
13fb0 4b 21 3d 28 72 63 20 3d 20 66 69 78 4c 65 61 66  K!=(rc = fixLeaf
13fc0 50 61 72 65 6e 74 28 70 52 74 72 65 65 2c 20 70  Parent(pRtree, p
13fd0 4e 6f 64 65 29 29 20 29 7b 0a 20 20 20 20 72 65  Node)) ){.    re
13fe0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
13ff0 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 63 65  /* Remove the ce
14000 6c 6c 20 66 72 6f 6d 20 74 68 65 20 6e 6f 64 65  ll from the node
14010 2e 20 54 68 69 73 20 63 61 6c 6c 20 6a 75 73 74  . This call just
14020 20 6d 6f 76 65 73 20 62 79 74 65 73 20 61 72 6f   moves bytes aro
14030 75 6e 64 0a 20 20 2a 2a 20 74 68 65 20 69 6e 2d  und.  ** the in-
14040 6d 65 6d 6f 72 79 20 6e 6f 64 65 20 69 6d 61 67  memory node imag
14050 65 2c 20 73 6f 20 69 74 20 63 61 6e 6e 6f 74 20  e, so it cannot 
14060 66 61 69 6c 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 64  fail..  */.  nod
14070 65 44 65 6c 65 74 65 43 65 6c 6c 28 70 52 74 72  eDeleteCell(pRtr
14080 65 65 2c 20 70 4e 6f 64 65 2c 20 69 43 65 6c 6c  ee, pNode, iCell
14090 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
140a0 6e 6f 64 65 20 69 73 20 6e 6f 74 20 74 68 65 20  node is not the 
140b0 74 72 65 65 20 72 6f 6f 74 20 61 6e 64 20 6e 6f  tree root and no
140c0 77 20 68 61 73 20 6c 65 73 73 20 74 68 61 6e 20  w has less than 
140d0 74 68 65 20 6d 69 6e 69 6d 75 6d 0a 20 20 2a 2a  the minimum.  **
140e0 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   number of cells
140f0 2c 20 72 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d  , remove it from
14100 20 74 68 65 20 74 72 65 65 2e 20 4f 74 68 65 72   the tree. Other
14110 77 69 73 65 2c 20 75 70 64 61 74 65 20 74 68 65  wise, update the
14120 0a 20 20 2a 2a 20 63 65 6c 6c 20 69 6e 20 74 68  .  ** cell in th
14130 65 20 70 61 72 65 6e 74 20 6e 6f 64 65 20 73 6f  e parent node so
14140 20 74 68 61 74 20 69 74 20 74 69 67 68 74 6c 79   that it tightly
14150 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 75 70   contains the up
14160 64 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 64 65 2e  dated.  ** node.
14170 0a 20 20 2a 2f 0a 20 20 70 50 61 72 65 6e 74 20  .  */.  pParent 
14180 3d 20 70 4e 6f 64 65 2d 3e 70 50 61 72 65 6e 74  = pNode->pParent
14190 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
141a0 65 6e 74 20 7c 7c 20 70 4e 6f 64 65 2d 3e 69 4e  ent || pNode->iN
141b0 6f 64 65 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20  ode==1 );.  if( 
141c0 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 69  pParent ){.    i
141d0 66 28 20 4e 43 45 4c 4c 28 70 4e 6f 64 65 29 3c  f( NCELL(pNode)<
141e0 52 54 52 45 45 5f 4d 49 4e 43 45 4c 4c 53 28 70  RTREE_MINCELLS(p
141f0 52 74 72 65 65 29 20 29 7b 0a 20 20 20 20 20 20  Rtree) ){.      
14200 72 63 20 3d 20 72 65 6d 6f 76 65 4e 6f 64 65 28  rc = removeNode(
14210 70 52 74 72 65 65 2c 20 70 4e 6f 64 65 2c 20 69  pRtree, pNode, i
14220 48 65 69 67 68 74 29 3b 0a 20 20 20 20 7d 65 6c  Height);.    }el
14230 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  se{.      rc = f
14240 69 78 42 6f 75 6e 64 69 6e 67 42 6f 78 28 70 52  ixBoundingBox(pR
14250 74 72 65 65 2c 20 70 4e 6f 64 65 29 3b 0a 20 20  tree, pNode);.  
14260 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
14270 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  n rc;.}..static 
14280 69 6e 74 20 52 65 69 6e 73 65 72 74 28 0a 20 20  int Reinsert(.  
14290 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c 20 0a  Rtree *pRtree, .
142a0 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 4e 6f    RtreeNode *pNo
142b0 64 65 2c 20 0a 20 20 52 74 72 65 65 43 65 6c 6c  de, .  RtreeCell
142c0 20 2a 70 43 65 6c 6c 2c 20 0a 20 20 69 6e 74 20   *pCell, .  int 
142d0 69 48 65 69 67 68 74 0a 29 7b 0a 20 20 69 6e 74  iHeight.){.  int
142e0 20 2a 61 4f 72 64 65 72 3b 0a 20 20 69 6e 74 20   *aOrder;.  int 
142f0 2a 61 53 70 61 72 65 3b 0a 20 20 52 74 72 65 65  *aSpare;.  Rtree
14300 43 65 6c 6c 20 2a 61 43 65 6c 6c 3b 0a 20 20 52  Cell *aCell;.  R
14310 74 72 65 65 44 56 61 6c 75 65 20 2a 61 44 69 73  treeDValue *aDis
14320 74 61 6e 63 65 3b 0a 20 20 69 6e 74 20 6e 43 65  tance;.  int nCe
14330 6c 6c 3b 0a 20 20 52 74 72 65 65 44 56 61 6c 75  ll;.  RtreeDValu
14340 65 20 61 43 65 6e 74 65 72 43 6f 6f 72 64 5b 52  e aCenterCoord[R
14350 54 52 45 45 5f 4d 41 58 5f 44 49 4d 45 4e 53 49  TREE_MAX_DIMENSI
14360 4f 4e 53 5d 3b 0a 20 20 69 6e 74 20 69 44 69 6d  ONS];.  int iDim
14370 3b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e  ;.  int ii;.  in
14380 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
14390 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 6d 65  ;.  int n;..  me
143a0 6d 73 65 74 28 61 43 65 6e 74 65 72 43 6f 6f 72  mset(aCenterCoor
143b0 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 52 74 72  d, 0, sizeof(Rtr
143c0 65 65 44 56 61 6c 75 65 29 2a 52 54 52 45 45 5f  eeDValue)*RTREE_
143d0 4d 41 58 5f 44 49 4d 45 4e 53 49 4f 4e 53 29 3b  MAX_DIMENSIONS);
143e0 0a 0a 20 20 6e 43 65 6c 6c 20 3d 20 4e 43 45 4c  ..  nCell = NCEL
143f0 4c 28 70 4e 6f 64 65 29 2b 31 3b 0a 20 20 6e 20  L(pNode)+1;.  n 
14400 3d 20 28 6e 43 65 6c 6c 2b 31 29 26 28 7e 31 29  = (nCell+1)&(~1)
14410 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
14420 20 74 68 65 20 62 75 66 66 65 72 73 20 75 73 65   the buffers use
14430 64 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74  d by this operat
14440 69 6f 6e 2e 20 54 68 65 20 61 6c 6c 6f 63 61 74  ion. The allocat
14450 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65 6c 69  ion is.  ** reli
14460 6e 71 75 69 73 68 65 64 20 62 65 66 6f 72 65 20  nquished before 
14470 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
14480 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61 43  turns..  */.  aC
14490 65 6c 6c 20 3d 20 28 52 74 72 65 65 43 65 6c 6c  ell = (RtreeCell
144a0 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
144b0 63 28 6e 20 2a 20 28 0a 20 20 20 20 73 69 7a 65  c(n * (.    size
144c0 6f 66 28 52 74 72 65 65 43 65 6c 6c 29 20 20 20  of(RtreeCell)   
144d0 20 20 2b 20 20 20 20 20 20 20 20 20 2f 2a 20 61    +         /* a
144e0 43 65 6c 6c 20 61 72 72 61 79 20 2a 2f 0a 20 20  Cell array */.  
144f0 20 20 73 69 7a 65 6f 66 28 69 6e 74 29 20 20 20    sizeof(int)   
14500 20 20 20 20 20 20 20 20 2b 20 20 20 20 20 20 20          +       
14510 20 20 2f 2a 20 61 4f 72 64 65 72 20 61 72 72 61    /* aOrder arra
14520 79 20 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28  y */.    sizeof(
14530 69 6e 74 29 20 20 20 20 20 20 20 20 20 20 20 2b  int)           +
14540 20 20 20 20 20 20 20 20 20 2f 2a 20 61 53 70 61           /* aSpa
14550 72 65 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20  re array */.    
14560 73 69 7a 65 6f 66 28 52 74 72 65 65 44 56 61 6c  sizeof(RtreeDVal
14570 75 65 29 20 20 20 20 20 20 20 20 20 20 20 20 20  ue)             
14580 2f 2a 20 61 44 69 73 74 61 6e 63 65 20 61 72 72  /* aDistance arr
14590 61 79 20 2a 2f 0a 20 20 29 29 3b 0a 20 20 69 66  ay */.  ));.  if
145a0 28 20 21 61 43 65 6c 6c 20 29 7b 0a 20 20 20 20  ( !aCell ){.    
145b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
145c0 4d 45 4d 3b 0a 20 20 7d 0a 20 20 61 4f 72 64 65  MEM;.  }.  aOrde
145d0 72 20 20 20 20 3d 20 28 69 6e 74 20 2a 29 26 61  r    = (int *)&a
145e0 43 65 6c 6c 5b 6e 5d 3b 0a 20 20 61 53 70 61 72  Cell[n];.  aSpar
145f0 65 20 20 20 20 3d 20 28 69 6e 74 20 2a 29 26 61  e    = (int *)&a
14600 4f 72 64 65 72 5b 6e 5d 3b 0a 20 20 61 44 69 73  Order[n];.  aDis
14610 74 61 6e 63 65 20 3d 20 28 52 74 72 65 65 44 56  tance = (RtreeDV
14620 61 6c 75 65 20 2a 29 26 61 53 70 61 72 65 5b 6e  alue *)&aSpare[n
14630 5d 3b 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20  ];..  for(ii=0; 
14640 69 69 3c 6e 43 65 6c 6c 3b 20 69 69 2b 2b 29 7b  ii<nCell; ii++){
14650 0a 20 20 20 20 69 66 28 20 69 69 3d 3d 28 6e 43  .    if( ii==(nC
14660 65 6c 6c 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ell-1) ){.      
14670 6d 65 6d 63 70 79 28 26 61 43 65 6c 6c 5b 69 69  memcpy(&aCell[ii
14680 5d 2c 20 70 43 65 6c 6c 2c 20 73 69 7a 65 6f 66  ], pCell, sizeof
14690 28 52 74 72 65 65 43 65 6c 6c 29 29 3b 0a 20 20  (RtreeCell));.  
146a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
146b0 6f 64 65 47 65 74 43 65 6c 6c 28 70 52 74 72 65  odeGetCell(pRtre
146c0 65 2c 20 70 4e 6f 64 65 2c 20 69 69 2c 20 26 61  e, pNode, ii, &a
146d0 43 65 6c 6c 5b 69 69 5d 29 3b 0a 20 20 20 20 7d  Cell[ii]);.    }
146e0 0a 20 20 20 20 61 4f 72 64 65 72 5b 69 69 5d 20  .    aOrder[ii] 
146f0 3d 20 69 69 3b 0a 20 20 20 20 66 6f 72 28 69 44  = ii;.    for(iD
14700 69 6d 3d 30 3b 20 69 44 69 6d 3c 70 52 74 72 65  im=0; iDim<pRtre
14710 65 2d 3e 6e 44 69 6d 3b 20 69 44 69 6d 2b 2b 29  e->nDim; iDim++)
14720 7b 0a 20 20 20 20 20 20 61 43 65 6e 74 65 72 43  {.      aCenterC
14730 6f 6f 72 64 5b 69 44 69 6d 5d 20 2b 3d 20 44 43  oord[iDim] += DC
14740 4f 4f 52 44 28 61 43 65 6c 6c 5b 69 69 5d 2e 61  OORD(aCell[ii].a
14750 43 6f 6f 72 64 5b 69 44 69 6d 2a 32 5d 29 3b 0a  Coord[iDim*2]);.
14760 20 20 20 20 20 20 61 43 65 6e 74 65 72 43 6f 6f        aCenterCoo
14770 72 64 5b 69 44 69 6d 5d 20 2b 3d 20 44 43 4f 4f  rd[iDim] += DCOO
14780 52 44 28 61 43 65 6c 6c 5b 69 69 5d 2e 61 43 6f  RD(aCell[ii].aCo
14790 6f 72 64 5b 69 44 69 6d 2a 32 2b 31 5d 29 3b 0a  ord[iDim*2+1]);.
147a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
147b0 69 44 69 6d 3d 30 3b 20 69 44 69 6d 3c 70 52 74  iDim=0; iDim<pRt
147c0 72 65 65 2d 3e 6e 44 69 6d 3b 20 69 44 69 6d 2b  ree->nDim; iDim+
147d0 2b 29 7b 0a 20 20 20 20 61 43 65 6e 74 65 72 43  +){.    aCenterC
147e0 6f 6f 72 64 5b 69 44 69 6d 5d 20 3d 20 28 61 43  oord[iDim] = (aC
147f0 65 6e 74 65 72 43 6f 6f 72 64 5b 69 44 69 6d 5d  enterCoord[iDim]
14800 2f 28 6e 43 65 6c 6c 2a 28 52 74 72 65 65 44 56  /(nCell*(RtreeDV
14810 61 6c 75 65 29 32 29 29 3b 0a 20 20 7d 0a 0a 20  alue)2));.  }.. 
14820 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 43   for(ii=0; ii<nC
14830 65 6c 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  ell; ii++){.    
14840 61 44 69 73 74 61 6e 63 65 5b 69 69 5d 20 3d 20  aDistance[ii] = 
14850 52 54 52 45 45 5f 5a 45 52 4f 3b 0a 20 20 20 20  RTREE_ZERO;.    
14860 66 6f 72 28 69 44 69 6d 3d 30 3b 20 69 44 69 6d  for(iDim=0; iDim
14870 3c 70 52 74 72 65 65 2d 3e 6e 44 69 6d 3b 20 69  <pRtree->nDim; i
14880 44 69 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 52 74  Dim++){.      Rt
14890 72 65 65 44 56 61 6c 75 65 20 63 6f 6f 72 64 20  reeDValue coord 
148a0 3d 20 28 44 43 4f 4f 52 44 28 61 43 65 6c 6c 5b  = (DCOORD(aCell[
148b0 69 69 5d 2e 61 43 6f 6f 72 64 5b 69 44 69 6d 2a  ii].aCoord[iDim*
148c0 32 2b 31 5d 29 20 2d 20 0a 20 20 20 20 20 20 20  2+1]) - .       
148d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148e0 20 20 20 20 20 20 20 20 44 43 4f 4f 52 44 28 61          DCOORD(a
148f0 43 65 6c 6c 5b 69 69 5d 2e 61 43 6f 6f 72 64 5b  Cell[ii].aCoord[
14900 69 44 69 6d 2a 32 5d 29 29 3b 0a 20 20 20 20 20  iDim*2]));.     
14910 20 61 44 69 73 74 61 6e 63 65 5b 69 69 5d 20 2b   aDistance[ii] +
14920 3d 20 28 63 6f 6f 72 64 2d 61 43 65 6e 74 65 72  = (coord-aCenter
14930 43 6f 6f 72 64 5b 69 44 69 6d 5d 29 2a 28 63 6f  Coord[iDim])*(co
14940 6f 72 64 2d 61 43 65 6e 74 65 72 43 6f 6f 72 64  ord-aCenterCoord
14950 5b 69 44 69 6d 5d 29 3b 0a 20 20 20 20 7d 0a 20  [iDim]);.    }. 
14960 20 7d 0a 0a 20 20 53 6f 72 74 42 79 44 69 73 74   }..  SortByDist
14970 61 6e 63 65 28 61 4f 72 64 65 72 2c 20 6e 43 65  ance(aOrder, nCe
14980 6c 6c 2c 20 61 44 69 73 74 61 6e 63 65 2c 20 61  ll, aDistance, a
14990 53 70 61 72 65 29 3b 0a 20 20 6e 6f 64 65 5a 65  Spare);.  nodeZe
149a0 72 6f 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65  ro(pRtree, pNode
149b0 29 3b 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20  );..  for(ii=0; 
149c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
149d0 20 69 69 3c 28 6e 43 65 6c 6c 2d 28 52 54 52 45   ii<(nCell-(RTRE
149e0 45 5f 4d 49 4e 43 45 4c 4c 53 28 70 52 74 72 65  E_MINCELLS(pRtre
149f0 65 29 2b 31 29 29 3b 20 69 69 2b 2b 29 7b 0a 20  e)+1)); ii++){. 
14a00 20 20 20 52 74 72 65 65 43 65 6c 6c 20 2a 70 20     RtreeCell *p 
14a10 3d 20 26 61 43 65 6c 6c 5b 61 4f 72 64 65 72 5b  = &aCell[aOrder[
14a20 69 69 5d 5d 3b 0a 20 20 20 20 6e 6f 64 65 49 6e  ii]];.    nodeIn
14a30 73 65 72 74 43 65 6c 6c 28 70 52 74 72 65 65 2c  sertCell(pRtree,
14a40 20 70 4e 6f 64 65 2c 20 70 29 3b 0a 20 20 20 20   pNode, p);.    
14a50 69 66 28 20 70 2d 3e 69 52 6f 77 69 64 3d 3d 70  if( p->iRowid==p
14a60 43 65 6c 6c 2d 3e 69 52 6f 77 69 64 20 29 7b 0a  Cell->iRowid ){.
14a70 20 20 20 20 20 20 69 66 28 20 69 48 65 69 67 68        if( iHeigh
14a80 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
14a90 72 63 20 3d 20 72 6f 77 69 64 57 72 69 74 65 28  rc = rowidWrite(
14aa0 70 52 74 72 65 65 2c 20 70 2d 3e 69 52 6f 77 69  pRtree, p->iRowi
14ab0 64 2c 20 70 4e 6f 64 65 2d 3e 69 4e 6f 64 65 29  d, pNode->iNode)
14ac0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
14ad0 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 72 65         rc = pare
14ae0 6e 74 57 72 69 74 65 28 70 52 74 72 65 65 2c 20  ntWrite(pRtree, 
14af0 70 2d 3e 69 52 6f 77 69 64 2c 20 70 4e 6f 64 65  p->iRowid, pNode
14b00 2d 3e 69 4e 6f 64 65 29 3b 0a 20 20 20 20 20 20  ->iNode);.      
14b10 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
14b20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
14b30 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 69 78 42  ){.    rc = fixB
14b40 6f 75 6e 64 69 6e 67 42 6f 78 28 70 52 74 72 65  oundingBox(pRtre
14b50 65 2c 20 70 4e 6f 64 65 29 3b 0a 20 20 7d 0a 20  e, pNode);.  }. 
14b60 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54   for(; rc==SQLIT
14b70 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 43 65 6c 6c  E_OK && ii<nCell
14b80 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20  ; ii++){.    /* 
14b90 46 69 6e 64 20 61 20 6e 6f 64 65 20 74 6f 20 73  Find a node to s
14ba0 74 6f 72 65 20 74 68 69 73 20 63 65 6c 6c 20 69  tore this cell i
14bb0 6e 2e 20 70 4e 6f 64 65 2d 3e 69 4e 6f 64 65 20  n. pNode->iNode 
14bc0 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69  currently contai
14bd0 6e 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 68 65  ns.    ** the he
14be0 69 67 68 74 20 6f 66 20 74 68 65 20 73 75 62 2d  ight of the sub-
14bf0 74 72 65 65 20 68 65 61 64 65 64 20 62 79 20 74  tree headed by t
14c00 68 65 20 63 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a  he cell..    */.
14c10 20 20 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70      RtreeNode *p
14c20 49 6e 73 65 72 74 3b 0a 20 20 20 20 52 74 72 65  Insert;.    Rtre
14c30 65 43 65 6c 6c 20 2a 70 20 3d 20 26 61 43 65 6c  eCell *p = &aCel
14c40 6c 5b 61 4f 72 64 65 72 5b 69 69 5d 5d 3b 0a 20  l[aOrder[ii]];. 
14c50 20 20 20 72 63 20 3d 20 43 68 6f 6f 73 65 4c 65     rc = ChooseLe
14c60 61 66 28 70 52 74 72 65 65 2c 20 70 2c 20 69 48  af(pRtree, p, iH
14c70 65 69 67 68 74 2c 20 26 70 49 6e 73 65 72 74 29  eight, &pInsert)
14c80 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
14c90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
14ca0 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 20 20   int rc2;.      
14cb0 72 63 20 3d 20 72 74 72 65 65 49 6e 73 65 72 74  rc = rtreeInsert
14cc0 43 65 6c 6c 28 70 52 74 72 65 65 2c 20 70 49 6e  Cell(pRtree, pIn
14cd0 73 65 72 74 2c 20 70 2c 20 69 48 65 69 67 68 74  sert, p, iHeight
14ce0 29 3b 0a 20 20 20 20 20 20 72 63 32 20 3d 20 6e  );.      rc2 = n
14cf0 6f 64 65 52 65 6c 65 61 73 65 28 70 52 74 72 65  odeRelease(pRtre
14d00 65 2c 20 70 49 6e 73 65 72 74 29 3b 0a 20 20 20  e, pInsert);.   
14d10 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
14d20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
14d30 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20  rc = rc2;.      
14d40 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73  }.    }.  }..  s
14d50 71 6c 69 74 65 33 5f 66 72 65 65 28 61 43 65 6c  qlite3_free(aCel
14d60 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  l);.  return rc;
14d70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74  .}../*.** Insert
14d80 20 63 65 6c 6c 20 70 43 65 6c 6c 20 69 6e 74 6f   cell pCell into
14d90 20 6e 6f 64 65 20 70 4e 6f 64 65 2e 20 4e 6f 64   node pNode. Nod
14da0 65 20 70 4e 6f 64 65 20 69 73 20 74 68 65 20 68  e pNode is the h
14db0 65 61 64 20 6f 66 20 61 20 0a 2a 2a 20 73 75 62  ead of a .** sub
14dc0 74 72 65 65 20 69 48 65 69 67 68 74 20 68 69 67  tree iHeight hig
14dd0 68 20 28 6c 65 61 66 20 6e 6f 64 65 73 20 68 61  h (leaf nodes ha
14de0 76 65 20 69 48 65 69 67 68 74 3d 3d 30 29 2e 0a  ve iHeight==0)..
14df0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 74  */.static int rt
14e00 72 65 65 49 6e 73 65 72 74 43 65 6c 6c 28 0a 20  reeInsertCell(. 
14e10 20 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c 0a   Rtree *pRtree,.
14e20 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 4e 6f    RtreeNode *pNo
14e30 64 65 2c 0a 20 20 52 74 72 65 65 43 65 6c 6c 20  de,.  RtreeCell 
14e40 2a 70 43 65 6c 6c 2c 0a 20 20 69 6e 74 20 69 48  *pCell,.  int iH
14e50 65 69 67 68 74 0a 29 7b 0a 20 20 69 6e 74 20 72  eight.){.  int r
14e60 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
14e70 20 69 66 28 20 69 48 65 69 67 68 74 3e 30 20 29   if( iHeight>0 )
14e80 7b 0a 20 20 20 20 52 74 72 65 65 4e 6f 64 65 20  {.    RtreeNode 
14e90 2a 70 43 68 69 6c 64 20 3d 20 6e 6f 64 65 48 61  *pChild = nodeHa
14ea0 73 68 4c 6f 6f 6b 75 70 28 70 52 74 72 65 65 2c  shLookup(pRtree,
14eb0 20 70 43 65 6c 6c 2d 3e 69 52 6f 77 69 64 29 3b   pCell->iRowid);
14ec0 0a 20 20 20 20 69 66 28 20 70 43 68 69 6c 64 20  .    if( pChild 
14ed0 29 7b 0a 20 20 20 20 20 20 6e 6f 64 65 52 65 6c  ){.      nodeRel
14ee0 65 61 73 65 28 70 52 74 72 65 65 2c 20 70 43 68  ease(pRtree, pCh
14ef0 69 6c 64 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20  ild->pParent);. 
14f00 20 20 20 20 20 6e 6f 64 65 52 65 66 65 72 65 6e       nodeReferen
14f10 63 65 28 70 4e 6f 64 65 29 3b 0a 20 20 20 20 20  ce(pNode);.     
14f20 20 70 43 68 69 6c 64 2d 3e 70 50 61 72 65 6e 74   pChild->pParent
14f30 20 3d 20 70 4e 6f 64 65 3b 0a 20 20 20 20 7d 0a   = pNode;.    }.
14f40 20 20 7d 0a 20 20 69 66 28 20 6e 6f 64 65 49 6e    }.  if( nodeIn
14f50 73 65 72 74 43 65 6c 6c 28 70 52 74 72 65 65 2c  sertCell(pRtree,
14f60 20 70 4e 6f 64 65 2c 20 70 43 65 6c 6c 29 20 29   pNode, pCell) )
14f70 7b 0a 20 20 20 20 69 66 28 20 69 48 65 69 67 68  {.    if( iHeigh
14f80 74 3c 3d 70 52 74 72 65 65 2d 3e 69 52 65 69 6e  t<=pRtree->iRein
14f90 73 65 72 74 48 65 69 67 68 74 20 7c 7c 20 70 4e  sertHeight || pN
14fa0 6f 64 65 2d 3e 69 4e 6f 64 65 3d 3d 31 29 7b 0a  ode->iNode==1){.
14fb0 20 20 20 20 20 20 72 63 20 3d 20 53 70 6c 69 74        rc = Split
14fc0 4e 6f 64 65 28 70 52 74 72 65 65 2c 20 70 4e 6f  Node(pRtree, pNo
14fd0 64 65 2c 20 70 43 65 6c 6c 2c 20 69 48 65 69 67  de, pCell, iHeig
14fe0 68 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ht);.    }else{.
14ff0 20 20 20 20 20 20 70 52 74 72 65 65 2d 3e 69 52        pRtree->iR
15000 65 69 6e 73 65 72 74 48 65 69 67 68 74 20 3d 20  einsertHeight = 
15010 69 48 65 69 67 68 74 3b 0a 20 20 20 20 20 20 72  iHeight;.      r
15020 63 20 3d 20 52 65 69 6e 73 65 72 74 28 70 52 74  c = Reinsert(pRt
15030 72 65 65 2c 20 70 4e 6f 64 65 2c 20 70 43 65 6c  ree, pNode, pCel
15040 6c 2c 20 69 48 65 69 67 68 74 29 3b 0a 20 20 20  l, iHeight);.   
15050 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
15060 72 63 20 3d 20 41 64 6a 75 73 74 54 72 65 65 28  rc = AdjustTree(
15070 70 52 74 72 65 65 2c 20 70 4e 6f 64 65 2c 20 70  pRtree, pNode, p
15080 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72  Cell);.    if( r
15090 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
150a0 20 20 20 20 20 20 69 66 28 20 69 48 65 69 67 68        if( iHeigh
150b0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
150c0 72 63 20 3d 20 72 6f 77 69 64 57 72 69 74 65 28  rc = rowidWrite(
150d0 70 52 74 72 65 65 2c 20 70 43 65 6c 6c 2d 3e 69  pRtree, pCell->i
150e0 52 6f 77 69 64 2c 20 70 4e 6f 64 65 2d 3e 69 4e  Rowid, pNode->iN
150f0 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ode);.      }els
15100 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
15110 70 61 72 65 6e 74 57 72 69 74 65 28 70 52 74 72  parentWrite(pRtr
15120 65 65 2c 20 70 43 65 6c 6c 2d 3e 69 52 6f 77 69  ee, pCell->iRowi
15130 64 2c 20 70 4e 6f 64 65 2d 3e 69 4e 6f 64 65 29  d, pNode->iNode)
15140 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
15150 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
15160 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .}..static int r
15170 65 69 6e 73 65 72 74 4e 6f 64 65 43 6f 6e 74 65  einsertNodeConte
15180 6e 74 28 52 74 72 65 65 20 2a 70 52 74 72 65 65  nt(Rtree *pRtree
15190 2c 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 4e 6f  , RtreeNode *pNo
151a0 64 65 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20  de){.  int ii;. 
151b0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
151c0 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  _OK;.  int nCell
151d0 20 3d 20 4e 43 45 4c 4c 28 70 4e 6f 64 65 29 3b   = NCELL(pNode);
151e0 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 72 63  ..  for(ii=0; rc
151f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
15200 69 3c 6e 43 65 6c 6c 3b 20 69 69 2b 2b 29 7b 0a  i<nCell; ii++){.
15210 20 20 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70      RtreeNode *p
15220 49 6e 73 65 72 74 3b 0a 20 20 20 20 52 74 72 65  Insert;.    Rtre
15230 65 43 65 6c 6c 20 63 65 6c 6c 3b 0a 20 20 20 20  eCell cell;.    
15240 6e 6f 64 65 47 65 74 43 65 6c 6c 28 70 52 74 72  nodeGetCell(pRtr
15250 65 65 2c 20 70 4e 6f 64 65 2c 20 69 69 2c 20 26  ee, pNode, ii, &
15260 63 65 6c 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 46  cell);..    /* F
15270 69 6e 64 20 61 20 6e 6f 64 65 20 74 6f 20 73 74  ind a node to st
15280 6f 72 65 20 74 68 69 73 20 63 65 6c 6c 20 69 6e  ore this cell in
15290 2e 20 70 4e 6f 64 65 2d 3e 69 4e 6f 64 65 20 63  . pNode->iNode c
152a0 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e  urrently contain
152b0 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 68 65 69  s.    ** the hei
152c0 67 68 74 20 6f 66 20 74 68 65 20 73 75 62 2d 74  ght of the sub-t
152d0 72 65 65 20 68 65 61 64 65 64 20 62 79 20 74 68  ree headed by th
152e0 65 20 63 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20  e cell..    */. 
152f0 20 20 20 72 63 20 3d 20 43 68 6f 6f 73 65 4c 65     rc = ChooseLe
15300 61 66 28 70 52 74 72 65 65 2c 20 26 63 65 6c 6c  af(pRtree, &cell
15310 2c 20 28 69 6e 74 29 70 4e 6f 64 65 2d 3e 69 4e  , (int)pNode->iN
15320 6f 64 65 2c 20 26 70 49 6e 73 65 72 74 29 3b 0a  ode, &pInsert);.
15330 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
15340 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
15350 6e 74 20 72 63 32 3b 0a 20 20 20 20 20 20 72 63  nt rc2;.      rc
15360 20 3d 20 72 74 72 65 65 49 6e 73 65 72 74 43 65   = rtreeInsertCe
15370 6c 6c 28 70 52 74 72 65 65 2c 20 70 49 6e 73 65  ll(pRtree, pInse
15380 72 74 2c 20 26 63 65 6c 6c 2c 20 28 69 6e 74 29  rt, &cell, (int)
15390 70 4e 6f 64 65 2d 3e 69 4e 6f 64 65 29 3b 0a 20  pNode->iNode);. 
153a0 20 20 20 20 20 72 63 32 20 3d 20 6e 6f 64 65 52       rc2 = nodeR
153b0 65 6c 65 61 73 65 28 70 52 74 72 65 65 2c 20 70  elease(pRtree, p
153c0 49 6e 73 65 72 74 29 3b 0a 20 20 20 20 20 20 69  Insert);.      i
153d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
153e0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
153f0 20 72 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20   rc2;.      }.  
15400 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
15410 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65   rc;.}../*.** Se
15420 6c 65 63 74 20 61 20 63 75 72 72 65 6e 74 6c 79  lect a currently
15430 20 75 6e 75 73 65 64 20 72 6f 77 69 64 20 66 6f   unused rowid fo
15440 72 20 61 20 6e 65 77 20 72 2d 74 72 65 65 20 72  r a new r-tree r
15450 65 63 6f 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ecord..*/.static
15460 20 69 6e 74 20 6e 65 77 52 6f 77 69 64 28 52 74   int newRowid(Rt
15470 72 65 65 20 2a 70 52 74 72 65 65 2c 20 69 36 34  ree *pRtree, i64
15480 20 2a 70 69 52 6f 77 69 64 29 7b 0a 20 20 69 6e   *piRowid){.  in
15490 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f  t rc;.  sqlite3_
154a0 62 69 6e 64 5f 6e 75 6c 6c 28 70 52 74 72 65 65  bind_null(pRtree
154b0 2d 3e 70 57 72 69 74 65 52 6f 77 69 64 2c 20 31  ->pWriteRowid, 1
154c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  );.  sqlite3_bin
154d0 64 5f 6e 75 6c 6c 28 70 52 74 72 65 65 2d 3e 70  d_null(pRtree->p
154e0 57 72 69 74 65 52 6f 77 69 64 2c 20 32 29 3b 0a  WriteRowid, 2);.
154f0 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70    sqlite3_step(p
15500 52 74 72 65 65 2d 3e 70 57 72 69 74 65 52 6f 77  Rtree->pWriteRow
15510 69 64 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  id);.  rc = sqli
15520 74 65 33 5f 72 65 73 65 74 28 70 52 74 72 65 65  te3_reset(pRtree
15530 2d 3e 70 57 72 69 74 65 52 6f 77 69 64 29 3b 0a  ->pWriteRowid);.
15540 20 20 2a 70 69 52 6f 77 69 64 20 3d 20 73 71 6c    *piRowid = sql
15550 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74  ite3_last_insert
15560 5f 72 6f 77 69 64 28 70 52 74 72 65 65 2d 3e 64  _rowid(pRtree->d
15570 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  b);.  return rc;
15580 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
15590 20 74 68 65 20 65 6e 74 72 79 20 77 69 74 68 20   the entry with 
155a0 72 6f 77 69 64 3d 69 44 65 6c 65 74 65 20 66 72  rowid=iDelete fr
155b0 6f 6d 20 74 68 65 20 72 2d 74 72 65 65 20 73 74  om the r-tree st
155c0 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
155d0 69 63 20 69 6e 74 20 72 74 72 65 65 44 65 6c 65  ic int rtreeDele
155e0 74 65 52 6f 77 69 64 28 52 74 72 65 65 20 2a 70  teRowid(Rtree *p
155f0 52 74 72 65 65 2c 20 73 71 6c 69 74 65 33 5f 69  Rtree, sqlite3_i
15600 6e 74 36 34 20 69 44 65 6c 65 74 65 29 7b 0a 20  nt64 iDelete){. 
15610 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
15620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15630 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
15640 2a 2f 0a 20 20 52 74 72 65 65 4e 6f 64 65 20 2a  */.  RtreeNode *
15650 70 4c 65 61 66 20 3d 20 30 3b 20 20 20 20 20 20  pLeaf = 0;      
15660 20 20 20 20 20 2f 2a 20 4c 65 61 66 20 6e 6f 64       /* Leaf nod
15670 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 72 65 63  e containing rec
15680 6f 72 64 20 69 44 65 6c 65 74 65 20 2a 2f 0a 20  ord iDelete */. 
15690 20 69 6e 74 20 69 43 65 6c 6c 3b 20 20 20 20 20   int iCell;     
156a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156b0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 69 44 65   /* Index of iDe
156c0 6c 65 74 65 20 63 65 6c 6c 20 69 6e 20 70 4c 65  lete cell in pLe
156d0 61 66 20 2a 2f 0a 20 20 52 74 72 65 65 4e 6f 64  af */.  RtreeNod
156e0 65 20 2a 70 52 6f 6f 74 20 3d 20 30 3b 20 20 20  e *pRoot = 0;   
156f0 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
15700 6e 6f 64 65 20 6f 66 20 72 74 72 65 65 20 73 74  node of rtree st
15710 72 75 63 74 75 72 65 20 2a 2f 0a 0a 0a 20 20 2f  ructure */...  /
15720 2a 20 4f 62 74 61 69 6e 20 61 20 72 65 66 65 72  * Obtain a refer
15730 65 6e 63 65 20 74 6f 20 74 68 65 20 72 6f 6f 74  ence to the root
15740 20 6e 6f 64 65 20 74 6f 20 69 6e 69 74 69 61 6c   node to initial
15750 69 7a 65 20 52 74 72 65 65 2e 69 44 65 70 74 68  ize Rtree.iDepth
15760 20 2a 2f 0a 20 20 72 63 20 3d 20 6e 6f 64 65 41   */.  rc = nodeA
15770 63 71 75 69 72 65 28 70 52 74 72 65 65 2c 20 31  cquire(pRtree, 1
15780 2c 20 30 2c 20 26 70 52 6f 6f 74 29 3b 0a 0a 20  , 0, &pRoot);.. 
15790 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20 72 65 66   /* Obtain a ref
157a0 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6c 65  erence to the le
157b0 61 66 20 6e 6f 64 65 20 74 68 61 74 20 63 6f 6e  af node that con
157c0 74 61 69 6e 73 20 74 68 65 20 65 6e 74 72 79 20  tains the entry 
157d0 0a 20 20 2a 2a 20 61 62 6f 75 74 20 74 6f 20 62  .  ** about to b
157e0 65 20 64 65 6c 65 74 65 64 2e 20 0a 20 20 2a 2f  e deleted. .  */
157f0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
15800 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
15810 20 66 69 6e 64 4c 65 61 66 4e 6f 64 65 28 70 52   findLeafNode(pR
15820 74 72 65 65 2c 20 69 44 65 6c 65 74 65 2c 20 26  tree, iDelete, &
15830 70 4c 65 61 66 2c 20 30 29 3b 0a 20 20 7d 0a 0a  pLeaf, 0);.  }..
15840 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
15850 63 65 6c 6c 20 69 6e 20 71 75 65 73 74 69 6f 6e  cell in question
15860 20 66 72 6f 6d 20 74 68 65 20 6c 65 61 66 20 6e   from the leaf n
15870 6f 64 65 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63  ode. */.  if( rc
15880 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
15890 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20     int rc2;.    
158a0 72 63 20 3d 20 6e 6f 64 65 52 6f 77 69 64 49 6e  rc = nodeRowidIn
158b0 64 65 78 28 70 52 74 72 65 65 2c 20 70 4c 65 61  dex(pRtree, pLea
158c0 66 2c 20 69 44 65 6c 65 74 65 2c 20 26 69 43 65  f, iDelete, &iCe
158d0 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ll);.    if( rc=
158e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
158f0 20 20 20 20 72 63 20 3d 20 64 65 6c 65 74 65 43      rc = deleteC
15900 65 6c 6c 28 70 52 74 72 65 65 2c 20 70 4c 65 61  ell(pRtree, pLea
15910 66 2c 20 69 43 65 6c 6c 2c 20 30 29 3b 0a 20 20  f, iCell, 0);.  
15920 20 20 7d 0a 20 20 20 20 72 63 32 20 3d 20 6e 6f    }.    rc2 = no
15930 64 65 52 65 6c 65 61 73 65 28 70 52 74 72 65 65  deRelease(pRtree
15940 2c 20 70 4c 65 61 66 29 3b 0a 20 20 20 20 69 66  , pLeaf);.    if
15950 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
15960 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63  ){.      rc = rc
15970 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  2;.    }.  }..  
15980 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 63 6f  /* Delete the co
15990 72 72 65 73 70 6f 6e 64 69 6e 67 20 65 6e 74 72  rresponding entr
159a0 79 20 69 6e 20 74 68 65 20 3c 72 74 72 65 65 3e  y in the <rtree>
159b0 5f 72 6f 77 69 64 20 74 61 62 6c 65 2e 20 2a 2f  _rowid table. */
159c0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
159d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
159e0 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
159f0 52 74 72 65 65 2d 3e 70 44 65 6c 65 74 65 52 6f  Rtree->pDeleteRo
15a00 77 69 64 2c 20 31 2c 20 69 44 65 6c 65 74 65 29  wid, 1, iDelete)
15a10 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  ;.    sqlite3_st
15a20 65 70 28 70 52 74 72 65 65 2d 3e 70 44 65 6c 65  ep(pRtree->pDele
15a30 74 65 52 6f 77 69 64 29 3b 0a 20 20 20 20 72 63  teRowid);.    rc
15a40 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
15a50 28 70 52 74 72 65 65 2d 3e 70 44 65 6c 65 74 65  (pRtree->pDelete
15a60 52 6f 77 69 64 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Rowid);.  }..  /
15a70 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 72  * Check if the r
15a80 6f 6f 74 20 6e 6f 64 65 20 6e 6f 77 20 68 61 73  oot node now has
15a90 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 63 68 69   exactly one chi
15aa0 6c 64 2e 20 49 66 20 73 6f 2c 20 72 65 6d 6f 76  ld. If so, remov
15ab0 65 0a 20 20 2a 2a 20 69 74 2c 20 73 63 68 65 64  e.  ** it, sched
15ac0 75 6c 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ule the contents
15ad0 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 66 6f   of the child fo
15ae0 72 20 72 65 69 6e 73 65 72 74 69 6f 6e 20 61 6e  r reinsertion an
15af0 64 20 0a 20 20 2a 2a 20 72 65 64 75 63 65 20 74  d .  ** reduce t
15b00 68 65 20 74 72 65 65 20 68 65 69 67 68 74 20 62  he tree height b
15b10 79 20 6f 6e 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  y one..  **.  **
15b20 20 54 68 69 73 20 69 73 20 65 71 75 69 76 61 6c   This is equival
15b30 65 6e 74 20 74 6f 20 63 6f 70 79 69 6e 67 20 74  ent to copying t
15b40 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
15b50 68 65 20 63 68 69 6c 64 20 69 6e 74 6f 0a 20 20  he child into.  
15b60 2a 2a 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65  ** the root node
15b70 20 28 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20   (the operation 
15b80 74 68 61 74 20 47 75 74 6d 61 6e 27 73 20 70 61  that Gutman's pa
15b90 70 65 72 20 73 61 79 73 20 74 6f 20 70 65 72 66  per says to perf
15ba0 6f 72 6d 20 0a 20 20 2a 2a 20 69 6e 20 74 68 69  orm .  ** in thi
15bb0 73 20 73 63 65 6e 61 72 69 6f 29 2e 0a 20 20 2a  s scenario)..  *
15bc0 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
15bd0 54 45 5f 4f 4b 20 26 26 20 70 52 74 72 65 65 2d  TE_OK && pRtree-
15be0 3e 69 44 65 70 74 68 3e 30 20 26 26 20 4e 43 45  >iDepth>0 && NCE
15bf0 4c 4c 28 70 52 6f 6f 74 29 3d 3d 31 20 29 7b 0a  LL(pRoot)==1 ){.
15c00 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20      int rc2;.   
15c10 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 43 68 69   RtreeNode *pChi
15c20 6c 64 20 3d 20 30 3b 0a 20 20 20 20 69 36 34 20  ld = 0;.    i64 
15c30 69 43 68 69 6c 64 20 3d 20 6e 6f 64 65 47 65 74  iChild = nodeGet
15c40 52 6f 77 69 64 28 70 52 74 72 65 65 2c 20 70 52  Rowid(pRtree, pR
15c50 6f 6f 74 2c 20 30 29 3b 0a 20 20 20 20 72 63 20  oot, 0);.    rc 
15c60 3d 20 6e 6f 64 65 41 63 71 75 69 72 65 28 70 52  = nodeAcquire(pR
15c70 74 72 65 65 2c 20 69 43 68 69 6c 64 2c 20 70 52  tree, iChild, pR
15c80 6f 6f 74 2c 20 26 70 43 68 69 6c 64 29 3b 0a 20  oot, &pChild);. 
15c90 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
15ca0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
15cb0 20 3d 20 72 65 6d 6f 76 65 4e 6f 64 65 28 70 52   = removeNode(pR
15cc0 74 72 65 65 2c 20 70 43 68 69 6c 64 2c 20 70 52  tree, pChild, pR
15cd0 74 72 65 65 2d 3e 69 44 65 70 74 68 2d 31 29 3b  tree->iDepth-1);
15ce0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 32 20 3d  .    }.    rc2 =
15cf0 20 6e 6f 64 65 52 65 6c 65 61 73 65 28 70 52 74   nodeRelease(pRt
15d00 72 65 65 2c 20 70 43 68 69 6c 64 29 3b 0a 20 20  ree, pChild);.  
15d10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
15d20 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a  _OK ) rc = rc2;.
15d30 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
15d40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
15d50 52 74 72 65 65 2d 3e 69 44 65 70 74 68 2d 2d 3b  Rtree->iDepth--;
15d60 0a 20 20 20 20 20 20 77 72 69 74 65 49 6e 74 31  .      writeInt1
15d70 36 28 70 52 6f 6f 74 2d 3e 7a 44 61 74 61 2c 20  6(pRoot->zData, 
15d80 70 52 74 72 65 65 2d 3e 69 44 65 70 74 68 29 3b  pRtree->iDepth);
15d90 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 69 73  .      pRoot->is
15da0 44 69 72 74 79 20 3d 20 31 3b 0a 20 20 20 20 7d  Dirty = 1;.    }
15db0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 2d 69 6e  .  }..  /* Re-in
15dc0 73 65 72 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  sert the content
15dd0 73 20 6f 66 20 61 6e 79 20 75 6e 64 65 72 66 75  s of any underfu
15de0 6c 6c 20 6e 6f 64 65 73 20 72 65 6d 6f 76 65 64  ll nodes removed
15df0 20 66 72 6f 6d 20 74 68 65 20 74 72 65 65 2e 20   from the tree. 
15e00 2a 2f 0a 20 20 66 6f 72 28 70 4c 65 61 66 3d 70  */.  for(pLeaf=p
15e10 52 74 72 65 65 2d 3e 70 44 65 6c 65 74 65 64 3b  Rtree->pDeleted;
15e20 20 70 4c 65 61 66 3b 20 70 4c 65 61 66 3d 70 52   pLeaf; pLeaf=pR
15e30 74 72 65 65 2d 3e 70 44 65 6c 65 74 65 64 29 7b  tree->pDeleted){
15e40 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
15e50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
15e60 72 63 20 3d 20 72 65 69 6e 73 65 72 74 4e 6f 64  rc = reinsertNod
15e70 65 43 6f 6e 74 65 6e 74 28 70 52 74 72 65 65 2c  eContent(pRtree,
15e80 20 70 4c 65 61 66 29 3b 0a 20 20 20 20 7d 0a 20   pLeaf);.    }. 
15e90 20 20 20 70 52 74 72 65 65 2d 3e 70 44 65 6c 65     pRtree->pDele
15ea0 74 65 64 20 3d 20 70 4c 65 61 66 2d 3e 70 4e 65  ted = pLeaf->pNe
15eb0 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  xt;.    sqlite3_
15ec0 66 72 65 65 28 70 4c 65 61 66 29 3b 0a 20 20 7d  free(pLeaf);.  }
15ed0 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74  ..  /* Release t
15ee0 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  he reference to 
15ef0 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2e 20 2a  the root node. *
15f00 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
15f10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
15f20 3d 20 6e 6f 64 65 52 65 6c 65 61 73 65 28 70 52  = nodeRelease(pR
15f30 74 72 65 65 2c 20 70 52 6f 6f 74 29 3b 0a 20 20  tree, pRoot);.  
15f40 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 6f 64 65 52  }else{.    nodeR
15f50 65 6c 65 61 73 65 28 70 52 74 72 65 65 2c 20 70  elease(pRtree, p
15f60 52 6f 6f 74 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  Root);.  }..  re
15f70 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
15f80 2a 20 52 6f 75 6e 64 69 6e 67 20 63 6f 6e 73 74  * Rounding const
15f90 61 6e 74 73 20 66 6f 72 20 66 6c 6f 61 74 2d 3e  ants for float->
15fa0 64 6f 75 62 6c 65 20 63 6f 6e 76 65 72 73 69 6f  double conversio
15fb0 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 52 4e  n..*/.#define RN
15fc0 44 54 4f 57 41 52 44 53 20 20 28 31 2e 30 20 2d  DTOWARDS  (1.0 -
15fd0 20 31 2e 30 2f 38 33 38 38 36 30 38 2e 30 29 20   1.0/8388608.0) 
15fe0 20 2f 2a 20 52 6f 75 6e 64 20 74 6f 77 61 72 64   /* Round toward
15ff0 73 20 7a 65 72 6f 20 2a 2f 0a 23 64 65 66 69 6e  s zero */.#defin
16000 65 20 52 4e 44 41 57 41 59 20 20 20 20 20 28 31  e RNDAWAY     (1
16010 2e 30 20 2b 20 31 2e 30 2f 38 33 38 38 36 30 38  .0 + 1.0/8388608
16020 2e 30 29 20 20 2f 2a 20 52 6f 75 6e 64 20 61 77  .0)  /* Round aw
16030 61 79 20 66 72 6f 6d 20 7a 65 72 6f 20 2a 2f 0a  ay from zero */.
16040 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
16050 4c 49 54 45 5f 52 54 52 45 45 5f 49 4e 54 5f 4f  LITE_RTREE_INT_O
16060 4e 4c 59 29 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  NLY)./*.** Conve
16070 72 74 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61  rt an sqlite3_va
16080 6c 75 65 20 69 6e 74 6f 20 61 6e 20 52 74 72 65  lue into an Rtre
16090 65 56 61 6c 75 65 20 28 70 72 65 73 75 6d 61 62  eValue (presumab
160a0 6c 79 20 61 20 66 6c 6f 61 74 29 0a 2a 2a 20 77  ly a float).** w
160b0 68 69 6c 65 20 74 61 6b 69 6e 67 20 63 61 72 65  hile taking care
160c0 20 74 6f 20 72 6f 75 6e 64 20 74 6f 77 61 72 64   to round toward
160d0 20 6e 65 67 61 74 69 76 65 20 6f 72 20 70 6f 73   negative or pos
160e0 69 74 69 76 65 2c 20 72 65 73 70 65 63 74 69 76  itive, respectiv
160f0 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 52  ely..*/.static R
16100 74 72 65 65 56 61 6c 75 65 20 72 74 72 65 65 56  treeValue rtreeV
16110 61 6c 75 65 44 6f 77 6e 28 73 71 6c 69 74 65 33  alueDown(sqlite3
16120 5f 76 61 6c 75 65 20 2a 76 29 7b 0a 20 20 64 6f  _value *v){.  do
16130 75 62 6c 65 20 64 20 3d 20 73 71 6c 69 74 65 33  uble d = sqlite3
16140 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 76 29  _value_double(v)
16150 3b 0a 20 20 66 6c 6f 61 74 20 66 20 3d 20 28 66  ;.  float f = (f
16160 6c 6f 61 74 29 64 3b 0a 20 20 69 66 28 20 66 3e  loat)d;.  if( f>
16170 64 20 29 7b 0a 20 20 20 20 66 20 3d 20 28 66 6c  d ){.    f = (fl
16180 6f 61 74 29 28 64 2a 28 64 3c 30 20 3f 20 52 4e  oat)(d*(d<0 ? RN
16190 44 41 57 41 59 20 3a 20 52 4e 44 54 4f 57 41 52  DAWAY : RNDTOWAR
161a0 44 53 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  DS));.  }.  retu
161b0 72 6e 20 66 3b 0a 7d 0a 73 74 61 74 69 63 20 52  rn f;.}.static R
161c0 74 72 65 65 56 61 6c 75 65 20 72 74 72 65 65 56  treeValue rtreeV
161d0 61 6c 75 65 55 70 28 73 71 6c 69 74 65 33 5f 76  alueUp(sqlite3_v
161e0 61 6c 75 65 20 2a 76 29 7b 0a 20 20 64 6f 75 62  alue *v){.  doub
161f0 6c 65 20 64 20 3d 20 73 71 6c 69 74 65 33 5f 76  le d = sqlite3_v
16200 61 6c 75 65 5f 64 6f 75 62 6c 65 28 76 29 3b 0a  alue_double(v);.
16210 20 20 66 6c 6f 61 74 20 66 20 3d 20 28 66 6c 6f    float f = (flo
16220 61 74 29 64 3b 0a 20 20 69 66 28 20 66 3c 64 20  at)d;.  if( f<d 
16230 29 7b 0a 20 20 20 20 66 20 3d 20 28 66 6c 6f 61  ){.    f = (floa
16240 74 29 28 64 2a 28 64 3c 30 20 3f 20 52 4e 44 54  t)(d*(d<0 ? RNDT
16250 4f 57 41 52 44 53 20 3a 20 52 4e 44 41 57 41 59  OWARDS : RNDAWAY
16260 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ));.  }.  return
16270 20 66 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   f;.}.#endif /* 
16280 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
16290 52 54 52 45 45 5f 49 4e 54 5f 4f 4e 4c 59 29 20  RTREE_INT_ONLY) 
162a0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 6f 6e 73  */../*.** A cons
162b0 74 72 61 69 6e 74 20 68 61 73 20 66 61 69 6c 65  traint has faile
162c0 64 20 77 68 69 6c 65 20 69 6e 73 65 72 74 69 6e  d while insertin
162d0 67 20 61 20 72 6f 77 20 69 6e 74 6f 20 61 6e 20  g a row into an 
162e0 72 74 72 65 65 20 74 61 62 6c 65 2e 20 0a 2a 2a  rtree table. .**
162f0 20 41 73 73 75 6d 69 6e 67 20 6e 6f 20 4f 4f 4d   Assuming no OOM
16300 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
16310 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74  his function set
16320 73 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  s the error mess
16330 61 67 65 20 0a 2a 2a 20 28 61 74 20 70 52 74 72  age .** (at pRtr
16340 65 65 2d 3e 62 61 73 65 2e 7a 45 72 72 4d 73 67  ee->base.zErrMsg
16350 29 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 69  ) to an appropri
16360 61 74 65 20 76 61 6c 75 65 20 61 6e 64 20 72 65  ate value and re
16370 74 75 72 6e 73 0a 2a 2a 20 53 51 4c 49 54 45 5f  turns.** SQLITE_
16380 43 4f 4e 53 54 52 41 49 4e 54 2e 0a 2a 2a 0a 2a  CONSTRAINT..**.*
16390 2a 20 50 61 72 61 6d 65 74 65 72 20 69 43 6f 6c  * Parameter iCol
163a0 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66   is the index of
163b0 20 74 68 65 20 6c 65 66 74 6d 6f 73 74 20 63 6f   the leftmost co
163c0 6c 75 6d 6e 20 69 6e 76 6f 6c 76 65 64 20 69 6e  lumn involved in
163d0 20 74 68 65 0a 2a 2a 20 63 6f 6e 73 74 72 61 69   the.** constrai
163e0 6e 74 20 66 61 69 6c 75 72 65 2e 20 49 66 20 69  nt failure. If i
163f0 74 20 69 73 20 30 2c 20 74 68 65 6e 20 74 68 65  t is 0, then the
16400 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 61 74   constraint that
16410 20 66 61 69 6c 65 64 20 69 73 0a 2a 2a 20 74 68   failed is.** th
16420 65 20 75 6e 69 71 75 65 20 63 6f 6e 73 74 72 61  e unique constra
16430 69 6e 74 20 6f 6e 20 74 68 65 20 69 64 20 63 6f  int on the id co
16440 6c 75 6d 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c  lumn. Otherwise,
16450 20 69 74 20 69 73 20 74 68 65 20 72 74 72 65 65   it is the rtree
16460 0a 2a 2a 20 28 63 31 3c 3d 63 32 29 20 63 6f 6e  .** (c1<=c2) con
16470 73 74 72 61 69 6e 74 20 6f 6e 20 63 6f 6c 75 6d  straint on colum
16480 6e 73 20 69 43 6f 6c 20 61 6e 64 20 69 43 6f 6c  ns iCol and iCol
16490 2b 31 20 74 68 61 74 20 68 61 73 20 66 61 69 6c  +1 that has fail
164a0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
164b0 4f 4f 4d 20 6f 63 63 75 72 73 2c 20 53 51 4c 49  OOM occurs, SQLI
164c0 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75  TE_NOMEM is retu
164d0 72 6e 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20  rned instead of 
164e0 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
164f0 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  T..*/.static int
16500 20 72 74 72 65 65 43 6f 6e 73 74 72 61 69 6e 74   rtreeConstraint
16510 45 72 72 6f 72 28 52 74 72 65 65 20 2a 70 52 74  Error(Rtree *pRt
16520 72 65 65 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a  ree, int iCol){.
16530 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
16540 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61  pStmt = 0;.  cha
16550 72 20 2a 7a 53 71 6c 3b 20 0a 20 20 69 6e 74 20  r *zSql; .  int 
16560 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  rc;..  assert( i
16570 43 6f 6c 3d 3d 30 20 7c 7c 20 69 43 6f 6c 25 32  Col==0 || iCol%2
16580 20 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c   );.  zSql = sql
16590 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45  ite3_mprintf("SE
165a0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 25 51 2e 25  LECT * FROM %Q.%
165b0 51 22 2c 20 70 52 74 72 65 65 2d 3e 7a 44 62 2c  Q", pRtree->zDb,
165c0 20 70 52 74 72 65 65 2d 3e 7a 4e 61 6d 65 29 3b   pRtree->zName);
165d0 0a 20 20 69 66 28 20 7a 53 71 6c 20 29 7b 0a 20  .  if( zSql ){. 
165e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
165f0 70 72 65 70 61 72 65 5f 76 32 28 70 52 74 72 65  prepare_v2(pRtre
16600 65 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  e->db, zSql, -1,
16610 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 7d   &pStmt, 0);.  }
16620 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53  else{.    rc = S
16630 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
16640 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
16650 7a 53 71 6c 29 3b 0a 0a 20 20 69 66 28 20 72 63  zSql);..  if( rc
16660 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
16670 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 30 20 29     if( iCol==0 )
16680 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
16690 61 72 20 2a 7a 43 6f 6c 20 3d 20 73 71 6c 69 74  ar *zCol = sqlit
166a0 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70  e3_column_name(p
166b0 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  Stmt, 0);.      
166c0 70 52 74 72 65 65 2d 3e 62 61 73 65 2e 7a 45 72  pRtree->base.zEr
166d0 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rMsg = sqlite3_m
166e0 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
166f0 20 20 22 55 4e 49 51 55 45 20 63 6f 6e 73 74 72    "UNIQUE constr
16700 61 69 6e 74 20 66 61 69 6c 65 64 3a 20 25 73 2e  aint failed: %s.
16710 25 73 22 2c 20 70 52 74 72 65 65 2d 3e 7a 4e 61  %s", pRtree->zNa
16720 6d 65 2c 20 7a 43 6f 6c 0a 20 20 20 20 20 20 29  me, zCol.      )
16730 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
16740 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
16750 43 6f 6c 31 20 3d 20 73 71 6c 69 74 65 33 5f 63  Col1 = sqlite3_c
16760 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74  olumn_name(pStmt
16770 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 63  , iCol);.      c
16780 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 32  onst char *zCol2
16790 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
167a0 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20 69 43  n_name(pStmt, iC
167b0 6f 6c 2b 31 29 3b 0a 20 20 20 20 20 20 70 52 74  ol+1);.      pRt
167c0 72 65 65 2d 3e 62 61 73 65 2e 7a 45 72 72 4d 73  ree->base.zErrMs
167d0 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
167e0 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 22  ntf(.          "
167f0 72 74 72 65 65 20 63 6f 6e 73 74 72 61 69 6e 74  rtree constraint
16800 20 66 61 69 6c 65 64 3a 20 25 73 2e 28 25 73 3c   failed: %s.(%s<
16810 3d 25 73 29 22 2c 20 70 52 74 72 65 65 2d 3e 7a  =%s)", pRtree->z
16820 4e 61 6d 65 2c 20 7a 43 6f 6c 31 2c 20 7a 43 6f  Name, zCol1, zCo
16830 6c 32 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  l2.      );.    
16840 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  }.  }..  sqlite3
16850 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
16860 3b 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  ;.  return (rc==
16870 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 53 51 4c 49  SQLITE_OK ? SQLI
16880 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 3a 20  TE_CONSTRAINT : 
16890 72 63 29 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20  rc);.}..../*.** 
168a0 54 68 65 20 78 55 70 64 61 74 65 20 6d 65 74 68  The xUpdate meth
168b0 6f 64 20 66 6f 72 20 72 74 72 65 65 20 6d 6f 64  od for rtree mod
168c0 75 6c 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ule virtual tabl
168d0 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
168e0 74 20 72 74 72 65 65 55 70 64 61 74 65 28 0a 20  t rtreeUpdate(. 
168f0 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70   sqlite3_vtab *p
16900 56 74 61 62 2c 20 0a 20 20 69 6e 74 20 6e 44 61  Vtab, .  int nDa
16910 74 61 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 76  ta, .  sqlite3_v
16920 61 6c 75 65 20 2a 2a 61 7a 44 61 74 61 2c 20 0a  alue **azData, .
16930 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a    sqlite_int64 *
16940 70 52 6f 77 69 64 0a 29 7b 0a 20 20 52 74 72 65  pRowid.){.  Rtre
16950 65 20 2a 70 52 74 72 65 65 20 3d 20 28 52 74 72  e *pRtree = (Rtr
16960 65 65 20 2a 29 70 56 74 61 62 3b 0a 20 20 69 6e  ee *)pVtab;.  in
16970 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
16980 3b 0a 20 20 52 74 72 65 65 43 65 6c 6c 20 63 65  ;.  RtreeCell ce
16990 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
169a0 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20      /* New cell 
169b0 74 6f 20 69 6e 73 65 72 74 20 69 66 20 6e 44 61  to insert if nDa
169c0 74 61 3e 31 20 2a 2f 0a 20 20 69 6e 74 20 62 48  ta>1 */.  int bH
169d0 61 76 65 52 6f 77 69 64 20 3d 20 30 3b 20 20 20  aveRowid = 0;   
169e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
169f0 20 74 6f 20 31 20 61 66 74 65 72 20 6e 65 77 20   to 1 after new 
16a00 72 6f 77 69 64 20 69 73 20 64 65 74 65 72 6d 69  rowid is determi
16a10 6e 65 64 20 2a 2f 0a 0a 20 20 72 74 72 65 65 52  ned */..  rtreeR
16a20 65 66 65 72 65 6e 63 65 28 70 52 74 72 65 65 29  eference(pRtree)
16a30 3b 0a 20 20 61 73 73 65 72 74 28 6e 44 61 74 61  ;.  assert(nData
16a40 3e 3d 31 29 3b 0a 0a 20 20 63 65 6c 6c 2e 69 52  >=1);..  cell.iR
16a50 6f 77 69 64 20 3d 20 30 3b 20 20 2f 2a 20 55 73  owid = 0;  /* Us
16a60 65 64 20 6f 6e 6c 79 20 74 6f 20 73 75 70 70 72  ed only to suppr
16a70 65 73 73 20 61 20 63 6f 6d 70 69 6c 65 72 20 77  ess a compiler w
16a80 61 72 6e 69 6e 67 20 2a 2f 0a 0a 20 20 2f 2a 20  arning */..  /* 
16a90 43 6f 6e 73 74 72 61 69 6e 74 20 68 61 6e 64 6c  Constraint handl
16aa0 69 6e 67 2e 20 41 20 77 72 69 74 65 20 6f 70 65  ing. A write ope
16ab0 72 61 74 69 6f 6e 20 6f 6e 20 61 6e 20 72 2d 74  ration on an r-t
16ac0 72 65 65 20 74 61 62 6c 65 20 6d 61 79 20 72 65  ree table may re
16ad0 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45  turn.  ** SQLITE
16ae0 5f 43 4f 4e 53 54 52 41 49 4e 54 20 66 6f 72 20  _CONSTRAINT for 
16af0 74 77 6f 20 72 65 61 73 6f 6e 73 3a 0a 20 20 2a  two reasons:.  *
16b00 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 41 20 64 75  *.  **   1. A du
16b10 70 6c 69 63 61 74 65 20 72 6f 77 69 64 20 76 61  plicate rowid va
16b20 6c 75 65 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 32  lue, or.  **   2
16b30 2e 20 54 68 65 20 73 75 70 70 6c 69 65 64 20 64  . The supplied d
16b40 61 74 61 20 76 69 6f 6c 61 74 65 73 20 74 68 65  ata violates the
16b50 20 22 78 32 3e 3d 78 31 22 20 63 6f 6e 73 74 72   "x2>=x1" constr
16b60 61 69 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  aint..  **.  ** 
16b70 49 6e 20 74 68 65 20 66 69 72 73 74 20 63 61 73  In the first cas
16b80 65 2c 20 69 66 20 74 68 65 20 63 6f 6e 66 6c 69  e, if the confli
16b90 63 74 2d 68 61 6e 64 6c 69 6e 67 20 6d 6f 64 65  ct-handling mode
16ba0 20 69 73 20 52 45 50 4c 41 43 45 2c 20 74 68 65   is REPLACE, the
16bb0 6e 0a 20 20 2a 2a 20 74 68 65 20 63 6f 6e 66 6c  n.  ** the confl
16bc0 69 63 74 69 6e 67 20 72 6f 77 20 63 61 6e 20 62  icting row can b
16bd0 65 20 72 65 6d 6f 76 65 64 20 62 65 66 6f 72 65  e removed before
16be0 20 70 72 6f 63 65 65 64 69 6e 67 2e 20 49 6e 20   proceeding. In 
16bf0 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 2a 2a 20  the second.  ** 
16c00 63 61 73 65 2c 20 53 51 4c 49 54 45 5f 43 4f 4e  case, SQLITE_CON
16c10 53 54 52 41 49 4e 54 20 6d 75 73 74 20 62 65 20  STRAINT must be 
16c20 72 65 74 75 72 6e 65 64 20 72 65 67 61 72 64 6c  returned regardl
16c30 65 73 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ess of the.  ** 
16c40 63 6f 6e 66 6c 69 63 74 2d 68 61 6e 64 6c 69 6e  conflict-handlin
16c50 67 20 6d 6f 64 65 20 73 70 65 63 69 66 69 65 64  g mode specified
16c60 20 62 79 20 74 68 65 20 75 73 65 72 2e 0a 20 20   by the user..  
16c70 2a 2f 0a 20 20 69 66 28 20 6e 44 61 74 61 3e 31  */.  if( nData>1
16c80 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a   ){.    int ii;.
16c90 0a 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65  .    /* Populate
16ca0 20 74 68 65 20 63 65 6c 6c 2e 61 43 6f 6f 72 64   the cell.aCoord
16cb0 5b 5d 20 61 72 72 61 79 2e 20 54 68 65 20 66 69  [] array. The fi
16cc0 72 73 74 20 63 6f 6f 72 64 69 6e 61 74 65 20 69  rst coordinate i
16cd0 73 20 61 7a 44 61 74 61 5b 33 5d 2e 0a 20 20 20  s azData[3]..   
16ce0 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 42 3a 20 6e   **.    ** NB: n
16cf0 44 61 74 61 20 63 61 6e 20 6f 6e 6c 79 20 62 65  Data can only be
16d00 20 6c 65 73 73 20 74 68 61 6e 20 6e 44 69 6d 2a   less than nDim*
16d10 32 2b 33 20 69 66 20 74 68 65 20 72 74 72 65 65  2+3 if the rtree
16d20 20 69 73 20 6d 69 73 2d 64 65 63 6c 61 72 65 64   is mis-declared
16d30 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 22 63 6f  .    ** with "co
16d40 6c 75 6d 6e 22 20 74 68 61 74 20 61 72 65 20 69  lumn" that are i
16d50 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 74 61  nterpreted as ta
16d60 62 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e  ble constraints.
16d70 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a  .    ** Example:
16d80 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c    CREATE VIRTUAL
16d90 20 54 41 42 4c 45 20 62 61 64 20 55 53 49 4e 47   TABLE bad USING
16da0 20 72 74 72 65 65 28 78 2c 79 2c 43 48 45 43 4b   rtree(x,y,CHECK
16db0 28 79 3e 35 29 29 3b 0a 20 20 20 20 2a 2a 20 54  (y>5));.    ** T
16dc0 68 69 73 20 70 72 6f 62 6c 65 6d 20 77 61 73 20  his problem was 
16dd0 64 69 73 63 6f 76 65 72 65 64 20 61 66 74 65 72  discovered after
16de0 20 79 65 61 72 73 20 6f 66 20 75 73 65 2c 20 73   years of use, s
16df0 6f 20 77 65 20 73 69 6c 65 6e 74 6c 79 20 69 67  o we silently ig
16e00 6e 6f 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 73  nore.    ** thes
16e10 65 20 6b 69 6e 64 73 20 6f 66 20 6d 69 73 64 65  e kinds of misde
16e20 63 6c 61 72 65 64 20 74 61 62 6c 65 73 20 74 6f  clared tables to
16e30 20 61 76 6f 69 64 20 62 72 65 61 6b 69 6e 67 20   avoid breaking 
16e40 61 6e 79 20 6c 65 67 61 63 79 2e 0a 20 20 20 20  any legacy..    
16e50 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  */.    assert( n
16e60 44 61 74 61 3c 3d 28 70 52 74 72 65 65 2d 3e 6e  Data<=(pRtree->n
16e70 44 69 6d 32 20 2b 20 33 29 20 29 3b 0a 0a 23 69  Dim2 + 3) );..#i
16e80 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 52 54 52  fndef SQLITE_RTR
16e90 45 45 5f 49 4e 54 5f 4f 4e 4c 59 0a 20 20 20 20  EE_INT_ONLY.    
16ea0 69 66 28 20 70 52 74 72 65 65 2d 3e 65 43 6f 6f  if( pRtree->eCoo
16eb0 72 64 54 79 70 65 3d 3d 52 54 52 45 45 5f 43 4f  rdType==RTREE_CO
16ec0 4f 52 44 5f 52 45 41 4c 33 32 20 29 7b 0a 20 20  ORD_REAL32 ){.  
16ed0 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
16ee0 3c 6e 44 61 74 61 2d 34 3b 20 69 69 2b 3d 32 29  <nData-4; ii+=2)
16ef0 7b 0a 20 20 20 20 20 20 20 20 63 65 6c 6c 2e 61  {.        cell.a
16f00 43 6f 6f 72 64 5b 69 69 5d 2e 66 20 3d 20 72 74  Coord[ii].f = rt
16f10 72 65 65 56 61 6c 75 65 44 6f 77 6e 28 61 7a 44  reeValueDown(azD
16f20 61 74 61 5b 69 69 2b 33 5d 29 3b 0a 20 20 20 20  ata[ii+3]);.    
16f30 20 20 20 20 63 65 6c 6c 2e 61 43 6f 6f 72 64 5b      cell.aCoord[
16f40 69 69 2b 31 5d 2e 66 20 3d 20 72 74 72 65 65 56  ii+1].f = rtreeV
16f50 61 6c 75 65 55 70 28 61 7a 44 61 74 61 5b 69 69  alueUp(azData[ii
16f60 2b 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66  +4]);.        if
16f70 28 20 63 65 6c 6c 2e 61 43 6f 6f 72 64 5b 69 69  ( cell.aCoord[ii
16f80 5d 2e 66 3e 63 65 6c 6c 2e 61 43 6f 6f 72 64 5b  ].f>cell.aCoord[
16f90 69 69 2b 31 5d 2e 66 20 29 7b 0a 20 20 20 20 20  ii+1].f ){.     
16fa0 20 20 20 20 20 72 63 20 3d 20 72 74 72 65 65 43       rc = rtreeC
16fb0 6f 6e 73 74 72 61 69 6e 74 45 72 72 6f 72 28 70  onstraintError(p
16fc0 52 74 72 65 65 2c 20 69 69 2b 31 29 3b 0a 20 20  Rtree, ii+1);.  
16fd0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 63 6f 6e          goto con
16fe0 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 20 20 20  straint;.       
16ff0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
17000 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
17010 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30  {.      for(ii=0
17020 3b 20 69 69 3c 6e 44 61 74 61 2d 34 3b 20 69 69  ; ii<nData-4; ii
17030 2b 3d 32 29 7b 0a 20 20 20 20 20 20 20 20 63 65  +=2){.        ce
17040 6c 6c 2e 61 43 6f 6f 72 64 5b 69 69 5d 2e 69 20  ll.aCoord[ii].i 
17050 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
17060 69 6e 74 28 61 7a 44 61 74 61 5b 69 69 2b 33 5d  int(azData[ii+3]
17070 29 3b 0a 20 20 20 20 20 20 20 20 63 65 6c 6c 2e  );.        cell.
17080 61 43 6f 6f 72 64 5b 69 69 2b 31 5d 2e 69 20 3d  aCoord[ii+1].i =
17090 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
170a0 6e 74 28 61 7a 44 61 74 61 5b 69 69 2b 34 5d 29  nt(azData[ii+4])
170b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 65  ;.        if( ce
170c0 6c 6c 2e 61 43 6f 6f 72 64 5b 69 69 5d 2e 69 3e  ll.aCoord[ii].i>
170d0 63 65 6c 6c 2e 61 43 6f 6f 72 64 5b 69 69 2b 31  cell.aCoord[ii+1
170e0 5d 2e 69 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ].i ){.         
170f0 20 72 63 20 3d 20 72 74 72 65 65 43 6f 6e 73 74   rc = rtreeConst
17100 72 61 69 6e 74 45 72 72 6f 72 28 70 52 74 72 65  raintError(pRtre
17110 65 2c 20 69 69 2b 31 29 3b 0a 20 20 20 20 20 20  e, ii+1);.      
17120 20 20 20 20 67 6f 74 6f 20 63 6f 6e 73 74 72 61      goto constra
17130 69 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  int;.        }. 
17140 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
17150 20 20 2f 2a 20 49 66 20 61 20 72 6f 77 69 64 20    /* If a rowid 
17160 76 61 6c 75 65 20 77 61 73 20 73 75 70 70 6c 69  value was suppli
17170 65 64 2c 20 63 68 65 63 6b 20 69 66 20 69 74 20  ed, check if it 
17180 69 73 20 61 6c 72 65 61 64 79 20 70 72 65 73 65  is already prese
17190 6e 74 20 69 6e 20 0a 20 20 20 20 2a 2a 20 74 68  nt in .    ** th
171a0 65 20 74 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20  e table. If so, 
171b0 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 68  the constraint h
171c0 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 20 20  as failed. */.  
171d0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61    if( sqlite3_va
171e0 6c 75 65 5f 74 79 70 65 28 61 7a 44 61 74 61 5b  lue_type(azData[
171f0 32 5d 29 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  2])!=SQLITE_NULL
17200 20 29 7b 0a 20 20 20 20 20 20 63 65 6c 6c 2e 69   ){.      cell.i
17210 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f  Rowid = sqlite3_
17220 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 7a 44 61  value_int64(azDa
17230 74 61 5b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66  ta[2]);.      if
17240 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ( sqlite3_value_
17250 74 79 70 65 28 61 7a 44 61 74 61 5b 30 5d 29 3d  type(azData[0])=
17260 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 0a 20 20 20  =SQLITE_NULL.   
17270 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f 76      || sqlite3_v
17280 61 6c 75 65 5f 69 6e 74 36 34 28 61 7a 44 61 74  alue_int64(azDat
17290 61 5b 30 5d 29 21 3d 63 65 6c 6c 2e 69 52 6f 77  a[0])!=cell.iRow
172a0 69 64 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  id.      ){.    
172b0 20 20 20 20 69 6e 74 20 73 74 65 70 72 63 3b 0a      int steprc;.
172c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
172d0 62 69 6e 64 5f 69 6e 74 36 34 28 70 52 74 72 65  bind_int64(pRtre
172e0 65 2d 3e 70 52 65 61 64 52 6f 77 69 64 2c 20 31  e->pReadRowid, 1
172f0 2c 20 63 65 6c 6c 2e 69 52 6f 77 69 64 29 3b 0a  , cell.iRowid);.
17300 20 20 20 20 20 20 20 20 73 74 65 70 72 63 20 3d          steprc =
17310 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 52   sqlite3_step(pR
17320 74 72 65 65 2d 3e 70 52 65 61 64 52 6f 77 69 64  tree->pReadRowid
17330 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
17340 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 52  sqlite3_reset(pR
17350 74 72 65 65 2d 3e 70 52 65 61 64 52 6f 77 69 64  tree->pReadRowid
17360 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 53  );.        if( S
17370 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 74 65 70 72  QLITE_ROW==stepr
17380 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  c ){.          i
17390 66 28 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  f( sqlite3_vtab_
173a0 6f 6e 5f 63 6f 6e 66 6c 69 63 74 28 70 52 74 72  on_conflict(pRtr
173b0 65 65 2d 3e 64 62 29 3d 3d 53 51 4c 49 54 45 5f  ee->db)==SQLITE_
173c0 52 45 50 4c 41 43 45 20 29 7b 0a 20 20 20 20 20  REPLACE ){.     
173d0 20 20 20 20 20 20 20 72 63 20 3d 20 72 74 72 65         rc = rtre
173e0 65 44 65 6c 65 74 65 52 6f 77 69 64 28 70 52 74  eDeleteRowid(pRt
173f0 72 65 65 2c 20 63 65 6c 6c 2e 69 52 6f 77 69 64  ree, cell.iRowid
17400 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
17410 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
17420 72 63 20 3d 20 72 74 72 65 65 43 6f 6e 73 74 72  rc = rtreeConstr
17430 61 69 6e 74 45 72 72 6f 72 28 70 52 74 72 65 65  aintError(pRtree
17440 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
17450 20 20 67 6f 74 6f 20 63 6f 6e 73 74 72 61 69 6e    goto constrain
17460 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
17470 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
17480 0a 20 20 20 20 20 20 62 48 61 76 65 52 6f 77 69  .      bHaveRowi
17490 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  d = 1;.    }.  }
174a0 0a 0a 20 20 2f 2a 20 49 66 20 61 7a 44 61 74 61  ..  /* If azData
174b0 5b 30 5d 20 69 73 20 6e 6f 74 20 61 6e 20 53 51  [0] is not an SQ
174c0 4c 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 69 74  L NULL value, it
174d0 20 69 73 20 74 68 65 20 72 6f 77 69 64 20 6f 66   is the rowid of
174e0 20 61 0a 20 20 2a 2a 20 72 65 63 6f 72 64 20 74   a.  ** record t
174f0 6f 20 64 65 6c 65 74 65 20 66 72 6f 6d 20 74 68  o delete from th
17500 65 20 72 2d 74 72 65 65 20 74 61 62 6c 65 2e 20  e r-tree table. 
17510 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
17520 6f 63 6b 20 64 6f 65 73 0a 20 20 2a 2a 20 6a 75  ock does.  ** ju
17530 73 74 20 74 68 61 74 2e 0a 20 20 2a 2f 0a 20 20  st that..  */.  
17540 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  if( sqlite3_valu
17550 65 5f 74 79 70 65 28 61 7a 44 61 74 61 5b 30 5d  e_type(azData[0]
17560 29 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29  )!=SQLITE_NULL )
17570 7b 0a 20 20 20 20 72 63 20 3d 20 72 74 72 65 65  {.    rc = rtree
17580 44 65 6c 65 74 65 52 6f 77 69 64 28 70 52 74 72  DeleteRowid(pRtr
17590 65 65 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ee, sqlite3_valu
175a0 65 5f 69 6e 74 36 34 28 61 7a 44 61 74 61 5b 30  e_int64(azData[0
175b0 5d 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ]));.  }..  /* I
175c0 66 20 74 68 65 20 61 7a 44 61 74 61 5b 5d 20 61  f the azData[] a
175d0 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 20 6d 6f  rray contains mo
175e0 72 65 20 74 68 61 6e 20 6f 6e 65 20 65 6c 65 6d  re than one elem
175f0 65 6e 74 2c 20 65 6c 65 6d 65 6e 74 73 0a 20 20  ent, elements.  
17600 2a 2a 20 28 61 7a 44 61 74 61 5b 32 5d 2e 2e 61  ** (azData[2]..a
17610 7a 44 61 74 61 5b 61 72 67 63 2d 31 5d 29 20 63  zData[argc-1]) c
17620 6f 6e 74 61 69 6e 20 61 20 6e 65 77 20 72 65 63  ontain a new rec
17630 6f 72 64 20 74 6f 20 69 6e 73 65 72 74 20 69 6e  ord to insert in
17640 74 6f 0a 20 20 2a 2a 20 74 68 65 20 72 2d 74 72  to.  ** the r-tr
17650 65 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20  ee structure..  
17660 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
17670 49 54 45 5f 4f 4b 20 26 26 20 6e 44 61 74 61 3e  ITE_OK && nData>
17680 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 73 65  1 ){.    /* Inse
17690 72 74 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72  rt the new recor
176a0 64 20 69 6e 74 6f 20 74 68 65 20 72 2d 74 72 65  d into the r-tre
176b0 65 20 2a 2f 0a 20 20 20 20 52 74 72 65 65 4e 6f  e */.    RtreeNo
176c0 64 65 20 2a 70 4c 65 61 66 20 3d 20 30 3b 0a 0a  de *pLeaf = 0;..
176d0 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75      /* Figure ou
176e0 74 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74  t the rowid of t
176f0 68 65 20 6e 65 77 20 72 6f 77 2e 20 2a 2f 0a 20  he new row. */. 
17700 20 20 20 69 66 28 20 62 48 61 76 65 52 6f 77 69     if( bHaveRowi
17710 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  d==0 ){.      rc
17720 20 3d 20 6e 65 77 52 6f 77 69 64 28 70 52 74 72   = newRowid(pRtr
17730 65 65 2c 20 26 63 65 6c 6c 2e 69 52 6f 77 69 64  ee, &cell.iRowid
17740 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 52  );.    }.    *pR
17750 6f 77 69 64 20 3d 20 63 65 6c 6c 2e 69 52 6f 77  owid = cell.iRow
17760 69 64 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d  id;..    if( rc=
17770 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17780 20 20 20 20 72 63 20 3d 20 43 68 6f 6f 73 65 4c      rc = ChooseL
17790 65 61 66 28 70 52 74 72 65 65 2c 20 26 63 65 6c  eaf(pRtree, &cel
177a0 6c 2c 20 30 2c 20 26 70 4c 65 61 66 29 3b 0a 20  l, 0, &pLeaf);. 
177b0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
177c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
177d0 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20      int rc2;.   
177e0 20 20 20 70 52 74 72 65 65 2d 3e 69 52 65 69 6e     pRtree->iRein
177f0 73 65 72 74 48 65 69 67 68 74 20 3d 20 2d 31 3b  sertHeight = -1;
17800 0a 20 20 20 20 20 20 72 63 20 3d 20 72 74 72 65  .      rc = rtre
17810 65 49 6e 73 65 72 74 43 65 6c 6c 28 70 52 74 72  eInsertCell(pRtr
17820 65 65 2c 20 70 4c 65 61 66 2c 20 26 63 65 6c 6c  ee, pLeaf, &cell
17830 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 63 32 20  , 0);.      rc2 
17840 3d 20 6e 6f 64 65 52 65 6c 65 61 73 65 28 70 52  = nodeRelease(pR
17850 74 72 65 65 2c 20 70 4c 65 61 66 29 3b 0a 20 20  tree, pLeaf);.  
17860 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
17870 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
17880 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20   rc = rc2;.     
17890 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 63 6f   }.    }.  }..co
178a0 6e 73 74 72 61 69 6e 74 3a 0a 20 20 72 74 72 65  nstraint:.  rtre
178b0 65 52 65 6c 65 61 73 65 28 70 52 74 72 65 65 29  eRelease(pRtree)
178c0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
178d0 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 65 64 20 77  ../*.** Called w
178e0 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hen a transactio
178f0 6e 20 73 74 61 72 74 73 2e 0a 2a 2f 0a 73 74 61  n starts..*/.sta
17900 74 69 63 20 69 6e 74 20 72 74 72 65 65 42 65 67  tic int rtreeBeg
17910 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 73 71  inTransaction(sq
17920 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
17930 62 29 7b 0a 20 20 52 74 72 65 65 20 2a 70 52 74  b){.  Rtree *pRt
17940 72 65 65 20 3d 20 28 52 74 72 65 65 20 2a 29 70  ree = (Rtree *)p
17950 56 74 61 62 3b 0a 20 20 61 73 73 65 72 74 28 20  Vtab;.  assert( 
17960 70 52 74 72 65 65 2d 3e 69 6e 57 72 54 72 61 6e  pRtree->inWrTran
17970 73 3d 3d 30 20 29 3b 0a 20 20 70 52 74 72 65 65  s==0 );.  pRtree
17980 2d 3e 69 6e 57 72 54 72 61 6e 73 2b 2b 3b 0a 20  ->inWrTrans++;. 
17990 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
179a0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  K;.}../*.** Call
179b0 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61  ed when a transa
179c0 63 74 69 6f 6e 20 63 6f 6d 70 6c 65 74 65 73 20  ction completes 
179d0 28 65 69 74 68 65 72 20 62 79 20 43 4f 4d 4d 49  (either by COMMI
179e0 54 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 29 2e 0a  T or ROLLBACK)..
179f0 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f 62  ** The sqlite3_b
17a00 6c 6f 62 20 6f 62 6a 65 63 74 20 73 68 6f 75 6c  lob object shoul
17a10 64 20 62 65 20 72 65 6c 65 61 73 65 64 20 61 74  d be released at
17a20 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a 2f 0a   this point..*/.
17a30 73 74 61 74 69 63 20 69 6e 74 20 72 74 72 65 65  static int rtree
17a40 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 73  EndTransaction(s
17a50 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
17a60 61 62 29 7b 0a 20 20 52 74 72 65 65 20 2a 70 52  ab){.  Rtree *pR
17a70 74 72 65 65 20 3d 20 28 52 74 72 65 65 20 2a 29  tree = (Rtree *)
17a80 70 56 74 61 62 3b 0a 20 20 70 52 74 72 65 65 2d  pVtab;.  pRtree-
17a90 3e 69 6e 57 72 54 72 61 6e 73 20 3d 20 30 3b 0a  >inWrTrans = 0;.
17aa0 20 20 6e 6f 64 65 42 6c 6f 62 52 65 73 65 74 28    nodeBlobReset(
17ab0 70 52 74 72 65 65 29 3b 0a 20 20 72 65 74 75 72  pRtree);.  retur
17ac0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
17ad0 2f 2a 0a 2a 2a 20 54 68 65 20 78 52 65 6e 61 6d  /*.** The xRenam
17ae0 65 20 6d 65 74 68 6f 64 20 66 6f 72 20 72 74 72  e method for rtr
17af0 65 65 20 6d 6f 64 75 6c 65 20 76 69 72 74 75 61  ee module virtua
17b00 6c 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61  l tables..*/.sta
17b10 74 69 63 20 69 6e 74 20 72 74 72 65 65 52 65 6e  tic int rtreeRen
17b20 61 6d 65 28 73 71 6c 69 74 65 33 5f 76 74 61 62  ame(sqlite3_vtab
17b30 20 2a 70 56 74 61 62 2c 20 63 6f 6e 73 74 20 63   *pVtab, const c
17b40 68 61 72 20 2a 7a 4e 65 77 4e 61 6d 65 29 7b 0a  har *zNewName){.
17b50 20 20 52 74 72 65 65 20 2a 70 52 74 72 65 65 20    Rtree *pRtree 
17b60 3d 20 28 52 74 72 65 65 20 2a 29 70 56 74 61 62  = (Rtree *)pVtab
17b70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
17b80 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 63 68 61  ITE_NOMEM;.  cha
17b90 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  r *zSql = sqlite
17ba0 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 22  3_mprintf(.    "
17bb0 41 4c 54 45 52 20 54 41 42 4c 45 20 25 51 2e 27  ALTER TABLE %Q.'
17bc0 25 71 5f 6e 6f 64 65 27 20 20 20 52 45 4e 41 4d  %q_node'   RENAM
17bd0 45 20 54 4f 20 5c 22 25 77 5f 6e 6f 64 65 5c 22  E TO \"%w_node\"
17be0 3b 22 0a 20 20 20 20 22 41 4c 54 45 52 20 54 41  ;".    "ALTER TA
17bf0 42 4c 45 20 25 51 2e 27 25 71 5f 70 61 72 65 6e  BLE %Q.'%q_paren
17c00 74 27 20 52 45 4e 41 4d 45 20 54 4f 20 5c 22 25  t' RENAME TO \"%
17c10 77 5f 70 61 72 65 6e 74 5c 22 3b 22 0a 20 20 20  w_parent\";".   
17c20 20 22 41 4c 54 45 52 20 54 41 42 4c 45 20 25 51   "ALTER TABLE %Q
17c30 2e 27 25 71 5f 72 6f 77 69 64 27 20 20 52 45 4e  .'%q_rowid'  REN
17c40 41 4d 45 20 54 4f 20 5c 22 25 77 5f 72 6f 77 69  AME TO \"%w_rowi
17c50 64 5c 22 3b 22 0a 20 20 20 20 2c 20 70 52 74 72  d\";".    , pRtr
17c60 65 65 2d 3e 7a 44 62 2c 20 70 52 74 72 65 65 2d  ee->zDb, pRtree-
17c70 3e 7a 4e 61 6d 65 2c 20 7a 4e 65 77 4e 61 6d 65  >zName, zNewName
17c80 20 0a 20 20 20 20 2c 20 70 52 74 72 65 65 2d 3e   .    , pRtree->
17c90 7a 44 62 2c 20 70 52 74 72 65 65 2d 3e 7a 4e 61  zDb, pRtree->zNa
17ca0 6d 65 2c 20 7a 4e 65 77 4e 61 6d 65 20 0a 20 20  me, zNewName .  
17cb0 20 20 2c 20 70 52 74 72 65 65 2d 3e 7a 44 62 2c    , pRtree->zDb,
17cc0 20 70 52 74 72 65 65 2d 3e 7a 4e 61 6d 65 2c 20   pRtree->zName, 
17cd0 7a 4e 65 77 4e 61 6d 65 0a 20 20 29 3b 0a 20 20  zNewName.  );.  
17ce0 69 66 28 20 7a 53 71 6c 20 29 7b 0a 20 20 20 20  if( zSql ){.    
17cf0 6e 6f 64 65 42 6c 6f 62 52 65 73 65 74 28 70 52  nodeBlobReset(pR
17d00 74 72 65 65 29 3b 0a 20 20 20 20 72 63 20 3d 20  tree);.    rc = 
17d10 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 52 74  sqlite3_exec(pRt
17d20 72 65 65 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 30  ree->db, zSql, 0
17d30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
17d40 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
17d50 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
17d60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 78  ;.}../*.** The x
17d70 53 61 76 65 70 6f 69 6e 74 20 6d 65 74 68 6f 64  Savepoint method
17d80 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 6f 64  ..**.** This mod
17d90 75 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  ule does not nee
17da0 64 20 74 6f 20 64 6f 20 61 6e 79 74 68 69 6e 67  d to do anything
17db0 20 74 6f 20 73 75 70 70 6f 72 74 20 73 61 76 65   to support save
17dc0 70 6f 69 6e 74 73 2e 20 48 6f 77 65 76 65 72 2c  points. However,
17dd0 0a 2a 2a 20 69 74 20 75 73 65 73 20 74 68 69 73  .** it uses this
17de0 20 68 6f 6f 6b 20 74 6f 20 63 6c 6f 73 65 20 61   hook to close a
17df0 6e 79 20 6f 70 65 6e 20 62 6c 6f 62 20 68 61 6e  ny open blob han
17e00 64 6c 65 2e 20 54 68 69 73 20 69 73 20 64 6f 6e  dle. This is don
17e10 65 20 62 65 63 61 75 73 65 20 61 20 0a 2a 2a 20  e because a .** 
17e20 44 52 4f 50 20 54 41 42 4c 45 20 63 6f 6d 6d 61  DROP TABLE comma
17e30 6e 64 20 2d 20 77 68 69 63 68 20 66 6f 72 74 75  nd - which fortu
17e40 6e 61 74 65 6c 79 20 61 6c 77 61 79 73 20 6f 70  nately always op
17e50 65 6e 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20  ens a savepoint 
17e60 2d 20 63 61 6e 6e 6f 74 20 0a 2a 2a 20 73 75 63  - cannot .** suc
17e70 63 65 65 64 20 69 66 20 74 68 65 72 65 20 61 72  ceed if there ar
17e80 65 20 61 6e 79 20 6f 70 65 6e 20 62 6c 6f 62 20  e any open blob 
17e90 68 61 6e 64 6c 65 73 2e 20 69 2e 65 2e 20 69 66  handles. i.e. if
17ea0 20 74 68 65 20 62 6c 6f 62 20 68 61 6e 64 6c 65   the blob handle
17eb0 20 77 65 72 65 0a 2a 2a 20 6e 6f 74 20 63 6c 6f   were.** not clo
17ec0 73 65 64 20 68 65 72 65 2c 20 74 68 65 20 66 6f  sed here, the fo
17ed0 6c 6c 6f 77 69 6e 67 20 77 6f 75 6c 64 20 66 61  llowing would fa
17ee0 69 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20 42 45 47 49  il:.**.**   BEGI
17ef0 4e 3b 0a 2a 2a 20 20 20 20 20 49 4e 53 45 52 54  N;.**     INSERT
17f00 20 49 4e 54 4f 20 72 74 72 65 65 2e 2e 2e 0a 2a   INTO rtree....*
17f10 2a 20 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45  *     DROP TABLE
17f20 20 3c 74 61 62 6c 65 6e 61 6d 65 3e 3b 20 20 20   <tablename>;   
17f30 20 2d 2d 20 57 6f 75 6c 64 20 66 61 69 6c 20 77   -- Would fail w
17f40 69 74 68 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  ith SQLITE_LOCKE
17f50 44 0a 2a 2a 20 20 20 43 4f 4d 4d 49 54 3b 0a 2a  D.**   COMMIT;.*
17f60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 74 72  /.static int rtr
17f70 65 65 53 61 76 65 70 6f 69 6e 74 28 73 71 6c 69  eeSavepoint(sqli
17f80 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 2c  te3_vtab *pVtab,
17f90 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29   int iSavepoint)
17fa0 7b 0a 20 20 52 74 72 65 65 20 2a 70 52 74 72 65  {.  Rtree *pRtre
17fb0 65 20 3d 20 28 52 74 72 65 65 20 2a 29 70 56 74  e = (Rtree *)pVt
17fc0 61 62 3b 0a 20 20 69 6e 74 20 69 77 74 20 3d 20  ab;.  int iwt = 
17fd0 70 52 74 72 65 65 2d 3e 69 6e 57 72 54 72 61 6e  pRtree->inWrTran
17fe0 73 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  s;.  UNUSED_PARA
17ff0 4d 45 54 45 52 28 69 53 61 76 65 70 6f 69 6e 74  METER(iSavepoint
18000 29 3b 0a 20 20 70 52 74 72 65 65 2d 3e 69 6e 57  );.  pRtree->inW
18010 72 54 72 61 6e 73 20 3d 20 30 3b 0a 20 20 6e 6f  rTrans = 0;.  no
18020 64 65 42 6c 6f 62 52 65 73 65 74 28 70 52 74 72  deBlobReset(pRtr
18030 65 65 29 3b 0a 20 20 70 52 74 72 65 65 2d 3e 69  ee);.  pRtree->i
18040 6e 57 72 54 72 61 6e 73 20 3d 20 69 77 74 3b 0a  nWrTrans = iwt;.
18050 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18060 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
18070 73 20 66 75 6e 63 74 69 6f 6e 20 70 6f 70 75 6c  s function popul
18080 61 74 65 73 20 74 68 65 20 70 52 74 72 65 65 2d  ates the pRtree-
18090 3e 6e 52 6f 77 45 73 74 20 76 61 72 69 61 62 6c  >nRowEst variabl
180a0 65 20 77 69 74 68 20 61 6e 20 65 73 74 69 6d 61  e with an estima
180b0 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20 6e 75 6d  te.** of the num
180c0 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
180d0 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
180e0 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 74  . If possible, t
180f0 68 69 73 20 69 73 20 62 61 73 65 64 0a 2a 2a 20  his is based.** 
18100 6f 6e 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20  on sqlite_stat1 
18110 64 61 74 61 2e 20 4f 74 68 65 72 77 69 73 65 2c  data. Otherwise,
18120 20 75 73 65 20 52 54 52 45 45 5f 44 45 46 41 55   use RTREE_DEFAU
18130 4c 54 5f 52 4f 57 45 53 54 2e 0a 2a 2f 0a 73 74  LT_ROWEST..*/.st
18140 61 74 69 63 20 69 6e 74 20 72 74 72 65 65 51 75  atic int rtreeQu
18150 65 72 79 53 74 61 74 31 28 73 71 6c 69 74 65 33  eryStat1(sqlite3
18160 20 2a 64 62 2c 20 52 74 72 65 65 20 2a 70 52 74   *db, Rtree *pRt
18170 72 65 65 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  ree){.  const ch
18180 61 72 20 2a 7a 46 6d 74 20 3d 20 22 53 45 4c 45  ar *zFmt = "SELE
18190 43 54 20 73 74 61 74 20 46 52 4f 4d 20 25 51 2e  CT stat FROM %Q.
181a0 73 71 6c 69 74 65 5f 73 74 61 74 31 20 57 48 45  sqlite_stat1 WHE
181b0 52 45 20 74 62 6c 20 3d 20 27 25 71 5f 72 6f 77  RE tbl = '%q_row
181c0 69 64 27 22 3b 0a 20 20 63 68 61 72 20 2a 7a 53  id'";.  char *zS
181d0 71 6c 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  ql;.  sqlite3_st
181e0 6d 74 20 2a 70 3b 0a 20 20 69 6e 74 20 72 63 3b  mt *p;.  int rc;
181f0 0a 20 20 69 36 34 20 6e 52 6f 77 20 3d 20 30 3b  .  i64 nRow = 0;
18200 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
18210 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65  _table_column_me
18220 74 61 64 61 74 61 28 0a 20 20 20 20 20 20 64 62  tadata(.      db
18230 2c 20 70 52 74 72 65 65 2d 3e 7a 44 62 2c 20 22  , pRtree->zDb, "
18240 73 71 6c 69 74 65 5f 73 74 61 74 31 22 2c 30 2c  sqlite_stat1",0,
18250 30 2c 30 2c 30 2c 30 2c 30 0a 20 20 29 3b 0a 20  0,0,0,0,0.  );. 
18260 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18270 4f 4b 20 29 7b 0a 20 20 20 20 70 52 74 72 65 65  OK ){.    pRtree
18280 2d 3e 6e 52 6f 77 45 73 74 20 3d 20 52 54 52 45  ->nRowEst = RTRE
18290 45 5f 44 45 46 41 55 4c 54 5f 52 4f 57 45 53 54  E_DEFAULT_ROWEST
182a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3d  ;.    return rc=
182b0 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 3f 20  =SQLITE_ERROR ? 
182c0 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 3b 0a  SQLITE_OK : rc;.
182d0 20 20 7d 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c    }.  zSql = sql
182e0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 7a 46 6d  ite3_mprintf(zFm
182f0 74 2c 20 70 52 74 72 65 65 2d 3e 7a 44 62 2c 20  t, pRtree->zDb, 
18300 70 52 74 72 65 65 2d 3e 7a 4e 61 6d 65 29 3b 0a  pRtree->zName);.
18310 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b    if( zSql==0 ){
18320 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
18330 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b  _NOMEM;.  }else{
18340 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
18350 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c  3_prepare_v2(db,
18360 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 2c 20 30   zSql, -1, &p, 0
18370 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
18380 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18390 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
183a0 65 70 28 70 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  ep(p)==SQLITE_RO
183b0 57 20 29 20 6e 52 6f 77 20 3d 20 73 71 6c 69 74  W ) nRow = sqlit
183c0 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28  e3_column_int64(
183d0 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 63 20  p, 0);.      rc 
183e0 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  = sqlite3_finali
183f0 7a 65 28 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ze(p);.    }else
18400 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18410 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 72  NOMEM ){.      r
18420 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
18430 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63     }..    if( rc
18440 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
18450 20 20 20 20 20 69 66 28 20 6e 52 6f 77 3d 3d 30       if( nRow==0
18460 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52 74 72   ){.        pRtr
18470 65 65 2d 3e 6e 52 6f 77 45 73 74 20 3d 20 52 54  ee->nRowEst = RT
18480 52 45 45 5f 44 45 46 41 55 4c 54 5f 52 4f 57 45  REE_DEFAULT_ROWE
18490 53 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ST;.      }else{
184a0 0a 20 20 20 20 20 20 20 20 70 52 74 72 65 65 2d  .        pRtree-
184b0 3e 6e 52 6f 77 45 73 74 20 3d 20 4d 41 58 28 6e  >nRowEst = MAX(n
184c0 52 6f 77 2c 20 52 54 52 45 45 5f 4d 49 4e 5f 52  Row, RTREE_MIN_R
184d0 4f 57 45 53 54 29 3b 0a 20 20 20 20 20 20 7d 0a  OWEST);.      }.
184e0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
184f0 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
18500 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
18510 7d 0a 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  }..static sqlite
18520 33 5f 6d 6f 64 75 6c 65 20 72 74 72 65 65 4d 6f  3_module rtreeMo
18530 64 75 6c 65 20 3d 20 7b 0a 20 20 32 2c 20 20 20  dule = {.  2,   
18540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18550 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
18560 6f 6e 20 2a 2f 0a 20 20 72 74 72 65 65 43 72 65  on */.  rtreeCre
18570 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ate,            
18580 20 20 20 20 2f 2a 20 78 43 72 65 61 74 65 20 2d      /* xCreate -
18590 20 63 72 65 61 74 65 20 61 20 74 61 62 6c 65 20   create a table 
185a0 2a 2f 0a 20 20 72 74 72 65 65 43 6f 6e 6e 65 63  */.  rtreeConnec
185b0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
185c0 20 2f 2a 20 78 43 6f 6e 6e 65 63 74 20 2d 20 63   /* xConnect - c
185d0 6f 6e 6e 65 63 74 20 74 6f 20 61 6e 20 65 78 69  onnect to an exi
185e0 73 74 69 6e 67 20 74 61 62 6c 65 20 2a 2f 0a 20  sting table */. 
185f0 20 72 74 72 65 65 42 65 73 74 49 6e 64 65 78 2c   rtreeBestIndex,
18600 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18610 78 42 65 73 74 49 6e 64 65 78 20 2d 20 44 65 74  xBestIndex - Det
18620 65 72 6d 69 6e 65 20 73 65 61 72 63 68 20 73 74  ermine search st
18630 72 61 74 65 67 79 20 2a 2f 0a 20 20 72 74 72 65  rategy */.  rtre
18640 65 44 69 73 63 6f 6e 6e 65 63 74 2c 20 20 20 20  eDisconnect,    
18650 20 20 20 20 20 20 20 20 2f 2a 20 78 44 69 73 63          /* xDisc
18660 6f 6e 6e 65 63 74 20 2d 20 44 69 73 63 6f 6e 6e  onnect - Disconn
18670 65 63 74 20 66 72 6f 6d 20 61 20 74 61 62 6c 65  ect from a table
18680 20 2a 2f 0a 20 20 72 74 72 65 65 44 65 73 74 72   */.  rtreeDestr
18690 6f 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  oy,             
186a0 20 20 2f 2a 20 78 44 65 73 74 72 6f 79 20 2d 20    /* xDestroy - 
186b0 44 72 6f 70 20 61 20 74 61 62 6c 65 20 2a 2f 0a  Drop a table */.
186c0 20 20 72 74 72 65 65 4f 70 65 6e 2c 20 20 20 20    rtreeOpen,    
186d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
186e0 20 78 4f 70 65 6e 20 2d 20 6f 70 65 6e 20 61 20   xOpen - open a 
186f0 63 75 72 73 6f 72 20 2a 2f 0a 20 20 72 74 72 65  cursor */.  rtre
18700 65 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  eClose,         
18710 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
18720 65 20 2d 20 63 6c 6f 73 65 20 61 20 63 75 72 73  e - close a curs
18730 6f 72 20 2a 2f 0a 20 20 72 74 72 65 65 46 69 6c  or */.  rtreeFil
18740 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ter,            
18750 20 20 20 20 2f 2a 20 78 46 69 6c 74 65 72 20 2d      /* xFilter -
18760 20 63 6f 6e 66 69 67 75 72 65 20 73 63 61 6e 20   configure scan 
18770 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20  constraints */. 
18780 20 72 74 72 65 65 4e 65 78 74 2c 20 20 20 20 20   rtreeNext,     
18790 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
187a0 78 4e 65 78 74 20 2d 20 61 64 76 61 6e 63 65 20  xNext - advance 
187b0 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 72 74  a cursor */.  rt
187c0 72 65 65 45 6f 66 2c 20 20 20 20 20 20 20 20 20  reeEof,         
187d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 45 6f            /* xEo
187e0 66 20 2a 2f 0a 20 20 72 74 72 65 65 43 6f 6c 75  f */.  rtreeColu
187f0 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  mn,             
18800 20 20 20 2f 2a 20 78 43 6f 6c 75 6d 6e 20 2d 20     /* xColumn - 
18810 72 65 61 64 20 64 61 74 61 20 2a 2f 0a 20 20 72  read data */.  r
18820 74 72 65 65 52 6f 77 69 64 2c 20 20 20 20 20 20  treeRowid,      
18830 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
18840 6f 77 69 64 20 2d 20 72 65 61 64 20 64 61 74 61  owid - read data
18850 20 2a 2f 0a 20 20 72 74 72 65 65 55 70 64 61 74   */.  rtreeUpdat
18860 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
18870 20 20 2f 2a 20 78 55 70 64 61 74 65 20 2d 20 77    /* xUpdate - w
18880 72 69 74 65 20 64 61 74 61 20 2a 2f 0a 20 20 72  rite data */.  r
18890 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 61 63  treeBeginTransac
188a0 74 69 6f 6e 2c 20 20 20 20 20 20 2f 2a 20 78 42  tion,      /* xB
188b0 65 67 69 6e 20 2d 20 62 65 67 69 6e 20 74 72 61  egin - begin tra
188c0 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 72 74  nsaction */.  rt
188d0 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f  reeEndTransactio
188e0 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79  n,        /* xSy
188f0 6e 63 20 2d 20 73 79 6e 63 20 74 72 61 6e 73 61  nc - sync transa
18900 63 74 69 6f 6e 20 2a 2f 0a 20 20 72 74 72 65 65  ction */.  rtree
18910 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20  EndTransaction, 
18920 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6d 6d 69         /* xCommi
18930 74 20 2d 20 63 6f 6d 6d 69 74 20 74 72 61 6e 73  t - commit trans
18940 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 72 74 72 65  action */.  rtre
18950 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 2c  eEndTransaction,
18960 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 6c 6c          /* xRoll
18970 62 61 63 6b 20 2d 20 72 6f 6c 6c 62 61 63 6b 20  back - rollback 
18980 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
18990 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
189a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
189b0 78 46 69 6e 64 46 75 6e 63 74 69 6f 6e 20 2d 20  xFindFunction - 
189c0 66 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61  function overloa
189d0 64 69 6e 67 20 2a 2f 0a 20 20 72 74 72 65 65 52  ding */.  rtreeR
189e0 65 6e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20  ename,          
189f0 20 20 20 20 20 20 2f 2a 20 78 52 65 6e 61 6d 65        /* xRename
18a00 20 2d 20 72 65 6e 61 6d 65 20 74 68 65 20 74 61   - rename the ta
18a10 62 6c 65 20 2a 2f 0a 20 20 72 74 72 65 65 53 61  ble */.  rtreeSa
18a20 76 65 70 6f 69 6e 74 2c 20 20 20 20 20 20 20 20  vepoint,        
18a30 20 20 20 20 20 2f 2a 20 78 53 61 76 65 70 6f 69       /* xSavepoi
18a40 6e 74 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  nt */.  0,      
18a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a60 20 20 20 20 2f 2a 20 78 52 65 6c 65 61 73 65 20      /* xRelease 
18a70 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
18a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a90 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 54 6f 20   /* xRollbackTo 
18aa0 2a 2f 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 69 6e  */.};..static in
18ab0 74 20 72 74 72 65 65 53 71 6c 49 6e 69 74 28 0a  t rtreeSqlInit(.
18ac0 20 20 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c    Rtree *pRtree,
18ad0 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c   .  sqlite3 *db,
18ae0 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
18af0 7a 44 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68  zDb, .  const ch
18b00 61 72 20 2a 7a 50 72 65 66 69 78 2c 20 0a 20 20  ar *zPrefix, .  
18b10 69 6e 74 20 69 73 43 72 65 61 74 65 0a 29 7b 0a  int isCreate.){.
18b20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
18b30 45 5f 4f 4b 3b 0a 0a 20 20 23 64 65 66 69 6e 65  E_OK;..  #define
18b40 20 4e 5f 53 54 41 54 45 4d 45 4e 54 20 38 0a 20   N_STATEMENT 8. 
18b50 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
18b60 61 72 20 2a 61 7a 53 71 6c 5b 4e 5f 53 54 41 54  ar *azSql[N_STAT
18b70 45 4d 45 4e 54 5d 20 3d 20 7b 0a 20 20 20 20 2f  EMENT] = {.    /
18b80 2a 20 57 72 69 74 65 20 74 68 65 20 78 78 78 5f  * Write the xxx_
18b90 6e 6f 64 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20  node table */.  
18ba0 20 20 22 49 4e 53 45 52 54 20 4f 52 20 52 45 50    "INSERT OR REP
18bb0 4c 41 43 45 20 49 4e 54 4f 20 27 25 71 27 2e 27  LACE INTO '%q'.'
18bc0 25 71 5f 6e 6f 64 65 27 20 56 41 4c 55 45 53 28  %q_node' VALUES(
18bd0 3a 31 2c 20 3a 32 29 22 2c 0a 20 20 20 20 22 44  :1, :2)",.    "D
18be0 45 4c 45 54 45 20 46 52 4f 4d 20 27 25 71 27 2e  ELETE FROM '%q'.
18bf0 27 25 71 5f 6e 6f 64 65 27 20 57 48 45 52 45 20  '%q_node' WHERE 
18c00 6e 6f 64 65 6e 6f 20 3d 20 3a 31 22 2c 0a 0a 20  nodeno = :1",.. 
18c10 20 20 20 2f 2a 20 52 65 61 64 20 61 6e 64 20 77     /* Read and w
18c20 72 69 74 65 20 74 68 65 20 78 78 78 5f 72 6f 77  rite the xxx_row
18c30 69 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  id table */.    
18c40 22 53 45 4c 45 43 54 20 6e 6f 64 65 6e 6f 20 46  "SELECT nodeno F
18c50 52 4f 4d 20 27 25 71 27 2e 27 25 71 5f 72 6f 77  ROM '%q'.'%q_row
18c60 69 64 27 20 57 48 45 52 45 20 72 6f 77 69 64 20  id' WHERE rowid 
18c70 3d 20 3a 31 22 2c 0a 20 20 20 20 22 49 4e 53 45  = :1",.    "INSE
18c80 52 54 20 4f 52 20 52 45 50 4c 41 43 45 20 49 4e  RT OR REPLACE IN
18c90 54 4f 20 27 25 71 27 2e 27 25 71 5f 72 6f 77 69  TO '%q'.'%q_rowi
18ca0 64 27 20 56 41 4c 55 45 53 28 3a 31 2c 20 3a 32  d' VALUES(:1, :2
18cb0 29 22 2c 0a 20 20 20 20 22 44 45 4c 45 54 45 20  )",.    "DELETE 
18cc0 46 52 4f 4d 20 27 25 71 27 2e 27 25 71 5f 72 6f  FROM '%q'.'%q_ro
18cd0 77 69 64 27 20 57 48 45 52 45 20 72 6f 77 69 64  wid' WHERE rowid
18ce0 20 3d 20 3a 31 22 2c 0a 0a 20 20 20 20 2f 2a 20   = :1",..    /* 
18cf0 52 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 74  Read and write t
18d00 68 65 20 78 78 78 5f 70 61 72 65 6e 74 20 74 61  he xxx_parent ta
18d10 62 6c 65 20 2a 2f 0a 20 20 20 20 22 53 45 4c 45  ble */.    "SELE
18d20 43 54 20 70 61 72 65 6e 74 6e 6f 64 65 20 46 52  CT parentnode FR
18d30 4f 4d 20 27 25 71 27 2e 27 25 71 5f 70 61 72 65  OM '%q'.'%q_pare
18d40 6e 74 27 20 57 48 45 52 45 20 6e 6f 64 65 6e 6f  nt' WHERE nodeno
18d50 20 3d 20 3a 31 22 2c 0a 20 20 20 20 22 49 4e 53   = :1",.    "INS
18d60 45 52 54 20 4f 52 20 52 45 50 4c 41 43 45 20 49  ERT OR REPLACE I
18d70 4e 54 4f 20 27 25 71 27 2e 27 25 71 5f 70 61 72  NTO '%q'.'%q_par
18d80 65 6e 74 27 20 56 41 4c 55 45 53 28 3a 31 2c 20  ent' VALUES(:1, 
18d90 3a 32 29 22 2c 0a 20 20 20 20 22 44 45 4c 45 54  :2)",.    "DELET
18da0 45 20 46 52 4f 4d 20 27 25 71 27 2e 27 25 71 5f  E FROM '%q'.'%q_
18db0 70 61 72 65 6e 74 27 20 57 48 45 52 45 20 6e 6f  parent' WHERE no
18dc0 64 65 6e 6f 20 3d 20 3a 31 22 0a 20 20 7d 3b 0a  deno = :1".  };.
18dd0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
18de0 2a 61 70 70 53 74 6d 74 5b 4e 5f 53 54 41 54 45  *appStmt[N_STATE
18df0 4d 45 4e 54 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a  MENT];.  int i;.
18e00 0a 20 20 70 52 74 72 65 65 2d 3e 64 62 20 3d 20  .  pRtree->db = 
18e10 64 62 3b 0a 0a 20 20 69 66 28 20 69 73 43 72 65  db;..  if( isCre
18e20 61 74 65 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ate ){.    char 
18e30 2a 7a 43 72 65 61 74 65 20 3d 20 73 71 6c 69 74  *zCreate = sqlit
18e40 65 33 5f 6d 70 72 69 6e 74 66 28 0a 22 43 52 45  e3_mprintf(."CRE
18e50 41 54 45 20 54 41 42 4c 45 20 5c 22 25 77 5c 22  ATE TABLE \"%w\"
18e60 2e 5c 22 25 77 5f 6e 6f 64 65 5c 22 28 6e 6f 64  .\"%w_node\"(nod
18e70 65 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d  eno INTEGER PRIM
18e80 41 52 59 20 4b 45 59 2c 20 64 61 74 61 20 42 4c  ARY KEY, data BL
18e90 4f 42 29 3b 22 0a 22 43 52 45 41 54 45 20 54 41  OB);"."CREATE TA
18ea0 42 4c 45 20 5c 22 25 77 5c 22 2e 5c 22 25 77 5f  BLE \"%w\".\"%w_
18eb0 72 6f 77 69 64 5c 22 28 72 6f 77 69 64 20 49 4e  rowid\"(rowid IN
18ec0 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
18ed0 59 2c 20 6e 6f 64 65 6e 6f 20 49 4e 54 45 47 45  Y, nodeno INTEGE
18ee0 52 29 3b 22 0a 22 43 52 45 41 54 45 20 54 41 42  R);"."CREATE TAB
18ef0 4c 45 20 5c 22 25 77 5c 22 2e 5c 22 25 77 5f 70  LE \"%w\".\"%w_p
18f00 61 72 65 6e 74 5c 22 28 6e 6f 64 65 6e 6f 20 49  arent\"(nodeno I
18f10 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
18f20 45 59 2c 22 0a 20 20 20 20 20 20 20 20 20 20 20  EY,".           
18f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f40 20 20 20 20 20 20 20 22 20 70 61 72 65 6e 74 6e         " parentn
18f50 6f 64 65 20 49 4e 54 45 47 45 52 29 3b 22 0a 22  ode INTEGER);"."
18f60 49 4e 53 45 52 54 20 49 4e 54 4f 20 27 25 71 27  INSERT INTO '%q'
18f70 2e 27 25 71 5f 6e 6f 64 65 27 20 56 41 4c 55 45  .'%q_node' VALUE
18f80 53 28 31 2c 20 7a 65 72 6f 62 6c 6f 62 28 25 64  S(1, zeroblob(%d
18f90 29 29 22 2c 0a 20 20 20 20 20 20 7a 44 62 2c 20  ))",.      zDb, 
18fa0 7a 50 72 65 66 69 78 2c 20 7a 44 62 2c 20 7a 50  zPrefix, zDb, zP
18fb0 72 65 66 69 78 2c 20 7a 44 62 2c 20 7a 50 72 65  refix, zDb, zPre
18fc0 66 69 78 2c 20 7a 44 62 2c 20 7a 50 72 65 66 69  fix, zDb, zPrefi
18fd0 78 2c 20 70 52 74 72 65 65 2d 3e 69 4e 6f 64 65  x, pRtree->iNode
18fe0 53 69 7a 65 0a 20 20 20 20 29 3b 0a 20 20 20 20  Size.    );.    
18ff0 69 66 28 20 21 7a 43 72 65 61 74 65 20 29 7b 0a  if( !zCreate ){.
19000 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
19010 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
19020 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
19030 33 5f 65 78 65 63 28 64 62 2c 20 7a 43 72 65 61  3_exec(db, zCrea
19040 74 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  te, 0, 0, 0);.  
19050 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
19060 43 72 65 61 74 65 29 3b 0a 20 20 20 20 69 66 28  Create);.    if(
19070 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
19080 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
19090 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  c;.    }.  }..  
190a0 61 70 70 53 74 6d 74 5b 30 5d 20 3d 20 26 70 52  appStmt[0] = &pR
190b0 74 72 65 65 2d 3e 70 57 72 69 74 65 4e 6f 64 65  tree->pWriteNode
190c0 3b 0a 20 20 61 70 70 53 74 6d 74 5b 31 5d 20 3d  ;.  appStmt[1] =
190d0 20 26 70 52 74 72 65 65 2d 3e 70 44 65 6c 65 74   &pRtree->pDelet
190e0 65 4e 6f 64 65 3b 0a 20 20 61 70 70 53 74 6d 74  eNode;.  appStmt
190f0 5b 32 5d 20 3d 20 26 70 52 74 72 65 65 2d 3e 70  [2] = &pRtree->p
19100 52 65 61 64 52 6f 77 69 64 3b 0a 20 20 61 70 70  ReadRowid;.  app
19110 53 74 6d 74 5b 33 5d 20 3d 20 26 70 52 74 72 65  Stmt[3] = &pRtre
19120 65 2d 3e 70 57 72 69 74 65 52 6f 77 69 64 3b 0a  e->pWriteRowid;.
19130 20 20 61 70 70 53 74 6d 74 5b 34 5d 20 3d 20 26    appStmt[4] = &
19140 70 52 74 72 65 65 2d 3e 70 44 65 6c 65 74 65 52  pRtree->pDeleteR
19150 6f 77 69 64 3b 0a 20 20 61 70 70 53 74 6d 74 5b  owid;.  appStmt[
19160 35 5d 20 3d 20 26 70 52 74 72 65 65 2d 3e 70 52  5] = &pRtree->pR
19170 65 61 64 50 61 72 65 6e 74 3b 0a 20 20 61 70 70  eadParent;.  app
19180 53 74 6d 74 5b 36 5d 20 3d 20 26 70 52 74 72 65  Stmt[6] = &pRtre
19190 65 2d 3e 70 57 72 69 74 65 50 61 72 65 6e 74 3b  e->pWriteParent;
191a0 0a 20 20 61 70 70 53 74 6d 74 5b 37 5d 20 3d 20  .  appStmt[7] = 
191b0 26 70 52 74 72 65 65 2d 3e 70 44 65 6c 65 74 65  &pRtree->pDelete
191c0 50 61 72 65 6e 74 3b 0a 0a 20 20 72 63 20 3d 20  Parent;..  rc = 
191d0 72 74 72 65 65 51 75 65 72 79 53 74 61 74 31 28  rtreeQueryStat1(
191e0 64 62 2c 20 70 52 74 72 65 65 29 3b 0a 20 20 66  db, pRtree);.  f
191f0 6f 72 28 69 3d 30 3b 20 69 3c 4e 5f 53 54 41 54  or(i=0; i<N_STAT
19200 45 4d 45 4e 54 20 26 26 20 72 63 3d 3d 53 51 4c  EMENT && rc==SQL
19210 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20  ITE_OK; i++){.  
19220 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73    char *zSql = s
19230 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61  qlite3_mprintf(a
19240 7a 53 71 6c 5b 69 5d 2c 20 7a 44 62 2c 20 7a 50  zSql[i], zDb, zP
19250 72 65 66 69 78 29 3b 0a 20 20 20 20 69 66 28 20  refix);.    if( 
19260 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  zSql ){.      rc
19270 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
19280 72 65 5f 76 33 28 64 62 2c 20 7a 53 71 6c 2c 20  re_v3(db, zSql, 
19290 2d 31 2c 20 53 51 4c 49 54 45 5f 50 52 45 50 41  -1, SQLITE_PREPA
192a0 52 45 5f 50 45 52 53 49 53 54 45 4e 54 2c 0a 20  RE_PERSISTENT,. 
192b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
192c0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70 70               app
192d0 53 74 6d 74 5b 69 5d 2c 20 30 29 3b 20 0a 20 20  Stmt[i], 0); .  
192e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
192f0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
19300 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
19310 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
19320 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
19330 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  ;.}../*.** The s
19340 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
19350 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
19360 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 65 78  contains the tex
19370 74 20 6f 66 20 61 6e 20 53 51 4c 20 73 74 61 74  t of an SQL stat
19380 65 6d 65 6e 74 0a 2a 2a 20 74 68 61 74 20 72 65  ement.** that re
19390 74 75 72 6e 73 20 61 20 73 69 6e 67 6c 65 20 69  turns a single i
193a0 6e 74 65 67 65 72 20 76 61 6c 75 65 2e 20 54 68  nteger value. Th
193b0 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 63  e statement is c
193c0 6f 6d 70 69 6c 65 64 20 61 6e 64 20 65 78 65 63  ompiled and exec
193d0 75 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20 64 61  uted.** using da
193e0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
193f0 6e 20 64 62 2e 20 49 66 20 73 75 63 63 65 73 73  n db. If success
19400 66 75 6c 2c 20 74 68 65 20 69 6e 74 65 67 65 72  ful, the integer
19410 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 0a   value returned.
19420 2a 2a 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ** is written to
19430 20 2a 70 69 56 61 6c 20 61 6e 64 20 53 51 4c 49   *piVal and SQLI
19440 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20  TE_OK returned. 
19450 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 53 51  Otherwise, an SQ
19460 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f  Lite error.** co
19470 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
19480 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  nd the value of 
19490 2a 70 69 56 61 6c 20 61 66 74 65 72 20 72 65 74  *piVal after ret
194a0 75 72 6e 69 6e 67 20 69 73 20 6e 6f 74 20 64 65  urning is not de
194b0 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  fined..*/.static
194c0 20 69 6e 74 20 67 65 74 49 6e 74 46 72 6f 6d 53   int getIntFromS
194d0 74 6d 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  tmt(sqlite3 *db,
194e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
194f0 6c 2c 20 69 6e 74 20 2a 70 69 56 61 6c 29 7b 0a  l, int *piVal){.
19500 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
19510 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 69 66 28 20 7a  E_NOMEM;.  if( z
19520 53 71 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Sql ){.    sqlit
19530 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
19540 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   0;.    rc = sql
19550 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
19560 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
19570 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66  Stmt, 0);.    if
19580 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
19590 29 7b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  ){.      if( SQL
195a0 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
195b0 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a  _step(pStmt) ){.
195c0 20 20 20 20 20 20 20 20 2a 70 69 56 61 6c 20 3d          *piVal =
195d0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
195e0 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20  int(pStmt, 0);. 
195f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
19600 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  = sqlite3_finali
19610 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d  ze(pStmt);.    }
19620 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
19630 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
19640 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
19650 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74  ed from within t
19660 68 65 20 78 43 6f 6e 6e 65 63 74 28 29 20 6f 72  he xConnect() or
19670 20 78 43 72 65 61 74 65 28 29 20 6d 65 74 68 6f   xCreate() metho
19680 64 20 74 6f 0a 2a 2a 20 64 65 74 65 72 6d 69 6e  d to.** determin
19690 65 20 74 68 65 20 6e 6f 64 65 2d 73 69 7a 65 20  e the node-size 
196a0 75 73 65 64 20 62 79 20 74 68 65 20 72 74 72 65  used by the rtre
196b0 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 63 72  e table being cr
196c0 65 61 74 65 64 20 6f 72 20 63 6f 6e 6e 65 63 74  eated or connect
196d0 65 64 0a 2a 2a 20 74 6f 2e 20 49 66 20 73 75 63  ed.** to. If suc
196e0 63 65 73 73 66 75 6c 2c 20 70 52 74 72 65 65 2d  cessful, pRtree-
196f0 3e 69 4e 6f 64 65 53 69 7a 65 20 69 73 20 70 6f  >iNodeSize is po
19700 70 75 6c 61 74 65 64 20 61 6e 64 20 53 51 4c 49  pulated and SQLI
19710 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
19720 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e  ** Otherwise, an
19730 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
19740 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
19750 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75  **.** If this fu
19760 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20  nction is being 
19770 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f  called as part o
19780 66 20 61 6e 20 78 43 6f 6e 6e 65 63 74 28 29 2c  f an xConnect(),
19790 20 74 68 65 6e 20 74 68 65 20 72 74 72 65 65 0a   then the rtree.
197a0 2a 2a 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79  ** table already
197b0 20 65 78 69 73 74 73 2e 20 49 6e 20 74 68 69 73   exists. In this
197c0 20 63 61 73 65 20 74 68 65 20 6e 6f 64 65 2d 73   case the node-s
197d0 69 7a 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65  ize is determine
197e0 64 20 62 79 20 69 6e 73 70 65 63 74 69 6e 67 0a  d by inspecting.
197f0 2a 2a 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65  ** the root node
19800 20 6f 66 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a   of the tree..**
19810 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66  .** Otherwise, f
19820 6f 72 20 61 6e 20 78 43 72 65 61 74 65 28 29 2c  or an xCreate(),
19830 20 75 73 65 20 36 34 20 62 79 74 65 73 20 6c 65   use 64 bytes le
19840 73 73 20 74 68 61 6e 20 74 68 65 20 64 61 74 61  ss than the data
19850 62 61 73 65 20 70 61 67 65 2d 73 69 7a 65 2e 20  base page-size. 
19860 0a 2a 2a 20 54 68 69 73 20 65 6e 73 75 72 65 73  .** This ensures
19870 20 74 68 61 74 20 65 61 63 68 20 6e 6f 64 65 20   that each node 
19880 69 73 20 73 74 6f 72 65 64 20 6f 6e 20 61 20 73  is stored on a s
19890 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 70  ingle database p
198a0 61 67 65 2e 20 49 66 20 74 68 65 20 0a 2a 2a 20  age. If the .** 
198b0 64 61 74 61 62 61 73 65 20 70 61 67 65 2d 73 69  database page-si
198c0 7a 65 20 69 73 20 73 6f 20 6c 61 72 67 65 20 74  ze is so large t
198d0 68 61 74 20 6d 6f 72 65 20 74 68 61 6e 20 52 54  hat more than RT
198e0 52 45 45 5f 4d 41 58 43 45 4c 4c 53 20 65 6e 74  REE_MAXCELLS ent
198f0 72 69 65 73 20 0a 2a 2a 20 77 6f 75 6c 64 20 66  ries .** would f
19900 69 74 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 6e  it in a single n
19910 6f 64 65 2c 20 75 73 65 20 61 20 73 6d 61 6c 6c  ode, use a small
19920 65 72 20 6e 6f 64 65 2d 73 69 7a 65 2e 0a 2a 2f  er node-size..*/
19930 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4e  .static int getN
19940 6f 64 65 53 69 7a 65 28 0a 20 20 73 71 6c 69 74  odeSize(.  sqlit
19950 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
19960 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
19970 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
19980 0a 20 20 52 74 72 65 65 20 2a 70 52 74 72 65 65  .  Rtree *pRtree
19990 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
199a0 20 20 20 2f 2a 20 52 74 72 65 65 20 68 61 6e 64     /* Rtree hand
199b0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 72  le */.  int isCr
199c0 65 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  eate,           
199d0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
199e0 66 6f 72 20 78 43 72 65 61 74 65 2c 20 66 61 6c  for xCreate, fal
199f0 73 65 20 66 6f 72 20 78 43 6f 6e 6e 65 63 74 20  se for xConnect 
19a00 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72  */.  char **pzEr
19a10 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
19a20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 72 72       /* OUT: Err
19a30 6f 72 20 6d 65 73 73 61 67 65 2c 20 69 66 20 61  or message, if a
19a40 6e 79 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ny */.){.  int r
19a50 63 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  c;.  char *zSql;
19a60 0a 20 20 69 66 28 20 69 73 43 72 65 61 74 65 20  .  if( isCreate 
19a70 29 7b 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65  ){.    int iPage
19a80 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7a 53  Size = 0;.    zS
19a90 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
19aa0 69 6e 74 66 28 22 50 52 41 47 4d 41 20 25 51 2e  intf("PRAGMA %Q.
19ab0 70 61 67 65 5f 73 69 7a 65 22 2c 20 70 52 74 72  page_size", pRtr
19ac0 65 65 2d 3e 7a 44 62 29 3b 0a 20 20 20 20 72 63  ee->zDb);.    rc
19ad0 20 3d 20 67 65 74 49 6e 74 46 72 6f 6d 53 74 6d   = getIntFromStm
19ae0 74 28 64 62 2c 20 7a 53 71 6c 2c 20 26 69 50 61  t(db, zSql, &iPa
19af0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28  geSize);.    if(
19b00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
19b10 7b 0a 20 20 20 20 20 20 70 52 74 72 65 65 2d 3e  {.      pRtree->
19b20 69 4e 6f 64 65 53 69 7a 65 20 3d 20 69 50 61 67  iNodeSize = iPag
19b30 65 53 69 7a 65 2d 36 34 3b 0a 20 20 20 20 20 20  eSize-64;.      
19b40 69 66 28 20 28 34 2b 70 52 74 72 65 65 2d 3e 6e  if( (4+pRtree->n
19b50 42 79 74 65 73 50 65 72 43 65 6c 6c 2a 52 54 52  BytesPerCell*RTR
19b60 45 45 5f 4d 41 58 43 45 4c 4c 53 29 3c 70 52 74  EE_MAXCELLS)<pRt
19b70 72 65 65 2d 3e 69 4e 6f 64 65 53 69 7a 65 20 29  ree->iNodeSize )
19b80 7b 0a 20 20 20 20 20 20 20 20 70 52 74 72 65 65  {.        pRtree
19b90 2d 3e 69 4e 6f 64 65 53 69 7a 65 20 3d 20 34 2b  ->iNodeSize = 4+
19ba0 70 52 74 72 65 65 2d 3e 6e 42 79 74 65 73 50 65  pRtree->nBytesPe
19bb0 72 43 65 6c 6c 2a 52 54 52 45 45 5f 4d 41 58 43  rCell*RTREE_MAXC
19bc0 45 4c 4c 53 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ELLS;.      }.  
19bd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a    }else{.      *
19be0 70 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f  pzErr = sqlite3_
19bf0 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71  mprintf("%s", sq
19c00 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
19c10 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
19c20 7b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c  {.    zSql = sql
19c30 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
19c40 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6c 65        "SELECT le
19c50 6e 67 74 68 28 64 61 74 61 29 20 46 52 4f 4d 20  ngth(data) FROM 
19c60 27 25 71 27 2e 27 25 71 5f 6e 6f 64 65 27 20 57  '%q'.'%q_node' W
19c70 48 45 52 45 20 6e 6f 64 65 6e 6f 20 3d 20 31 22  HERE nodeno = 1"
19c80 2c 0a 20 20 20 20 20 20 20 20 70 52 74 72 65 65  ,.        pRtree
19c90 2d 3e 7a 44 62 2c 20 70 52 74 72 65 65 2d 3e 7a  ->zDb, pRtree->z
19ca0 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20 20  Name.    );.    
19cb0 72 63 20 3d 20 67 65 74 49 6e 74 46 72 6f 6d 53  rc = getIntFromS
19cc0 74 6d 74 28 64 62 2c 20 7a 53 71 6c 2c 20 26 70  tmt(db, zSql, &p
19cd0 52 74 72 65 65 2d 3e 69 4e 6f 64 65 53 69 7a 65  Rtree->iNodeSize
19ce0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
19cf0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19d00 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69 74    *pzErr = sqlit
19d10 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c  e3_mprintf("%s",
19d20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
19d30 64 62 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  db));.    }else 
19d40 69 66 28 20 70 52 74 72 65 65 2d 3e 69 4e 6f 64  if( pRtree->iNod
19d50 65 53 69 7a 65 3c 28 35 31 32 2d 36 34 29 20 29  eSize<(512-64) )
19d60 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
19d70 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42  ITE_CORRUPT_VTAB
19d80 3b 0a 20 20 20 20 20 20 2a 70 7a 45 72 72 20 3d  ;.      *pzErr =
19d90 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
19da0 28 22 75 6e 64 65 72 73 69 7a 65 20 52 54 72 65  ("undersize RTre
19db0 65 20 62 6c 6f 62 73 20 69 6e 20 5c 22 25 71 5f  e blobs in \"%q_
19dc0 6e 6f 64 65 5c 22 22 2c 0a 20 20 20 20 20 20 20  node\"",.       
19dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19de0 20 20 20 20 20 20 20 20 70 52 74 72 65 65 2d 3e          pRtree->
19df0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
19e00 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  }..  sqlite3_fre
19e10 65 28 7a 53 71 6c 29 3b 0a 20 20 72 65 74 75 72  e(zSql);.  retur
19e20 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  n rc;.}../* .** 
19e30 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
19e40 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
19e50 69 6f 6e 20 6f 66 20 62 6f 74 68 20 74 68 65 20  ion of both the 
19e60 78 43 6f 6e 6e 65 63 74 20 61 6e 64 20 78 43 72  xConnect and xCr
19e70 65 61 74 65 0a 2a 2a 20 6d 65 74 68 6f 64 73 20  eate.** methods 
19e80 6f 66 20 74 68 65 20 72 2d 74 72 65 65 20 76 69  of the r-tree vi
19e90 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a  rtual table..**.
19ea0 2a 2a 20 20 20 61 72 67 76 5b 30 5d 20 20 20 2d  **   argv[0]   -
19eb0 3e 20 6d 6f 64 75 6c 65 20 6e 61 6d 65 0a 2a 2a  > module name.**
19ec0 20 20 20 61 72 67 76 5b 31 5d 20 20 20 2d 3e 20     argv[1]   -> 
19ed0 64 61 74 61 62 61 73 65 20 6e 61 6d 65 0a 2a 2a  database name.**
19ee0 20 20 20 61 72 67 76 5b 32 5d 20 20 20 2d 3e 20     argv[2]   -> 
19ef0 74 61 62 6c 65 20 6e 61 6d 65 0a 2a 2a 20 20 20  table name.**   
19f00 61 72 67 76 5b 2e 2e 2e 5d 20 2d 3e 20 63 6f 6c  argv[...] -> col
19f10 75 6d 6e 20 6e 61 6d 65 73 2e 2e 2e 0a 2a 2f 0a  umn names....*/.
19f20 73 74 61 74 69 63 20 69 6e 74 20 72 74 72 65 65  static int rtree
19f30 49 6e 69 74 28 0a 20 20 73 71 6c 69 74 65 33 20  Init(.  sqlite3 
19f40 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
19f50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
19f60 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
19f70 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41  on */.  void *pA
19f80 75 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ux,             
19f90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
19fa0 6e 65 20 6f 66 20 74 68 65 20 52 54 52 45 45 5f  ne of the RTREE_
19fb0 43 4f 4f 52 44 5f 2a 20 63 6f 6e 73 74 61 6e 74  COORD_* constant
19fc0 73 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  s */.  int argc,
19fd0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e   const char *con
19fe0 73 74 2a 61 72 67 76 2c 20 20 20 2f 2a 20 50 61  st*argv,   /* Pa
19ff0 72 61 6d 65 74 65 72 73 20 74 6f 20 43 52 45 41  rameters to CREA
1a000 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
1a010 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  nt */.  sqlite3_
1a020 76 74 61 62 20 2a 2a 70 70 56 74 61 62 2c 20 20  vtab **ppVtab,  
1a030 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1a040 55 54 3a 20 4e 65 77 20 76 69 72 74 75 61 6c 20  UT: New virtual 
1a050 74 61 62 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20  table */.  char 
1a060 2a 2a 70 7a 45 72 72 2c 20 20 20 20 20 20 20 20  **pzErr,        
1a070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a080 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20 6d 65 73  * OUT: Error mes
1a090 73 61 67 65 2c 20 69 66 20 61 6e 79 20 2a 2f 0a  sage, if any */.
1a0a0 20 20 69 6e 74 20 69 73 43 72 65 61 74 65 20 20    int isCreate  
1a0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0c0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
1a0d0 72 20 78 43 72 65 61 74 65 2c 20 66 61 6c 73 65  r xCreate, false
1a0e0 20 66 6f 72 20 78 43 6f 6e 6e 65 63 74 20 2a 2f   for xConnect */
1a0f0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
1a100 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 52 74 72 65  QLITE_OK;.  Rtre
1a110 65 20 2a 70 52 74 72 65 65 3b 0a 20 20 69 6e 74  e *pRtree;.  int
1a120 20 6e 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   nDb;           
1a130 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
1a140 73 74 72 69 6e 67 20 61 72 67 76 5b 31 5d 20 2a  string argv[1] *
1a150 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20  /.  int nName;  
1a160 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
1a170 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20 61 72  gth of string ar
1a180 67 76 5b 32 5d 20 2a 2f 0a 20 20 69 6e 74 20 65  gv[2] */.  int e
1a190 43 6f 6f 72 64 54 79 70 65 20 3d 20 28 70 41 75  CoordType = (pAu
1a1a0 78 20 3f 20 52 54 52 45 45 5f 43 4f 4f 52 44 5f  x ? RTREE_COORD_
1a1b0 49 4e 54 33 32 20 3a 20 52 54 52 45 45 5f 43 4f  INT32 : RTREE_CO
1a1c0 4f 52 44 5f 52 45 41 4c 33 32 29 3b 0a 0a 20 20  ORD_REAL32);..  
1a1d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 45 72 72  const char *aErr
1a1e0 4d 73 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 30 2c  Msg[] = {.    0,
1a1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a220 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20 20 20 20      /* 0 */.    
1a230 22 57 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66  "Wrong number of
1a240 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 61 6e 20   columns for an 
1a250 72 74 72 65 65 20 74 61 62 6c 65 22 2c 20 20 20  rtree table",   
1a260 20 20 20 20 20 20 2f 2a 20 31 20 2a 2f 0a 20 20        /* 1 */.  
1a270 20 20 22 54 6f 6f 20 66 65 77 20 63 6f 6c 75 6d    "Too few colum
1a280 6e 73 20 66 6f 72 20 61 6e 20 72 74 72 65 65 20  ns for an rtree 
1a290 74 61 62 6c 65 22 2c 20 20 20 20 20 20 20 20 20  table",         
1a2a0 20 20 20 20 20 20 20 20 2f 2a 20 32 20 2a 2f 0a          /* 2 */.
1a2b0 20 20 20 20 22 54 6f 6f 20 6d 61 6e 79 20 63 6f      "Too many co
1a2c0 6c 75 6d 6e 73 20 66 6f 72 20 61 6e 20 72 74 72  lumns for an rtr
1a2d0 65 65 20 74 61 62 6c 65 22 20 20 20 20 20 20 20  ee table"       
1a2e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 33 20 2a            /* 3 *
1a2f0 2f 0a 20 20 7d 3b 0a 0a 20 20 69 6e 74 20 69 45  /.  };..  int iE
1a300 72 72 20 3d 20 28 61 72 67 63 3c 36 29 20 3f 20  rr = (argc<6) ? 
1a310 32 20 3a 20 61 72 67 63 3e 28 52 54 52 45 45 5f  2 : argc>(RTREE_
1a320 4d 41 58 5f 44 49 4d 45 4e 53 49 4f 4e 53 2a 32  MAX_DIMENSIONS*2
1a330 2b 34 29 20 3f 20 33 20 3a 20 61 72 67 63 25 32  +4) ? 3 : argc%2
1a340 3b 0a 20 20 69 66 28 20 61 45 72 72 4d 73 67 5b  ;.  if( aErrMsg[
1a350 69 45 72 72 5d 20 29 7b 0a 20 20 20 20 2a 70 7a  iErr] ){.    *pz
1a360 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Err = sqlite3_mp
1a370 72 69 6e 74 66 28 22 25 73 22 2c 20 61 45 72 72  rintf("%s", aErr
1a380 4d 73 67 5b 69 45 72 72 5d 29 3b 0a 20 20 20 20  Msg[iErr]);.    
1a390 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
1a3a0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  ROR;.  }..  sqli
1a3b0 74 65 33 5f 76 74 61 62 5f 63 6f 6e 66 69 67 28  te3_vtab_config(
1a3c0 64 62 2c 20 53 51 4c 49 54 45 5f 56 54 41 42 5f  db, SQLITE_VTAB_
1a3d0 43 4f 4e 53 54 52 41 49 4e 54 5f 53 55 50 50 4f  CONSTRAINT_SUPPO
1a3e0 52 54 2c 20 31 29 3b 0a 0a 20 20 2f 2a 20 41 6c  RT, 1);..  /* Al
1a3f0 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69 74  locate the sqlit
1a400 65 33 5f 76 74 61 62 20 73 74 72 75 63 74 75 72  e3_vtab structur
1a410 65 20 2a 2f 0a 20 20 6e 44 62 20 3d 20 28 69 6e  e */.  nDb = (in
1a420 74 29 73 74 72 6c 65 6e 28 61 72 67 76 5b 31 5d  t)strlen(argv[1]
1a430 29 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20 28 69 6e  );.  nName = (in
1a440 74 29 73 74 72 6c 65 6e 28 61 72 67 76 5b 32 5d  t)strlen(argv[2]
1a450 29 3b 0a 20 20 70 52 74 72 65 65 20 3d 20 28 52  );.  pRtree = (R
1a460 74 72 65 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d  tree *)sqlite3_m
1a470 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 52 74 72  alloc(sizeof(Rtr
1a480 65 65 29 2b 6e 44 62 2b 6e 4e 61 6d 65 2b 32 29  ee)+nDb+nName+2)
1a490 3b 0a 20 20 69 66 28 20 21 70 52 74 72 65 65 20  ;.  if( !pRtree 
1a4a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1a4b0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
1a4c0 20 20 6d 65 6d 73 65 74 28 70 52 74 72 65 65 2c    memset(pRtree,
1a4d0 20 30 2c 20 73 69 7a 65 6f 66 28 52 74 72 65 65   0, sizeof(Rtree
1a4e0 29 2b 6e 44 62 2b 6e 4e 61 6d 65 2b 32 29 3b 0a  )+nDb+nName+2);.
1a4f0 20 20 70 52 74 72 65 65 2d 3e 6e 42 75 73 79 20    pRtree->nBusy 
1a500 3d 20 31 3b 0a 20 20 70 52 74 72 65 65 2d 3e 62  = 1;.  pRtree->b
1a510 61 73 65 2e 70 4d 6f 64 75 6c 65 20 3d 20 26 72  ase.pModule = &r
1a520 74 72 65 65 4d 6f 64 75 6c 65 3b 0a 20 20 70 52  treeModule;.  pR
1a530 74 72 65 65 2d 3e 7a 44 62 20 3d 20 28 63 68 61  tree->zDb = (cha
1a540 72 20 2a 29 26 70 52 74 72 65 65 5b 31 5d 3b 0a  r *)&pRtree[1];.
1a550 20 20 70 52 74 72 65 65 2d 3e 7a 4e 61 6d 65 20    pRtree->zName 
1a560 3d 20 26 70 52 74 72 65 65 2d 3e 7a 44 62 5b 6e  = &pRtree->zDb[n
1a570 44 62 2b 31 5d 3b 0a 20 20 70 52 74 72 65 65 2d  Db+1];.  pRtree-
1a580 3e 6e 44 69 6d 20 3d 20 28 75 38 29 28 28 61 72  >nDim = (u8)((ar
1a590 67 63 2d 34 29 2f 32 29 3b 0a 20 20 70 52 74 72  gc-4)/2);.  pRtr
1a5a0 65 65 2d 3e 6e 44 69 6d 32 20 3d 20 70 52 74 72  ee->nDim2 = pRtr
1a5b0 65 65 2d 3e 6e 44 69 6d 2a 32 3b 0a 20 20 70 52  ee->nDim*2;.  pR
1a5c0 74 72 65 65 2d 3e 6e 42 79 74 65 73 50 65 72 43  tree->nBytesPerC
1a5d0 65 6c 6c 20 3d 20 38 20 2b 20 70 52 74 72 65 65  ell = 8 + pRtree
1a5e0 2d 3e 6e 44 69 6d 32 2a 34 3b 0a 20 20 70 52 74  ->nDim2*4;.  pRt
1a5f0 72 65 65 2d 3e 65 43 6f 6f 72 64 54 79 70 65 20  ree->eCoordType 
1a600 3d 20 28 75 38 29 65 43 6f 6f 72 64 54 79 70 65  = (u8)eCoordType
1a610 3b 0a 20 20 6d 65 6d 63 70 79 28 70 52 74 72 65  ;.  memcpy(pRtre
1a620 65 2d 3e 7a 44 62 2c 20 61 72 67 76 5b 31 5d 2c  e->zDb, argv[1],
1a630 20 6e 44 62 29 3b 0a 20 20 6d 65 6d 63 70 79 28   nDb);.  memcpy(
1a640 70 52 74 72 65 65 2d 3e 7a 4e 61 6d 65 2c 20 61  pRtree->zName, a
1a650 72 67 76 5b 32 5d 2c 20 6e 4e 61 6d 65 29 3b 0a  rgv[2], nName);.
1a660 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
1a670 20 74 68 65 20 6e 6f 64 65 20 73 69 7a 65 20 74   the node size t
1a680 6f 20 75 73 65 2e 20 2a 2f 0a 20 20 72 63 20 3d  o use. */.  rc =
1a690 20 67 65 74 4e 6f 64 65 53 69 7a 65 28 64 62 2c   getNodeSize(db,
1a6a0 20 70 52 74 72 65 65 2c 20 69 73 43 72 65 61 74   pRtree, isCreat
1a6b0 65 2c 20 70 7a 45 72 72 29 3b 0a 0a 20 20 2f 2a  e, pzErr);..  /*
1a6c0 20 43 72 65 61 74 65 2f 43 6f 6e 6e 65 63 74 20   Create/Connect 
1a6d0 74 6f 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  to the underlyin
1a6e0 67 20 72 65 6c 61 74 69 6f 6e 61 6c 20 64 61 74  g relational dat
1a6f0 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66  abase schema. If
1a700 0a 20 20 2a 2a 20 74 68 61 74 20 69 73 20 73 75  .  ** that is su
1a710 63 63 65 73 73 66 75 6c 2c 20 63 61 6c 6c 20 73  ccessful, call s
1a720 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76  qlite3_declare_v
1a730 74 61 62 28 29 20 74 6f 20 63 6f 6e 66 69 67 75  tab() to configu
1a740 72 65 0a 20 20 2a 2a 20 74 68 65 20 72 2d 74 72  re.  ** the r-tr
1a750 65 65 20 74 61 62 6c 65 20 73 63 68 65 6d 61 2e  ee table schema.
1a760 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
1a770 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a780 20 69 66 28 20 28 72 63 20 3d 20 72 74 72 65 65   if( (rc = rtree
1a790 53 71 6c 49 6e 69 74 28 70 52 74 72 65 65 2c 20  SqlInit(pRtree, 
1a7a0 64 62 2c 20 61 72 67 76 5b 31 5d 2c 20 61 72 67  db, argv[1], arg
1a7b0 76 5b 32 5d 2c 20 69 73 43 72 65 61 74 65 29 29  v[2], isCreate))
1a7c0 20 29 7b 0a 20 20 20 20 20 20 2a 70 7a 45 72 72   ){.      *pzErr
1a7d0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
1a7e0 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33  tf("%s", sqlite3
1a7f0 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20  _errmsg(db));.  
1a800 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
1a810 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69  har *zSql = sqli
1a820 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 43 52 45  te3_mprintf("CRE
1a830 41 54 45 20 54 41 42 4c 45 20 78 28 25 73 22 2c  ATE TABLE x(%s",
1a840 20 61 72 67 76 5b 33 5d 29 3b 0a 20 20 20 20 20   argv[3]);.     
1a850 20 63 68 61 72 20 2a 7a 54 6d 70 3b 0a 20 20 20   char *zTmp;.   
1a860 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20     int ii;.     
1a870 20 66 6f 72 28 69 69 3d 34 3b 20 7a 53 71 6c 20   for(ii=4; zSql 
1a880 26 26 20 69 69 3c 61 72 67 63 3b 20 69 69 2b 2b  && ii<argc; ii++
1a890 29 7b 0a 20 20 20 20 20 20 20 20 7a 54 6d 70 20  ){.        zTmp 
1a8a0 3d 20 7a 53 71 6c 3b 0a 20 20 20 20 20 20 20 20  = zSql;.        
1a8b0 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
1a8c0 70 72 69 6e 74 66 28 22 25 73 2c 20 25 73 22 2c  printf("%s, %s",
1a8d0 20 7a 54 6d 70 2c 20 61 72 67 76 5b 69 69 5d 29   zTmp, argv[ii])
1a8e0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1a8f0 33 5f 66 72 65 65 28 7a 54 6d 70 29 3b 0a 20 20  3_free(zTmp);.  
1a900 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1a910 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  zSql ){.        
1a920 7a 54 6d 70 20 3d 20 7a 53 71 6c 3b 0a 20 20 20  zTmp = zSql;.   
1a930 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69       zSql = sqli
1a940 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 29  te3_mprintf("%s)
1a950 3b 22 2c 20 7a 54 6d 70 29 3b 0a 20 20 20 20 20  ;", zTmp);.     
1a960 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1a970 7a 54 6d 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20  zTmp);.      }. 
1a980 20 20 20 20 20 69 66 28 20 21 7a 53 71 6c 20 29       if( !zSql )
1a990 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
1a9a0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
1a9b0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 53 51 4c     }else if( SQL
1a9c0 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
1a9d0 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74  lite3_declare_vt
1a9e0 61 62 28 64 62 2c 20 7a 53 71 6c 29 29 20 29 7b  ab(db, zSql)) ){
1a9f0 0a 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72 20  .        *pzErr 
1aa00 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
1aa10 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f  f("%s", sqlite3_
1aa20 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20  errmsg(db));.   
1aa30 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1aa40 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
1aa50 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
1aa60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1aa70 0a 20 20 20 20 2a 70 70 56 74 61 62 20 3d 20 28  .    *ppVtab = (
1aa80 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 29 70  sqlite3_vtab *)p
1aa90 52 74 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Rtree;.  }else{.
1aaa0 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 70 56      assert( *ppV
1aab0 74 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  tab==0 );.    as
1aac0 73 65 72 74 28 20 70 52 74 72 65 65 2d 3e 6e 42  sert( pRtree->nB
1aad0 75 73 79 3d 3d 31 20 29 3b 0a 20 20 20 20 72 74  usy==1 );.    rt
1aae0 72 65 65 52 65 6c 65 61 73 65 28 70 52 74 72 65  reeRelease(pRtre
1aaf0 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
1ab00 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49   rc;.}.../*.** I
1ab10 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
1ab20 20 61 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69   a scalar functi
1ab30 6f 6e 20 74 68 61 74 20 64 65 63 6f 64 65 73 20  on that decodes 
1ab40 72 2d 74 72 65 65 20 6e 6f 64 65 73 20 74 6f 0a  r-tree nodes to.
1ab50 2a 2a 20 68 75 6d 61 6e 20 72 65 61 64 61 62 6c  ** human readabl
1ab60 65 20 73 74 72 69 6e 67 73 2e 20 54 68 69 73 20  e strings. This 
1ab70 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20  can be used for 
1ab80 64 65 62 75 67 67 69 6e 67 20 61 6e 64 20 61 6e  debugging and an
1ab90 61 6c 79 73 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  alysis..**.** Th
1aba0 65 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f  e scalar functio
1abb0 6e 20 74 61 6b 65 73 20 74 77 6f 20 61 72 67 75  n takes two argu
1abc0 6d 65 6e 74 73 3a 20 28 31 29 20 74 68 65 20 6e  ments: (1) the n
1abd0 75 6d 62 65 72 20 6f 66 20 64 69 6d 65 6e 73 69  umber of dimensi
1abe0 6f 6e 73 0a 2a 2a 20 74 6f 20 74 68 65 20 72 74  ons.** to the rt
1abf0 72 65 65 20 28 62 65 74 77 65 65 6e 20 31 20 61  ree (between 1 a
1ac00 6e 64 20 35 2c 20 69 6e 63 6c 75 73 69 76 65 29  nd 5, inclusive)
1ac10 20 61 6e 64 20 28 32 29 20 61 20 62 6c 6f 62 20   and (2) a blob 
1ac20 6f 66 20 64 61 74 61 20 63 6f 6e 74 61 69 6e 69  of data containi
1ac30 6e 67 0a 2a 2a 20 61 6e 20 72 2d 74 72 65 65 20  ng.** an r-tree 
1ac40 6e 6f 64 65 2e 20 20 46 6f 72 20 61 20 74 77 6f  node.  For a two
1ac50 2d 64 69 6d 65 6e 73 69 6f 6e 61 6c 20 72 2d 74  -dimensional r-t
1ac60 72 65 65 20 73 74 72 75 63 74 75 72 65 20 63 61  ree structure ca
1ac70 6c 6c 65 64 20 22 72 74 22 2c 20 74 6f 0a 2a 2a  lled "rt", to.**
1ac80 20 64 65 73 65 72 69 61 6c 69 7a 65 20 61 6c 6c   deserialize all
1ac90 20 6e 6f 64 65 73 2c 20 61 20 73 74 61 74 65 6d   nodes, a statem
1aca0 65 6e 74 20 6c 69 6b 65 3a 0a 2a 2a 0a 2a 2a 20  ent like:.**.** 
1acb0 20 20 53 45 4c 45 43 54 20 72 74 72 65 65 6e 6f    SELECT rtreeno
1acc0 64 65 28 32 2c 20 64 61 74 61 29 20 46 52 4f 4d  de(2, data) FROM
1acd0 20 72 74 5f 6e 6f 64 65 3b 0a 2a 2a 0a 2a 2a 20   rt_node;.**.** 
1ace0 54 68 65 20 68 75 6d 61 6e 20 72 65 61 64 61 62  The human readab
1acf0 6c 65 20 73 74 72 69 6e 67 20 74 61 6b 65 73 20  le string takes 
1ad00 74 68 65 20 66 6f 72 6d 20 6f 66 20 61 20 54 63  the form of a Tc
1ad10 6c 20 6c 69 73 74 20 77 69 74 68 20 6f 6e 65 0a  l list with one.
1ad20 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 65 61 63  ** entry for eac
1ad30 68 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 72 2d  h cell in the r-
1ad40 74 72 65 65 20 6e 6f 64 65 2e 20 45 61 63 68 20  tree node. Each 
1ad50 65 6e 74 72 79 20 69 73 20 69 74 73 65 6c 66 20  entry is itself 
1ad60 61 0a 2a 2a 20 6c 69 73 74 2c 20 63 6f 6e 74 61  a.** list, conta
1ad70 69 6e 69 6e 67 20 74 68 65 20 38 2d 62 79 74 65  ining the 8-byte
1ad80 20 72 6f 77 69 64 2f 70 61 67 65 6e 6f 20 66 6f   rowid/pageno fo
1ad90 6c 6c 6f 77 65 64 20 62 79 20 74 68 65 20 0a 2a  llowed by the .*
1ada0 2a 20 3c 6e 75 6d 2d 64 69 6d 65 6e 73 69 6f 6e  * <num-dimension
1adb0 3e 2a 32 20 63 6f 6f 72 64 69 6e 61 74 65 73 2e  >*2 coordinates.
1adc0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1add0 72 74 72 65 65 6e 6f 64 65 28 73 71 6c 69 74 65  rtreenode(sqlite
1ade0 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20  3_context *ctx, 
1adf0 69 6e 74 20 6e 41 72 67 2c 20 73 71 6c 69 74 65  int nArg, sqlite
1ae00 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72 67 29  3_value **apArg)
1ae10 7b 0a 20 20 63 68 61 72 20 2a 7a 54 65 78 74 20  {.  char *zText 
1ae20 3d 20 30 3b 0a 20 20 52 74 72 65 65 4e 6f 64 65  = 0;.  RtreeNode
1ae30 20 6e 6f 64 65 3b 0a 20 20 52 74 72 65 65 20 74   node;.  Rtree t
1ae40 72 65 65 3b 0a 20 20 69 6e 74 20 69 69 3b 0a 0a  ree;.  int ii;..
1ae50 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1ae60 45 52 28 6e 41 72 67 29 3b 0a 20 20 6d 65 6d 73  ER(nArg);.  mems
1ae70 65 74 28 26 6e 6f 64 65 2c 20 30 2c 20 73 69 7a  et(&node, 0, siz
1ae80 65 6f 66 28 52 74 72 65 65 4e 6f 64 65 29 29 3b  eof(RtreeNode));
1ae90 0a 20 20 6d 65 6d 73 65 74 28 26 74 72 65 65 2c  .  memset(&tree,
1aea0 20 30 2c 20 73 69 7a 65 6f 66 28 52 74 72 65 65   0, sizeof(Rtree
1aeb0 29 29 3b 0a 20 20 74 72 65 65 2e 6e 44 69 6d 20  ));.  tree.nDim 
1aec0 3d 20 28 75 38 29 73 71 6c 69 74 65 33 5f 76 61  = (u8)sqlite3_va
1aed0 6c 75 65 5f 69 6e 74 28 61 70 41 72 67 5b 30 5d  lue_int(apArg[0]
1aee0 29 3b 0a 20 20 74 72 65 65 2e 6e 44 69 6d 32 20  );.  tree.nDim2 
1aef0 3d 20 74 72 65 65 2e 6e 44 69 6d 2a 32 3b 0a 20  = tree.nDim*2;. 
1af00 20 74 72 65 65 2e 6e 42 79 74 65 73 50 65 72 43   tree.nBytesPerC
1af10 65 6c 6c 20 3d 20 38 20 2b 20 38 20 2a 20 74 72  ell = 8 + 8 * tr
1af20 65 65 2e 6e 44 69 6d 3b 0a 20 20 6e 6f 64 65 2e  ee.nDim;.  node.
1af30 7a 44 61 74 61 20 3d 20 28 75 38 20 2a 29 73 71  zData = (u8 *)sq
1af40 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62  lite3_value_blob
1af50 28 61 70 41 72 67 5b 31 5d 29 3b 0a 0a 20 20 66  (apArg[1]);..  f
1af60 6f 72 28 69 69 3d 30 3b 20 69 69 3c 4e 43 45 4c  or(ii=0; ii<NCEL
1af70 4c 28 26 6e 6f 64 65 29 3b 20 69 69 2b 2b 29 7b  L(&node); ii++){
1af80 0a 20 20 20 20 63 68 61 72 20 7a 43 65 6c 6c 5b  .    char zCell[
1af90 35 31 32 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 43  512];.    int nC
1afa0 65 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 52 74 72  ell = 0;.    Rtr
1afb0 65 65 43 65 6c 6c 20 63 65 6c 6c 3b 0a 20 20 20  eeCell cell;.   
1afc0 20 69 6e 74 20 6a 6a 3b 0a 0a 20 20 20 20 6e 6f   int jj;..    no
1afd0 64 65 47 65 74 43 65 6c 6c 28 26 74 72 65 65 2c  deGetCell(&tree,
1afe0 20 26 6e 6f 64 65 2c 20 69 69 2c 20 26 63 65 6c   &node, ii, &cel
1aff0 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  l);.    sqlite3_
1b000 73 6e 70 72 69 6e 74 66 28 35 31 32 2d 6e 43 65  snprintf(512-nCe
1b010 6c 6c 2c 26 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d  ll,&zCell[nCell]
1b020 2c 22 25 6c 6c 64 22 2c 20 63 65 6c 6c 2e 69 52  ,"%lld", cell.iR
1b030 6f 77 69 64 29 3b 0a 20 20 20 20 6e 43 65 6c 6c  owid);.    nCell
1b040 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   = (int)strlen(z
1b050 43 65 6c 6c 29 3b 0a 20 20 20 20 66 6f 72 28 6a  Cell);.    for(j
1b060 6a 3d 30 3b 20 6a 6a 3c 74 72 65 65 2e 6e 44 69  j=0; jj<tree.nDi
1b070 6d 32 3b 20 6a 6a 2b 2b 29 7b 0a 23 69 66 6e 64  m2; jj++){.#ifnd
1b080 65 66 20 53 51 4c 49 54 45 5f 52 54 52 45 45 5f  ef SQLITE_RTREE_
1b090 49 4e 54 5f 4f 4e 4c 59 0a 20 20 20 20 20 20 73  INT_ONLY.      s
1b0a0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
1b0b0 35 31 32 2d 6e 43 65 6c 6c 2c 26 7a 43 65 6c 6c  512-nCell,&zCell
1b0c0 5b 6e 43 65 6c 6c 5d 2c 20 22 20 25 67 22 2c 0a  [nCell], " %g",.
1b0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b0e0 20 20 20 20 20 20 20 28 64 6f 75 62 6c 65 29 63         (double)c
1b0f0 65 6c 6c 2e 61 43 6f 6f 72 64 5b 6a 6a 5d 2e 66  ell.aCoord[jj].f
1b100 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 73  );.#else.      s
1b110 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
1b120 35 31 32 2d 6e 43 65 6c 6c 2c 26 7a 43 65 6c 6c  512-nCell,&zCell
1b130 5b 6e 43 65 6c 6c 5d 2c 20 22 20 25 64 22 2c 0a  [nCell], " %d",.
1b140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b150 20 20 20 20 20 20 20 63 65 6c 6c 2e 61 43 6f 6f         cell.aCoo
1b160 72 64 5b 6a 6a 5d 2e 69 29 3b 0a 23 65 6e 64 69  rd[jj].i);.#endi
1b170 66 0a 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20  f.      nCell = 
1b180 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 43 65 6c  (int)strlen(zCel
1b190 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  l);.    }..    i
1b1a0 66 28 20 7a 54 65 78 74 20 29 7b 0a 20 20 20 20  f( zText ){.    
1b1b0 20 20 63 68 61 72 20 2a 7a 54 65 78 74 4e 65 77    char *zTextNew
1b1c0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
1b1d0 74 66 28 22 25 73 20 7b 25 73 7d 22 2c 20 7a 54  tf("%s {%s}", zT
1b1e0 65 78 74 2c 20 7a 43 65 6c 6c 29 3b 0a 20 20 20  ext, zCell);.   
1b1f0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1b200 7a 54 65 78 74 29 3b 0a 20 20 20 20 20 20 7a 54  zText);.      zT
1b210 65 78 74 20 3d 20 7a 54 65 78 74 4e 65 77 3b 0a  ext = zTextNew;.
1b220 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b230 20 7a 54 65 78 74 20 3d 20 73 71 6c 69 74 65 33   zText = sqlite3
1b240 5f 6d 70 72 69 6e 74 66 28 22 7b 25 73 7d 22 2c  _mprintf("{%s}",
1b250 20 7a 43 65 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20   zCell);.    }. 
1b260 20 7d 0a 20 20 0a 20 20 73 71 6c 69 74 65 33 5f   }.  .  sqlite3_
1b270 72 65 73 75 6c 74 5f 74 65 78 74 28 63 74 78 2c  result_text(ctx,
1b280 20 7a 54 65 78 74 2c 20 2d 31 2c 20 73 71 6c 69   zText, -1, sqli
1b290 74 65 33 5f 66 72 65 65 29 3b 0a 7d 0a 0a 2f 2a  te3_free);.}../*
1b2a0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d   This routine im
1b2b0 70 6c 65 6d 65 6e 74 73 20 61 6e 20 53 51 4c 20  plements an SQL 
1b2c0 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 72 65  function that re
1b2d0 74 75 72 6e 73 20 74 68 65 20 22 64 65 70 74 68  turns the "depth
1b2e0 22 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 66  " parameter.** f
1b2f0 72 6f 6d 20 74 68 65 20 66 72 6f 6e 74 20 6f 66  rom the front of
1b300 20 61 20 62 6c 6f 62 20 74 68 61 74 20 69 73 20   a blob that is 
1b310 61 6e 20 72 2d 74 72 65 65 20 6e 6f 64 65 2e 20  an r-tree node. 
1b320 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a   For example:.**
1b330 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 72  .**     SELECT r
1b340 74 72 65 65 64 65 70 74 68 28 64 61 74 61 29 20  treedepth(data) 
1b350 46 52 4f 4d 20 72 74 5f 6e 6f 64 65 20 57 48 45  FROM rt_node WHE
1b360 52 45 20 6e 6f 64 65 6e 6f 3d 31 3b 0a 2a 2a 0a  RE nodeno=1;.**.
1b370 2a 2a 20 54 68 65 20 64 65 70 74 68 20 76 61 6c  ** The depth val
1b380 75 65 20 69 73 20 30 20 66 6f 72 20 61 6c 6c 20  ue is 0 for all 
1b390 6e 6f 64 65 73 20 6f 74 68 65 72 20 74 68 61 6e  nodes other than
1b3a0 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2c 20   the root node, 
1b3b0 61 6e 64 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20  and the root.** 
1b3c0 6e 6f 64 65 20 61 6c 77 61 79 73 20 68 61 73 20  node always has 
1b3d0 6e 6f 64 65 6e 6f 3d 31 2c 20 73 6f 20 74 68 65  nodeno=1, so the
1b3e0 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 20 69   example above i
1b3f0 73 20 74 68 65 20 70 72 69 6d 61 72 79 20 75 73  s the primary us
1b400 65 20 66 6f 72 20 74 68 69 73 0a 2a 2a 20 72 6f  e for this.** ro
1b410 75 74 69 6e 65 2e 20 20 54 68 69 73 20 72 6f 75  utine.  This rou
1b420 74 69 6e 65 20 69 73 20 69 6e 74 65 6e 64 65 64  tine is intended
1b430 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
1b440 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a   analysis only..
1b450 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
1b460 74 72 65 65 64 65 70 74 68 28 73 71 6c 69 74 65  treedepth(sqlite
1b470 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20  3_context *ctx, 
1b480 69 6e 74 20 6e 41 72 67 2c 20 73 71 6c 69 74 65  int nArg, sqlite
1b490 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72 67 29  3_value **apArg)
1b4a0 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
1b4b0 45 54 45 52 28 6e 41 72 67 29 3b 0a 20 20 69 66  ETER(nArg);.  if
1b4c0 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ( sqlite3_value_
1b4d0 74 79 70 65 28 61 70 41 72 67 5b 30 5d 29 21 3d  type(apArg[0])!=
1b4e0 53 51 4c 49 54 45 5f 42 4c 4f 42 20 0a 20 20 20  SQLITE_BLOB .   
1b4f0 7c 7c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  || sqlite3_value
1b500 5f 62 79 74 65 73 28 61 70 41 72 67 5b 30 5d 29  _bytes(apArg[0])
1b510 3c 32 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69  <2.  ){.    sqli
1b520 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
1b530 28 63 74 78 2c 20 22 49 6e 76 61 6c 69 64 20 61  (ctx, "Invalid a
1b540 72 67 75 6d 65 6e 74 20 74 6f 20 72 74 72 65 65  rgument to rtree
1b550 64 65 70 74 68 28 29 22 2c 20 2d 31 29 3b 20 0a  depth()", -1); .
1b560 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20    }else{.    u8 
1b570 2a 7a 42 6c 6f 62 20 3d 20 28 75 38 20 2a 29 73  *zBlob = (u8 *)s
1b580 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
1b590 62 28 61 70 41 72 67 5b 30 5d 29 3b 0a 20 20 20  b(apArg[0]);.   
1b5a0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
1b5b0 69 6e 74 28 63 74 78 2c 20 72 65 61 64 49 6e 74  int(ctx, readInt
1b5c0 31 36 28 7a 42 6c 6f 62 29 29 3b 0a 20 20 7d 0a  16(zBlob));.  }.
1b5d0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 65 78 74  }../*.** Context
1b5e0 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 62   object passed b
1b5f0 65 74 77 65 65 6e 20 74 68 65 20 76 61 72 69 6f  etween the vario
1b600 75 73 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74  us routines that
1b610 20 6d 61 6b 65 20 75 70 20 74 68 65 0a 2a 2a 20   make up the.** 
1b620 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
1b630 66 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63  f integrity-chec
1b640 6b 20 66 75 6e 63 74 69 6f 6e 20 72 74 72 65 65  k function rtree
1b650 63 68 65 63 6b 28 29 2e 0a 2a 2f 0a 74 79 70 65  check()..*/.type
1b660 64 65 66 20 73 74 72 75 63 74 20 52 74 72 65 65  def struct Rtree
1b670 43 68 65 63 6b 20 52 74 72 65 65 43 68 65 63 6b  Check RtreeCheck
1b680 3b 0a 73 74 72 75 63 74 20 52 74 72 65 65 43 68  ;.struct RtreeCh
1b690 65 63 6b 20 7b 0a 20 20 73 71 6c 69 74 65 33 20  eck {.  sqlite3 
1b6a0 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
1b6b0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
1b6c0 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
1b6d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b  const char *zDb;
1b6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6f0 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 74  /* Database cont
1b700 61 69 6e 69 6e 67 20 72 74 72 65 65 20 74 61 62  aining rtree tab
1b710 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  le */.  const ch
1b720 61 72 20 2a 7a 54 61 62 3b 20 20 20 20 20 20 20  ar *zTab;       
1b730 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
1b740 6f 66 20 72 74 72 65 65 20 74 61 62 6c 65 20 2a  of rtree table *
1b750 2f 0a 20 20 69 6e 74 20 62 49 6e 74 3b 20 20 20  /.  int bInt;   
1b760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b770 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
1b780 72 74 72 65 65 5f 69 33 32 20 74 61 62 6c 65 20  rtree_i32 table 
1b790 2a 2f 0a 20 20 69 6e 74 20 6e 44 69 6d 3b 20 20  */.  int nDim;  
1b7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7b0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1b7c0 66 20 64 69 6d 65 6e 73 69 6f 6e 73 20 66 6f 72  f dimensions for
1b7d0 20 74 68 69 73 20 72 74 72 65 65 20 74 62 6c 20   this rtree tbl 
1b7e0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
1b7f0 74 20 2a 70 47 65 74 4e 6f 64 65 3b 20 20 20 20  t *pGetNode;    
1b800 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e       /* Statemen
1b810 74 20 75 73 65 64 20 74 6f 20 72 65 74 72 69 65  t used to retrie
1b820 76 65 20 6e 6f 64 65 73 20 2a 2f 0a 20 20 73 71  ve nodes */.  sq
1b830 6c 69 74 65 33 5f 73 74 6d 74 20 2a 61 43 68 65  lite3_stmt *aChe
1b840 63 6b 4d 61 70 70 69 6e 67 5b 32 5d 3b 20 2f 2a  ckMapping[2]; /*
1b850 20 53 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 71   Statements to q
1b860 75 65 72 79 20 25 5f 70 61 72 65 6e 74 2f 25 5f  uery %_parent/%_
1b870 72 6f 77 69 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  rowid */.  int n
1b880 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20  Leaf;           
1b890 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1b8a0 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 63 65 6c  mber of leaf cel
1b8b0 6c 73 20 69 6e 20 74 61 62 6c 65 20 2a 2f 0a 20  ls in table */. 
1b8c0 20 69 6e 74 20 6e 4e 6f 6e 4c 65 61 66 3b 20 20   int nNonLeaf;  
1b8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8e0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 6f   /* Number of no
1b8f0 6e 2d 6c 65 61 66 20 63 65 6c 6c 73 20 69 6e 20  n-leaf cells in 
1b900 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72  table */.  int r
1b910 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1b920 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1b930 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63  turn code */.  c
1b940 68 61 72 20 2a 7a 52 65 70 6f 72 74 3b 20 20 20  har *zReport;   
1b950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b960 2a 20 4d 65 73 73 61 67 65 20 74 6f 20 72 65 70  * Message to rep
1b970 6f 72 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72  ort */.  int nEr
1b980 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
1b990 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1b9a0 65 72 20 6f 66 20 6c 69 6e 65 73 20 69 6e 20 7a  er of lines in z
1b9b0 52 65 70 6f 72 74 20 2a 2f 0a 7d 3b 0a 0a 23 64  Report */.};..#d
1b9c0 65 66 69 6e 65 20 52 54 52 45 45 5f 43 48 45 43  efine RTREE_CHEC
1b9d0 4b 5f 4d 41 58 5f 45 52 52 4f 52 20 31 30 30 0a  K_MAX_ERROR 100.
1b9e0 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 53 51 4c  ./*.** Reset SQL
1b9f0 20 73 74 61 74 65 6d 65 6e 74 20 70 53 74 6d 74   statement pStmt
1ba00 2e 20 49 66 20 74 68 65 20 73 71 6c 69 74 65 33  . If the sqlite3
1ba10 5f 72 65 73 65 74 28 29 20 63 61 6c 6c 20 72 65  _reset() call re
1ba20 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2c 0a  turns an error,.
1ba30 2a 2a 20 61 6e 64 20 52 74 72 65 65 43 68 65 63  ** and RtreeChec
1ba40 6b 2e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 2c  k.rc==SQLITE_OK,
1ba50 20 73 65 74 20 52 74 72 65 65 43 68 65 63 6b 2e   set RtreeCheck.
1ba60 72 63 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20  rc to the error 
1ba70 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
1ba80 76 6f 69 64 20 72 74 72 65 65 43 68 65 63 6b 52  void rtreeCheckR
1ba90 65 73 65 74 28 52 74 72 65 65 43 68 65 63 6b 20  eset(RtreeCheck 
1baa0 2a 70 43 68 65 63 6b 2c 20 73 71 6c 69 74 65 33  *pCheck, sqlite3
1bab0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20  _stmt *pStmt){. 
1bac0 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
1bad0 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a  3_reset(pStmt);.
1bae0 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 72 63    if( pCheck->rc
1baf0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 43  ==SQLITE_OK ) pC
1bb00 68 65 63 6b 2d 3e 72 63 20 3d 20 72 63 3b 0a 7d  heck->rc = rc;.}
1bb10 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f  ../*.** The seco
1bb20 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e  nd and subsequen
1bb30 74 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74  t arguments to t
1bb40 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 72 65  his function are
1bb50 20 61 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67   a format string
1bb60 0a 2a 2a 20 61 6e 64 20 70 72 69 6e 74 66 20 73  .** and printf s
1bb70 74 79 6c 65 20 61 72 67 75 6d 65 6e 74 73 2e 20  tyle arguments. 
1bb80 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 6f  This function fo
1bb90 72 6d 61 74 73 20 74 68 65 20 73 74 72 69 6e 67  rmats the string
1bba0 20 61 6e 64 20 61 74 74 65 6d 70 74 73 0a 2a 2a   and attempts.**
1bbb0 20 74 6f 20 63 6f 6d 70 69 6c 65 20 69 74 20 61   to compile it a
1bbc0 73 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65  s an SQL stateme
1bbd0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  nt..**.** If suc
1bbe0 63 65 73 73 66 75 6c 2c 20 61 20 70 6f 69 6e 74  cessful, a point
1bbf0 65 72 20 74 6f 20 74 68 65 20 6e 65 77 20 53 51  er to the new SQ
1bc00 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 72  L statement is r
1bc10 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
1bc20 73 65 2c 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20 72  se,.** NULL is r
1bc30 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65  eturned and an e
1bc40 72 72 6f 72 20 63 6f 64 65 20 6c 65 66 74 20 69  rror code left i
1bc50 6e 20 52 74 72 65 65 43 68 65 63 6b 2e 72 63 2e  n RtreeCheck.rc.
1bc60 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74  .*/.static sqlit
1bc70 65 33 5f 73 74 6d 74 20 2a 72 74 72 65 65 43 68  e3_stmt *rtreeCh
1bc80 65 63 6b 50 72 65 70 61 72 65 28 0a 20 20 52 74  eckPrepare(.  Rt
1bc90 72 65 65 43 68 65 63 6b 20 2a 70 43 68 65 63 6b  reeCheck *pCheck
1bca0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1bcb0 20 52 74 72 65 65 43 68 65 63 6b 20 6f 62 6a 65   RtreeCheck obje
1bcc0 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ct */.  const ch
1bcd0 61 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 20 20 20  ar *zFmt, ...   
1bce0 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 6d 61          /* Forma
1bcf0 74 20 73 74 72 69 6e 67 20 61 6e 64 20 74 72 61  t string and tra
1bd00 69 6c 69 6e 67 20 61 72 67 73 20 2a 2f 0a 29 7b  iling args */.){
1bd10 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
1bd20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 71 6c 69   char *z;.  sqli
1bd30 74 65 33 5f 73 74 6d 74 20 2a 70 52 65 74 20 3d  te3_stmt *pRet =
1bd40 20 30 3b 0a 0a 20 20 76 61 5f 73 74 61 72 74 28   0;..  va_start(
1bd50 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 7a 20 3d  ap, zFmt);.  z =
1bd60 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74   sqlite3_vmprint
1bd70 66 28 7a 46 6d 74 2c 20 61 70 29 3b 0a 0a 20 20  f(zFmt, ap);..  
1bd80 69 66 28 20 70 43 68 65 63 6b 2d 3e 72 63 3d 3d  if( pCheck->rc==
1bd90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1bda0 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20   if( z==0 ){.   
1bdb0 20 20 20 70 43 68 65 63 6b 2d 3e 72 63 20 3d 20     pCheck->rc = 
1bdc0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1bdd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1bde0 43 68 65 63 6b 2d 3e 72 63 20 3d 20 73 71 6c 69  Check->rc = sqli
1bdf0 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
1be00 43 68 65 63 6b 2d 3e 64 62 2c 20 7a 2c 20 2d 31  Check->db, z, -1
1be10 2c 20 26 70 52 65 74 2c 20 30 29 3b 0a 20 20 20  , &pRet, 0);.   
1be20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65   }.  }..  sqlite
1be30 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 76 61 5f  3_free(z);.  va_
1be40 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75 72  end(ap);.  retur
1be50 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pRet;.}../*.**
1be60 20 54 68 65 20 73 65 63 6f 6e 64 20 61 6e 64 20   The second and 
1be70 73 75 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d  subsequent argum
1be80 65 6e 74 73 20 74 6f 20 74 68 69 73 20 66 75 6e  ents to this fun
1be90 63 74 69 6f 6e 20 61 72 65 20 61 20 70 72 69 6e  ction are a prin
1bea0 74 66 28 29 0a 2a 2a 20 73 74 79 6c 65 20 66 6f  tf().** style fo
1beb0 72 6d 61 74 20 73 74 72 69 6e 67 20 61 6e 64 20  rmat string and 
1bec0 61 72 67 75 6d 65 6e 74 73 2e 20 54 68 69 73 20  arguments. This 
1bed0 66 75 6e 63 74 69 6f 6e 20 66 6f 72 6d 61 74 73  function formats
1bee0 20 74 68 65 20 73 74 72 69 6e 67 20 61 6e 64 0a   the string and.
1bef0 2a 2a 20 61 70 70 65 6e 64 73 20 69 74 20 74 6f  ** appends it to
1bf00 20 74 68 65 20 72 65 70 6f 72 74 20 62 65 69 6e   the report bein
1bf10 67 20 61 63 63 75 6d 75 61 74 65 64 20 69 6e 20  g accumuated in 
1bf20 70 43 68 65 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  pCheck..*/.stati
1bf30 63 20 76 6f 69 64 20 72 74 72 65 65 43 68 65 63  c void rtreeChec
1bf40 6b 41 70 70 65 6e 64 4d 73 67 28 52 74 72 65 65  kAppendMsg(Rtree
1bf50 43 68 65 63 6b 20 2a 70 43 68 65 63 6b 2c 20 63  Check *pCheck, c
1bf60 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c  onst char *zFmt,
1bf70 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
1bf80 20 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28   ap;.  va_start(
1bf90 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 69 66 28  ap, zFmt);.  if(
1bfa0 20 70 43 68 65 63 6b 2d 3e 72 63 3d 3d 53 51 4c   pCheck->rc==SQL
1bfb0 49 54 45 5f 4f 4b 20 26 26 20 70 43 68 65 63 6b  ITE_OK && pCheck
1bfc0 2d 3e 6e 45 72 72 3c 52 54 52 45 45 5f 43 48 45  ->nErr<RTREE_CHE
1bfd0 43 4b 5f 4d 41 58 5f 45 52 52 4f 52 20 29 7b 0a  CK_MAX_ERROR ){.
1bfe0 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 73 71      char *z = sq
1bff0 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a  lite3_vmprintf(z
1c000 46 6d 74 2c 20 61 70 29 3b 0a 20 20 20 20 69 66  Fmt, ap);.    if
1c010 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( z==0 ){.      
1c020 70 43 68 65 63 6b 2d 3e 72 63 20 3d 20 53 51 4c  pCheck->rc = SQL
1c030 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
1c040 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 43 68 65  else{.      pChe
1c050 63 6b 2d 3e 7a 52 65 70 6f 72 74 20 3d 20 73 71  ck->zReport = sq
1c060 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
1c070 7a 25 73 25 7a 22 2c 20 0a 20 20 20 20 20 20 20  z%s%z", .       
1c080 20 20 20 70 43 68 65 63 6b 2d 3e 7a 52 65 70 6f     pCheck->zRepo
1c090 72 74 2c 20 28 70 43 68 65 63 6b 2d 3e 7a 52 65  rt, (pCheck->zRe
1c0a0 70 6f 72 74 20 3f 20 22 5c 6e 22 20 3a 20 22 22  port ? "\n" : ""
1c0b0 29 2c 20 7a 0a 20 20 20 20 20 20 29 3b 0a 20 20  ), z.      );.  
1c0c0 20 20 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e      if( pCheck->
1c0d0 7a 52 65 70 6f 72 74 3d 3d 30 20 29 7b 0a 20 20  zReport==0 ){.  
1c0e0 20 20 20 20 20 20 70 43 68 65 63 6b 2d 3e 72 63        pCheck->rc
1c0f0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
1c100 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1c110 20 20 20 70 43 68 65 63 6b 2d 3e 6e 45 72 72 2b     pCheck->nErr+
1c120 2b 3b 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28  +;.  }.  va_end(
1c130 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ap);.}../*.** Th
1c140 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
1c150 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 72 65 20   no-op if there 
1c160 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 65 72  is already an er
1c170 72 6f 72 20 63 6f 64 65 20 73 74 6f 72 65 64 0a  ror code stored.
1c180 2a 2a 20 69 6e 20 74 68 65 20 52 74 72 65 65 43  ** in the RtreeC
1c190 68 65 63 6b 20 6f 62 6a 65 63 74 20 69 6e 64 69  heck object indi
1c1a0 63 61 74 65 64 20 62 79 20 74 68 65 20 66 69 72  cated by the fir
1c1b0 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 4e 55 4c  st argument. NUL
1c1c0 4c 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  L is.** returned
1c1d0 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
1c1e0 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
1c1f0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
1c200 72 74 72 65 65 20 74 61 62 6c 65 20 6e 6f 64 65  rtree table node
1c210 20 69 4e 6f 64 65 20 61 72 65 20 6c 6f 61 64 65   iNode are loade
1c220 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 64 61  d from.** the da
1c230 74 61 62 61 73 65 20 61 6e 64 20 63 6f 70 69 65  tabase and copie
1c240 64 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 20  d into a buffer 
1c250 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
1c260 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
1c270 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f  ** If no error o
1c280 63 63 75 72 73 2c 20 61 20 70 6f 69 6e 74 65 72  ccurs, a pointer
1c290 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 69   to the buffer i
1c2a0 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 28  s returned and (
1c2b0 2a 70 6e 4e 6f 64 65 29 0a 2a 2a 20 69 73 20 73  *pnNode).** is s
1c2c0 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f  et to the size o
1c2d0 66 20 74 68 65 20 62 75 66 66 65 72 20 69 6e 20  f the buffer in 
1c2e0 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c  bytes..**.** Or,
1c2f0 20 69 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65   if an error doe
1c300 73 20 6f 63 63 75 72 2c 20 4e 55 4c 4c 20 69 73  s occur, NULL is
1c310 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e   returned and an
1c320 20 65 72 72 6f 72 20 63 6f 64 65 20 6c 65 66 74   error code left
1c330 0a 2a 2a 20 69 6e 20 74 68 65 20 52 74 72 65 65  .** in the Rtree
1c340 43 68 65 63 6b 20 6f 62 6a 65 63 74 2e 20 54 68  Check object. Th
1c350 65 20 66 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66  e final value of
1c360 20 2a 70 6e 4e 6f 64 65 20 69 73 20 75 6e 64 65   *pnNode is unde
1c370 66 69 6e 65 64 20 69 6e 0a 2a 2a 20 74 68 69 73  fined in.** this
1c380 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   case..*/.static
1c390 20 75 38 20 2a 72 74 72 65 65 43 68 65 63 6b 47   u8 *rtreeCheckG
1c3a0 65 74 4e 6f 64 65 28 52 74 72 65 65 43 68 65 63  etNode(RtreeChec
1c3b0 6b 20 2a 70 43 68 65 63 6b 2c 20 69 36 34 20 69  k *pCheck, i64 i
1c3c0 4e 6f 64 65 2c 20 69 6e 74 20 2a 70 6e 4e 6f 64  Node, int *pnNod
1c3d0 65 29 7b 0a 20 20 75 38 20 2a 70 52 65 74 20 3d  e){.  u8 *pRet =
1c3e0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1c3f0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1c400 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 61 73 73 65  value */..  asse
1c410 72 74 28 20 70 43 68 65 63 6b 2d 3e 72 63 3d 3d  rt( pCheck->rc==
1c420 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69  SQLITE_OK );.  i
1c430 66 28 20 70 43 68 65 63 6b 2d 3e 70 47 65 74 4e  f( pCheck->pGetN
1c440 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43  ode==0 ){.    pC
1c450 68 65 63 6b 2d 3e 70 47 65 74 4e 6f 64 65 20 3d  heck->pGetNode =
1c460 20 72 74 72 65 65 43 68 65 63 6b 50 72 65 70 61   rtreeCheckPrepa
1c470 72 65 28 70 43 68 65 63 6b 2c 0a 20 20 20 20 20  re(pCheck,.     
1c480 20 20 20 22 53 45 4c 45 43 54 20 64 61 74 61 20     "SELECT data 
1c490 46 52 4f 4d 20 25 51 2e 27 25 71 5f 6e 6f 64 65  FROM %Q.'%q_node
1c4a0 27 20 57 48 45 52 45 20 6e 6f 64 65 6e 6f 3d 3f  ' WHERE nodeno=?
1c4b0 22 2c 20 0a 20 20 20 20 20 20 20 20 70 43 68 65  ", .        pChe
1c4c0 63 6b 2d 3e 7a 44 62 2c 20 70 43 68 65 63 6b 2d  ck->zDb, pCheck-
1c4d0 3e 7a 54 61 62 0a 20 20 20 20 29 3b 0a 20 20 7d  >zTab.    );.  }
1c4e0 0a 0a 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e  ..  if( pCheck->
1c4f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1c500 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  .    sqlite3_bin
1c510 64 5f 69 6e 74 36 34 28 70 43 68 65 63 6b 2d 3e  d_int64(pCheck->
1c520 70 47 65 74 4e 6f 64 65 2c 20 31 2c 20 69 4e 6f  pGetNode, 1, iNo
1c530 64 65 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  de);.    if( sql
1c540 69 74 65 33 5f 73 74 65 70 28 70 43 68 65 63 6b  ite3_step(pCheck
1c550 2d 3e 70 47 65 74 4e 6f 64 65 29 3d 3d 53 51 4c  ->pGetNode)==SQL
1c560 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20  ITE_ROW ){.     
1c570 20 69 6e 74 20 6e 4e 6f 64 65 20 3d 20 73 71 6c   int nNode = sql
1c580 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
1c590 73 28 70 43 68 65 63 6b 2d 3e 70 47 65 74 4e 6f  s(pCheck->pGetNo
1c5a0 64 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 63 6f  de, 0);.      co
1c5b0 6e 73 74 20 75 38 20 2a 70 4e 6f 64 65 20 3d 20  nst u8 *pNode = 
1c5c0 28 63 6f 6e 73 74 20 75 38 2a 29 73 71 6c 69 74  (const u8*)sqlit
1c5d0 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70  e3_column_blob(p
1c5e0 43 68 65 63 6b 2d 3e 70 47 65 74 4e 6f 64 65 2c  Check->pGetNode,
1c5f0 20 30 29 3b 0a 20 20 20 20 20 20 70 52 65 74 20   0);.      pRet 
1c600 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
1c610 28 6e 4e 6f 64 65 29 3b 0a 20 20 20 20 20 20 69  (nNode);.      i
1c620 66 28 20 70 52 65 74 3d 3d 30 20 29 7b 0a 20 20  f( pRet==0 ){.  
1c630 20 20 20 20 20 20 70 43 68 65 63 6b 2d 3e 72 63        pCheck->rc
1c640 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
1c650 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1c660 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 52 65        memcpy(pRe
1c670 74 2c 20 70 4e 6f 64 65 2c 20 6e 4e 6f 64 65 29  t, pNode, nNode)
1c680 3b 0a 20 20 20 20 20 20 20 20 2a 70 6e 4e 6f 64  ;.        *pnNod
1c690 65 20 3d 20 6e 4e 6f 64 65 3b 0a 20 20 20 20 20  e = nNode;.     
1c6a0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 74 72   }.    }.    rtr
1c6b0 65 65 43 68 65 63 6b 52 65 73 65 74 28 70 43 68  eeCheckReset(pCh
1c6c0 65 63 6b 2c 20 70 43 68 65 63 6b 2d 3e 70 47 65  eck, pCheck->pGe
1c6d0 74 4e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20  tNode);.    if( 
1c6e0 70 43 68 65 63 6b 2d 3e 72 63 3d 3d 53 51 4c 49  pCheck->rc==SQLI
1c6f0 54 45 5f 4f 4b 20 26 26 20 70 52 65 74 3d 3d 30  TE_OK && pRet==0
1c700 20 29 7b 0a 20 20 20 20 20 20 72 74 72 65 65 43   ){.      rtreeC
1c710 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
1c720 68 65 63 6b 2c 20 22 4e 6f 64 65 20 25 6c 6c 64  heck, "Node %lld
1c730 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 64 61   missing from da
1c740 74 61 62 61 73 65 22 2c 20 69 4e 6f 64 65 29 3b  tabase", iNode);
1c750 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
1c760 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
1c770 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1c780 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 65  n is used to che
1c790 63 6b 20 74 68 61 74 20 74 68 65 20 25 5f 70 61  ck that the %_pa
1c7a0 72 65 6e 74 20 28 69 66 20 62 4c 65 61 66 3d 3d  rent (if bLeaf==
1c7b0 30 29 20 6f 72 20 25 5f 72 6f 77 69 64 0a 2a 2a  0) or %_rowid.**
1c7c0 20 28 69 66 20 62 4c 65 61 66 3d 3d 31 29 20 74   (if bLeaf==1) t
1c7d0 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  able contains a 
1c7e0 73 70 65 63 69 66 69 65 64 20 65 6e 74 72 79 2e  specified entry.
1c7f0 20 54 68 65 20 73 63 68 65 6d 61 73 20 6f 66 20   The schemas of 
1c800 74 68 65 0a 2a 2a 20 74 77 6f 20 74 61 62 6c 65  the.** two table
1c810 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 43  s are:.**.**   C
1c820 52 45 41 54 45 20 54 41 42 4c 45 20 25 5f 70 61  REATE TABLE %_pa
1c830 72 65 6e 74 28 6e 6f 64 65 6e 6f 20 49 4e 54 45  rent(nodeno INTE
1c840 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
1c850 20 70 61 72 65 6e 74 6e 6f 64 65 20 49 4e 54 45   parentnode INTE
1c860 47 45 52 29 0a 2a 2a 20 20 20 43 52 45 41 54 45  GER).**   CREATE
1c870 20 54 41 42 4c 45 20 25 5f 72 6f 77 69 64 28 72   TABLE %_rowid(r
1c880 6f 77 69 64 20 49 4e 54 45 47 45 52 20 50 52 49  owid INTEGER PRI
1c890 4d 41 52 59 20 4b 45 59 2c 20 6e 6f 64 65 6e 6f  MARY KEY, nodeno
1c8a0 20 49 4e 54 45 47 45 52 29 0a 2a 2a 0a 2a 2a 20   INTEGER).**.** 
1c8b0 49 6e 20 62 6f 74 68 20 63 61 73 65 73 2c 20 74  In both cases, t
1c8c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65  his function che
1c8d0 63 6b 73 20 74 68 61 74 20 74 68 65 72 65 20 65  cks that there e
1c8e0 78 69 73 74 73 20 61 6e 20 65 6e 74 72 79 20 77  xists an entry w
1c8f0 69 74 68 0a 2a 2a 20 49 50 4b 20 76 61 6c 75 65  ith.** IPK value
1c900 20 69 4b 65 79 20 61 6e 64 20 74 68 65 20 73 65   iKey and the se
1c910 63 6f 6e 64 20 63 6f 6c 75 6d 6e 20 73 65 74 20  cond column set 
1c920 74 6f 20 69 56 61 6c 2e 0a 2a 2a 0a 2a 2f 0a 73  to iVal..**.*/.s
1c930 74 61 74 69 63 20 76 6f 69 64 20 72 74 72 65 65  tatic void rtree
1c940 43 68 65 63 6b 4d 61 70 70 69 6e 67 28 0a 20 20  CheckMapping(.  
1c950 52 74 72 65 65 43 68 65 63 6b 20 2a 70 43 68 65  RtreeCheck *pChe
1c960 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
1c970 2f 2a 20 52 74 72 65 65 43 68 65 63 6b 20 6f 62  /* RtreeCheck ob
1c980 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 62 4c  ject */.  int bL
1c990 65 61 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  eaf,            
1c9a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1c9b0 65 20 66 6f 72 20 61 20 6c 65 61 66 20 63 65 6c  e for a leaf cel
1c9c0 6c 2c 20 66 61 6c 73 65 20 66 6f 72 20 69 6e 74  l, false for int
1c9d0 65 72 69 6f 72 20 2a 2f 0a 20 20 69 36 34 20 69  erior */.  i64 i
1c9e0 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  Key,            
1c9f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65             /* Ke
1ca00 79 20 66 6f 72 20 6d 61 70 70 69 6e 67 20 2a 2f  y for mapping */
1ca10 0a 20 20 69 36 34 20 69 56 61 6c 20 20 20 20 20  .  i64 iVal     
1ca20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca30 20 20 20 2f 2a 20 45 78 70 65 63 74 65 64 20 76     /* Expected v
1ca40 61 6c 75 65 20 66 6f 72 20 6d 61 70 70 69 6e 67  alue for mapping
1ca50 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
1ca60 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
1ca70 2a 70 53 74 6d 74 3b 0a 20 20 63 6f 6e 73 74 20  *pStmt;.  const 
1ca80 63 68 61 72 20 2a 61 7a 53 71 6c 5b 32 5d 20 3d  char *azSql[2] =
1ca90 20 7b 0a 20 20 20 20 22 53 45 4c 45 43 54 20 70   {.    "SELECT p
1caa0 61 72 65 6e 74 6e 6f 64 65 20 46 52 4f 4d 20 25  arentnode FROM %
1cab0 51 2e 27 25 71 5f 70 61 72 65 6e 74 27 20 57 48  Q.'%q_parent' WH
1cac0 45 52 45 20 6e 6f 64 65 6e 6f 3d 3f 22 2c 0a 20  ERE nodeno=?",. 
1cad0 20 20 20 22 53 45 4c 45 43 54 20 6e 6f 64 65 6e     "SELECT noden
1cae0 6f 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 72 6f  o FROM %Q.'%q_ro
1caf0 77 69 64 27 20 57 48 45 52 45 20 72 6f 77 69 64  wid' WHERE rowid
1cb00 3d 3f 22 0a 20 20 7d 3b 0a 0a 20 20 61 73 73 65  =?".  };..  asse
1cb10 72 74 28 20 62 4c 65 61 66 3d 3d 30 20 7c 7c 20  rt( bLeaf==0 || 
1cb20 62 4c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 69 66  bLeaf==1 );.  if
1cb30 28 20 70 43 68 65 63 6b 2d 3e 61 43 68 65 63 6b  ( pCheck->aCheck
1cb40 4d 61 70 70 69 6e 67 5b 62 4c 65 61 66 5d 3d 3d  Mapping[bLeaf]==
1cb50 30 20 29 7b 0a 20 20 20 20 70 43 68 65 63 6b 2d  0 ){.    pCheck-
1cb60 3e 61 43 68 65 63 6b 4d 61 70 70 69 6e 67 5b 62  >aCheckMapping[b
1cb70 4c 65 61 66 5d 20 3d 20 72 74 72 65 65 43 68 65  Leaf] = rtreeChe
1cb80 63 6b 50 72 65 70 61 72 65 28 70 43 68 65 63 6b  ckPrepare(pCheck
1cb90 2c 0a 20 20 20 20 20 20 20 20 61 7a 53 71 6c 5b  ,.        azSql[
1cba0 62 4c 65 61 66 5d 2c 20 70 43 68 65 63 6b 2d 3e  bLeaf], pCheck->
1cbb0 7a 44 62 2c 20 70 43 68 65 63 6b 2d 3e 7a 54 61  zDb, pCheck->zTa
1cbc0 62 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20 69  b.    );.  }.  i
1cbd0 66 28 20 70 43 68 65 63 6b 2d 3e 72 63 21 3d 53  f( pCheck->rc!=S
1cbe0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
1cbf0 6e 3b 0a 0a 20 20 70 53 74 6d 74 20 3d 20 70 43  n;..  pStmt = pC
1cc00 68 65 63 6b 2d 3e 61 43 68 65 63 6b 4d 61 70 70  heck->aCheckMapp
1cc10 69 6e 67 5b 62 4c 65 61 66 5d 3b 0a 20 20 73 71  ing[bLeaf];.  sq
1cc20 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
1cc30 28 70 53 74 6d 74 2c 20 31 2c 20 69 4b 65 79 29  (pStmt, 1, iKey)
1cc40 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1cc50 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20  _step(pStmt);.  
1cc60 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
1cc70 4f 4e 45 20 29 7b 0a 20 20 20 20 72 74 72 65 65  ONE ){.    rtree
1cc80 43 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  CheckAppendMsg(p
1cc90 43 68 65 63 6b 2c 20 22 4d 61 70 70 69 6e 67 20  Check, "Mapping 
1cca0 28 25 6c 6c 64 20 2d 3e 20 25 6c 6c 64 29 20 6d  (%lld -> %lld) m
1ccb0 69 73 73 69 6e 67 20 66 72 6f 6d 20 25 73 20 74  issing from %s t
1ccc0 61 62 6c 65 22 2c 0a 20 20 20 20 20 20 20 20 69  able",.        i
1ccd0 4b 65 79 2c 20 69 56 61 6c 2c 20 28 62 4c 65 61  Key, iVal, (bLea
1cce0 66 20 3f 20 22 25 5f 72 6f 77 69 64 22 20 3a 20  f ? "%_rowid" : 
1ccf0 22 25 5f 70 61 72 65 6e 74 22 29 0a 20 20 20 20  "%_parent").    
1cd00 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72  );.  }else if( r
1cd10 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  c==SQLITE_ROW ){
1cd20 0a 20 20 20 20 69 36 34 20 69 69 20 3d 20 73 71  .    i64 ii = sq
1cd30 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
1cd40 36 34 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  64(pStmt, 0);.  
1cd50 20 20 69 66 28 20 69 69 21 3d 69 56 61 6c 20 29    if( ii!=iVal )
1cd60 7b 0a 20 20 20 20 20 20 72 74 72 65 65 43 68 65  {.      rtreeChe
1cd70 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
1cd80 63 6b 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22  ck, .          "
1cd90 46 6f 75 6e 64 20 28 25 6c 6c 64 20 2d 3e 20 25  Found (%lld -> %
1cda0 6c 6c 64 29 20 69 6e 20 25 73 20 74 61 62 6c 65  lld) in %s table
1cdb0 2c 20 65 78 70 65 63 74 65 64 20 28 25 6c 6c 64  , expected (%lld
1cdc0 20 2d 3e 20 25 6c 6c 64 29 22 2c 0a 20 20 20 20   -> %lld)",.    
1cdd0 20 20 20 20 20 20 69 4b 65 79 2c 20 69 69 2c 20        iKey, ii, 
1cde0 28 62 4c 65 61 66 20 3f 20 22 25 5f 72 6f 77 69  (bLeaf ? "%_rowi
1cdf0 64 22 20 3a 20 22 25 5f 70 61 72 65 6e 74 22 29  d" : "%_parent")
1ce00 2c 20 69 4b 65 79 2c 20 69 56 61 6c 0a 20 20 20  , iKey, iVal.   
1ce10 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a     );.    }.  }.
1ce20 20 20 72 74 72 65 65 43 68 65 63 6b 52 65 73 65    rtreeCheckRese
1ce30 74 28 70 43 68 65 63 6b 2c 20 70 53 74 6d 74 29  t(pCheck, pStmt)
1ce40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d  ;.}../*.** Argum
1ce50 65 6e 74 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73  ent pCell points
1ce60 20 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20   to an array of 
1ce70 63 6f 6f 72 64 69 6e 61 74 65 73 20 73 74 6f 72  coordinates stor
1ce80 65 64 20 6f 6e 20 61 6e 20 72 74 72 65 65 20 70  ed on an rtree p
1ce90 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e  age..** This fun
1cea0 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 74 68 61  ction checks tha
1ceb0 74 20 74 68 65 20 63 6f 6f 72 64 69 6e 61 74 65  t the coordinate
1cec0 73 20 61 72 65 20 69 6e 74 65 72 6e 61 6c 6c 79  s are internally
1ced0 20 63 6f 6e 73 69 73 74 65 6e 74 20 28 6e 6f 0a   consistent (no.
1cee0 2a 2a 20 78 31 3e 78 32 20 63 6f 6e 64 69 74 69  ** x1>x2 conditi
1cef0 6f 6e 73 29 20 61 6e 64 20 61 64 64 73 20 61 6e  ons) and adds an
1cf00 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
1cf10 6f 20 74 68 65 20 52 74 72 65 65 43 68 65 63 6b  o the RtreeCheck
1cf20 20 6f 62 6a 65 63 74 0a 2a 2a 20 69 66 20 74 68   object.** if th
1cf30 65 79 20 61 72 65 20 6e 6f 74 2e 0a 2a 2a 0a 2a  ey are not..**.*
1cf40 2a 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20  * Additionally, 
1cf50 69 66 20 70 50 61 72 65 6e 74 20 69 73 20 6e 6f  if pParent is no
1cf60 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20  t NULL, then it 
1cf70 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 70 6f  is assumed to po
1cf80 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 61 72  int to.** the ar
1cf90 72 61 79 20 6f 66 20 63 6f 6f 72 64 69 6e 61 74  ray of coordinat
1cfa0 65 73 20 6f 6e 20 74 68 65 20 70 61 72 65 6e 74  es on the parent
1cfb0 20 70 61 67 65 20 74 68 61 74 20 62 6f 75 6e 64   page that bound
1cfc0 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 63 6f   the page .** co
1cfd0 6e 74 61 69 6e 69 6e 67 20 70 43 65 6c 6c 2e 20  ntaining pCell. 
1cfe0 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20  In this case it 
1cff0 69 73 20 61 6c 73 6f 20 76 65 72 69 66 69 65 64  is also verified
1d000 20 74 68 61 74 20 74 68 65 20 74 77 6f 0a 2a 2a   that the two.**
1d010 20 73 65 74 73 20 6f 66 20 63 6f 6f 72 64 69 6e   sets of coordin
1d020 61 74 65 73 20 61 72 65 20 6d 75 74 75 61 6c 6c  ates are mutuall
1d030 79 20 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64  y consistent and
1d040 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
1d050 65 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68  e added.** to th
1d060 65 20 52 74 72 65 65 43 68 65 63 6b 20 6f 62 6a  e RtreeCheck obj
1d070 65 63 74 20 69 66 20 74 68 65 79 20 61 72 65 20  ect if they are 
1d080 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  not..*/.static v
1d090 6f 69 64 20 72 74 72 65 65 43 68 65 63 6b 43 65  oid rtreeCheckCe
1d0a0 6c 6c 43 6f 6f 72 64 28 0a 20 20 52 74 72 65 65  llCoord(.  Rtree
1d0b0 43 68 65 63 6b 20 2a 70 43 68 65 63 6b 2c 20 0a  Check *pCheck, .
1d0c0 20 20 69 36 34 20 69 4e 6f 64 65 2c 20 20 20 20    i64 iNode,    
1d0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d0e0 20 20 2f 2a 20 4e 6f 64 65 20 69 64 20 74 6f 20    /* Node id to 
1d0f0 75 73 65 20 69 6e 20 65 72 72 6f 72 20 6d 65 73  use in error mes
1d100 73 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  sages */.  int i
1d110 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
1d120 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 65             /* Ce
1d130 6c 6c 20 6e 75 6d 62 65 72 20 74 6f 20 75 73 65  ll number to use
1d140 20 69 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   in error messag
1d150 65 73 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  es */.  u8 *pCel
1d160 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
1d170 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
1d180 65 72 20 74 6f 20 63 65 6c 6c 20 63 6f 6f 72 64  er to cell coord
1d190 69 6e 61 74 65 73 20 2a 2f 0a 20 20 75 38 20 2a  inates */.  u8 *
1d1a0 70 50 61 72 65 6e 74 20 20 20 20 20 20 20 20 20  pParent         
1d1b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1d1c0 6f 69 6e 74 65 72 20 74 6f 20 70 61 72 65 6e 74  ointer to parent
1d1d0 20 63 6f 6f 72 64 69 6e 61 74 65 73 20 2a 2f 0a   coordinates */.
1d1e0 29 7b 0a 20 20 52 74 72 65 65 43 6f 6f 72 64 20  ){.  RtreeCoord 
1d1f0 63 31 2c 20 63 32 3b 0a 20 20 52 74 72 65 65 43  c1, c2;.  RtreeC
1d200 6f 6f 72 64 20 70 31 2c 20 70 32 3b 0a 20 20 69  oord p1, p2;.  i
1d210 6e 74 20 69 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  nt i;..  for(i=0
1d220 3b 20 69 3c 70 43 68 65 63 6b 2d 3e 6e 44 69 6d  ; i<pCheck->nDim
1d230 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 61 64  ; i++){.    read
1d240 43 6f 6f 72 64 28 26 70 43 65 6c 6c 5b 34 2a 32  Coord(&pCell[4*2
1d250 2a 69 5d 2c 20 26 63 31 29 3b 0a 20 20 20 20 72  *i], &c1);.    r
1d260 65 61 64 43 6f 6f 72 64 28 26 70 43 65 6c 6c 5b  eadCoord(&pCell[
1d270 34 2a 28 32 2a 69 20 2b 20 31 29 5d 2c 20 26 63  4*(2*i + 1)], &c
1d280 32 29 3b 0a 0a 20 20 20 20 2f 2a 20 70 72 69 6e  2);..    /* prin
1d290 74 66 28 22 25 65 2c 20 25 65 5c 6e 22 2c 20 63  tf("%e, %e\n", c
1d2a0 31 2e 75 2e 66 2c 20 63 32 2e 75 2e 66 29 3b 20  1.u.f, c2.u.f); 
1d2b0 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 68 65 63  */.    if( pChec
1d2c0 6b 2d 3e 62 49 6e 74 20 3f 20 63 31 2e 69 3e 63  k->bInt ? c1.i>c
1d2d0 32 2e 69 20 3a 20 63 31 2e 66 3e 63 32 2e 66 20  2.i : c1.f>c2.f 
1d2e0 29 7b 0a 20 20 20 20 20 20 72 74 72 65 65 43 68  ){.      rtreeCh
1d2f0 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
1d300 65 63 6b 2c 20 0a 20 20 20 20 20 20 20 20 20 20  eck, .          
1d310 22 44 69 6d 65 6e 73 69 6f 6e 20 25 64 20 6f 66  "Dimension %d of
1d320 20 63 65 6c 6c 20 25 64 20 6f 6e 20 6e 6f 64 65   cell %d on node
1d330 20 25 6c 6c 64 20 69 73 20 63 6f 72 72 75 70 74   %lld is corrupt
1d340 22 2c 20 69 2c 20 69 43 65 6c 6c 2c 20 69 4e 6f  ", i, iCell, iNo
1d350 64 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  de.      );.    
1d360 7d 0a 0a 20 20 20 20 69 66 28 20 70 50 61 72 65  }..    if( pPare
1d370 6e 74 20 29 7b 0a 20 20 20 20 20 20 72 65 61 64  nt ){.      read
1d380 43 6f 6f 72 64 28 26 70 50 61 72 65 6e 74 5b 34  Coord(&pParent[4
1d390 2a 32 2a 69 5d 2c 20 26 70 31 29 3b 0a 20 20 20  *2*i], &p1);.   
1d3a0 20 20 20 72 65 61 64 43 6f 6f 72 64 28 26 70 50     readCoord(&pP
1d3b0 61 72 65 6e 74 5b 34 2a 28 32 2a 69 20 2b 20 31  arent[4*(2*i + 1
1d3c0 29 5d 2c 20 26 70 32 29 3b 0a 0a 20 20 20 20 20  )], &p2);..     
1d3d0 20 69 66 28 20 28 70 43 68 65 63 6b 2d 3e 62 49   if( (pCheck->bI
1d3e0 6e 74 20 3f 20 63 31 2e 69 3c 70 31 2e 69 20 3a  nt ? c1.i<p1.i :
1d3f0 20 63 31 2e 66 3c 70 31 2e 66 29 20 0a 20 20 20   c1.f<p1.f) .   
1d400 20 20 20 20 7c 7c 20 28 70 43 68 65 63 6b 2d 3e      || (pCheck->
1d410 62 49 6e 74 20 3f 20 63 32 2e 69 3e 70 32 2e 69  bInt ? c2.i>p2.i
1d420 20 3a 20 63 32 2e 66 3e 70 32 2e 66 29 0a 20 20   : c2.f>p2.f).  
1d430 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72      ){.        r
1d440 74 72 65 65 43 68 65 63 6b 41 70 70 65 6e 64 4d  treeCheckAppendM
1d450 73 67 28 70 43 68 65 63 6b 2c 20 0a 20 20 20 20  sg(pCheck, .    
1d460 20 20 20 20 20 20 20 20 22 44 69 6d 65 6e 73 69          "Dimensi
1d470 6f 6e 20 25 64 20 6f 66 20 63 65 6c 6c 20 25 64  on %d of cell %d
1d480 20 6f 6e 20 6e 6f 64 65 20 25 6c 6c 64 20 69 73   on node %lld is
1d490 20 63 6f 72 72 75 70 74 20 72 65 6c 61 74 69 76   corrupt relativ
1d4a0 65 20 74 6f 20 70 61 72 65 6e 74 22 0a 20 20 20  e to parent".   
1d4b0 20 20 20 20 20 20 20 20 20 2c 20 69 2c 20 69 43           , i, iC
1d4c0 65 6c 6c 2c 20 69 4e 6f 64 65 0a 20 20 20 20 20  ell, iNode.     
1d4d0 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20     );.      }.  
1d4e0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
1d4f0 20 52 75 6e 20 72 74 72 65 65 63 68 65 63 6b 28   Run rtreecheck(
1d500 29 20 63 68 65 63 6b 73 20 6f 6e 20 6e 6f 64 65  ) checks on node
1d510 20 69 4e 6f 64 65 2c 20 77 68 69 63 68 20 69 73   iNode, which is
1d520 20 61 74 20 64 65 70 74 68 20 69 44 65 70 74 68   at depth iDepth
1d530 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65 20 72   within.** the r
1d540 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e  -tree structure.
1d550 20 41 72 67 75 6d 65 6e 74 20 61 50 61 72 65 6e   Argument aParen
1d560 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  t points to the 
1d570 61 72 72 61 79 20 6f 66 20 63 6f 6f 72 64 69 6e  array of coordin
1d580 61 74 65 73 0a 2a 2a 20 74 68 61 74 20 62 6f 75  ates.** that bou
1d590 6e 64 20 6e 6f 64 65 20 69 4e 6f 64 65 20 6f 6e  nd node iNode on
1d5a0 20 74 68 65 20 70 61 72 65 6e 74 20 6e 6f 64 65   the parent node
1d5b0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 70  ..**.** If any p
1d5c0 72 6f 62 6c 65 6d 73 20 61 72 65 20 64 69 73 63  roblems are disc
1d5d0 6f 76 65 72 65 64 2c 20 61 6e 20 65 72 72 6f 72  overed, an error
1d5e0 20 6d 65 73 73 61 67 65 20 69 73 20 61 70 70 65   message is appe
1d5f0 6e 64 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 72  nded to the.** r
1d600 65 70 6f 72 74 20 61 63 63 75 6d 75 6c 61 74 65  eport accumulate
1d610 64 20 69 6e 20 74 68 65 20 52 74 72 65 65 43 68  d in the RtreeCh
1d620 65 63 6b 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73  eck object..*/.s
1d630 74 61 74 69 63 20 76 6f 69 64 20 72 74 72 65 65  tatic void rtree
1d640 43 68 65 63 6b 4e 6f 64 65 28 0a 20 20 52 74 72  CheckNode(.  Rtr
1d650 65 65 43 68 65 63 6b 20 2a 70 43 68 65 63 6b 2c  eeCheck *pCheck,
1d660 0a 20 20 69 6e 74 20 69 44 65 70 74 68 2c 20 20  .  int iDepth,  
1d670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d680 20 20 20 2f 2a 20 44 65 70 74 68 20 6f 66 20 69     /* Depth of i
1d690 4e 6f 64 65 20 28 30 3d 3d 6c 65 61 66 29 20 2a  Node (0==leaf) *
1d6a0 2f 0a 20 20 75 38 20 2a 61 50 61 72 65 6e 74 2c  /.  u8 *aParent,
1d6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6c0 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f      /* Buffer co
1d6d0 6e 74 61 69 6e 69 6e 67 20 70 61 72 65 6e 74 20  ntaining parent 
1d6e0 63 6f 6f 72 64 73 20 2a 2f 0a 20 20 69 36 34 20  coords */.  i64 
1d6f0 69 4e 6f 64 65 20 20 20 20 20 20 20 20 20 20 20  iNode           
1d700 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1d710 6f 64 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  ode to check */.
1d720 29 7b 0a 20 20 75 38 20 2a 61 4e 6f 64 65 20 3d  ){.  u8 *aNode =
1d730 20 30 3b 0a 20 20 69 6e 74 20 6e 4e 6f 64 65 20   0;.  int nNode 
1d740 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
1d750 69 4e 6f 64 65 3d 3d 31 20 7c 7c 20 61 50 61 72  iNode==1 || aPar
1d760 65 6e 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ent!=0 );.  asse
1d770 72 74 28 20 70 43 68 65 63 6b 2d 3e 6e 44 69 6d  rt( pCheck->nDim
1d780 3e 30 20 29 3b 0a 0a 20 20 61 4e 6f 64 65 20 3d  >0 );..  aNode =
1d790 20 72 74 72 65 65 43 68 65 63 6b 47 65 74 4e 6f   rtreeCheckGetNo
1d7a0 64 65 28 70 43 68 65 63 6b 2c 20 69 4e 6f 64 65  de(pCheck, iNode
1d7b0 2c 20 26 6e 4e 6f 64 65 29 3b 0a 20 20 69 66 28  , &nNode);.  if(
1d7c0 20 61 4e 6f 64 65 20 29 7b 0a 20 20 20 20 69 66   aNode ){.    if
1d7d0 28 20 6e 4e 6f 64 65 3c 34 20 29 7b 0a 20 20 20  ( nNode<4 ){.   
1d7e0 20 20 20 72 74 72 65 65 43 68 65 63 6b 41 70 70     rtreeCheckApp
1d7f0 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 0a  endMsg(pCheck, .
1d800 20 20 20 20 20 20 20 20 20 20 22 4e 6f 64 65 20            "Node 
1d810 25 6c 6c 64 20 69 73 20 74 6f 6f 20 73 6d 61 6c  %lld is too smal
1d820 6c 20 28 25 64 20 62 79 74 65 73 29 22 2c 20 69  l (%d bytes)", i
1d830 4e 6f 64 65 2c 20 6e 4e 6f 64 65 0a 20 20 20 20  Node, nNode.    
1d840 20 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a    );.    }else{.
1d850 20 20 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b        int nCell;
1d860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d870 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
1d880 65 6c 6c 73 20 6f 6e 20 70 61 67 65 20 2a 2f 0a  ells on page */.
1d890 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20        int i;    
1d8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8b0 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65    /* Used to ite
1d8c0 72 61 74 65 20 74 68 72 6f 75 67 68 20 63 65 6c  rate through cel
1d8d0 6c 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ls */.      if( 
1d8e0 61 50 61 72 65 6e 74 3d 3d 30 20 29 7b 0a 20 20  aParent==0 ){.  
1d8f0 20 20 20 20 20 20 69 44 65 70 74 68 20 3d 20 72        iDepth = r
1d900 65 61 64 49 6e 74 31 36 28 61 4e 6f 64 65 29 3b  eadInt16(aNode);
1d910 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 44 65  .        if( iDe
1d920 70 74 68 3e 52 54 52 45 45 5f 4d 41 58 5f 44 45  pth>RTREE_MAX_DE
1d930 50 54 48 20 29 7b 0a 20 20 20 20 20 20 20 20 20  PTH ){.         
1d940 20 72 74 72 65 65 43 68 65 63 6b 41 70 70 65 6e   rtreeCheckAppen
1d950 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 22 52 74  dMsg(pCheck, "Rt
1d960 72 65 65 20 64 65 70 74 68 20 6f 75 74 20 6f 66  ree depth out of
1d970 20 72 61 6e 67 65 20 28 25 64 29 22 2c 20 69 44   range (%d)", iD
1d980 65 70 74 68 29 3b 0a 20 20 20 20 20 20 20 20 20  epth);.         
1d990 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 4e   sqlite3_free(aN
1d9a0 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ode);.          
1d9b0 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
1d9c0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1d9d0 6e 43 65 6c 6c 20 3d 20 72 65 61 64 49 6e 74 31  nCell = readInt1
1d9e0 36 28 26 61 4e 6f 64 65 5b 32 5d 29 3b 0a 20 20  6(&aNode[2]);.  
1d9f0 20 20 20 20 69 66 28 20 28 34 20 2b 20 6e 43 65      if( (4 + nCe
1da00 6c 6c 2a 28 38 20 2b 20 70 43 68 65 63 6b 2d 3e  ll*(8 + pCheck->
1da10 6e 44 69 6d 2a 32 2a 34 29 29 3e 6e 4e 6f 64 65  nDim*2*4))>nNode
1da20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 74 72 65   ){.        rtre
1da30 65 43 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28  eCheckAppendMsg(
1da40 70 43 68 65 63 6b 2c 20 0a 20 20 20 20 20 20 20  pCheck, .       
1da50 20 20 20 20 20 22 4e 6f 64 65 20 25 6c 6c 64 20       "Node %lld 
1da60 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72  is too small for
1da70 20 63 65 6c 6c 20 63 6f 75 6e 74 20 6f 66 20 25   cell count of %
1da80 64 20 28 25 64 20 62 79 74 65 73 29 22 2c 20 0a  d (%d bytes)", .
1da90 20 20 20 20 20 20 20 20 20 20 20 20 69 4e 6f 64              iNod
1daa0 65 2c 20 6e 43 65 6c 6c 2c 20 6e 4e 6f 64 65 0a  e, nCell, nNode.
1dab0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
1dac0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1dad0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
1dae0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1daf0 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 26 61    u8 *pCell = &a
1db00 4e 6f 64 65 5b 34 20 2b 20 69 2a 28 38 20 2b 20  Node[4 + i*(8 + 
1db10 70 43 68 65 63 6b 2d 3e 6e 44 69 6d 2a 32 2a 34  pCheck->nDim*2*4
1db20 29 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 36  )];.          i6
1db30 34 20 69 56 61 6c 20 3d 20 72 65 61 64 49 6e 74  4 iVal = readInt
1db40 36 34 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20  64(pCell);.     
1db50 20 20 20 20 20 72 74 72 65 65 43 68 65 63 6b 43       rtreeCheckC
1db60 65 6c 6c 43 6f 6f 72 64 28 70 43 68 65 63 6b 2c  ellCoord(pCheck,
1db70 20 69 4e 6f 64 65 2c 20 69 2c 20 26 70 43 65 6c   iNode, i, &pCel
1db80 6c 5b 38 5d 2c 20 61 50 61 72 65 6e 74 29 3b 0a  l[8], aParent);.
1db90 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
1dba0 44 65 70 74 68 3e 30 20 29 7b 0a 20 20 20 20 20  Depth>0 ){.     
1dbb0 20 20 20 20 20 20 20 72 74 72 65 65 43 68 65 63         rtreeChec
1dbc0 6b 4d 61 70 70 69 6e 67 28 70 43 68 65 63 6b 2c  kMapping(pCheck,
1dbd0 20 30 2c 20 69 56 61 6c 2c 20 69 4e 6f 64 65 29   0, iVal, iNode)
1dbe0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 74  ;.            rt
1dbf0 72 65 65 43 68 65 63 6b 4e 6f 64 65 28 70 43 68  reeCheckNode(pCh
1dc00 65 63 6b 2c 20 69 44 65 70 74 68 2d 31 2c 20 26  eck, iDepth-1, &
1dc10 70 43 65 6c 6c 5b 38 5d 2c 20 69 56 61 6c 29 3b  pCell[8], iVal);
1dc20 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 68  .            pCh
1dc30 65 63 6b 2d 3e 6e 4e 6f 6e 4c 65 61 66 2b 2b 3b  eck->nNonLeaf++;
1dc40 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
1dc50 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 74  {.            rt
1dc60 72 65 65 43 68 65 63 6b 4d 61 70 70 69 6e 67 28  reeCheckMapping(
1dc70 70 43 68 65 63 6b 2c 20 31 2c 20 69 56 61 6c 2c  pCheck, 1, iVal,
1dc80 20 69 4e 6f 64 65 29 3b 0a 20 20 20 20 20 20 20   iNode);.       
1dc90 20 20 20 20 20 70 43 68 65 63 6b 2d 3e 6e 4c 65       pCheck->nLe
1dca0 61 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  af++;.          
1dcb0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1dcc0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
1dcd0 6c 69 74 65 33 5f 66 72 65 65 28 61 4e 6f 64 65  lite3_free(aNode
1dce0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1dcf0 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
1dd00 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
1dd10 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 65 69 74  tion must be eit
1dd20 68 65 72 20 22 5f 72 6f 77 69 64 22 20 6f 72 0a  her "_rowid" or.
1dd30 2a 2a 20 22 5f 70 61 72 65 6e 74 22 2e 20 54 68  ** "_parent". Th
1dd40 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63  is function chec
1dd50 6b 73 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62  ks that the numb
1dd60 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
1dd70 20 74 68 65 0a 2a 2a 20 25 5f 72 6f 77 69 64 20   the.** %_rowid 
1dd80 6f 72 20 25 5f 70 61 72 65 6e 74 20 74 61 62 6c  or %_parent tabl
1dd90 65 20 69 73 20 65 78 61 63 74 6c 79 20 6e 45 78  e is exactly nEx
1dda0 70 65 63 74 2e 20 49 66 20 6e 6f 74 2c 20 69 74  pect. If not, it
1ddb0 20 61 64 64 73 0a 2a 2a 20 61 6e 20 65 72 72 6f   adds.** an erro
1ddc0 72 20 6d 65 73 73 61 67 65 20 74 6f 20 74 68 65  r message to the
1ddd0 20 72 65 70 6f 72 74 20 69 6e 20 74 68 65 20 52   report in the R
1dde0 74 72 65 65 43 68 65 63 6b 20 6f 62 6a 65 63 74  treeCheck object
1ddf0 20 69 6e 64 69 63 61 74 65 64 0a 2a 2a 20 62 79   indicated.** by
1de00 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
1de10 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ent..*/.static v
1de20 6f 69 64 20 72 74 72 65 65 43 68 65 63 6b 43 6f  oid rtreeCheckCo
1de30 75 6e 74 28 52 74 72 65 65 43 68 65 63 6b 20 2a  unt(RtreeCheck *
1de40 70 43 68 65 63 6b 2c 20 63 6f 6e 73 74 20 63 68  pCheck, const ch
1de50 61 72 20 2a 7a 54 62 6c 2c 20 69 36 34 20 6e 45  ar *zTbl, i64 nE
1de60 78 70 65 63 74 29 7b 0a 20 20 69 66 28 20 70 43  xpect){.  if( pC
1de70 68 65 63 6b 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  heck->rc==SQLITE
1de80 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
1de90 65 33 5f 73 74 6d 74 20 2a 70 43 6f 75 6e 74 3b  e3_stmt *pCount;
1dea0 0a 20 20 20 20 70 43 6f 75 6e 74 20 3d 20 72 74  .    pCount = rt
1deb0 72 65 65 43 68 65 63 6b 50 72 65 70 61 72 65 28  reeCheckPrepare(
1dec0 70 43 68 65 63 6b 2c 20 22 53 45 4c 45 43 54 20  pCheck, "SELECT 
1ded0 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25 51  count(*) FROM %Q
1dee0 2e 27 25 71 25 73 27 22 2c 0a 20 20 20 20 20 20  .'%q%s'",.      
1def0 20 20 70 43 68 65 63 6b 2d 3e 7a 44 62 2c 20 70    pCheck->zDb, p
1df00 43 68 65 63 6b 2d 3e 7a 54 61 62 2c 20 7a 54 62  Check->zTab, zTb
1df10 6c 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  l.    );.    if(
1df20 20 70 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20   pCount ){.     
1df30 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 65   if( sqlite3_ste
1df40 70 28 70 43 6f 75 6e 74 29 3d 3d 53 51 4c 49 54  p(pCount)==SQLIT
1df50 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20  E_ROW ){.       
1df60 20 69 36 34 20 6e 41 63 74 75 61 6c 20 3d 20 73   i64 nActual = s
1df70 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
1df80 74 36 34 28 70 43 6f 75 6e 74 2c 20 30 29 3b 0a  t64(pCount, 0);.
1df90 20 20 20 20 20 20 20 20 69 66 28 20 6e 41 63 74          if( nAct
1dfa0 75 61 6c 21 3d 6e 45 78 70 65 63 74 20 29 7b 0a  ual!=nExpect ){.
1dfb0 20 20 20 20 20 20 20 20 20 20 72 74 72 65 65 43            rtreeC
1dfc0 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
1dfd0 68 65 63 6b 2c 20 22 57 72 6f 6e 67 20 6e 75 6d  heck, "Wrong num
1dfe0 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
1dff0 6e 20 25 25 25 73 20 74 61 62 6c 65 22 0a 20 20  n %%%s table".  
1e000 20 20 20 20 20 20 20 20 20 20 20 20 22 20 2d 20              " - 
1e010 65 78 70 65 63 74 65 64 20 25 6c 6c 64 2c 20 61  expected %lld, a
1e020 63 74 75 61 6c 20 25 6c 6c 64 22 20 2c 20 7a 54  ctual %lld" , zT
1e030 62 6c 2c 20 6e 45 78 70 65 63 74 2c 20 6e 41 63  bl, nExpect, nAc
1e040 74 75 61 6c 0a 20 20 20 20 20 20 20 20 20 20 29  tual.          )
1e050 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1e060 20 20 7d 0a 20 20 20 20 20 20 70 43 68 65 63 6b    }.      pCheck
1e070 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66  ->rc = sqlite3_f
1e080 69 6e 61 6c 69 7a 65 28 70 43 6f 75 6e 74 29 3b  inalize(pCount);
1e090 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
1e0a0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1e0b0 6e 20 64 6f 65 73 20 74 68 65 20 62 75 6c 6b 20  n does the bulk 
1e0c0 6f 66 20 74 68 65 20 77 6f 72 6b 20 66 6f 72 20  of the work for 
1e0d0 74 68 65 20 72 74 72 65 65 20 69 6e 74 65 67 72  the rtree integr
1e0e0 69 74 79 2d 63 68 65 63 6b 2e 0a 2a 2a 20 49 74  ity-check..** It
1e0f0 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 72 74   is called by rt
1e100 72 65 65 63 68 65 63 6b 28 29 2c 20 77 68 69 63  reecheck(), whic
1e110 68 20 69 73 20 74 68 65 20 53 51 4c 20 66 75 6e  h is the SQL fun
1e120 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 61  ction implementa
1e130 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
1e140 69 6e 74 20 72 74 72 65 65 43 68 65 63 6b 54 61  int rtreeCheckTa
1e150 62 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ble(.  sqlite3 *
1e160 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
1e170 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
1e180 73 65 20 68 61 6e 64 6c 65 20 74 6f 20 61 63 63  se handle to acc
1e190 65 73 73 20 64 62 20 74 68 72 6f 75 67 68 20 2a  ess db through *
1e1a0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1e1b0 7a 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  zDb,            
1e1c0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 64      /* Name of d
1e1d0 62 20 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70  b ("main", "temp
1e1e0 22 20 65 74 63 2e 29 20 2a 2f 0a 20 20 63 6f 6e  " etc.) */.  con
1e1f0 73 74 20 63 68 61 72 20 2a 7a 54 61 62 2c 20 20  st char *zTab,  
1e200 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e210 4e 61 6d 65 20 6f 66 20 72 74 72 65 65 20 74 61  Name of rtree ta
1e220 62 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  ble to check */.
1e230 20 20 63 68 61 72 20 2a 2a 70 7a 52 65 70 6f 72    char **pzRepor
1e240 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
1e250 20 20 2f 2a 20 4f 55 54 3a 20 73 71 6c 69 74 65    /* OUT: sqlite
1e260 33 5f 6d 61 6c 6c 6f 63 27 64 20 72 65 70 6f 72  3_malloc'd repor
1e270 74 20 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 52  t text */.){.  R
1e280 74 72 65 65 43 68 65 63 6b 20 63 68 65 63 6b 3b  treeCheck check;
1e290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e2a0 2a 20 43 6f 6d 6d 6f 6e 20 63 6f 6e 74 65 78 74  * Common context
1e2b0 20 66 6f 72 20 76 61 72 69 6f 75 73 20 72 6f 75   for various rou
1e2c0 74 69 6e 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74  tines */.  sqlit
1e2d0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
1e2e0 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 55 73   0;        /* Us
1e2f0 65 64 20 74 6f 20 66 69 6e 64 20 63 6f 6c 75 6d  ed to find colum
1e300 6e 20 63 6f 75 6e 74 20 6f 66 20 72 74 72 65 65  n count of rtree
1e310 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
1e320 62 45 6e 64 20 3d 20 30 3b 20 20 20 20 20 20 20  bEnd = 0;       
1e330 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1e340 72 75 65 20 69 66 20 74 72 61 6e 73 61 63 74 69  rue if transacti
1e350 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f  on should be clo
1e360 73 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 49 6e 69  sed */..  /* Ini
1e370 74 69 61 6c 69 7a 65 20 74 68 65 20 63 6f 6e 74  tialize the cont
1e380 65 78 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ext object */.  
1e390 6d 65 6d 73 65 74 28 26 63 68 65 63 6b 2c 20 30  memset(&check, 0
1e3a0 2c 20 73 69 7a 65 6f 66 28 63 68 65 63 6b 29 29  , sizeof(check))
1e3b0 3b 0a 20 20 63 68 65 63 6b 2e 64 62 20 3d 20 64  ;.  check.db = d
1e3c0 62 3b 0a 20 20 63 68 65 63 6b 2e 7a 44 62 20 3d  b;.  check.zDb =
1e3d0 20 7a 44 62 3b 0a 20 20 63 68 65 63 6b 2e 7a 54   zDb;.  check.zT
1e3e0 61 62 20 3d 20 7a 54 61 62 3b 0a 0a 20 20 2f 2a  ab = zTab;..  /*
1e3f0 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74   If there is not
1e400 20 61 6c 72 65 61 64 79 20 61 6e 20 6f 70 65 6e   already an open
1e410 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 70   transaction, op
1e420 65 6e 20 6f 6e 65 20 6e 6f 77 2e 20 54 68 69 73  en one now. This
1e430 20 69 73 0a 20 20 2a 2a 20 74 6f 20 65 6e 73 75   is.  ** to ensu
1e440 72 65 20 74 68 61 74 20 74 68 65 20 71 75 65 72  re that the quer
1e450 69 65 73 20 72 75 6e 20 61 73 20 70 61 72 74 20  ies run as part 
1e460 6f 66 20 74 68 69 73 20 69 6e 74 65 67 72 69 74  of this integrit
1e470 79 2d 63 68 65 63 6b 20 6f 70 65 72 61 74 65 0a  y-check operate.
1e480 20 20 2a 2a 20 6f 6e 20 61 20 63 6f 6e 73 69 73    ** on a consis
1e490 74 65 6e 74 20 73 6e 61 70 73 68 6f 74 2e 20 20  tent snapshot.  
1e4a0 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
1e4b0 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28  _get_autocommit(
1e4c0 64 62 29 20 29 7b 0a 20 20 20 20 63 68 65 63 6b  db) ){.    check
1e4d0 2e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78  .rc = sqlite3_ex
1e4e0 65 63 28 64 62 2c 20 22 42 45 47 49 4e 22 2c 20  ec(db, "BEGIN", 
1e4f0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 62 45  0, 0, 0);.    bE
1e500 6e 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  nd = 1;.  }..  /
1e510 2a 20 46 69 6e 64 20 6e 75 6d 62 65 72 20 6f 66  * Find number of
1e520 20 64 69 6d 65 6e 73 69 6f 6e 73 20 69 6e 20 74   dimensions in t
1e530 68 65 20 72 74 72 65 65 20 74 61 62 6c 65 2e 20  he rtree table. 
1e540 2a 2f 0a 20 20 70 53 74 6d 74 20 3d 20 72 74 72  */.  pStmt = rtr
1e550 65 65 43 68 65 63 6b 50 72 65 70 61 72 65 28 26  eeCheckPrepare(&
1e560 63 68 65 63 6b 2c 20 22 53 45 4c 45 43 54 20 2a  check, "SELECT *
1e570 20 46 52 4f 4d 20 25 51 2e 25 51 22 2c 20 7a 44   FROM %Q.%Q", zD
1e580 62 2c 20 7a 54 61 62 29 3b 0a 20 20 69 66 28 20  b, zTab);.  if( 
1e590 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 6e 74  pStmt ){.    int
1e5a0 20 72 63 3b 0a 20 20 20 20 63 68 65 63 6b 2e 6e   rc;.    check.n
1e5b0 44 69 6d 20 3d 20 28 73 71 6c 69 74 65 33 5f 63  Dim = (sqlite3_c
1e5c0 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d  olumn_count(pStm
1e5d0 74 29 20 2d 20 31 29 20 2f 20 32 3b 0a 20 20 20  t) - 1) / 2;.   
1e5e0 20 69 66 28 20 63 68 65 63 6b 2e 6e 44 69 6d 3c   if( check.nDim<
1e5f0 31 20 29 7b 0a 20 20 20 20 20 20 72 74 72 65 65  1 ){.      rtree
1e600 43 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 26  CheckAppendMsg(&
1e610 63 68 65 63 6b 2c 20 22 53 63 68 65 6d 61 20 63  check, "Schema c
1e620 6f 72 72 75 70 74 20 6f 72 20 6e 6f 74 20 61 6e  orrupt or not an
1e630 20 72 74 72 65 65 22 29 3b 0a 20 20 20 20 7d 65   rtree");.    }e
1e640 6c 73 65 20 69 66 28 20 53 51 4c 49 54 45 5f 52  lse if( SQLITE_R
1e650 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
1e660 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20  (pStmt) ){.     
1e670 20 63 68 65 63 6b 2e 62 49 6e 74 20 3d 20 28 73   check.bInt = (s
1e680 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79  qlite3_column_ty
1e690 70 65 28 70 53 74 6d 74 2c 20 31 29 3d 3d 53 51  pe(pStmt, 1)==SQ
1e6a0 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 3b 0a 20  LITE_INTEGER);. 
1e6b0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
1e6c0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
1e6d0 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 72  Stmt);.    if( r
1e6e0 63 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  c!=SQLITE_CORRUP
1e6f0 54 20 29 20 63 68 65 63 6b 2e 72 63 20 3d 20 72  T ) check.rc = r
1e700 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 20  c;.  }..  /* Do 
1e710 74 68 65 20 61 63 74 75 61 6c 20 69 6e 74 65 67  the actual integ
1e720 72 69 74 79 2d 63 68 65 63 6b 20 2a 2f 0a 20 20  rity-check */.  
1e730 69 66 28 20 63 68 65 63 6b 2e 6e 44 69 6d 3e 3d  if( check.nDim>=
1e740 31 20 29 7b 0a 20 20 20 20 69 66 28 20 63 68 65  1 ){.    if( che
1e750 63 6b 2e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ck.rc==SQLITE_OK
1e760 20 29 7b 0a 20 20 20 20 20 20 72 74 72 65 65 43   ){.      rtreeC
1e770 68 65 63 6b 4e 6f 64 65 28 26 63 68 65 63 6b 2c  heckNode(&check,
1e780 20 30 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 7d   0, 0, 1);.    }
1e790 0a 20 20 20 20 72 74 72 65 65 43 68 65 63 6b 43  .    rtreeCheckC
1e7a0 6f 75 6e 74 28 26 63 68 65 63 6b 2c 20 22 5f 72  ount(&check, "_r
1e7b0 6f 77 69 64 22 2c 20 63 68 65 63 6b 2e 6e 4c 65  owid", check.nLe
1e7c0 61 66 29 3b 0a 20 20 20 20 72 74 72 65 65 43 68  af);.    rtreeCh
1e7d0 65 63 6b 43 6f 75 6e 74 28 26 63 68 65 63 6b 2c  eckCount(&check,
1e7e0 20 22 5f 70 61 72 65 6e 74 22 2c 20 63 68 65 63   "_parent", chec
1e7f0 6b 2e 6e 4e 6f 6e 4c 65 61 66 29 3b 0a 20 20 7d  k.nNonLeaf);.  }
1e800 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20  ..  /* Finalize 
1e810 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 75  SQL statements u
1e820 73 65 64 20 62 79 20 74 68 65 20 69 6e 74 65 67  sed by the integ
1e830 72 69 74 79 2d 63 68 65 63 6b 20 2a 2f 0a 20 20  rity-check */.  
1e840 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
1e850 28 63 68 65 63 6b 2e 70 47 65 74 4e 6f 64 65 29  (check.pGetNode)
1e860 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  ;.  sqlite3_fina
1e870 6c 69 7a 65 28 63 68 65 63 6b 2e 61 43 68 65 63  lize(check.aChec
1e880 6b 4d 61 70 70 69 6e 67 5b 30 5d 29 3b 0a 20 20  kMapping[0]);.  
1e890 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
1e8a0 28 63 68 65 63 6b 2e 61 43 68 65 63 6b 4d 61 70  (check.aCheckMap
1e8b0 70 69 6e 67 5b 31 5d 29 3b 0a 0a 20 20 2f 2a 20  ping[1]);..  /* 
1e8c0 49 66 20 6f 6e 65 20 77 61 73 20 6f 70 65 6e 65  If one was opene
1e8d0 64 2c 20 63 6c 6f 73 65 20 74 68 65 20 74 72 61  d, close the tra
1e8e0 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66  nsaction */.  if
1e8f0 28 20 62 45 6e 64 20 29 7b 0a 20 20 20 20 69 6e  ( bEnd ){.    in
1e900 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65  t rc = sqlite3_e
1e910 78 65 63 28 64 62 2c 20 22 45 4e 44 22 2c 20 30  xec(db, "END", 0
1e920 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
1e930 20 63 68 65 63 6b 2e 72 63 3d 3d 53 51 4c 49 54   check.rc==SQLIT
1e940 45 5f 4f 4b 20 29 20 63 68 65 63 6b 2e 72 63 20  E_OK ) check.rc 
1e950 3d 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 70 7a 52  = rc;.  }.  *pzR
1e960 65 70 6f 72 74 20 3d 20 63 68 65 63 6b 2e 7a 52  eport = check.zR
1e970 65 70 6f 72 74 3b 0a 20 20 72 65 74 75 72 6e 20  eport;.  return 
1e980 63 68 65 63 6b 2e 72 63 3b 0a 7d 0a 0a 2f 2a 0a  check.rc;.}../*.
1e990 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20  ** Usage:.**.** 
1e9a0 20 20 72 74 72 65 65 63 68 65 63 6b 28 3c 72 74    rtreecheck(<rt
1e9b0 72 65 65 2d 74 61 62 6c 65 3e 29 3b 0a 2a 2a 20  ree-table>);.** 
1e9c0 20 20 72 74 72 65 65 63 68 65 63 6b 28 3c 64 61    rtreecheck(<da
1e9d0 74 61 62 61 73 65 3e 2c 20 3c 72 74 72 65 65 2d  tabase>, <rtree-
1e9e0 74 61 62 6c 65 3e 29 3b 0a 2a 2a 0a 2a 2a 20 49  table>);.**.** I
1e9f0 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 53 51 4c  nvoking this SQL
1ea00 20 66 75 6e 63 74 69 6f 6e 20 72 75 6e 73 20 61   function runs a
1ea10 6e 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63  n integrity-chec
1ea20 6b 20 6f 6e 20 74 68 65 20 6e 61 6d 65 64 20 72  k on the named r
1ea30 74 72 65 65 0a 2a 2a 20 74 61 62 6c 65 2e 20 54  tree.** table. T
1ea40 68 65 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65  he integrity-che
1ea50 63 6b 20 76 65 72 69 66 69 65 73 20 74 68 65 20  ck verifies the 
1ea60 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
1ea70 20 20 20 31 2e 20 46 6f 72 20 65 61 63 68 20 63     1. For each c
1ea80 65 6c 6c 20 69 6e 20 74 68 65 20 72 2d 74 72 65  ell in the r-tre
1ea90 65 20 73 74 72 75 63 74 75 72 65 20 28 25 5f 6e  e structure (%_n
1eaa0 6f 64 65 20 74 61 62 6c 65 29 2c 20 74 68 61 74  ode table), that
1eab0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 61 29  :.**.**       a)
1eac0 20 66 6f 72 20 65 61 63 68 20 64 69 6d 65 6e 73   for each dimens
1ead0 69 6f 6e 2c 20 28 63 6f 6f 72 64 31 20 3c 3d 20  ion, (coord1 <= 
1eae0 63 6f 6f 72 64 32 29 2e 0a 2a 2a 0a 2a 2a 20 20  coord2)..**.**  
1eaf0 20 20 20 20 20 62 29 20 75 6e 6c 65 73 73 20 74       b) unless t
1eb00 68 65 20 63 65 6c 6c 20 69 73 20 6f 6e 20 74 68  he cell is on th
1eb10 65 20 72 6f 6f 74 20 6e 6f 64 65 2c 20 74 68 61  e root node, tha
1eb20 74 20 74 68 65 20 63 65 6c 6c 20 69 73 20 62 6f  t the cell is bo
1eb30 75 6e 64 65 64 0a 2a 2a 20 20 20 20 20 20 20 20  unded.**        
1eb40 20 20 62 79 20 74 68 65 20 70 61 72 65 6e 74 20    by the parent 
1eb50 63 65 6c 6c 20 6f 6e 20 74 68 65 20 70 61 72 65  cell on the pare
1eb60 6e 74 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20  nt node..**.**  
1eb70 20 20 20 20 20 63 29 20 66 6f 72 20 6c 65 61 66       c) for leaf
1eb80 20 6e 6f 64 65 73 2c 20 74 68 61 74 20 74 68 65   nodes, that the
1eb90 72 65 20 69 73 20 61 6e 20 65 6e 74 72 79 20 69  re is an entry i
1eba0 6e 20 74 68 65 20 25 5f 72 6f 77 69 64 20 0a 2a  n the %_rowid .*
1ebb0 2a 20 20 20 20 20 20 20 20 20 20 74 61 62 6c 65  *          table
1ebc0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1ebd0 6f 20 74 68 65 20 63 65 6c 6c 27 73 20 72 6f 77  o the cell's row
1ebe0 69 64 20 76 61 6c 75 65 20 74 68 61 74 20 0a 2a  id value that .*
1ebf0 2a 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74  *          point
1ec00 73 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  s to the correct
1ec10 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   node..**.**    
1ec20 20 20 20 64 29 20 66 6f 72 20 63 65 6c 6c 73 20     d) for cells 
1ec30 6f 6e 20 6e 6f 6e 2d 6c 65 61 66 20 6e 6f 64 65  on non-leaf node
1ec40 73 2c 20 74 68 61 74 20 74 68 65 72 65 20 69 73  s, that there is
1ec50 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65   an entry in the
1ec60 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 25 5f   .**          %_
1ec70 70 61 72 65 6e 74 20 74 61 62 6c 65 20 6d 61 70  parent table map
1ec80 70 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 63 65  ping from the ce
1ec90 6c 6c 27 73 20 63 68 69 6c 64 20 6e 6f 64 65 20  ll's child node 
1eca0 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  to the.**       
1ecb0 20 20 20 6e 6f 64 65 20 74 68 61 74 20 69 74 20     node that it 
1ecc0 72 65 73 69 64 65 73 20 6f 6e 2e 0a 2a 2a 0a 2a  resides on..**.*
1ecd0 2a 20 20 20 32 2e 20 54 68 61 74 20 74 68 65 72  *   2. That ther
1ece0 65 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 6e  e are the same n
1ecf0 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
1ed00 20 69 6e 20 74 68 65 20 25 5f 72 6f 77 69 64 20   in the %_rowid 
1ed10 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 61 73  table.**      as
1ed20 20 74 68 65 72 65 20 61 72 65 20 6c 65 61 66 20   there are leaf 
1ed30 63 65 6c 6c 73 20 69 6e 20 74 68 65 20 72 2d 74  cells in the r-t
1ed40 72 65 65 20 73 74 72 75 63 74 75 72 65 2c 20 61  ree structure, a
1ed50 6e 64 20 74 68 61 74 20 74 68 65 72 65 0a 2a 2a  nd that there.**
1ed60 20 20 20 20 20 20 69 73 20 61 20 6c 65 61 66 20        is a leaf 
1ed70 63 65 6c 6c 20 74 68 61 74 20 63 6f 72 72 65 73  cell that corres
1ed80 70 6f 6e 64 73 20 74 6f 20 65 61 63 68 20 65 6e  ponds to each en
1ed90 74 72 79 20 69 6e 20 74 68 65 20 25 5f 72 6f 77  try in the %_row
1eda0 69 64 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  id table..**.** 
1edb0 20 20 33 2e 20 54 68 61 74 20 74 68 65 72 65 20    3. That there 
1edc0 61 72 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  are the same num
1edd0 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
1ede0 6e 20 74 68 65 20 25 5f 70 61 72 65 6e 74 20 74  n the %_parent t
1edf0 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 61 73 20  able.**      as 
1ee00 74 68 65 72 65 20 61 72 65 20 6e 6f 6e 2d 6c 65  there are non-le
1ee10 61 66 20 63 65 6c 6c 73 20 69 6e 20 74 68 65 20  af cells in the 
1ee20 72 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  r-tree structure
1ee30 2c 20 61 6e 64 20 74 68 61 74 20 0a 2a 2a 20 20  , and that .**  
1ee40 20 20 20 20 74 68 65 72 65 20 69 73 20 61 20 6e      there is a n
1ee50 6f 6e 2d 6c 65 61 66 20 63 65 6c 6c 20 74 68 61  on-leaf cell tha
1ee60 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  t corresponds to
1ee70 20 65 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74   each entry in t
1ee80 68 65 20 0a 2a 2a 20 20 20 20 20 20 25 5f 70 61  he .**      %_pa
1ee90 72 65 6e 74 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73  rent table..*/.s
1eea0 74 61 74 69 63 20 76 6f 69 64 20 72 74 72 65 65  tatic void rtree
1eeb0 63 68 65 63 6b 28 0a 20 20 73 71 6c 69 74 65 33  check(.  sqlite3
1eec0 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20 0a  _context *ctx, .
1eed0 20 20 69 6e 74 20 6e 41 72 67 2c 20 0a 20 20 73    int nArg, .  s
1eee0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
1eef0 70 41 72 67 0a 29 7b 0a 20 20 69 66 28 20 6e 41  pArg.){.  if( nA
1ef00 72 67 21 3d 31 20 26 26 20 6e 41 72 67 21 3d 32  rg!=1 && nArg!=2
1ef10 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1ef20 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 74 78  result_error(ctx
1ef30 2c 20 0a 20 20 20 20 20 20 20 20 22 77 72 6f 6e  , .        "wron
1ef40 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  g number of argu
1ef50 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63 74 69 6f  ments to functio
1ef60 6e 20 72 74 72 65 65 63 68 65 63 6b 28 29 22 2c  n rtreecheck()",
1ef70 20 2d 31 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c   -1.    );.  }el
1ef80 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a  se{.    int rc;.
1ef90 20 20 20 20 63 68 61 72 20 2a 7a 52 65 70 6f 72      char *zRepor
1efa0 74 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74  t = 0;.    const
1efb0 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 28 63 6f   char *zDb = (co
1efc0 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
1efd0 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70 41  3_value_text(apA
1efe0 72 67 5b 30 5d 29 3b 0a 20 20 20 20 63 6f 6e 73  rg[0]);.    cons
1eff0 74 20 63 68 61 72 20 2a 7a 54 61 62 3b 0a 20 20  t char *zTab;.  
1f000 20 20 69 66 28 20 6e 41 72 67 3d 3d 31 20 29 7b    if( nArg==1 ){
1f010 0a 20 20 20 20 20 20 7a 54 61 62 20 3d 20 7a 44  .      zTab = zD
1f020 62 3b 0a 20 20 20 20 20 20 7a 44 62 20 3d 20 22  b;.      zDb = "
1f030 6d 61 69 6e 22 3b 0a 20 20 20 20 7d 65 6c 73 65  main";.    }else
1f040 7b 0a 20 20 20 20 20 20 7a 54 61 62 20 3d 20 28  {.      zTab = (
1f050 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
1f060 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
1f070 70 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 0a  pArg[1]);.    }.
1f080 20 20 20 20 72 63 20 3d 20 72 74 72 65 65 43 68      rc = rtreeCh
1f090 65 63 6b 54 61 62 6c 65 28 73 71 6c 69 74 65 33  eckTable(sqlite3
1f0a0 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64  _context_db_hand
1f0b0 6c 65 28 63 74 78 29 2c 20 7a 44 62 2c 20 7a 54  le(ctx), zDb, zT
1f0c0 61 62 2c 20 26 7a 52 65 70 6f 72 74 29 3b 0a 20  ab, &zReport);. 
1f0d0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1f0e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
1f0f0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
1f100 74 28 63 74 78 2c 20 7a 52 65 70 6f 72 74 20 3f  t(ctx, zReport ?
1f110 20 7a 52 65 70 6f 72 74 20 3a 20 22 6f 6b 22 2c   zReport : "ok",
1f120 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e   -1, SQLITE_TRAN
1f130 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73  SIENT);.    }els
1f140 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
1f150 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 63 6f  _result_error_co
1f160 64 65 28 63 74 78 2c 20 72 63 29 3b 0a 20 20 20  de(ctx, rc);.   
1f170 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
1f180 72 65 65 28 7a 52 65 70 6f 72 74 29 3b 0a 20 20  ree(zReport);.  
1f190 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  }.}.../*.** Regi
1f1a0 73 74 65 72 20 74 68 65 20 72 2d 74 72 65 65 20  ster the r-tree 
1f1b0 6d 6f 64 75 6c 65 20 77 69 74 68 20 64 61 74 61  module with data
1f1c0 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 20  base handle db. 
1f1d0 54 68 69 73 20 63 72 65 61 74 65 73 20 74 68 65  This creates the
1f1e0 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c  .** virtual tabl
1f1f0 65 20 6d 6f 64 75 6c 65 20 22 72 74 72 65 65 22  e module "rtree"
1f200 20 61 6e 64 20 74 68 65 20 64 65 62 75 67 67 69   and the debuggi
1f210 6e 67 2f 61 6e 61 6c 79 73 69 73 20 73 63 61 6c  ng/analysis scal
1f220 61 72 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  ar .** function 
1f230 22 72 74 72 65 65 6e 6f 64 65 22 2e 0a 2a 2f 0a  "rtreenode"..*/.
1f240 69 6e 74 20 73 71 6c 69 74 65 33 52 74 72 65 65  int sqlite3Rtree
1f250 49 6e 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62  Init(sqlite3 *db
1f260 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 75  ){.  const int u
1f270 74 66 38 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  tf8 = SQLITE_UTF
1f280 38 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  8;.  int rc;..  
1f290 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
1f2a0 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
1f2b0 20 22 72 74 72 65 65 6e 6f 64 65 22 2c 20 32 2c   "rtreenode", 2,
1f2c0 20 75 74 66 38 2c 20 30 2c 20 72 74 72 65 65 6e   utf8, 0, rtreen
1f2d0 6f 64 65 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  ode, 0, 0);.  if
1f2e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1f2f0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1f300 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
1f310 69 6f 6e 28 64 62 2c 20 22 72 74 72 65 65 64 65  ion(db, "rtreede
1f320 70 74 68 22 2c 20 31 2c 20 75 74 66 38 2c 20 30  pth", 1, utf8, 0
1f330 2c 72 74 72 65 65 64 65 70 74 68 2c 20 30 2c 20  ,rtreedepth, 0, 
1f340 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  0);.  }.  if( rc
1f350 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1f360 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
1f370 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
1f380 64 62 2c 20 22 72 74 72 65 65 63 68 65 63 6b 22  db, "rtreecheck"
1f390 2c 20 2d 31 2c 20 75 74 66 38 2c 20 30 2c 72 74  , -1, utf8, 0,rt
1f3a0 72 65 65 63 68 65 63 6b 2c 20 30 2c 30 29 3b 0a  reecheck, 0,0);.
1f3b0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
1f3c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66 64 65  LITE_OK ){.#ifde
1f3d0 66 20 53 51 4c 49 54 45 5f 52 54 52 45 45 5f 49  f SQLITE_RTREE_I
1f3e0 4e 54 5f 4f 4e 4c 59 0a 20 20 20 20 76 6f 69 64  NT_ONLY.    void
1f3f0 20 2a 63 20 3d 20 28 76 6f 69 64 20 2a 29 52 54   *c = (void *)RT
1f400 52 45 45 5f 43 4f 4f 52 44 5f 49 4e 54 33 32 3b  REE_COORD_INT32;
1f410 0a 23 65 6c 73 65 0a 20 20 20 20 76 6f 69 64 20  .#else.    void 
1f420 2a 63 20 3d 20 28 76 6f 69 64 20 2a 29 52 54 52  *c = (void *)RTR
1f430 45 45 5f 43 4f 4f 52 44 5f 52 45 41 4c 33 32 3b  EE_COORD_REAL32;
1f440 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d  .#endif.    rc =
1f450 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
1f460 6d 6f 64 75 6c 65 5f 76 32 28 64 62 2c 20 22 72  module_v2(db, "r
1f470 74 72 65 65 22 2c 20 26 72 74 72 65 65 4d 6f 64  tree", &rtreeMod
1f480 75 6c 65 2c 20 63 2c 20 30 29 3b 0a 20 20 7d 0a  ule, c, 0);.  }.
1f490 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1f4a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 76 6f 69 64 20  _OK ){.    void 
1f4b0 2a 63 20 3d 20 28 76 6f 69 64 20 2a 29 52 54 52  *c = (void *)RTR
1f4c0 45 45 5f 43 4f 4f 52 44 5f 49 4e 54 33 32 3b 0a  EE_COORD_INT32;.
1f4d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1f4e0 5f 63 72 65 61 74 65 5f 6d 6f 64 75 6c 65 5f 76  _create_module_v
1f4f0 32 28 64 62 2c 20 22 72 74 72 65 65 5f 69 33 32  2(db, "rtree_i32
1f500 22 2c 20 26 72 74 72 65 65 4d 6f 64 75 6c 65 2c  ", &rtreeModule,
1f510 20 63 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 72   c, 0);.  }..  r
1f520 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1f530 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1f540 64 65 6c 65 74 65 73 20 74 68 65 20 52 74 72 65  deletes the Rtre
1f550 65 47 65 6f 6d 43 61 6c 6c 62 61 63 6b 20 6f 62  eGeomCallback ob
1f560 6a 65 63 74 20 74 68 61 74 20 77 61 73 20 61 74  ject that was at
1f570 74 61 63 68 65 64 0a 2a 2a 20 6f 6e 65 20 6f 66  tached.** one of
1f580 20 74 68 65 20 53 51 4c 20 66 75 6e 63 74 69 6f   the SQL functio
1f590 6e 73 20 63 72 65 61 74 65 20 62 79 20 73 71 6c  ns create by sql
1f5a0 69 74 65 33 5f 72 74 72 65 65 5f 67 65 6f 6d 65  ite3_rtree_geome
1f5b0 74 72 79 5f 63 61 6c 6c 62 61 63 6b 28 29 0a 2a  try_callback().*
1f5c0 2a 20 6f 72 20 73 71 6c 69 74 65 33 5f 72 74 72  * or sqlite3_rtr
1f5d0 65 65 5f 71 75 65 72 79 5f 63 61 6c 6c 62 61 63  ee_query_callbac
1f5e0 6b 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  k().  In other w
1f5f0 6f 72 64 73 2c 20 74 68 69 73 20 72 6f 75 74 69  ords, this routi
1f600 6e 65 20 69 73 20 74 68 65 0a 2a 2a 20 64 65 73  ne is the.** des
1f610 74 72 75 63 74 6f 72 20 66 6f 72 20 61 6e 20 52  tructor for an R
1f620 74 72 65 65 47 65 6f 6d 43 61 6c 6c 62 61 63 6b  treeGeomCallback
1f630 20 6f 62 6a 65 63 63 74 2e 20 20 54 68 69 73 20   objecct.  This 
1f640 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
1f650 64 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 63 6f  d when.** the co
1f660 72 72 65 73 70 6f 6e 64 69 6e 67 20 53 51 4c 20  rresponding SQL 
1f670 66 75 6e 63 74 69 6f 6e 20 69 73 20 64 65 6c 65  function is dele
1f680 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ted..*/.static v
1f690 6f 69 64 20 72 74 72 65 65 46 72 65 65 43 61 6c  oid rtreeFreeCal
1f6a0 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 29 7b 0a  lback(void *p){.
1f6b0 20 20 52 74 72 65 65 47 65 6f 6d 43 61 6c 6c 62    RtreeGeomCallb
1f6c0 61 63 6b 20 2a 70 49 6e 66 6f 20 3d 20 28 52 74  ack *pInfo = (Rt
1f6d0 72 65 65 47 65 6f 6d 43 61 6c 6c 62 61 63 6b 2a  reeGeomCallback*
1f6e0 29 70 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f 2d  )p;.  if( pInfo-
1f6f0 3e 78 44 65 73 74 72 75 63 74 6f 72 20 29 20 70  >xDestructor ) p
1f700 49 6e 66 6f 2d 3e 78 44 65 73 74 72 75 63 74 6f  Info->xDestructo
1f710 72 28 70 49 6e 66 6f 2d 3e 70 43 6f 6e 74 65 78  r(pInfo->pContex
1f720 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  t);.  sqlite3_fr
1f730 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ee(p);.}../*.** 
1f740 54 68 69 73 20 72 6f 75 74 69 6e 65 20 66 72 65  This routine fre
1f750 65 73 20 74 68 65 20 42 4c 4f 42 20 74 68 61 74  es the BLOB that
1f760 20 69 73 20 72 65 74 75 72 6e 65 64 20 62 79 20   is returned by 
1f770 67 65 6f 6d 43 61 6c 6c 62 61 63 6b 28 29 2e 0a  geomCallback()..
1f780 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
1f790 74 72 65 65 4d 61 74 63 68 41 72 67 46 72 65 65  treeMatchArgFree
1f7a0 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20  (void *pArg){.  
1f7b0 69 6e 74 20 69 3b 0a 20 20 52 74 72 65 65 4d 61  int i;.  RtreeMa
1f7c0 74 63 68 41 72 67 20 2a 70 20 3d 20 28 52 74 72  tchArg *p = (Rtr
1f7d0 65 65 4d 61 74 63 68 41 72 67 2a 29 70 41 72 67  eeMatchArg*)pArg
1f7e0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
1f7f0 2d 3e 6e 50 61 72 61 6d 3b 20 69 2b 2b 29 7b 0a  ->nParam; i++){.
1f800 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
1f810 65 5f 66 72 65 65 28 70 2d 3e 61 70 53 71 6c 50  e_free(p->apSqlP
1f820 61 72 61 6d 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  aram[i]);.  }.  
1f830 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
1f840 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 63  .}../*.** Each c
1f850 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 72  all to sqlite3_r
1f860 74 72 65 65 5f 67 65 6f 6d 65 74 72 79 5f 63 61  tree_geometry_ca
1f870 6c 6c 62 61 63 6b 28 29 20 6f 72 0a 2a 2a 20 73  llback() or.** s
1f880 71 6c 69 74 65 33 5f 72 74 72 65 65 5f 71 75 65  qlite3_rtree_que
1f890 72 79 5f 63 61 6c 6c 62 61 63 6b 28 29 20 63 72  ry_callback() cr
1f8a0 65 61 74 65 73 20 61 6e 20 6f 72 64 69 6e 61 72  eates an ordinar
1f8b0 79 20 53 51 4c 69 74 65 0a 2a 2a 20 73 63 61 6c  y SQLite.** scal
1f8c0 61 72 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  ar function that
1f8d0 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
1f8e0 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  by this routine.
1f8f0 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 74 68 69 73 20  .**.** All this 
1f900 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 69 73  function does is
1f910 20 63 6f 6e 73 74 72 75 63 74 20 61 6e 20 52 74   construct an Rt
1f920 72 65 65 4d 61 74 63 68 41 72 67 20 6f 62 6a 65  reeMatchArg obje
1f930 63 74 20 74 68 61 74 0a 2a 2a 20 63 6f 6e 74 61  ct that.** conta
1f940 69 6e 73 20 74 68 65 20 67 65 6f 6d 65 74 72 79  ins the geometry
1f950 2d 63 68 65 63 6b 69 6e 67 20 63 61 6c 6c 62 61  -checking callba
1f960 63 6b 20 72 6f 75 74 69 6e 65 73 20 61 6e 64 20  ck routines and 
1f970 61 20 6c 69 73 74 20 6f 66 0a 2a 2a 20 70 61 72  a list of.** par
1f980 61 6d 65 74 65 72 73 20 74 6f 20 74 68 69 73 20  ameters to this 
1f990 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 20 72  function, then r
1f9a0 65 74 75 72 6e 20 74 68 61 74 20 52 74 72 65 65  eturn that Rtree
1f9b0 4d 61 74 63 68 41 72 67 20 6f 62 6a 65 63 74 0a  MatchArg object.
1f9c0 2a 2a 20 61 73 20 61 20 42 4c 4f 42 2e 0a 2a 2a  ** as a BLOB..**
1f9d0 0a 2a 2a 20 54 68 65 20 52 2d 54 72 65 65 20 4d  .** The R-Tree M
1f9e0 41 54 43 48 20 6f 70 65 72 61 74 6f 72 20 77 69  ATCH operator wi
1f9f0 6c 6c 20 72 65 61 64 20 74 68 65 20 72 65 74 75  ll read the retu
1fa00 72 6e 65 64 20 42 4c 4f 42 2c 20 64 65 73 65 72  rned BLOB, deser
1fa10 69 61 6c 69 7a 65 0a 2a 2a 20 74 68 65 20 52 74  ialize.** the Rt
1fa20 72 65 65 4d 61 74 63 68 41 72 67 20 6f 62 6a 65  reeMatchArg obje
1fa30 63 74 2c 20 61 6e 64 20 75 73 65 20 74 68 65 20  ct, and use the 
1fa40 52 74 72 65 65 4d 61 74 63 68 41 72 67 20 6f 62  RtreeMatchArg ob
1fa50 6a 65 63 74 20 74 6f 20 66 69 67 75 72 65 0a 2a  ject to figure.*
1fa60 2a 20 6f 75 74 20 77 68 69 63 68 20 65 6c 65 6d  * out which elem
1fa70 65 6e 74 73 20 6f 66 20 74 68 65 20 52 2d 54 72  ents of the R-Tr
1fa80 65 65 20 73 68 6f 75 6c 64 20 62 65 20 72 65 74  ee should be ret
1fa90 75 72 6e 65 64 20 62 79 20 74 68 65 20 71 75 65  urned by the que
1faa0 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ry..*/.static vo
1fab0 69 64 20 67 65 6f 6d 43 61 6c 6c 62 61 63 6b 28  id geomCallback(
1fac0 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
1fad0 2a 63 74 78 2c 20 69 6e 74 20 6e 41 72 67 2c 20  *ctx, int nArg, 
1fae0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
1faf0 61 41 72 67 29 7b 0a 20 20 52 74 72 65 65 47 65  aArg){.  RtreeGe
1fb00 6f 6d 43 61 6c 6c 62 61 63 6b 20 2a 70 47 65 6f  omCallback *pGeo
1fb10 6d 43 74 78 20 3d 20 28 52 74 72 65 65 47 65 6f  mCtx = (RtreeGeo
1fb20 6d 43 61 6c 6c 62 61 63 6b 20 2a 29 73 71 6c 69  mCallback *)sqli
1fb30 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63 74  te3_user_data(ct
1fb40 78 29 3b 0a 20 20 52 74 72 65 65 4d 61 74 63 68  x);.  RtreeMatch
1fb50 41 72 67 20 2a 70 42 6c 6f 62 3b 0a 20 20 69 6e  Arg *pBlob;.  in
1fb60 74 20 6e 42 6c 6f 62 3b 0a 20 20 69 6e 74 20 6d  t nBlob;.  int m
1fb70 65 6d 45 72 72 20 3d 20 30 3b 0a 0a 20 20 6e 42  emErr = 0;..  nB
1fb80 6c 6f 62 20 3d 20 73 69 7a 65 6f 66 28 52 74 72  lob = sizeof(Rtr
1fb90 65 65 4d 61 74 63 68 41 72 67 29 20 2b 20 28 6e  eeMatchArg) + (n
1fba0 41 72 67 2d 31 29 2a 73 69 7a 65 6f 66 28 52 74  Arg-1)*sizeof(Rt
1fbb0 72 65 65 44 56 61 6c 75 65 29 0a 20 20 20 20 20  reeDValue).     
1fbc0 20 20 20 20 20 20 2b 20 6e 41 72 67 2a 73 69 7a        + nArg*siz
1fbd0 65 6f 66 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  eof(sqlite3_valu
1fbe0 65 2a 29 3b 0a 20 20 70 42 6c 6f 62 20 3d 20 28  e*);.  pBlob = (
1fbf0 52 74 72 65 65 4d 61 74 63 68 41 72 67 20 2a 29  RtreeMatchArg *)
1fc00 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e  sqlite3_malloc(n
1fc10 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20 21 70 42  Blob);.  if( !pB
1fc20 6c 6f 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  lob ){.    sqlit
1fc30 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f  e3_result_error_
1fc40 6e 6f 6d 65 6d 28 63 74 78 29 3b 0a 20 20 7d 65  nomem(ctx);.  }e
1fc50 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  lse{.    int i;.
1fc60 20 20 20 20 70 42 6c 6f 62 2d 3e 69 53 69 7a 65      pBlob->iSize
1fc70 20 3d 20 6e 42 6c 6f 62 3b 0a 20 20 20 20 70 42   = nBlob;.    pB
1fc80 6c 6f 62 2d 3e 63 62 20 3d 20 70 47 65 6f 6d 43  lob->cb = pGeomC
1fc90 74 78 5b 30 5d 3b 0a 20 20 20 20 70 42 6c 6f 62  tx[0];.    pBlob
1fca0 2d 3e 61 70 53 71 6c 50 61 72 61 6d 20 3d 20 28  ->apSqlParam = (
1fcb0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29  sqlite3_value**)
1fcc0 26 70 42 6c 6f 62 2d 3e 61 50 61 72 61 6d 5b 6e  &pBlob->aParam[n
1fcd0 41 72 67 5d 3b 0a 20 20 20 20 70 42 6c 6f 62 2d  Arg];.    pBlob-
1fce0 3e 6e 50 61 72 61 6d 20 3d 20 6e 41 72 67 3b 0a  >nParam = nArg;.
1fcf0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
1fd00 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
1fd10 20 70 42 6c 6f 62 2d 3e 61 70 53 71 6c 50 61 72   pBlob->apSqlPar
1fd20 61 6d 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 5f  am[i] = sqlite3_
1fd30 76 61 6c 75 65 5f 64 75 70 28 61 41 72 67 5b 69  value_dup(aArg[i
1fd40 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  ]);.      if( pB
1fd50 6c 6f 62 2d 3e 61 70 53 71 6c 50 61 72 61 6d 5b  lob->apSqlParam[
1fd60 69 5d 3d 3d 30 20 29 20 6d 65 6d 45 72 72 20 3d  i]==0 ) memErr =
1fd70 20 31 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   1;.#ifdef SQLIT
1fd80 45 5f 52 54 52 45 45 5f 49 4e 54 5f 4f 4e 4c 59  E_RTREE_INT_ONLY
1fd90 0a 20 20 20 20 20 20 70 42 6c 6f 62 2d 3e 61 50  .      pBlob->aP
1fda0 61 72 61 6d 5b 69 5d 20 3d 20 73 71 6c 69 74 65  aram[i] = sqlite
1fdb0 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 41  3_value_int64(aA
1fdc0 72 67 5b 69 5d 29 3b 0a 23 65 6c 73 65 0a 20 20  rg[i]);.#else.  
1fdd0 20 20 20 20 70 42 6c 6f 62 2d 3e 61 50 61 72 61      pBlob->aPara
1fde0 6d 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 5f 76  m[i] = sqlite3_v
1fdf0 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 41 72 67  alue_double(aArg
1fe00 5b 69 5d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  [i]);.#endif.   
1fe10 20 7d 0a 20 20 20 20 69 66 28 20 6d 65 6d 45 72   }.    if( memEr
1fe20 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  r ){.      sqlit
1fe30 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f  e3_result_error_
1fe40 6e 6f 6d 65 6d 28 63 74 78 29 3b 0a 20 20 20 20  nomem(ctx);.    
1fe50 20 20 72 74 72 65 65 4d 61 74 63 68 41 72 67 46    rtreeMatchArgF
1fe60 72 65 65 28 70 42 6c 6f 62 29 3b 0a 20 20 20 20  ree(pBlob);.    
1fe70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
1fe80 69 74 65 33 5f 72 65 73 75 6c 74 5f 70 6f 69 6e  ite3_result_poin
1fe90 74 65 72 28 63 74 78 2c 20 70 42 6c 6f 62 2c 20  ter(ctx, pBlob, 
1fea0 22 52 74 72 65 65 4d 61 74 63 68 41 72 67 22 2c  "RtreeMatchArg",
1feb0 20 72 74 72 65 65 4d 61 74 63 68 41 72 67 46 72   rtreeMatchArgFr
1fec0 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ee);.    }.  }.}
1fed0 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
1fee0 20 61 20 6e 65 77 20 67 65 6f 6d 65 74 72 79 20   a new geometry 
1fef0 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 75 73 65  function for use
1ff00 20 77 69 74 68 20 74 68 65 20 72 2d 74 72 65 65   with the r-tree
1ff10 20 4d 41 54 43 48 20 6f 70 65 72 61 74 6f 72 2e   MATCH operator.
1ff20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
1ff30 72 74 72 65 65 5f 67 65 6f 6d 65 74 72 79 5f 63  rtree_geometry_c
1ff40 61 6c 6c 62 61 63 6b 28 0a 20 20 73 71 6c 69 74  allback(.  sqlit
1ff50 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
1ff60 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
1ff70 73 74 65 72 20 53 51 4c 20 66 75 6e 63 74 69 6f  ster SQL functio
1ff80 6e 20 6f 6e 20 74 68 69 73 20 63 6f 6e 6e 65 63  n on this connec
1ff90 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  tion */.  const 
1ffa0 63 68 61 72 20 2a 7a 47 65 6f 6d 2c 20 20 20 20  char *zGeom,    
1ffb0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
1ffc0 6f 66 20 74 68 65 20 6e 65 77 20 53 51 4c 20 66  of the new SQL f
1ffd0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  unction */.  int
1ffe0 20 28 2a 78 47 65 6f 6d 29 28 73 71 6c 69 74 65   (*xGeom)(sqlite
1fff0 33 5f 72 74 72 65 65 5f 67 65 6f 6d 65 74 72 79  3_rtree_geometry
20000 2a 2c 69 6e 74 2c 52 74 72 65 65 44 56 61 6c 75  *,int,RtreeDValu
20010 65 2a 2c 69 6e 74 2a 29 2c 20 2f 2a 20 43 61 6c  e*,int*), /* Cal
20020 6c 62 61 63 6b 20 2a 2f 0a 20 20 76 6f 69 64 20  lback */.  void 
20030 2a 70 43 6f 6e 74 65 78 74 20 20 20 20 20 20 20  *pContext       
20040 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
20050 61 20 64 61 74 61 20 61 73 73 6f 63 69 61 74 65  a data associate
20060 64 20 77 69 74 68 20 74 68 65 20 63 61 6c 6c 62  d with the callb
20070 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 52 74 72 65  ack */.){.  Rtre
20080 65 47 65 6f 6d 43 61 6c 6c 62 61 63 6b 20 2a 70  eGeomCallback *p
20090 47 65 6f 6d 43 74 78 3b 20 20 20 20 20 20 2f 2a  GeomCtx;      /*
200a0 20 43 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74 20   Context object 
200b0 66 6f 72 20 6e 65 77 20 75 73 65 72 2d 66 75 6e  for new user-fun
200c0 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 41  ction */..  /* A
200d0 6c 6c 6f 63 61 74 65 20 61 6e 64 20 70 6f 70 75  llocate and popu
200e0 6c 61 74 65 20 74 68 65 20 63 6f 6e 74 65 78 74  late the context
200f0 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 70 47   object. */.  pG
20100 65 6f 6d 43 74 78 20 3d 20 28 52 74 72 65 65 47  eomCtx = (RtreeG
20110 65 6f 6d 43 61 6c 6c 62 61 63 6b 20 2a 29 73 71  eomCallback *)sq
20120 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a  lite3_malloc(siz
20130 65 6f 66 28 52 74 72 65 65 47 65 6f 6d 43 61 6c  eof(RtreeGeomCal
20140 6c 62 61 63 6b 29 29 3b 0a 20 20 69 66 28 20 21  lback));.  if( !
20150 70 47 65 6f 6d 43 74 78 20 29 20 72 65 74 75 72  pGeomCtx ) retur
20160 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
20170 20 20 70 47 65 6f 6d 43 74 78 2d 3e 78 47 65 6f    pGeomCtx->xGeo
20180 6d 20 3d 20 78 47 65 6f 6d 3b 0a 20 20 70 47 65  m = xGeom;.  pGe
20190 6f 6d 43 74 78 2d 3e 78 51 75 65 72 79 46 75 6e  omCtx->xQueryFun
201a0 63 20 3d 20 30 3b 0a 20 20 70 47 65 6f 6d 43 74  c = 0;.  pGeomCt
201b0 78 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 3d  x->xDestructor =
201c0 20 30 3b 0a 20 20 70 47 65 6f 6d 43 74 78 2d 3e   0;.  pGeomCtx->
201d0 70 43 6f 6e 74 65 78 74 20 3d 20 70 43 6f 6e 74  pContext = pCont
201e0 65 78 74 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  ext;.  return sq
201f0 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
20200 63 74 69 6f 6e 5f 76 32 28 64 62 2c 20 7a 47 65  ction_v2(db, zGe
20210 6f 6d 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 41  om, -1, SQLITE_A
20220 4e 59 2c 20 0a 20 20 20 20 20 20 28 76 6f 69 64  NY, .      (void
20230 20 2a 29 70 47 65 6f 6d 43 74 78 2c 20 67 65 6f   *)pGeomCtx, geo
20240 6d 43 61 6c 6c 62 61 63 6b 2c 20 30 2c 20 30 2c  mCallback, 0, 0,
20250 20 72 74 72 65 65 46 72 65 65 43 61 6c 6c 62 61   rtreeFreeCallba
20260 63 6b 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ck.  );.}../*.**
20270 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20   Register a new 
20280 32 6e 64 2d 67 65 6e 65 72 61 74 69 6f 6e 20 67  2nd-generation g
20290 65 6f 6d 65 74 72 79 20 66 75 6e 63 74 69 6f 6e  eometry function
202a0 20 66 6f 72 20 75 73 65 20 77 69 74 68 20 74 68   for use with th
202b0 65 0a 2a 2a 20 72 2d 74 72 65 65 20 4d 41 54 43  e.** r-tree MATC
202c0 48 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 69  H operator..*/.i
202d0 6e 74 20 73 71 6c 69 74 65 33 5f 72 74 72 65 65  nt sqlite3_rtree
202e0 5f 71 75 65 72 79 5f 63 61 6c 6c 62 61 63 6b 28  _query_callback(
202f0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
20300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20310 2f 2a 20 52 65 67 69 73 74 65 72 20 53 51 4c 20  /* Register SQL 
20320 66 75 6e 63 74 69 6f 6e 20 6f 6e 20 74 68 69 73  function on this
20330 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
20340 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 51 75   const char *zQu
20350 65 72 79 46 75 6e 63 2c 20 20 20 20 20 20 2f 2a  eryFunc,      /*
20360 20 4e 61 6d 65 20 6f 66 20 6e 65 77 20 53 51 4c   Name of new SQL
20370 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69   function */.  i
20380 6e 74 20 28 2a 78 51 75 65 72 79 46 75 6e 63 29  nt (*xQueryFunc)
20390 28 73 71 6c 69 74 65 33 5f 72 74 72 65 65 5f 71  (sqlite3_rtree_q
203a0 75 65 72 79 5f 69 6e 66 6f 2a 29 2c 20 2f 2a 20  uery_info*), /* 
203b0 43 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 76 6f  Callback */.  vo
203c0 69 64 20 2a 70 43 6f 6e 74 65 78 74 2c 20 20 20  id *pContext,   
203d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
203e0 74 72 61 20 64 61 74 61 20 70 61 73 73 65 64 20  tra data passed 
203f0 69 6e 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63  into the callbac
20400 6b 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44  k */.  void (*xD
20410 65 73 74 72 75 63 74 6f 72 29 28 76 6f 69 64 2a  estructor)(void*
20420 29 20 20 20 2f 2a 20 44 65 73 74 72 75 63 74 6f  )   /* Destructo
20430 72 20 66 6f 72 20 74 68 65 20 65 78 74 72 61 20  r for the extra 
20440 64 61 74 61 20 2a 2f 0a 29 7b 0a 20 20 52 74 72  data */.){.  Rtr
20450 65 65 47 65 6f 6d 43 61 6c 6c 62 61 63 6b 20 2a  eeGeomCallback *
20460 70 47 65 6f 6d 43 74 78 3b 20 20 20 20 20 20 2f  pGeomCtx;      /
20470 2a 20 43 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74  * Context object
20480 20 66 6f 72 20 6e 65 77 20 75 73 65 72 2d 66 75   for new user-fu
20490 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20  nction */..  /* 
204a0 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 70 6f 70  Allocate and pop
204b0 75 6c 61 74 65 20 74 68 65 20 63 6f 6e 74 65 78  ulate the contex
204c0 74 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 70  t object. */.  p
204d0 47 65 6f 6d 43 74 78 20 3d 20 28 52 74 72 65 65  GeomCtx = (Rtree
204e0 47 65 6f 6d 43 61 6c 6c 62 61 63 6b 20 2a 29 73  GeomCallback *)s
204f0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69  qlite3_malloc(si
20500 7a 65 6f 66 28 52 74 72 65 65 47 65 6f 6d 43 61  zeof(RtreeGeomCa
20510 6c 6c 62 61 63 6b 29 29 3b 0a 20 20 69 66 28 20  llback));.  if( 
20520 21 70 47 65 6f 6d 43 74 78 20 29 20 72 65 74 75  !pGeomCtx ) retu
20530 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
20540 0a 20 20 70 47 65 6f 6d 43 74 78 2d 3e 78 47 65  .  pGeomCtx->xGe
20550 6f 6d 20 3d 20 30 3b 0a 20 20 70 47 65 6f 6d 43  om = 0;.  pGeomC
20560 74 78 2d 3e 78 51 75 65 72 79 46 75 6e 63 20 3d  tx->xQueryFunc =
20570 20 78 51 75 65 72 79 46 75 6e 63 3b 0a 20 20 70   xQueryFunc;.  p
20580 47 65 6f 6d 43 74 78 2d 3e 78 44 65 73 74 72 75  GeomCtx->xDestru
20590 63 74 6f 72 20 3d 20 78 44 65 73 74 72 75 63 74  ctor = xDestruct
205a0 6f 72 3b 0a 20 20 70 47 65 6f 6d 43 74 78 2d 3e  or;.  pGeomCtx->
205b0 70 43 6f 6e 74 65 78 74 20 3d 20 70 43 6f 6e 74  pContext = pCont
205c0 65 78 74 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  ext;.  return sq
205d0 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
205e0 63 74 69 6f 6e 5f 76 32 28 64 62 2c 20 7a 51 75  ction_v2(db, zQu
205f0 65 72 79 46 75 6e 63 2c 20 2d 31 2c 20 53 51 4c  eryFunc, -1, SQL
20600 49 54 45 5f 41 4e 59 2c 20 0a 20 20 20 20 20 20  ITE_ANY, .      
20610 28 76 6f 69 64 20 2a 29 70 47 65 6f 6d 43 74 78  (void *)pGeomCtx
20620 2c 20 67 65 6f 6d 43 61 6c 6c 62 61 63 6b 2c 20  , geomCallback, 
20630 30 2c 20 30 2c 20 72 74 72 65 65 46 72 65 65 43  0, 0, rtreeFreeC
20640 61 6c 6c 62 61 63 6b 0a 20 20 29 3b 0a 7d 0a 0a  allback.  );.}..
20650 23 69 66 20 21 53 51 4c 49 54 45 5f 43 4f 52 45  #if !SQLITE_CORE
20660 0a 23 69 66 64 65 66 20 5f 57 49 4e 33 32 0a 5f  .#ifdef _WIN32._
20670 5f 64 65 63 6c 73 70 65 63 28 64 6c 6c 65 78 70  _declspec(dllexp
20680 6f 72 74 29 0a 23 65 6e 64 69 66 0a 69 6e 74 20  ort).#endif.int 
20690 73 71 6c 69 74 65 33 5f 72 74 72 65 65 5f 69 6e  sqlite3_rtree_in
206a0 69 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  it(.  sqlite3 *d
206b0 62 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72  b,.  char **pzEr
206c0 72 4d 73 67 2c 0a 20 20 63 6f 6e 73 74 20 73 71  rMsg,.  const sq
206d0 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e  lite3_api_routin
206e0 65 73 20 2a 70 41 70 69 0a 29 7b 0a 20 20 53 51  es *pApi.){.  SQ
206f0 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49  LITE_EXTENSION_I
20700 4e 49 54 32 28 70 41 70 69 29 0a 20 20 72 65 74  NIT2(pApi).  ret
20710 75 72 6e 20 73 71 6c 69 74 65 33 52 74 72 65 65  urn sqlite3Rtree
20720 49 6e 69 74 28 64 62 29 3b 0a 7d 0a 23 65 6e 64  Init(db);.}.#end
20730 69 66 0a 0a 23 65 6e 64 69 66 0a                 if..#endif.