/ Hex Artifact Content
Login

Artifact aba603c949766c4193f1068b91c787f57274e0d9:


0000: 2f 2a 0a 2a 2a 20 32 30 31 30 20 41 75 67 75 73  /*.** 2010 Augus
0010: 74 20 32 38 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  t 28.**.** The a
0020: 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20  uthor disclaims 
0030: 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 69  copyright to thi
0040: 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20  s source code.  
0050: 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61  In place of.** a
0060: 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68   legal notice, h
0070: 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e  ere is a blessin
0080: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20  g:.**.**    May 
0090: 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20  you do good and 
00a0: 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20  not evil..**    
00b0: 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72  May you find for
00c0: 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75  giveness for you
00d0: 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76  rself and forgiv
00e0: 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20  e others..**    
00f0: 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66 72  May you share fr
0100: 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69  eely, never taki
0110: 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75  ng more than you
0120: 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   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 0a 2a 2a 20 43 6f 64 65 20 66 6f 72 20  ***.** Code for 
0180: 74 65 73 74 69 6e 67 20 61 6c 6c 20 73 6f 72 74  testing all sort
0190: 73 20 6f 66 20 53 51 4c 69 74 65 20 69 6e 74 65  s of SQLite inte
01a0: 72 66 61 63 65 73 2e 20 54 68 69 73 20 63 6f 64  rfaces. This cod
01b0: 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 69 6e 63 6c  e.** is not incl
01c0: 75 64 65 64 20 69 6e 20 74 68 65 20 53 51 4c 69  uded in the SQLi
01d0: 74 65 20 6c 69 62 72 61 72 79 2e 20 0a 2a 2f 0a  te library. .*/.
01e0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 71 6c 69 74  .#include <sqlit
01f0: 65 33 2e 68 3e 0a 0a 2f 2a 20 53 6f 6c 65 6c 79  e3.h>../* Solely
0200: 20 66 6f 72 20 74 68 65 20 55 4e 55 53 45 44 5f   for the UNUSED_
0210: 50 41 52 41 4d 45 54 45 52 28 29 20 6d 61 63 72  PARAMETER() macr
0220: 6f 2e 20 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22  o. */.#include "
0230: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 23 69  sqliteInt.h"..#i
0240: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
0250: 4c 45 5f 52 54 52 45 45 0a 2f 2a 20 0a 2a 2a 20  LE_RTREE./* .** 
0260: 54 79 70 65 20 75 73 65 64 20 74 6f 20 63 61 63  Type used to cac
0270: 68 65 20 70 61 72 61 6d 65 74 65 72 20 69 6e 66  he parameter inf
0280: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  ormation for the
0290: 20 22 63 69 72 63 6c 65 22 20 72 2d 74 72 65 65   "circle" r-tree
02a0: 20 67 65 6f 6d 65 74 72 79 0a 2a 2a 20 63 61 6c   geometry.** cal
02b0: 6c 62 61 63 6b 2e 0a 2a 2f 0a 74 79 70 65 64 65  lback..*/.typede
02c0: 66 20 73 74 72 75 63 74 20 43 69 72 63 6c 65 20  f struct Circle 
02d0: 43 69 72 63 6c 65 3b 0a 73 74 72 75 63 74 20 43  Circle;.struct C
02e0: 69 72 63 6c 65 20 7b 0a 20 20 73 74 72 75 63 74  ircle {.  struct
02f0: 20 42 6f 78 20 7b 0a 20 20 20 20 64 6f 75 62 6c   Box {.    doubl
0300: 65 20 78 6d 69 6e 3b 0a 20 20 20 20 64 6f 75 62  e xmin;.    doub
0310: 6c 65 20 78 6d 61 78 3b 0a 20 20 20 20 64 6f 75  le xmax;.    dou
0320: 62 6c 65 20 79 6d 69 6e 3b 0a 20 20 20 20 64 6f  ble ymin;.    do
0330: 75 62 6c 65 20 79 6d 61 78 3b 0a 20 20 7d 20 61  uble ymax;.  } a
0340: 42 6f 78 5b 32 5d 3b 0a 20 20 64 6f 75 62 6c 65  Box[2];.  double
0350: 20 63 65 6e 74 65 72 78 3b 0a 20 20 64 6f 75 62   centerx;.  doub
0360: 6c 65 20 63 65 6e 74 65 72 79 3b 0a 20 20 64 6f  le centery;.  do
0370: 75 62 6c 65 20 72 61 64 69 75 73 3b 0a 7d 3b 0a  uble radius;.};.
0380: 0a 2f 2a 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f  ./*.** Destructo
0390: 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 43  r function for C
03a0: 69 72 63 6c 65 20 6f 62 6a 65 63 74 73 20 61 6c  ircle objects al
03b0: 6c 6f 63 61 74 65 64 20 62 79 20 63 69 72 63 6c  located by circl
03c0: 65 5f 67 65 6f 6d 28 29 2e 0a 2a 2f 0a 73 74 61  e_geom()..*/.sta
03d0: 74 69 63 20 76 6f 69 64 20 63 69 72 63 6c 65 5f  tic void circle_
03e0: 64 65 6c 28 76 6f 69 64 20 2a 70 29 7b 0a 20 20  del(void *p){.  
03f0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
0400: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
0410: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 22 63 69 72  entation of "cir
0420: 63 6c 65 22 20 72 2d 74 72 65 65 20 67 65 6f 6d  cle" r-tree geom
0430: 65 74 72 79 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a  etry callback..*
0440: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 69 72  /.static int cir
0450: 63 6c 65 5f 67 65 6f 6d 28 0a 20 20 73 71 6c 69  cle_geom(.  sqli
0460: 74 65 33 5f 72 74 72 65 65 5f 67 65 6f 6d 65 74  te3_rtree_geomet
0470: 72 79 20 2a 70 2c 0a 20 20 69 6e 74 20 6e 43 6f  ry *p,.  int nCo
0480: 6f 72 64 2c 20 0a 23 69 66 64 65 66 20 53 51 4c  ord, .#ifdef SQL
0490: 49 54 45 5f 52 54 52 45 45 5f 49 4e 54 5f 4f 4e  ITE_RTREE_INT_ON
04a0: 4c 59 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  LY.  sqlite3_int
04b0: 36 34 20 2a 61 43 6f 6f 72 64 2c 0a 23 65 6c 73  64 *aCoord,.#els
04c0: 65 0a 20 20 64 6f 75 62 6c 65 20 2a 61 43 6f 6f  e.  double *aCoo
04d0: 72 64 2c 20 0a 23 65 6e 64 69 66 0a 20 20 69 6e  rd, .#endif.  in
04e0: 74 20 2a 70 52 65 73 0a 29 7b 0a 20 20 69 6e 74  t *pRes.){.  int
04f0: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
0500: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0510: 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c  Iterator variabl
0520: 65 20 2a 2f 0a 20 20 43 69 72 63 6c 65 20 2a 70  e */.  Circle *p
0530: 43 69 72 63 6c 65 3b 20 20 20 20 20 20 20 20 20  Circle;         
0540: 20 20 20 20 20 20 20 2f 2a 20 53 74 72 75 63 74         /* Struct
0550: 75 72 65 20 64 65 66 69 6e 69 6e 67 20 63 69 72  ure defining cir
0560: 63 75 6c 61 72 20 72 65 67 69 6f 6e 20 2a 2f 0a  cular region */.
0570: 20 20 64 6f 75 62 6c 65 20 78 6d 69 6e 2c 20 78    double xmin, x
0580: 6d 61 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  max;            
0590: 20 20 2f 2a 20 58 20 64 69 6d 65 6e 73 69 6f 6e    /* X dimension
05a0: 73 20 6f 66 20 62 6f 78 20 62 65 69 6e 67 20 74  s of box being t
05b0: 65 73 74 65 64 20 2a 2f 0a 20 20 64 6f 75 62 6c  ested */.  doubl
05c0: 65 20 79 6d 69 6e 2c 20 79 6d 61 78 3b 20 20 20  e ymin, ymax;   
05d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 58 20             /* X 
05e0: 64 69 6d 65 6e 73 69 6f 6e 73 20 6f 66 20 62 6f  dimensions of bo
05f0: 78 20 62 65 69 6e 67 20 74 65 73 74 65 64 20 2a  x being tested *
0600: 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 70 55 73 65  /..  if( p->pUse
0610: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49  r==0 ){.    /* I
0620: 66 20 70 55 73 65 72 20 69 73 20 73 74 69 6c 6c  f pUser is still
0630: 20 30 2c 20 74 68 65 6e 20 74 68 65 20 70 61 72   0, then the par
0640: 61 6d 65 74 65 72 20 76 61 6c 75 65 73 20 68 61  ameter values ha
0650: 76 65 20 6e 6f 74 20 62 65 65 6e 20 74 65 73 74  ve not been test
0660: 65 64 0a 20 20 20 20 2a 2a 20 66 6f 72 20 63 6f  ed.    ** for co
0670: 72 72 65 63 74 6e 65 73 73 20 6f 72 20 73 74 6f  rrectness or sto
0680: 72 65 64 20 69 6e 74 6f 20 61 20 43 69 72 63 6c  red into a Circl
0690: 65 20 73 74 72 75 63 74 75 72 65 20 79 65 74 2e  e structure yet.
06a0: 20 44 6f 20 74 68 69 73 20 6e 6f 77 2e 20 2a 2f   Do this now. */
06b0: 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 67 65  ..    /* This ge
06c0: 6f 6d 65 74 72 79 20 63 61 6c 6c 62 61 63 6b 20  ometry callback 
06d0: 69 73 20 66 6f 72 20 75 73 65 20 77 69 74 68 20  is for use with 
06e0: 61 20 32 2d 64 69 6d 65 6e 73 69 6f 6e 61 6c 20  a 2-dimensional 
06f0: 72 2d 74 72 65 65 20 74 61 62 6c 65 2e 0a 20 20  r-tree table..  
0700: 20 20 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65    ** Return an e
0710: 72 72 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c  rror if the tabl
0720: 65 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  e does not have 
0730: 65 78 61 63 74 6c 79 20 32 20 64 69 6d 65 6e 73  exactly 2 dimens
0740: 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ions. */.    if(
0750: 20 6e 43 6f 6f 72 64 21 3d 34 20 29 20 72 65 74   nCoord!=4 ) ret
0760: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
0770: 3b 0a 0a 20 20 20 20 2f 2a 20 54 65 73 74 20 74  ;..    /* Test t
0780: 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20  hat the correct 
0790: 6e 75 6d 62 65 72 20 6f 66 20 70 61 72 61 6d 65  number of parame
07a0: 74 65 72 73 20 28 33 29 20 68 61 76 65 20 62 65  ters (3) have be
07b0: 65 6e 20 73 75 70 70 6c 69 65 64 2c 0a 20 20 20  en supplied,.   
07c0: 20 2a 2a 20 61 6e 64 20 74 68 61 74 20 74 68 65   ** and that the
07d0: 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20   parameters are 
07e0: 69 6e 20 72 61 6e 67 65 20 28 74 68 61 74 20 74  in range (that t
07f0: 68 65 20 72 61 64 69 75 73 20 6f 66 20 74 68 65  he radius of the
0800: 20 63 69 72 63 6c 65 20 0a 20 20 20 20 2a 2a 20   circle .    ** 
0810: 72 61 64 69 75 73 20 69 73 20 67 72 65 61 74 65  radius is greate
0820: 72 20 74 68 61 6e 20 7a 65 72 6f 29 2e 20 2a 2f  r than zero). */
0830: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 50 61 72  .    if( p->nPar
0840: 61 6d 21 3d 33 20 7c 7c 20 70 2d 3e 61 50 61 72  am!=3 || p->aPar
0850: 61 6d 5b 32 5d 3c 30 2e 30 20 29 20 72 65 74 75  am[2]<0.0 ) retu
0860: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
0870: 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  ..    /* Allocat
0880: 65 20 61 20 73 74 72 75 63 74 75 72 65 20 74 6f  e a structure to
0890: 20 63 61 63 68 65 20 70 61 72 61 6d 65 74 65 72   cache parameter
08a0: 20 64 61 74 61 20 69 6e 2e 20 52 65 74 75 72 6e   data in. Return
08b0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20   SQLITE_NOMEM.  
08c0: 20 20 2a 2a 20 69 66 20 74 68 65 20 61 6c 6c 6f    ** if the allo
08d0: 63 61 74 69 6f 6e 20 66 61 69 6c 73 2e 20 2a 2f  cation fails. */
08e0: 0a 20 20 20 20 70 43 69 72 63 6c 65 20 3d 20 28  .    pCircle = (
08f0: 43 69 72 63 6c 65 20 2a 29 28 70 2d 3e 70 55 73  Circle *)(p->pUs
0900: 65 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  er = sqlite3_mal
0910: 6c 6f 63 28 73 69 7a 65 6f 66 28 43 69 72 63 6c  loc(sizeof(Circl
0920: 65 29 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70  e)));.    if( !p
0930: 43 69 72 63 6c 65 20 29 20 72 65 74 75 72 6e 20  Circle ) return 
0940: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
0950: 20 20 70 2d 3e 78 44 65 6c 55 73 65 72 20 3d 20    p->xDelUser = 
0960: 63 69 72 63 6c 65 5f 64 65 6c 3b 0a 0a 20 20 20  circle_del;..   
0970: 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 63   /* Record the c
0980: 65 6e 74 65 72 20 61 6e 64 20 72 61 64 69 75 73  enter and radius
0990: 20 6f 66 20 74 68 65 20 63 69 72 63 75 6c 61 72   of the circular
09a0: 20 72 65 67 69 6f 6e 2e 20 4f 6e 65 20 77 61 79   region. One way
09b0: 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 65 73   that.    ** tes
09c0: 74 65 64 20 62 6f 75 6e 64 69 6e 67 20 62 6f 78  ted bounding box
09d0: 65 73 20 74 68 61 74 20 69 6e 74 65 72 73 65 63  es that intersec
09e0: 74 20 74 68 65 20 63 69 72 63 75 6c 61 72 20 72  t the circular r
09f0: 65 67 69 6f 6e 20 61 72 65 20 64 65 74 65 63 74  egion are detect
0a00: 65 64 0a 20 20 20 20 2a 2a 20 69 73 20 62 79 20  ed.    ** is by 
0a10: 74 65 73 74 69 6e 67 20 69 66 20 65 61 63 68 20  testing if each 
0a20: 63 6f 72 6e 65 72 20 6f 66 20 74 68 65 20 62 6f  corner of the bo
0a30: 75 6e 64 69 6e 67 20 62 6f 78 20 6c 69 65 73 20  unding box lies 
0a40: 77 69 74 68 69 6e 20 72 61 64 69 75 73 0a 20 20  within radius.  
0a50: 20 20 2a 2a 20 75 6e 69 74 73 20 6f 66 20 74 68    ** units of th
0a60: 65 20 63 65 6e 74 65 72 20 6f 66 20 74 68 65 20  e center of the 
0a70: 63 69 72 63 6c 65 2e 20 2a 2f 0a 20 20 20 20 70  circle. */.    p
0a80: 43 69 72 63 6c 65 2d 3e 63 65 6e 74 65 72 78 20  Circle->centerx 
0a90: 3d 20 70 2d 3e 61 50 61 72 61 6d 5b 30 5d 3b 0a  = p->aParam[0];.
0aa0: 20 20 20 20 70 43 69 72 63 6c 65 2d 3e 63 65 6e      pCircle->cen
0ab0: 74 65 72 79 20 3d 20 70 2d 3e 61 50 61 72 61 6d  tery = p->aParam
0ac0: 5b 31 5d 3b 0a 20 20 20 20 70 43 69 72 63 6c 65  [1];.    pCircle
0ad0: 2d 3e 72 61 64 69 75 73 20 3d 20 70 2d 3e 61 50  ->radius = p->aP
0ae0: 61 72 61 6d 5b 32 5d 3b 0a 0a 20 20 20 20 2f 2a  aram[2];..    /*
0af0: 20 44 65 66 69 6e 65 20 74 77 6f 20 62 6f 75 6e   Define two boun
0b00: 64 69 6e 67 20 62 6f 78 20 72 65 67 69 6f 6e 73  ding box regions
0b10: 2e 20 54 68 65 20 66 69 72 73 74 2c 20 61 42 6f  . The first, aBo
0b20: 78 5b 30 5d 2c 20 65 78 74 65 6e 64 73 20 74 6f  x[0], extends to
0b30: 0a 20 20 20 20 2a 2a 20 69 6e 66 69 6e 69 74 79  .    ** infinity
0b40: 20 69 6e 20 74 68 65 20 58 20 64 69 6d 65 6e 73   in the X dimens
0b50: 69 6f 6e 2e 20 49 74 20 63 6f 76 65 72 73 20 74  ion. It covers t
0b60: 68 65 20 73 61 6d 65 20 72 61 6e 67 65 20 6f 66  he same range of
0b70: 20 74 68 65 20 59 20 64 69 6d 65 6e 73 69 6f 6e   the Y dimension
0b80: 0a 20 20 20 20 2a 2a 20 61 73 20 74 68 65 20 63  .    ** as the c
0b90: 69 72 63 75 6c 61 72 20 72 65 67 69 6f 6e 2e 20  ircular region. 
0ba0: 54 68 65 20 73 65 63 6f 6e 64 2c 20 61 42 6f 78  The second, aBox
0bb0: 5b 31 5d 2c 20 65 78 74 65 6e 64 73 20 74 6f 20  [1], extends to 
0bc0: 69 6e 66 69 6e 69 74 79 20 69 6e 0a 20 20 20 20  infinity in.    
0bd0: 2a 2a 20 74 68 65 20 59 20 64 69 6d 65 6e 73 69  ** the Y dimensi
0be0: 6f 6e 20 61 6e 64 20 69 73 20 63 6f 6e 73 74 72  on and is constr
0bf0: 61 69 6e 65 64 20 74 6f 20 74 68 65 20 72 61 6e  ained to the ran
0c00: 67 65 20 6f 66 20 74 68 65 20 63 69 72 63 6c 65  ge of the circle
0c10: 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 58   in the.    ** X
0c20: 20 64 69 6d 65 6e 73 69 6f 6e 2e 0a 20 20 20 20   dimension..    
0c30: 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20 69  **.    ** Then i
0c40: 6d 61 67 69 6e 65 20 65 61 63 68 20 62 6f 78 20  magine each box 
0c50: 69 73 20 73 70 6c 69 74 20 69 6e 20 68 61 6c 66  is split in half
0c60: 20 61 6c 6f 6e 67 20 69 74 73 20 73 68 6f 72 74   along its short
0c70: 20 61 78 69 73 20 62 79 20 61 20 6c 69 6e 65 0a   axis by a line.
0c80: 20 20 20 20 2a 2a 20 74 68 61 74 20 69 6e 74 65      ** that inte
0c90: 72 73 65 63 74 73 20 74 68 65 20 63 65 6e 74 65  rsects the cente
0ca0: 72 20 6f 66 20 74 68 65 20 63 69 72 63 75 6c 61  r of the circula
0cb0: 72 20 72 65 67 69 6f 6e 2e 20 41 20 62 6f 75 6e  r region. A boun
0cc0: 64 69 6e 67 20 62 6f 78 0a 20 20 20 20 2a 2a 20  ding box.    ** 
0cd0: 62 65 69 6e 67 20 74 65 73 74 65 64 20 63 61 6e  being tested can
0ce0: 20 62 65 20 73 61 69 64 20 74 6f 20 69 6e 74 65   be said to inte
0cf0: 72 73 65 63 74 20 74 68 65 20 63 69 72 63 75 6c  rsect the circul
0d00: 61 72 20 72 65 67 69 6f 6e 20 69 66 20 69 74 20  ar region if it 
0d10: 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 2a 2a 20  contains.    ** 
0d20: 70 6f 69 6e 74 73 20 66 72 6f 6d 20 65 61 63 68  points from each
0d30: 20 68 61 6c 66 20 6f 66 20 65 69 74 68 65 72 20   half of either 
0d40: 6f 66 20 74 68 65 20 74 77 6f 20 69 6e 66 69 6e  of the two infin
0d50: 69 74 65 20 62 6f 75 6e 64 69 6e 67 20 62 6f 78  ite bounding box
0d60: 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  es..    */.    p
0d70: 43 69 72 63 6c 65 2d 3e 61 42 6f 78 5b 30 5d 2e  Circle->aBox[0].
0d80: 78 6d 69 6e 20 3d 20 70 43 69 72 63 6c 65 2d 3e  xmin = pCircle->
0d90: 63 65 6e 74 65 72 78 3b 0a 20 20 20 20 70 43 69  centerx;.    pCi
0da0: 72 63 6c 65 2d 3e 61 42 6f 78 5b 30 5d 2e 78 6d  rcle->aBox[0].xm
0db0: 61 78 20 3d 20 70 43 69 72 63 6c 65 2d 3e 63 65  ax = pCircle->ce
0dc0: 6e 74 65 72 78 3b 0a 20 20 20 20 70 43 69 72 63  nterx;.    pCirc
0dd0: 6c 65 2d 3e 61 42 6f 78 5b 30 5d 2e 79 6d 69 6e  le->aBox[0].ymin
0de0: 20 3d 20 70 43 69 72 63 6c 65 2d 3e 63 65 6e 74   = pCircle->cent
0df0: 65 72 79 20 2b 20 70 43 69 72 63 6c 65 2d 3e 72  ery + pCircle->r
0e00: 61 64 69 75 73 3b 0a 20 20 20 20 70 43 69 72 63  adius;.    pCirc
0e10: 6c 65 2d 3e 61 42 6f 78 5b 30 5d 2e 79 6d 61 78  le->aBox[0].ymax
0e20: 20 3d 20 70 43 69 72 63 6c 65 2d 3e 63 65 6e 74   = pCircle->cent
0e30: 65 72 79 20 2d 20 70 43 69 72 63 6c 65 2d 3e 72  ery - pCircle->r
0e40: 61 64 69 75 73 3b 0a 20 20 20 20 70 43 69 72 63  adius;.    pCirc
0e50: 6c 65 2d 3e 61 42 6f 78 5b 31 5d 2e 78 6d 69 6e  le->aBox[1].xmin
0e60: 20 3d 20 70 43 69 72 63 6c 65 2d 3e 63 65 6e 74   = pCircle->cent
0e70: 65 72 78 20 2b 20 70 43 69 72 63 6c 65 2d 3e 72  erx + pCircle->r
0e80: 61 64 69 75 73 3b 0a 20 20 20 20 70 43 69 72 63  adius;.    pCirc
0e90: 6c 65 2d 3e 61 42 6f 78 5b 31 5d 2e 78 6d 61 78  le->aBox[1].xmax
0ea0: 20 3d 20 70 43 69 72 63 6c 65 2d 3e 63 65 6e 74   = pCircle->cent
0eb0: 65 72 78 20 2d 20 70 43 69 72 63 6c 65 2d 3e 72  erx - pCircle->r
0ec0: 61 64 69 75 73 3b 0a 20 20 20 20 70 43 69 72 63  adius;.    pCirc
0ed0: 6c 65 2d 3e 61 42 6f 78 5b 31 5d 2e 79 6d 69 6e  le->aBox[1].ymin
0ee0: 20 3d 20 70 43 69 72 63 6c 65 2d 3e 63 65 6e 74   = pCircle->cent
0ef0: 65 72 79 3b 0a 20 20 20 20 70 43 69 72 63 6c 65  ery;.    pCircle
0f00: 2d 3e 61 42 6f 78 5b 31 5d 2e 79 6d 61 78 20 3d  ->aBox[1].ymax =
0f10: 20 70 43 69 72 63 6c 65 2d 3e 63 65 6e 74 65 72   pCircle->center
0f20: 79 3b 0a 20 20 7d 0a 0a 20 20 70 43 69 72 63 6c  y;.  }..  pCircl
0f30: 65 20 3d 20 28 43 69 72 63 6c 65 20 2a 29 70 2d  e = (Circle *)p-
0f40: 3e 70 55 73 65 72 3b 0a 20 20 78 6d 69 6e 20 3d  >pUser;.  xmin =
0f50: 20 61 43 6f 6f 72 64 5b 30 5d 3b 0a 20 20 78 6d   aCoord[0];.  xm
0f60: 61 78 20 3d 20 61 43 6f 6f 72 64 5b 31 5d 3b 0a  ax = aCoord[1];.
0f70: 20 20 79 6d 69 6e 20 3d 20 61 43 6f 6f 72 64 5b    ymin = aCoord[
0f80: 32 5d 3b 0a 20 20 79 6d 61 78 20 3d 20 61 43 6f  2];.  ymax = aCo
0f90: 6f 72 64 5b 33 5d 3b 0a 0a 20 20 2f 2a 20 43 68  ord[3];..  /* Ch
0fa0: 65 63 6b 20 69 66 20 61 6e 79 20 6f 66 20 74 68  eck if any of th
0fb0: 65 20 34 20 63 6f 72 6e 65 72 73 20 6f 66 20 74  e 4 corners of t
0fc0: 68 65 20 62 6f 75 6e 64 69 6e 67 2d 62 6f 78 20  he bounding-box 
0fd0: 62 65 69 6e 67 20 74 65 73 74 65 64 20 6c 69 65  being tested lie
0fe0: 20 0a 20 20 2a 2a 20 69 6e 73 69 64 65 20 74 68   .  ** inside th
0ff0: 65 20 63 69 72 63 75 6c 61 72 20 72 65 67 69 6f  e circular regio
1000: 6e 2e 20 49 66 20 74 68 65 79 20 64 6f 2c 20 74  n. If they do, t
1010: 68 65 6e 20 74 68 65 20 62 6f 75 6e 64 69 6e 67  hen the bounding
1020: 2d 62 6f 78 20 64 6f 65 73 0a 20 20 2a 2a 20 69  -box does.  ** i
1030: 6e 74 65 72 73 65 63 74 20 74 68 65 20 72 65 67  ntersect the reg
1040: 69 6f 6e 20 6f 66 20 69 6e 74 65 72 65 73 74 2e  ion of interest.
1050: 20 53 65 74 20 74 68 65 20 6f 75 74 70 75 74 20   Set the output 
1060: 76 61 72 69 61 62 6c 65 20 74 6f 20 74 72 75 65  variable to true
1070: 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e   and.  ** return
1080: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6e 20 74 68   SQLITE_OK in th
1090: 69 73 20 63 61 73 65 2e 20 2a 2f 0a 20 20 66 6f  is case. */.  fo
10a0: 72 28 69 3d 30 3b 20 69 3c 34 3b 20 69 2b 2b 29  r(i=0; i<4; i++)
10b0: 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 78 20 3d  {.    double x =
10c0: 20 28 69 26 30 78 30 31 29 20 3f 20 78 6d 61 78   (i&0x01) ? xmax
10d0: 20 3a 20 78 6d 69 6e 3b 0a 20 20 20 20 64 6f 75   : xmin;.    dou
10e0: 62 6c 65 20 79 20 3d 20 28 69 26 30 78 30 32 29  ble y = (i&0x02)
10f0: 20 3f 20 79 6d 61 78 20 3a 20 79 6d 69 6e 3b 0a   ? ymax : ymin;.
1100: 20 20 20 20 64 6f 75 62 6c 65 20 64 32 3b 0a 20      double d2;. 
1110: 20 20 20 0a 20 20 20 20 64 32 20 20 3d 20 28 78     .    d2  = (x
1120: 2d 70 43 69 72 63 6c 65 2d 3e 63 65 6e 74 65 72  -pCircle->center
1130: 78 29 2a 28 78 2d 70 43 69 72 63 6c 65 2d 3e 63  x)*(x-pCircle->c
1140: 65 6e 74 65 72 78 29 3b 0a 20 20 20 20 64 32 20  enterx);.    d2 
1150: 2b 3d 20 28 79 2d 70 43 69 72 63 6c 65 2d 3e 63  += (y-pCircle->c
1160: 65 6e 74 65 72 79 29 2a 28 79 2d 70 43 69 72 63  entery)*(y-pCirc
1170: 6c 65 2d 3e 63 65 6e 74 65 72 79 29 3b 0a 20 20  le->centery);.  
1180: 20 20 69 66 28 20 64 32 3c 28 70 43 69 72 63 6c    if( d2<(pCircl
1190: 65 2d 3e 72 61 64 69 75 73 2a 70 43 69 72 63 6c  e->radius*pCircl
11a0: 65 2d 3e 72 61 64 69 75 73 29 20 29 7b 0a 20 20  e->radius) ){.  
11b0: 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
11c0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
11d0: 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
11e0: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
11f0: 74 68 65 20 62 6f 75 6e 64 69 6e 67 20 62 6f 78  the bounding box
1200: 20 63 6f 76 65 72 73 20 61 6e 79 20 6f 74 68 65   covers any othe
1210: 72 20 70 61 72 74 20 6f 66 20 74 68 65 20 63 69  r part of the ci
1220: 72 63 75 6c 61 72 20 72 65 67 69 6f 6e 2e 0a 20  rcular region.. 
1230: 20 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73   ** See comments
1240: 20 61 62 6f 76 65 20 66 6f 72 20 61 20 64 65 73   above for a des
1250: 63 72 69 70 74 69 6f 6e 20 6f 66 20 68 6f 77 20  cription of how 
1260: 74 68 69 73 20 74 65 73 74 20 77 6f 72 6b 73 2e  this test works.
1270: 20 49 66 20 69 74 20 64 6f 65 73 0a 20 20 2a 2a   If it does.  **
1280: 20 63 6f 76 65 72 20 70 61 72 74 20 6f 66 20 74   cover part of t
1290: 68 65 20 63 69 72 63 75 6c 61 72 20 72 65 67 69  he circular regi
12a0: 6f 6e 2c 20 73 65 74 20 74 68 65 20 6f 75 74 70  on, set the outp
12b0: 75 74 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74  ut variable to t
12c0: 72 75 65 0a 20 20 2a 2a 20 61 6e 64 20 72 65 74  rue.  ** and ret
12d0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 2a  urn SQLITE_OK. *
12e0: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32  /.  for(i=0; i<2
12f0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
1300: 78 6d 69 6e 3c 3d 70 43 69 72 63 6c 65 2d 3e 61  xmin<=pCircle->a
1310: 42 6f 78 5b 69 5d 2e 78 6d 69 6e 20 0a 20 20 20  Box[i].xmin .   
1320: 20 20 26 26 20 78 6d 61 78 3e 3d 70 43 69 72 63    && xmax>=pCirc
1330: 6c 65 2d 3e 61 42 6f 78 5b 69 5d 2e 78 6d 61 78  le->aBox[i].xmax
1340: 20 0a 20 20 20 20 20 26 26 20 79 6d 69 6e 3c 3d   .     && ymin<=
1350: 70 43 69 72 63 6c 65 2d 3e 61 42 6f 78 5b 69 5d  pCircle->aBox[i]
1360: 2e 79 6d 69 6e 20 0a 20 20 20 20 20 26 26 20 79  .ymin .     && y
1370: 6d 61 78 3e 3d 70 43 69 72 63 6c 65 2d 3e 61 42  max>=pCircle->aB
1380: 6f 78 5b 69 5d 2e 79 6d 61 78 20 0a 20 20 20 20  ox[i].ymax .    
1390: 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  ){.      *pRes =
13a0: 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   1;.      return
13b0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
13c0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
13d0: 73 70 65 63 69 66 69 65 64 20 62 6f 75 6e 64 69  specified boundi
13e0: 6e 67 20 62 6f 78 20 64 6f 65 73 20 6e 6f 74 20  ng box does not 
13f0: 69 6e 74 65 72 73 65 63 74 20 74 68 65 20 63 69  intersect the ci
1400: 72 63 75 6c 61 72 20 72 65 67 69 6f 6e 2e 20 53  rcular region. S
1410: 65 74 0a 20 20 2a 2a 20 74 68 65 20 6f 75 74 70  et.  ** the outp
1420: 75 74 20 76 61 72 69 61 62 6c 65 20 74 6f 20 7a  ut variable to z
1430: 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 53  ero and return S
1440: 51 4c 49 54 45 5f 4f 4b 2e 20 2a 2f 0a 20 20 2a  QLITE_OK. */.  *
1450: 70 52 65 73 20 3d 20 30 3b 0a 20 20 72 65 74 75  pRes = 0;.  retu
1460: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1470: 0a 2f 2a 20 45 4e 44 20 6f 66 20 69 6d 70 6c 65  ./* END of imple
1480: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 22 63 69  mentation of "ci
1490: 72 63 6c 65 22 20 67 65 6f 6d 65 74 72 79 20 63  rcle" geometry c
14a0: 61 6c 6c 62 61 63 6b 2e 0a 2a 2a 2a 2a 2a 2a 2a  allback..*******
14b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14f0: 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
1500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
1540: 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74  #include <assert
1550: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 22 74 63  .h>.#include "tc
1560: 6c 2e 68 22 0a 0a 74 79 70 65 64 65 66 20 73 74  l.h"..typedef st
1570: 72 75 63 74 20 43 75 62 65 20 43 75 62 65 3b 0a  ruct Cube Cube;.
1580: 73 74 72 75 63 74 20 43 75 62 65 20 7b 0a 20 20  struct Cube {.  
1590: 64 6f 75 62 6c 65 20 78 3b 0a 20 20 64 6f 75 62  double x;.  doub
15a0: 6c 65 20 79 3b 0a 20 20 64 6f 75 62 6c 65 20 7a  le y;.  double z
15b0: 3b 0a 20 20 64 6f 75 62 6c 65 20 77 69 64 74 68  ;.  double width
15c0: 3b 0a 20 20 64 6f 75 62 6c 65 20 68 65 69 67 68  ;.  double heigh
15d0: 74 3b 0a 20 20 64 6f 75 62 6c 65 20 64 65 70 74  t;.  double dept
15e0: 68 3b 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 76 6f  h;.};..static vo
15f0: 69 64 20 63 75 62 65 5f 63 6f 6e 74 65 78 74 5f  id cube_context_
1600: 66 72 65 65 28 76 6f 69 64 20 2a 70 29 7b 0a 20  free(void *p){. 
1610: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
1620: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63  ;.}../*.** The c
1630: 6f 6e 74 65 78 74 20 70 6f 69 6e 74 65 72 20 72  ontext pointer r
1640: 65 67 69 73 74 65 72 65 64 20 61 6c 6f 6e 67 20  egistered along 
1650: 77 69 74 68 20 74 68 65 20 27 63 75 62 65 27 20  with the 'cube' 
1660: 63 61 6c 6c 62 61 63 6b 20 69 73 0a 2a 2a 20 61  callback is.** a
1670: 6c 77 61 79 73 20 28 28 76 6f 69 64 20 2a 29 26  lways ((void *)&
1680: 67 48 65 72 65 29 2e 20 54 68 69 73 20 69 73 20  gHere). This is 
1690: 6a 75 73 74 20 74 6f 20 66 61 63 69 6c 69 74 61  just to facilita
16a0: 74 65 20 74 65 73 74 69 6e 67 2c 20 69 74 20 69  te testing, it i
16b0: 73 20 6e 6f 74 0a 2a 2a 20 61 63 74 75 61 6c 6c  s not.** actuall
16c0: 79 20 75 73 65 64 20 66 6f 72 20 61 6e 79 74 68  y used for anyth
16d0: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
16e0: 6e 74 20 67 48 65 72 65 20 3d 20 34 32 3b 0a 0a  nt gHere = 42;..
16f0: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
1700: 74 69 6f 6e 20 6f 66 20 61 20 73 69 6d 70 6c 65  tion of a simple
1710: 20 72 2d 74 72 65 65 20 67 65 6f 6d 20 63 61 6c   r-tree geom cal
1720: 6c 62 61 63 6b 20 74 6f 20 74 65 73 74 20 66 6f  lback to test fo
1730: 72 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 0a 2a  r intersection.*
1740: 2a 20 6f 66 20 72 2d 74 72 65 65 20 72 6f 77 73  * of r-tree rows
1750: 20 77 69 74 68 20 61 20 22 63 75 62 65 22 20 73   with a "cube" s
1760: 68 61 70 65 2e 20 43 75 62 65 73 20 61 72 65 20  hape. Cubes are 
1770: 64 65 66 69 6e 65 64 20 62 79 20 73 69 78 20 73  defined by six s
1780: 63 61 6c 61 72 0a 2a 2a 20 63 6f 6f 72 64 69 6e  calar.** coordin
1790: 61 74 65 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  ates as follows:
17a0: 0a 2a 2a 0a 2a 2a 20 20 20 63 75 62 65 28 78 2c  .**.**   cube(x,
17b0: 20 79 2c 20 7a 2c 20 77 69 64 74 68 2c 20 68 65   y, z, width, he
17c0: 69 67 68 74 2c 20 64 65 70 74 68 29 0a 2a 2a 0a  ight, depth).**.
17d0: 2a 2a 20 54 68 65 20 77 69 64 74 68 2c 20 68 65  ** The width, he
17e0: 69 67 68 74 20 61 6e 64 20 64 65 70 74 68 20 70  ight and depth p
17f0: 61 72 61 6d 65 74 65 72 73 20 6d 75 73 74 20 61  arameters must a
1800: 6c 6c 20 62 65 20 67 72 65 61 74 65 72 20 74 68  ll be greater th
1810: 61 6e 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74  an zero..*/.stat
1820: 69 63 20 69 6e 74 20 63 75 62 65 5f 67 65 6f 6d  ic int cube_geom
1830: 28 0a 20 20 73 71 6c 69 74 65 33 5f 72 74 72 65  (.  sqlite3_rtre
1840: 65 5f 67 65 6f 6d 65 74 72 79 20 2a 70 2c 0a 20  e_geometry *p,. 
1850: 20 69 6e 74 20 6e 43 6f 6f 72 64 2c 0a 23 69 66   int nCoord,.#if
1860: 64 65 66 20 53 51 4c 49 54 45 5f 52 54 52 45 45  def SQLITE_RTREE
1870: 5f 49 4e 54 5f 4f 4e 4c 59 0a 20 20 73 71 6c 69  _INT_ONLY.  sqli
1880: 74 65 33 5f 69 6e 74 36 34 20 2a 61 43 6f 6f 72  te3_int64 *aCoor
1890: 64 2c 20 0a 23 65 6c 73 65 0a 20 20 64 6f 75 62  d, .#else.  doub
18a0: 6c 65 20 2a 61 43 6f 6f 72 64 2c 20 0a 23 65 6e  le *aCoord, .#en
18b0: 64 69 66 0a 20 20 69 6e 74 20 2a 70 69 52 65 73  dif.  int *piRes
18c0: 0a 29 7b 0a 20 20 43 75 62 65 20 2a 70 43 75 62  .){.  Cube *pCub
18d0: 65 20 3d 20 28 43 75 62 65 20 2a 29 70 2d 3e 70  e = (Cube *)p->p
18e0: 55 73 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  User;..  assert(
18f0: 20 70 2d 3e 70 43 6f 6e 74 65 78 74 3d 3d 28 76   p->pContext==(v
1900: 6f 69 64 20 2a 29 26 67 48 65 72 65 20 29 3b 0a  oid *)&gHere );.
1910: 0a 20 20 69 66 28 20 70 43 75 62 65 3d 3d 30 20  .  if( pCube==0 
1920: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 50  ){.    if( p->nP
1930: 61 72 61 6d 21 3d 36 20 7c 7c 20 6e 43 6f 6f 72  aram!=6 || nCoor
1940: 64 21 3d 36 0a 20 20 20 20 20 7c 7c 20 70 2d 3e  d!=6.     || p->
1950: 61 50 61 72 61 6d 5b 33 5d 3c 3d 30 2e 30 20 7c  aParam[3]<=0.0 |
1960: 7c 20 70 2d 3e 61 50 61 72 61 6d 5b 34 5d 3c 3d  | p->aParam[4]<=
1970: 30 2e 30 20 7c 7c 20 70 2d 3e 61 50 61 72 61 6d  0.0 || p->aParam
1980: 5b 35 5d 3c 3d 30 2e 30 0a 20 20 20 20 29 7b 0a  [5]<=0.0.    ){.
1990: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
19a0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
19b0: 0a 20 20 20 20 70 43 75 62 65 20 3d 20 28 43 75  .    pCube = (Cu
19c0: 62 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  be *)sqlite3_mal
19d0: 6c 6f 63 28 73 69 7a 65 6f 66 28 43 75 62 65 29  loc(sizeof(Cube)
19e0: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43 75 62  );.    if( !pCub
19f0: 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
1a00: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
1a10: 20 20 20 20 7d 0a 20 20 20 20 70 43 75 62 65 2d      }.    pCube-
1a20: 3e 78 20 3d 20 70 2d 3e 61 50 61 72 61 6d 5b 30  >x = p->aParam[0
1a30: 5d 3b 0a 20 20 20 20 70 43 75 62 65 2d 3e 79 20  ];.    pCube->y 
1a40: 3d 20 70 2d 3e 61 50 61 72 61 6d 5b 31 5d 3b 0a  = p->aParam[1];.
1a50: 20 20 20 20 70 43 75 62 65 2d 3e 7a 20 3d 20 70      pCube->z = p
1a60: 2d 3e 61 50 61 72 61 6d 5b 32 5d 3b 0a 20 20 20  ->aParam[2];.   
1a70: 20 70 43 75 62 65 2d 3e 77 69 64 74 68 20 3d 20   pCube->width = 
1a80: 70 2d 3e 61 50 61 72 61 6d 5b 33 5d 3b 0a 20 20  p->aParam[3];.  
1a90: 20 20 70 43 75 62 65 2d 3e 68 65 69 67 68 74 20    pCube->height 
1aa0: 3d 20 70 2d 3e 61 50 61 72 61 6d 5b 34 5d 3b 0a  = p->aParam[4];.
1ab0: 20 20 20 20 70 43 75 62 65 2d 3e 64 65 70 74 68      pCube->depth
1ac0: 20 3d 20 70 2d 3e 61 50 61 72 61 6d 5b 35 5d 3b   = p->aParam[5];
1ad0: 0a 0a 20 20 20 20 70 2d 3e 70 55 73 65 72 20 3d  ..    p->pUser =
1ae0: 20 28 76 6f 69 64 20 2a 29 70 43 75 62 65 3b 0a   (void *)pCube;.
1af0: 20 20 20 20 70 2d 3e 78 44 65 6c 55 73 65 72 20      p->xDelUser 
1b00: 3d 20 63 75 62 65 5f 63 6f 6e 74 65 78 74 5f 66  = cube_context_f
1b10: 72 65 65 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  ree;.  }..  asse
1b20: 72 74 28 20 6e 43 6f 6f 72 64 3d 3d 36 20 29 3b  rt( nCoord==6 );
1b30: 0a 20 20 2a 70 69 52 65 73 20 3d 20 30 3b 0a 20  .  *piRes = 0;. 
1b40: 20 69 66 28 20 61 43 6f 6f 72 64 5b 30 5d 3c 3d   if( aCoord[0]<=
1b50: 28 70 43 75 62 65 2d 3e 78 2b 70 43 75 62 65 2d  (pCube->x+pCube-
1b60: 3e 77 69 64 74 68 29 0a 20 20 20 26 26 20 61 43  >width).   && aC
1b70: 6f 6f 72 64 5b 31 5d 3e 3d 70 43 75 62 65 2d 3e  oord[1]>=pCube->
1b80: 78 0a 20 20 20 26 26 20 61 43 6f 6f 72 64 5b 32  x.   && aCoord[2
1b90: 5d 3c 3d 28 70 43 75 62 65 2d 3e 79 2b 70 43 75  ]<=(pCube->y+pCu
1ba0: 62 65 2d 3e 68 65 69 67 68 74 29 0a 20 20 20 26  be->height).   &
1bb0: 26 20 61 43 6f 6f 72 64 5b 33 5d 3e 3d 70 43 75  & aCoord[3]>=pCu
1bc0: 62 65 2d 3e 79 0a 20 20 20 26 26 20 61 43 6f 6f  be->y.   && aCoo
1bd0: 72 64 5b 34 5d 3c 3d 28 70 43 75 62 65 2d 3e 7a  rd[4]<=(pCube->z
1be0: 2b 70 43 75 62 65 2d 3e 64 65 70 74 68 29 0a 20  +pCube->depth). 
1bf0: 20 20 26 26 20 61 43 6f 6f 72 64 5b 35 5d 3e 3d    && aCoord[5]>=
1c00: 70 43 75 62 65 2d 3e 7a 0a 20 20 29 7b 0a 20 20  pCube->z.  ){.  
1c10: 20 20 2a 70 69 52 65 73 20 3d 20 31 3b 0a 20 20    *piRes = 1;.  
1c20: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
1c30: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
1c40: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
1c50: 5f 52 54 52 45 45 20 2a 2f 0a 0a 73 74 61 74 69  _RTREE */..stati
1c60: 63 20 69 6e 74 20 72 65 67 69 73 74 65 72 5f 63  c int register_c
1c70: 75 62 65 5f 67 65 6f 6d 28 0a 20 20 76 6f 69 64  ube_geom(.  void
1c80: 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1c90: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1ca0: 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1cb0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1cc0: 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e  T objv[].){.#ifn
1cd0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1ce0: 45 5f 52 54 52 45 45 0a 20 20 55 4e 55 53 45 44  E_RTREE.  UNUSED
1cf0: 5f 50 41 52 41 4d 45 54 45 52 28 63 6c 69 65 6e  _PARAMETER(clien
1d00: 74 44 61 74 61 29 3b 0a 20 20 55 4e 55 53 45 44  tData);.  UNUSED
1d10: 5f 50 41 52 41 4d 45 54 45 52 28 69 6e 74 65 72  _PARAMETER(inter
1d20: 70 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  p);.  UNUSED_PAR
1d30: 41 4d 45 54 45 52 28 6f 62 6a 63 29 3b 0a 20 20  AMETER(objc);.  
1d40: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1d50: 28 6f 62 6a 76 29 3b 0a 23 65 6c 73 65 0a 20 20  (objv);.#else.  
1d60: 65 78 74 65 72 6e 20 69 6e 74 20 67 65 74 44 62  extern int getDb
1d70: 50 6f 69 6e 74 65 72 28 54 63 6c 5f 49 6e 74 65  Pointer(Tcl_Inte
1d80: 72 70 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a  rp*, const char*
1d90: 2c 20 73 71 6c 69 74 65 33 2a 2a 29 3b 0a 20 20  , sqlite3**);.  
1da0: 65 78 74 65 72 6e 20 63 6f 6e 73 74 20 63 68 61  extern const cha
1db0: 72 20 2a 73 71 6c 69 74 65 33 54 65 73 74 45 72  r *sqlite3TestEr
1dc0: 72 6f 72 4e 61 6d 65 28 69 6e 74 29 3b 0a 20 20  rorName(int);.  
1dd0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
1de0: 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
1df0: 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
1e00: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
1e10: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
1e20: 44 42 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  DB");.    return
1e30: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1e40: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
1e50: 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
1e60: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1e70: 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
1e80: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
1e90: 20 3d 20 73 71 6c 69 74 65 33 5f 72 74 72 65 65   = sqlite3_rtree
1ea0: 5f 67 65 6f 6d 65 74 72 79 5f 63 61 6c 6c 62 61  _geometry_callba
1eb0: 63 6b 28 64 62 2c 20 22 63 75 62 65 22 2c 20 63  ck(db, "cube", c
1ec0: 75 62 65 5f 67 65 6f 6d 2c 20 28 76 6f 69 64 20  ube_geom, (void 
1ed0: 2a 29 26 67 48 65 72 65 29 3b 0a 20 20 54 63 6c  *)&gHere);.  Tcl
1ee0: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
1ef0: 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74  p, (char *)sqlit
1f00: 65 33 54 65 73 74 45 72 72 6f 72 4e 61 6d 65 28  e3TestErrorName(
1f10: 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  rc), TCL_STATIC)
1f20: 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
1f30: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61  n TCL_OK;.}..sta
1f40: 74 69 63 20 69 6e 74 20 72 65 67 69 73 74 65 72  tic int register
1f50: 5f 63 69 72 63 6c 65 5f 67 65 6f 6d 28 0a 20 20  _circle_geom(.  
1f60: 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1f70: 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1f80: 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1f90: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1fa0: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1fb0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45  #ifndef SQLITE_E
1fc0: 4e 41 42 4c 45 5f 52 54 52 45 45 0a 20 20 55 4e  NABLE_RTREE.  UN
1fd0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 63  USED_PARAMETER(c
1fe0: 6c 69 65 6e 74 44 61 74 61 29 3b 0a 20 20 55 4e  lientData);.  UN
1ff0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69  USED_PARAMETER(i
2000: 6e 74 65 72 70 29 3b 0a 20 20 55 4e 55 53 45 44  nterp);.  UNUSED
2010: 5f 50 41 52 41 4d 45 54 45 52 28 6f 62 6a 63 29  _PARAMETER(objc)
2020: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
2030: 45 54 45 52 28 6f 62 6a 76 29 3b 0a 23 65 6c 73  ETER(objv);.#els
2040: 65 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 67  e.  extern int g
2050: 65 74 44 62 50 6f 69 6e 74 65 72 28 54 63 6c 5f  etDbPointer(Tcl_
2060: 49 6e 74 65 72 70 2a 2c 20 63 6f 6e 73 74 20 63  Interp*, const c
2070: 68 61 72 2a 2c 20 73 71 6c 69 74 65 33 2a 2a 29  har*, sqlite3**)
2080: 3b 0a 20 20 65 78 74 65 72 6e 20 63 6f 6e 73 74  ;.  extern const
2090: 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 54 65   char *sqlite3Te
20a0: 73 74 45 72 72 6f 72 4e 61 6d 65 28 69 6e 74 29  stErrorName(int)
20b0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
20c0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
20d0: 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
20e0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
20f0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
2100: 76 2c 20 22 44 42 22 29 3b 0a 20 20 20 20 72 65  v, "DB");.    re
2110: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2120: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
2130: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
2140: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
2150: 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
2160: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2170: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
2180: 74 72 65 65 5f 67 65 6f 6d 65 74 72 79 5f 63 61  tree_geometry_ca
2190: 6c 6c 62 61 63 6b 28 64 62 2c 20 22 63 69 72 63  llback(db, "circ
21a0: 6c 65 22 2c 20 63 69 72 63 6c 65 5f 67 65 6f 6d  le", circle_geom
21b0: 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52  , 0);.  Tcl_SetR
21c0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
21d0: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 54 65 73  har *)sqlite3Tes
21e0: 74 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  tErrorName(rc), 
21f0: 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 23 65 6e  TCL_STATIC);.#en
2200: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  dif.  return TCL
2210: 5f 4f 4b 3b 0a 7d 0a 0a 69 6e 74 20 53 71 6c 69  _OK;.}..int Sqli
2220: 74 65 74 65 73 74 72 74 72 65 65 5f 49 6e 69 74  tetestrtree_Init
2230: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
2240: 65 72 70 29 7b 0a 20 20 54 63 6c 5f 43 72 65 61  erp){.  Tcl_Crea
2250: 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
2260: 65 72 70 2c 20 22 72 65 67 69 73 74 65 72 5f 63  erp, "register_c
2270: 75 62 65 5f 67 65 6f 6d 22 2c 20 72 65 67 69 73  ube_geom", regis
2280: 74 65 72 5f 63 75 62 65 5f 67 65 6f 6d 2c 20 30  ter_cube_geom, 0
2290: 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61  , 0);.  Tcl_Crea
22a0: 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
22b0: 65 72 70 2c 20 22 72 65 67 69 73 74 65 72 5f 63  erp, "register_c
22c0: 69 72 63 6c 65 5f 67 65 6f 6d 22 2c 72 65 67 69  ircle_geom",regi
22d0: 73 74 65 72 5f 63 69 72 63 6c 65 5f 67 65 6f 6d  ster_circle_geom
22e0: 2c 30 2c 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  ,0,0);.  return 
22f0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a                    TCL_OK;.}.