/ Hex Artifact Content
Login

Artifact c92eb2c5df436c0be3cffceb00769794ed8a28b38fe6e40cde2c68b026d20c8c:


0000: 2f 2a 0a 2a 2a 20 32 30 31 38 2d 30 35 2d 32 35  /*.** 2018-05-25
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
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 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ****.**.** This 
0180: 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  file implements 
0190: 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 52  an alternative R
01a0: 2d 54 72 65 65 20 76 69 72 74 75 61 6c 20 74 61  -Tree virtual ta
01b0: 62 6c 65 20 74 68 61 74 0a 2a 2a 20 75 73 65 73  ble that.** uses
01c0: 20 70 6f 6c 79 67 6f 6e 73 20 74 6f 20 65 78 70   polygons to exp
01d0: 72 65 73 73 20 74 68 65 20 62 6f 75 6e 64 61 72  ress the boundar
01e0: 69 65 73 20 6f 66 20 32 2d 64 69 6d 65 6e 73 69  ies of 2-dimensi
01f0: 6f 6e 61 6c 20 6f 62 6a 65 63 74 73 2e 0a 2a 2a  onal objects..**
0200: 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69 73  .** This file is
0210: 20 23 69 6e 63 6c 75 64 65 2d 65 64 20 6f 6e 74   #include-ed ont
0220: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 22 72 74  o the end of "rt
0230: 72 65 65 2e 63 22 20 73 6f 20 74 68 61 74 20 69  ree.c" so that i
0240: 74 20 68 61 73 0a 2a 2a 20 61 63 63 65 73 73 20  t has.** access 
0250: 74 6f 20 61 6c 6c 20 6f 66 20 74 68 65 20 52 2d  to all of the R-
0260: 54 72 65 65 20 69 6e 74 65 72 6e 61 6c 73 2e 0a  Tree internals..
0270: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64  */.#include <std
0280: 6c 69 62 2e 68 3e 0a 0a 2f 2a 20 45 6e 61 62 6c  lib.h>../* Enabl
0290: 65 20 2d 44 47 45 4f 50 4f 4c 59 5f 45 4e 41 42  e -DGEOPOLY_ENAB
02a0: 4c 45 5f 44 45 42 55 47 20 66 6f 72 20 64 65 62  LE_DEBUG for deb
02b0: 75 67 67 69 6e 67 20 66 61 63 69 6c 69 74 69 65  ugging facilitie
02c0: 73 20 2a 2f 0a 23 69 66 64 65 66 20 47 45 4f 50  s */.#ifdef GEOP
02d0: 4f 4c 59 5f 45 4e 41 42 4c 45 5f 44 45 42 55 47  OLY_ENABLE_DEBUG
02e0: 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 67 65  .  static int ge
02f0: 6f 5f 64 65 62 75 67 20 3d 20 30 3b 0a 23 20 64  o_debug = 0;.# d
0300: 65 66 69 6e 65 20 47 45 4f 44 45 42 55 47 28 58  efine GEODEBUG(X
0310: 29 20 69 66 28 67 65 6f 5f 64 65 62 75 67 29 70  ) if(geo_debug)p
0320: 72 69 6e 74 66 20 58 0a 23 65 6c 73 65 0a 23 20  rintf X.#else.# 
0330: 64 65 66 69 6e 65 20 47 45 4f 44 45 42 55 47 28  define GEODEBUG(
0340: 58 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  X).#endif..#ifnd
0350: 65 66 20 4a 53 4f 4e 5f 4e 55 4c 4c 20 20 20 2f  ef JSON_NULL   /
0360: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
0370: 73 74 75 66 66 20 72 65 70 65 61 74 73 20 74 68  stuff repeats th
0380: 69 6e 67 73 20 66 6f 75 6e 64 20 69 6e 20 6a 73  ings found in js
0390: 6f 6e 31 20 2a 2f 0a 2f 2a 0a 2a 2a 20 56 65 72  on1 */./*.** Ver
03a0: 73 69 6f 6e 73 20 6f 66 20 69 73 73 70 61 63 65  sions of isspace
03b0: 28 29 2c 20 69 73 61 6c 6e 75 6d 28 29 20 61 6e  (), isalnum() an
03c0: 64 20 69 73 64 69 67 69 74 28 29 20 74 6f 20 77  d isdigit() to w
03d0: 68 69 63 68 20 69 74 20 69 73 20 73 61 66 65 0a  hich it is safe.
03e0: 2a 2a 20 74 6f 20 70 61 73 73 20 73 69 67 6e 65  ** to pass signe
03f0: 64 20 63 68 61 72 20 76 61 6c 75 65 73 2e 0a 2a  d char values..*
0400: 2f 0a 23 69 66 64 65 66 20 73 71 6c 69 74 65 33  /.#ifdef sqlite3
0410: 49 73 64 69 67 69 74 0a 20 20 20 2f 2a 20 55 73  Isdigit.   /* Us
0420: 65 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72  e the SQLite cor
0430: 65 20 76 65 72 73 69 6f 6e 73 20 69 66 20 74 68  e versions if th
0440: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61  is routine is pa
0450: 72 74 20 6f 66 20 74 68 65 0a 20 20 20 2a 2a 20  rt of the.   ** 
0460: 53 51 4c 69 74 65 20 61 6d 61 6c 67 61 6d 61 74  SQLite amalgamat
0470: 69 6f 6e 20 2a 2f 0a 23 20 20 64 65 66 69 6e 65  ion */.#  define
0480: 20 73 61 66 65 5f 69 73 64 69 67 69 74 28 78 29   safe_isdigit(x)
0490: 20 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74    sqlite3Isdigit
04a0: 28 78 29 0a 23 20 20 64 65 66 69 6e 65 20 73 61  (x).#  define sa
04b0: 66 65 5f 69 73 61 6c 6e 75 6d 28 78 29 20 20 73  fe_isalnum(x)  s
04c0: 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 78 29  qlite3Isalnum(x)
04d0: 0a 23 20 20 64 65 66 69 6e 65 20 73 61 66 65 5f  .#  define safe_
04e0: 69 73 78 64 69 67 69 74 28 78 29 20 73 71 6c 69  isxdigit(x) sqli
04f0: 74 65 33 49 73 78 64 69 67 69 74 28 78 29 0a 23  te3Isxdigit(x).#
0500: 65 6c 73 65 0a 20 20 20 2f 2a 20 55 73 65 20 74  else.   /* Use t
0510: 68 65 20 73 74 61 6e 64 61 72 64 20 6c 69 62 72  he standard libr
0520: 61 72 79 20 66 6f 72 20 73 65 70 61 72 61 74 65  ary for separate
0530: 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 2a 2f 0a   compilation */.
0540: 23 69 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e  #include <ctype.
0550: 68 3e 20 20 2f 2a 20 61 6d 61 6c 67 61 6d 61 74  h>  /* amalgamat
0560: 6f 72 3a 20 6b 65 65 70 20 2a 2f 0a 23 20 20 64  or: keep */.#  d
0570: 65 66 69 6e 65 20 73 61 66 65 5f 69 73 64 69 67  efine safe_isdig
0580: 69 74 28 78 29 20 20 69 73 64 69 67 69 74 28 28  it(x)  isdigit((
0590: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 28 78  unsigned char)(x
05a0: 29 29 0a 23 20 20 64 65 66 69 6e 65 20 73 61 66  )).#  define saf
05b0: 65 5f 69 73 61 6c 6e 75 6d 28 78 29 20 20 69 73  e_isalnum(x)  is
05c0: 61 6c 6e 75 6d 28 28 75 6e 73 69 67 6e 65 64 20  alnum((unsigned 
05d0: 63 68 61 72 29 28 78 29 29 0a 23 20 20 64 65 66  char)(x)).#  def
05e0: 69 6e 65 20 73 61 66 65 5f 69 73 78 64 69 67 69  ine safe_isxdigi
05f0: 74 28 78 29 20 69 73 78 64 69 67 69 74 28 28 75  t(x) isxdigit((u
0600: 6e 73 69 67 6e 65 64 20 63 68 61 72 29 28 78 29  nsigned char)(x)
0610: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
0620: 47 72 6f 77 69 6e 67 20 6f 75 72 20 6f 77 6e 20  Growing our own 
0630: 69 73 73 70 61 63 65 28 29 20 72 6f 75 74 69 6e  isspace() routin
0640: 65 20 74 68 69 73 20 77 61 79 20 69 73 20 74 77  e this way is tw
0650: 69 63 65 20 61 73 20 66 61 73 74 20 61 73 0a 2a  ice as fast as.*
0660: 2a 20 74 68 65 20 6c 69 62 72 61 72 79 20 69 73  * the library is
0670: 73 70 61 63 65 28 29 20 66 75 6e 63 74 69 6f 6e  space() function
0680: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
0690: 74 20 63 68 61 72 20 67 65 6f 70 6f 6c 79 49 73  t char geopolyIs
06a0: 53 70 61 63 65 5b 5d 20 3d 20 7b 0a 20 20 30 2c  Space[] = {.  0,
06b0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
06c0: 30 2c 20 30 2c 20 20 20 20 20 30 2c 20 31 2c 20  0, 0,     0, 1, 
06d0: 31 2c 20 30 2c 20 30 2c 20 31 2c 20 30 2c 20 30  1, 0, 0, 1, 0, 0
06e0: 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  ,.  0, 0, 0, 0, 
06f0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 20 20  0, 0, 0, 0,     
0700: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0710: 2c 20 30 2c 20 30 2c 0a 20 20 31 2c 20 30 2c 20  , 0, 0,.  1, 0, 
0720: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0730: 2c 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30  ,     0, 0, 0, 0
0740: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20  , 0, 0, 0, 0,.  
0750: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0760: 2c 20 30 2c 20 30 2c 20 20 20 20 20 30 2c 20 30  , 0, 0,     0, 0
0770: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0780: 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30   0,.  0, 0, 0, 0
0790: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20  , 0, 0, 0, 0,   
07a0: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
07b0: 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30   0, 0, 0,.  0, 0
07c0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
07d0: 20 30 2c 20 20 20 20 20 30 2c 20 30 2c 20 30 2c   0,     0, 0, 0,
07e0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a   0, 0, 0, 0, 0,.
07f0: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
0800: 20 30 2c 20 30 2c 20 30 2c 20 20 20 20 20 30 2c   0, 0, 0,     0,
0810: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0820: 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c  0, 0,.  0, 0, 0,
0830: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0840: 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20      0, 0, 0, 0, 
0850: 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c  0, 0, 0, 0,.  0,
0860: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0870: 30 2c 20 30 2c 20 20 20 20 20 30 2c 20 30 2c 20  0, 0,     0, 0, 
0880: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0890: 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  ,.  0, 0, 0, 0, 
08a0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 20 20  0, 0, 0, 0,     
08b0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
08c0: 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20  , 0, 0,.  0, 0, 
08d0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
08e0: 2c 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30  ,     0, 0, 0, 0
08f0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20  , 0, 0, 0, 0,.  
0900: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0910: 2c 20 30 2c 20 30 2c 20 20 20 20 20 30 2c 20 30  , 0, 0,     0, 0
0920: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0930: 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30   0,.  0, 0, 0, 0
0940: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20  , 0, 0, 0, 0,   
0950: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
0960: 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30   0, 0, 0,.  0, 0
0970: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0980: 20 30 2c 20 20 20 20 20 30 2c 20 30 2c 20 30 2c   0,     0, 0, 0,
0990: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a   0, 0, 0, 0, 0,.
09a0: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
09b0: 20 30 2c 20 30 2c 20 30 2c 20 20 20 20 20 30 2c   0, 0, 0,     0,
09c0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
09d0: 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c  0, 0,.  0, 0, 0,
09e0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
09f0: 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20      0, 0, 0, 0, 
0a00: 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 7d 3b 0a 23  0, 0, 0, 0,.};.#
0a10: 64 65 66 69 6e 65 20 73 61 66 65 5f 69 73 73 70  define safe_issp
0a20: 61 63 65 28 78 29 20 28 67 65 6f 70 6f 6c 79 49  ace(x) (geopolyI
0a30: 73 53 70 61 63 65 5b 28 75 6e 73 69 67 6e 65 64  sSpace[(unsigned
0a40: 20 63 68 61 72 29 78 5d 29 0a 23 65 6e 64 69 66   char)x]).#endif
0a50: 20 2f 2a 20 4a 53 4f 4e 20 4e 55 4c 4c 20 2d 20   /* JSON NULL - 
0a60: 62 61 63 6b 20 74 6f 20 6f 72 69 67 69 6e 61 6c  back to original
0a70: 20 63 6f 64 65 20 2a 2f 0a 0a 2f 2a 20 43 6f 6d   code */../* Com
0a80: 70 69 6c 65 72 20 61 6e 64 20 76 65 72 73 69 6f  piler and versio
0a90: 6e 20 2a 2f 0a 23 69 66 6e 64 65 66 20 47 43 43  n */.#ifndef GCC
0aa0: 5f 56 45 52 53 49 4f 4e 0a 23 69 66 20 64 65 66  _VERSION.#if def
0ab0: 69 6e 65 64 28 5f 5f 47 4e 55 43 5f 5f 29 20 26  ined(__GNUC__) &
0ac0: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
0ad0: 45 5f 44 49 53 41 42 4c 45 5f 49 4e 54 52 49 4e  E_DISABLE_INTRIN
0ae0: 53 49 43 29 0a 23 20 64 65 66 69 6e 65 20 47 43  SIC).# define GC
0af0: 43 5f 56 45 52 53 49 4f 4e 20 28 5f 5f 47 4e 55  C_VERSION (__GNU
0b00: 43 5f 5f 2a 31 30 30 30 30 30 30 2b 5f 5f 47 4e  C__*1000000+__GN
0b10: 55 43 5f 4d 49 4e 4f 52 5f 5f 2a 31 30 30 30 2b  UC_MINOR__*1000+
0b20: 5f 5f 47 4e 55 43 5f 50 41 54 43 48 4c 45 56 45  __GNUC_PATCHLEVE
0b30: 4c 5f 5f 29 0a 23 65 6c 73 65 0a 23 20 64 65 66  L__).#else.# def
0b40: 69 6e 65 20 47 43 43 5f 56 45 52 53 49 4f 4e 20  ine GCC_VERSION 
0b50: 30 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  0.#endif.#endif.
0b60: 23 69 66 6e 64 65 66 20 4d 53 56 43 5f 56 45 52  #ifndef MSVC_VER
0b70: 53 49 4f 4e 0a 23 69 66 20 64 65 66 69 6e 65 64  SION.#if defined
0b80: 28 5f 4d 53 43 5f 56 45 52 29 20 26 26 20 21 64  (_MSC_VER) && !d
0b90: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 49  efined(SQLITE_DI
0ba0: 53 41 42 4c 45 5f 49 4e 54 52 49 4e 53 49 43 29  SABLE_INTRINSIC)
0bb0: 0a 23 20 64 65 66 69 6e 65 20 4d 53 56 43 5f 56  .# define MSVC_V
0bc0: 45 52 53 49 4f 4e 20 5f 4d 53 43 5f 56 45 52 0a  ERSION _MSC_VER.
0bd0: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 4d  #else.# define M
0be0: 53 56 43 5f 56 45 52 53 49 4f 4e 20 30 0a 23 65  SVC_VERSION 0.#e
0bf0: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  ndif.#endif../* 
0c00: 44 61 74 61 74 79 70 65 20 66 6f 72 20 63 6f 6f  Datatype for coo
0c10: 72 64 69 6e 61 74 65 73 0a 2a 2f 0a 74 79 70 65  rdinates.*/.type
0c20: 64 65 66 20 66 6c 6f 61 74 20 47 65 6f 43 6f 6f  def float GeoCoo
0c30: 72 64 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72  rd;../*.** Inter
0c40: 6e 61 6c 20 72 65 70 72 65 73 65 6e 74 61 74 69  nal representati
0c50: 6f 6e 20 6f 66 20 61 20 70 6f 6c 79 67 6f 6e 2e  on of a polygon.
0c60: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 6c 79 67  .**.** The polyg
0c70: 6f 6e 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  on consists of a
0c80: 20 73 65 71 75 65 6e 63 65 20 6f 66 20 76 65 72   sequence of ver
0c90: 74 65 78 65 73 2e 20 20 54 68 65 72 65 20 69 73  texes.  There is
0ca0: 20 61 20 6c 69 6e 65 0a 2a 2a 20 73 65 67 6d 65   a line.** segme
0cb0: 6e 74 20 62 65 74 77 65 65 6e 20 65 61 63 68 20  nt between each 
0cc0: 70 61 69 72 20 6f 66 20 76 65 72 74 65 78 65 73  pair of vertexes
0cd0: 2c 20 61 6e 64 20 6f 6e 65 20 66 69 6e 61 6c 20  , and one final 
0ce0: 73 65 67 6d 65 6e 74 20 66 72 6f 6d 0a 2a 2a 20  segment from.** 
0cf0: 74 68 65 20 6c 61 73 74 20 76 65 72 74 65 78 20  the last vertex 
0d00: 62 61 63 6b 20 74 6f 20 74 68 65 20 66 69 72 73  back to the firs
0d10: 74 2e 20 20 28 54 68 69 73 20 64 69 66 66 65 72  t.  (This differ
0d20: 73 20 66 72 6f 6d 20 74 68 65 20 47 65 6f 4a 53  s from the GeoJS
0d30: 4f 4e 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20 69  ON.** standard i
0d40: 6e 20 77 68 69 63 68 20 74 68 65 20 66 69 6e 61  n which the fina
0d50: 6c 20 76 65 72 74 65 78 20 69 73 20 61 20 72 65  l vertex is a re
0d60: 70 65 61 74 20 6f 66 20 74 68 65 20 66 69 72 73  peat of the firs
0d70: 74 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f  t.).**.** The po
0d80: 6c 79 67 6f 6e 20 66 6f 6c 6c 6f 77 73 20 74 68  lygon follows th
0d90: 65 20 72 69 67 68 74 2d 68 61 6e 64 20 72 75 6c  e right-hand rul
0da0: 65 2e 20 20 54 68 65 20 61 72 65 61 20 74 6f 20  e.  The area to 
0db0: 74 68 65 20 72 69 67 68 74 20 6f 66 0a 2a 2a 20  the right of.** 
0dc0: 65 61 63 68 20 73 65 67 6d 65 6e 74 20 69 73 20  each segment is 
0dd0: 22 6f 75 74 73 69 64 65 22 20 61 6e 64 20 74 68  "outside" and th
0de0: 65 20 61 72 65 61 20 74 6f 20 74 68 65 20 6c 65  e area to the le
0df0: 66 74 20 69 73 20 22 69 6e 73 69 64 65 22 2e 0a  ft is "inside"..
0e00: 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 2d 64 69 73  **.** The on-dis
0e10: 6b 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  k representation
0e20: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 34   consists of a 4
0e30: 2d 62 79 74 65 20 68 65 61 64 65 72 20 66 6f 6c  -byte header fol
0e40: 6c 6f 77 65 64 20 62 79 0a 2a 2a 20 74 68 65 20  lowed by.** the 
0e50: 76 61 6c 75 65 73 2e 20 20 54 68 65 20 34 2d 62  values.  The 4-b
0e60: 79 74 65 20 68 65 61 64 65 72 20 69 73 3a 0a 2a  yte header is:.*
0e70: 2a 0a 2a 2a 20 20 20 20 20 20 65 6e 63 6f 64 69  *.**      encodi
0e80: 6e 67 20 20 20 20 28 31 20 62 79 74 65 29 20 20  ng    (1 byte)  
0e90: 20 30 3d 62 69 67 2d 65 6e 64 69 61 6e 2c 20 31   0=big-endian, 1
0ea0: 3d 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e 0a 2a  =little-endian.*
0eb0: 2a 20 20 20 20 20 20 6e 76 65 72 74 65 78 20 20  *      nvertex  
0ec0: 20 20 20 28 33 20 62 79 74 65 73 29 20 20 4e 75     (3 bytes)  Nu
0ed0: 6d 62 65 72 20 6f 66 20 76 65 72 74 65 78 65 73  mber of vertexes
0ee0: 20 61 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e   as a big-endian
0ef0: 20 69 6e 74 65 67 65 72 0a 2a 2f 0a 74 79 70 65   integer.*/.type
0f00: 64 65 66 20 73 74 72 75 63 74 20 47 65 6f 50 6f  def struct GeoPo
0f10: 6c 79 20 47 65 6f 50 6f 6c 79 3b 0a 73 74 72 75  ly GeoPoly;.stru
0f20: 63 74 20 47 65 6f 50 6f 6c 79 20 7b 0a 20 20 69  ct GeoPoly {.  i
0f30: 6e 74 20 6e 56 65 72 74 65 78 3b 20 20 20 20 20  nt nVertex;     
0f40: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
0f50: 66 20 76 65 72 74 65 78 65 73 20 2a 2f 0a 20 20  f vertexes */.  
0f60: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 68 64  unsigned char hd
0f70: 72 5b 34 5d 3b 20 2f 2a 20 48 65 61 64 65 72 20  r[4]; /* Header 
0f80: 66 6f 72 20 6f 6e 2d 64 69 73 6b 20 72 65 70 72  for on-disk repr
0f90: 65 73 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20  esentation */.  
0fa0: 47 65 6f 43 6f 6f 72 64 20 61 5b 32 5d 3b 20 20  GeoCoord a[2];  
0fb0: 20 20 2f 2a 20 32 2a 6e 56 65 72 74 65 78 20 76    /* 2*nVertex v
0fc0: 61 6c 75 65 73 2e 20 58 20 28 6c 6f 6e 67 69 74  alues. X (longit
0fd0: 75 64 65 29 20 66 69 72 73 74 2c 20 74 68 65 6e  ude) first, then
0fe0: 20 59 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20   Y */.};../*.** 
0ff0: 53 74 61 74 65 20 6f 66 20 61 20 70 61 72 73 65  State of a parse
1000: 20 6f 66 20 61 20 47 65 6f 4a 53 4f 4e 20 69 6e   of a GeoJSON in
1010: 70 75 74 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  put..*/.typedef 
1020: 73 74 72 75 63 74 20 47 65 6f 50 61 72 73 65 20  struct GeoParse 
1030: 47 65 6f 50 61 72 73 65 3b 0a 73 74 72 75 63 74  GeoParse;.struct
1040: 20 47 65 6f 50 61 72 73 65 20 7b 0a 20 20 63 6f   GeoParse {.  co
1050: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1060: 72 20 2a 7a 3b 20 20 20 2f 2a 20 55 6e 70 61 72  r *z;   /* Unpar
1070: 73 65 64 20 69 6e 70 75 74 20 2a 2f 0a 20 20 69  sed input */.  i
1080: 6e 74 20 6e 56 65 72 74 65 78 3b 20 20 20 20 20  nt nVertex;     
1090: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
10a0: 65 72 20 6f 66 20 76 65 72 74 65 78 65 73 20 69  er of vertexes i
10b0: 6e 20 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  n a[] */.  int n
10c0: 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 20  Alloc;          
10d0: 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61 6c       /* Space al
10e0: 6c 6f 63 61 74 65 64 20 74 6f 20 61 5b 5d 20 2a  located to a[] *
10f0: 2f 0a 20 20 69 6e 74 20 6e 45 72 72 3b 20 20 20  /.  int nErr;   
1100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1110: 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   Number of error
1120: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f  s encountered */
1130: 0a 20 20 47 65 6f 43 6f 6f 72 64 20 2a 61 3b 20  .  GeoCoord *a; 
1140: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
1150: 79 20 6f 66 20 76 65 72 74 65 78 65 73 2e 20 20  y of vertexes.  
1160: 46 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  From sqlite3_mal
1170: 6c 6f 63 36 34 28 29 20 2a 2f 0a 7d 3b 0a 0a 2f  loc64() */.};../
1180: 2a 20 44 6f 20 61 20 34 2d 62 79 74 65 20 62 79  * Do a 4-byte by
1190: 74 65 20 73 77 61 70 20 2a 2f 0a 73 74 61 74 69  te swap */.stati
11a0: 63 20 76 6f 69 64 20 67 65 6f 70 6f 6c 79 53 77  c void geopolySw
11b0: 61 62 33 32 28 75 6e 73 69 67 6e 65 64 20 63 68  ab32(unsigned ch
11c0: 61 72 20 2a 61 29 7b 0a 20 20 75 6e 73 69 67 6e  ar *a){.  unsign
11d0: 65 64 20 63 68 61 72 20 74 20 3d 20 61 5b 30 5d  ed char t = a[0]
11e0: 3b 0a 20 20 61 5b 30 5d 20 3d 20 61 5b 33 5d 3b  ;.  a[0] = a[3];
11f0: 0a 20 20 61 5b 33 5d 20 3d 20 74 3b 0a 20 20 74  .  a[3] = t;.  t
1200: 20 3d 20 61 5b 31 5d 3b 0a 20 20 61 5b 31 5d 20   = a[1];.  a[1] 
1210: 3d 20 61 5b 32 5d 3b 0a 20 20 61 5b 32 5d 20 3d  = a[2];.  a[2] =
1220: 20 74 3b 0a 7d 0a 0a 2f 2a 20 53 6b 69 70 20 77   t;.}../* Skip w
1230: 68 69 74 65 73 70 61 63 65 2e 20 20 52 65 74 75  hitespace.  Retu
1240: 72 6e 20 74 68 65 20 6e 65 78 74 20 6e 6f 6e 2d  rn the next non-
1250: 77 68 69 74 65 73 70 61 63 65 20 63 68 61 72 61  whitespace chara
1260: 63 74 65 72 2e 20 2a 2f 0a 73 74 61 74 69 63 20  cter. */.static 
1270: 63 68 61 72 20 67 65 6f 70 6f 6c 79 53 6b 69 70  char geopolySkip
1280: 53 70 61 63 65 28 47 65 6f 50 61 72 73 65 20 2a  Space(GeoParse *
1290: 70 29 7b 0a 20 20 77 68 69 6c 65 28 20 73 61 66  p){.  while( saf
12a0: 65 5f 69 73 73 70 61 63 65 28 70 2d 3e 7a 5b 30  e_isspace(p->z[0
12b0: 5d 29 20 29 20 70 2d 3e 7a 2b 2b 3b 0a 20 20 72  ]) ) p->z++;.  r
12c0: 65 74 75 72 6e 20 70 2d 3e 7a 5b 30 5d 3b 0a 7d  eturn p->z[0];.}
12d0: 0a 0a 2f 2a 20 50 61 72 73 65 20 6f 75 74 20 61  ../* Parse out a
12e0: 20 6e 75 6d 62 65 72 2e 20 20 57 72 69 74 65 20   number.  Write 
12f0: 74 68 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a  the value into *
1300: 70 56 61 6c 20 69 66 20 70 56 61 6c 21 3d 30 2e  pVal if pVal!=0.
1310: 0a 2a 2a 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a  .** return non-z
1320: 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 20 61  ero on success a
1330: 6e 64 20 7a 65 72 6f 20 69 66 20 74 68 65 20 6e  nd zero if the n
1340: 65 78 74 20 74 6f 6b 65 6e 20 69 73 20 6e 6f 74  ext token is not
1350: 20 61 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74   a number..*/.st
1360: 61 74 69 63 20 69 6e 74 20 67 65 6f 70 6f 6c 79  atic int geopoly
1370: 50 61 72 73 65 4e 75 6d 62 65 72 28 47 65 6f 50  ParseNumber(GeoP
1380: 61 72 73 65 20 2a 70 2c 20 47 65 6f 43 6f 6f 72  arse *p, GeoCoor
1390: 64 20 2a 70 56 61 6c 29 7b 0a 20 20 63 68 61 72  d *pVal){.  char
13a0: 20 63 20 3d 20 67 65 6f 70 6f 6c 79 53 6b 69 70   c = geopolySkip
13b0: 53 70 61 63 65 28 70 29 3b 0a 20 20 63 6f 6e 73  Space(p);.  cons
13c0: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
13d0: 2a 7a 20 3d 20 70 2d 3e 7a 3b 0a 20 20 69 6e 74  *z = p->z;.  int
13e0: 20 6a 20 3d 20 30 3b 0a 20 20 69 6e 74 20 73 65   j = 0;.  int se
13f0: 65 6e 44 50 20 3d 20 30 3b 0a 20 20 69 6e 74 20  enDP = 0;.  int 
1400: 73 65 65 6e 45 20 3d 20 30 3b 0a 20 20 69 66 28  seenE = 0;.  if(
1410: 20 63 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 6a   c=='-' ){.    j
1420: 20 3d 20 31 3b 0a 20 20 20 20 63 20 3d 20 7a 5b   = 1;.    c = z[
1430: 6a 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 3d  j];.  }.  if( c=
1440: 3d 27 30 27 20 26 26 20 7a 5b 6a 2b 31 5d 3e 3d  ='0' && z[j+1]>=
1450: 27 30 27 20 26 26 20 7a 5b 6a 2b 31 5d 3c 3d 27  '0' && z[j+1]<='
1460: 39 27 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  9' ) return 0;. 
1470: 20 66 6f 72 28 3b 3b 20 6a 2b 2b 29 7b 0a 20 20   for(;; j++){.  
1480: 20 20 63 20 3d 20 7a 5b 6a 5d 3b 0a 20 20 20 20    c = z[j];.    
1490: 69 66 28 20 73 61 66 65 5f 69 73 64 69 67 69 74  if( safe_isdigit
14a0: 28 63 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  (c) ) continue;.
14b0: 20 20 20 20 69 66 28 20 63 3d 3d 27 2e 27 20 29      if( c=='.' )
14c0: 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 6a 2d  {.      if( z[j-
14d0: 31 5d 3d 3d 27 2d 27 20 29 20 72 65 74 75 72 6e  1]=='-' ) return
14e0: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65   0;.      if( se
14f0: 65 6e 44 50 20 29 20 72 65 74 75 72 6e 20 30 3b  enDP ) return 0;
1500: 0a 20 20 20 20 20 20 73 65 65 6e 44 50 20 3d 20  .      seenDP = 
1510: 31 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  1;.      continu
1520: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
1530: 20 63 3d 3d 27 65 27 20 7c 7c 20 63 3d 3d 27 45   c=='e' || c=='E
1540: 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a  ' ){.      if( z
1550: 5b 6a 2d 31 5d 3c 27 30 27 20 29 20 72 65 74 75  [j-1]<'0' ) retu
1560: 72 6e 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20  rn 0;.      if( 
1570: 73 65 65 6e 45 20 29 20 72 65 74 75 72 6e 20 2d  seenE ) return -
1580: 31 3b 0a 20 20 20 20 20 20 73 65 65 6e 44 50 20  1;.      seenDP 
1590: 3d 20 73 65 65 6e 45 20 3d 20 31 3b 0a 20 20 20  = seenE = 1;.   
15a0: 20 20 20 63 20 3d 20 7a 5b 6a 2b 31 5d 3b 0a 20     c = z[j+1];. 
15b0: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 2b 27 20       if( c=='+' 
15c0: 7c 7c 20 63 3d 3d 27 2d 27 20 29 7b 0a 20 20 20  || c=='-' ){.   
15d0: 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20       j++;.      
15e0: 20 20 63 20 3d 20 7a 5b 6a 2b 31 5d 3b 0a 20 20    c = z[j+1];.  
15f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1600: 63 3c 27 30 27 20 7c 7c 20 63 3e 27 39 27 20 29  c<'0' || c>'9' )
1610: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
1620: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
1630: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
1640: 20 20 69 66 28 20 7a 5b 6a 2d 31 5d 3c 27 30 27    if( z[j-1]<'0'
1650: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
1660: 66 28 20 70 56 61 6c 20 29 7b 0a 23 69 66 64 65  f( pVal ){.#ifde
1670: 66 20 53 51 4c 49 54 45 5f 41 4d 41 4c 47 41 4d  f SQLITE_AMALGAM
1680: 41 54 49 4f 4e 0a 20 20 20 20 20 2f 2a 20 54 68  ATION.     /* Th
1690: 65 20 73 71 6c 69 74 65 33 41 74 6f 46 28 29 20  e sqlite3AtoF() 
16a0: 72 6f 75 74 69 6e 65 20 69 73 20 6d 75 63 68 20  routine is much 
16b0: 6d 75 63 68 20 66 61 73 74 65 72 20 74 68 61 6e  much faster than
16c0: 20 61 74 6f 66 28 29 2c 20 69 66 20 69 74 0a 20   atof(), if it. 
16d0: 20 20 20 20 2a 2a 20 69 73 20 61 76 61 69 6c 61      ** is availa
16e0: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 64 6f 75 62  ble */.     doub
16f0: 6c 65 20 72 3b 0a 20 20 20 20 20 28 76 6f 69 64  le r;.     (void
1700: 29 73 71 6c 69 74 65 33 41 74 6f 46 28 28 63 6f  )sqlite3AtoF((co
1710: 6e 73 74 20 63 68 61 72 2a 29 70 2d 3e 7a 2c 20  nst char*)p->z, 
1720: 26 72 2c 20 6a 2c 20 53 51 4c 49 54 45 5f 55 54  &r, j, SQLITE_UT
1730: 46 38 29 3b 0a 20 20 20 20 20 2a 70 56 61 6c 20  F8);.     *pVal 
1740: 3d 20 72 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  = r;.#else.     
1750: 2a 70 56 61 6c 20 3d 20 28 47 65 6f 43 6f 6f 72  *pVal = (GeoCoor
1760: 64 29 61 74 6f 66 28 28 63 6f 6e 73 74 20 63 68  d)atof((const ch
1770: 61 72 2a 29 70 2d 3e 7a 29 3b 0a 23 65 6e 64 69  ar*)p->z);.#endi
1780: 66 0a 20 20 7d 0a 20 20 70 2d 3e 7a 20 2b 3d 20  f.  }.  p->z += 
1790: 6a 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  j;.  return 1;.}
17a0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ../*.** If the i
17b0: 6e 70 75 74 20 69 73 20 61 20 77 65 6c 6c 2d 66  nput is a well-f
17c0: 6f 72 6d 65 64 20 4a 53 4f 4e 20 61 72 72 61 79  ormed JSON array
17d0: 20 6f 66 20 63 6f 6f 72 64 69 6e 61 74 65 73 20   of coordinates 
17e0: 77 69 74 68 20 61 74 20 6c 65 61 73 74 0a 2a 2a  with at least.**
17f0: 20 66 6f 75 72 20 63 6f 6f 72 64 69 6e 61 74 65   four coordinate
1800: 73 20 61 6e 64 20 77 68 65 72 65 20 65 61 63 68  s and where each
1810: 20 63 6f 6f 72 64 69 6e 61 74 65 20 69 73 20 69   coordinate is i
1820: 74 73 65 6c 66 20 61 20 74 77 6f 2d 76 61 6c 75  tself a two-valu
1830: 65 20 61 72 72 61 79 2c 0a 2a 2a 20 74 68 65 6e  e array,.** then
1840: 20 63 6f 6e 76 65 72 74 20 74 68 65 20 4a 53 4f   convert the JSO
1850: 4e 20 69 6e 74 6f 20 61 20 47 65 6f 50 6f 6c 79  N into a GeoPoly
1860: 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75   object and retu
1870: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a  rn a pointer to.
1880: 2a 2a 20 74 68 61 74 20 6f 62 6a 65 63 74 2e 0a  ** that object..
1890: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 65 72 72  **.** If any err
18a0: 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
18b0: 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69  n NULL..*/.stati
18c0: 63 20 47 65 6f 50 6f 6c 79 20 2a 67 65 6f 70 6f  c GeoPoly *geopo
18d0: 6c 79 50 61 72 73 65 4a 73 6f 6e 28 63 6f 6e 73  lyParseJson(cons
18e0: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
18f0: 2a 7a 2c 20 69 6e 74 20 2a 70 52 63 29 7b 0a 20  *z, int *pRc){. 
1900: 20 47 65 6f 50 61 72 73 65 20 73 3b 0a 20 20 69   GeoParse s;.  i
1910: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1920: 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 2c 20  K;.  memset(&s, 
1930: 30 2c 20 73 69 7a 65 6f 66 28 73 29 29 3b 0a 20  0, sizeof(s));. 
1940: 20 73 2e 7a 20 3d 20 7a 3b 0a 20 20 69 66 28 20   s.z = z;.  if( 
1950: 67 65 6f 70 6f 6c 79 53 6b 69 70 53 70 61 63 65  geopolySkipSpace
1960: 28 26 73 29 3d 3d 27 5b 27 20 29 7b 0a 20 20 20  (&s)=='[' ){.   
1970: 20 73 2e 7a 2b 2b 3b 0a 20 20 20 20 77 68 69 6c   s.z++;.    whil
1980: 65 28 20 67 65 6f 70 6f 6c 79 53 6b 69 70 53 70  e( geopolySkipSp
1990: 61 63 65 28 26 73 29 3d 3d 27 5b 27 20 29 7b 0a  ace(&s)=='[' ){.
19a0: 20 20 20 20 20 20 69 6e 74 20 69 69 20 3d 20 30        int ii = 0
19b0: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 63 3b 0a  ;.      char c;.
19c0: 20 20 20 20 20 20 73 2e 7a 2b 2b 3b 0a 20 20 20        s.z++;.   
19d0: 20 20 20 69 66 28 20 73 2e 6e 56 65 72 74 65 78     if( s.nVertex
19e0: 3e 3d 73 2e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20  >=s.nAlloc ){.  
19f0: 20 20 20 20 20 20 47 65 6f 43 6f 6f 72 64 20 2a        GeoCoord *
1a00: 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 73 2e  aNew;.        s.
1a10: 6e 41 6c 6c 6f 63 20 3d 20 73 2e 6e 41 6c 6c 6f  nAlloc = s.nAllo
1a20: 63 2a 32 20 2b 20 31 36 3b 0a 20 20 20 20 20 20  c*2 + 16;.      
1a30: 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    aNew = sqlite3
1a40: 5f 72 65 61 6c 6c 6f 63 36 34 28 73 2e 61 2c 20  _realloc64(s.a, 
1a50: 73 2e 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28  s.nAlloc*sizeof(
1a60: 47 65 6f 43 6f 6f 72 64 29 2a 32 20 29 3b 0a 20  GeoCoord)*2 );. 
1a70: 20 20 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d         if( aNew=
1a80: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1a90: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1aa0: 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 73 2e 6e  M;.          s.n
1ab0: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Err++;.         
1ac0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1ad0: 7d 0a 20 20 20 20 20 20 20 20 73 2e 61 20 3d 20  }.        s.a = 
1ae0: 61 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20  aNew;.      }.  
1af0: 20 20 20 20 77 68 69 6c 65 28 20 67 65 6f 70 6f      while( geopo
1b00: 6c 79 50 61 72 73 65 4e 75 6d 62 65 72 28 26 73  lyParseNumber(&s
1b10: 2c 20 69 69 3c 3d 31 20 3f 20 26 73 2e 61 5b 73  , ii<=1 ? &s.a[s
1b20: 2e 6e 56 65 72 74 65 78 2a 32 2b 69 69 5d 20 3a  .nVertex*2+ii] :
1b30: 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69   0) ){.        i
1b40: 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  i++;.        if(
1b50: 20 69 69 3d 3d 32 20 29 20 73 2e 6e 56 65 72 74   ii==2 ) s.nVert
1b60: 65 78 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63 20  ex++;.        c 
1b70: 3d 20 67 65 6f 70 6f 6c 79 53 6b 69 70 53 70 61  = geopolySkipSpa
1b80: 63 65 28 26 73 29 3b 0a 20 20 20 20 20 20 20 20  ce(&s);.        
1b90: 73 2e 7a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69  s.z++;.        i
1ba0: 66 28 20 63 3d 3d 27 2c 27 20 29 20 63 6f 6e 74  f( c==',' ) cont
1bb0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
1bc0: 28 20 63 3d 3d 27 5d 27 20 26 26 20 69 69 3e 3d  ( c==']' && ii>=
1bd0: 32 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  2 ) break;.     
1be0: 20 20 20 73 2e 6e 45 72 72 2b 2b 3b 0a 20 20 20     s.nErr++;.   
1bf0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1c00: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
1c10: 67 6f 74 6f 20 70 61 72 73 65 5f 6a 73 6f 6e 5f  goto parse_json_
1c20: 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  err;.      }.   
1c30: 20 20 20 69 66 28 20 67 65 6f 70 6f 6c 79 53 6b     if( geopolySk
1c40: 69 70 53 70 61 63 65 28 26 73 29 3d 3d 27 2c 27  ipSpace(&s)==','
1c50: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 2e 7a 2b   ){.        s.z+
1c60: 2b 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  +;.        conti
1c70: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
1c80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1c90: 20 20 20 20 69 66 28 20 67 65 6f 70 6f 6c 79 53      if( geopolyS
1ca0: 6b 69 70 53 70 61 63 65 28 26 73 29 3d 3d 27 5d  kipSpace(&s)==']
1cb0: 27 0a 20 20 20 20 20 26 26 20 73 2e 6e 56 65 72  '.     && s.nVer
1cc0: 74 65 78 3e 3d 34 0a 20 20 20 20 20 26 26 20 73  tex>=4.     && s
1cd0: 2e 61 5b 30 5d 3d 3d 73 2e 61 5b 73 2e 6e 56 65  .a[0]==s.a[s.nVe
1ce0: 72 74 65 78 2a 32 2d 32 5d 0a 20 20 20 20 20 26  rtex*2-2].     &
1cf0: 26 20 73 2e 61 5b 31 5d 3d 3d 73 2e 61 5b 73 2e  & s.a[1]==s.a[s.
1d00: 6e 56 65 72 74 65 78 2a 32 2d 31 5d 0a 20 20 20  nVertex*2-1].   
1d10: 20 20 26 26 20 28 73 2e 7a 2b 2b 2c 20 67 65 6f    && (s.z++, geo
1d20: 70 6f 6c 79 53 6b 69 70 53 70 61 63 65 28 26 73  polySkipSpace(&s
1d30: 29 3d 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20  )==0).    ){.   
1d40: 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20     int nByte;.  
1d50: 20 20 20 20 47 65 6f 50 6f 6c 79 20 2a 70 4f 75      GeoPoly *pOu
1d60: 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d  t;.      int x =
1d70: 20 31 3b 0a 20 20 20 20 20 20 73 2e 6e 56 65 72   1;.      s.nVer
1d80: 74 65 78 2d 2d 3b 20 20 2f 2a 20 52 65 6d 6f 76  tex--;  /* Remov
1d90: 65 20 74 68 65 20 72 65 64 75 6e 64 61 6e 74 20  e the redundant 
1da0: 76 65 72 74 65 78 20 61 74 20 74 68 65 20 65 6e  vertex at the en
1db0: 64 20 2a 2f 0a 20 20 20 20 20 20 6e 42 79 74 65  d */.      nByte
1dc0: 20 3d 20 73 69 7a 65 6f 66 28 47 65 6f 50 6f 6c   = sizeof(GeoPol
1dd0: 79 29 20 2a 20 73 2e 6e 56 65 72 74 65 78 2a 32  y) * s.nVertex*2
1de0: 2a 73 69 7a 65 6f 66 28 47 65 6f 43 6f 6f 72 64  *sizeof(GeoCoord
1df0: 29 3b 0a 20 20 20 20 20 20 70 4f 75 74 20 3d 20  );.      pOut = 
1e00: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
1e10: 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 20 20 20  ( nByte );.     
1e20: 20 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66   x = 1;.      if
1e30: 28 20 70 4f 75 74 3d 3d 30 20 29 20 67 6f 74 6f  ( pOut==0 ) goto
1e40: 20 70 61 72 73 65 5f 6a 73 6f 6e 5f 65 72 72 3b   parse_json_err;
1e50: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 6e 56 65  .      pOut->nVe
1e60: 72 74 65 78 20 3d 20 73 2e 6e 56 65 72 74 65 78  rtex = s.nVertex
1e70: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
1e80: 4f 75 74 2d 3e 61 2c 20 73 2e 61 2c 20 73 2e 6e  Out->a, s.a, s.n
1e90: 56 65 72 74 65 78 2a 32 2a 73 69 7a 65 6f 66 28  Vertex*2*sizeof(
1ea0: 47 65 6f 43 6f 6f 72 64 29 29 3b 0a 20 20 20 20  GeoCoord));.    
1eb0: 20 20 70 4f 75 74 2d 3e 68 64 72 5b 30 5d 20 3d    pOut->hdr[0] =
1ec0: 20 2a 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72   *(unsigned char
1ed0: 2a 29 26 78 3b 0a 20 20 20 20 20 20 70 4f 75 74  *)&x;.      pOut
1ee0: 2d 3e 68 64 72 5b 31 5d 20 3d 20 28 73 2e 6e 56  ->hdr[1] = (s.nV
1ef0: 65 72 74 65 78 3e 3e 31 36 29 26 30 78 66 66 3b  ertex>>16)&0xff;
1f00: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 68 64 72  .      pOut->hdr
1f10: 5b 32 5d 20 3d 20 28 73 2e 6e 56 65 72 74 65 78  [2] = (s.nVertex
1f20: 3e 3e 38 29 26 30 78 66 66 3b 0a 20 20 20 20 20  >>8)&0xff;.     
1f30: 20 70 4f 75 74 2d 3e 68 64 72 5b 33 5d 20 3d 20   pOut->hdr[3] = 
1f40: 73 2e 6e 56 65 72 74 65 78 26 30 78 66 66 3b 0a  s.nVertex&0xff;.
1f50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
1f60: 65 65 28 73 2e 61 29 3b 0a 20 20 20 20 20 20 69  ee(s.a);.      i
1f70: 66 28 20 70 52 63 20 29 20 2a 70 52 63 20 3d 20  f( pRc ) *pRc = 
1f80: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
1f90: 20 72 65 74 75 72 6e 20 70 4f 75 74 3b 0a 20 20   return pOut;.  
1fa0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
1fb0: 2e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72  .nErr++;.      r
1fc0: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
1fd0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 70 61 72 73  ;.    }.  }.pars
1fe0: 65 5f 6a 73 6f 6e 5f 65 72 72 3a 0a 20 20 69 66  e_json_err:.  if
1ff0: 28 20 70 52 63 20 29 20 2a 70 52 63 20 3d 20 72  ( pRc ) *pRc = r
2000: 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  c;.  sqlite3_fre
2010: 65 28 73 2e 61 29 3b 0a 20 20 72 65 74 75 72 6e  e(s.a);.  return
2020: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76   0;.}../*.** Giv
2030: 65 6e 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 61  en a function pa
2040: 72 61 6d 65 74 65 72 2c 20 74 72 79 20 74 6f 20  rameter, try to 
2050: 69 6e 74 65 72 70 72 65 74 20 69 74 20 61 73 20  interpret it as 
2060: 61 20 70 6f 6c 79 67 6f 6e 2c 20 65 69 74 68 65  a polygon, eithe
2070: 72 0a 2a 2a 20 69 6e 20 74 68 65 20 62 69 6e 61  r.** in the bina
2080: 72 79 20 66 6f 72 6d 61 74 20 6f 72 20 4a 53 4f  ry format or JSO
2090: 4e 20 74 65 78 74 2e 20 20 43 6f 6d 70 75 74 65  N text.  Compute
20a0: 20 61 20 47 65 6f 50 6f 6c 79 20 6f 62 6a 65 63   a GeoPoly objec
20b0: 74 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20  t and.** return 
20c0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 61  a pointer to tha
20d0: 74 20 6f 62 6a 65 63 74 2e 20 20 4f 72 20 69 66  t object.  Or if
20e0: 20 74 68 65 20 69 6e 70 75 74 20 69 73 20 6e 6f   the input is no
20f0: 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a  t a well-formed.
2100: 2a 2a 20 70 6f 6c 79 67 6f 6e 2c 20 70 75 74 20  ** polygon, put 
2110: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
2120: 20 69 6e 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74   in sqlite3_cont
2130: 65 78 74 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  ext and return N
2140: 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 47  ULL..*/.static G
2150: 65 6f 50 6f 6c 79 20 2a 67 65 6f 70 6f 6c 79 46  eoPoly *geopolyF
2160: 75 6e 63 50 61 72 61 6d 28 0a 20 20 73 71 6c 69  uncParam(.  sqli
2170: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
2180: 78 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65  x,      /* Conte
2190: 78 74 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73  xt for error mes
21a0: 73 61 67 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74  sages */.  sqlit
21b0: 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 2c 20  e3_value *pVal, 
21c0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61         /* The va
21d0: 6c 75 65 20 74 6f 20 64 65 63 6f 64 65 20 2a 2f  lue to decode */
21e0: 0a 20 20 69 6e 74 20 2a 70 52 63 20 20 20 20 20  .  int *pRc     
21f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2200: 2a 20 57 72 69 74 65 20 65 72 72 6f 72 20 68 65  * Write error he
2210: 72 65 20 2a 2f 0a 29 7b 0a 20 20 47 65 6f 50 6f  re */.){.  GeoPo
2220: 6c 79 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74  ly *p = 0;.  int
2230: 20 6e 42 79 74 65 3b 0a 20 20 69 66 28 20 73 71   nByte;.  if( sq
2240: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
2250: 28 70 56 61 6c 29 3d 3d 53 51 4c 49 54 45 5f 42  (pVal)==SQLITE_B
2260: 4c 4f 42 0a 20 20 20 26 26 20 28 6e 42 79 74 65  LOB.   && (nByte
2270: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
2280: 5f 62 79 74 65 73 28 70 56 61 6c 29 29 3e 3d 28  _bytes(pVal))>=(
2290: 34 2b 36 2a 73 69 7a 65 6f 66 28 47 65 6f 43 6f  4+6*sizeof(GeoCo
22a0: 6f 72 64 29 29 0a 20 20 29 7b 0a 20 20 20 20 63  ord)).  ){.    c
22b0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
22c0: 61 72 20 2a 61 20 3d 20 73 71 6c 69 74 65 33 5f  ar *a = sqlite3_
22d0: 76 61 6c 75 65 5f 62 6c 6f 62 28 70 56 61 6c 29  value_blob(pVal)
22e0: 3b 0a 20 20 20 20 69 6e 74 20 6e 56 65 72 74 65  ;.    int nVerte
22f0: 78 3b 0a 20 20 20 20 6e 56 65 72 74 65 78 20 3d  x;.    nVertex =
2300: 20 28 61 5b 31 5d 3c 3c 31 36 29 20 2b 20 28 61   (a[1]<<16) + (a
2310: 5b 32 5d 3c 3c 38 29 20 2b 20 61 5b 33 5d 3b 0a  [2]<<8) + a[3];.
2320: 20 20 20 20 69 66 28 20 28 61 5b 30 5d 3d 3d 30      if( (a[0]==0
2330: 20 7c 7c 20 61 5b 30 5d 3d 3d 31 29 0a 20 20 20   || a[0]==1).   
2340: 20 20 26 26 20 28 6e 56 65 72 74 65 78 2a 32 2a    && (nVertex*2*
2350: 73 69 7a 65 6f 66 28 47 65 6f 43 6f 6f 72 64 29  sizeof(GeoCoord)
2360: 20 2b 20 34 29 3d 3d 28 75 6e 73 69 67 6e 65 64   + 4)==(unsigned
2370: 20 69 6e 74 29 6e 42 79 74 65 0a 20 20 20 20 29   int)nByte.    )
2380: 7b 0a 20 20 20 20 20 20 70 20 3d 20 73 71 6c 69  {.      p = sqli
2390: 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69  te3_malloc64( si
23a0: 7a 65 6f 66 28 2a 70 29 20 2b 20 28 6e 56 65 72  zeof(*p) + (nVer
23b0: 74 65 78 2d 31 29 2a 32 2a 73 69 7a 65 6f 66 28  tex-1)*2*sizeof(
23c0: 47 65 6f 43 6f 6f 72 64 29 20 29 3b 0a 20 20 20  GeoCoord) );.   
23d0: 20 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20     if( p==0 ){. 
23e0: 20 20 20 20 20 20 20 69 66 28 20 70 52 63 20 29         if( pRc )
23f0: 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e   *pRc = SQLITE_N
2400: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 69 66  OMEM;.        if
2410: 28 20 70 43 74 78 20 29 20 73 71 6c 69 74 65 33  ( pCtx ) sqlite3
2420: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
2430: 6d 65 6d 28 70 43 74 78 29 3b 0a 20 20 20 20 20  mem(pCtx);.     
2440: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2450: 69 6e 74 20 78 20 3d 20 31 3b 0a 20 20 20 20 20  int x = 1;.     
2460: 20 20 20 70 2d 3e 6e 56 65 72 74 65 78 20 3d 20     p->nVertex = 
2470: 6e 56 65 72 74 65 78 3b 0a 20 20 20 20 20 20 20  nVertex;.       
2480: 20 6d 65 6d 63 70 79 28 70 2d 3e 68 64 72 2c 20   memcpy(p->hdr, 
2490: 61 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  a, nByte);.     
24a0: 20 20 20 69 66 28 20 61 5b 30 5d 20 21 3d 20 2a     if( a[0] != *
24b0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
24c0: 26 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  &x ){.          
24d0: 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20  int ii;.        
24e0: 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e    for(ii=0; ii<n
24f0: 56 65 72 74 65 78 2a 32 3b 20 69 69 2b 2b 29 7b  Vertex*2; ii++){
2500: 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 65 6f  .            geo
2510: 70 6f 6c 79 53 77 61 62 33 32 28 28 75 6e 73 69  polySwab32((unsi
2520: 67 6e 65 64 20 63 68 61 72 2a 29 26 70 2d 3e 61  gned char*)&p->a
2530: 5b 69 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  [ii]);.         
2540: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e   }.          p->
2550: 68 64 72 5b 30 5d 20 5e 3d 20 31 3b 0a 20 20 20  hdr[0] ^= 1;.   
2560: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2570: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 52 63     }.    if( pRc
2580: 20 29 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45   ) *pRc = SQLITE
2590: 5f 4f 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  _OK;.    return 
25a0: 70 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  p;.  }else if( s
25b0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
25c0: 65 28 70 56 61 6c 29 3d 3d 53 51 4c 49 54 45 5f  e(pVal)==SQLITE_
25d0: 54 45 58 54 20 29 7b 0a 20 20 20 20 63 6f 6e 73  TEXT ){.    cons
25e0: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
25f0: 2a 7a 4a 73 6f 6e 20 3d 20 73 71 6c 69 74 65 33  *zJson = sqlite3
2600: 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c  _value_text(pVal
2610: 29 3b 0a 20 20 20 20 69 66 28 20 7a 4a 73 6f 6e  );.    if( zJson
2620: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
2630: 20 70 52 63 20 29 20 2a 70 52 63 20 3d 20 53 51   pRc ) *pRc = SQ
2640: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
2650: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
2660: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 67 65 6f  }.    return geo
2670: 70 6f 6c 79 50 61 72 73 65 4a 73 6f 6e 28 7a 4a  polyParseJson(zJ
2680: 73 6f 6e 2c 20 70 52 63 29 3b 0a 20 20 7d 65 6c  son, pRc);.  }el
2690: 73 65 7b 0a 20 20 20 20 69 66 28 20 70 52 63 20  se{.    if( pRc 
26a0: 29 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f  ) *pRc = SQLITE_
26b0: 45 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72  ERROR;.    retur
26c0: 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  n 0;.  }.}../*.*
26d0: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
26e0: 20 6f 66 20 74 68 65 20 67 65 6f 70 6f 6c 79 5f   of the geopoly_
26f0: 62 6c 6f 62 28 58 29 20 66 75 6e 63 74 69 6f 6e  blob(X) function
2700: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ..**.** If the i
2710: 6e 70 75 74 20 69 73 20 61 20 77 65 6c 6c 2d 66  nput is a well-f
2720: 6f 72 6d 65 64 20 47 65 6f 70 6f 6c 79 20 42 4c  ormed Geopoly BL
2730: 4f 42 20 6f 72 20 4a 53 4f 4e 20 73 74 72 69 6e  OB or JSON strin
2740: 67 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e  g.** then return
2750: 20 74 68 65 20 42 4c 4f 42 20 72 65 70 72 65 73   the BLOB repres
2760: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
2770: 70 6f 6c 79 67 6f 6e 2e 20 20 4f 74 68 65 72 77  polygon.  Otherw
2780: 69 73 65 0a 2a 2a 20 72 65 74 75 72 6e 20 4e 55  ise.** return NU
2790: 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  LL..*/.static vo
27a0: 69 64 20 67 65 6f 70 6f 6c 79 42 6c 6f 62 46 75  id geopolyBlobFu
27b0: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
27c0: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
27d0: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
27e0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
27f0: 67 76 0a 29 7b 0a 20 20 47 65 6f 50 6f 6c 79 20  gv.){.  GeoPoly 
2800: 2a 70 20 3d 20 67 65 6f 70 6f 6c 79 46 75 6e 63  *p = geopolyFunc
2810: 50 61 72 61 6d 28 63 6f 6e 74 65 78 74 2c 20 61  Param(context, a
2820: 72 67 76 5b 30 5d 2c 20 30 29 3b 0a 20 20 69 66  rgv[0], 0);.  if
2830: 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( p ){.    sqlit
2840: 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 28 63  e3_result_blob(c
2850: 6f 6e 74 65 78 74 2c 20 70 2d 3e 68 64 72 2c 20  ontext, p->hdr, 
2860: 0a 20 20 20 20 20 20 20 34 2b 38 2a 70 2d 3e 6e  .       4+8*p->n
2870: 56 65 72 74 65 78 2c 20 53 51 4c 49 54 45 5f 54  Vertex, SQLITE_T
2880: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73  RANSIENT);.    s
2890: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
28a0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c    }.}../*.** SQL
28b0: 20 66 75 6e 63 74 69 6f 6e 3a 20 20 20 20 20 67   function:     g
28c0: 65 6f 70 6f 6c 79 5f 6a 73 6f 6e 28 58 29 0a 2a  eopoly_json(X).*
28d0: 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 58  *.** Interpret X
28e0: 20 61 73 20 61 20 70 6f 6c 79 67 6f 6e 20 61 6e   as a polygon an
28f0: 64 20 72 65 6e 64 65 72 20 69 74 20 61 73 20 61  d render it as a
2900: 20 4a 53 4f 4e 20 61 72 72 61 79 0a 2a 2a 20 6f   JSON array.** o
2910: 66 20 63 6f 6f 72 64 69 6e 61 74 65 73 2e 20 20  f coordinates.  
2920: 4f 72 2c 20 69 66 20 58 20 69 73 20 6e 6f 74 20  Or, if X is not 
2930: 61 20 76 61 6c 69 64 20 70 6f 6c 79 67 6f 6e 2c  a valid polygon,
2940: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f   return NULL..*/
2950: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6f  .static void geo
2960: 70 6f 6c 79 4a 73 6f 6e 46 75 6e 63 28 0a 20 20  polyJsonFunc(.  
2970: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
2980: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
2990: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
29a0: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
29b0: 20 20 47 65 6f 50 6f 6c 79 20 2a 70 20 3d 20 67    GeoPoly *p = g
29c0: 65 6f 70 6f 6c 79 46 75 6e 63 50 61 72 61 6d 28  eopolyFuncParam(
29d0: 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 30 5d  context, argv[0]
29e0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 20 29 7b  , 0);.  if( p ){
29f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
2a00: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65   = sqlite3_conte
2a10: 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e  xt_db_handle(con
2a20: 74 65 78 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  text);.    sqlit
2a30: 65 33 5f 73 74 72 20 2a 78 20 3d 20 73 71 6c 69  e3_str *x = sqli
2a40: 74 65 33 5f 73 74 72 5f 6e 65 77 28 64 62 29 3b  te3_str_new(db);
2a50: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
2a60: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
2a70: 6e 64 28 78 2c 20 22 5b 22 2c 20 31 29 3b 0a 20  nd(x, "[", 1);. 
2a80: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
2a90: 3e 6e 56 65 72 74 65 78 3b 20 69 2b 2b 29 7b 0a  >nVertex; i++){.
2aa0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
2ab0: 72 5f 61 70 70 65 6e 64 66 28 78 2c 20 22 5b 25  r_appendf(x, "[%
2ac0: 21 67 2c 25 21 67 5d 2c 22 2c 20 70 2d 3e 61 5b  !g,%!g],", p->a[
2ad0: 69 2a 32 5d 2c 20 70 2d 3e 61 5b 69 2a 32 2b 31  i*2], p->a[i*2+1
2ae0: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ]);.    }.    sq
2af0: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
2b00: 66 28 78 2c 20 22 5b 25 21 67 2c 25 21 67 5d 5d  f(x, "[%!g,%!g]]
2b10: 22 2c 20 70 2d 3e 61 5b 30 5d 2c 20 70 2d 3e 61  ", p->a[0], p->a
2b20: 5b 31 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  [1]);.    sqlite
2b30: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
2b40: 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 73  ntext, sqlite3_s
2b50: 74 72 5f 66 69 6e 69 73 68 28 78 29 2c 20 2d 31  tr_finish(x), -1
2b60: 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b  , sqlite3_free);
2b70: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2b80: 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  e(p);.  }.}../*.
2b90: 2a 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a  ** SQL function:
2ba0: 20 20 20 20 20 67 65 6f 70 6f 6c 79 5f 73 76 67       geopoly_svg
2bb0: 28 58 2c 20 2e 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20  (X, ....).**.** 
2bc0: 49 6e 74 65 72 70 72 65 74 20 58 20 61 73 20 61  Interpret X as a
2bd0: 20 70 6f 6c 79 67 6f 6e 20 61 6e 64 20 72 65 6e   polygon and ren
2be0: 64 65 72 20 69 74 20 61 73 20 61 20 53 56 47 20  der it as a SVG 
2bf0: 3c 70 6f 6c 79 6c 69 6e 65 3e 2e 0a 2a 2a 20 41  <polyline>..** A
2c00: 64 64 69 74 69 6f 6e 61 6c 20 61 72 67 75 6d 65  dditional argume
2c10: 6e 74 73 20 61 72 65 20 61 64 64 65 64 20 61 73  nts are added as
2c20: 20 61 74 74 72 69 62 75 74 65 73 20 74 6f 20 74   attributes to t
2c30: 68 65 20 3c 70 6f 6c 79 6c 69 6e 65 3e 2e 0a 2a  he <polyline>..*
2c40: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
2c50: 6f 70 6f 6c 79 53 76 67 46 75 6e 63 28 0a 20 20  opolySvgFunc(.  
2c60: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
2c70: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
2c80: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
2c90: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
2ca0: 20 20 47 65 6f 50 6f 6c 79 20 2a 70 20 3d 20 67    GeoPoly *p = g
2cb0: 65 6f 70 6f 6c 79 46 75 6e 63 50 61 72 61 6d 28  eopolyFuncParam(
2cc0: 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 30 5d  context, argv[0]
2cd0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 20 29 7b  , 0);.  if( p ){
2ce0: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
2cf0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65   = sqlite3_conte
2d00: 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e  xt_db_handle(con
2d10: 74 65 78 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  text);.    sqlit
2d20: 65 33 5f 73 74 72 20 2a 78 20 3d 20 73 71 6c 69  e3_str *x = sqli
2d30: 74 65 33 5f 73 74 72 5f 6e 65 77 28 64 62 29 3b  te3_str_new(db);
2d40: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
2d50: 63 68 61 72 20 63 53 65 70 20 3d 20 27 5c 27 27  char cSep = '\''
2d60: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  ;.    sqlite3_st
2d70: 72 5f 61 70 70 65 6e 64 66 28 78 2c 20 22 3c 70  r_appendf(x, "<p
2d80: 6f 6c 79 6c 69 6e 65 20 70 6f 69 6e 74 73 3d 22  olyline points="
2d90: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
2da0: 69 3c 70 2d 3e 6e 56 65 72 74 65 78 3b 20 69 2b  i<p->nVertex; i+
2db0: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
2dc0: 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 78 2c  3_str_appendf(x,
2dd0: 20 22 25 63 25 67 2c 25 67 22 2c 20 63 53 65 70   "%c%g,%g", cSep
2de0: 2c 20 70 2d 3e 61 5b 69 2a 32 5d 2c 20 70 2d 3e  , p->a[i*2], p->
2df0: 61 5b 69 2a 32 2b 31 5d 29 3b 0a 20 20 20 20 20  a[i*2+1]);.     
2e00: 20 63 53 65 70 20 3d 20 27 20 27 3b 0a 20 20 20   cSep = ' ';.   
2e10: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73   }.    sqlite3_s
2e20: 74 72 5f 61 70 70 65 6e 64 66 28 78 2c 20 22 20  tr_appendf(x, " 
2e30: 25 67 2c 25 67 27 22 2c 20 70 2d 3e 61 5b 30 5d  %g,%g'", p->a[0]
2e40: 2c 20 70 2d 3e 61 5b 31 5d 29 3b 0a 20 20 20 20  , p->a[1]);.    
2e50: 66 6f 72 28 69 3d 31 3b 20 69 3c 61 72 67 63 3b  for(i=1; i<argc;
2e60: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e   i++){.      con
2e70: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f  st char *z = (co
2e80: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
2e90: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
2ea0: 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  v[i]);.      if(
2eb0: 20 7a 20 26 26 20 7a 5b 30 5d 20 29 7b 0a 20 20   z && z[0] ){.  
2ec0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
2ed0: 72 5f 61 70 70 65 6e 64 66 28 78 2c 20 22 20 25  r_appendf(x, " %
2ee0: 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 7d 0a  s", z);.      }.
2ef0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2f00: 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 78 2c  3_str_appendf(x,
2f10: 20 22 3e 3c 2f 70 6f 6c 79 6c 69 6e 65 3e 22 29   "></polyline>")
2f20: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  ;.    sqlite3_re
2f30: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
2f40: 74 2c 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 66  t, sqlite3_str_f
2f50: 69 6e 69 73 68 28 78 29 2c 20 2d 31 2c 20 73 71  inish(x), -1, sq
2f60: 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 20  lite3_free);.   
2f70: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
2f80: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ;.  }.}../*.** S
2f90: 51 4c 20 46 75 6e 63 74 69 6f 6e 3a 20 20 20 20  QL Function:    
2fa0: 20 20 67 65 6f 70 6f 6c 79 5f 78 66 6f 72 6d 28    geopoly_xform(
2fb0: 70 6f 6c 79 2c 20 41 2c 20 42 2c 20 43 2c 20 44  poly, A, B, C, D
2fc0: 2c 20 45 2c 20 46 29 0a 2a 2a 0a 2a 2a 20 54 72  , E, F).**.** Tr
2fd0: 61 6e 73 66 6f 72 6d 20 61 6e 64 2f 6f 72 20 74  ansform and/or t
2fe0: 72 61 6e 73 6c 61 74 65 20 61 20 70 6f 6c 79 67  ranslate a polyg
2ff0: 6f 6e 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  on as follows:.*
3000: 2a 0a 2a 2a 20 20 20 20 20 20 78 31 20 3d 20 41  *.**      x1 = A
3010: 2a 78 30 20 2b 20 42 2a 79 30 20 2b 20 45 0a 2a  *x0 + B*y0 + E.*
3020: 2a 20 20 20 20 20 20 79 31 20 3d 20 43 2a 78 30  *      y1 = C*x0
3030: 20 2b 20 44 2a 79 30 20 2b 20 46 0a 2a 2a 0a 2a   + D*y0 + F.**.*
3040: 2a 20 46 6f 72 20 61 20 74 72 61 6e 73 6c 61 74  * For a translat
3050: 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ion:.**.**      
3060: 67 65 6f 70 6f 6c 79 5f 78 66 6f 72 6d 28 70 6f  geopoly_xform(po
3070: 6c 79 2c 20 31 2c 20 30 2c 20 30 2c 20 31 2c 20  ly, 1, 0, 0, 1, 
3080: 78 2d 6f 66 66 73 65 74 2c 20 79 2d 6f 66 66 73  x-offset, y-offs
3090: 65 74 29 0a 2a 2a 0a 2a 2a 20 52 6f 74 61 74 65  et).**.** Rotate
30a0: 20 62 79 20 52 20 61 72 6f 75 6e 64 20 74 68 65   by R around the
30b0: 20 70 6f 69 6e 74 20 28 30 2c 30 29 3a 0a 2a 2a   point (0,0):.**
30c0: 0a 2a 2a 20 20 20 20 20 20 67 65 6f 70 6f 6c 79  .**      geopoly
30d0: 5f 78 66 6f 72 6d 28 70 6f 6c 79 2c 20 63 6f 73  _xform(poly, cos
30e0: 28 52 29 2c 20 73 69 6e 28 52 29 2c 20 2d 73 69  (R), sin(R), -si
30f0: 6e 28 52 29 2c 20 63 6f 73 28 52 29 2c 20 30 2c  n(R), cos(R), 0,
3100: 20 30 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f   0).*/.static vo
3110: 69 64 20 67 65 6f 70 6f 6c 79 58 66 6f 72 6d 46  id geopolyXformF
3120: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
3130: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
3140: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
3150: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
3160: 72 67 76 0a 29 7b 0a 20 20 47 65 6f 50 6f 6c 79  rgv.){.  GeoPoly
3170: 20 2a 70 20 3d 20 67 65 6f 70 6f 6c 79 46 75 6e   *p = geopolyFun
3180: 63 50 61 72 61 6d 28 63 6f 6e 74 65 78 74 2c 20  cParam(context, 
3190: 61 72 67 76 5b 30 5d 2c 20 30 29 3b 0a 20 20 64  argv[0], 0);.  d
31a0: 6f 75 62 6c 65 20 41 20 3d 20 73 71 6c 69 74 65  ouble A = sqlite
31b0: 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61  3_value_double(a
31c0: 72 67 76 5b 31 5d 29 3b 0a 20 20 64 6f 75 62 6c  rgv[1]);.  doubl
31d0: 65 20 42 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  e B = sqlite3_va
31e0: 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b  lue_double(argv[
31f0: 32 5d 29 3b 0a 20 20 64 6f 75 62 6c 65 20 43 20  2]);.  double C 
3200: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
3210: 64 6f 75 62 6c 65 28 61 72 67 76 5b 33 5d 29 3b  double(argv[3]);
3220: 0a 20 20 64 6f 75 62 6c 65 20 44 20 3d 20 73 71  .  double D = sq
3230: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62  lite3_value_doub
3240: 6c 65 28 61 72 67 76 5b 34 5d 29 3b 0a 20 20 64  le(argv[4]);.  d
3250: 6f 75 62 6c 65 20 45 20 3d 20 73 71 6c 69 74 65  ouble E = sqlite
3260: 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61  3_value_double(a
3270: 72 67 76 5b 35 5d 29 3b 0a 20 20 64 6f 75 62 6c  rgv[5]);.  doubl
3280: 65 20 46 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  e F = sqlite3_va
3290: 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b  lue_double(argv[
32a0: 36 5d 29 3b 0a 20 20 47 65 6f 43 6f 6f 72 64 20  6]);.  GeoCoord 
32b0: 78 31 2c 20 79 31 2c 20 78 30 2c 20 79 30 3b 0a  x1, y1, x0, y0;.
32c0: 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 66 28 20    int ii;.  if( 
32d0: 70 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 69 3d  p ){.    for(ii=
32e0: 30 3b 20 69 69 3c 70 2d 3e 6e 56 65 72 74 65 78  0; ii<p->nVertex
32f0: 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 78  ; ii++){.      x
3300: 30 20 3d 20 70 2d 3e 61 5b 69 69 2a 32 5d 3b 0a  0 = p->a[ii*2];.
3310: 20 20 20 20 20 20 79 30 20 3d 20 70 2d 3e 61 5b        y0 = p->a[
3320: 69 69 2a 32 2b 31 5d 3b 0a 20 20 20 20 20 20 78  ii*2+1];.      x
3330: 31 20 3d 20 28 47 65 6f 43 6f 6f 72 64 29 28 41  1 = (GeoCoord)(A
3340: 2a 78 30 20 2b 20 42 2a 79 30 20 2b 20 45 29 3b  *x0 + B*y0 + E);
3350: 0a 20 20 20 20 20 20 79 31 20 3d 20 28 47 65 6f  .      y1 = (Geo
3360: 43 6f 6f 72 64 29 28 43 2a 78 30 20 2b 20 44 2a  Coord)(C*x0 + D*
3370: 79 30 20 2b 20 46 29 3b 0a 20 20 20 20 20 20 70  y0 + F);.      p
3380: 2d 3e 61 5b 69 69 2a 32 5d 20 3d 20 78 31 3b 0a  ->a[ii*2] = x1;.
3390: 20 20 20 20 20 20 70 2d 3e 61 5b 69 69 2a 32 2b        p->a[ii*2+
33a0: 31 5d 20 3d 20 79 31 3b 0a 20 20 20 20 7d 0a 20  1] = y1;.    }. 
33b0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
33c0: 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20  t_blob(context, 
33d0: 70 2d 3e 68 64 72 2c 20 0a 20 20 20 20 20 20 20  p->hdr, .       
33e0: 34 2b 38 2a 70 2d 3e 6e 56 65 72 74 65 78 2c 20  4+8*p->nVertex, 
33f0: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
3400: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
3410: 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ree(p);.  }.}../
3420: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
3430: 69 6f 6e 20 6f 66 20 74 68 65 20 67 65 6f 70 6f  ion of the geopo
3440: 6c 79 5f 61 72 65 61 28 58 29 20 66 75 6e 63 74  ly_area(X) funct
3450: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ion..**.** If th
3460: 65 20 69 6e 70 75 74 20 69 73 20 61 20 77 65 6c  e input is a wel
3470: 6c 2d 66 6f 72 6d 65 64 20 47 65 6f 70 6f 6c 79  l-formed Geopoly
3480: 20 42 4c 4f 42 20 74 68 65 6e 20 72 65 74 75 72   BLOB then retur
3490: 6e 20 74 68 65 20 61 72 65 61 0a 2a 2a 20 65 6e  n the area.** en
34a0: 63 6c 6f 73 65 64 20 62 79 20 74 68 65 20 70 6f  closed by the po
34b0: 6c 79 67 6f 6e 2e 20 20 49 66 20 74 68 65 20 70  lygon.  If the p
34c0: 6f 6c 79 67 6f 6e 20 63 69 72 63 75 6c 61 74 65  olygon circulate
34d0: 73 20 63 6c 6f 63 6b 77 69 73 65 20 69 6e 73 74  s clockwise inst
34e0: 65 61 64 0a 2a 2a 20 6f 66 20 63 6f 75 6e 74 65  ead.** of counte
34f0: 72 63 6c 6f 63 6b 77 69 73 65 20 28 61 73 20 69  rclockwise (as i
3500: 74 20 73 68 6f 75 6c 64 29 20 74 68 65 6e 20 72  t should) then r
3510: 65 74 75 72 6e 20 74 68 65 20 6e 65 67 61 74 69  eturn the negati
3520: 76 65 20 6f 66 20 74 68 65 0a 2a 2a 20 65 6e 63  ve of the.** enc
3530: 6c 6f 73 65 64 20 61 72 65 61 2e 20 20 4f 74 68  losed area.  Oth
3540: 65 72 77 69 73 65 20 72 65 74 75 72 6e 20 4e 55  erwise return NU
3550: 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  LL..*/.static vo
3560: 69 64 20 67 65 6f 70 6f 6c 79 41 72 65 61 46 75  id geopolyAreaFu
3570: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
3580: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
3590: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
35a0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
35b0: 67 76 0a 29 7b 0a 20 20 47 65 6f 50 6f 6c 79 20  gv.){.  GeoPoly 
35c0: 2a 70 20 3d 20 67 65 6f 70 6f 6c 79 46 75 6e 63  *p = geopolyFunc
35d0: 50 61 72 61 6d 28 63 6f 6e 74 65 78 74 2c 20 61  Param(context, a
35e0: 72 67 76 5b 30 5d 2c 20 30 29 3b 0a 20 20 69 66  rgv[0], 0);.  if
35f0: 28 20 70 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c  ( p ){.    doubl
3600: 65 20 72 41 72 65 61 20 3d 20 30 2e 30 3b 0a 20  e rArea = 0.0;. 
3610: 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 66     int ii;.    f
3620: 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 6e  or(ii=0; ii<p->n
3630: 56 65 72 74 65 78 2d 31 3b 20 69 69 2b 2b 29 7b  Vertex-1; ii++){
3640: 0a 20 20 20 20 20 20 72 41 72 65 61 20 2b 3d 20  .      rArea += 
3650: 28 70 2d 3e 61 5b 69 69 2a 32 5d 20 2d 20 70 2d  (p->a[ii*2] - p-
3660: 3e 61 5b 69 69 2a 32 2b 32 5d 29 20 20 20 20 20  >a[ii*2+2])     
3670: 20 20 20 20 20 20 2f 2a 20 28 78 30 20 2d 20 78        /* (x0 - x
3680: 31 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  1) */.          
3690: 20 20 20 20 20 20 2a 20 28 70 2d 3e 61 5b 69 69        * (p->a[ii
36a0: 2a 32 2b 31 5d 20 2b 20 70 2d 3e 61 5b 69 69 2a  *2+1] + p->a[ii*
36b0: 32 2b 33 5d 29 20 20 20 20 20 20 2f 2a 20 28 79  2+3])      /* (y
36c0: 30 20 2b 20 79 31 29 20 2a 2f 0a 20 20 20 20 20  0 + y1) */.     
36d0: 20 20 20 20 20 20 20 20 20 20 20 2a 20 30 2e 35             * 0.5
36e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 41 72 65  ;.    }.    rAre
36f0: 61 20 2b 3d 20 28 70 2d 3e 61 5b 69 69 2a 32 5d  a += (p->a[ii*2]
3700: 20 2d 20 70 2d 3e 61 5b 30 5d 29 20 20 20 20 20   - p->a[0])     
3710: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3720: 28 78 4e 20 2d 20 78 30 29 20 2a 2f 0a 20 20 20  (xN - x0) */.   
3730: 20 20 20 20 20 20 20 20 20 20 2a 20 28 70 2d 3e            * (p->
3740: 61 5b 69 69 2a 32 2b 31 5d 20 2b 20 70 2d 3e 61  a[ii*2+1] + p->a
3750: 5b 31 5d 29 20 20 20 20 20 20 20 20 20 20 20 20  [1])            
3760: 20 20 2f 2a 20 28 79 4e 20 2b 20 79 30 29 20 2a    /* (yN + y0) *
3770: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  /.             *
3780: 20 30 2e 35 3b 0a 20 20 20 20 73 71 6c 69 74 65   0.5;.    sqlite
3790: 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28  3_result_double(
37a0: 63 6f 6e 74 65 78 74 2c 20 72 41 72 65 61 29 3b  context, rArea);
37b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
37c0: 65 28 70 29 3b 0a 20 20 7d 20 20 20 20 20 20 20  e(p);.  }       
37d0: 20 20 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49       .}../*.** I
37e0: 66 20 70 50 6f 6c 79 20 69 73 20 61 20 70 6f 6c  f pPoly is a pol
37f0: 79 67 6f 6e 2c 20 63 6f 6d 70 75 74 65 20 69 74  ygon, compute it
3800: 73 20 62 6f 75 6e 64 69 6e 67 20 62 6f 78 2e 20  s bounding box. 
3810: 54 68 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28  Then:.**.**    (
3820: 31 29 20 69 66 20 61 43 6f 6f 72 64 21 3d 30 20  1) if aCoord!=0 
3830: 73 74 6f 72 65 20 74 68 65 20 62 6f 75 6e 64 69  store the boundi
3840: 6e 67 20 62 6f 78 20 69 6e 20 61 43 6f 6f 72 64  ng box in aCoord
3850: 2c 20 72 65 74 75 72 6e 69 6e 67 20 4e 55 4c 4c  , returning NULL
3860: 0a 2a 2a 20 20 20 20 28 32 29 20 6f 74 68 65 72  .**    (2) other
3870: 77 69 73 65 2c 20 63 6f 6d 70 75 74 65 20 61 20  wise, compute a 
3880: 47 65 6f 50 6f 6c 79 20 66 6f 72 20 74 68 65 20  GeoPoly for the 
3890: 62 6f 75 6e 64 69 6e 67 20 62 6f 78 20 61 6e 64  bounding box and
38a0: 20 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 20   return the.**  
38b0: 20 20 20 20 20 20 6e 65 77 20 47 65 6f 50 6f 6c        new GeoPol
38c0: 79 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 6f 6c 79  y.**.** If pPoly
38d0: 20 69 73 20 4e 55 4c 4c 20 62 75 74 20 61 43 6f   is NULL but aCo
38e0: 6f 72 64 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  ord is not NULL,
38f0: 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 61 20   then compute a 
3900: 6e 65 77 20 47 65 6f 50 6f 6c 79 20 66 72 6f 6d  new GeoPoly from
3910: 0a 2a 2a 20 74 68 65 20 62 6f 75 6e 64 69 6e 67  .** the bounding
3920: 20 62 6f 78 20 69 6e 20 61 43 6f 6f 72 64 20 61   box in aCoord a
3930: 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  nd return a poin
3940: 74 65 72 20 74 6f 20 74 68 61 74 20 47 65 6f 50  ter to that GeoP
3950: 6f 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 47  oly..*/.static G
3960: 65 6f 50 6f 6c 79 20 2a 67 65 6f 70 6f 6c 79 42  eoPoly *geopolyB
3970: 42 6f 78 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  Box(.  sqlite3_c
3980: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
3990: 20 20 20 2f 2a 20 46 6f 72 20 72 65 63 6f 72 64     /* For record
39a0: 69 6e 67 20 74 68 65 20 65 72 72 6f 72 20 2a 2f  ing the error */
39b0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
39c0: 20 2a 70 50 6f 6c 79 2c 20 20 20 20 20 20 20 2f   *pPoly,       /
39d0: 2a 20 54 68 65 20 70 6f 6c 79 67 6f 6e 20 2a 2f  * The polygon */
39e0: 0a 20 20 52 74 72 65 65 43 6f 6f 72 64 20 2a 61  .  RtreeCoord *a
39f0: 43 6f 6f 72 64 2c 20 20 20 20 20 20 20 20 20 2f  Coord,         /
3a00: 2a 20 52 65 73 75 6c 74 73 20 68 65 72 65 20 2a  * Results here *
3a10: 2f 0a 20 20 69 6e 74 20 2a 70 52 63 20 20 20 20  /.  int *pRc    
3a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a30: 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 68 65  /* Error code he
3a40: 72 65 20 2a 2f 0a 29 7b 0a 20 20 47 65 6f 50 6f  re */.){.  GeoPo
3a50: 6c 79 20 2a 70 4f 75 74 20 3d 20 30 3b 0a 20 20  ly *pOut = 0;.  
3a60: 47 65 6f 50 6f 6c 79 20 2a 70 3b 0a 20 20 66 6c  GeoPoly *p;.  fl
3a70: 6f 61 74 20 6d 6e 58 2c 20 6d 78 58 2c 20 6d 6e  oat mnX, mxX, mn
3a80: 59 2c 20 6d 78 59 3b 0a 20 20 69 66 28 20 70 50  Y, mxY;.  if( pP
3a90: 6f 6c 79 3d 3d 30 20 26 26 20 61 43 6f 6f 72 64  oly==0 && aCoord
3aa0: 21 3d 30 20 29 7b 0a 20 20 20 20 70 20 3d 20 30  !=0 ){.    p = 0
3ab0: 3b 0a 20 20 20 20 6d 6e 58 20 3d 20 61 43 6f 6f  ;.    mnX = aCoo
3ac0: 72 64 5b 30 5d 2e 66 3b 0a 20 20 20 20 6d 78 58  rd[0].f;.    mxX
3ad0: 20 3d 20 61 43 6f 6f 72 64 5b 31 5d 2e 66 3b 0a   = aCoord[1].f;.
3ae0: 20 20 20 20 6d 6e 59 20 3d 20 61 43 6f 6f 72 64      mnY = aCoord
3af0: 5b 32 5d 2e 66 3b 0a 20 20 20 20 6d 78 59 20 3d  [2].f;.    mxY =
3b00: 20 61 43 6f 6f 72 64 5b 33 5d 2e 66 3b 0a 20 20   aCoord[3].f;.  
3b10: 20 20 67 6f 74 6f 20 67 65 6f 70 6f 6c 79 42 62    goto geopolyBb
3b20: 6f 78 46 69 6c 6c 3b 0a 20 20 7d 65 6c 73 65 7b  oxFill;.  }else{
3b30: 0a 20 20 20 20 70 20 3d 20 67 65 6f 70 6f 6c 79  .    p = geopoly
3b40: 46 75 6e 63 50 61 72 61 6d 28 63 6f 6e 74 65 78  FuncParam(contex
3b50: 74 2c 20 70 50 6f 6c 79 2c 20 70 52 63 29 3b 0a  t, pPoly, pRc);.
3b60: 20 20 7d 0a 20 20 69 66 28 20 70 20 29 7b 0a 20    }.  if( p ){. 
3b70: 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 6d     int ii;.    m
3b80: 6e 58 20 3d 20 6d 78 58 20 3d 20 70 2d 3e 61 5b  nX = mxX = p->a[
3b90: 30 5d 3b 0a 20 20 20 20 6d 6e 59 20 3d 20 6d 78  0];.    mnY = mx
3ba0: 59 20 3d 20 70 2d 3e 61 5b 31 5d 3b 0a 20 20 20  Y = p->a[1];.   
3bb0: 20 66 6f 72 28 69 69 3d 31 3b 20 69 69 3c 70 2d   for(ii=1; ii<p-
3bc0: 3e 6e 56 65 72 74 65 78 3b 20 69 69 2b 2b 29 7b  >nVertex; ii++){
3bd0: 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 20  .      double r 
3be0: 3d 20 70 2d 3e 61 5b 69 69 2a 32 5d 3b 0a 20 20  = p->a[ii*2];.  
3bf0: 20 20 20 20 69 66 28 20 72 3c 6d 6e 58 20 29 20      if( r<mnX ) 
3c00: 6d 6e 58 20 3d 20 28 66 6c 6f 61 74 29 72 3b 0a  mnX = (float)r;.
3c10: 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 72        else if( r
3c20: 3e 6d 78 58 20 29 20 6d 78 58 20 3d 20 28 66 6c  >mxX ) mxX = (fl
3c30: 6f 61 74 29 72 3b 0a 20 20 20 20 20 20 72 20 3d  oat)r;.      r =
3c40: 20 70 2d 3e 61 5b 69 69 2a 32 2b 31 5d 3b 0a 20   p->a[ii*2+1];. 
3c50: 20 20 20 20 20 69 66 28 20 72 3c 6d 6e 59 20 29       if( r<mnY )
3c60: 20 6d 6e 59 20 3d 20 28 66 6c 6f 61 74 29 72 3b   mnY = (float)r;
3c70: 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20  .      else if( 
3c80: 72 3e 6d 78 59 20 29 20 6d 78 59 20 3d 20 28 66  r>mxY ) mxY = (f
3c90: 6c 6f 61 74 29 72 3b 0a 20 20 20 20 7d 0a 20 20  loat)r;.    }.  
3ca0: 20 20 69 66 28 20 70 52 63 20 29 20 2a 70 52 63    if( pRc ) *pRc
3cb0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
3cc0: 20 20 69 66 28 20 61 43 6f 6f 72 64 3d 3d 30 20    if( aCoord==0 
3cd0: 29 7b 0a 20 20 20 20 20 20 67 65 6f 70 6f 6c 79  ){.      geopoly
3ce0: 42 62 6f 78 46 69 6c 6c 3a 0a 20 20 20 20 20 20  BboxFill:.      
3cf0: 70 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 72  pOut = sqlite3_r
3d00: 65 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66  ealloc(p, sizeof
3d10: 28 47 65 6f 50 6f 6c 79 29 2b 73 69 7a 65 6f 66  (GeoPoly)+sizeof
3d20: 28 47 65 6f 43 6f 6f 72 64 29 2a 36 29 3b 0a 20  (GeoCoord)*6);. 
3d30: 20 20 20 20 20 69 66 28 20 70 4f 75 74 3d 3d 30       if( pOut==0
3d40: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
3d50: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
3d60: 20 20 20 20 20 69 66 28 20 63 6f 6e 74 65 78 74       if( context
3d70: 20 29 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c   ) sqlite3_resul
3d80: 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f  t_error_nomem(co
3d90: 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20  ntext);.        
3da0: 69 66 28 20 70 52 63 20 29 20 2a 70 52 63 20 3d  if( pRc ) *pRc =
3db0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
3dc0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
3dd0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
3de0: 4f 75 74 2d 3e 6e 56 65 72 74 65 78 20 3d 20 34  Out->nVertex = 4
3df0: 3b 0a 20 20 20 20 20 20 69 69 20 3d 20 31 3b 0a  ;.      ii = 1;.
3e00: 20 20 20 20 20 20 70 4f 75 74 2d 3e 68 64 72 5b        pOut->hdr[
3e10: 30 5d 20 3d 20 2a 28 75 6e 73 69 67 6e 65 64 20  0] = *(unsigned 
3e20: 63 68 61 72 2a 29 26 69 69 3b 0a 20 20 20 20 20  char*)&ii;.     
3e30: 20 70 4f 75 74 2d 3e 68 64 72 5b 31 5d 20 3d 20   pOut->hdr[1] = 
3e40: 30 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 68  0;.      pOut->h
3e50: 64 72 5b 32 5d 20 3d 20 30 3b 0a 20 20 20 20 20  dr[2] = 0;.     
3e60: 20 70 4f 75 74 2d 3e 68 64 72 5b 33 5d 20 3d 20   pOut->hdr[3] = 
3e70: 34 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 61  4;.      pOut->a
3e80: 5b 30 5d 20 3d 20 6d 6e 58 3b 0a 20 20 20 20 20  [0] = mnX;.     
3e90: 20 70 4f 75 74 2d 3e 61 5b 31 5d 20 3d 20 6d 6e   pOut->a[1] = mn
3ea0: 59 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 61  Y;.      pOut->a
3eb0: 5b 32 5d 20 3d 20 6d 78 58 3b 0a 20 20 20 20 20  [2] = mxX;.     
3ec0: 20 70 4f 75 74 2d 3e 61 5b 33 5d 20 3d 20 6d 6e   pOut->a[3] = mn
3ed0: 59 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 61  Y;.      pOut->a
3ee0: 5b 34 5d 20 3d 20 6d 78 58 3b 0a 20 20 20 20 20  [4] = mxX;.     
3ef0: 20 70 4f 75 74 2d 3e 61 5b 35 5d 20 3d 20 6d 78   pOut->a[5] = mx
3f00: 59 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 61  Y;.      pOut->a
3f10: 5b 36 5d 20 3d 20 6d 6e 58 3b 0a 20 20 20 20 20  [6] = mnX;.     
3f20: 20 70 4f 75 74 2d 3e 61 5b 37 5d 20 3d 20 6d 78   pOut->a[7] = mx
3f30: 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  Y;.    }else{.  
3f40: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
3f50: 28 70 29 3b 0a 20 20 20 20 20 20 61 43 6f 6f 72  (p);.      aCoor
3f60: 64 5b 30 5d 2e 66 20 3d 20 6d 6e 58 3b 0a 20 20  d[0].f = mnX;.  
3f70: 20 20 20 20 61 43 6f 6f 72 64 5b 31 5d 2e 66 20      aCoord[1].f 
3f80: 3d 20 6d 78 58 3b 0a 20 20 20 20 20 20 61 43 6f  = mxX;.      aCo
3f90: 6f 72 64 5b 32 5d 2e 66 20 3d 20 6d 6e 59 3b 0a  ord[2].f = mnY;.
3fa0: 20 20 20 20 20 20 61 43 6f 6f 72 64 5b 33 5d 2e        aCoord[3].
3fb0: 66 20 3d 20 6d 78 59 3b 0a 20 20 20 20 7d 0a 20  f = mxY;.    }. 
3fc0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4f 75 74   }.  return pOut
3fd0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
3fe0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
3ff0: 20 67 65 6f 70 6f 6c 79 5f 62 62 6f 78 28 58 29   geopoly_bbox(X)
4000: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a   SQL function..*
4010: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
4020: 6f 70 6f 6c 79 42 42 6f 78 46 75 6e 63 28 0a 20  opolyBBoxFunc(. 
4030: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
4040: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
4050: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
4060: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
4070: 0a 20 20 47 65 6f 50 6f 6c 79 20 2a 70 20 3d 20  .  GeoPoly *p = 
4080: 67 65 6f 70 6f 6c 79 42 42 6f 78 28 63 6f 6e 74  geopolyBBox(cont
4090: 65 78 74 2c 20 61 72 67 76 5b 30 5d 2c 20 30 2c  ext, argv[0], 0,
40a0: 20 30 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a   0);.  if( p ){.
40b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
40c0: 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c  lt_blob(context,
40d0: 20 70 2d 3e 68 64 72 2c 20 0a 20 20 20 20 20 20   p->hdr, .      
40e0: 20 34 2b 38 2a 70 2d 3e 6e 56 65 72 74 65 78 2c   4+8*p->nVertex,
40f0: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
4100: 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  T);.    sqlite3_
4110: 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  free(p);.  }.}..
4120: 2f 2a 0a 2a 2a 20 53 74 61 74 65 20 76 65 63 74  /*.** State vect
4130: 6f 72 20 66 6f 72 20 74 68 65 20 67 65 6f 70 6f  or for the geopo
4140: 6c 79 5f 67 72 6f 75 70 5f 62 62 6f 78 28 29 20  ly_group_bbox() 
4150: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
4160: 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  on..*/.typedef s
4170: 74 72 75 63 74 20 47 65 6f 42 42 6f 78 20 47 65  truct GeoBBox Ge
4180: 6f 42 42 6f 78 3b 0a 73 74 72 75 63 74 20 47 65  oBBox;.struct Ge
4190: 6f 42 42 6f 78 20 7b 0a 20 20 69 6e 74 20 69 73  oBBox {.  int is
41a0: 49 6e 69 74 3b 0a 20 20 52 74 72 65 65 43 6f 6f  Init;.  RtreeCoo
41b0: 72 64 20 61 5b 34 5d 3b 0a 7d 3b 0a 0a 0a 2f 2a  rd a[4];.};.../*
41c0: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
41d0: 6f 6e 20 6f 66 20 74 68 65 20 67 65 6f 70 6f 6c  on of the geopol
41e0: 79 5f 67 72 6f 75 70 5f 62 62 6f 78 28 58 29 20  y_group_bbox(X) 
41f0: 61 67 67 72 65 67 61 74 65 20 53 51 4c 20 66 75  aggregate SQL fu
4200: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
4210: 63 20 76 6f 69 64 20 67 65 6f 70 6f 6c 79 42 42  c void geopolyBB
4220: 6f 78 53 74 65 70 28 0a 20 20 73 71 6c 69 74 65  oxStep(.  sqlite
4230: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
4240: 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  xt,.  int argc,.
4250: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
4260: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 52 74 72 65  **argv.){.  Rtre
4270: 65 43 6f 6f 72 64 20 61 5b 34 5d 3b 0a 20 20 69  eCoord a[4];.  i
4280: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
4290: 4b 3b 0a 20 20 28 76 6f 69 64 29 67 65 6f 70 6f  K;.  (void)geopo
42a0: 6c 79 42 42 6f 78 28 63 6f 6e 74 65 78 74 2c 20  lyBBox(context, 
42b0: 61 72 67 76 5b 30 5d 2c 20 61 2c 20 26 72 63 29  argv[0], a, &rc)
42c0: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
42d0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 47 65 6f  TE_OK ){.    Geo
42e0: 42 42 6f 78 20 2a 70 42 42 6f 78 3b 0a 20 20 20  BBox *pBBox;.   
42f0: 20 70 42 42 6f 78 20 3d 20 28 47 65 6f 42 42 6f   pBBox = (GeoBBo
4300: 78 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65  x*)sqlite3_aggre
4310: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e  gate_context(con
4320: 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 42  text, sizeof(*pB
4330: 42 6f 78 29 29 3b 0a 20 20 20 20 69 66 28 20 70  Box));.    if( p
4340: 42 42 6f 78 3d 3d 30 20 29 20 72 65 74 75 72 6e  BBox==0 ) return
4350: 3b 0a 20 20 20 20 69 66 28 20 70 42 42 6f 78 2d  ;.    if( pBBox-
4360: 3e 69 73 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20  >isInit==0 ){.  
4370: 20 20 20 20 70 42 42 6f 78 2d 3e 69 73 49 6e 69      pBBox->isIni
4380: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 6d 65 6d  t = 1;.      mem
4390: 63 70 79 28 70 42 42 6f 78 2d 3e 61 2c 20 61 2c  cpy(pBBox->a, a,
43a0: 20 73 69 7a 65 6f 66 28 52 74 72 65 65 43 6f 6f   sizeof(RtreeCoo
43b0: 72 64 29 2a 34 29 3b 0a 20 20 20 20 7d 65 6c 73  rd)*4);.    }els
43c0: 65 7b 0a 20 20 20 20 20 20 69 66 28 20 61 5b 30  e{.      if( a[0
43d0: 5d 2e 66 20 3c 20 70 42 42 6f 78 2d 3e 61 5b 30  ].f < pBBox->a[0
43e0: 5d 2e 66 20 29 20 70 42 42 6f 78 2d 3e 61 5b 30  ].f ) pBBox->a[0
43f0: 5d 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20  ] = a[0];.      
4400: 69 66 28 20 61 5b 31 5d 2e 66 20 3e 20 70 42 42  if( a[1].f > pBB
4410: 6f 78 2d 3e 61 5b 31 5d 2e 66 20 29 20 70 42 42  ox->a[1].f ) pBB
4420: 6f 78 2d 3e 61 5b 31 5d 20 3d 20 61 5b 31 5d 3b  ox->a[1] = a[1];
4430: 0a 20 20 20 20 20 20 69 66 28 20 61 5b 32 5d 2e  .      if( a[2].
4440: 66 20 3c 20 70 42 42 6f 78 2d 3e 61 5b 32 5d 2e  f < pBBox->a[2].
4450: 66 20 29 20 70 42 42 6f 78 2d 3e 61 5b 32 5d 20  f ) pBBox->a[2] 
4460: 3d 20 61 5b 32 5d 3b 0a 20 20 20 20 20 20 69 66  = a[2];.      if
4470: 28 20 61 5b 33 5d 2e 66 20 3e 20 70 42 42 6f 78  ( a[3].f > pBBox
4480: 2d 3e 61 5b 33 5d 2e 66 20 29 20 70 42 42 6f 78  ->a[3].f ) pBBox
4490: 2d 3e 61 5b 33 5d 20 3d 20 61 5b 33 5d 3b 0a 20  ->a[3] = a[3];. 
44a0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69     }.  }.}.stati
44b0: 63 20 76 6f 69 64 20 67 65 6f 70 6f 6c 79 42 42  c void geopolyBB
44c0: 6f 78 46 69 6e 61 6c 28 0a 20 20 73 71 6c 69 74  oxFinal(.  sqlit
44d0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
44e0: 65 78 74 0a 29 7b 0a 20 20 47 65 6f 50 6f 6c 79  ext.){.  GeoPoly
44f0: 20 2a 70 3b 0a 20 20 47 65 6f 42 42 6f 78 20 2a   *p;.  GeoBBox *
4500: 70 42 42 6f 78 3b 0a 20 20 70 42 42 6f 78 20 3d  pBBox;.  pBBox =
4510: 20 28 47 65 6f 42 42 6f 78 2a 29 73 71 6c 69 74   (GeoBBox*)sqlit
4520: 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e  e3_aggregate_con
4530: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 30 29  text(context, 0)
4540: 3b 0a 20 20 69 66 28 20 70 42 42 6f 78 3d 3d 30  ;.  if( pBBox==0
4550: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 20 3d   ) return;.  p =
4560: 20 67 65 6f 70 6f 6c 79 42 42 6f 78 28 63 6f 6e   geopolyBBox(con
4570: 74 65 78 74 2c 20 30 2c 20 70 42 42 6f 78 2d 3e  text, 0, pBBox->
4580: 61 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 20 29  a, 0);.  if( p )
4590: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
45a0: 73 75 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78  sult_blob(contex
45b0: 74 2c 20 70 2d 3e 68 64 72 2c 20 0a 20 20 20 20  t, p->hdr, .    
45c0: 20 20 20 34 2b 38 2a 70 2d 3e 6e 56 65 72 74 65     4+8*p->nVerte
45d0: 78 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  x, SQLITE_TRANSI
45e0: 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ENT);.    sqlite
45f0: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d  3_free(p);.  }.}
4600: 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69  .../*.** Determi
4610: 6e 65 20 69 66 20 70 6f 69 6e 74 20 28 78 30 2c  ne if point (x0,
4620: 79 30 29 20 69 73 20 62 65 6e 65 61 74 68 20 6c  y0) is beneath l
4630: 69 6e 65 20 73 65 67 6d 65 6e 74 20 28 78 31 2c  ine segment (x1,
4640: 79 31 29 2d 3e 28 78 32 2c 79 32 29 2e 0a 2a 2a  y1)->(x2,y2)..**
4650: 20 52 65 74 75 72 6e 73 3a 0a 2a 2a 0a 2a 2a 20   Returns:.**.** 
4660: 20 20 20 2b 32 20 20 78 30 2c 79 30 20 69 73 20     +2  x0,y0 is 
4670: 6f 6e 20 74 68 65 20 6c 69 6e 65 20 73 65 67 65  on the line sege
4680: 6d 65 6e 74 0a 2a 2a 0a 2a 2a 20 20 20 20 2b 31  ment.**.**    +1
4690: 20 20 78 30 2c 79 30 20 69 73 20 62 65 6e 65 61    x0,y0 is benea
46a0: 74 68 20 6c 69 6e 65 20 73 65 67 6d 65 6e 74 0a  th line segment.
46b0: 2a 2a 0a 2a 2a 20 20 20 20 30 20 20 20 78 30 2c  **.**    0   x0,
46c0: 79 30 20 69 73 20 6e 6f 74 20 6f 6e 20 6f 72 20  y0 is not on or 
46d0: 62 65 6e 65 61 74 68 20 74 68 65 20 6c 69 6e 65  beneath the line
46e0: 20 73 65 67 6d 65 6e 74 20 6f 72 20 74 68 65 20   segment or the 
46f0: 6c 69 6e 65 20 73 65 67 6d 65 6e 74 0a 2a 2a 20  line segment.** 
4700: 20 20 20 20 20 20 20 69 73 20 76 65 72 74 69 63         is vertic
4710: 61 6c 20 61 6e 64 20 78 30 2c 79 30 20 69 73 20  al and x0,y0 is 
4720: 6e 6f 74 20 6f 6e 20 74 68 65 20 6c 69 6e 65 20  not on the line 
4730: 73 65 67 6d 65 6e 74 0a 2a 2a 0a 2a 2a 20 54 68  segment.**.** Th
4740: 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6f 72  e left-most coor
4750: 64 69 6e 61 74 65 20 6d 69 6e 28 78 31 2c 78 32  dinate min(x1,x2
4760: 29 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65  ) is not conside
4770: 72 65 64 20 74 6f 20 62 65 20 70 61 72 74 20 6f  red to be part o
4780: 66 0a 2a 2a 20 74 68 65 20 6c 69 6e 65 20 73 65  f.** the line se
4790: 67 6d 65 6e 74 20 66 6f 72 20 74 68 65 20 70 75  gment for the pu
47a0: 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 61  rposes of this a
47b0: 6e 61 6c 79 73 69 73 2e 0a 2a 2f 0a 73 74 61 74  nalysis..*/.stat
47c0: 69 63 20 69 6e 74 20 70 6f 69 6e 74 42 65 6e 65  ic int pointBene
47d0: 61 74 68 4c 69 6e 65 28 0a 20 20 64 6f 75 62 6c  athLine(.  doubl
47e0: 65 20 78 30 2c 20 64 6f 75 62 6c 65 20 79 30 2c  e x0, double y0,
47f0: 0a 20 20 64 6f 75 62 6c 65 20 78 31 2c 20 64 6f  .  double x1, do
4800: 75 62 6c 65 20 79 31 2c 0a 20 20 64 6f 75 62 6c  uble y1,.  doubl
4810: 65 20 78 32 2c 20 64 6f 75 62 6c 65 20 79 32 0a  e x2, double y2.
4820: 29 7b 0a 20 20 64 6f 75 62 6c 65 20 79 3b 0a 20  ){.  double y;. 
4830: 20 69 66 28 20 78 30 3d 3d 78 31 20 26 26 20 79   if( x0==x1 && y
4840: 30 3d 3d 79 31 20 29 20 72 65 74 75 72 6e 20 32  0==y1 ) return 2
4850: 3b 0a 20 20 69 66 28 20 78 31 3c 78 32 20 29 7b  ;.  if( x1<x2 ){
4860: 0a 20 20 20 20 69 66 28 20 78 30 3c 3d 78 31 20  .    if( x0<=x1 
4870: 7c 7c 20 78 30 3e 78 32 20 29 20 72 65 74 75 72  || x0>x2 ) retur
4880: 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  n 0;.  }else if(
4890: 20 78 31 3e 78 32 20 29 7b 0a 20 20 20 20 69 66   x1>x2 ){.    if
48a0: 28 20 78 30 3c 3d 78 32 20 7c 7c 20 78 30 3e 78  ( x0<=x2 || x0>x
48b0: 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  1 ) return 0;.  
48c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 56 65  }else{.    /* Ve
48d0: 72 74 69 63 61 6c 20 6c 69 6e 65 20 73 65 67 6d  rtical line segm
48e0: 65 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 78  ent */.    if( x
48f0: 30 21 3d 78 31 20 29 20 72 65 74 75 72 6e 20 30  0!=x1 ) return 0
4900: 3b 0a 20 20 20 20 69 66 28 20 79 30 3c 79 31 20  ;.    if( y0<y1 
4910: 26 26 20 79 30 3c 79 32 20 29 20 72 65 74 75 72  && y0<y2 ) retur
4920: 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 79 30 3e  n 0;.    if( y0>
4930: 79 31 20 26 26 20 79 30 3e 79 32 20 29 20 72 65  y1 && y0>y2 ) re
4940: 74 75 72 6e 20 30 3b 0a 20 20 20 20 72 65 74 75  turn 0;.    retu
4950: 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 79 20 3d 20  rn 2;.  }.  y = 
4960: 79 31 20 2b 20 28 79 32 2d 79 31 29 2a 28 78 30  y1 + (y2-y1)*(x0
4970: 2d 78 31 29 2f 28 78 32 2d 78 31 29 3b 0a 20 20  -x1)/(x2-x1);.  
4980: 69 66 28 20 79 30 3d 3d 79 20 29 20 72 65 74 75  if( y0==y ) retu
4990: 72 6e 20 32 3b 0a 20 20 69 66 28 20 79 30 3c 79  rn 2;.  if( y0<y
49a0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72   ) return 1;.  r
49b0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
49c0: 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 20  * SQL function: 
49d0: 20 20 20 67 65 6f 70 6f 6c 79 5f 63 6f 6e 74 61     geopoly_conta
49e0: 69 6e 73 5f 70 6f 69 6e 74 28 50 2c 58 2c 59 29  ins_point(P,X,Y)
49f0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 2b 32  .**.** Return +2
4a00: 20 69 66 20 70 6f 69 6e 74 20 58 2c 59 20 69 73   if point X,Y is
4a10: 20 77 69 74 68 69 6e 20 70 6f 6c 79 67 6f 6e 20   within polygon 
4a20: 50 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 2b 31 20  P..** Return +1 
4a30: 69 66 20 70 6f 69 6e 74 20 58 2c 59 20 69 73 20  if point X,Y is 
4a40: 6f 6e 20 74 68 65 20 70 6f 6c 79 67 6f 6e 20 62  on the polygon b
4a50: 6f 75 6e 64 61 72 79 2e 0a 2a 2a 20 52 65 74 75  oundary..** Retu
4a60: 72 6e 20 30 20 69 66 20 70 6f 69 6e 74 20 58 2c  rn 0 if point X,
4a70: 59 20 69 73 20 6f 75 74 73 69 64 65 20 74 68 65  Y is outside the
4a80: 20 70 6f 6c 79 67 6f 6e 0a 2a 2f 0a 73 74 61 74   polygon.*/.stat
4a90: 69 63 20 76 6f 69 64 20 67 65 6f 70 6f 6c 79 43  ic void geopolyC
4aa0: 6f 6e 74 61 69 6e 73 50 6f 69 6e 74 46 75 6e 63  ontainsPointFunc
4ab0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
4ac0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
4ad0: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
4ae0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
4af0: 0a 29 7b 0a 20 20 47 65 6f 50 6f 6c 79 20 2a 70  .){.  GeoPoly *p
4b00: 31 20 3d 20 67 65 6f 70 6f 6c 79 46 75 6e 63 50  1 = geopolyFuncP
4b10: 61 72 61 6d 28 63 6f 6e 74 65 78 74 2c 20 61 72  aram(context, ar
4b20: 67 76 5b 30 5d 2c 20 30 29 3b 0a 20 20 64 6f 75  gv[0], 0);.  dou
4b30: 62 6c 65 20 78 30 20 3d 20 73 71 6c 69 74 65 33  ble x0 = sqlite3
4b40: 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72  _value_double(ar
4b50: 67 76 5b 31 5d 29 3b 0a 20 20 64 6f 75 62 6c 65  gv[1]);.  double
4b60: 20 79 30 20 3d 20 73 71 6c 69 74 65 33 5f 76 61   y0 = sqlite3_va
4b70: 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b  lue_double(argv[
4b80: 32 5d 29 3b 0a 20 20 69 6e 74 20 76 20 3d 20 30  2]);.  int v = 0
4b90: 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  ;.  int cnt = 0;
4ba0: 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 66 28  .  int ii;.  if(
4bb0: 20 70 31 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b   p1==0 ) return;
4bc0: 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
4bd0: 70 31 2d 3e 6e 56 65 72 74 65 78 2d 31 3b 20 69  p1->nVertex-1; i
4be0: 69 2b 2b 29 7b 0a 20 20 20 20 76 20 3d 20 70 6f  i++){.    v = po
4bf0: 69 6e 74 42 65 6e 65 61 74 68 4c 69 6e 65 28 78  intBeneathLine(x
4c00: 30 2c 79 30 2c 70 31 2d 3e 61 5b 69 69 2a 32 5d  0,y0,p1->a[ii*2]
4c10: 2c 70 31 2d 3e 61 5b 69 69 2a 32 2b 31 5d 2c 0a  ,p1->a[ii*2+1],.
4c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
4c40: 31 2d 3e 61 5b 69 69 2a 32 2b 32 5d 2c 70 31 2d  1->a[ii*2+2],p1-
4c50: 3e 61 5b 69 69 2a 32 2b 33 5d 29 3b 0a 20 20 20  >a[ii*2+3]);.   
4c60: 20 69 66 28 20 76 3d 3d 32 20 29 20 62 72 65 61   if( v==2 ) brea
4c70: 6b 3b 0a 20 20 20 20 63 6e 74 20 2b 3d 20 76 3b  k;.    cnt += v;
4c80: 0a 20 20 7d 0a 20 20 69 66 28 20 76 21 3d 32 20  .  }.  if( v!=2 
4c90: 29 7b 0a 20 20 20 20 76 20 3d 20 70 6f 69 6e 74  ){.    v = point
4ca0: 42 65 6e 65 61 74 68 4c 69 6e 65 28 78 30 2c 79  BeneathLine(x0,y
4cb0: 30 2c 70 31 2d 3e 61 5b 69 69 2a 32 5d 2c 70 31  0,p1->a[ii*2],p1
4cc0: 2d 3e 61 5b 69 69 2a 32 2b 31 5d 2c 0a 20 20 20  ->a[ii*2+1],.   
4cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ce0: 20 20 20 20 20 20 20 20 20 20 20 20 70 31 2d 3e              p1->
4cf0: 61 5b 30 5d 2c 70 31 2d 3e 61 5b 31 5d 29 3b 0a  a[0],p1->a[1]);.
4d00: 20 20 7d 0a 20 20 69 66 28 20 76 3d 3d 32 20 29    }.  if( v==2 )
4d10: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
4d20: 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74  sult_int(context
4d30: 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  , 1);.  }else if
4d40: 28 20 28 28 76 2b 63 6e 74 29 26 31 29 3d 3d 30  ( ((v+cnt)&1)==0
4d50: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
4d60: 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65  result_int(conte
4d70: 78 74 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  xt, 0);.  }else{
4d80: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
4d90: 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c  ult_int(context,
4da0: 20 32 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   2);.  }.  sqlit
4db0: 65 33 5f 66 72 65 65 28 70 31 29 3b 0a 7d 0a 0a  e3_free(p1);.}..
4dc0: 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  /* Forward decla
4dd0: 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63  ration */.static
4de0: 20 69 6e 74 20 67 65 6f 70 6f 6c 79 4f 76 65 72   int geopolyOver
4df0: 6c 61 70 28 47 65 6f 50 6f 6c 79 20 2a 70 31 2c  lap(GeoPoly *p1,
4e00: 20 47 65 6f 50 6f 6c 79 20 2a 70 32 29 3b 0a 0a   GeoPoly *p2);..
4e10: 2f 2a 0a 2a 2a 20 53 51 4c 20 66 75 6e 63 74 69  /*.** SQL functi
4e20: 6f 6e 3a 20 20 20 20 67 65 6f 70 6f 6c 79 5f 77  on:    geopoly_w
4e30: 69 74 68 69 6e 28 50 31 2c 50 32 29 0a 2a 2a 0a  ithin(P1,P2).**.
4e40: 2a 2a 20 52 65 74 75 72 6e 20 2b 32 20 69 66 20  ** Return +2 if 
4e50: 50 31 20 61 6e 64 20 50 32 20 61 72 65 20 74 68  P1 and P2 are th
4e60: 65 20 73 61 6d 65 20 70 6f 6c 79 67 6f 6e 0a 2a  e same polygon.*
4e70: 2a 20 52 65 74 75 72 6e 20 2b 31 20 69 66 20 50  * Return +1 if P
4e80: 32 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 77  2 is contained w
4e90: 69 74 68 69 6e 20 50 31 0a 2a 2a 20 52 65 74 75  ithin P1.** Retu
4ea0: 72 6e 20 30 20 69 66 20 61 6e 79 20 70 61 72 74  rn 0 if any part
4eb0: 20 6f 66 20 50 32 20 69 73 20 6f 6e 20 74 68 65   of P2 is on the
4ec0: 20 6f 75 74 73 69 64 65 20 6f 66 20 50 31 0a 2a   outside of P1.*
4ed0: 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  *.*/.static void
4ee0: 20 67 65 6f 70 6f 6c 79 57 69 74 68 69 6e 46 75   geopolyWithinFu
4ef0: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
4f00: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
4f10: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
4f20: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
4f30: 67 76 0a 29 7b 0a 20 20 47 65 6f 50 6f 6c 79 20  gv.){.  GeoPoly 
4f40: 2a 70 31 20 3d 20 67 65 6f 70 6f 6c 79 46 75 6e  *p1 = geopolyFun
4f50: 63 50 61 72 61 6d 28 63 6f 6e 74 65 78 74 2c 20  cParam(context, 
4f60: 61 72 67 76 5b 30 5d 2c 20 30 29 3b 0a 20 20 47  argv[0], 0);.  G
4f70: 65 6f 50 6f 6c 79 20 2a 70 32 20 3d 20 67 65 6f  eoPoly *p2 = geo
4f80: 70 6f 6c 79 46 75 6e 63 50 61 72 61 6d 28 63 6f  polyFuncParam(co
4f90: 6e 74 65 78 74 2c 20 61 72 67 76 5b 31 5d 2c 20  ntext, argv[1], 
4fa0: 30 29 3b 0a 20 20 69 66 28 20 70 31 20 26 26 20  0);.  if( p1 && 
4fb0: 70 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 78 20  p2 ){.    int x 
4fc0: 3d 20 67 65 6f 70 6f 6c 79 4f 76 65 72 6c 61 70  = geopolyOverlap
4fd0: 28 70 31 2c 20 70 32 29 3b 0a 20 20 20 20 69 66  (p1, p2);.    if
4fe0: 28 20 78 3c 30 20 29 7b 0a 20 20 20 20 20 20 73  ( x<0 ){.      s
4ff0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
5000: 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78  ror_nomem(contex
5010: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
5020: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
5030: 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c  ult_int(context,
5040: 20 78 3d 3d 32 20 3f 20 31 20 3a 20 78 3d 3d 34   x==2 ? 1 : x==4
5050: 20 3f 20 32 20 3a 20 30 29 3b 0a 20 20 20 20 7d   ? 2 : 0);.    }
5060: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
5070: 72 65 65 28 70 31 29 3b 0a 20 20 73 71 6c 69 74  ree(p1);.  sqlit
5080: 65 33 5f 66 72 65 65 28 70 32 29 3b 0a 7d 0a 0a  e3_free(p2);.}..
5090: 2f 2a 20 4f 62 6a 65 63 74 73 20 75 73 65 64 20  /* Objects used 
50a0: 62 79 20 74 68 65 20 6f 76 65 72 6c 61 70 20 61  by the overlap a
50b0: 6c 67 6f 72 69 68 6d 2e 20 2a 2f 0a 74 79 70 65  lgorihm. */.type
50c0: 64 65 66 20 73 74 72 75 63 74 20 47 65 6f 45 76  def struct GeoEv
50d0: 65 6e 74 20 47 65 6f 45 76 65 6e 74 3b 0a 74 79  ent GeoEvent;.ty
50e0: 70 65 64 65 66 20 73 74 72 75 63 74 20 47 65 6f  pedef struct Geo
50f0: 53 65 67 6d 65 6e 74 20 47 65 6f 53 65 67 6d 65  Segment GeoSegme
5100: 6e 74 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  nt;.typedef stru
5110: 63 74 20 47 65 6f 4f 76 65 72 6c 61 70 20 47 65  ct GeoOverlap Ge
5120: 6f 4f 76 65 72 6c 61 70 3b 0a 73 74 72 75 63 74  oOverlap;.struct
5130: 20 47 65 6f 45 76 65 6e 74 20 7b 0a 20 20 64 6f   GeoEvent {.  do
5140: 75 62 6c 65 20 78 3b 20 20 20 20 20 20 20 20 20  uble x;         
5150: 20 20 20 20 20 2f 2a 20 58 20 63 6f 6f 72 64 69       /* X coordi
5160: 6e 61 74 65 20 61 74 20 77 68 69 63 68 20 65 76  nate at which ev
5170: 65 6e 74 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20  ent occurs */.  
5180: 69 6e 74 20 65 54 79 70 65 3b 20 20 20 20 20 20  int eType;      
5190: 20 20 20 20 20 20 20 2f 2a 20 30 20 66 6f 72 20         /* 0 for 
51a0: 41 44 44 2c 20 31 20 66 6f 72 20 52 45 4d 4f 56  ADD, 1 for REMOV
51b0: 45 20 2a 2f 0a 20 20 47 65 6f 53 65 67 6d 65 6e  E */.  GeoSegmen
51c0: 74 20 2a 70 53 65 67 3b 20 20 20 20 20 20 2f 2a  t *pSeg;      /*
51d0: 20 54 68 65 20 73 65 67 6d 65 6e 74 20 74 6f 20   The segment to 
51e0: 62 65 20 61 64 64 65 64 20 6f 72 20 72 65 6d 6f  be added or remo
51f0: 76 65 64 20 2a 2f 0a 20 20 47 65 6f 45 76 65 6e  ved */.  GeoEven
5200: 74 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20  t *pNext;       
5210: 2f 2a 20 4e 65 78 74 20 65 76 65 6e 74 20 69 6e  /* Next event in
5220: 20 74 68 65 20 73 6f 72 74 65 64 20 6c 69 73 74   the sorted list
5230: 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 47 65   */.};.struct Ge
5240: 6f 53 65 67 6d 65 6e 74 20 7b 0a 20 20 64 6f 75  oSegment {.  dou
5250: 62 6c 65 20 43 2c 20 42 3b 20 20 20 20 20 20 20  ble C, B;       
5260: 20 20 20 20 2f 2a 20 79 20 3d 20 43 2a 78 20 2b      /* y = C*x +
5270: 20 42 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 79   B */.  double y
5280: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
5290: 2a 20 43 75 72 72 65 6e 74 20 79 20 76 61 6c 75  * Current y valu
52a0: 65 20 2a 2f 0a 20 20 66 6c 6f 61 74 20 79 30 3b  e */.  float y0;
52b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
52c0: 20 49 6e 69 74 69 61 6c 20 79 20 76 61 6c 75 65   Initial y value
52d0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
52e0: 68 61 72 20 73 69 64 65 3b 20 20 20 20 2f 2a 20  har side;    /* 
52f0: 31 20 66 6f 72 20 70 31 2c 20 32 20 66 6f 72 20  1 for p1, 2 for 
5300: 70 32 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  p2 */.  unsigned
5310: 20 69 6e 74 20 69 64 78 3b 20 20 20 20 20 20 2f   int idx;      /
5320: 2a 20 57 68 69 63 68 20 73 65 67 6d 65 6e 74 20  * Which segment 
5330: 77 69 74 68 69 6e 20 74 68 65 20 73 69 64 65 20  within the side 
5340: 2a 2f 0a 20 20 47 65 6f 53 65 67 6d 65 6e 74 20  */.  GeoSegment 
5350: 2a 70 4e 65 78 74 3b 20 20 20 20 20 2f 2a 20 4e  *pNext;     /* N
5360: 65 78 74 20 73 65 67 6d 65 6e 74 20 69 6e 20 61  ext segment in a
5370: 20 6c 69 73 74 20 73 6f 72 74 65 64 20 62 79 20   list sorted by 
5380: 79 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 47  y */.};.struct G
5390: 65 6f 4f 76 65 72 6c 61 70 20 7b 0a 20 20 47 65  eoOverlap {.  Ge
53a0: 6f 45 76 65 6e 74 20 2a 61 45 76 65 6e 74 3b 20  oEvent *aEvent; 
53b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
53c0: 79 20 6f 66 20 61 6c 6c 20 65 76 65 6e 74 73 20  y of all events 
53d0: 2a 2f 0a 20 20 47 65 6f 53 65 67 6d 65 6e 74 20  */.  GeoSegment 
53e0: 2a 61 53 65 67 6d 65 6e 74 3b 20 20 20 20 20 20  *aSegment;      
53f0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 6c 6c 20  /* Array of all 
5400: 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e  segments */.  in
5410: 74 20 6e 45 76 65 6e 74 3b 20 20 20 20 20 20 20  t nEvent;       
5420: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
5430: 65 72 20 6f 66 20 65 76 65 6e 74 73 20 2a 2f 0a  er of events */.
5440: 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 3b 20    int nSegment; 
5450: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5460: 4e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e  Number of segmen
5470: 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ts */.};../*.** 
5480: 41 64 64 20 61 20 73 69 6e 67 6c 65 20 73 65 67  Add a single seg
5490: 6d 65 6e 74 20 61 6e 64 20 69 74 73 20 61 73 73  ment and its ass
54a0: 6f 63 69 61 74 65 64 20 65 76 65 6e 74 73 2e 0a  ociated events..
54b0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
54c0: 65 6f 70 6f 6c 79 41 64 64 4f 6e 65 53 65 67 6d  eopolyAddOneSegm
54d0: 65 6e 74 28 0a 20 20 47 65 6f 4f 76 65 72 6c 61  ent(.  GeoOverla
54e0: 70 20 2a 70 2c 0a 20 20 47 65 6f 43 6f 6f 72 64  p *p,.  GeoCoord
54f0: 20 78 30 2c 0a 20 20 47 65 6f 43 6f 6f 72 64 20   x0,.  GeoCoord 
5500: 79 30 2c 0a 20 20 47 65 6f 43 6f 6f 72 64 20 78  y0,.  GeoCoord x
5510: 31 2c 0a 20 20 47 65 6f 43 6f 6f 72 64 20 79 31  1,.  GeoCoord y1
5520: 2c 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ,.  unsigned cha
5530: 72 20 73 69 64 65 2c 0a 20 20 75 6e 73 69 67 6e  r side,.  unsign
5540: 65 64 20 69 6e 74 20 69 64 78 0a 29 7b 0a 20 20  ed int idx.){.  
5550: 47 65 6f 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  GeoSegment *pSeg
5560: 3b 0a 20 20 47 65 6f 45 76 65 6e 74 20 2a 70 45  ;.  GeoEvent *pE
5570: 76 65 6e 74 3b 0a 20 20 69 66 28 20 78 30 3d 3d  vent;.  if( x0==
5580: 78 31 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a  x1 ) return;  /*
5590: 20 49 67 6e 6f 72 65 20 76 65 72 74 69 63 61 6c   Ignore vertical
55a0: 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 69   segments */.  i
55b0: 66 28 20 78 30 3e 78 31 20 29 7b 0a 20 20 20 20  f( x0>x1 ){.    
55c0: 47 65 6f 43 6f 6f 72 64 20 74 20 3d 20 78 30 3b  GeoCoord t = x0;
55d0: 0a 20 20 20 20 78 30 20 3d 20 78 31 3b 0a 20 20  .    x0 = x1;.  
55e0: 20 20 78 31 20 3d 20 74 3b 0a 20 20 20 20 74 20    x1 = t;.    t 
55f0: 3d 20 79 30 3b 0a 20 20 20 20 79 30 20 3d 20 79  = y0;.    y0 = y
5600: 31 3b 0a 20 20 20 20 79 31 20 3d 20 74 3b 0a 20  1;.    y1 = t;. 
5610: 20 7d 0a 20 20 70 53 65 67 20 3d 20 70 2d 3e 61   }.  pSeg = p->a
5620: 53 65 67 6d 65 6e 74 20 2b 20 70 2d 3e 6e 53 65  Segment + p->nSe
5630: 67 6d 65 6e 74 3b 0a 20 20 70 2d 3e 6e 53 65 67  gment;.  p->nSeg
5640: 6d 65 6e 74 2b 2b 3b 0a 20 20 70 53 65 67 2d 3e  ment++;.  pSeg->
5650: 43 20 3d 20 28 79 31 2d 79 30 29 2f 28 78 31 2d  C = (y1-y0)/(x1-
5660: 78 30 29 3b 0a 20 20 70 53 65 67 2d 3e 42 20 3d  x0);.  pSeg->B =
5670: 20 79 31 20 2d 20 78 31 2a 70 53 65 67 2d 3e 43   y1 - x1*pSeg->C
5680: 3b 0a 20 20 70 53 65 67 2d 3e 79 30 20 3d 20 79  ;.  pSeg->y0 = y
5690: 30 3b 0a 20 20 70 53 65 67 2d 3e 73 69 64 65 20  0;.  pSeg->side 
56a0: 3d 20 73 69 64 65 3b 0a 20 20 70 53 65 67 2d 3e  = side;.  pSeg->
56b0: 69 64 78 20 3d 20 69 64 78 3b 0a 20 20 70 45 76  idx = idx;.  pEv
56c0: 65 6e 74 20 3d 20 70 2d 3e 61 45 76 65 6e 74 20  ent = p->aEvent 
56d0: 2b 20 70 2d 3e 6e 45 76 65 6e 74 3b 0a 20 20 70  + p->nEvent;.  p
56e0: 2d 3e 6e 45 76 65 6e 74 2b 2b 3b 0a 20 20 70 45  ->nEvent++;.  pE
56f0: 76 65 6e 74 2d 3e 78 20 3d 20 78 30 3b 0a 20 20  vent->x = x0;.  
5700: 70 45 76 65 6e 74 2d 3e 65 54 79 70 65 20 3d 20  pEvent->eType = 
5710: 30 3b 0a 20 20 70 45 76 65 6e 74 2d 3e 70 53 65  0;.  pEvent->pSe
5720: 67 20 3d 20 70 53 65 67 3b 0a 20 20 70 45 76 65  g = pSeg;.  pEve
5730: 6e 74 20 3d 20 70 2d 3e 61 45 76 65 6e 74 20 2b  nt = p->aEvent +
5740: 20 70 2d 3e 6e 45 76 65 6e 74 3b 0a 20 20 70 2d   p->nEvent;.  p-
5750: 3e 6e 45 76 65 6e 74 2b 2b 3b 0a 20 20 70 45 76  >nEvent++;.  pEv
5760: 65 6e 74 2d 3e 78 20 3d 20 78 31 3b 0a 20 20 70  ent->x = x1;.  p
5770: 45 76 65 6e 74 2d 3e 65 54 79 70 65 20 3d 20 31  Event->eType = 1
5780: 3b 0a 20 20 70 45 76 65 6e 74 2d 3e 70 53 65 67  ;.  pEvent->pSeg
5790: 20 3d 20 70 53 65 67 3b 0a 7d 0a 20 20 0a 0a 0a   = pSeg;.}.  ...
57a0: 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 6c 6c  /*.** Insert all
57b0: 20 73 65 67 6d 65 6e 74 73 20 61 6e 64 20 65 76   segments and ev
57c0: 65 6e 74 73 20 66 6f 72 20 70 6f 6c 79 67 6f 6e  ents for polygon
57d0: 20 70 50 6f 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69   pPoly..*/.stati
57e0: 63 20 76 6f 69 64 20 67 65 6f 70 6f 6c 79 41 64  c void geopolyAd
57f0: 64 53 65 67 6d 65 6e 74 73 28 0a 20 20 47 65 6f  dSegments(.  Geo
5800: 4f 76 65 72 6c 61 70 20 2a 70 2c 20 20 20 20 20  Overlap *p,     
5810: 20 20 20 20 20 2f 2a 20 41 64 64 20 73 65 67 6d       /* Add segm
5820: 65 6e 74 73 20 74 6f 20 74 68 69 73 20 4f 76 65  ents to this Ove
5830: 72 6c 61 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  rlap object */. 
5840: 20 47 65 6f 50 6f 6c 79 20 2a 70 50 6f 6c 79 2c   GeoPoly *pPoly,
5850: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 6b 65           /* Take
5860: 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 66 72   all segments fr
5870: 6f 6d 20 74 68 69 73 20 70 6f 6c 79 67 6f 6e 20  om this polygon 
5880: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
5890: 61 72 20 73 69 64 65 20 20 20 20 20 20 2f 2a 20  ar side      /* 
58a0: 54 68 65 20 73 69 64 65 20 6f 66 20 70 50 6f 6c  The side of pPol
58b0: 79 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  y */.){.  unsign
58c0: 65 64 20 69 6e 74 20 69 3b 0a 20 20 47 65 6f 43  ed int i;.  GeoC
58d0: 6f 6f 72 64 20 2a 78 3b 0a 20 20 66 6f 72 28 69  oord *x;.  for(i
58e0: 3d 30 3b 20 69 3c 28 75 6e 73 69 67 6e 65 64 29  =0; i<(unsigned)
58f0: 70 50 6f 6c 79 2d 3e 6e 56 65 72 74 65 78 2d 31  pPoly->nVertex-1
5900: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 78 20 3d 20  ; i++){.    x = 
5910: 70 50 6f 6c 79 2d 3e 61 20 2b 20 28 69 2a 32 29  pPoly->a + (i*2)
5920: 3b 0a 20 20 20 20 67 65 6f 70 6f 6c 79 41 64 64  ;.    geopolyAdd
5930: 4f 6e 65 53 65 67 6d 65 6e 74 28 70 2c 20 78 5b  OneSegment(p, x[
5940: 30 5d 2c 20 78 5b 31 5d 2c 20 78 5b 32 5d 2c 20  0], x[1], x[2], 
5950: 78 5b 33 5d 2c 20 73 69 64 65 2c 20 69 29 3b 0a  x[3], side, i);.
5960: 20 20 7d 0a 20 20 78 20 3d 20 70 50 6f 6c 79 2d    }.  x = pPoly-
5970: 3e 61 20 2b 20 28 69 2a 32 29 3b 0a 20 20 67 65  >a + (i*2);.  ge
5980: 6f 70 6f 6c 79 41 64 64 4f 6e 65 53 65 67 6d 65  opolyAddOneSegme
5990: 6e 74 28 70 2c 20 78 5b 30 5d 2c 20 78 5b 31 5d  nt(p, x[0], x[1]
59a0: 2c 20 70 50 6f 6c 79 2d 3e 61 5b 30 5d 2c 20 70  , pPoly->a[0], p
59b0: 50 6f 6c 79 2d 3e 61 5b 31 5d 2c 20 73 69 64 65  Poly->a[1], side
59c0: 2c 20 69 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  , i);.}../*.** M
59d0: 65 72 67 65 20 74 77 6f 20 6c 69 73 74 73 20 6f  erge two lists o
59e0: 66 20 73 6f 72 74 65 64 20 65 76 65 6e 74 73 20  f sorted events 
59f0: 62 79 20 58 20 63 6f 6f 72 64 69 6e 61 74 65 0a  by X coordinate.
5a00: 2a 2f 0a 73 74 61 74 69 63 20 47 65 6f 45 76 65  */.static GeoEve
5a10: 6e 74 20 2a 67 65 6f 70 6f 6c 79 45 76 65 6e 74  nt *geopolyEvent
5a20: 4d 65 72 67 65 28 47 65 6f 45 76 65 6e 74 20 2a  Merge(GeoEvent *
5a30: 70 4c 65 66 74 2c 20 47 65 6f 45 76 65 6e 74 20  pLeft, GeoEvent 
5a40: 2a 70 52 69 67 68 74 29 7b 0a 20 20 47 65 6f 45  *pRight){.  GeoE
5a50: 76 65 6e 74 20 68 65 61 64 2c 20 2a 70 4c 61 73  vent head, *pLas
5a60: 74 3b 0a 20 20 68 65 61 64 2e 70 4e 65 78 74 20  t;.  head.pNext 
5a70: 3d 20 30 3b 0a 20 20 70 4c 61 73 74 20 3d 20 26  = 0;.  pLast = &
5a80: 68 65 61 64 3b 0a 20 20 77 68 69 6c 65 28 20 70  head;.  while( p
5a90: 52 69 67 68 74 20 26 26 20 70 4c 65 66 74 20 29  Right && pLeft )
5aa0: 7b 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  {.    if( pRight
5ab0: 2d 3e 78 20 3c 3d 20 70 4c 65 66 74 2d 3e 78 20  ->x <= pLeft->x 
5ac0: 29 7b 0a 20 20 20 20 20 20 70 4c 61 73 74 2d 3e  ){.      pLast->
5ad0: 70 4e 65 78 74 20 3d 20 70 52 69 67 68 74 3b 0a  pNext = pRight;.
5ae0: 20 20 20 20 20 20 70 4c 61 73 74 20 3d 20 70 52        pLast = pR
5af0: 69 67 68 74 3b 0a 20 20 20 20 20 20 70 52 69 67  ight;.      pRig
5b00: 68 74 20 3d 20 70 52 69 67 68 74 2d 3e 70 4e 65  ht = pRight->pNe
5b10: 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  xt;.    }else{. 
5b20: 20 20 20 20 20 70 4c 61 73 74 2d 3e 70 4e 65 78       pLast->pNex
5b30: 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20 20 20 20  t = pLeft;.     
5b40: 20 70 4c 61 73 74 20 3d 20 70 4c 65 66 74 3b 0a   pLast = pLeft;.
5b50: 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 70 4c        pLeft = pL
5b60: 65 66 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  eft->pNext;.    
5b70: 7d 0a 20 20 7d 0a 20 20 70 4c 61 73 74 2d 3e 70  }.  }.  pLast->p
5b80: 4e 65 78 74 20 3d 20 70 52 69 67 68 74 20 3f 20  Next = pRight ? 
5b90: 70 52 69 67 68 74 20 3a 20 70 4c 65 66 74 3b 0a  pRight : pLeft;.
5ba0: 20 20 72 65 74 75 72 6e 20 68 65 61 64 2e 70 4e    return head.pN
5bb0: 65 78 74 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ext;  .}../*.** 
5bc0: 53 6f 72 74 20 61 6e 20 61 72 72 61 79 20 6f 66  Sort an array of
5bd0: 20 6e 45 76 65 6e 74 20 65 76 65 6e 74 20 6f 62   nEvent event ob
5be0: 6a 65 63 74 73 20 69 6e 74 6f 20 61 20 6c 69 73  jects into a lis
5bf0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 47 65 6f  t..*/.static Geo
5c00: 45 76 65 6e 74 20 2a 67 65 6f 70 6f 6c 79 53 6f  Event *geopolySo
5c10: 72 74 45 76 65 6e 74 73 42 79 58 28 47 65 6f 45  rtEventsByX(GeoE
5c20: 76 65 6e 74 20 2a 61 45 76 65 6e 74 2c 20 69 6e  vent *aEvent, in
5c30: 74 20 6e 45 76 65 6e 74 29 7b 0a 20 20 69 6e 74  t nEvent){.  int
5c40: 20 6d 78 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   mx = 0;.  int i
5c50: 2c 20 6a 3b 0a 20 20 47 65 6f 45 76 65 6e 74 20  , j;.  GeoEvent 
5c60: 2a 70 3b 0a 20 20 47 65 6f 45 76 65 6e 74 20 2a  *p;.  GeoEvent *
5c70: 61 5b 35 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  a[50];.  for(i=0
5c80: 3b 20 69 3c 6e 45 76 65 6e 74 3b 20 69 2b 2b 29  ; i<nEvent; i++)
5c90: 7b 0a 20 20 20 20 70 20 3d 20 26 61 45 76 65 6e  {.    p = &aEven
5ca0: 74 5b 69 5d 3b 0a 20 20 20 20 70 2d 3e 70 4e 65  t[i];.    p->pNe
5cb0: 78 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  xt = 0;.    for(
5cc0: 6a 3d 30 3b 20 6a 3c 6d 78 20 26 26 20 61 5b 6a  j=0; j<mx && a[j
5cd0: 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 70  ]; j++){.      p
5ce0: 20 3d 20 67 65 6f 70 6f 6c 79 45 76 65 6e 74 4d   = geopolyEventM
5cf0: 65 72 67 65 28 61 5b 6a 5d 2c 20 70 29 3b 0a 20  erge(a[j], p);. 
5d00: 20 20 20 20 20 61 5b 6a 5d 20 3d 20 30 3b 0a 20       a[j] = 0;. 
5d10: 20 20 20 7d 0a 20 20 20 20 61 5b 6a 5d 20 3d 20     }.    a[j] = 
5d20: 70 3b 0a 20 20 20 20 69 66 28 20 6a 3e 3d 6d 78  p;.    if( j>=mx
5d30: 20 29 20 6d 78 20 3d 20 6a 2b 31 3b 0a 20 20 7d   ) mx = j+1;.  }
5d40: 0a 20 20 70 20 3d 20 30 3b 0a 20 20 66 6f 72 28  .  p = 0;.  for(
5d50: 69 3d 30 3b 20 69 3c 6d 78 3b 20 69 2b 2b 29 7b  i=0; i<mx; i++){
5d60: 0a 20 20 20 20 70 20 3d 20 67 65 6f 70 6f 6c 79  .    p = geopoly
5d70: 45 76 65 6e 74 4d 65 72 67 65 28 61 5b 69 5d 2c  EventMerge(a[i],
5d80: 20 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   p);.  }.  retur
5d90: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65  n p;.}../*.** Me
5da0: 72 67 65 20 74 77 6f 20 6c 69 73 74 73 20 6f 66  rge two lists of
5db0: 20 73 6f 72 74 65 64 20 73 65 67 6d 65 6e 74 73   sorted segments
5dc0: 20 62 79 20 59 2c 20 61 6e 64 20 74 68 65 6e 20   by Y, and then 
5dd0: 62 79 20 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  by C..*/.static 
5de0: 47 65 6f 53 65 67 6d 65 6e 74 20 2a 67 65 6f 70  GeoSegment *geop
5df0: 6f 6c 79 53 65 67 6d 65 6e 74 4d 65 72 67 65 28  olySegmentMerge(
5e00: 47 65 6f 53 65 67 6d 65 6e 74 20 2a 70 4c 65 66  GeoSegment *pLef
5e10: 74 2c 20 47 65 6f 53 65 67 6d 65 6e 74 20 2a 70  t, GeoSegment *p
5e20: 52 69 67 68 74 29 7b 0a 20 20 47 65 6f 53 65 67  Right){.  GeoSeg
5e30: 6d 65 6e 74 20 68 65 61 64 2c 20 2a 70 4c 61 73  ment head, *pLas
5e40: 74 3b 0a 20 20 68 65 61 64 2e 70 4e 65 78 74 20  t;.  head.pNext 
5e50: 3d 20 30 3b 0a 20 20 70 4c 61 73 74 20 3d 20 26  = 0;.  pLast = &
5e60: 68 65 61 64 3b 0a 20 20 77 68 69 6c 65 28 20 70  head;.  while( p
5e70: 52 69 67 68 74 20 26 26 20 70 4c 65 66 74 20 29  Right && pLeft )
5e80: 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d  {.    double r =
5e90: 20 70 52 69 67 68 74 2d 3e 79 20 2d 20 70 4c 65   pRight->y - pLe
5ea0: 66 74 2d 3e 79 3b 0a 20 20 20 20 69 66 28 20 72  ft->y;.    if( r
5eb0: 3d 3d 30 2e 30 20 29 20 72 20 3d 20 70 52 69 67  ==0.0 ) r = pRig
5ec0: 68 74 2d 3e 43 20 2d 20 70 4c 65 66 74 2d 3e 43  ht->C - pLeft->C
5ed0: 3b 0a 20 20 20 20 69 66 28 20 72 3c 30 2e 30 20  ;.    if( r<0.0 
5ee0: 29 7b 0a 20 20 20 20 20 20 70 4c 61 73 74 2d 3e  ){.      pLast->
5ef0: 70 4e 65 78 74 20 3d 20 70 52 69 67 68 74 3b 0a  pNext = pRight;.
5f00: 20 20 20 20 20 20 70 4c 61 73 74 20 3d 20 70 52        pLast = pR
5f10: 69 67 68 74 3b 0a 20 20 20 20 20 20 70 52 69 67  ight;.      pRig
5f20: 68 74 20 3d 20 70 52 69 67 68 74 2d 3e 70 4e 65  ht = pRight->pNe
5f30: 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  xt;.    }else{. 
5f40: 20 20 20 20 20 70 4c 61 73 74 2d 3e 70 4e 65 78       pLast->pNex
5f50: 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20 20 20 20  t = pLeft;.     
5f60: 20 70 4c 61 73 74 20 3d 20 70 4c 65 66 74 3b 0a   pLast = pLeft;.
5f70: 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 70 4c        pLeft = pL
5f80: 65 66 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  eft->pNext;.    
5f90: 7d 0a 20 20 7d 0a 20 20 70 4c 61 73 74 2d 3e 70  }.  }.  pLast->p
5fa0: 4e 65 78 74 20 3d 20 70 52 69 67 68 74 20 3f 20  Next = pRight ? 
5fb0: 70 52 69 67 68 74 20 3a 20 70 4c 65 66 74 3b 0a  pRight : pLeft;.
5fc0: 20 20 72 65 74 75 72 6e 20 68 65 61 64 2e 70 4e    return head.pN
5fd0: 65 78 74 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ext;  .}../*.** 
5fe0: 53 6f 72 74 20 61 20 6c 69 73 74 20 6f 66 20 47  Sort a list of G
5ff0: 65 6f 53 65 67 6d 65 6e 74 73 20 69 6e 20 6f 72  eoSegments in or
6000: 64 65 72 20 6f 66 20 69 6e 63 72 65 61 73 69 6e  der of increasin
6010: 67 20 59 20 61 6e 64 20 69 6e 20 74 68 65 20 65  g Y and in the e
6020: 76 65 6e 74 20 6f 66 0a 2a 2a 20 61 20 74 69 65  vent of.** a tie
6030: 2c 20 69 6e 63 72 65 61 73 69 6e 67 20 43 20 28  , increasing C (
6040: 73 6c 6f 70 65 29 2e 0a 2a 2f 0a 73 74 61 74 69  slope)..*/.stati
6050: 63 20 47 65 6f 53 65 67 6d 65 6e 74 20 2a 67 65  c GeoSegment *ge
6060: 6f 70 6f 6c 79 53 6f 72 74 53 65 67 6d 65 6e 74  opolySortSegment
6070: 73 42 79 59 41 6e 64 43 28 47 65 6f 53 65 67 6d  sByYAndC(GeoSegm
6080: 65 6e 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ent *pList){.  i
6090: 6e 74 20 6d 78 20 3d 20 30 3b 0a 20 20 69 6e 74  nt mx = 0;.  int
60a0: 20 69 3b 0a 20 20 47 65 6f 53 65 67 6d 65 6e 74   i;.  GeoSegment
60b0: 20 2a 70 3b 0a 20 20 47 65 6f 53 65 67 6d 65 6e   *p;.  GeoSegmen
60c0: 74 20 2a 61 5b 35 30 5d 3b 0a 20 20 77 68 69 6c  t *a[50];.  whil
60d0: 65 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  e( pList ){.    
60e0: 70 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 70  p = pList;.    p
60f0: 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 4e  List = pList->pN
6100: 65 78 74 3b 0a 20 20 20 20 70 2d 3e 70 4e 65 78  ext;.    p->pNex
6110: 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  t = 0;.    for(i
6120: 3d 30 3b 20 69 3c 6d 78 20 26 26 20 61 5b 69 5d  =0; i<mx && a[i]
6130: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 20  ; i++){.      p 
6140: 3d 20 67 65 6f 70 6f 6c 79 53 65 67 6d 65 6e 74  = geopolySegment
6150: 4d 65 72 67 65 28 61 5b 69 5d 2c 20 70 29 3b 0a  Merge(a[i], p);.
6160: 20 20 20 20 20 20 61 5b 69 5d 20 3d 20 30 3b 0a        a[i] = 0;.
6170: 20 20 20 20 7d 0a 20 20 20 20 61 5b 69 5d 20 3d      }.    a[i] =
6180: 20 70 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d 6d   p;.    if( i>=m
6190: 78 20 29 20 6d 78 20 3d 20 69 2b 31 3b 0a 20 20  x ) mx = i+1;.  
61a0: 7d 0a 20 20 70 20 3d 20 30 3b 0a 20 20 66 6f 72  }.  p = 0;.  for
61b0: 28 69 3d 30 3b 20 69 3c 6d 78 3b 20 69 2b 2b 29  (i=0; i<mx; i++)
61c0: 7b 0a 20 20 20 20 70 20 3d 20 67 65 6f 70 6f 6c  {.    p = geopol
61d0: 79 53 65 67 6d 65 6e 74 4d 65 72 67 65 28 61 5b  ySegmentMerge(a[
61e0: 69 5d 2c 20 70 29 3b 0a 20 20 7d 0a 20 20 72 65  i], p);.  }.  re
61f0: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
6200: 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6f   Determine the o
6210: 76 65 72 6c 61 70 20 62 65 74 77 65 65 6e 20 74  verlap between t
6220: 77 6f 20 70 6f 6c 79 67 6f 6e 73 0a 2a 2f 0a 73  wo polygons.*/.s
6230: 74 61 74 69 63 20 69 6e 74 20 67 65 6f 70 6f 6c  tatic int geopol
6240: 79 4f 76 65 72 6c 61 70 28 47 65 6f 50 6f 6c 79  yOverlap(GeoPoly
6250: 20 2a 70 31 2c 20 47 65 6f 50 6f 6c 79 20 2a 70   *p1, GeoPoly *p
6260: 32 29 7b 0a 20 20 69 6e 74 20 6e 56 65 72 74 65  2){.  int nVerte
6270: 78 20 3d 20 70 31 2d 3e 6e 56 65 72 74 65 78 20  x = p1->nVertex 
6280: 2b 20 70 32 2d 3e 6e 56 65 72 74 65 78 20 2b 20  + p2->nVertex + 
6290: 32 3b 0a 20 20 47 65 6f 4f 76 65 72 6c 61 70 20  2;.  GeoOverlap 
62a0: 2a 70 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  *p;.  int nByte;
62b0: 0a 20 20 47 65 6f 45 76 65 6e 74 20 2a 70 54 68  .  GeoEvent *pTh
62c0: 69 73 45 76 65 6e 74 3b 0a 20 20 64 6f 75 62 6c  isEvent;.  doubl
62d0: 65 20 72 58 3b 0a 20 20 69 6e 74 20 72 63 20 3d  e rX;.  int rc =
62e0: 20 30 3b 0a 20 20 69 6e 74 20 6e 65 65 64 53 6f   0;.  int needSo
62f0: 72 74 20 3d 20 30 3b 0a 20 20 47 65 6f 53 65 67  rt = 0;.  GeoSeg
6300: 6d 65 6e 74 20 2a 70 41 63 74 69 76 65 20 3d 20  ment *pActive = 
6310: 30 3b 0a 20 20 47 65 6f 53 65 67 6d 65 6e 74 20  0;.  GeoSegment 
6320: 2a 70 53 65 67 3b 0a 20 20 75 6e 73 69 67 6e 65  *pSeg;.  unsigne
6330: 64 20 63 68 61 72 20 61 4f 76 65 72 6c 61 70 5b  d char aOverlap[
6340: 34 5d 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 73  4];..  nByte = s
6350: 69 7a 65 6f 66 28 47 65 6f 45 76 65 6e 74 29 2a  izeof(GeoEvent)*
6360: 6e 56 65 72 74 65 78 2a 32 20 0a 20 20 20 20 20  nVertex*2 .     
6370: 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 47        + sizeof(G
6380: 65 6f 53 65 67 6d 65 6e 74 29 2a 6e 56 65 72 74  eoSegment)*nVert
6390: 65 78 20 0a 20 20 20 20 20 20 20 20 20 20 20 2b  ex .           +
63a0: 20 73 69 7a 65 6f 66 28 47 65 6f 4f 76 65 72 6c   sizeof(GeoOverl
63b0: 61 70 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74  ap);.  p = sqlit
63c0: 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65  e3_malloc( nByte
63d0: 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   );.  if( p==0 )
63e0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 70 2d   return -1;.  p-
63f0: 3e 61 45 76 65 6e 74 20 3d 20 28 47 65 6f 45 76  >aEvent = (GeoEv
6400: 65 6e 74 2a 29 26 70 5b 31 5d 3b 0a 20 20 70 2d  ent*)&p[1];.  p-
6410: 3e 61 53 65 67 6d 65 6e 74 20 3d 20 28 47 65 6f  >aSegment = (Geo
6420: 53 65 67 6d 65 6e 74 2a 29 26 70 2d 3e 61 45 76  Segment*)&p->aEv
6430: 65 6e 74 5b 6e 56 65 72 74 65 78 2a 32 5d 3b 0a  ent[nVertex*2];.
6440: 20 20 70 2d 3e 6e 45 76 65 6e 74 20 3d 20 70 2d    p->nEvent = p-
6450: 3e 6e 53 65 67 6d 65 6e 74 20 3d 20 30 3b 0a 20  >nSegment = 0;. 
6460: 20 67 65 6f 70 6f 6c 79 41 64 64 53 65 67 6d 65   geopolyAddSegme
6470: 6e 74 73 28 70 2c 20 70 31 2c 20 31 29 3b 0a 20  nts(p, p1, 1);. 
6480: 20 67 65 6f 70 6f 6c 79 41 64 64 53 65 67 6d 65   geopolyAddSegme
6490: 6e 74 73 28 70 2c 20 70 32 2c 20 32 29 3b 0a 20  nts(p, p2, 2);. 
64a0: 20 70 54 68 69 73 45 76 65 6e 74 20 3d 20 67 65   pThisEvent = ge
64b0: 6f 70 6f 6c 79 53 6f 72 74 45 76 65 6e 74 73 42  opolySortEventsB
64c0: 79 58 28 70 2d 3e 61 45 76 65 6e 74 2c 20 70 2d  yX(p->aEvent, p-
64d0: 3e 6e 45 76 65 6e 74 29 3b 0a 20 20 72 58 20 3d  >nEvent);.  rX =
64e0: 20 70 54 68 69 73 45 76 65 6e 74 2d 3e 78 3d 3d   pThisEvent->x==
64f0: 30 2e 30 20 3f 20 2d 31 2e 30 20 3a 20 30 2e 30  0.0 ? -1.0 : 0.0
6500: 3b 0a 20 20 6d 65 6d 73 65 74 28 61 4f 76 65 72  ;.  memset(aOver
6510: 6c 61 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61  lap, 0, sizeof(a
6520: 4f 76 65 72 6c 61 70 29 29 3b 0a 20 20 77 68 69  Overlap));.  whi
6530: 6c 65 28 20 70 54 68 69 73 45 76 65 6e 74 20 29  le( pThisEvent )
6540: 7b 0a 20 20 20 20 69 66 28 20 70 54 68 69 73 45  {.    if( pThisE
6550: 76 65 6e 74 2d 3e 78 21 3d 72 58 20 29 7b 0a 20  vent->x!=rX ){. 
6560: 20 20 20 20 20 47 65 6f 53 65 67 6d 65 6e 74 20       GeoSegment 
6570: 2a 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20  *pPrev = 0;.    
6580: 20 20 69 6e 74 20 69 4d 61 73 6b 20 3d 20 30 3b    int iMask = 0;
6590: 0a 20 20 20 20 20 20 47 45 4f 44 45 42 55 47 28  .      GEODEBUG(
65a0: 28 22 44 69 73 74 69 6e 63 74 20 58 3a 20 25 67  ("Distinct X: %g
65b0: 5c 6e 22 2c 20 70 54 68 69 73 45 76 65 6e 74 2d  \n", pThisEvent-
65c0: 3e 78 29 29 3b 0a 20 20 20 20 20 20 72 58 20 3d  >x));.      rX =
65d0: 20 70 54 68 69 73 45 76 65 6e 74 2d 3e 78 3b 0a   pThisEvent->x;.
65e0: 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 53 6f        if( needSo
65f0: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 47 45  rt ){.        GE
6600: 4f 44 45 42 55 47 28 28 22 53 4f 52 54 5c 6e 22  ODEBUG(("SORT\n"
6610: 29 29 3b 0a 20 20 20 20 20 20 20 20 70 41 63 74  ));.        pAct
6620: 69 76 65 20 3d 20 67 65 6f 70 6f 6c 79 53 6f 72  ive = geopolySor
6630: 74 53 65 67 6d 65 6e 74 73 42 79 59 41 6e 64 43  tSegmentsByYAndC
6640: 28 70 41 63 74 69 76 65 29 3b 0a 20 20 20 20 20  (pActive);.     
6650: 20 20 20 6e 65 65 64 53 6f 72 74 20 3d 20 30 3b     needSort = 0;
6660: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
6670: 6f 72 28 70 53 65 67 3d 70 41 63 74 69 76 65 3b  or(pSeg=pActive;
6680: 20 70 53 65 67 3b 20 70 53 65 67 3d 70 53 65 67   pSeg; pSeg=pSeg
6690: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
66a0: 20 20 69 66 28 20 70 50 72 65 76 20 29 7b 0a 20    if( pPrev ){. 
66b0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72           if( pPr
66c0: 65 76 2d 3e 79 21 3d 70 53 65 67 2d 3e 79 20 29  ev->y!=pSeg->y )
66d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 47 45  {.            GE
66e0: 4f 44 45 42 55 47 28 28 22 4d 41 53 4b 3a 20 25  ODEBUG(("MASK: %
66f0: 64 5c 6e 22 2c 20 69 4d 61 73 6b 29 29 3b 0a 20  d\n", iMask));. 
6700: 20 20 20 20 20 20 20 20 20 20 20 61 4f 76 65 72             aOver
6710: 6c 61 70 5b 69 4d 61 73 6b 5d 20 3d 20 31 3b 0a  lap[iMask] = 1;.
6720: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6730: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 4d      }.        iM
6740: 61 73 6b 20 5e 3d 20 70 53 65 67 2d 3e 73 69 64  ask ^= pSeg->sid
6750: 65 3b 0a 20 20 20 20 20 20 20 20 70 50 72 65 76  e;.        pPrev
6760: 20 3d 20 70 53 65 67 3b 0a 20 20 20 20 20 20 7d   = pSeg;.      }
6770: 0a 20 20 20 20 20 20 70 50 72 65 76 20 3d 20 30  .      pPrev = 0
6780: 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 53 65 67  ;.      for(pSeg
6790: 3d 70 41 63 74 69 76 65 3b 20 70 53 65 67 3b 20  =pActive; pSeg; 
67a0: 70 53 65 67 3d 70 53 65 67 2d 3e 70 4e 65 78 74  pSeg=pSeg->pNext
67b0: 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 75 62 6c  ){.        doubl
67c0: 65 20 79 20 3d 20 70 53 65 67 2d 3e 43 2a 72 58  e y = pSeg->C*rX
67d0: 20 2b 20 70 53 65 67 2d 3e 42 3b 0a 20 20 20 20   + pSeg->B;.    
67e0: 20 20 20 20 47 45 4f 44 45 42 55 47 28 28 22 53      GEODEBUG(("S
67f0: 65 67 6d 65 6e 74 20 25 64 2e 25 64 20 25 67 2d  egment %d.%d %g-
6800: 3e 25 67 5c 6e 22 2c 20 70 53 65 67 2d 3e 73 69  >%g\n", pSeg->si
6810: 64 65 2c 20 70 53 65 67 2d 3e 69 64 78 2c 20 70  de, pSeg->idx, p
6820: 53 65 67 2d 3e 79 2c 20 79 29 29 3b 0a 20 20 20  Seg->y, y));.   
6830: 20 20 20 20 20 70 53 65 67 2d 3e 79 20 3d 20 79       pSeg->y = y
6840: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
6850: 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rev ){.         
6860: 20 69 66 28 20 70 50 72 65 76 2d 3e 79 3e 70 53   if( pPrev->y>pS
6870: 65 67 2d 3e 79 20 26 26 20 70 50 72 65 76 2d 3e  eg->y && pPrev->
6880: 73 69 64 65 21 3d 70 53 65 67 2d 3e 73 69 64 65  side!=pSeg->side
6890: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
68a0: 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
68b0: 20 20 20 20 47 45 4f 44 45 42 55 47 28 28 22 43      GEODEBUG(("C
68c0: 72 6f 73 73 69 6e 67 3a 20 25 64 2e 25 64 20 61  rossing: %d.%d a
68d0: 6e 64 20 25 64 2e 25 64 5c 6e 22 2c 0a 20 20 20  nd %d.%d\n",.   
68e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68f0: 20 70 50 72 65 76 2d 3e 73 69 64 65 2c 20 70 50   pPrev->side, pP
6900: 72 65 76 2d 3e 69 64 78 2c 0a 20 20 20 20 20 20  rev->idx,.      
6910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53                pS
6920: 65 67 2d 3e 73 69 64 65 2c 20 70 53 65 67 2d 3e  eg->side, pSeg->
6930: 69 64 78 29 29 3b 0a 20 20 20 20 20 20 20 20 20  idx));.         
6940: 20 20 20 67 6f 74 6f 20 67 65 6f 70 6f 6c 79 4f     goto geopolyO
6950: 76 65 72 6c 61 70 44 6f 6e 65 3b 0a 20 20 20 20  verlapDone;.    
6960: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
6970: 70 50 72 65 76 2d 3e 79 21 3d 70 53 65 67 2d 3e  pPrev->y!=pSeg->
6980: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  y ){.           
6990: 20 47 45 4f 44 45 42 55 47 28 28 22 4d 41 53 4b   GEODEBUG(("MASK
69a0: 3a 20 25 64 5c 6e 22 2c 20 69 4d 61 73 6b 29 29  : %d\n", iMask))
69b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 4f  ;.            aO
69c0: 76 65 72 6c 61 70 5b 69 4d 61 73 6b 5d 20 3d 20  verlap[iMask] = 
69d0: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  1;.          }. 
69e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
69f0: 20 69 4d 61 73 6b 20 5e 3d 20 70 53 65 67 2d 3e   iMask ^= pSeg->
6a00: 73 69 64 65 3b 0a 20 20 20 20 20 20 20 20 70 50  side;.        pP
6a10: 72 65 76 20 3d 20 70 53 65 67 3b 0a 20 20 20 20  rev = pSeg;.    
6a20: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 47 45    }.    }.    GE
6a30: 4f 44 45 42 55 47 28 28 22 25 73 20 25 64 2e 25  ODEBUG(("%s %d.%
6a40: 64 20 43 3d 25 67 20 42 3d 25 67 5c 6e 22 2c 0a  d C=%g B=%g\n",.
6a50: 20 20 20 20 20 20 70 54 68 69 73 45 76 65 6e 74        pThisEvent
6a60: 2d 3e 65 54 79 70 65 20 3f 20 22 52 4d 20 22 20  ->eType ? "RM " 
6a70: 3a 20 22 41 44 44 22 2c 0a 20 20 20 20 20 20 70  : "ADD",.      p
6a80: 54 68 69 73 45 76 65 6e 74 2d 3e 70 53 65 67 2d  ThisEvent->pSeg-
6a90: 3e 73 69 64 65 2c 20 70 54 68 69 73 45 76 65 6e  >side, pThisEven
6aa0: 74 2d 3e 70 53 65 67 2d 3e 69 64 78 2c 0a 20 20  t->pSeg->idx,.  
6ab0: 20 20 20 20 70 54 68 69 73 45 76 65 6e 74 2d 3e      pThisEvent->
6ac0: 70 53 65 67 2d 3e 43 2c 0a 20 20 20 20 20 20 70  pSeg->C,.      p
6ad0: 54 68 69 73 45 76 65 6e 74 2d 3e 70 53 65 67 2d  ThisEvent->pSeg-
6ae0: 3e 42 29 29 3b 0a 20 20 20 20 69 66 28 20 70 54  >B));.    if( pT
6af0: 68 69 73 45 76 65 6e 74 2d 3e 65 54 79 70 65 3d  hisEvent->eType=
6b00: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  =0 ){.      /* A
6b10: 64 64 20 61 20 73 65 67 6d 65 6e 74 20 2a 2f 0a  dd a segment */.
6b20: 20 20 20 20 20 20 70 53 65 67 20 3d 20 70 54 68        pSeg = pTh
6b30: 69 73 45 76 65 6e 74 2d 3e 70 53 65 67 3b 0a 20  isEvent->pSeg;. 
6b40: 20 20 20 20 20 70 53 65 67 2d 3e 79 20 3d 20 70       pSeg->y = p
6b50: 53 65 67 2d 3e 79 30 3b 0a 20 20 20 20 20 20 70  Seg->y0;.      p
6b60: 53 65 67 2d 3e 70 4e 65 78 74 20 3d 20 70 41 63  Seg->pNext = pAc
6b70: 74 69 76 65 3b 0a 20 20 20 20 20 20 70 41 63 74  tive;.      pAct
6b80: 69 76 65 20 3d 20 70 53 65 67 3b 0a 20 20 20 20  ive = pSeg;.    
6b90: 20 20 6e 65 65 64 53 6f 72 74 20 3d 20 31 3b 0a    needSort = 1;.
6ba0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6bb0: 20 2f 2a 20 52 65 6d 6f 76 65 20 61 20 73 65 67   /* Remove a seg
6bc0: 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 66  ment */.      if
6bd0: 28 20 70 41 63 74 69 76 65 3d 3d 70 54 68 69 73  ( pActive==pThis
6be0: 45 76 65 6e 74 2d 3e 70 53 65 67 20 29 7b 0a 20  Event->pSeg ){. 
6bf0: 20 20 20 20 20 20 20 70 41 63 74 69 76 65 20 3d         pActive =
6c00: 20 70 41 63 74 69 76 65 2d 3e 70 4e 65 78 74 3b   pActive->pNext;
6c10: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6c20: 20 20 20 20 20 20 66 6f 72 28 70 53 65 67 3d 70        for(pSeg=p
6c30: 41 63 74 69 76 65 3b 20 70 53 65 67 3b 20 70 53  Active; pSeg; pS
6c40: 65 67 3d 70 53 65 67 2d 3e 70 4e 65 78 74 29 7b  eg=pSeg->pNext){
6c50: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
6c60: 53 65 67 2d 3e 70 4e 65 78 74 3d 3d 70 54 68 69  Seg->pNext==pThi
6c70: 73 45 76 65 6e 74 2d 3e 70 53 65 67 20 29 7b 0a  sEvent->pSeg ){.
6c80: 20 20 20 20 20 20 20 20 20 20 20 20 70 53 65 67              pSeg
6c90: 2d 3e 70 4e 65 78 74 20 3d 20 70 53 65 67 2d 3e  ->pNext = pSeg->
6ca0: 70 4e 65 78 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  pNext->pNext;.  
6cb0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
6cc0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
6cd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
6ce0: 20 20 20 7d 0a 20 20 20 20 70 54 68 69 73 45 76     }.    pThisEv
6cf0: 65 6e 74 20 3d 20 70 54 68 69 73 45 76 65 6e 74  ent = pThisEvent
6d00: 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69  ->pNext;.  }.  i
6d10: 66 28 20 61 4f 76 65 72 6c 61 70 5b 33 5d 3d 3d  f( aOverlap[3]==
6d20: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b  0 ){.    rc = 0;
6d30: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 4f 76  .  }else if( aOv
6d40: 65 72 6c 61 70 5b 31 5d 21 3d 30 20 26 26 20 61  erlap[1]!=0 && a
6d50: 4f 76 65 72 6c 61 70 5b 32 5d 3d 3d 30 20 29 7b  Overlap[2]==0 ){
6d60: 0a 20 20 20 20 72 63 20 3d 20 33 3b 0a 20 20 7d  .    rc = 3;.  }
6d70: 65 6c 73 65 20 69 66 28 20 61 4f 76 65 72 6c 61  else if( aOverla
6d80: 70 5b 31 5d 3d 3d 30 20 26 26 20 61 4f 76 65 72  p[1]==0 && aOver
6d90: 6c 61 70 5b 32 5d 21 3d 30 20 29 7b 0a 20 20 20  lap[2]!=0 ){.   
6da0: 20 72 63 20 3d 20 32 3b 0a 20 20 7d 65 6c 73 65   rc = 2;.  }else
6db0: 20 69 66 28 20 61 4f 76 65 72 6c 61 70 5b 31 5d   if( aOverlap[1]
6dc0: 3d 3d 30 20 26 26 20 61 4f 76 65 72 6c 61 70 5b  ==0 && aOverlap[
6dd0: 32 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  2]==0 ){.    rc 
6de0: 3d 20 34 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 4;.  }else{.  
6df0: 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 0a 67    rc = 1;.  }..g
6e00: 65 6f 70 6f 6c 79 4f 76 65 72 6c 61 70 44 6f 6e  eopolyOverlapDon
6e10: 65 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  e:.  sqlite3_fre
6e20: 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
6e30: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 20  c;.}../*.** SQL 
6e40: 66 75 6e 63 74 69 6f 6e 3a 20 20 20 20 67 65 6f  function:    geo
6e50: 70 6f 6c 79 5f 6f 76 65 72 6c 61 70 28 50 31 2c  poly_overlap(P1,
6e60: 50 32 29 0a 2a 2a 0a 2a 2a 20 44 65 74 65 72 6d  P2).**.** Determ
6e70: 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
6e80: 6f 74 20 50 31 20 61 6e 64 20 50 32 20 6f 76 65  ot P1 and P2 ove
6e90: 72 6c 61 70 2e 20 52 65 74 75 72 6e 20 76 61 6c  rlap. Return val
6ea0: 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 20 20 20  ue:.**.**   0   
6eb0: 20 20 54 68 65 20 74 77 6f 20 70 6f 6c 79 67 6f    The two polygo
6ec0: 6e 73 20 61 72 65 20 64 69 73 6a 6f 69 6e 74 0a  ns are disjoint.
6ed0: 2a 2a 20 20 20 31 20 20 20 20 20 54 68 65 79 20  **   1     They 
6ee0: 6f 76 65 72 6c 61 70 0a 2a 2a 20 20 20 32 20 20  overlap.**   2  
6ef0: 20 20 20 50 31 20 69 73 20 63 6f 6d 70 6c 65 74     P1 is complet
6f00: 65 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 77 69  ely contained wi
6f10: 74 68 69 6e 20 50 32 0a 2a 2a 20 20 20 33 20 20  thin P2.**   3  
6f20: 20 20 20 50 32 20 69 73 20 63 6f 6d 70 6c 65 74     P2 is complet
6f30: 65 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 77 69  ely contained wi
6f40: 74 68 69 6e 20 50 31 0a 2a 2a 20 20 20 34 20 20  thin P1.**   4  
6f50: 20 20 20 50 31 20 61 6e 64 20 50 32 20 61 72 65     P1 and P2 are
6f60: 20 74 68 65 20 73 61 6d 65 20 70 6f 6c 79 67 6f   the same polygo
6f70: 6e 0a 2a 2a 20 20 20 4e 55 4c 4c 20 20 45 69 74  n.**   NULL  Eit
6f80: 68 65 72 20 50 31 20 6f 72 20 50 32 20 6f 72 20  her P1 or P2 or 
6f90: 62 6f 74 68 20 61 72 65 20 6e 6f 74 20 76 61 6c  both are not val
6fa0: 69 64 20 70 6f 6c 79 67 6f 6e 73 0a 2a 2f 0a 73  id polygons.*/.s
6fb0: 74 61 74 69 63 20 76 6f 69 64 20 67 65 6f 70 6f  tatic void geopo
6fc0: 6c 79 4f 76 65 72 6c 61 70 46 75 6e 63 28 0a 20  lyOverlapFunc(. 
6fd0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
6fe0: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
6ff0: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
7000: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
7010: 0a 20 20 47 65 6f 50 6f 6c 79 20 2a 70 31 20 3d  .  GeoPoly *p1 =
7020: 20 67 65 6f 70 6f 6c 79 46 75 6e 63 50 61 72 61   geopolyFuncPara
7030: 6d 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b  m(context, argv[
7040: 30 5d 2c 20 30 29 3b 0a 20 20 47 65 6f 50 6f 6c  0], 0);.  GeoPol
7050: 79 20 2a 70 32 20 3d 20 67 65 6f 70 6f 6c 79 46  y *p2 = geopolyF
7060: 75 6e 63 50 61 72 61 6d 28 63 6f 6e 74 65 78 74  uncParam(context
7070: 2c 20 61 72 67 76 5b 31 5d 2c 20 30 29 3b 0a 20  , argv[1], 0);. 
7080: 20 69 66 28 20 70 31 20 26 26 20 70 32 20 29 7b   if( p1 && p2 ){
7090: 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 67 65 6f  .    int x = geo
70a0: 70 6f 6c 79 4f 76 65 72 6c 61 70 28 70 31 2c 20  polyOverlap(p1, 
70b0: 70 32 29 3b 0a 20 20 20 20 69 66 28 20 78 3c 30  p2);.    if( x<0
70c0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
70d0: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e  3_result_error_n
70e0: 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20  omem(context);. 
70f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7100: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
7110: 6e 74 28 63 6f 6e 74 65 78 74 2c 20 78 29 3b 0a  nt(context, x);.
7120: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
7130: 74 65 33 5f 66 72 65 65 28 70 31 29 3b 0a 20 20  te3_free(p1);.  
7140: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 32 29  sqlite3_free(p2)
7150: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ;.}../*.** Enabl
7160: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 64 65 62  e or disable deb
7170: 75 67 67 69 6e 67 20 6f 75 74 70 75 74 0a 2a 2f  ugging output.*/
7180: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6f  .static void geo
7190: 70 6f 6c 79 44 65 62 75 67 46 75 6e 63 28 0a 20  polyDebugFunc(. 
71a0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
71b0: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
71c0: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
71d0: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
71e0: 0a 23 69 66 64 65 66 20 47 45 4f 50 4f 4c 59 5f  .#ifdef GEOPOLY_
71f0: 45 4e 41 42 4c 45 5f 44 45 42 55 47 0a 20 20 67  ENABLE_DEBUG.  g
7200: 65 6f 5f 64 65 62 75 67 20 3d 20 73 71 6c 69 74  eo_debug = sqlit
7210: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67  e3_value_int(arg
7220: 76 5b 30 5d 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  v[0]);.#endif.}.
7230: 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ./* .** This fun
7240: 63 74 69 6f 6e 20 69 73 20 74 68 65 20 69 6d 70  ction is the imp
7250: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 62  lementation of b
7260: 6f 74 68 20 74 68 65 20 78 43 6f 6e 6e 65 63 74  oth the xConnect
7270: 20 61 6e 64 20 78 43 72 65 61 74 65 0a 2a 2a 20   and xCreate.** 
7280: 6d 65 74 68 6f 64 73 20 6f 66 20 74 68 65 20 67  methods of the g
7290: 65 6f 70 6f 6c 79 20 76 69 72 74 75 61 6c 20 74  eopoly virtual t
72a0: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 61 72  able..**.**   ar
72b0: 67 76 5b 30 5d 20 20 20 2d 3e 20 6d 6f 64 75 6c  gv[0]   -> modul
72c0: 65 20 6e 61 6d 65 0a 2a 2a 20 20 20 61 72 67 76  e name.**   argv
72d0: 5b 31 5d 20 20 20 2d 3e 20 64 61 74 61 62 61 73  [1]   -> databas
72e0: 65 20 6e 61 6d 65 0a 2a 2a 20 20 20 61 72 67 76  e name.**   argv
72f0: 5b 32 5d 20 20 20 2d 3e 20 74 61 62 6c 65 20 6e  [2]   -> table n
7300: 61 6d 65 0a 2a 2a 20 20 20 61 72 67 76 5b 2e 2e  ame.**   argv[..
7310: 2e 5d 20 2d 3e 20 63 6f 6c 75 6d 6e 20 6e 61 6d  .] -> column nam
7320: 65 73 2e 2e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  es....*/.static 
7330: 69 6e 74 20 67 65 6f 70 6f 6c 79 49 6e 69 74 28  int geopolyInit(
7340: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
7350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7360: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
7370: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
7380: 0a 20 20 76 6f 69 64 20 2a 70 41 75 78 2c 20 20  .  void *pAux,  
7390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73a0: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
73b0: 20 74 68 65 20 52 54 52 45 45 5f 43 4f 4f 52 44   the RTREE_COORD
73c0: 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a  _* constants */.
73d0: 20 20 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73    int argc, cons
73e0: 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 2a 61 72  t char *const*ar
73f0: 67 76 2c 20 20 20 2f 2a 20 50 61 72 61 6d 65 74  gv,   /* Paramet
7400: 65 72 73 20 74 6f 20 43 52 45 41 54 45 20 54 41  ers to CREATE TA
7410: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  BLE statement */
7420: 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  .  sqlite3_vtab 
7430: 2a 2a 70 70 56 74 61 62 2c 20 20 20 20 20 20 20  **ppVtab,       
7440: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e         /* OUT: N
7450: 65 77 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ew virtual table
7460: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45   */.  char **pzE
7470: 72 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rr,             
7480: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
7490: 3a 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 2c  : Error message,
74a0: 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74   if any */.  int
74b0: 20 69 73 43 72 65 61 74 65 20 20 20 20 20 20 20   isCreate       
74c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74d0: 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 78 43 72   /* True for xCr
74e0: 65 61 74 65 2c 20 66 61 6c 73 65 20 66 6f 72 20  eate, false for 
74f0: 78 43 6f 6e 6e 65 63 74 20 2a 2f 0a 29 7b 0a 20  xConnect */.){. 
7500: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
7510: 5f 4f 4b 3b 0a 20 20 52 74 72 65 65 20 2a 70 52  _OK;.  Rtree *pR
7520: 74 72 65 65 3b 0a 20 20 69 6e 74 20 6e 44 62 3b  tree;.  int nDb;
7530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7540: 20 4c 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e   Length of strin
7550: 67 20 61 72 67 76 5b 31 5d 20 2a 2f 0a 20 20 69  g argv[1] */.  i
7560: 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20  nt nName;       
7570: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f       /* Length o
7580: 66 20 73 74 72 69 6e 67 20 61 72 67 76 5b 32 5d  f string argv[2]
7590: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
75a0: 72 20 2a 70 53 71 6c 3b 0a 20 20 63 68 61 72 20  r *pSql;.  char 
75b0: 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 69 69 3b  *zSql;.  int ii;
75c0: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  ..  sqlite3_vtab
75d0: 5f 63 6f 6e 66 69 67 28 64 62 2c 20 53 51 4c 49  _config(db, SQLI
75e0: 54 45 5f 56 54 41 42 5f 43 4f 4e 53 54 52 41 49  TE_VTAB_CONSTRAI
75f0: 4e 54 5f 53 55 50 50 4f 52 54 2c 20 31 29 3b 0a  NT_SUPPORT, 1);.
7600: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74  .  /* Allocate t
7610: 68 65 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  he sqlite3_vtab 
7620: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 6e  structure */.  n
7630: 44 62 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e  Db = (int)strlen
7640: 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 6e 4e 61  (argv[1]);.  nNa
7650: 6d 65 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e  me = (int)strlen
7660: 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 70 52 74  (argv[2]);.  pRt
7670: 72 65 65 20 3d 20 28 52 74 72 65 65 20 2a 29 73  ree = (Rtree *)s
7680: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69  qlite3_malloc(si
7690: 7a 65 6f 66 28 52 74 72 65 65 29 2b 6e 44 62 2b  zeof(Rtree)+nDb+
76a0: 6e 4e 61 6d 65 2b 32 29 3b 0a 20 20 69 66 28 20  nName+2);.  if( 
76b0: 21 70 52 74 72 65 65 20 29 7b 0a 20 20 20 20 72  !pRtree ){.    r
76c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
76d0: 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  EM;.  }.  memset
76e0: 28 70 52 74 72 65 65 2c 20 30 2c 20 73 69 7a 65  (pRtree, 0, size
76f0: 6f 66 28 52 74 72 65 65 29 2b 6e 44 62 2b 6e 4e  of(Rtree)+nDb+nN
7700: 61 6d 65 2b 32 29 3b 0a 20 20 70 52 74 72 65 65  ame+2);.  pRtree
7710: 2d 3e 6e 42 75 73 79 20 3d 20 31 3b 0a 20 20 70  ->nBusy = 1;.  p
7720: 52 74 72 65 65 2d 3e 62 61 73 65 2e 70 4d 6f 64  Rtree->base.pMod
7730: 75 6c 65 20 3d 20 26 72 74 72 65 65 4d 6f 64 75  ule = &rtreeModu
7740: 6c 65 3b 0a 20 20 70 52 74 72 65 65 2d 3e 7a 44  le;.  pRtree->zD
7750: 62 20 3d 20 28 63 68 61 72 20 2a 29 26 70 52 74  b = (char *)&pRt
7760: 72 65 65 5b 31 5d 3b 0a 20 20 70 52 74 72 65 65  ree[1];.  pRtree
7770: 2d 3e 7a 4e 61 6d 65 20 3d 20 26 70 52 74 72 65  ->zName = &pRtre
7780: 65 2d 3e 7a 44 62 5b 6e 44 62 2b 31 5d 3b 0a 20  e->zDb[nDb+1];. 
7790: 20 70 52 74 72 65 65 2d 3e 65 43 6f 6f 72 64 54   pRtree->eCoordT
77a0: 79 70 65 20 3d 20 52 54 52 45 45 5f 43 4f 4f 52  ype = RTREE_COOR
77b0: 44 5f 52 45 41 4c 33 32 3b 0a 20 20 70 52 74 72  D_REAL32;.  pRtr
77c0: 65 65 2d 3e 6e 44 69 6d 20 3d 20 32 3b 0a 20 20  ee->nDim = 2;.  
77d0: 70 52 74 72 65 65 2d 3e 6e 44 69 6d 32 20 3d 20  pRtree->nDim2 = 
77e0: 34 3b 0a 20 20 6d 65 6d 63 70 79 28 70 52 74 72  4;.  memcpy(pRtr
77f0: 65 65 2d 3e 7a 44 62 2c 20 61 72 67 76 5b 31 5d  ee->zDb, argv[1]
7800: 2c 20 6e 44 62 29 3b 0a 20 20 6d 65 6d 63 70 79  , nDb);.  memcpy
7810: 28 70 52 74 72 65 65 2d 3e 7a 4e 61 6d 65 2c 20  (pRtree->zName, 
7820: 61 72 67 76 5b 32 5d 2c 20 6e 4e 61 6d 65 29 3b  argv[2], nName);
7830: 0a 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 2f 43  ...  /* Create/C
7840: 6f 6e 6e 65 63 74 20 74 6f 20 74 68 65 20 75 6e  onnect to the un
7850: 64 65 72 6c 79 69 6e 67 20 72 65 6c 61 74 69 6f  derlying relatio
7860: 6e 61 6c 20 64 61 74 61 62 61 73 65 20 73 63 68  nal database sch
7870: 65 6d 61 2e 20 49 66 0a 20 20 2a 2a 20 74 68 61  ema. If.  ** tha
7880: 74 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  t is successful,
7890: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 64 65   call sqlite3_de
78a0: 63 6c 61 72 65 5f 76 74 61 62 28 29 20 74 6f 20  clare_vtab() to 
78b0: 63 6f 6e 66 69 67 75 72 65 0a 20 20 2a 2a 20 74  configure.  ** t
78c0: 68 65 20 72 2d 74 72 65 65 20 74 61 62 6c 65 20  he r-tree table 
78d0: 73 63 68 65 6d 61 2e 0a 20 20 2a 2f 0a 20 20 70  schema..  */.  p
78e0: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 73 74  Sql = sqlite3_st
78f0: 72 5f 6e 65 77 28 64 62 29 3b 0a 20 20 73 71 6c  r_new(db);.  sql
7900: 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66  ite3_str_appendf
7910: 28 70 53 71 6c 2c 20 22 43 52 45 41 54 45 20 54  (pSql, "CREATE T
7920: 41 42 4c 45 20 78 28 5f 73 68 61 70 65 22 29 3b  ABLE x(_shape");
7930: 0a 20 20 70 52 74 72 65 65 2d 3e 6e 41 75 78 20  .  pRtree->nAux 
7940: 3d 20 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 1;         /* 
7950: 41 64 64 20 6f 6e 65 20 66 6f 72 20 5f 73 68 61  Add one for _sha
7960: 70 65 20 2a 2f 0a 20 20 70 52 74 72 65 65 2d 3e  pe */.  pRtree->
7970: 6e 41 75 78 4e 6f 74 4e 75 6c 6c 20 3d 20 31 3b  nAuxNotNull = 1;
7980: 20 20 2f 2a 20 54 68 65 20 5f 73 68 61 70 65 20    /* The _shape 
7990: 63 6f 6c 75 6d 6e 20 69 73 20 61 6c 77 61 79 73  column is always
79a0: 20 6e 6f 74 2d 6e 75 6c 6c 20 2a 2f 0a 20 20 66   not-null */.  f
79b0: 6f 72 28 69 69 3d 33 3b 20 69 69 3c 61 72 67 63  or(ii=3; ii<argc
79c0: 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 70 52 74  ; ii++){.    pRt
79d0: 72 65 65 2d 3e 6e 41 75 78 2b 2b 3b 0a 20 20 20  ree->nAux++;.   
79e0: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
79f0: 65 6e 64 66 28 70 53 71 6c 2c 20 22 2c 25 73 22  endf(pSql, ",%s"
7a00: 2c 20 61 72 67 76 5b 69 69 5d 29 3b 0a 20 20 7d  , argv[ii]);.  }
7a10: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61  .  sqlite3_str_a
7a20: 70 70 65 6e 64 66 28 70 53 71 6c 2c 20 22 29 3b  ppendf(pSql, ");
7a30: 22 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c  ");.  zSql = sql
7a40: 69 74 65 33 5f 73 74 72 5f 66 69 6e 69 73 68 28  ite3_str_finish(
7a50: 70 53 71 6c 29 3b 0a 20 20 69 66 28 20 21 7a 53  pSql);.  if( !zS
7a60: 71 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  ql ){.    rc = S
7a70: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
7a80: 65 6c 73 65 20 69 66 28 20 53 51 4c 49 54 45 5f  else if( SQLITE_
7a90: 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
7aa0: 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28 64  3_declare_vtab(d
7ab0: 62 2c 20 7a 53 71 6c 29 29 20 29 7b 0a 20 20 20  b, zSql)) ){.   
7ac0: 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69 74 65   *pzErr = sqlite
7ad0: 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  3_mprintf("%s", 
7ae0: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
7af0: 62 29 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  b));.  }.  sqlit
7b00: 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
7b10: 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 67   if( rc ) goto g
7b20: 65 6f 70 6f 6c 79 49 6e 69 74 5f 66 61 69 6c 3b  eopolyInit_fail;
7b30: 0a 20 20 70 52 74 72 65 65 2d 3e 6e 42 79 74 65  .  pRtree->nByte
7b40: 73 50 65 72 43 65 6c 6c 20 3d 20 38 20 2b 20 70  sPerCell = 8 + p
7b50: 52 74 72 65 65 2d 3e 6e 44 69 6d 32 2a 34 3b 0a  Rtree->nDim2*4;.
7b60: 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
7b70: 20 74 68 65 20 6e 6f 64 65 20 73 69 7a 65 20 74   the node size t
7b80: 6f 20 75 73 65 2e 20 2a 2f 0a 20 20 72 63 20 3d  o use. */.  rc =
7b90: 20 67 65 74 4e 6f 64 65 53 69 7a 65 28 64 62 2c   getNodeSize(db,
7ba0: 20 70 52 74 72 65 65 2c 20 69 73 43 72 65 61 74   pRtree, isCreat
7bb0: 65 2c 20 70 7a 45 72 72 29 3b 0a 20 20 69 66 28  e, pzErr);.  if(
7bc0: 20 72 63 20 29 20 67 6f 74 6f 20 67 65 6f 70 6f   rc ) goto geopo
7bd0: 6c 79 49 6e 69 74 5f 66 61 69 6c 3b 0a 20 20 72  lyInit_fail;.  r
7be0: 63 20 3d 20 72 74 72 65 65 53 71 6c 49 6e 69 74  c = rtreeSqlInit
7bf0: 28 70 52 74 72 65 65 2c 20 64 62 2c 20 61 72 67  (pRtree, db, arg
7c00: 76 5b 31 5d 2c 20 61 72 67 76 5b 32 5d 2c 20 69  v[1], argv[2], i
7c10: 73 43 72 65 61 74 65 29 3b 0a 20 20 69 66 28 20  sCreate);.  if( 
7c20: 72 63 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72  rc ){.    *pzErr
7c30: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
7c40: 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33  tf("%s", sqlite3
7c50: 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20  _errmsg(db));.  
7c60: 20 20 67 6f 74 6f 20 67 65 6f 70 6f 6c 79 49 6e    goto geopolyIn
7c70: 69 74 5f 66 61 69 6c 3b 0a 20 20 7d 0a 0a 20 20  it_fail;.  }..  
7c80: 2a 70 70 56 74 61 62 20 3d 20 28 73 71 6c 69 74  *ppVtab = (sqlit
7c90: 65 33 5f 76 74 61 62 20 2a 29 70 52 74 72 65 65  e3_vtab *)pRtree
7ca0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
7cb0: 45 5f 4f 4b 3b 0a 0a 67 65 6f 70 6f 6c 79 49 6e  E_OK;..geopolyIn
7cc0: 69 74 5f 66 61 69 6c 3a 0a 20 20 69 66 28 20 72  it_fail:.  if( r
7cd0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c==SQLITE_OK ) r
7ce0: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
7cf0: 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70 70 56  ;.  assert( *ppV
7d00: 74 61 62 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  tab==0 );.  asse
7d10: 72 74 28 20 70 52 74 72 65 65 2d 3e 6e 42 75 73  rt( pRtree->nBus
7d20: 79 3d 3d 31 20 29 3b 0a 20 20 72 74 72 65 65 52  y==1 );.  rtreeR
7d30: 65 6c 65 61 73 65 28 70 52 74 72 65 65 29 3b 0a  elease(pRtree);.
7d40: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
7d50: 0a 2f 2a 20 0a 2a 2a 20 47 45 4f 50 4f 4c 59 20  ./* .** GEOPOLY 
7d60: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f  virtual table mo
7d70: 64 75 6c 65 20 78 43 72 65 61 74 65 20 6d 65 74  dule xCreate met
7d80: 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  hod..*/.static i
7d90: 6e 74 20 67 65 6f 70 6f 6c 79 43 72 65 61 74 65  nt geopolyCreate
7da0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
7db0: 0a 20 20 76 6f 69 64 20 2a 70 41 75 78 2c 0a 20  .  void *pAux,. 
7dc0: 20 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73 74   int argc, const
7dd0: 20 63 68 61 72 20 2a 63 6f 6e 73 74 2a 61 72 67   char *const*arg
7de0: 76 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  v,.  sqlite3_vta
7df0: 62 20 2a 2a 70 70 56 74 61 62 2c 0a 20 20 63 68  b **ppVtab,.  ch
7e00: 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20  ar **pzErr.){.  
7e10: 72 65 74 75 72 6e 20 67 65 6f 70 6f 6c 79 49 6e  return geopolyIn
7e20: 69 74 28 64 62 2c 20 70 41 75 78 2c 20 61 72 67  it(db, pAux, arg
7e30: 63 2c 20 61 72 67 76 2c 20 70 70 56 74 61 62 2c  c, argv, ppVtab,
7e40: 20 70 7a 45 72 72 2c 20 31 29 3b 0a 7d 0a 0a 2f   pzErr, 1);.}../
7e50: 2a 20 0a 2a 2a 20 47 45 4f 50 4f 4c 59 20 76 69  * .** GEOPOLY vi
7e60: 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75  rtual table modu
7e70: 6c 65 20 78 43 6f 6e 6e 65 63 74 20 6d 65 74 68  le xConnect meth
7e80: 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  od..*/.static in
7e90: 74 20 67 65 6f 70 6f 6c 79 43 6f 6e 6e 65 63 74  t geopolyConnect
7ea0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
7eb0: 0a 20 20 76 6f 69 64 20 2a 70 41 75 78 2c 0a 20  .  void *pAux,. 
7ec0: 20 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73 74   int argc, const
7ed0: 20 63 68 61 72 20 2a 63 6f 6e 73 74 2a 61 72 67   char *const*arg
7ee0: 76 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  v,.  sqlite3_vta
7ef0: 62 20 2a 2a 70 70 56 74 61 62 2c 0a 20 20 63 68  b **ppVtab,.  ch
7f00: 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20  ar **pzErr.){.  
7f10: 72 65 74 75 72 6e 20 67 65 6f 70 6f 6c 79 49 6e  return geopolyIn
7f20: 69 74 28 64 62 2c 20 70 41 75 78 2c 20 61 72 67  it(db, pAux, arg
7f30: 63 2c 20 61 72 67 76 2c 20 70 70 56 74 61 62 2c  c, argv, ppVtab,
7f40: 20 70 7a 45 72 72 2c 20 30 29 3b 0a 7d 0a 0a 0a   pzErr, 0);.}...
7f50: 2f 2a 20 0a 2a 2a 20 47 45 4f 50 4f 4c 59 20 76  /* .** GEOPOLY v
7f60: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64  irtual table mod
7f70: 75 6c 65 20 78 46 69 6c 74 65 72 20 6d 65 74 68  ule xFilter meth
7f80: 6f 64 2e 0a 2a 2a 0a 2a 2a 20 51 75 65 72 79 20  od..**.** Query 
7f90: 70 6c 61 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  plans:.**.**    
7fa0: 20 20 31 20 20 20 20 20 20 20 20 20 72 6f 77 69    1         rowi
7fb0: 64 20 6c 6f 6f 6b 75 70 0a 2a 2a 20 20 20 20 20  d lookup.**     
7fc0: 20 32 20 20 20 20 20 20 20 20 20 73 65 61 72 63   2         searc
7fd0: 68 20 66 6f 72 20 6f 62 6a 65 63 74 73 20 6f 76  h for objects ov
7fe0: 65 72 6c 61 70 70 69 6e 67 20 74 68 65 20 73 61  erlapping the sa
7ff0: 6d 65 20 62 6f 75 6e 64 69 6e 67 20 62 6f 78 0a  me bounding box.
8000: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
8010: 20 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20    that contains 
8020: 70 6f 6c 79 67 6f 6e 20 61 72 67 76 5b 30 5d 0a  polygon argv[0].
8030: 2a 2a 20 20 20 20 20 20 33 20 20 20 20 20 20 20  **      3       
8040: 20 20 73 65 61 72 63 68 20 66 6f 72 20 6f 62 6a    search for obj
8050: 65 63 74 73 20 6f 76 65 72 6c 61 70 70 69 6e 67  ects overlapping
8060: 20 74 68 65 20 73 61 6d 65 20 62 6f 75 6e 64 69   the same boundi
8070: 6e 67 20 62 6f 78 0a 2a 2a 20 20 20 20 20 20 20  ng box.**       
8080: 20 20 20 20 20 20 20 20 20 74 68 61 74 20 63 6f           that co
8090: 6e 74 61 69 6e 73 20 70 6f 6c 79 67 6f 6e 20 61  ntains polygon a
80a0: 72 67 76 5b 30 5d 0a 2a 2a 20 20 20 20 20 20 34  rgv[0].**      4
80b0: 20 20 20 20 20 20 20 20 20 66 75 6c 6c 20 74 61           full ta
80c0: 62 6c 65 20 73 63 61 6e 0a 2a 2f 0a 73 74 61 74  ble scan.*/.stat
80d0: 69 63 20 69 6e 74 20 67 65 6f 70 6f 6c 79 46 69  ic int geopolyFi
80e0: 6c 74 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f  lter(.  sqlite3_
80f0: 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74  vtab_cursor *pVt
8100: 61 62 43 75 72 73 6f 72 2c 20 20 20 20 20 2f 2a  abCursor,     /*
8110: 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 69   The cursor to i
8120: 6e 69 74 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 69  nitialize */.  i
8130: 6e 74 20 69 64 78 4e 75 6d 2c 20 20 20 20 20 20  nt idxNum,      
8140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8150: 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20 70 6c       /* Query pl
8160: 61 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  an */.  const ch
8170: 61 72 20 2a 69 64 78 53 74 72 2c 20 20 20 20 20  ar *idxStr,     
8180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8190: 20 4e 6f 74 20 55 73 65 64 20 2a 2f 0a 20 20 69   Not Used */.  i
81a0: 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
81b0: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 20 20 20  _value **argv   
81c0: 20 20 20 20 20 2f 2a 20 50 61 72 61 6d 65 74 65       /* Paramete
81d0: 72 73 20 74 6f 20 74 68 65 20 71 75 65 72 79 20  rs to the query 
81e0: 70 6c 61 6e 20 2a 2f 0a 29 7b 0a 20 20 52 74 72  plan */.){.  Rtr
81f0: 65 65 20 2a 70 52 74 72 65 65 20 3d 20 28 52 74  ee *pRtree = (Rt
8200: 72 65 65 20 2a 29 70 56 74 61 62 43 75 72 73 6f  ree *)pVtabCurso
8210: 72 2d 3e 70 56 74 61 62 3b 0a 20 20 52 74 72 65  r->pVtab;.  Rtre
8220: 65 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20  eCursor *pCsr = 
8230: 28 52 74 72 65 65 43 75 72 73 6f 72 20 2a 29 70  (RtreeCursor *)p
8240: 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 52 74  VtabCursor;.  Rt
8250: 72 65 65 4e 6f 64 65 20 2a 70 52 6f 6f 74 20 3d  reeNode *pRoot =
8260: 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   0;.  int rc = S
8270: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
8280: 69 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 73 71 6c  iCell = 0;.  sql
8290: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
82a0: 3b 0a 0a 20 20 72 74 72 65 65 52 65 66 65 72 65  ;..  rtreeRefere
82b0: 6e 63 65 28 70 52 74 72 65 65 29 3b 0a 0a 20 20  nce(pRtree);..  
82c0: 2f 2a 20 52 65 73 65 74 20 74 68 65 20 63 75 72  /* Reset the cur
82d0: 73 6f 72 20 74 6f 20 74 68 65 20 73 61 6d 65 20  sor to the same 
82e0: 73 74 61 74 65 20 61 73 20 72 74 72 65 65 4f 70  state as rtreeOp
82f0: 65 6e 28 29 20 6c 65 61 76 65 73 20 69 74 20 69  en() leaves it i
8300: 6e 2e 20 2a 2f 0a 20 20 66 72 65 65 43 75 72 73  n. */.  freeCurs
8310: 6f 72 43 6f 6e 73 74 72 61 69 6e 74 73 28 70 43  orConstraints(pC
8320: 73 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  sr);.  sqlite3_f
8330: 72 65 65 28 70 43 73 72 2d 3e 61 50 6f 69 6e 74  ree(pCsr->aPoint
8340: 29 3b 0a 20 20 70 53 74 6d 74 20 3d 20 70 43 73  );.  pStmt = pCs
8350: 72 2d 3e 70 52 65 61 64 41 75 78 3b 0a 20 20 6d  r->pReadAux;.  m
8360: 65 6d 73 65 74 28 70 43 73 72 2c 20 30 2c 20 73  emset(pCsr, 0, s
8370: 69 7a 65 6f 66 28 52 74 72 65 65 43 75 72 73 6f  izeof(RtreeCurso
8380: 72 29 29 3b 0a 20 20 70 43 73 72 2d 3e 62 61 73  r));.  pCsr->bas
8390: 65 2e 70 56 74 61 62 20 3d 20 28 73 71 6c 69 74  e.pVtab = (sqlit
83a0: 65 33 5f 76 74 61 62 2a 29 70 52 74 72 65 65 3b  e3_vtab*)pRtree;
83b0: 0a 20 20 70 43 73 72 2d 3e 70 52 65 61 64 41 75  .  pCsr->pReadAu
83c0: 78 20 3d 20 70 53 74 6d 74 3b 0a 0a 20 20 70 43  x = pStmt;..  pC
83d0: 73 72 2d 3e 69 53 74 72 61 74 65 67 79 20 3d 20  sr->iStrategy = 
83e0: 69 64 78 4e 75 6d 3b 0a 20 20 69 66 28 20 69 64  idxNum;.  if( id
83f0: 78 4e 75 6d 3d 3d 31 20 29 7b 0a 20 20 20 20 2f  xNum==1 ){.    /
8400: 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 20 2d  * Special case -
8410: 20 6c 6f 6f 6b 75 70 20 62 79 20 72 6f 77 69 64   lookup by rowid
8420: 2e 20 2a 2f 0a 20 20 20 20 52 74 72 65 65 4e 6f  . */.    RtreeNo
8430: 64 65 20 2a 70 4c 65 61 66 3b 20 20 20 20 20 20  de *pLeaf;      
8440: 20 20 2f 2a 20 4c 65 61 66 20 6f 6e 20 77 68 69    /* Leaf on whi
8450: 63 68 20 74 68 65 20 72 65 71 75 69 72 65 64 20  ch the required 
8460: 63 65 6c 6c 20 72 65 73 69 64 65 73 20 2a 2f 0a  cell resides */.
8470: 20 20 20 20 52 74 72 65 65 53 65 61 72 63 68 50      RtreeSearchP
8480: 6f 69 6e 74 20 2a 70 3b 20 20 20 20 20 2f 2a 20  oint *p;     /* 
8490: 53 65 61 72 63 68 20 70 6f 69 6e 74 20 66 6f 72  Search point for
84a0: 20 74 68 65 20 6c 65 61 66 20 2a 2f 0a 20 20 20   the leaf */.   
84b0: 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 73 71   i64 iRowid = sq
84c0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36  lite3_value_int6
84d0: 34 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  4(argv[0]);.    
84e0: 69 36 34 20 69 4e 6f 64 65 20 3d 20 30 3b 0a 20  i64 iNode = 0;. 
84f0: 20 20 20 72 63 20 3d 20 66 69 6e 64 4c 65 61 66     rc = findLeaf
8500: 4e 6f 64 65 28 70 52 74 72 65 65 2c 20 69 52 6f  Node(pRtree, iRo
8510: 77 69 64 2c 20 26 70 4c 65 61 66 2c 20 26 69 4e  wid, &pLeaf, &iN
8520: 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ode);.    if( rc
8530: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
8540: 4c 65 61 66 21 3d 30 20 29 7b 0a 20 20 20 20 20  Leaf!=0 ){.     
8550: 20 70 20 3d 20 72 74 72 65 65 53 65 61 72 63 68   p = rtreeSearch
8560: 50 6f 69 6e 74 4e 65 77 28 70 43 73 72 2c 20 52  PointNew(pCsr, R
8570: 54 52 45 45 5f 5a 45 52 4f 2c 20 30 29 3b 0a 20  TREE_ZERO, 0);. 
8580: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 21 3d       assert( p!=
8590: 30 20 29 3b 20 20 2f 2a 20 41 6c 77 61 79 73 20  0 );  /* Always 
85a0: 72 65 74 75 72 6e 73 20 70 43 73 72 2d 3e 73 50  returns pCsr->sP
85b0: 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 70 43  oint */.      pC
85c0: 73 72 2d 3e 61 4e 6f 64 65 5b 30 5d 20 3d 20 70  sr->aNode[0] = p
85d0: 4c 65 61 66 3b 0a 20 20 20 20 20 20 70 2d 3e 69  Leaf;.      p->i
85e0: 64 20 3d 20 69 4e 6f 64 65 3b 0a 20 20 20 20 20  d = iNode;.     
85f0: 20 70 2d 3e 65 57 69 74 68 69 6e 20 3d 20 50 41   p->eWithin = PA
8600: 52 54 4c 59 5f 57 49 54 48 49 4e 3b 0a 20 20 20  RTLY_WITHIN;.   
8610: 20 20 20 72 63 20 3d 20 6e 6f 64 65 52 6f 77 69     rc = nodeRowi
8620: 64 49 6e 64 65 78 28 70 52 74 72 65 65 2c 20 70  dIndex(pRtree, p
8630: 4c 65 61 66 2c 20 69 52 6f 77 69 64 2c 20 26 69  Leaf, iRowid, &i
8640: 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70 2d 3e  Cell);.      p->
8650: 69 43 65 6c 6c 20 3d 20 28 75 38 29 69 43 65 6c  iCell = (u8)iCel
8660: 6c 3b 0a 20 20 20 20 20 20 52 54 52 45 45 5f 51  l;.      RTREE_Q
8670: 55 45 55 45 5f 54 52 41 43 45 28 70 43 73 72 2c  UEUE_TRACE(pCsr,
8680: 20 22 50 55 53 48 2d 46 31 3a 22 29 3b 0a 20 20   "PUSH-F1:");.  
8690: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
86a0: 43 73 72 2d 3e 61 74 45 4f 46 20 3d 20 31 3b 0a  Csr->atEOF = 1;.
86b0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
86c0: 20 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 63 61 73     /* Normal cas
86d0: 65 20 2d 20 72 2d 74 72 65 65 20 73 63 61 6e 2e  e - r-tree scan.
86e0: 20 53 65 74 20 75 70 20 74 68 65 20 52 74 72 65   Set up the Rtre
86f0: 65 43 75 72 73 6f 72 2e 61 43 6f 6e 73 74 72 61  eCursor.aConstra
8700: 69 6e 74 20 61 72 72 61 79 20 0a 20 20 20 20 2a  int array .    *
8710: 2a 20 77 69 74 68 20 74 68 65 20 63 6f 6e 66 69  * with the confi
8720: 67 75 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74  gured constraint
8730: 73 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  s. .    */.    r
8740: 63 20 3d 20 6e 6f 64 65 41 63 71 75 69 72 65 28  c = nodeAcquire(
8750: 70 52 74 72 65 65 2c 20 31 2c 20 30 2c 20 26 70  pRtree, 1, 0, &p
8760: 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66 28 20 72  Root);.    if( r
8770: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
8780: 69 64 78 4e 75 6d 3c 3d 33 20 29 7b 0a 20 20 20  idxNum<=3 ){.   
8790: 20 20 20 52 74 72 65 65 43 6f 6f 72 64 20 62 62     RtreeCoord bb
87a0: 6f 78 5b 34 5d 3b 0a 20 20 20 20 20 20 52 74 72  ox[4];.      Rtr
87b0: 65 65 43 6f 6e 73 74 72 61 69 6e 74 20 2a 70 3b  eeConstraint *p;
87c0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 61  .      assert( a
87d0: 72 67 63 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  rgc==1 );.      
87e0: 67 65 6f 70 6f 6c 79 42 42 6f 78 28 30 2c 20 61  geopolyBBox(0, a
87f0: 72 67 76 5b 30 5d 2c 20 62 62 6f 78 2c 20 26 72  rgv[0], bbox, &r
8800: 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  c);.      if( rc
8810: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
8820: 20 67 65 6f 70 6f 6c 79 5f 66 69 6c 74 65 72 5f   geopoly_filter_
8830: 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
8840: 20 20 20 70 43 73 72 2d 3e 61 43 6f 6e 73 74 72     pCsr->aConstr
8850: 61 69 6e 74 20 3d 20 70 20 3d 20 73 71 6c 69 74  aint = p = sqlit
8860: 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  e3_malloc(sizeof
8870: 28 52 74 72 65 65 43 6f 6e 73 74 72 61 69 6e 74  (RtreeConstraint
8880: 29 2a 34 29 3b 0a 20 20 20 20 20 20 70 43 73 72  )*4);.      pCsr
8890: 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20  ->nConstraint = 
88a0: 34 3b 0a 20 20 20 20 20 20 69 66 28 20 70 3d 3d  4;.      if( p==
88b0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
88c0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
88d0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
88e0: 20 20 20 20 20 6d 65 6d 73 65 74 28 70 43 73 72       memset(pCsr
88f0: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 2c 20 30  ->aConstraint, 0
8900: 2c 20 73 69 7a 65 6f 66 28 52 74 72 65 65 43 6f  , sizeof(RtreeCo
8910: 6e 73 74 72 61 69 6e 74 29 2a 34 29 3b 0a 20 20  nstraint)*4);.  
8920: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 43 73        memset(pCs
8930: 72 2d 3e 61 6e 51 75 65 75 65 2c 20 30 2c 20 73  r->anQueue, 0, s
8940: 69 7a 65 6f 66 28 75 33 32 29 2a 28 70 52 74 72  izeof(u32)*(pRtr
8950: 65 65 2d 3e 69 44 65 70 74 68 20 2b 20 31 29 29  ee->iDepth + 1))
8960: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 64  ;.        if( id
8970: 78 4e 75 6d 3d 3d 32 20 29 7b 0a 20 20 20 20 20  xNum==2 ){.     
8980: 20 20 20 20 20 2f 2a 20 4f 76 65 72 6c 61 70 20       /* Overlap 
8990: 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 20 20 20  query */.       
89a0: 20 20 20 70 2d 3e 6f 70 20 3d 20 27 42 27 3b 0a     p->op = 'B';.
89b0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 43 6f            p->iCo
89c0: 6f 72 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ord = 0;.       
89d0: 20 20 20 70 2d 3e 75 2e 72 56 61 6c 75 65 20 3d     p->u.rValue =
89e0: 20 62 62 6f 78 5b 31 5d 2e 66 3b 0a 20 20 20 20   bbox[1].f;.    
89f0: 20 20 20 20 20 20 70 2b 2b 3b 0a 20 20 20 20 20        p++;.     
8a00: 20 20 20 20 20 70 2d 3e 6f 70 20 3d 20 27 44 27       p->op = 'D'
8a10: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69  ;.          p->i
8a20: 43 6f 6f 72 64 20 3d 20 31 3b 0a 20 20 20 20 20  Coord = 1;.     
8a30: 20 20 20 20 20 70 2d 3e 75 2e 72 56 61 6c 75 65       p->u.rValue
8a40: 20 3d 20 62 62 6f 78 5b 30 5d 2e 66 3b 0a 20 20   = bbox[0].f;.  
8a50: 20 20 20 20 20 20 20 20 70 2b 2b 3b 0a 20 20 20          p++;.   
8a60: 20 20 20 20 20 20 20 70 2d 3e 6f 70 20 3d 20 27         p->op = '
8a70: 42 27 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  B';.          p-
8a80: 3e 69 43 6f 6f 72 64 20 3d 20 32 3b 0a 20 20 20  >iCoord = 2;.   
8a90: 20 20 20 20 20 20 20 70 2d 3e 75 2e 72 56 61 6c         p->u.rVal
8aa0: 75 65 20 3d 20 62 62 6f 78 5b 33 5d 2e 66 3b 0a  ue = bbox[3].f;.
8ab0: 20 20 20 20 20 20 20 20 20 20 70 2b 2b 3b 0a 20            p++;. 
8ac0: 20 20 20 20 20 20 20 20 20 70 2d 3e 6f 70 20 3d           p->op =
8ad0: 20 27 44 27 3b 0a 20 20 20 20 20 20 20 20 20 20   'D';.          
8ae0: 70 2d 3e 69 43 6f 6f 72 64 20 3d 20 33 3b 0a 20  p->iCoord = 3;. 
8af0: 20 20 20 20 20 20 20 20 20 70 2d 3e 75 2e 72 56           p->u.rV
8b00: 61 6c 75 65 20 3d 20 62 62 6f 78 5b 32 5d 2e 66  alue = bbox[2].f
8b10: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
8b20: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69  .          /* Wi
8b30: 74 68 69 6e 20 71 75 65 72 79 20 2a 2f 0a 20 20  thin query */.  
8b40: 20 20 20 20 20 20 20 20 70 2d 3e 6f 70 20 3d 20          p->op = 
8b50: 27 44 27 3b 0a 20 20 20 20 20 20 20 20 20 20 70  'D';.          p
8b60: 2d 3e 69 43 6f 6f 72 64 20 3d 20 30 3b 0a 20 20  ->iCoord = 0;.  
8b70: 20 20 20 20 20 20 20 20 70 2d 3e 75 2e 72 56 61          p->u.rVa
8b80: 6c 75 65 20 3d 20 62 62 6f 78 5b 30 5d 2e 66 3b  lue = bbox[0].f;
8b90: 0a 20 20 20 20 20 20 20 20 20 20 70 2b 2b 3b 0a  .          p++;.
8ba0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6f 70 20            p->op 
8bb0: 3d 20 27 42 27 3b 0a 20 20 20 20 20 20 20 20 20  = 'B';.         
8bc0: 20 70 2d 3e 69 43 6f 6f 72 64 20 3d 20 31 3b 0a   p->iCoord = 1;.
8bd0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 75 2e 72            p->u.r
8be0: 56 61 6c 75 65 20 3d 20 62 62 6f 78 5b 31 5d 2e  Value = bbox[1].
8bf0: 66 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2b 2b  f;.          p++
8c00: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6f  ;.          p->o
8c10: 70 20 3d 20 27 44 27 3b 0a 20 20 20 20 20 20 20  p = 'D';.       
8c20: 20 20 20 70 2d 3e 69 43 6f 6f 72 64 20 3d 20 32     p->iCoord = 2
8c30: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 75  ;.          p->u
8c40: 2e 72 56 61 6c 75 65 20 3d 20 62 62 6f 78 5b 32  .rValue = bbox[2
8c50: 5d 2e 66 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ].f;.          p
8c60: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  ++;.          p-
8c70: 3e 6f 70 20 3d 20 27 42 27 3b 0a 20 20 20 20 20  >op = 'B';.     
8c80: 20 20 20 20 20 70 2d 3e 69 43 6f 6f 72 64 20 3d       p->iCoord =
8c90: 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   3;.          p-
8ca0: 3e 75 2e 72 56 61 6c 75 65 20 3d 20 62 62 6f 78  >u.rValue = bbox
8cb0: 5b 33 5d 2e 66 3b 0a 20 20 20 20 20 20 20 20 7d  [3].f;.        }
8cc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
8cd0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
8ce0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 52 74  E_OK ){.      Rt
8cf0: 72 65 65 53 65 61 72 63 68 50 6f 69 6e 74 20 2a  reeSearchPoint *
8d00: 70 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77  pNew;.      pNew
8d10: 20 3d 20 72 74 72 65 65 53 65 61 72 63 68 50 6f   = rtreeSearchPo
8d20: 69 6e 74 4e 65 77 28 70 43 73 72 2c 20 52 54 52  intNew(pCsr, RTR
8d30: 45 45 5f 5a 45 52 4f 2c 20 28 75 38 29 28 70 52  EE_ZERO, (u8)(pR
8d40: 74 72 65 65 2d 3e 69 44 65 70 74 68 2b 31 29 29  tree->iDepth+1))
8d50: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77  ;.      if( pNew
8d60: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
8d70: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
8d80: 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 67  ;.        goto g
8d90: 65 6f 70 6f 6c 79 5f 66 69 6c 74 65 72 5f 65 6e  eopoly_filter_en
8da0: 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
8db0: 20 70 4e 65 77 2d 3e 69 64 20 3d 20 31 3b 0a 20   pNew->id = 1;. 
8dc0: 20 20 20 20 20 70 4e 65 77 2d 3e 69 43 65 6c 6c       pNew->iCell
8dd0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77   = 0;.      pNew
8de0: 2d 3e 65 57 69 74 68 69 6e 20 3d 20 50 41 52 54  ->eWithin = PART
8df0: 4c 59 5f 57 49 54 48 49 4e 3b 0a 20 20 20 20 20  LY_WITHIN;.     
8e00: 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e 62   assert( pCsr->b
8e10: 50 6f 69 6e 74 3d 3d 31 20 29 3b 0a 20 20 20 20  Point==1 );.    
8e20: 20 20 70 43 73 72 2d 3e 61 4e 6f 64 65 5b 30 5d    pCsr->aNode[0]
8e30: 20 3d 20 70 52 6f 6f 74 3b 0a 20 20 20 20 20 20   = pRoot;.      
8e40: 70 52 6f 6f 74 20 3d 20 30 3b 0a 20 20 20 20 20  pRoot = 0;.     
8e50: 20 52 54 52 45 45 5f 51 55 45 55 45 5f 54 52 41   RTREE_QUEUE_TRA
8e60: 43 45 28 70 43 73 72 2c 20 22 50 55 53 48 2d 46  CE(pCsr, "PUSH-F
8e70: 6d 3a 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  m:");.      rc =
8e80: 20 72 74 72 65 65 53 74 65 70 54 6f 4c 65 61 66   rtreeStepToLeaf
8e90: 28 70 43 73 72 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCsr);.    }.  
8ea0: 7d 0a 0a 67 65 6f 70 6f 6c 79 5f 66 69 6c 74 65  }..geopoly_filte
8eb0: 72 5f 65 6e 64 3a 0a 20 20 6e 6f 64 65 52 65 6c  r_end:.  nodeRel
8ec0: 65 61 73 65 28 70 52 74 72 65 65 2c 20 70 52 6f  ease(pRtree, pRo
8ed0: 6f 74 29 3b 0a 20 20 72 74 72 65 65 52 65 6c 65  ot);.  rtreeRele
8ee0: 61 73 65 28 70 52 74 72 65 65 29 3b 0a 20 20 72  ase(pRtree);.  r
8ef0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
8f00: 2a 2a 20 52 74 72 65 65 20 76 69 72 74 75 61 6c  ** Rtree virtual
8f10: 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78 42   table module xB
8f20: 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 2e  estIndex method.
8f30: 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65   There are three
8f40: 0a 2a 2a 20 74 61 62 6c 65 20 73 63 61 6e 20 73  .** table scan s
8f50: 74 72 61 74 65 67 69 65 73 20 74 6f 20 63 68 6f  trategies to cho
8f60: 6f 73 65 20 66 72 6f 6d 20 28 69 6e 20 6f 72 64  ose from (in ord
8f70: 65 72 20 66 72 6f 6d 20 6d 6f 73 74 20 74 6f 20  er from most to 
8f80: 0a 2a 2a 20 6c 65 61 73 74 20 64 65 73 69 72 61  .** least desira
8f90: 62 6c 65 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 64  ble):.**.**   id
8fa0: 78 4e 75 6d 20 20 20 20 20 69 64 78 53 74 72 20  xNum     idxStr 
8fb0: 20 20 20 20 20 20 20 53 74 72 61 74 65 67 79 0a         Strategy.
8fc0: 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  **   -----------
8fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ff0: 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 31 20 20  -----.**     1  
9000: 20 20 20 20 20 20 22 72 6f 77 69 64 22 20 20 20        "rowid"   
9010: 20 20 20 20 44 69 72 65 63 74 20 6c 6f 6f 6b 75      Direct looku
9020: 70 20 62 79 20 72 6f 77 69 64 2e 0a 2a 2a 20 20  p by rowid..**  
9030: 20 20 20 32 20 20 20 20 20 20 20 20 22 72 74 72     2        "rtr
9040: 65 65 22 20 20 20 20 20 20 20 52 2d 74 72 65 65  ee"       R-tree
9050: 20 6f 76 65 72 6c 61 70 20 71 75 65 72 79 20 75   overlap query u
9060: 73 69 6e 67 20 67 65 6f 70 6f 6c 79 5f 6f 76 65  sing geopoly_ove
9070: 72 6c 61 70 28 29 0a 2a 2a 20 20 20 20 20 33 20  rlap().**     3 
9080: 20 20 20 20 20 20 20 22 72 74 72 65 65 22 20 20         "rtree"  
9090: 20 20 20 20 20 52 2d 74 72 65 65 20 77 69 74 68       R-tree with
90a0: 69 6e 20 71 75 65 72 79 20 75 73 69 6e 67 20 67  in query using g
90b0: 65 6f 70 6f 6c 79 5f 77 69 74 68 69 6e 28 29 0a  eopoly_within().
90c0: 2a 2a 20 20 20 20 20 34 20 20 20 20 20 20 20 20  **     4        
90d0: 22 66 75 6c 6c 73 63 61 6e 22 20 20 20 20 66 75  "fullscan"    fu
90e0: 6c 6c 2d 74 61 62 6c 65 20 73 63 61 6e 2e 0a 2a  ll-table scan..*
90f0: 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
9100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9120: 2d 2d 2d 2d 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ----.*/.static i
9130: 6e 74 20 67 65 6f 70 6f 6c 79 42 65 73 74 49 6e  nt geopolyBestIn
9140: 64 65 78 28 73 71 6c 69 74 65 33 5f 76 74 61 62  dex(sqlite3_vtab
9150: 20 2a 74 61 62 2c 20 73 71 6c 69 74 65 33 5f 69   *tab, sqlite3_i
9160: 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49  ndex_info *pIdxI
9170: 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a  nfo){.  int ii;.
9180: 20 20 69 6e 74 20 69 52 6f 77 69 64 54 65 72 6d    int iRowidTerm
9190: 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 69 46 75   = -1;.  int iFu
91a0: 6e 63 54 65 72 6d 20 3d 20 2d 31 3b 0a 20 20 69  ncTerm = -1;.  i
91b0: 6e 74 20 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 0a  nt idxNum = 0;..
91c0: 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
91d0: 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72  IdxInfo->nConstr
91e0: 61 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  aint; ii++){.   
91f0: 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
9200: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
9210: 20 2a 70 20 3d 20 26 70 49 64 78 49 6e 66 6f 2d   *p = &pIdxInfo-
9220: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 69 5d  >aConstraint[ii]
9230: 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 75 73  ;.    if( !p->us
9240: 61 62 6c 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b  able ) continue;
9250: 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 43 6f 6c  .    if( p->iCol
9260: 75 6d 6e 3c 30 20 26 26 20 70 2d 3e 6f 70 3d 3d  umn<0 && p->op==
9270: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
9280: 53 54 52 41 49 4e 54 5f 45 51 20 20 29 7b 0a 20  STRAINT_EQ  ){. 
9290: 20 20 20 20 20 69 52 6f 77 69 64 54 65 72 6d 20       iRowidTerm 
92a0: 3d 20 69 69 3b 0a 20 20 20 20 20 20 62 72 65 61  = ii;.      brea
92b0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
92c0: 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 26   p->iColumn==0 &
92d0: 26 20 70 2d 3e 6f 70 3e 3d 53 51 4c 49 54 45 5f  & p->op>=SQLITE_
92e0: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
92f0: 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20  _FUNCTION ){.   
9300: 20 20 20 2f 2a 20 70 2d 3e 6f 70 3d 3d 53 51 4c     /* p->op==SQL
9310: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
9320: 41 49 4e 54 5f 46 55 4e 43 54 49 4f 4e 20 66 6f  AINT_FUNCTION fo
9330: 72 20 67 65 6f 70 6f 6c 79 5f 6f 76 65 72 6c 61  r geopoly_overla
9340: 70 28 29 0a 20 20 20 20 20 20 2a 2a 20 70 2d 3e  p().      ** p->
9350: 6f 70 3d 3d 28 53 51 4c 49 54 45 5f 49 4e 44 45  op==(SQLITE_INDE
9360: 58 5f 43 4f 4e 54 52 41 49 4e 54 5f 46 55 4e 43  X_CONTRAINT_FUNC
9370: 54 49 4f 4e 2b 31 29 20 66 6f 72 20 67 65 6f 70  TION+1) for geop
9380: 6f 6c 79 5f 77 69 74 68 69 6e 28 29 2e 0a 20 20  oly_within()..  
9390: 20 20 20 20 2a 2a 20 53 65 65 20 67 65 6f 70 6f      ** See geopo
93a0: 6c 79 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 29  lyFindFunction()
93b0: 20 2a 2f 0a 20 20 20 20 20 20 69 46 75 6e 63 54   */.      iFuncT
93c0: 65 72 6d 20 3d 20 69 69 3b 0a 20 20 20 20 20 20  erm = ii;.      
93d0: 69 64 78 4e 75 6d 20 3d 20 70 2d 3e 6f 70 20 2d  idxNum = p->op -
93e0: 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f   SQLITE_INDEX_CO
93f0: 4e 53 54 52 41 49 4e 54 5f 46 55 4e 43 54 49 4f  NSTRAINT_FUNCTIO
9400: 4e 20 2b 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d  N + 2;.    }.  }
9410: 0a 0a 20 20 69 66 28 20 69 52 6f 77 69 64 54 65  ..  if( iRowidTe
9420: 72 6d 3e 3d 30 20 29 7b 0a 20 20 20 20 70 49 64  rm>=0 ){.    pId
9430: 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20  xInfo->idxNum = 
9440: 31 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  1;.    pIdxInfo-
9450: 3e 69 64 78 53 74 72 20 3d 20 22 72 6f 77 69 64  >idxStr = "rowid
9460: 22 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  ";.    pIdxInfo-
9470: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
9480: 65 5b 69 52 6f 77 69 64 54 65 72 6d 5d 2e 61 72  e[iRowidTerm].ar
9490: 67 76 49 6e 64 65 78 20 3d 20 31 3b 0a 20 20 20  gvIndex = 1;.   
94a0: 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73   pIdxInfo->aCons
94b0: 74 72 61 69 6e 74 55 73 61 67 65 5b 69 52 6f 77  traintUsage[iRow
94c0: 69 64 54 65 72 6d 5d 2e 6f 6d 69 74 20 3d 20 31  idTerm].omit = 1
94d0: 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  ;.    pIdxInfo->
94e0: 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20  estimatedCost = 
94f0: 33 30 2e 30 3b 0a 20 20 20 20 70 49 64 78 49 6e  30.0;.    pIdxIn
9500: 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77  fo->estimatedRow
9510: 73 20 3d 20 31 3b 0a 20 20 20 20 70 49 64 78 49  s = 1;.    pIdxI
9520: 6e 66 6f 2d 3e 69 64 78 46 6c 61 67 73 20 3d 20  nfo->idxFlags = 
9530: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 43 41  SQLITE_INDEX_SCA
9540: 4e 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 72 65  N_UNIQUE;.    re
9550: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
9560: 20 20 7d 0a 20 20 69 66 28 20 69 46 75 6e 63 54    }.  if( iFuncT
9570: 65 72 6d 3e 3d 30 20 29 7b 0a 20 20 20 20 70 49  erm>=0 ){.    pI
9580: 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d  dxInfo->idxNum =
9590: 20 69 64 78 4e 75 6d 3b 0a 20 20 20 20 70 49 64   idxNum;.    pId
95a0: 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20 3d 20  xInfo->idxStr = 
95b0: 22 72 74 72 65 65 22 3b 0a 20 20 20 20 70 49 64  "rtree";.    pId
95c0: 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
95d0: 6e 74 55 73 61 67 65 5b 69 46 75 6e 63 54 65 72  ntUsage[iFuncTer
95e0: 6d 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d 20 31  m].argvIndex = 1
95f0: 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  ;.    pIdxInfo->
9600: 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
9610: 5b 69 46 75 6e 63 54 65 72 6d 5d 2e 6f 6d 69 74  [iFuncTerm].omit
9620: 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e   = 0;.    pIdxIn
9630: 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73  fo->estimatedCos
9640: 74 20 3d 20 33 30 30 2e 30 3b 0a 20 20 20 20 70  t = 300.0;.    p
9650: 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
9660: 65 64 52 6f 77 73 20 3d 20 31 30 3b 0a 20 20 20  edRows = 10;.   
9670: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
9680: 4b 3b 0a 20 20 7d 0a 20 20 70 49 64 78 49 6e 66  K;.  }.  pIdxInf
9690: 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 34 3b 0a 20  o->idxNum = 4;. 
96a0: 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74   pIdxInfo->idxSt
96b0: 72 20 3d 20 22 66 75 6c 6c 73 63 61 6e 22 3b 0a  r = "fullscan";.
96c0: 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69    pIdxInfo->esti
96d0: 6d 61 74 65 64 43 6f 73 74 20 3d 20 33 30 30 30  matedCost = 3000
96e0: 30 30 30 2e 30 3b 0a 20 20 70 49 64 78 49 6e 66  000.0;.  pIdxInf
96f0: 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73  o->estimatedRows
9700: 20 3d 20 31 30 30 30 30 30 3b 0a 20 20 72 65 74   = 100000;.  ret
9710: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
9720: 0a 0a 0a 2f 2a 20 0a 2a 2a 20 47 45 4f 50 4f 4c  .../* .** GEOPOL
9730: 59 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  Y virtual table 
9740: 6d 6f 64 75 6c 65 20 78 43 6f 6c 75 6d 6e 20 6d  module xColumn m
9750: 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ethod..*/.static
9760: 20 69 6e 74 20 67 65 6f 70 6f 6c 79 43 6f 6c 75   int geopolyColu
9770: 6d 6e 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  mn(sqlite3_vtab_
9780: 63 75 72 73 6f 72 20 2a 63 75 72 2c 20 73 71 6c  cursor *cur, sql
9790: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74  ite3_context *ct
97a0: 78 2c 20 69 6e 74 20 69 29 7b 0a 20 20 52 74 72  x, int i){.  Rtr
97b0: 65 65 20 2a 70 52 74 72 65 65 20 3d 20 28 52 74  ee *pRtree = (Rt
97c0: 72 65 65 20 2a 29 63 75 72 2d 3e 70 56 74 61 62  ree *)cur->pVtab
97d0: 3b 0a 20 20 52 74 72 65 65 43 75 72 73 6f 72 20  ;.  RtreeCursor 
97e0: 2a 70 43 73 72 20 3d 20 28 52 74 72 65 65 43 75  *pCsr = (RtreeCu
97f0: 72 73 6f 72 20 2a 29 63 75 72 3b 0a 20 20 52 74  rsor *)cur;.  Rt
9800: 72 65 65 53 65 61 72 63 68 50 6f 69 6e 74 20 2a  reeSearchPoint *
9810: 70 20 3d 20 72 74 72 65 65 53 65 61 72 63 68 50  p = rtreeSearchP
9820: 6f 69 6e 74 46 69 72 73 74 28 70 43 73 72 29 3b  ointFirst(pCsr);
9830: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
9840: 54 45 5f 4f 4b 3b 0a 20 20 52 74 72 65 65 4e 6f  TE_OK;.  RtreeNo
9850: 64 65 20 2a 70 4e 6f 64 65 20 3d 20 72 74 72 65  de *pNode = rtre
9860: 65 4e 6f 64 65 4f 66 46 69 72 73 74 53 65 61 72  eNodeOfFirstSear
9870: 63 68 50 6f 69 6e 74 28 70 43 73 72 2c 20 26 72  chPoint(pCsr, &r
9880: 63 29 3b 0a 0a 20 20 69 66 28 20 72 63 20 29 20  c);..  if( rc ) 
9890: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28  return rc;.  if(
98a0: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53   p==0 ) return S
98b0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
98c0: 69 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33 5f  i==0 && sqlite3_
98d0: 76 74 61 62 5f 6e 6f 63 68 61 6e 67 65 28 63 74  vtab_nochange(ct
98e0: 78 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  x) ) return SQLI
98f0: 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 3c 3d  TE_OK;.  if( i<=
9900: 70 52 74 72 65 65 2d 3e 6e 41 75 78 20 29 7b 0a  pRtree->nAux ){.
9910: 20 20 20 20 69 66 28 20 21 70 43 73 72 2d 3e 62      if( !pCsr->b
9920: 41 75 78 56 61 6c 69 64 20 29 7b 0a 20 20 20 20  AuxValid ){.    
9930: 20 20 69 66 28 20 70 43 73 72 2d 3e 70 52 65 61    if( pCsr->pRea
9940: 64 41 75 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  dAux==0 ){.     
9950: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
9960: 70 72 65 70 61 72 65 5f 76 33 28 70 52 74 72 65  prepare_v3(pRtre
9970: 65 2d 3e 64 62 2c 20 70 52 74 72 65 65 2d 3e 7a  e->db, pRtree->z
9980: 52 65 61 64 41 75 78 53 71 6c 2c 20 2d 31 2c 20  ReadAuxSql, -1, 
9990: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
99a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99b0: 20 20 20 26 70 43 73 72 2d 3e 70 52 65 61 64 41     &pCsr->pReadA
99c0: 75 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ux, 0);.        
99d0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
99e0: 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
99f0: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
9a00: 6e 74 36 34 28 70 43 73 72 2d 3e 70 52 65 61 64  nt64(pCsr->pRead
9a10: 41 75 78 2c 20 31 2c 20 0a 20 20 20 20 20 20 20  Aux, 1, .       
9a20: 20 20 20 6e 6f 64 65 47 65 74 52 6f 77 69 64 28     nodeGetRowid(
9a30: 70 52 74 72 65 65 2c 20 70 4e 6f 64 65 2c 20 70  pRtree, pNode, p
9a40: 2d 3e 69 43 65 6c 6c 29 29 3b 0a 20 20 20 20 20  ->iCell));.     
9a50: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74   rc = sqlite3_st
9a60: 65 70 28 70 43 73 72 2d 3e 70 52 65 61 64 41 75  ep(pCsr->pReadAu
9a70: 78 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  x);.      if( rc
9a80: 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
9a90: 20 20 20 20 20 20 20 20 70 43 73 72 2d 3e 62 41          pCsr->bA
9aa0: 75 78 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20  uxValid = 1;.   
9ab0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9ac0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28    sqlite3_reset(
9ad0: 70 43 73 72 2d 3e 70 52 65 61 64 41 75 78 29 3b  pCsr->pReadAux);
9ae0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
9af0: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20 72  =SQLITE_DONE ) r
9b00: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
9b10: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
9b20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9b30: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
9b40: 6c 74 5f 76 61 6c 75 65 28 63 74 78 2c 20 73 71  lt_value(ctx, sq
9b50: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c  lite3_column_val
9b60: 75 65 28 70 43 73 72 2d 3e 70 52 65 61 64 41 75  ue(pCsr->pReadAu
9b70: 78 2c 20 69 2b 32 29 29 3b 0a 20 20 7d 0a 20 20  x, i+2));.  }.  
9b80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
9b90: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ;.}.../*.** The 
9ba0: 78 55 70 64 61 74 65 20 6d 65 74 68 6f 64 20 66  xUpdate method f
9bb0: 6f 72 20 47 45 4f 50 4f 4c 59 20 6d 6f 64 75 6c  or GEOPOLY modul
9bc0: 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  e virtual tables
9bd0: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 44 45 4c 45  ..**.** For DELE
9be0: 54 45 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 61 72  TE:.**.**     ar
9bf0: 67 76 5b 30 5d 20 3d 20 74 68 65 20 72 6f 77 69  gv[0] = the rowi
9c00: 64 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 0a  d to be deleted.
9c10: 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 53 45 52 54  **.** For INSERT
9c20: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 61 72 67 76  :.**.**     argv
9c30: 5b 30 5d 20 3d 20 53 51 4c 20 4e 55 4c 4c 0a 2a  [0] = SQL NULL.*
9c40: 2a 20 20 20 20 20 61 72 67 76 5b 31 5d 20 3d 20  *     argv[1] = 
9c50: 72 6f 77 69 64 20 74 6f 20 69 6e 73 65 72 74 2c  rowid to insert,
9c60: 20 6f 72 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 20   or an SQL NULL 
9c70: 74 6f 20 73 65 6c 65 63 74 20 61 75 74 6f 6d 61  to select automa
9c80: 74 69 63 61 6c 6c 79 0a 2a 2a 20 20 20 20 20 61  tically.**     a
9c90: 72 67 76 5b 32 5d 20 3d 20 5f 73 68 61 70 65 20  rgv[2] = _shape 
9ca0: 63 6f 6c 75 6d 6e 0a 2a 2a 20 20 20 20 20 61 72  column.**     ar
9cb0: 67 76 5b 33 5d 20 3d 20 66 69 72 73 74 20 61 70  gv[3] = first ap
9cc0: 70 6c 69 63 61 74 69 6f 6e 2d 64 65 66 69 6e 65  plication-define
9cd0: 64 20 63 6f 6c 75 6d 6e 2e 2e 2e 2e 0a 2a 2a 0a  d column.....**.
9ce0: 2a 2a 20 46 6f 72 20 55 50 44 41 54 45 3a 0a 2a  ** For UPDATE:.*
9cf0: 2a 0a 2a 2a 20 20 20 20 20 61 72 67 76 5b 30 5d  *.**     argv[0]
9d00: 20 3d 20 72 6f 77 69 64 20 74 6f 20 6d 6f 64 69   = rowid to modi
9d10: 66 79 2e 20 20 4e 65 76 65 72 20 4e 55 4c 4c 0a  fy.  Never NULL.
9d20: 2a 2a 20 20 20 20 20 61 72 67 76 5b 31 5d 20 3d  **     argv[1] =
9d30: 20 72 6f 77 69 64 20 61 66 74 65 72 20 74 68 65   rowid after the
9d40: 20 63 68 61 6e 67 65 2e 20 20 4e 65 76 65 72 20   change.  Never 
9d50: 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 61 72 67 76  NULL.**     argv
9d60: 5b 32 5d 20 3d 20 6e 65 77 20 76 61 6c 75 65 20  [2] = new value 
9d70: 66 6f 72 20 5f 73 68 61 70 65 0a 2a 2a 20 20 20  for _shape.**   
9d80: 20 20 61 72 67 76 5b 33 5d 20 3d 20 6e 65 77 20    argv[3] = new 
9d90: 76 61 6c 75 65 20 66 6f 72 20 66 69 72 73 74 20  value for first 
9da0: 61 70 70 6c 69 63 61 74 69 6f 6e 2d 64 65 66 69  application-defi
9db0: 6e 65 64 20 63 6f 6c 75 6d 6e 2e 2e 2e 2e 0a 2a  ned column.....*
9dc0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 6f  /.static int geo
9dd0: 70 6f 6c 79 55 70 64 61 74 65 28 0a 20 20 73 71  polyUpdate(.  sq
9de0: 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
9df0: 62 2c 20 0a 20 20 69 6e 74 20 6e 44 61 74 61 2c  b, .  int nData,
9e00: 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   .  sqlite3_valu
9e10: 65 20 2a 2a 61 44 61 74 61 2c 20 0a 20 20 73 71  e **aData, .  sq
9e20: 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70 52 6f 77  lite_int64 *pRow
9e30: 69 64 0a 29 7b 0a 20 20 52 74 72 65 65 20 2a 70  id.){.  Rtree *p
9e40: 52 74 72 65 65 20 3d 20 28 52 74 72 65 65 20 2a  Rtree = (Rtree *
9e50: 29 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 72 63  )pVtab;.  int rc
9e60: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
9e70: 52 74 72 65 65 43 65 6c 6c 20 63 65 6c 6c 3b 20  RtreeCell cell; 
9e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e90: 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 74 6f 20 69  /* New cell to i
9ea0: 6e 73 65 72 74 20 69 66 20 6e 44 61 74 61 3e 31  nsert if nData>1
9eb0: 20 2a 2f 0a 20 20 69 36 34 20 6f 6c 64 52 6f 77   */.  i64 oldRow
9ec0: 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
9ed0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6c 64        /* The old
9ee0: 20 72 6f 77 69 64 20 2a 2f 0a 20 20 69 6e 74 20   rowid */.  int 
9ef0: 6f 6c 64 52 6f 77 69 64 56 61 6c 69 64 3b 20 20  oldRowidValid;  
9f00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
9f10: 72 75 65 20 69 66 20 6f 6c 64 52 6f 77 69 64 20  rue if oldRowid 
9f20: 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 69 36  is valid */.  i6
9f30: 34 20 6e 65 77 52 6f 77 69 64 3b 20 20 20 20 20  4 newRowid;     
9f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9f50: 20 54 68 65 20 6e 65 77 20 72 6f 77 69 64 20 2a   The new rowid *
9f60: 2f 0a 20 20 69 6e 74 20 6e 65 77 52 6f 77 69 64  /.  int newRowid
9f70: 56 61 6c 69 64 3b 20 20 20 20 20 20 20 20 20 20  Valid;          
9f80: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6e      /* True if n
9f90: 65 77 52 6f 77 69 64 20 69 73 20 76 61 6c 69 64  ewRowid is valid
9fa0: 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6f 72 64 43   */.  int coordC
9fb0: 68 61 6e 67 65 20 3d 20 30 3b 20 20 20 20 20 20  hange = 0;      
9fc0: 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20        /* Change 
9fd0: 69 6e 20 63 6f 6f 72 64 69 6e 61 74 65 73 20 2a  in coordinates *
9fe0: 2f 0a 0a 20 20 69 66 28 20 70 52 74 72 65 65 2d  /..  if( pRtree-
9ff0: 3e 6e 4e 6f 64 65 52 65 66 20 29 7b 0a 20 20 20  >nNodeRef ){.   
a000: 20 2f 2a 20 55 6e 61 62 6c 65 20 74 6f 20 77 72   /* Unable to wr
a010: 69 74 65 20 74 6f 20 74 68 65 20 62 74 72 65 65  ite to the btree
a020: 20 77 68 69 6c 65 20 61 6e 6f 74 68 65 72 20 63   while another c
a030: 75 72 73 6f 72 20 69 73 20 72 65 61 64 69 6e 67  ursor is reading
a040: 20 66 72 6f 6d 20 69 74 2c 0a 20 20 20 20 2a 2a   from it,.    **
a050: 20 73 69 6e 63 65 20 74 68 65 20 77 72 69 74 65   since the write
a060: 20 6d 69 67 68 74 20 64 6f 20 61 20 72 65 62 61   might do a reba
a070: 6c 61 6e 63 65 20 77 68 69 63 68 20 77 6f 75 6c  lance which woul
a080: 64 20 64 69 73 72 75 70 74 20 74 68 65 20 72 65  d disrupt the re
a090: 61 64 0a 20 20 20 20 2a 2a 20 63 75 72 73 6f 72  ad.    ** cursor
a0a0: 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  . */.    return 
a0b0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 56 54  SQLITE_LOCKED_VT
a0c0: 41 42 3b 0a 20 20 7d 0a 20 20 72 74 72 65 65 52  AB;.  }.  rtreeR
a0d0: 65 66 65 72 65 6e 63 65 28 70 52 74 72 65 65 29  eference(pRtree)
a0e0: 3b 0a 20 20 61 73 73 65 72 74 28 6e 44 61 74 61  ;.  assert(nData
a0f0: 3e 3d 31 29 3b 0a 0a 20 20 6f 6c 64 52 6f 77 69  >=1);..  oldRowi
a100: 64 56 61 6c 69 64 20 3d 20 73 71 6c 69 74 65 33  dValid = sqlite3
a110: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 44 61 74  _value_type(aDat
a120: 61 5b 30 5d 29 21 3d 53 51 4c 49 54 45 5f 4e 55  a[0])!=SQLITE_NU
a130: 4c 4c 3b 3b 0a 20 20 6f 6c 64 52 6f 77 69 64 20  LL;;.  oldRowid 
a140: 3d 20 6f 6c 64 52 6f 77 69 64 56 61 6c 69 64 20  = oldRowidValid 
a150: 3f 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ? sqlite3_value_
a160: 69 6e 74 36 34 28 61 44 61 74 61 5b 30 5d 29 20  int64(aData[0]) 
a170: 3a 20 30 3b 0a 20 20 6e 65 77 52 6f 77 69 64 56  : 0;.  newRowidV
a180: 61 6c 69 64 20 3d 20 6e 44 61 74 61 3e 31 20 26  alid = nData>1 &
a190: 26 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  & sqlite3_value_
a1a0: 74 79 70 65 28 61 44 61 74 61 5b 31 5d 29 21 3d  type(aData[1])!=
a1b0: 53 51 4c 49 54 45 5f 4e 55 4c 4c 3b 0a 20 20 6e  SQLITE_NULL;.  n
a1c0: 65 77 52 6f 77 69 64 20 3d 20 6e 65 77 52 6f 77  ewRowid = newRow
a1d0: 69 64 56 61 6c 69 64 20 3f 20 73 71 6c 69 74 65  idValid ? sqlite
a1e0: 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 44  3_value_int64(aD
a1f0: 61 74 61 5b 31 5d 29 20 3a 20 30 3b 0a 20 20 63  ata[1]) : 0;.  c
a200: 65 6c 6c 2e 69 52 6f 77 69 64 20 3d 20 6e 65 77  ell.iRowid = new
a210: 52 6f 77 69 64 3b 0a 0a 20 20 69 66 28 20 6e 44  Rowid;..  if( nD
a220: 61 74 61 3e 31 20 20 20 20 20 20 20 20 20 20 20  ata>1           
a230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a240: 20 20 20 20 20 20 2f 2a 20 6e 6f 74 20 61 20 44        /* not a D
a250: 45 4c 45 54 45 20 2a 2f 0a 20 20 20 26 26 20 28  ELETE */.   && (
a260: 21 6f 6c 64 52 6f 77 69 64 56 61 6c 69 64 20 20  !oldRowidValid  
a270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a280: 20 20 20 20 20 20 20 2f 2a 20 49 4e 53 45 52 54         /* INSERT
a290: 20 2a 2f 0a 20 20 20 20 20 20 20 20 7c 7c 20 21   */.        || !
a2a0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 6e 6f  sqlite3_value_no
a2b0: 63 68 61 6e 67 65 28 61 44 61 74 61 5b 32 5d 29  change(aData[2])
a2c0: 20 20 2f 2a 20 55 50 44 41 54 45 20 5f 73 68 61    /* UPDATE _sha
a2d0: 70 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 7c 7c  pe */.        ||
a2e0: 20 6f 6c 64 52 6f 77 69 64 21 3d 6e 65 77 52 6f   oldRowid!=newRo
a2f0: 77 69 64 29 20 20 20 20 20 20 20 20 20 20 20 20  wid)            
a300: 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 63 68 61      /* Rowid cha
a310: 6e 67 65 20 2a 2f 0a 20 20 29 7b 0a 20 20 20 20  nge */.  ){.    
a320: 67 65 6f 70 6f 6c 79 42 42 6f 78 28 30 2c 20 61  geopolyBBox(0, a
a330: 44 61 74 61 5b 32 5d 2c 20 63 65 6c 6c 2e 61 43  Data[2], cell.aC
a340: 6f 6f 72 64 2c 20 26 72 63 29 3b 0a 20 20 20 20  oord, &rc);.    
a350: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
a360: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45  if( rc==SQLITE_E
a370: 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 20 20  RROR ){.        
a380: 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d  pVtab->zErrMsg =
a390: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
a3a0: 65 33 5f 6d 70 72 69 6e 74 66 28 22 5f 73 68 61  e3_mprintf("_sha
a3b0: 70 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  pe does not cont
a3c0: 61 69 6e 20 61 20 76 61 6c 69 64 20 70 6f 6c 79  ain a valid poly
a3d0: 67 6f 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  gon");.      }. 
a3e0: 20 20 20 20 20 67 6f 74 6f 20 67 65 6f 70 6f 6c       goto geopol
a3f0: 79 5f 75 70 64 61 74 65 5f 65 6e 64 3b 0a 20 20  y_update_end;.  
a400: 20 20 7d 0a 20 20 20 20 63 6f 6f 72 64 43 68 61    }.    coordCha
a410: 6e 67 65 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a  nge = 1;..    /*
a420: 20 49 66 20 61 20 72 6f 77 69 64 20 76 61 6c 75   If a rowid valu
a430: 65 20 77 61 73 20 73 75 70 70 6c 69 65 64 2c 20  e was supplied, 
a440: 63 68 65 63 6b 20 69 66 20 69 74 20 69 73 20 61  check if it is a
a450: 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 20 69  lready present i
a460: 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 61  n .    ** the ta
a470: 62 6c 65 2e 20 49 66 20 73 6f 2c 20 74 68 65 20  ble. If so, the 
a480: 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 73 20 66  constraint has f
a490: 61 69 6c 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66  ailed. */.    if
a4a0: 28 20 6e 65 77 52 6f 77 69 64 56 61 6c 69 64 20  ( newRowidValid 
a4b0: 26 26 20 28 21 6f 6c 64 52 6f 77 69 64 56 61 6c  && (!oldRowidVal
a4c0: 69 64 20 7c 7c 20 6f 6c 64 52 6f 77 69 64 21 3d  id || oldRowid!=
a4d0: 6e 65 77 52 6f 77 69 64 29 20 29 7b 0a 20 20 20  newRowid) ){.   
a4e0: 20 20 20 69 6e 74 20 73 74 65 70 72 63 3b 0a 20     int steprc;. 
a4f0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
a500: 64 5f 69 6e 74 36 34 28 70 52 74 72 65 65 2d 3e  d_int64(pRtree->
a510: 70 52 65 61 64 52 6f 77 69 64 2c 20 31 2c 20 63  pReadRowid, 1, c
a520: 65 6c 6c 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20  ell.iRowid);.   
a530: 20 20 20 73 74 65 70 72 63 20 3d 20 73 71 6c 69     steprc = sqli
a540: 74 65 33 5f 73 74 65 70 28 70 52 74 72 65 65 2d  te3_step(pRtree-
a550: 3e 70 52 65 61 64 52 6f 77 69 64 29 3b 0a 20 20  >pReadRowid);.  
a560: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
a570: 5f 72 65 73 65 74 28 70 52 74 72 65 65 2d 3e 70  _reset(pRtree->p
a580: 52 65 61 64 52 6f 77 69 64 29 3b 0a 20 20 20 20  ReadRowid);.    
a590: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57    if( SQLITE_ROW
a5a0: 3d 3d 73 74 65 70 72 63 20 29 7b 0a 20 20 20 20  ==steprc ){.    
a5b0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
a5c0: 76 74 61 62 5f 6f 6e 5f 63 6f 6e 66 6c 69 63 74  vtab_on_conflict
a5d0: 28 70 52 74 72 65 65 2d 3e 64 62 29 3d 3d 53 51  (pRtree->db)==SQ
a5e0: 4c 49 54 45 5f 52 45 50 4c 41 43 45 20 29 7b 0a  LITE_REPLACE ){.
a5f0: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 72            rc = r
a600: 74 72 65 65 44 65 6c 65 74 65 52 6f 77 69 64 28  treeDeleteRowid(
a610: 70 52 74 72 65 65 2c 20 63 65 6c 6c 2e 69 52 6f  pRtree, cell.iRo
a620: 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  wid);.        }e
a630: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
a640: 63 20 3d 20 72 74 72 65 65 43 6f 6e 73 74 72 61  c = rtreeConstra
a650: 69 6e 74 45 72 72 6f 72 28 70 52 74 72 65 65 2c  intError(pRtree,
a660: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
a670: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
a680: 0a 0a 20 20 2f 2a 20 49 66 20 61 44 61 74 61 5b  ..  /* If aData[
a690: 30 5d 20 69 73 20 6e 6f 74 20 61 6e 20 53 51 4c  0] is not an SQL
a6a0: 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 69 74 20   NULL value, it 
a6b0: 69 73 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20  is the rowid of 
a6c0: 61 0a 20 20 2a 2a 20 72 65 63 6f 72 64 20 74 6f  a.  ** record to
a6d0: 20 64 65 6c 65 74 65 20 66 72 6f 6d 20 74 68 65   delete from the
a6e0: 20 72 2d 74 72 65 65 20 74 61 62 6c 65 2e 20 54   r-tree table. T
a6f0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
a700: 63 6b 20 64 6f 65 73 0a 20 20 2a 2a 20 6a 75 73  ck does.  ** jus
a710: 74 20 74 68 61 74 2e 0a 20 20 2a 2f 0a 20 20 69  t that..  */.  i
a720: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
a730: 20 26 26 20 28 6e 44 61 74 61 3d 3d 31 20 7c 7c   && (nData==1 ||
a740: 20 28 63 6f 6f 72 64 43 68 61 6e 67 65 20 26 26   (coordChange &&
a750: 20 6f 6c 64 52 6f 77 69 64 56 61 6c 69 64 29 29   oldRowidValid))
a760: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 74 72   ){.    rc = rtr
a770: 65 65 44 65 6c 65 74 65 52 6f 77 69 64 28 70 52  eeDeleteRowid(pR
a780: 74 72 65 65 2c 20 6f 6c 64 52 6f 77 69 64 29 3b  tree, oldRowid);
a790: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
a7a0: 65 20 61 44 61 74 61 5b 5d 20 61 72 72 61 79 20  e aData[] array 
a7b0: 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68  contains more th
a7c0: 61 6e 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 2c 20  an one element, 
a7d0: 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 28 61  elements.  ** (a
a7e0: 44 61 74 61 5b 32 5d 2e 2e 61 44 61 74 61 5b 61  Data[2]..aData[a
a7f0: 72 67 63 2d 31 5d 29 20 63 6f 6e 74 61 69 6e 20  rgc-1]) contain 
a800: 61 20 6e 65 77 20 72 65 63 6f 72 64 20 74 6f 20  a new record to 
a810: 69 6e 73 65 72 74 20 69 6e 74 6f 0a 20 20 2a 2a  insert into.  **
a820: 20 74 68 65 20 72 2d 74 72 65 65 20 73 74 72 75   the r-tree stru
a830: 63 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  cture..  */.  if
a840: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
a850: 26 26 20 6e 44 61 74 61 3e 31 20 26 26 20 63 6f  && nData>1 && co
a860: 6f 72 64 43 68 61 6e 67 65 20 29 7b 0a 20 20 20  ordChange ){.   
a870: 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e   /* Insert the n
a880: 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74  ew record into t
a890: 68 65 20 72 2d 74 72 65 65 20 2a 2f 0a 20 20 20  he r-tree */.   
a8a0: 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 4c 65 61   RtreeNode *pLea
a8b0: 66 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 21  f = 0;.    if( !
a8c0: 6e 65 77 52 6f 77 69 64 56 61 6c 69 64 20 29 7b  newRowidValid ){
a8d0: 0a 20 20 20 20 20 20 72 63 20 3d 20 72 74 72 65  .      rc = rtre
a8e0: 65 4e 65 77 52 6f 77 69 64 28 70 52 74 72 65 65  eNewRowid(pRtree
a8f0: 2c 20 26 63 65 6c 6c 2e 69 52 6f 77 69 64 29 3b  , &cell.iRowid);
a900: 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 52 6f 77  .    }.    *pRow
a910: 69 64 20 3d 20 63 65 6c 6c 2e 69 52 6f 77 69 64  id = cell.iRowid
a920: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
a930: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
a940: 20 72 63 20 3d 20 43 68 6f 6f 73 65 4c 65 61 66   rc = ChooseLeaf
a950: 28 70 52 74 72 65 65 2c 20 26 63 65 6c 6c 2c 20  (pRtree, &cell, 
a960: 30 2c 20 26 70 4c 65 61 66 29 3b 0a 20 20 20 20  0, &pLeaf);.    
a970: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
a980: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
a990: 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 20 20   int rc2;.      
a9a0: 70 52 74 72 65 65 2d 3e 69 52 65 69 6e 73 65 72  pRtree->iReinser
a9b0: 74 48 65 69 67 68 74 20 3d 20 2d 31 3b 0a 20 20  tHeight = -1;.  
a9c0: 20 20 20 20 72 63 20 3d 20 72 74 72 65 65 49 6e      rc = rtreeIn
a9d0: 73 65 72 74 43 65 6c 6c 28 70 52 74 72 65 65 2c  sertCell(pRtree,
a9e0: 20 70 4c 65 61 66 2c 20 26 63 65 6c 6c 2c 20 30   pLeaf, &cell, 0
a9f0: 29 3b 0a 20 20 20 20 20 20 72 63 32 20 3d 20 6e  );.      rc2 = n
aa00: 6f 64 65 52 65 6c 65 61 73 65 28 70 52 74 72 65  odeRelease(pRtre
aa10: 65 2c 20 70 4c 65 61 66 29 3b 0a 20 20 20 20 20  e, pLeaf);.     
aa20: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
aa30: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
aa40: 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 7d 0a   = rc2;.      }.
aa50: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
aa60: 43 68 61 6e 67 65 20 74 68 65 20 64 61 74 61 20  Change the data 
aa70: 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
aa80: 49 54 45 5f 4f 4b 20 26 26 20 6e 44 61 74 61 3e  ITE_OK && nData>
aa90: 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 ){.    sqlite3
aaa0: 5f 73 74 6d 74 20 2a 70 55 70 20 3d 20 70 52 74  _stmt *pUp = pRt
aab0: 72 65 65 2d 3e 70 57 72 69 74 65 41 75 78 3b 0a  ree->pWriteAux;.
aac0: 20 20 20 20 69 6e 74 20 6a 6a 3b 0a 20 20 20 20      int jj;.    
aad0: 69 6e 74 20 6e 43 68 61 6e 67 65 20 3d 20 30 3b  int nChange = 0;
aae0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  .    sqlite3_bin
aaf0: 64 5f 69 6e 74 36 34 28 70 55 70 2c 20 31 2c 20  d_int64(pUp, 1, 
ab00: 63 65 6c 6c 2e 69 52 6f 77 69 64 29 3b 0a 20 20  cell.iRowid);.  
ab10: 20 20 61 73 73 65 72 74 28 20 70 52 74 72 65 65    assert( pRtree
ab20: 2d 3e 6e 41 75 78 3e 3d 31 20 29 3b 0a 20 20 20  ->nAux>=1 );.   
ab30: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c   if( sqlite3_val
ab40: 75 65 5f 6e 6f 63 68 61 6e 67 65 28 61 44 61 74  ue_nochange(aDat
ab50: 61 5b 32 5d 29 20 29 7b 0a 20 20 20 20 20 20 73  a[2]) ){.      s
ab60: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c  qlite3_bind_null
ab70: 28 70 55 70 2c 20 32 29 3b 0a 20 20 20 20 7d 65  (pUp, 2);.    }e
ab80: 6c 73 65 7b 0a 20 20 20 20 20 20 47 65 6f 50 6f  lse{.      GeoPo
ab90: 6c 79 20 2a 70 20 3d 20 30 3b 0a 20 20 20 20 20  ly *p = 0;.     
aba0: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c   if( sqlite3_val
abb0: 75 65 5f 74 79 70 65 28 61 44 61 74 61 5b 32 5d  ue_type(aData[2]
abc0: 29 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 0a 20  )==SQLITE_TEXT. 
abd0: 20 20 20 20 20 20 26 26 20 28 70 20 3d 20 67 65        && (p = ge
abe0: 6f 70 6f 6c 79 46 75 6e 63 50 61 72 61 6d 28 30  opolyFuncParam(0
abf0: 2c 20 61 44 61 74 61 5b 32 5d 2c 20 26 72 63 29  , aData[2], &rc)
ac00: 29 21 3d 30 0a 20 20 20 20 20 20 20 26 26 20 72  )!=0.       && r
ac10: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20  c==SQLITE_OK.   
ac20: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71     ){.        sq
ac30: 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28  lite3_bind_blob(
ac40: 70 55 70 2c 20 32 2c 20 70 2d 3e 68 64 72 2c 20  pUp, 2, p->hdr, 
ac50: 34 2b 38 2a 70 2d 3e 6e 56 65 72 74 65 78 2c 20  4+8*p->nVertex, 
ac60: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
ac70: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
ac80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
ac90: 62 69 6e 64 5f 76 61 6c 75 65 28 70 55 70 2c 20  bind_value(pUp, 
aca0: 32 2c 20 61 44 61 74 61 5b 32 5d 29 3b 0a 20 20  2, aData[2]);.  
acb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
acc0: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
acd0: 20 20 20 6e 43 68 61 6e 67 65 20 3d 20 31 3b 0a     nChange = 1;.
ace0: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 6a 6a      }.    for(jj
acf0: 3d 31 3b 20 6a 6a 3c 70 52 74 72 65 65 2d 3e 6e  =1; jj<pRtree->n
ad00: 41 75 78 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20  Aux; jj++){.    
ad10: 20 20 6e 43 68 61 6e 67 65 2b 2b 3b 0a 20 20 20    nChange++;.   
ad20: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
ad30: 76 61 6c 75 65 28 70 55 70 2c 20 6a 6a 2b 32 2c  value(pUp, jj+2,
ad40: 20 61 44 61 74 61 5b 6a 6a 2b 32 5d 29 3b 0a 20   aData[jj+2]);. 
ad50: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 43 68     }.    if( nCh
ad60: 61 6e 67 65 20 29 7b 0a 20 20 20 20 20 20 73 71  ange ){.      sq
ad70: 6c 69 74 65 33 5f 73 74 65 70 28 70 55 70 29 3b  lite3_step(pUp);
ad80: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
ad90: 74 65 33 5f 72 65 73 65 74 28 70 55 70 29 3b 0a  te3_reset(pUp);.
ada0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 67 65 6f 70 6f      }.  }..geopo
adb0: 6c 79 5f 75 70 64 61 74 65 5f 65 6e 64 3a 0a 20  ly_update_end:. 
adc0: 20 72 74 72 65 65 52 65 6c 65 61 73 65 28 70 52   rtreeRelease(pR
add0: 74 72 65 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  tree);.  return 
ade0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70  rc;.}../*.** Rep
adf0: 6f 72 74 20 74 68 61 74 20 67 65 6f 70 6f 6c 79  ort that geopoly
ae00: 5f 6f 76 65 72 6c 61 70 28 29 20 69 73 20 61 6e  _overlap() is an
ae10: 20 6f 76 65 72 6c 6f 61 64 65 64 20 66 75 6e 63   overloaded func
ae20: 74 69 6f 6e 20 73 75 69 74 61 62 6c 65 0a 2a 2a  tion suitable.**
ae30: 20 66 6f 72 20 75 73 65 20 69 6e 20 78 42 65 73   for use in xBes
ae40: 74 49 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69  tIndex..*/.stati
ae50: 63 20 69 6e 74 20 67 65 6f 70 6f 6c 79 46 69 6e  c int geopolyFin
ae60: 64 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c  dFunction(.  sql
ae70: 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
ae80: 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20  ,.  int nArg,.  
ae90: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
aea0: 65 2c 0a 20 20 76 6f 69 64 20 28 2a 2a 70 78 46  e,.  void (**pxF
aeb0: 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  unc)(sqlite3_con
aec0: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
aed0: 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f  3_value**),.  vo
aee0: 69 64 20 2a 2a 70 70 41 72 67 0a 29 7b 0a 20 20  id **ppArg.){.  
aef0: 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69  if( sqlite3_stri
af00: 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 67 65 6f 70  cmp(zName, "geop
af10: 6f 6c 79 5f 6f 76 65 72 6c 61 70 22 29 3d 3d 30  oly_overlap")==0
af20: 20 29 7b 0a 20 20 20 20 2a 70 78 46 75 6e 63 20   ){.    *pxFunc 
af30: 3d 20 67 65 6f 70 6f 6c 79 4f 76 65 72 6c 61 70  = geopolyOverlap
af40: 46 75 6e 63 3b 0a 20 20 20 20 2a 70 70 41 72 67  Func;.    *ppArg
af50: 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
af60: 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f   SQLITE_INDEX_CO
af70: 4e 53 54 52 41 49 4e 54 5f 46 55 4e 43 54 49 4f  NSTRAINT_FUNCTIO
af80: 4e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  N;.  }.  if( sql
af90: 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 4e 61  ite3_stricmp(zNa
afa0: 6d 65 2c 20 22 67 65 6f 70 6f 6c 79 5f 77 69 74  me, "geopoly_wit
afb0: 68 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  hin")==0 ){.    
afc0: 2a 70 78 46 75 6e 63 20 3d 20 67 65 6f 70 6f 6c  *pxFunc = geopol
afd0: 79 57 69 74 68 69 6e 46 75 6e 63 3b 0a 20 20 20  yWithinFunc;.   
afe0: 20 2a 70 70 41 72 67 20 3d 20 30 3b 0a 20 20 20   *ppArg = 0;.   
aff0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
b000: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
b010: 46 55 4e 43 54 49 4f 4e 2b 31 3b 0a 20 20 7d 0a  FUNCTION+1;.  }.
b020: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a    return 0;.}...
b030: 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 6d  static sqlite3_m
b040: 6f 64 75 6c 65 20 67 65 6f 70 6f 6c 79 4d 6f 64  odule geopolyMod
b050: 75 6c 65 20 3d 20 7b 0a 20 20 32 2c 20 20 20 20  ule = {.  2,    
b060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b070: 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f        /* iVersio
b080: 6e 20 2a 2f 0a 20 20 67 65 6f 70 6f 6c 79 43 72  n */.  geopolyCr
b090: 65 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  eate,           
b0a0: 20 20 20 2f 2a 20 78 43 72 65 61 74 65 20 2d 20     /* xCreate - 
b0b0: 63 72 65 61 74 65 20 61 20 74 61 62 6c 65 20 2a  create a table *
b0c0: 2f 0a 20 20 67 65 6f 70 6f 6c 79 43 6f 6e 6e 65  /.  geopolyConne
b0d0: 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ct,             
b0e0: 2f 2a 20 78 43 6f 6e 6e 65 63 74 20 2d 20 63 6f  /* xConnect - co
b0f0: 6e 6e 65 63 74 20 74 6f 20 61 6e 20 65 78 69 73  nnect to an exis
b100: 74 69 6e 67 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ting table */.  
b110: 67 65 6f 70 6f 6c 79 42 65 73 74 49 6e 64 65 78  geopolyBestIndex
b120: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ,           /* x
b130: 42 65 73 74 49 6e 64 65 78 20 2d 20 44 65 74 65  BestIndex - Dete
b140: 72 6d 69 6e 65 20 73 65 61 72 63 68 20 73 74 72  rmine search str
b150: 61 74 65 67 79 20 2a 2f 0a 20 20 72 74 72 65 65  ategy */.  rtree
b160: 44 69 73 63 6f 6e 6e 65 63 74 2c 20 20 20 20 20  Disconnect,     
b170: 20 20 20 20 20 20 20 2f 2a 20 78 44 69 73 63 6f         /* xDisco
b180: 6e 6e 65 63 74 20 2d 20 44 69 73 63 6f 6e 6e 65  nnect - Disconne
b190: 63 74 20 66 72 6f 6d 20 61 20 74 61 62 6c 65 20  ct from a table 
b1a0: 2a 2f 0a 20 20 72 74 72 65 65 44 65 73 74 72 6f  */.  rtreeDestro
b1b0: 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y,              
b1c0: 20 2f 2a 20 78 44 65 73 74 72 6f 79 20 2d 20 44   /* xDestroy - D
b1d0: 72 6f 70 20 61 20 74 61 62 6c 65 20 2a 2f 0a 20  rop a table */. 
b1e0: 20 72 74 72 65 65 4f 70 65 6e 2c 20 20 20 20 20   rtreeOpen,     
b1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b200: 78 4f 70 65 6e 20 2d 20 6f 70 65 6e 20 61 20 63  xOpen - open a c
b210: 75 72 73 6f 72 20 2a 2f 0a 20 20 72 74 72 65 65  ursor */.  rtree
b220: 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
b230: 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
b240: 20 2d 20 63 6c 6f 73 65 20 61 20 63 75 72 73 6f   - close a curso
b250: 72 20 2a 2f 0a 20 20 67 65 6f 70 6f 6c 79 46 69  r */.  geopolyFi
b260: 6c 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  lter,           
b270: 20 20 20 2f 2a 20 78 46 69 6c 74 65 72 20 2d 20     /* xFilter - 
b280: 63 6f 6e 66 69 67 75 72 65 20 73 63 61 6e 20 63  configure scan c
b290: 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
b2a0: 72 74 72 65 65 4e 65 78 74 2c 20 20 20 20 20 20  rtreeNext,      
b2b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
b2c0: 4e 65 78 74 20 2d 20 61 64 76 61 6e 63 65 20 61  Next - advance a
b2d0: 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 72 74 72   cursor */.  rtr
b2e0: 65 65 45 6f 66 2c 20 20 20 20 20 20 20 20 20 20  eeEof,          
b2f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 45 6f 66           /* xEof
b300: 20 2a 2f 0a 20 20 67 65 6f 70 6f 6c 79 43 6f 6c   */.  geopolyCol
b310: 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  umn,            
b320: 20 20 2f 2a 20 78 43 6f 6c 75 6d 6e 20 2d 20 72    /* xColumn - r
b330: 65 61 64 20 64 61 74 61 20 2a 2f 0a 20 20 72 74  ead data */.  rt
b340: 72 65 65 52 6f 77 69 64 2c 20 20 20 20 20 20 20  reeRowid,       
b350: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f            /* xRo
b360: 77 69 64 20 2d 20 72 65 61 64 20 64 61 74 61 20  wid - read data 
b370: 2a 2f 0a 20 20 67 65 6f 70 6f 6c 79 55 70 64 61  */.  geopolyUpda
b380: 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
b390: 20 2f 2a 20 78 55 70 64 61 74 65 20 2d 20 77 72   /* xUpdate - wr
b3a0: 69 74 65 20 64 61 74 61 20 2a 2f 0a 20 20 72 74  ite data */.  rt
b3b0: 72 65 65 42 65 67 69 6e 54 72 61 6e 73 61 63 74  reeBeginTransact
b3c0: 69 6f 6e 2c 20 20 20 20 20 20 2f 2a 20 78 42 65  ion,      /* xBe
b3d0: 67 69 6e 20 2d 20 62 65 67 69 6e 20 74 72 61 6e  gin - begin tran
b3e0: 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 72 74 72  saction */.  rtr
b3f0: 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e  eeEndTransaction
b400: 2c 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e  ,        /* xSyn
b410: 63 20 2d 20 73 79 6e 63 20 74 72 61 6e 73 61 63  c - sync transac
b420: 74 69 6f 6e 20 2a 2f 0a 20 20 72 74 72 65 65 45  tion */.  rtreeE
b430: 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 20  ndTransaction,  
b440: 20 20 20 20 20 20 2f 2a 20 78 43 6f 6d 6d 69 74        /* xCommit
b450: 20 2d 20 63 6f 6d 6d 69 74 20 74 72 61 6e 73 61   - commit transa
b460: 63 74 69 6f 6e 20 2a 2f 0a 20 20 72 74 72 65 65  ction */.  rtree
b470: 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20  EndTransaction, 
b480: 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 6c 6c 62         /* xRollb
b490: 61 63 6b 20 2d 20 72 6f 6c 6c 62 61 63 6b 20 74  ack - rollback t
b4a0: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  ransaction */.  
b4b0: 67 65 6f 70 6f 6c 79 46 69 6e 64 46 75 6e 63 74  geopolyFindFunct
b4c0: 69 6f 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 78  ion,        /* x
b4d0: 46 69 6e 64 46 75 6e 63 74 69 6f 6e 20 2d 20 66  FindFunction - f
b4e0: 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64  unction overload
b4f0: 69 6e 67 20 2a 2f 0a 20 20 72 74 72 65 65 52 65  ing */.  rtreeRe
b500: 6e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20  name,           
b510: 20 20 20 20 20 2f 2a 20 78 52 65 6e 61 6d 65 20       /* xRename 
b520: 2d 20 72 65 6e 61 6d 65 20 74 68 65 20 74 61 62  - rename the tab
b530: 6c 65 20 2a 2f 0a 20 20 72 74 72 65 65 53 61 76  le */.  rtreeSav
b540: 65 70 6f 69 6e 74 2c 20 20 20 20 20 20 20 20 20  epoint,         
b550: 20 20 20 20 2f 2a 20 78 53 61 76 65 70 6f 69 6e      /* xSavepoin
b560: 74 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  t */.  0,       
b570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b580: 20 20 20 2f 2a 20 78 52 65 6c 65 61 73 65 20 2a     /* xRelease *
b590: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
b5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5b0: 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 54 6f 20 2a  /* xRollbackTo *
b5c0: 2f 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74  /.};..static int
b5d0: 20 73 71 6c 69 74 65 33 5f 67 65 6f 70 6f 6c 79   sqlite3_geopoly
b5e0: 5f 69 6e 69 74 28 73 71 6c 69 74 65 33 20 2a 64  _init(sqlite3 *d
b5f0: 62 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  b){.  int rc = S
b600: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 74 61 74  QLITE_OK;.  stat
b610: 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
b620: 7b 0a 20 20 20 20 76 6f 69 64 20 28 2a 78 46 75  {.    void (*xFu
b630: 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  nc)(sqlite3_cont
b640: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
b650: 5f 76 61 6c 75 65 2a 2a 29 3b 0a 20 20 20 20 73  _value**);.    s
b660: 69 67 6e 65 64 20 63 68 61 72 20 6e 41 72 67 3b  igned char nArg;
b670: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
b680: 61 72 20 62 50 75 72 65 3b 0a 20 20 20 20 63 6f  ar bPure;.    co
b690: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
b6a0: 0a 20 20 7d 20 61 46 75 6e 63 5b 5d 20 3d 20 7b  .  } aFunc[] = {
b6b0: 0a 20 20 20 20 20 7b 20 67 65 6f 70 6f 6c 79 41  .     { geopolyA
b6c0: 72 65 61 46 75 6e 63 2c 20 20 20 20 20 20 20 20  reaFunc,        
b6d0: 20 20 31 2c 20 31 2c 20 20 20 20 22 67 65 6f 70    1, 1,    "geop
b6e0: 6f 6c 79 5f 61 72 65 61 22 20 20 20 20 20 20 20  oly_area"       
b6f0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
b700: 67 65 6f 70 6f 6c 79 42 6c 6f 62 46 75 6e 63 2c  geopolyBlobFunc,
b710: 20 20 20 20 20 20 20 20 20 20 31 2c 20 31 2c 20            1, 1, 
b720: 20 20 20 22 67 65 6f 70 6f 6c 79 5f 62 6c 6f 62     "geopoly_blob
b730: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  "             },
b740: 0a 20 20 20 20 20 7b 20 67 65 6f 70 6f 6c 79 4a  .     { geopolyJ
b750: 73 6f 6e 46 75 6e 63 2c 20 20 20 20 20 20 20 20  sonFunc,        
b760: 20 20 31 2c 20 31 2c 20 20 20 20 22 67 65 6f 70    1, 1,    "geop
b770: 6f 6c 79 5f 6a 73 6f 6e 22 20 20 20 20 20 20 20  oly_json"       
b780: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
b790: 67 65 6f 70 6f 6c 79 53 76 67 46 75 6e 63 2c 20  geopolySvgFunc, 
b7a0: 20 20 20 20 20 20 20 20 20 2d 31 2c 20 31 2c 20           -1, 1, 
b7b0: 20 20 20 22 67 65 6f 70 6f 6c 79 5f 73 76 67 22     "geopoly_svg"
b7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
b7d0: 0a 20 20 20 20 20 7b 20 67 65 6f 70 6f 6c 79 57  .     { geopolyW
b7e0: 69 74 68 69 6e 46 75 6e 63 2c 20 20 20 20 20 20  ithinFunc,      
b7f0: 20 20 32 2c 20 31 2c 20 20 20 20 22 67 65 6f 70    2, 1,    "geop
b800: 6f 6c 79 5f 77 69 74 68 69 6e 22 20 20 20 20 20  oly_within"     
b810: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
b820: 67 65 6f 70 6f 6c 79 43 6f 6e 74 61 69 6e 73 50  geopolyContainsP
b830: 6f 69 6e 74 46 75 6e 63 2c 20 33 2c 20 31 2c 20  ointFunc, 3, 1, 
b840: 20 20 20 22 67 65 6f 70 6f 6c 79 5f 63 6f 6e 74     "geopoly_cont
b850: 61 69 6e 73 5f 70 6f 69 6e 74 22 20 20 20 7d 2c  ains_point"   },
b860: 0a 20 20 20 20 20 7b 20 67 65 6f 70 6f 6c 79 4f  .     { geopolyO
b870: 76 65 72 6c 61 70 46 75 6e 63 2c 20 20 20 20 20  verlapFunc,     
b880: 20 20 32 2c 20 31 2c 20 20 20 20 22 67 65 6f 70    2, 1,    "geop
b890: 6f 6c 79 5f 6f 76 65 72 6c 61 70 22 20 20 20 20  oly_overlap"    
b8a0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
b8b0: 67 65 6f 70 6f 6c 79 44 65 62 75 67 46 75 6e 63  geopolyDebugFunc
b8c0: 2c 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20  ,         1, 0, 
b8d0: 20 20 20 22 67 65 6f 70 6f 6c 79 5f 64 65 62 75     "geopoly_debu
b8e0: 67 22 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  g"            },
b8f0: 0a 20 20 20 20 20 7b 20 67 65 6f 70 6f 6c 79 42  .     { geopolyB
b900: 42 6f 78 46 75 6e 63 2c 20 20 20 20 20 20 20 20  BoxFunc,        
b910: 20 20 31 2c 20 31 2c 20 20 20 20 22 67 65 6f 70    1, 1,    "geop
b920: 6f 6c 79 5f 62 62 6f 78 22 20 20 20 20 20 20 20  oly_bbox"       
b930: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
b940: 67 65 6f 70 6f 6c 79 58 66 6f 72 6d 46 75 6e 63  geopolyXformFunc
b950: 2c 20 20 20 20 20 20 20 20 20 37 2c 20 31 2c 20  ,         7, 1, 
b960: 20 20 20 22 67 65 6f 70 6f 6c 79 5f 78 66 6f 72     "geopoly_xfor
b970: 6d 22 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  m"            },
b980: 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63  .  };.  static c
b990: 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20  onst struct {.  
b9a0: 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28    void (*xStep)(
b9b0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
b9c0: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
b9d0: 75 65 2a 2a 29 3b 0a 20 20 20 20 76 6f 69 64 20  ue**);.    void 
b9e0: 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65  (*xFinal)(sqlite
b9f0: 33 5f 63 6f 6e 74 65 78 74 2a 29 3b 0a 20 20 20  3_context*);.   
ba00: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
ba10: 6d 65 3b 0a 20 20 7d 20 61 41 67 67 5b 5d 20 3d  me;.  } aAgg[] =
ba20: 20 7b 0a 20 20 20 20 20 7b 20 67 65 6f 70 6f 6c   {.     { geopol
ba30: 79 42 42 6f 78 53 74 65 70 2c 20 67 65 6f 70 6f  yBBoxStep, geopo
ba40: 6c 79 42 42 6f 78 46 69 6e 61 6c 2c 20 22 67 65  lyBBoxFinal, "ge
ba50: 6f 70 6f 6c 79 5f 67 72 6f 75 70 5f 62 62 6f 78  opoly_group_bbox
ba60: 22 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69  "    },.  };.  i
ba70: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
ba80: 20 69 3c 73 69 7a 65 6f 66 28 61 46 75 6e 63 29   i<sizeof(aFunc)
ba90: 2f 73 69 7a 65 6f 66 28 61 46 75 6e 63 5b 30 5d  /sizeof(aFunc[0]
baa0: 29 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ) && rc==SQLITE_
bab0: 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  OK; i++){.    in
bac0: 74 20 65 6e 63 20 3d 20 61 46 75 6e 63 5b 69 5d  t enc = aFunc[i]
bad0: 2e 62 50 75 72 65 20 3f 20 53 51 4c 49 54 45 5f  .bPure ? SQLITE_
bae0: 55 54 46 38 7c 53 51 4c 49 54 45 5f 44 45 54 45  UTF8|SQLITE_DETE
baf0: 52 4d 49 4e 49 53 54 49 43 20 3a 20 53 51 4c 49  RMINISTIC : SQLI
bb00: 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 72 63 20  TE_UTF8;.    rc 
bb10: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
bb20: 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 61 46  _function(db, aF
bb30: 75 6e 63 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 61 46  unc[i].zName, aF
bb40: 75 6e 63 5b 69 5d 2e 6e 41 72 67 2c 0a 20 20 20  unc[i].nArg,.   
bb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 6e                en
bb70: 63 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  c, 0,.          
bb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb90: 20 20 20 20 20 20 20 61 46 75 6e 63 5b 69 5d 2e         aFunc[i].
bba0: 78 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20  xFunc, 0, 0);.  
bbb0: 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  }.  for(i=0; i<s
bbc0: 69 7a 65 6f 66 28 61 41 67 67 29 2f 73 69 7a 65  izeof(aAgg)/size
bbd0: 6f 66 28 61 41 67 67 5b 30 5d 29 20 26 26 20 72  of(aAgg[0]) && r
bbe0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b  c==SQLITE_OK; i+
bbf0: 2b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  +){.    rc = sql
bc00: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
bc10: 74 69 6f 6e 28 64 62 2c 20 61 41 67 67 5b 69 5d  tion(db, aAgg[i]
bc20: 2e 7a 4e 61 6d 65 2c 20 31 2c 20 53 51 4c 49 54  .zName, 1, SQLIT
bc30: 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20  E_UTF8, 0,.     
bc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc50: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 61              0, a
bc60: 41 67 67 5b 69 5d 2e 78 53 74 65 70 2c 20 61 41  Agg[i].xStep, aA
bc70: 67 67 5b 69 5d 2e 78 46 69 6e 61 6c 29 3b 0a 20  gg[i].xFinal);. 
bc80: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
bc90: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
bca0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
bcb0: 65 5f 6d 6f 64 75 6c 65 5f 76 32 28 64 62 2c 20  e_module_v2(db, 
bcc0: 22 67 65 6f 70 6f 6c 79 22 2c 20 26 67 65 6f 70  "geopoly", &geop
bcd0: 6f 6c 79 4d 6f 64 75 6c 65 2c 20 30 2c 20 30 29  olyModule, 0, 0)
bce0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
bcf0: 63 3b 0a 7d 0a                                   c;.}.