/ Hex Artifact Content
Login

Artifact e1b192440686ee041f94a510298f5d1d44e24f5c777674c1d00be616c6ac9633:


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 70 2d 3e  p){.  while( p->
12a0: 7a 5b 30 5d 20 26 26 20 73 61 66 65 5f 69 73 73  z[0] && safe_iss
12b0: 70 61 63 65 28 70 2d 3e 7a 5b 30 5d 29 20 29 20  pace(p->z[0]) ) 
12c0: 70 2d 3e 7a 2b 2b 3b 0a 20 20 72 65 74 75 72 6e  p->z++;.  return
12d0: 20 70 2d 3e 7a 5b 30 5d 3b 0a 7d 0a 0a 2f 2a 20   p->z[0];.}../* 
12e0: 50 61 72 73 65 20 6f 75 74 20 61 20 6e 75 6d 62  Parse out a numb
12f0: 65 72 2e 20 20 57 72 69 74 65 20 74 68 65 20 76  er.  Write the v
1300: 61 6c 75 65 20 69 6e 74 6f 20 2a 70 56 61 6c 20  alue into *pVal 
1310: 69 66 20 70 56 61 6c 21 3d 30 2e 0a 2a 2a 20 72  if pVal!=0..** r
1320: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f  eturn non-zero o
1330: 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 7a 65  n success and ze
1340: 72 6f 20 69 66 20 74 68 65 20 6e 65 78 74 20 74  ro if the next t
1350: 6f 6b 65 6e 20 69 73 20 6e 6f 74 20 61 20 6e 75  oken is not a nu
1360: 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mber..*/.static 
1370: 69 6e 74 20 67 65 6f 70 6f 6c 79 50 61 72 73 65  int geopolyParse
1380: 4e 75 6d 62 65 72 28 47 65 6f 50 61 72 73 65 20  Number(GeoParse 
1390: 2a 70 2c 20 47 65 6f 43 6f 6f 72 64 20 2a 70 56  *p, GeoCoord *pV
13a0: 61 6c 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  al){.  const uns
13b0: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 20 3d 20  igned char *z = 
13c0: 70 2d 3e 7a 3b 0a 20 20 63 68 61 72 20 63 20 3d  p->z;.  char c =
13d0: 20 67 65 6f 70 6f 6c 79 53 6b 69 70 53 70 61 63   geopolySkipSpac
13e0: 65 28 70 29 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20  e(p);.  int j;. 
13f0: 20 69 6e 74 20 73 65 65 6e 44 50 20 3d 20 30 3b   int seenDP = 0;
1400: 0a 20 20 69 6e 74 20 73 65 65 6e 45 20 3d 20 30  .  int seenE = 0
1410: 3b 0a 20 20 61 73 73 65 72 74 28 20 27 2d 27 20  ;.  assert( '-' 
1420: 3c 20 27 30 27 20 29 3b 0a 20 20 69 66 28 20 63  < '0' );.  if( c
1430: 3c 3d 27 30 27 20 29 7b 0a 20 20 20 20 6a 20 3d  <='0' ){.    j =
1440: 20 63 3d 3d 27 2d 27 3b 0a 20 20 20 20 69 66 28   c=='-';.    if(
1450: 20 7a 5b 6a 5d 3d 3d 27 30 27 20 26 26 20 7a 5b   z[j]=='0' && z[
1460: 6a 2b 31 5d 3e 3d 27 30 27 20 26 26 20 7a 5b 6a  j+1]>='0' && z[j
1470: 2b 31 5d 3c 3d 27 39 27 20 29 20 72 65 74 75 72  +1]<='9' ) retur
1480: 6e 20 30 3b 0a 20 20 7d 0a 20 20 6a 20 3d 20 31  n 0;.  }.  j = 1
1490: 3b 0a 20 20 66 6f 72 28 3b 3b 20 6a 2b 2b 29 7b  ;.  for(;; j++){
14a0: 0a 20 20 20 20 63 20 3d 20 7a 5b 6a 5d 3b 0a 20  .    c = z[j];. 
14b0: 20 20 20 69 66 28 20 63 3e 3d 27 30 27 20 26 26     if( c>='0' &&
14c0: 20 63 3c 3d 27 39 27 20 29 20 63 6f 6e 74 69 6e   c<='9' ) contin
14d0: 75 65 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27  ue;.    if( c=='
14e0: 2e 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  .' ){.      if( 
14f0: 7a 5b 6a 2d 31 5d 3d 3d 27 2d 27 20 29 20 72 65  z[j-1]=='-' ) re
1500: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 69 66  turn 0;.      if
1510: 28 20 73 65 65 6e 44 50 20 29 20 72 65 74 75 72  ( seenDP ) retur
1520: 6e 20 30 3b 0a 20 20 20 20 20 20 73 65 65 6e 44  n 0;.      seenD
1530: 50 20 3d 20 31 3b 0a 20 20 20 20 20 20 63 6f 6e  P = 1;.      con
1540: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
1550: 20 69 66 28 20 63 3d 3d 27 65 27 20 7c 7c 20 63   if( c=='e' || c
1560: 3d 3d 27 45 27 20 29 7b 0a 20 20 20 20 20 20 69  =='E' ){.      i
1570: 66 28 20 7a 5b 6a 2d 31 5d 3c 27 30 27 20 29 20  f( z[j-1]<'0' ) 
1580: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
1590: 69 66 28 20 73 65 65 6e 45 20 29 20 72 65 74 75  if( seenE ) retu
15a0: 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 73 65 65  rn -1;.      see
15b0: 6e 44 50 20 3d 20 73 65 65 6e 45 20 3d 20 31 3b  nDP = seenE = 1;
15c0: 0a 20 20 20 20 20 20 63 20 3d 20 7a 5b 6a 2b 31  .      c = z[j+1
15d0: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d  ];.      if( c==
15e0: 27 2b 27 20 7c 7c 20 63 3d 3d 27 2d 27 20 29 7b  '+' || c=='-' ){
15f0: 0a 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  .        j++;.  
1600: 20 20 20 20 20 20 63 20 3d 20 7a 5b 6a 2b 31 5d        c = z[j+1]
1610: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1620: 69 66 28 20 63 3c 27 30 27 20 7c 7c 20 63 3e 27  if( c<'0' || c>'
1630: 39 27 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  9' ) return 0;. 
1640: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
1650: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
1660: 20 20 7d 0a 20 20 69 66 28 20 7a 5b 6a 2d 31 5d    }.  if( z[j-1]
1670: 3c 27 30 27 20 29 20 72 65 74 75 72 6e 20 30 3b  <'0' ) return 0;
1680: 0a 20 20 69 66 28 20 70 56 61 6c 20 29 20 2a 70  .  if( pVal ) *p
1690: 56 61 6c 20 3d 20 61 74 6f 66 28 28 63 6f 6e 73  Val = atof((cons
16a0: 74 20 63 68 61 72 2a 29 70 2d 3e 7a 29 3b 0a 20  t char*)p->z);. 
16b0: 20 70 2d 3e 7a 20 2b 3d 20 6a 3b 0a 20 20 72 65   p->z += j;.  re
16c0: 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 1;.}../*.**
16d0: 20 49 66 20 74 68 65 20 69 6e 70 75 74 20 69 73   If the input is
16e0: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 4a   a well-formed J
16f0: 53 4f 4e 20 61 72 72 61 79 20 6f 66 20 63 6f 6f  SON array of coo
1700: 72 64 69 6e 61 74 65 73 2c 20 77 68 65 72 65 20  rdinates, where 
1710: 65 61 63 68 0a 2a 2a 20 63 6f 6f 72 64 69 6e 61  each.** coordina
1720: 74 65 20 69 73 20 69 74 73 65 6c 66 20 61 20 74  te is itself a t
1730: 77 6f 2d 76 61 6c 75 65 20 61 72 72 61 79 2c 20  wo-value array, 
1740: 74 68 65 6e 20 63 6f 6e 76 65 72 74 20 74 68 65  then convert the
1750: 20 4a 53 4f 4e 20 69 6e 74 6f 0a 2a 2a 20 61 20   JSON into.** a 
1760: 47 65 6f 50 6f 6c 79 20 6f 62 6a 65 63 74 20 61  GeoPoly object a
1770: 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  nd return a poin
1780: 74 65 72 20 74 6f 20 74 68 61 74 20 6f 62 6a 65  ter to that obje
1790: 63 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79  ct..**.** If any
17a0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
17b0: 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73  eturn NULL..*/.s
17c0: 74 61 74 69 63 20 47 65 6f 50 6f 6c 79 20 2a 67  tatic GeoPoly *g
17d0: 65 6f 70 6f 6c 79 50 61 72 73 65 4a 73 6f 6e 28  eopolyParseJson(
17e0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
17f0: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 52 63  har *z, int *pRc
1800: 29 7b 0a 20 20 47 65 6f 50 61 72 73 65 20 73 3b  ){.  GeoParse s;
1810: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1820: 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28  TE_OK;.  memset(
1830: 26 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 29  &s, 0, sizeof(s)
1840: 29 3b 0a 20 20 73 2e 7a 20 3d 20 7a 3b 0a 20 20  );.  s.z = z;.  
1850: 69 66 28 20 67 65 6f 70 6f 6c 79 53 6b 69 70 53  if( geopolySkipS
1860: 70 61 63 65 28 26 73 29 3d 3d 27 5b 27 20 29 7b  pace(&s)=='[' ){
1870: 0a 20 20 20 20 73 2e 7a 2b 2b 3b 0a 20 20 20 20  .    s.z++;.    
1880: 77 68 69 6c 65 28 20 67 65 6f 70 6f 6c 79 53 6b  while( geopolySk
1890: 69 70 53 70 61 63 65 28 26 73 29 3d 3d 27 5b 27  ipSpace(&s)=='['
18a0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69   ){.      int ii
18b0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 68 61 72   = 0;.      char
18c0: 20 63 3b 0a 20 20 20 20 20 20 73 2e 7a 2b 2b 3b   c;.      s.z++;
18d0: 0a 20 20 20 20 20 20 69 66 28 20 73 2e 6e 56 65  .      if( s.nVe
18e0: 72 74 65 78 3c 3d 73 2e 6e 41 6c 6c 6f 63 20 29  rtex<=s.nAlloc )
18f0: 7b 0a 20 20 20 20 20 20 20 20 47 65 6f 43 6f 6f  {.        GeoCoo
1900: 72 64 20 2a 61 4e 65 77 3b 0a 20 20 20 20 20 20  rd *aNew;.      
1910: 20 20 73 2e 6e 41 6c 6c 6f 63 20 3d 20 73 2e 6e    s.nAlloc = s.n
1920: 41 6c 6c 6f 63 2a 32 20 2b 20 31 36 3b 0a 20 20  Alloc*2 + 16;.  
1930: 20 20 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c        aNew = sql
1940: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 73  ite3_realloc64(s
1950: 2e 61 2c 20 73 2e 6e 41 6c 6c 6f 63 2a 73 69 7a  .a, s.nAlloc*siz
1960: 65 6f 66 28 47 65 6f 43 6f 6f 72 64 29 2a 32 20  eof(GeoCoord)*2 
1970: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  );.        if( a
1980: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
1990: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
19a0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
19b0: 20 73 2e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20   s.nErr++;.     
19c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 2e      }.        s.
19e0: 61 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20  a = aNew;.      
19f0: 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 67  }.      while( g
1a00: 65 6f 70 6f 6c 79 50 61 72 73 65 4e 75 6d 62 65  eopolyParseNumbe
1a10: 72 28 26 73 2c 20 69 69 3c 3d 31 20 3f 20 26 73  r(&s, ii<=1 ? &s
1a20: 2e 61 5b 73 2e 6e 56 65 72 74 65 78 2a 32 2b 69  .a[s.nVertex*2+i
1a30: 69 5d 20 3a 20 30 29 20 29 7b 0a 20 20 20 20 20  i] : 0) ){.     
1a40: 20 20 20 69 69 2b 2b 3b 0a 20 20 20 20 20 20 20     ii++;.       
1a50: 20 69 66 28 20 69 69 3d 3d 32 20 29 20 73 2e 6e   if( ii==2 ) s.n
1a60: 56 65 72 74 65 78 2b 2b 3b 0a 20 20 20 20 20 20  Vertex++;.      
1a70: 20 20 63 20 3d 20 67 65 6f 70 6f 6c 79 53 6b 69    c = geopolySki
1a80: 70 53 70 61 63 65 28 26 73 29 3b 0a 20 20 20 20  pSpace(&s);.    
1a90: 20 20 20 20 73 2e 7a 2b 2b 3b 0a 20 20 20 20 20      s.z++;.     
1aa0: 20 20 20 69 66 28 20 63 3d 3d 27 2c 27 20 29 20     if( c==',' ) 
1ab0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1ac0: 20 20 69 66 28 20 63 3d 3d 27 5d 27 20 29 20 62    if( c==']' ) b
1ad0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 73 2e  reak;.        s.
1ae0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nErr++;.        
1af0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
1b00: 52 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  R;.        goto 
1b10: 70 61 72 73 65 5f 6a 73 6f 6e 5f 65 72 72 3b 0a  parse_json_err;.
1b20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1b30: 28 20 67 65 6f 70 6f 6c 79 53 6b 69 70 53 70 61  ( geopolySkipSpa
1b40: 63 65 28 26 73 29 3d 3d 27 2c 27 20 29 7b 0a 20  ce(&s)==',' ){. 
1b50: 20 20 20 20 20 20 20 73 2e 7a 2b 2b 3b 0a 20 20         s.z++;.  
1b60: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
1b70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
1b80: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
1b90: 66 28 20 67 65 6f 70 6f 6c 79 53 6b 69 70 53 70  f( geopolySkipSp
1ba0: 61 63 65 28 26 73 29 3d 3d 27 5d 27 20 26 26 20  ace(&s)==']' && 
1bb0: 73 2e 6e 56 65 72 74 65 78 3e 3d 34 20 29 7b 0a  s.nVertex>=4 ){.
1bc0: 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b        int nByte;
1bd0: 0a 20 20 20 20 20 20 47 65 6f 50 6f 6c 79 20 2a  .      GeoPoly *
1be0: 70 4f 75 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  pOut;.      int 
1bf0: 78 20 3d 20 28 73 2e 6e 56 65 72 74 65 78 2d 31  x = (s.nVertex-1
1c00: 29 2a 32 3b 0a 20 20 20 20 20 20 69 66 28 20 73  )*2;.      if( s
1c10: 2e 61 5b 78 5d 3d 3d 73 2e 61 5b 30 5d 20 26 26  .a[x]==s.a[0] &&
1c20: 20 73 2e 61 5b 78 2b 31 5d 3d 3d 73 2e 61 5b 31   s.a[x+1]==s.a[1
1c30: 5d 20 29 20 73 2e 6e 56 65 72 74 65 78 2d 2d 3b  ] ) s.nVertex--;
1c40: 0a 20 20 20 20 20 20 6e 42 79 74 65 20 3d 20 73  .      nByte = s
1c50: 69 7a 65 6f 66 28 47 65 6f 50 6f 6c 79 29 20 2a  izeof(GeoPoly) *
1c60: 20 28 73 2e 6e 56 65 72 74 65 78 2d 31 29 2a 32   (s.nVertex-1)*2
1c70: 2a 73 69 7a 65 6f 66 28 47 65 6f 43 6f 6f 72 64  *sizeof(GeoCoord
1c80: 29 3b 0a 20 20 20 20 20 20 70 4f 75 74 20 3d 20  );.      pOut = 
1c90: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
1ca0: 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 20 20 20  ( nByte );.     
1cb0: 20 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66   x = 1;.      if
1cc0: 28 20 70 4f 75 74 3d 3d 30 20 29 20 67 6f 74 6f  ( pOut==0 ) goto
1cd0: 20 70 61 72 73 65 5f 6a 73 6f 6e 5f 65 72 72 3b   parse_json_err;
1ce0: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 6e 56 65  .      pOut->nVe
1cf0: 72 74 65 78 20 3d 20 73 2e 6e 56 65 72 74 65 78  rtex = s.nVertex
1d00: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
1d10: 4f 75 74 2d 3e 61 2c 20 73 2e 61 2c 20 73 2e 6e  Out->a, s.a, s.n
1d20: 56 65 72 74 65 78 2a 32 2a 73 69 7a 65 6f 66 28  Vertex*2*sizeof(
1d30: 47 65 6f 43 6f 6f 72 64 29 29 3b 0a 20 20 20 20  GeoCoord));.    
1d40: 20 20 70 4f 75 74 2d 3e 68 64 72 5b 30 5d 20 3d    pOut->hdr[0] =
1d50: 20 2a 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72   *(unsigned char
1d60: 2a 29 26 78 3b 0a 20 20 20 20 20 20 70 4f 75 74  *)&x;.      pOut
1d70: 2d 3e 68 64 72 5b 31 5d 20 3d 20 28 73 2e 6e 56  ->hdr[1] = (s.nV
1d80: 65 72 74 65 78 3e 3e 31 36 29 26 30 78 66 66 3b  ertex>>16)&0xff;
1d90: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 68 64 72  .      pOut->hdr
1da0: 5b 32 5d 20 3d 20 28 73 2e 6e 56 65 72 74 65 78  [2] = (s.nVertex
1db0: 3e 3e 38 29 26 30 78 66 66 3b 0a 20 20 20 20 20  >>8)&0xff;.     
1dc0: 20 70 4f 75 74 2d 3e 68 64 72 5b 33 5d 20 3d 20   pOut->hdr[3] = 
1dd0: 73 2e 6e 56 65 72 74 65 78 26 30 78 66 66 3b 0a  s.nVertex&0xff;.
1de0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
1df0: 65 65 28 73 2e 61 29 3b 0a 20 20 20 20 20 20 69  ee(s.a);.      i
1e00: 66 28 20 70 52 63 20 29 20 2a 70 52 63 20 3d 20  f( pRc ) *pRc = 
1e10: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
1e20: 20 72 65 74 75 72 6e 20 70 4f 75 74 3b 0a 20 20   return pOut;.  
1e30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
1e40: 2e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72  .nErr++;.      r
1e50: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
1e60: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 70 61 72 73  ;.    }.  }.pars
1e70: 65 5f 6a 73 6f 6e 5f 65 72 72 3a 0a 20 20 69 66  e_json_err:.  if
1e80: 28 20 70 52 63 20 29 20 2a 70 52 63 20 3d 20 72  ( pRc ) *pRc = r
1e90: 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  c;.  sqlite3_fre
1ea0: 65 28 73 2e 61 29 3b 0a 20 20 72 65 74 75 72 6e  e(s.a);.  return
1eb0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76   0;.}../*.** Giv
1ec0: 65 6e 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 61  en a function pa
1ed0: 72 61 6d 65 74 65 72 2c 20 74 72 79 20 74 6f 20  rameter, try to 
1ee0: 69 6e 74 65 72 70 72 65 74 20 69 74 20 61 73 20  interpret it as 
1ef0: 61 20 70 6f 6c 79 67 6f 6e 2c 20 65 69 74 68 65  a polygon, eithe
1f00: 72 0a 2a 2a 20 69 6e 20 74 68 65 20 62 69 6e 61  r.** in the bina
1f10: 72 79 20 66 6f 72 6d 61 74 20 6f 72 20 4a 53 4f  ry format or JSO
1f20: 4e 20 74 65 78 74 2e 20 20 43 6f 6d 70 75 74 65  N text.  Compute
1f30: 20 61 20 47 65 6f 50 6f 6c 79 20 6f 62 6a 65 63   a GeoPoly objec
1f40: 74 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20  t and.** return 
1f50: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 61  a pointer to tha
1f60: 74 20 6f 62 6a 65 63 74 2e 20 20 4f 72 20 69 66  t object.  Or if
1f70: 20 74 68 65 20 69 6e 70 75 74 20 69 73 20 6e 6f   the input is no
1f80: 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a  t a well-formed.
1f90: 2a 2a 20 70 6f 6c 79 67 6f 6e 2c 20 70 75 74 20  ** polygon, put 
1fa0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
1fb0: 20 69 6e 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74   in sqlite3_cont
1fc0: 65 78 74 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  ext and return N
1fd0: 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 47  ULL..*/.static G
1fe0: 65 6f 50 6f 6c 79 20 2a 67 65 6f 70 6f 6c 79 46  eoPoly *geopolyF
1ff0: 75 6e 63 50 61 72 61 6d 28 0a 20 20 73 71 6c 69  uncParam(.  sqli
2000: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
2010: 78 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65  x,      /* Conte
2020: 78 74 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73  xt for error mes
2030: 73 61 67 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74  sages */.  sqlit
2040: 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 2c 20  e3_value *pVal, 
2050: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61         /* The va
2060: 6c 75 65 20 74 6f 20 64 65 63 6f 64 65 20 2a 2f  lue to decode */
2070: 0a 20 20 69 6e 74 20 2a 70 52 63 20 20 20 20 20  .  int *pRc     
2080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2090: 2a 20 57 72 69 74 65 20 65 72 72 6f 72 20 68 65  * Write error he
20a0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 47 65 6f 50 6f  re */.){.  GeoPo
20b0: 6c 79 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74  ly *p = 0;.  int
20c0: 20 6e 42 79 74 65 3b 0a 20 20 69 66 28 20 73 71   nByte;.  if( sq
20d0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
20e0: 28 70 56 61 6c 29 3d 3d 53 51 4c 49 54 45 5f 42  (pVal)==SQLITE_B
20f0: 4c 4f 42 0a 20 20 20 26 26 20 28 6e 42 79 74 65  LOB.   && (nByte
2100: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
2110: 5f 62 79 74 65 73 28 70 56 61 6c 29 29 3e 3d 28  _bytes(pVal))>=(
2120: 34 2b 36 2a 73 69 7a 65 6f 66 28 47 65 6f 43 6f  4+6*sizeof(GeoCo
2130: 6f 72 64 29 29 0a 20 20 29 7b 0a 20 20 20 20 63  ord)).  ){.    c
2140: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
2150: 61 72 20 2a 61 20 3d 20 73 71 6c 69 74 65 33 5f  ar *a = sqlite3_
2160: 76 61 6c 75 65 5f 62 6c 6f 62 28 70 56 61 6c 29  value_blob(pVal)
2170: 3b 0a 20 20 20 20 69 6e 74 20 6e 56 65 72 74 65  ;.    int nVerte
2180: 78 3b 0a 20 20 20 20 6e 56 65 72 74 65 78 20 3d  x;.    nVertex =
2190: 20 28 61 5b 31 5d 3c 3c 31 36 29 20 2b 20 28 61   (a[1]<<16) + (a
21a0: 5b 32 5d 3c 3c 38 29 20 2b 20 61 5b 33 5d 3b 0a  [2]<<8) + a[3];.
21b0: 20 20 20 20 69 66 28 20 28 61 5b 30 5d 3d 3d 30      if( (a[0]==0
21c0: 20 7c 7c 20 61 5b 30 5d 3d 3d 31 29 0a 20 20 20   || a[0]==1).   
21d0: 20 20 26 26 20 28 6e 56 65 72 74 65 78 2a 32 2a    && (nVertex*2*
21e0: 73 69 7a 65 6f 66 28 47 65 6f 43 6f 6f 72 64 29  sizeof(GeoCoord)
21f0: 20 2b 20 34 29 3d 3d 6e 42 79 74 65 0a 20 20 20   + 4)==nByte.   
2200: 20 29 7b 0a 20 20 20 20 20 20 70 20 3d 20 73 71   ){.      p = sq
2210: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20  lite3_malloc64( 
2220: 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28 6e 56  sizeof(*p) + (nV
2230: 65 72 74 65 78 2d 31 29 2a 32 2a 73 69 7a 65 6f  ertex-1)*2*sizeo
2240: 66 28 47 65 6f 43 6f 6f 72 64 29 20 29 3b 0a 20  f(GeoCoord) );. 
2250: 20 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 7b       if( p==0 ){
2260: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 52 63  .        if( pRc
2270: 20 29 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45   ) *pRc = SQLITE
2280: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
2290: 69 66 28 20 70 43 74 78 20 29 20 73 71 6c 69 74  if( pCtx ) sqlit
22a0: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f  e3_result_error_
22b0: 6e 6f 6d 65 6d 28 70 43 74 78 29 3b 0a 20 20 20  nomem(pCtx);.   
22c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22d0: 20 20 69 6e 74 20 78 20 3d 20 31 3b 0a 20 20 20    int x = 1;.   
22e0: 20 20 20 20 20 70 2d 3e 6e 56 65 72 74 65 78 20       p->nVertex 
22f0: 3d 20 6e 56 65 72 74 65 78 3b 0a 20 20 20 20 20  = nVertex;.     
2300: 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 68 64 72     memcpy(p->hdr
2310: 2c 20 61 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  , a, nByte);.   
2320: 20 20 20 20 20 69 66 28 20 61 5b 30 5d 20 21 3d       if( a[0] !=
2330: 20 2a 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72   *(unsigned char
2340: 2a 29 26 78 20 29 7b 0a 20 20 20 20 20 20 20 20  *)&x ){.        
2350: 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20    int ii;.      
2360: 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
2370: 3c 6e 56 65 72 74 65 78 2a 32 3b 20 69 69 2b 2b  <nVertex*2; ii++
2380: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  ){.            g
2390: 65 6f 70 6f 6c 79 53 77 61 62 33 32 28 28 75 6e  eopolySwab32((un
23a0: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26 70 2d  signed char*)&p-
23b0: 3e 61 5b 69 69 5d 29 3b 0a 20 20 20 20 20 20 20  >a[ii]);.       
23c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
23d0: 2d 3e 68 64 72 5b 30 5d 20 5e 3d 20 31 3b 0a 20  ->hdr[0] ^= 1;. 
23e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
23f0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
2400: 52 63 20 29 20 2a 70 52 63 20 3d 20 53 51 4c 49  Rc ) *pRc = SQLI
2410: 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 65 74 75 72  TE_OK;.    retur
2420: 6e 20 70 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  n p;.  }else if(
2430: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
2440: 79 70 65 28 70 56 61 6c 29 3d 3d 53 51 4c 49 54  ype(pVal)==SQLIT
2450: 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 72 65  E_TEXT ){.    re
2460: 74 75 72 6e 20 67 65 6f 70 6f 6c 79 50 61 72 73  turn geopolyPars
2470: 65 4a 73 6f 6e 28 73 71 6c 69 74 65 33 5f 76 61  eJson(sqlite3_va
2480: 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29 2c 20  lue_text(pVal), 
2490: 70 52 63 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  pRc);.  }else{. 
24a0: 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45     *pRc = SQLITE
24b0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 69 66 28 20  _ERROR;.    if( 
24c0: 70 43 74 78 21 3d 30 20 29 20 73 71 6c 69 74 65  pCtx!=0 ) sqlite
24d0: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70  3_result_error(p
24e0: 43 74 78 2c 20 22 6e 6f 74 20 61 20 76 61 6c 69  Ctx, "not a vali
24f0: 64 20 70 6f 6c 79 67 6f 6e 22 2c 20 2d 31 29 3b  d polygon", -1);
2500: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2510: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c   }.}../*.** Impl
2520: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
2530: 65 20 67 65 6f 70 6f 6c 79 5f 62 6c 6f 62 28 58  e geopoly_blob(X
2540: 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ) function..**.*
2550: 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74 20 69  * If the input i
2560: 73 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20  s a well-formed 
2570: 47 65 6f 70 6f 6c 79 20 42 4c 4f 42 20 6f 72 20  Geopoly BLOB or 
2580: 4a 53 4f 4e 20 73 74 72 69 6e 67 0a 2a 2a 20 74  JSON string.** t
2590: 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20 42  hen return the B
25a0: 4c 4f 42 20 72 65 70 72 65 73 65 6e 74 61 74 69  LOB representati
25b0: 6f 6e 20 6f 66 20 74 68 65 20 70 6f 6c 79 67 6f  on of the polygo
25c0: 6e 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a  n.  Otherwise.**
25d0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f   return NULL..*/
25e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6f  .static void geo
25f0: 70 6f 6c 79 42 6c 6f 62 46 75 6e 63 28 0a 20 20  polyBlobFunc(.  
2600: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
2610: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
2620: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
2630: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
2640: 20 20 47 65 6f 50 6f 6c 79 20 2a 70 20 3d 20 67    GeoPoly *p = g
2650: 65 6f 70 6f 6c 79 46 75 6e 63 50 61 72 61 6d 28  eopolyFuncParam(
2660: 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 30 5d  context, argv[0]
2670: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 20 29 7b  , 0);.  if( p ){
2680: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
2690: 75 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74  ult_blob(context
26a0: 2c 20 70 2d 3e 68 64 72 2c 20 0a 20 20 20 20 20  , p->hdr, .     
26b0: 20 20 34 2b 38 2a 70 2d 3e 6e 56 65 72 74 65 78    4+8*p->nVertex
26c0: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
26d0: 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  NT);.    sqlite3
26e0: 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a  _free(p);.  }.}.
26f0: 0a 2f 2a 0a 2a 2a 20 53 51 4c 20 66 75 6e 63 74  ./*.** SQL funct
2700: 69 6f 6e 3a 20 20 20 20 20 67 65 6f 70 6f 6c 79  ion:     geopoly
2710: 5f 6a 73 6f 6e 28 58 29 0a 2a 2a 0a 2a 2a 20 49  _json(X).**.** I
2720: 6e 74 65 72 70 72 65 74 20 58 20 61 73 20 61 20  nterpret X as a 
2730: 70 6f 6c 79 67 6f 6e 20 61 6e 64 20 72 65 6e 64  polygon and rend
2740: 65 72 20 69 74 20 61 73 20 61 20 4a 53 4f 4e 20  er it as a JSON 
2750: 61 72 72 61 79 0a 2a 2a 20 6f 66 20 63 6f 6f 72  array.** of coor
2760: 64 69 6e 61 74 65 73 2e 20 20 4f 72 2c 20 69 66  dinates.  Or, if
2770: 20 58 20 69 73 20 6e 6f 74 20 61 20 76 61 6c 69   X is not a vali
2780: 64 20 70 6f 6c 79 67 6f 6e 2c 20 72 65 74 75 72  d polygon, retur
2790: 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69  n NULL..*/.stati
27a0: 63 20 76 6f 69 64 20 67 65 6f 70 6f 6c 79 4a 73  c void geopolyJs
27b0: 6f 6e 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  onFunc(.  sqlite
27c0: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
27d0: 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  xt,.  int argc,.
27e0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
27f0: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 47 65 6f 50  **argv.){.  GeoP
2800: 6f 6c 79 20 2a 70 20 3d 20 67 65 6f 70 6f 6c 79  oly *p = geopoly
2810: 46 75 6e 63 50 61 72 61 6d 28 63 6f 6e 74 65 78  FuncParam(contex
2820: 74 2c 20 61 72 67 76 5b 30 5d 2c 20 30 29 3b 0a  t, argv[0], 0);.
2830: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73    if( p ){.    s
2840: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c  qlite3 *db = sql
2850: 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f  ite3_context_db_
2860: 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b  handle(context);
2870: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72  .    sqlite3_str
2880: 20 2a 78 20 3d 20 73 71 6c 69 74 65 33 5f 73 74   *x = sqlite3_st
2890: 72 5f 6e 65 77 28 64 62 29 3b 0a 20 20 20 20 69  r_new(db);.    i
28a0: 6e 74 20 69 3b 0a 20 20 20 20 73 71 6c 69 74 65  nt i;.    sqlite
28b0: 33 5f 73 74 72 5f 61 70 70 65 6e 64 28 78 2c 20  3_str_append(x, 
28c0: 22 5b 22 2c 20 31 29 3b 0a 20 20 20 20 66 6f 72  "[", 1);.    for
28d0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 56 65 72 74  (i=0; i<p->nVert
28e0: 65 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ex; i++){.      
28f0: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
2900: 6e 64 66 28 78 2c 20 22 5b 25 21 67 2c 25 21 67  ndf(x, "[%!g,%!g
2910: 5d 2c 22 2c 20 70 2d 3e 61 5b 69 2a 32 5d 2c 20  ],", p->a[i*2], 
2920: 70 2d 3e 61 5b 69 2a 32 2b 31 5d 29 3b 0a 20 20  p->a[i*2+1]);.  
2930: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
2940: 73 74 72 5f 61 70 70 65 6e 64 66 28 78 2c 20 22  str_appendf(x, "
2950: 5b 25 21 67 2c 25 21 67 5d 5d 22 2c 20 70 2d 3e  [%!g,%!g]]", p->
2960: 61 5b 30 5d 2c 20 70 2d 3e 61 5b 31 5d 29 3b 0a  a[0], p->a[1]);.
2970: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
2980: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
2990: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 66 69 6e   sqlite3_str_fin
29a0: 69 73 68 28 78 29 2c 20 2d 31 2c 20 73 71 6c 69  ish(x), -1, sqli
29b0: 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 20 20 73  te3_free);.    s
29c0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
29d0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c    }.}../*.** SQL
29e0: 20 66 75 6e 63 74 69 6f 6e 3a 20 20 20 20 20 67   function:     g
29f0: 65 6f 70 6f 6c 79 5f 73 76 67 28 58 2c 20 2e 2e  eopoly_svg(X, ..
2a00: 2e 2e 29 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 70  ..).**.** Interp
2a10: 72 65 74 20 58 20 61 73 20 61 20 70 6f 6c 79 67  ret X as a polyg
2a20: 6f 6e 20 61 6e 64 20 72 65 6e 64 65 72 20 69 74  on and render it
2a30: 20 61 73 20 61 20 53 56 47 20 3c 70 6f 6c 79 6c   as a SVG <polyl
2a40: 69 6e 65 3e 2e 0a 2a 2a 20 41 64 64 69 74 69 6f  ine>..** Additio
2a50: 6e 61 6c 20 61 72 67 75 6d 65 6e 74 73 20 61 72  nal arguments ar
2a60: 65 20 61 64 64 65 64 20 61 73 20 61 74 74 72 69  e added as attri
2a70: 62 75 74 65 73 20 74 6f 20 74 68 65 20 3c 70 6f  butes to the <po
2a80: 6c 79 6c 69 6e 65 3e 2e 0a 2a 2f 0a 73 74 61 74  lyline>..*/.stat
2a90: 69 63 20 76 6f 69 64 20 67 65 6f 70 6f 6c 79 53  ic void geopolyS
2aa0: 76 67 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  vgFunc(.  sqlite
2ab0: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
2ac0: 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  xt,.  int argc,.
2ad0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
2ae0: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 47 65 6f 50  **argv.){.  GeoP
2af0: 6f 6c 79 20 2a 70 20 3d 20 67 65 6f 70 6f 6c 79  oly *p = geopoly
2b00: 46 75 6e 63 50 61 72 61 6d 28 63 6f 6e 74 65 78  FuncParam(contex
2b10: 74 2c 20 61 72 67 76 5b 30 5d 2c 20 30 29 3b 0a  t, argv[0], 0);.
2b20: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73    if( p ){.    s
2b30: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c  qlite3 *db = sql
2b40: 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f  ite3_context_db_
2b50: 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b  handle(context);
2b60: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72  .    sqlite3_str
2b70: 20 2a 78 20 3d 20 73 71 6c 69 74 65 33 5f 73 74   *x = sqlite3_st
2b80: 72 5f 6e 65 77 28 64 62 29 3b 0a 20 20 20 20 69  r_new(db);.    i
2b90: 6e 74 20 69 3b 0a 20 20 20 20 63 68 61 72 20 63  nt i;.    char c
2ba0: 53 65 70 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20  Sep = '\'';.    
2bb0: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
2bc0: 6e 64 66 28 78 2c 20 22 3c 70 6f 6c 79 6c 69 6e  ndf(x, "<polylin
2bd0: 65 20 70 6f 69 6e 74 73 3d 22 29 3b 0a 20 20 20  e points=");.   
2be0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
2bf0: 56 65 72 74 65 78 3b 20 69 2b 2b 29 7b 0a 20 20  Vertex; i++){.  
2c00: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
2c10: 61 70 70 65 6e 64 66 28 78 2c 20 22 25 63 25 67  appendf(x, "%c%g
2c20: 2c 25 67 22 2c 20 63 53 65 70 2c 20 70 2d 3e 61  ,%g", cSep, p->a
2c30: 5b 69 2a 32 5d 2c 20 70 2d 3e 61 5b 69 2a 32 2b  [i*2], p->a[i*2+
2c40: 31 5d 29 3b 0a 20 20 20 20 20 20 63 53 65 70 20  1]);.      cSep 
2c50: 3d 20 27 20 27 3b 0a 20 20 20 20 7d 0a 20 20 20  = ' ';.    }.   
2c60: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
2c70: 65 6e 64 66 28 78 2c 20 22 20 25 67 2c 25 67 27  endf(x, " %g,%g'
2c80: 22 2c 20 70 2d 3e 61 5b 30 5d 2c 20 70 2d 3e 61  ", p->a[0], p->a
2c90: 5b 31 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  [1]);.    for(i=
2ca0: 31 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b  1; i<argc; i++){
2cb0: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
2cc0: 72 20 2a 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68  r *z = (const ch
2cd0: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
2ce0: 65 5f 74 65 78 74 28 61 72 67 76 5b 69 5d 29 3b  e_text(argv[i]);
2cf0: 0a 20 20 20 20 20 20 69 66 28 20 7a 20 26 26 20  .      if( z && 
2d00: 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  z[0] ){.        
2d10: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
2d20: 6e 64 66 28 78 2c 20 22 20 25 73 22 2c 20 7a 29  ndf(x, " %s", z)
2d30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2d40: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
2d50: 61 70 70 65 6e 64 66 28 78 2c 20 22 3e 3c 2f 70  appendf(x, "></p
2d60: 6f 6c 79 6c 69 6e 65 3e 22 29 3b 0a 20 20 20 20  olyline>");.    
2d70: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
2d80: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c  ext(context, sql
2d90: 69 74 65 33 5f 73 74 72 5f 66 69 6e 69 73 68 28  ite3_str_finish(
2da0: 78 29 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33 5f  x), -1, sqlite3_
2db0: 66 72 65 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  free);.    sqlit
2dc0: 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a  e3_free(p);.  }.
2dd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
2de0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 67  ntation of the g
2df0: 65 6f 70 6f 6c 79 5f 61 72 65 61 28 58 29 20 66  eopoly_area(X) f
2e00: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  unction..**.** I
2e10: 66 20 74 68 65 20 69 6e 70 75 74 20 69 73 20 61  f the input is a
2e20: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 47 65 6f   well-formed Geo
2e30: 70 6f 6c 79 20 42 4c 4f 42 20 74 68 65 6e 20 72  poly BLOB then r
2e40: 65 74 75 72 6e 20 74 68 65 20 61 72 65 61 0a 2a  eturn the area.*
2e50: 2a 20 65 6e 63 6c 6f 73 65 64 20 62 79 20 74 68  * enclosed by th
2e60: 65 20 70 6f 6c 79 67 6f 6e 2e 20 20 49 66 20 74  e polygon.  If t
2e70: 68 65 20 70 6f 6c 79 67 6f 6e 20 63 69 72 63 75  he polygon circu
2e80: 6c 61 74 65 73 20 63 6c 6f 63 6b 77 69 73 65 20  lates clockwise 
2e90: 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66 20 63 6f  instead.** of co
2ea0: 75 6e 74 65 72 63 6c 6f 63 6b 77 69 73 65 20 28  unterclockwise (
2eb0: 61 73 20 69 74 20 73 68 6f 75 6c 64 29 20 74 68  as it should) th
2ec0: 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20 6e 65  en return the ne
2ed0: 67 61 74 69 76 65 20 6f 66 20 74 68 65 0a 2a 2a  gative of the.**
2ee0: 20 65 6e 63 6c 6f 73 65 64 20 61 72 65 61 2e 20   enclosed area. 
2ef0: 20 4f 74 68 65 72 77 69 73 65 20 72 65 74 75 72   Otherwise retur
2f00: 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69  n NULL..*/.stati
2f10: 63 20 76 6f 69 64 20 67 65 6f 70 6f 6c 79 41 72  c void geopolyAr
2f20: 65 61 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  eaFunc(.  sqlite
2f30: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
2f40: 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  xt,.  int argc,.
2f50: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
2f60: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 47 65 6f 50  **argv.){.  GeoP
2f70: 6f 6c 79 20 2a 70 20 3d 20 67 65 6f 70 6f 6c 79  oly *p = geopoly
2f80: 46 75 6e 63 50 61 72 61 6d 28 63 6f 6e 74 65 78  FuncParam(contex
2f90: 74 2c 20 61 72 67 76 5b 30 5d 2c 20 30 29 3b 0a  t, argv[0], 0);.
2fa0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 64    if( p ){.    d
2fb0: 6f 75 62 6c 65 20 72 41 72 65 61 20 3d 20 30 2e  ouble rArea = 0.
2fc0: 30 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  0;.    int ii;. 
2fd0: 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
2fe0: 70 2d 3e 6e 56 65 72 74 65 78 2d 31 3b 20 69 69  p->nVertex-1; ii
2ff0: 2b 2b 29 7b 0a 20 20 20 20 20 20 72 41 72 65 61  ++){.      rArea
3000: 20 2b 3d 20 28 70 2d 3e 61 5b 69 69 2a 32 5d 20   += (p->a[ii*2] 
3010: 2d 20 70 2d 3e 61 5b 69 69 2a 32 2b 32 5d 29 20  - p->a[ii*2+2]) 
3020: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 78 30            /* (x0
3030: 20 2d 20 78 31 29 20 2a 2f 0a 20 20 20 20 20 20   - x1) */.      
3040: 20 20 20 20 20 20 20 20 20 20 2a 20 28 70 2d 3e            * (p->
3050: 61 5b 69 69 2a 32 2b 31 5d 20 2b 20 70 2d 3e 61  a[ii*2+1] + p->a
3060: 5b 69 69 2a 32 2b 33 5d 29 20 20 20 20 20 20 2f  [ii*2+3])      /
3070: 2a 20 28 79 30 20 2b 20 79 31 29 20 2a 2f 0a 20  * (y0 + y1) */. 
3080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
3090: 20 30 2e 35 3b 0a 20 20 20 20 7d 0a 20 20 20 20   0.5;.    }.    
30a0: 72 41 72 65 61 20 2b 3d 20 28 70 2d 3e 61 5b 69  rArea += (p->a[i
30b0: 69 2a 32 5d 20 2d 20 70 2d 3e 61 5b 30 5d 29 20  i*2] - p->a[0]) 
30c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30d0: 20 2f 2a 20 28 78 4e 20 2d 20 78 30 29 20 2a 2f   /* (xN - x0) */
30e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 20  .             * 
30f0: 28 70 2d 3e 61 5b 69 69 2a 32 2b 31 5d 20 2b 20  (p->a[ii*2+1] + 
3100: 70 2d 3e 61 5b 31 5d 29 20 20 20 20 20 20 20 20  p->a[1])        
3110: 20 20 20 20 20 20 2f 2a 20 28 79 4e 20 2b 20 79        /* (yN + y
3120: 30 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  0) */.          
3130: 20 20 20 2a 20 30 2e 35 3b 0a 20 20 20 20 73 71     * 0.5;.    sq
3140: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75  lite3_result_dou
3150: 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 72 41 72  ble(context, rAr
3160: 65 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ea);.    sqlite3
3170: 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 20 20 20  _free(p);.  }   
3180: 20 20 20 20 20 20 20 20 20 0a 7d 0a 0a 2f 2a 0a           .}../*.
3190: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 62 6f 75  ** Compute a bou
31a0: 6e 64 2d 62 6f 78 20 6f 6e 20 61 20 70 6f 6c 79  nd-box on a poly
31b0: 67 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 20 6e  gon.  Return a n
31c0: 65 77 20 47 65 6f 50 6f 6c 79 20 6f 62 6a 65 63  ew GeoPoly objec
31d0: 74 0a 2a 2a 20 74 68 61 74 20 64 65 73 63 72 69  t.** that descri
31e0: 62 65 73 20 74 68 65 20 62 6f 75 6e 64 69 6e 67  bes the bounding
31f0: 20 62 6f 78 2e 20 20 4f 72 2c 20 69 66 20 61 43   box.  Or, if aC
3200: 6f 6f 72 64 20 69 73 20 6e 6f 74 20 61 20 4e 55  oord is not a NU
3210: 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 66 69  LL pointer.** fi
3220: 6c 6c 20 69 74 20 69 6e 20 77 69 74 68 20 74 68  ll it in with th
3230: 65 20 62 6f 75 6e 64 69 6e 67 20 62 6f 78 20 69  e bounding box i
3240: 6e 73 74 65 61 64 2e 0a 2a 2f 0a 73 74 61 74 69  nstead..*/.stati
3250: 63 20 47 65 6f 50 6f 6c 79 20 2a 67 65 6f 70 6f  c GeoPoly *geopo
3260: 6c 79 42 42 6f 78 28 0a 20 20 73 71 6c 69 74 65  lyBBox(.  sqlite
3270: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
3280: 78 74 2c 20 20 20 2f 2a 20 46 6f 72 20 72 65 63  xt,   /* For rec
3290: 6f 72 64 69 6e 67 20 74 68 65 20 65 72 72 6f 72  ording the error
32a0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
32b0: 6c 75 65 20 2a 70 50 6f 6c 79 2c 20 20 20 20 20  lue *pPoly,     
32c0: 20 20 2f 2a 20 54 68 65 20 70 6f 6c 79 67 6f 6e    /* The polygon
32d0: 20 2a 2f 0a 20 20 52 74 72 65 65 43 6f 6f 72 64   */.  RtreeCoord
32e0: 20 2a 61 43 6f 6f 72 64 2c 20 20 20 20 20 20 20   *aCoord,       
32f0: 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 68 65 72    /* Results her
3300: 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 63 20  e */.  int *pRc 
3310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3320: 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65     /* Error code
3330: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 47 65   here */.){.  Ge
3340: 6f 50 6f 6c 79 20 2a 70 20 3d 20 67 65 6f 70 6f  oPoly *p = geopo
3350: 6c 79 46 75 6e 63 50 61 72 61 6d 28 63 6f 6e 74  lyFuncParam(cont
3360: 65 78 74 2c 20 70 50 6f 6c 79 2c 20 70 52 63 29  ext, pPoly, pRc)
3370: 3b 0a 20 20 47 65 6f 50 6f 6c 79 20 2a 70 4f 75  ;.  GeoPoly *pOu
3380: 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 20 29  t = 0;.  if( p )
3390: 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20  {.    int ii;.  
33a0: 20 20 66 6c 6f 61 74 20 6d 6e 58 2c 20 6d 78 58    float mnX, mxX
33b0: 2c 20 6d 6e 59 2c 20 6d 78 59 3b 0a 20 20 20 20  , mnY, mxY;.    
33c0: 6d 6e 58 20 3d 20 6d 78 58 20 3d 20 70 2d 3e 61  mnX = mxX = p->a
33d0: 5b 30 5d 3b 0a 20 20 20 20 6d 6e 59 20 3d 20 6d  [0];.    mnY = m
33e0: 78 59 20 3d 20 70 2d 3e 61 5b 31 5d 3b 0a 20 20  xY = p->a[1];.  
33f0: 20 20 66 6f 72 28 69 69 3d 31 3b 20 69 69 3c 70    for(ii=1; ii<p
3400: 2d 3e 6e 56 65 72 74 65 78 3b 20 69 69 2b 2b 29  ->nVertex; ii++)
3410: 7b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72  {.      double r
3420: 20 3d 20 70 2d 3e 61 5b 69 69 2a 32 5d 3b 0a 20   = p->a[ii*2];. 
3430: 20 20 20 20 20 69 66 28 20 72 3c 6d 6e 58 20 29       if( r<mnX )
3440: 20 6d 6e 58 20 3d 20 72 3b 0a 20 20 20 20 20 20   mnX = r;.      
3450: 65 6c 73 65 20 69 66 28 20 72 3e 6d 78 58 20 29  else if( r>mxX )
3460: 20 6d 78 58 20 3d 20 72 3b 0a 20 20 20 20 20 20   mxX = r;.      
3470: 72 20 3d 20 70 2d 3e 61 5b 69 69 2a 32 2b 31 5d  r = p->a[ii*2+1]
3480: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 3c 6d 6e  ;.      if( r<mn
3490: 59 20 29 20 6d 6e 59 20 3d 20 72 3b 0a 20 20 20  Y ) mnY = r;.   
34a0: 20 20 20 65 6c 73 65 20 69 66 28 20 72 3e 6d 78     else if( r>mx
34b0: 59 20 29 20 6d 78 59 20 3d 20 72 3b 0a 20 20 20  Y ) mxY = r;.   
34c0: 20 7d 0a 20 20 20 20 69 66 28 20 70 52 63 20 29   }.    if( pRc )
34d0: 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4f   *pRc = SQLITE_O
34e0: 4b 3b 0a 20 20 20 20 69 66 28 20 61 43 6f 6f 72  K;.    if( aCoor
34f0: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4f  d==0 ){.      pO
3500: 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61  ut = sqlite3_rea
3510: 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 47  lloc(p, sizeof(G
3520: 65 6f 50 6f 6c 79 29 2b 73 69 7a 65 6f 66 28 47  eoPoly)+sizeof(G
3530: 65 6f 43 6f 6f 72 64 29 2a 36 29 3b 0a 20 20 20  eoCoord)*6);.   
3540: 20 20 20 69 66 28 20 70 4f 75 74 3d 3d 30 20 29     if( pOut==0 )
3550: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3560: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
3570: 20 20 20 69 66 28 20 63 6f 6e 74 65 78 74 20 29     if( context )
3580: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
3590: 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74  error_nomem(cont
35a0: 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ext);.        if
35b0: 28 20 70 52 63 20 29 20 2a 70 52 63 20 3d 20 53  ( pRc ) *pRc = S
35c0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
35d0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
35e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 75       }.      pOu
35f0: 74 2d 3e 6e 56 65 72 74 65 78 20 3d 20 34 3b 0a  t->nVertex = 4;.
3600: 20 20 20 20 20 20 70 4f 75 74 2d 3e 68 64 72 5b        pOut->hdr[
3610: 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f  1] = 0;.      pO
3620: 75 74 2d 3e 68 64 72 5b 32 5d 20 3d 20 30 3b 0a  ut->hdr[2] = 0;.
3630: 20 20 20 20 20 20 70 4f 75 74 2d 3e 68 64 72 5b        pOut->hdr[
3640: 33 5d 20 3d 20 34 3b 0a 20 20 20 20 20 20 70 4f  3] = 4;.      pO
3650: 75 74 2d 3e 61 5b 30 5d 20 3d 20 6d 6e 58 3b 0a  ut->a[0] = mnX;.
3660: 20 20 20 20 20 20 70 4f 75 74 2d 3e 61 5b 31 5d        pOut->a[1]
3670: 20 3d 20 6d 6e 59 3b 0a 20 20 20 20 20 20 70 4f   = mnY;.      pO
3680: 75 74 2d 3e 61 5b 32 5d 20 3d 20 6d 78 58 3b 0a  ut->a[2] = mxX;.
3690: 20 20 20 20 20 20 70 4f 75 74 2d 3e 61 5b 33 5d        pOut->a[3]
36a0: 20 3d 20 6d 6e 59 3b 0a 20 20 20 20 20 20 70 4f   = mnY;.      pO
36b0: 75 74 2d 3e 61 5b 34 5d 20 3d 20 6d 78 58 3b 0a  ut->a[4] = mxX;.
36c0: 20 20 20 20 20 20 70 4f 75 74 2d 3e 61 5b 35 5d        pOut->a[5]
36d0: 20 3d 20 6d 78 59 3b 0a 20 20 20 20 20 20 70 4f   = mxY;.      pO
36e0: 75 74 2d 3e 61 5b 36 5d 20 3d 20 6d 6e 58 3b 0a  ut->a[6] = mnX;.
36f0: 20 20 20 20 20 20 70 4f 75 74 2d 3e 61 5b 37 5d        pOut->a[7]
3700: 20 3d 20 6d 78 59 3b 0a 20 20 20 20 7d 65 6c 73   = mxY;.    }els
3710: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
3720: 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20  _free(p);.      
3730: 61 43 6f 6f 72 64 5b 30 5d 2e 66 20 3d 20 6d 6e  aCoord[0].f = mn
3740: 58 3b 0a 20 20 20 20 20 20 61 43 6f 6f 72 64 5b  X;.      aCoord[
3750: 31 5d 2e 66 20 3d 20 6d 78 58 3b 0a 20 20 20 20  1].f = mxX;.    
3760: 20 20 61 43 6f 6f 72 64 5b 32 5d 2e 66 20 3d 20    aCoord[2].f = 
3770: 6d 6e 59 3b 0a 20 20 20 20 20 20 61 43 6f 6f 72  mnY;.      aCoor
3780: 64 5b 33 5d 2e 66 20 3d 20 6d 78 59 3b 0a 20 20  d[3].f = mxY;.  
3790: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
37a0: 20 70 4f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pOut;.}../*.** 
37b0: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
37c0: 66 20 74 68 65 20 67 65 6f 70 6f 6c 79 5f 62 62  f the geopoly_bb
37d0: 6f 78 28 58 29 20 53 51 4c 20 66 75 6e 63 74 69  ox(X) SQL functi
37e0: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
37f0: 69 64 20 67 65 6f 70 6f 6c 79 42 42 6f 78 46 75  id geopolyBBoxFu
3800: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
3810: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
3820: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
3830: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
3840: 67 76 0a 29 7b 0a 20 20 47 65 6f 50 6f 6c 79 20  gv.){.  GeoPoly 
3850: 2a 70 20 3d 20 67 65 6f 70 6f 6c 79 42 42 6f 78  *p = geopolyBBox
3860: 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 30  (context, argv[0
3870: 5d 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  ], 0, 0);.  if( 
3880: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
3890: 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 28 63 6f 6e  _result_blob(con
38a0: 74 65 78 74 2c 20 70 2d 3e 68 64 72 2c 20 0a 20  text, p->hdr, . 
38b0: 20 20 20 20 20 20 34 2b 38 2a 70 2d 3e 6e 56 65        4+8*p->nVe
38c0: 72 74 65 78 2c 20 53 51 4c 49 54 45 5f 54 52 41  rtex, SQLITE_TRA
38d0: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
38e0: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
38f0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  }.}../*.** Deter
3900: 6d 69 6e 65 20 69 66 20 70 6f 69 6e 74 20 28 78  mine if point (x
3910: 30 2c 79 30 29 20 69 73 20 62 65 6e 65 61 74 68  0,y0) is beneath
3920: 20 6c 69 6e 65 20 73 65 67 6d 65 6e 74 20 28 78   line segment (x
3930: 31 2c 79 31 29 2d 3e 28 78 32 2c 79 32 29 2e 0a  1,y1)->(x2,y2)..
3940: 2a 2a 20 52 65 74 75 72 6e 73 3a 0a 2a 2a 0a 2a  ** Returns:.**.*
3950: 2a 20 20 20 20 2b 32 20 20 78 30 2c 79 30 20 69  *    +2  x0,y0 i
3960: 73 20 6f 6e 20 74 68 65 20 6c 69 6e 65 20 73 65  s on the line se
3970: 67 65 6d 65 6e 74 0a 2a 2a 0a 2a 2a 20 20 20 20  gement.**.**    
3980: 2b 31 20 20 78 30 2c 79 30 20 69 73 20 62 65 6e  +1  x0,y0 is ben
3990: 65 61 74 68 20 6c 69 6e 65 20 73 65 67 6d 65 6e  eath line segmen
39a0: 74 0a 2a 2a 0a 2a 2a 20 20 20 20 30 20 20 20 78  t.**.**    0   x
39b0: 30 2c 79 30 20 69 73 20 6e 6f 74 20 6f 6e 20 6f  0,y0 is not on o
39c0: 72 20 62 65 6e 65 61 74 68 20 74 68 65 20 6c 69  r beneath the li
39d0: 6e 65 20 73 65 67 6d 65 6e 74 20 6f 72 20 74 68  ne segment or th
39e0: 65 20 6c 69 6e 65 20 73 65 67 6d 65 6e 74 0a 2a  e line segment.*
39f0: 2a 20 20 20 20 20 20 20 20 69 73 20 76 65 72 74  *        is vert
3a00: 69 63 61 6c 20 61 6e 64 20 78 30 2c 79 30 20 69  ical and x0,y0 i
3a10: 73 20 6e 6f 74 20 6f 6e 20 74 68 65 20 6c 69 6e  s not on the lin
3a20: 65 20 73 65 67 6d 65 6e 74 0a 2a 2a 0a 2a 2a 20  e segment.**.** 
3a30: 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f  The left-most co
3a40: 6f 72 64 69 6e 61 74 65 20 6d 69 6e 28 78 31 2c  ordinate min(x1,
3a50: 78 32 29 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69  x2) is not consi
3a60: 64 65 72 65 64 20 74 6f 20 62 65 20 70 61 72 74  dered to be part
3a70: 20 6f 66 0a 2a 2a 20 74 68 65 20 6c 69 6e 65 20   of.** the line 
3a80: 73 65 67 6d 65 6e 74 20 66 6f 72 20 74 68 65 20  segment for the 
3a90: 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73  purposes of this
3aa0: 20 61 6e 61 6c 79 73 69 73 2e 0a 2a 2f 0a 73 74   analysis..*/.st
3ab0: 61 74 69 63 20 69 6e 74 20 70 6f 69 6e 74 42 65  atic int pointBe
3ac0: 6e 65 61 74 68 4c 69 6e 65 28 0a 20 20 64 6f 75  neathLine(.  dou
3ad0: 62 6c 65 20 78 30 2c 20 64 6f 75 62 6c 65 20 79  ble x0, double y
3ae0: 30 2c 0a 20 20 64 6f 75 62 6c 65 20 78 31 2c 20  0,.  double x1, 
3af0: 64 6f 75 62 6c 65 20 79 31 2c 0a 20 20 64 6f 75  double y1,.  dou
3b00: 62 6c 65 20 78 32 2c 20 64 6f 75 62 6c 65 20 79  ble x2, double y
3b10: 32 0a 29 7b 0a 20 20 64 6f 75 62 6c 65 20 79 3b  2.){.  double y;
3b20: 0a 20 20 69 66 28 20 78 30 3d 3d 78 31 20 26 26  .  if( x0==x1 &&
3b30: 20 79 30 3d 3d 79 31 20 29 20 72 65 74 75 72 6e   y0==y1 ) return
3b40: 20 32 3b 0a 20 20 69 66 28 20 78 31 3c 78 32 20   2;.  if( x1<x2 
3b50: 29 7b 0a 20 20 20 20 69 66 28 20 78 30 3c 3d 78  ){.    if( x0<=x
3b60: 31 20 7c 7c 20 78 30 3e 78 32 20 29 20 72 65 74  1 || x0>x2 ) ret
3b70: 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  urn 0;.  }else i
3b80: 66 28 20 78 31 3e 78 32 20 29 7b 0a 20 20 20 20  f( x1>x2 ){.    
3b90: 69 66 28 20 78 30 3c 3d 78 32 20 7c 7c 20 78 30  if( x0<=x2 || x0
3ba0: 3e 78 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  >x1 ) return 0;.
3bb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
3bc0: 56 65 72 74 69 63 61 6c 20 6c 69 6e 65 20 73 65  Vertical line se
3bd0: 67 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28  gment */.    if(
3be0: 20 78 30 21 3d 78 31 20 29 20 72 65 74 75 72 6e   x0!=x1 ) return
3bf0: 20 30 3b 0a 20 20 20 20 69 66 28 20 79 30 3c 79   0;.    if( y0<y
3c00: 31 20 26 26 20 79 30 3c 79 32 20 29 20 72 65 74  1 && y0<y2 ) ret
3c10: 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 79  urn 0;.    if( y
3c20: 30 3e 79 31 20 26 26 20 79 30 3e 79 32 20 29 20  0>y1 && y0>y2 ) 
3c30: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 72 65  return 0;.    re
3c40: 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 79 20  turn 2;.  }.  y 
3c50: 3d 20 79 31 20 2b 20 28 79 32 2d 79 31 29 2a 28  = y1 + (y2-y1)*(
3c60: 78 30 2d 78 31 29 2f 28 78 32 2d 78 31 29 3b 0a  x0-x1)/(x2-x1);.
3c70: 20 20 69 66 28 20 79 30 3d 3d 79 20 29 20 72 65    if( y0==y ) re
3c80: 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20 79 30  turn 2;.  if( y0
3c90: 3c 79 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  <y ) return 1;. 
3ca0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
3cb0: 0a 2a 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  .** SQL function
3cc0: 3a 20 20 20 20 67 65 6f 70 6f 6c 79 5f 77 69 74  :    geopoly_wit
3cd0: 68 69 6e 28 50 2c 58 2c 59 29 0a 2a 2a 0a 2a 2a  hin(P,X,Y).**.**
3ce0: 20 52 65 74 75 72 6e 20 2b 32 20 69 66 20 70 6f   Return +2 if po
3cf0: 69 6e 74 20 58 2c 59 20 69 73 20 77 69 74 68 69  int X,Y is withi
3d00: 6e 20 70 6f 6c 79 67 6f 6e 20 50 2e 0a 2a 2a 20  n polygon P..** 
3d10: 52 65 74 75 72 6e 20 2b 31 20 69 66 20 70 6f 69  Return +1 if poi
3d20: 6e 74 20 58 2c 59 20 69 73 20 6f 6e 20 74 68 65  nt X,Y is on the
3d30: 20 70 6f 6c 79 67 6f 6e 20 62 6f 75 6e 64 61 72   polygon boundar
3d40: 79 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69  y..** Return 0 i
3d50: 66 20 70 6f 69 6e 74 20 58 2c 59 20 69 73 20 6f  f point X,Y is o
3d60: 75 74 73 69 64 65 20 74 68 65 20 70 6f 6c 79 67  utside the polyg
3d70: 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  on.*/.static voi
3d80: 64 20 67 65 6f 70 6f 6c 79 57 69 74 68 69 6e 46  d geopolyWithinF
3d90: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
3da0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
3db0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
3dc0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
3dd0: 72 67 76 0a 29 7b 0a 20 20 47 65 6f 50 6f 6c 79  rgv.){.  GeoPoly
3de0: 20 2a 70 20 3d 20 67 65 6f 70 6f 6c 79 46 75 6e   *p = geopolyFun
3df0: 63 50 61 72 61 6d 28 63 6f 6e 74 65 78 74 2c 20  cParam(context, 
3e00: 61 72 67 76 5b 30 5d 2c 20 30 29 3b 0a 20 20 64  argv[0], 0);.  d
3e10: 6f 75 62 6c 65 20 78 30 20 3d 20 73 71 6c 69 74  ouble x0 = sqlit
3e20: 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28  e3_value_double(
3e30: 61 72 67 76 5b 31 5d 29 3b 0a 20 20 64 6f 75 62  argv[1]);.  doub
3e40: 6c 65 20 79 30 20 3d 20 73 71 6c 69 74 65 33 5f  le y0 = sqlite3_
3e50: 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67  value_double(arg
3e60: 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 70 20 29  v[2]);.  if( p )
3e70: 7b 0a 20 20 20 20 69 6e 74 20 76 20 3d 20 30 3b  {.    int v = 0;
3e80: 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  .    int cnt = 0
3e90: 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20  ;.    int ii;.  
3ea0: 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
3eb0: 2d 3e 6e 56 65 72 74 65 78 2d 31 3b 20 69 69 2b  ->nVertex-1; ii+
3ec0: 2b 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 6f  +){.      v = po
3ed0: 69 6e 74 42 65 6e 65 61 74 68 4c 69 6e 65 28 78  intBeneathLine(x
3ee0: 30 2c 79 30 2c 70 2d 3e 61 5b 69 69 2a 32 5d 2c  0,y0,p->a[ii*2],
3ef0: 70 2d 3e 61 5b 69 69 2a 32 2b 31 5d 2c 0a 20 20  p->a[ii*2+1],.  
3f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
3f20: 2d 3e 61 5b 69 69 2a 32 2b 32 5d 2c 70 2d 3e 61  ->a[ii*2+2],p->a
3f30: 5b 69 69 2a 32 2b 33 5d 29 3b 0a 20 20 20 20 20  [ii*2+3]);.     
3f40: 20 69 66 28 20 76 3d 3d 32 20 29 20 62 72 65 61   if( v==2 ) brea
3f50: 6b 3b 0a 20 20 20 20 20 20 63 6e 74 20 2b 3d 20  k;.      cnt += 
3f60: 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  v;.    }.    if(
3f70: 20 76 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 76   v!=2 ){.      v
3f80: 20 3d 20 70 6f 69 6e 74 42 65 6e 65 61 74 68 4c   = pointBeneathL
3f90: 69 6e 65 28 78 30 2c 79 30 2c 70 2d 3e 61 5b 69  ine(x0,y0,p->a[i
3fa0: 69 2a 32 5d 2c 70 2d 3e 61 5b 69 69 2a 32 2b 31  i*2],p->a[ii*2+1
3fb0: 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ],.             
3fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3fd0: 20 20 20 20 70 2d 3e 61 5b 30 5d 2c 70 2d 3e 61      p->a[0],p->a
3fe0: 5b 31 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [1]);.    }.    
3ff0: 69 66 28 20 76 3d 3d 32 20 29 7b 0a 20 20 20 20  if( v==2 ){.    
4000: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
4010: 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 31 29  _int(context, 1)
4020: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
4030: 28 28 76 2b 63 6e 74 29 26 31 29 3d 3d 30 20 29  ((v+cnt)&1)==0 )
4040: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
4050: 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65  result_int(conte
4060: 78 74 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  xt, 0);.    }els
4070: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
4080: 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74  _result_int(cont
4090: 65 78 74 2c 20 32 29 3b 0a 20 20 20 20 7d 0a 20  ext, 2);.    }. 
40a0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
40b0: 70 29 3b 0a 20 20 7d 20 20 20 20 20 20 20 20 20  p);.  }         
40c0: 20 20 20 0a 7d 0a 0a 2f 2a 20 4f 62 6a 65 63 74     .}../* Object
40d0: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 6f 76  s used by the ov
40e0: 65 72 6c 61 70 20 61 6c 67 6f 72 69 68 6d 2e 20  erlap algorihm. 
40f0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
4100: 74 20 47 65 6f 45 76 65 6e 74 20 47 65 6f 45 76  t GeoEvent GeoEv
4110: 65 6e 74 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ent;.typedef str
4120: 75 63 74 20 47 65 6f 53 65 67 6d 65 6e 74 20 47  uct GeoSegment G
4130: 65 6f 53 65 67 6d 65 6e 74 3b 0a 74 79 70 65 64  eoSegment;.typed
4140: 65 66 20 73 74 72 75 63 74 20 47 65 6f 4f 76 65  ef struct GeoOve
4150: 72 6c 61 70 20 47 65 6f 4f 76 65 72 6c 61 70 3b  rlap GeoOverlap;
4160: 0a 73 74 72 75 63 74 20 47 65 6f 45 76 65 6e 74  .struct GeoEvent
4170: 20 7b 0a 20 20 64 6f 75 62 6c 65 20 78 3b 20 20   {.  double x;  
4180: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 58              /* X
4190: 20 63 6f 6f 72 64 69 6e 61 74 65 20 61 74 20 77   coordinate at w
41a0: 68 69 63 68 20 65 76 65 6e 74 20 6f 63 63 75 72  hich event occur
41b0: 73 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65  s */.  int eType
41c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
41d0: 20 30 20 66 6f 72 20 41 44 44 2c 20 31 20 66 6f   0 for ADD, 1 fo
41e0: 72 20 52 45 4d 4f 56 45 20 2a 2f 0a 20 20 47 65  r REMOVE */.  Ge
41f0: 6f 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20  oSegment *pSeg; 
4200: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 65 67 6d       /* The segm
4210: 65 6e 74 20 74 6f 20 62 65 20 61 64 64 65 64 20  ent to be added 
4220: 6f 72 20 72 65 6d 6f 76 65 64 20 2a 2f 0a 20 20  or removed */.  
4230: 47 65 6f 45 76 65 6e 74 20 2a 70 4e 65 78 74 3b  GeoEvent *pNext;
4240: 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 65         /* Next e
4250: 76 65 6e 74 20 69 6e 20 74 68 65 20 73 6f 72 74  vent in the sort
4260: 65 64 20 6c 69 73 74 20 2a 2f 0a 7d 3b 0a 73 74  ed list */.};.st
4270: 72 75 63 74 20 47 65 6f 53 65 67 6d 65 6e 74 20  ruct GeoSegment 
4280: 7b 0a 20 20 64 6f 75 62 6c 65 20 43 2c 20 42 3b  {.  double C, B;
4290: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 79 20             /* y 
42a0: 3d 20 43 2a 78 20 2b 20 42 20 2a 2f 0a 20 20 64  = C*x + B */.  d
42b0: 6f 75 62 6c 65 20 79 3b 20 20 20 20 20 20 20 20  ouble y;        
42c0: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
42d0: 20 79 20 76 61 6c 75 65 20 2a 2f 0a 20 20 66 6c   y value */.  fl
42e0: 6f 61 74 20 79 30 3b 20 20 20 20 20 20 20 20 20  oat y0;         
42f0: 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20       /* Initial 
4300: 79 20 76 61 6c 75 65 20 2a 2f 0a 20 20 75 6e 73  y value */.  uns
4310: 69 67 6e 65 64 20 63 68 61 72 20 73 69 64 65 3b  igned char side;
4320: 20 20 20 20 2f 2a 20 31 20 66 6f 72 20 70 31 2c      /* 1 for p1,
4330: 20 32 20 66 6f 72 20 70 32 20 2a 2f 0a 20 20 75   2 for p2 */.  u
4340: 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 64 78 3b  nsigned int idx;
4350: 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 73        /* Which s
4360: 65 67 6d 65 6e 74 20 77 69 74 68 69 6e 20 74 68  egment within th
4370: 65 20 73 69 64 65 20 2a 2f 0a 20 20 47 65 6f 53  e side */.  GeoS
4380: 65 67 6d 65 6e 74 20 2a 70 4e 65 78 74 3b 20 20  egment *pNext;  
4390: 20 20 20 2f 2a 20 4e 65 78 74 20 73 65 67 6d 65     /* Next segme
43a0: 6e 74 20 69 6e 20 61 20 6c 69 73 74 20 73 6f 72  nt in a list sor
43b0: 74 65 64 20 62 79 20 79 20 2a 2f 0a 7d 3b 0a 73  ted by y */.};.s
43c0: 74 72 75 63 74 20 47 65 6f 4f 76 65 72 6c 61 70  truct GeoOverlap
43d0: 20 7b 0a 20 20 47 65 6f 45 76 65 6e 74 20 2a 61   {.  GeoEvent *a
43e0: 45 76 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20  Event;          
43f0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 6c 6c 20  /* Array of all 
4400: 65 76 65 6e 74 73 20 2a 2f 0a 20 20 47 65 6f 53  events */.  GeoS
4410: 65 67 6d 65 6e 74 20 2a 61 53 65 67 6d 65 6e 74  egment *aSegment
4420: 3b 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20  ;      /* Array 
4430: 6f 66 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20  of all segments 
4440: 2a 2f 0a 20 20 69 6e 74 20 6e 45 76 65 6e 74 3b  */.  int nEvent;
4450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4460: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 76 65  /* Number of eve
4470: 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65  nts */.  int nSe
4480: 67 6d 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20  gment;          
4490: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
44a0: 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 7d 3b 0a   segments */.};.
44b0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e  ./*.** Add a sin
44c0: 67 6c 65 20 73 65 67 6d 65 6e 74 20 61 6e 64 20  gle segment and 
44d0: 69 74 73 20 61 73 73 6f 63 69 61 74 65 64 20 65  its associated e
44e0: 76 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  vents..*/.static
44f0: 20 76 6f 69 64 20 67 65 6f 70 6f 6c 79 41 64 64   void geopolyAdd
4500: 4f 6e 65 53 65 67 6d 65 6e 74 28 0a 20 20 47 65  OneSegment(.  Ge
4510: 6f 4f 76 65 72 6c 61 70 20 2a 70 2c 0a 20 20 47  oOverlap *p,.  G
4520: 65 6f 43 6f 6f 72 64 20 78 30 2c 0a 20 20 47 65  eoCoord x0,.  Ge
4530: 6f 43 6f 6f 72 64 20 79 30 2c 0a 20 20 47 65 6f  oCoord y0,.  Geo
4540: 43 6f 6f 72 64 20 78 31 2c 0a 20 20 47 65 6f 43  Coord x1,.  GeoC
4550: 6f 6f 72 64 20 79 31 2c 0a 20 20 75 6e 73 69 67  oord y1,.  unsig
4560: 6e 65 64 20 63 68 61 72 20 73 69 64 65 2c 0a 20  ned char side,. 
4570: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 64   unsigned int id
4580: 78 0a 29 7b 0a 20 20 47 65 6f 53 65 67 6d 65 6e  x.){.  GeoSegmen
4590: 74 20 2a 70 53 65 67 3b 0a 20 20 47 65 6f 45 76  t *pSeg;.  GeoEv
45a0: 65 6e 74 20 2a 70 45 76 65 6e 74 3b 0a 20 20 69  ent *pEvent;.  i
45b0: 66 28 20 78 30 3d 3d 78 31 20 29 20 72 65 74 75  f( x0==x1 ) retu
45c0: 72 6e 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 76  rn;  /* Ignore v
45d0: 65 72 74 69 63 61 6c 20 73 65 67 6d 65 6e 74 73  ertical segments
45e0: 20 2a 2f 0a 20 20 69 66 28 20 78 30 3e 78 31 20   */.  if( x0>x1 
45f0: 29 7b 0a 20 20 20 20 47 65 6f 43 6f 6f 72 64 20  ){.    GeoCoord 
4600: 74 20 3d 20 78 30 3b 0a 20 20 20 20 78 30 20 3d  t = x0;.    x0 =
4610: 20 78 31 3b 0a 20 20 20 20 78 31 20 3d 20 74 3b   x1;.    x1 = t;
4620: 0a 20 20 20 20 74 20 3d 20 79 30 3b 0a 20 20 20  .    t = y0;.   
4630: 20 79 30 20 3d 20 79 31 3b 0a 20 20 20 20 79 31   y0 = y1;.    y1
4640: 20 3d 20 74 3b 0a 20 20 7d 0a 20 20 70 53 65 67   = t;.  }.  pSeg
4650: 20 3d 20 70 2d 3e 61 53 65 67 6d 65 6e 74 20 2b   = p->aSegment +
4660: 20 70 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a 20 20   p->nSegment;.  
4670: 70 2d 3e 6e 53 65 67 6d 65 6e 74 2b 2b 3b 0a 20  p->nSegment++;. 
4680: 20 70 53 65 67 2d 3e 43 20 3d 20 28 79 31 2d 79   pSeg->C = (y1-y
4690: 30 29 2f 28 78 31 2d 78 30 29 3b 0a 20 20 70 53  0)/(x1-x0);.  pS
46a0: 65 67 2d 3e 42 20 3d 20 79 31 20 2d 20 78 31 2a  eg->B = y1 - x1*
46b0: 70 53 65 67 2d 3e 43 3b 0a 20 20 70 53 65 67 2d  pSeg->C;.  pSeg-
46c0: 3e 79 30 20 3d 20 79 30 3b 0a 20 20 70 53 65 67  >y0 = y0;.  pSeg
46d0: 2d 3e 73 69 64 65 20 3d 20 73 69 64 65 3b 0a 20  ->side = side;. 
46e0: 20 70 53 65 67 2d 3e 69 64 78 20 3d 20 69 64 78   pSeg->idx = idx
46f0: 3b 0a 20 20 70 45 76 65 6e 74 20 3d 20 70 2d 3e  ;.  pEvent = p->
4700: 61 45 76 65 6e 74 20 2b 20 70 2d 3e 6e 45 76 65  aEvent + p->nEve
4710: 6e 74 3b 0a 20 20 70 2d 3e 6e 45 76 65 6e 74 2b  nt;.  p->nEvent+
4720: 2b 3b 0a 20 20 70 45 76 65 6e 74 2d 3e 78 20 3d  +;.  pEvent->x =
4730: 20 78 30 3b 0a 20 20 70 45 76 65 6e 74 2d 3e 65   x0;.  pEvent->e
4740: 54 79 70 65 20 3d 20 30 3b 0a 20 20 70 45 76 65  Type = 0;.  pEve
4750: 6e 74 2d 3e 70 53 65 67 20 3d 20 70 53 65 67 3b  nt->pSeg = pSeg;
4760: 0a 20 20 70 45 76 65 6e 74 20 3d 20 70 2d 3e 61  .  pEvent = p->a
4770: 45 76 65 6e 74 20 2b 20 70 2d 3e 6e 45 76 65 6e  Event + p->nEven
4780: 74 3b 0a 20 20 70 2d 3e 6e 45 76 65 6e 74 2b 2b  t;.  p->nEvent++
4790: 3b 0a 20 20 70 45 76 65 6e 74 2d 3e 78 20 3d 20  ;.  pEvent->x = 
47a0: 78 31 3b 0a 20 20 70 45 76 65 6e 74 2d 3e 65 54  x1;.  pEvent->eT
47b0: 79 70 65 20 3d 20 31 3b 0a 20 20 70 45 76 65 6e  ype = 1;.  pEven
47c0: 74 2d 3e 70 53 65 67 20 3d 20 70 53 65 67 3b 0a  t->pSeg = pSeg;.
47d0: 7d 0a 20 20 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73  }.  .../*.** Ins
47e0: 65 72 74 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73  ert all segments
47f0: 20 61 6e 64 20 65 76 65 6e 74 73 20 66 6f 72 20   and events for 
4800: 70 6f 6c 79 67 6f 6e 20 70 50 6f 6c 79 2e 0a 2a  polygon pPoly..*
4810: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
4820: 6f 70 6f 6c 79 41 64 64 53 65 67 6d 65 6e 74 73  opolyAddSegments
4830: 28 0a 20 20 47 65 6f 4f 76 65 72 6c 61 70 20 2a  (.  GeoOverlap *
4840: 70 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  p,          /* A
4850: 64 64 20 73 65 67 6d 65 6e 74 73 20 74 6f 20 74  dd segments to t
4860: 68 69 73 20 4f 76 65 72 6c 61 70 20 6f 62 6a 65  his Overlap obje
4870: 63 74 20 2a 2f 0a 20 20 47 65 6f 50 6f 6c 79 20  ct */.  GeoPoly 
4880: 2a 70 50 6f 6c 79 2c 20 20 20 20 20 20 20 20 20  *pPoly,         
4890: 2f 2a 20 54 61 6b 65 20 61 6c 6c 20 73 65 67 6d  /* Take all segm
48a0: 65 6e 74 73 20 66 72 6f 6d 20 74 68 69 73 20 70  ents from this p
48b0: 6f 6c 79 67 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69  olygon */.  unsi
48c0: 67 6e 65 64 20 63 68 61 72 20 73 69 64 65 20 20  gned char side  
48d0: 20 20 20 20 2f 2a 20 54 68 65 20 73 69 64 65 20      /* The side 
48e0: 6f 66 20 70 50 6f 6c 79 20 2a 2f 0a 29 7b 0a 20  of pPoly */.){. 
48f0: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b   unsigned int i;
4900: 0a 20 20 47 65 6f 43 6f 6f 72 64 20 2a 78 3b 0a  .  GeoCoord *x;.
4910: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 6f    for(i=0; i<pPo
4920: 6c 79 2d 3e 6e 56 65 72 74 65 78 2d 31 3b 20 69  ly->nVertex-1; i
4930: 2b 2b 29 7b 0a 20 20 20 20 78 20 3d 20 70 50 6f  ++){.    x = pPo
4940: 6c 79 2d 3e 61 20 2b 20 28 69 2a 32 29 3b 0a 20  ly->a + (i*2);. 
4950: 20 20 20 67 65 6f 70 6f 6c 79 41 64 64 4f 6e 65     geopolyAddOne
4960: 53 65 67 6d 65 6e 74 28 70 2c 20 78 5b 30 5d 2c  Segment(p, x[0],
4970: 20 78 5b 31 5d 2c 20 78 5b 32 5d 2c 20 78 5b 33   x[1], x[2], x[3
4980: 5d 2c 20 73 69 64 65 2c 20 69 29 3b 0a 20 20 7d  ], side, i);.  }
4990: 0a 20 20 78 20 3d 20 70 50 6f 6c 79 2d 3e 61 20  .  x = pPoly->a 
49a0: 2b 20 28 69 2a 32 29 3b 0a 20 20 67 65 6f 70 6f  + (i*2);.  geopo
49b0: 6c 79 41 64 64 4f 6e 65 53 65 67 6d 65 6e 74 28  lyAddOneSegment(
49c0: 70 2c 20 78 5b 30 5d 2c 20 78 5b 31 5d 2c 20 70  p, x[0], x[1], p
49d0: 50 6f 6c 79 2d 3e 61 5b 30 5d 2c 20 70 50 6f 6c  Poly->a[0], pPol
49e0: 79 2d 3e 61 5b 31 5d 2c 20 73 69 64 65 2c 20 69  y->a[1], side, i
49f0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72 67  );.}../*.** Merg
4a00: 65 20 74 77 6f 20 6c 69 73 74 73 20 6f 66 20 73  e two lists of s
4a10: 6f 72 74 65 64 20 65 76 65 6e 74 73 20 62 79 20  orted events by 
4a20: 58 20 63 6f 6f 72 64 69 6e 61 74 65 0a 2a 2f 0a  X coordinate.*/.
4a30: 73 74 61 74 69 63 20 47 65 6f 45 76 65 6e 74 20  static GeoEvent 
4a40: 2a 67 65 6f 70 6f 6c 79 45 76 65 6e 74 4d 65 72  *geopolyEventMer
4a50: 67 65 28 47 65 6f 45 76 65 6e 74 20 2a 70 4c 65  ge(GeoEvent *pLe
4a60: 66 74 2c 20 47 65 6f 45 76 65 6e 74 20 2a 70 52  ft, GeoEvent *pR
4a70: 69 67 68 74 29 7b 0a 20 20 47 65 6f 45 76 65 6e  ight){.  GeoEven
4a80: 74 20 68 65 61 64 2c 20 2a 70 4c 61 73 74 3b 0a  t head, *pLast;.
4a90: 20 20 68 65 61 64 2e 70 4e 65 78 74 20 3d 20 30    head.pNext = 0
4aa0: 3b 0a 20 20 70 4c 61 73 74 20 3d 20 26 68 65 61  ;.  pLast = &hea
4ab0: 64 3b 0a 20 20 77 68 69 6c 65 28 20 70 52 69 67  d;.  while( pRig
4ac0: 68 74 20 26 26 20 70 4c 65 66 74 20 29 7b 0a 20  ht && pLeft ){. 
4ad0: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 78     if( pRight->x
4ae0: 20 3c 3d 20 70 4c 65 66 74 2d 3e 78 20 29 7b 0a   <= pLeft->x ){.
4af0: 20 20 20 20 20 20 70 4c 61 73 74 2d 3e 70 4e 65        pLast->pNe
4b00: 78 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20  xt = pRight;.   
4b10: 20 20 20 70 4c 61 73 74 20 3d 20 70 52 69 67 68     pLast = pRigh
4b20: 74 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 20  t;.      pRight 
4b30: 3d 20 70 52 69 67 68 74 2d 3e 70 4e 65 78 74 3b  = pRight->pNext;
4b40: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4b50: 20 20 70 4c 61 73 74 2d 3e 70 4e 65 78 74 20 3d    pLast->pNext =
4b60: 20 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 4c   pLeft;.      pL
4b70: 61 73 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20 20  ast = pLeft;.   
4b80: 20 20 20 70 4c 65 66 74 20 3d 20 70 4c 65 66 74     pLeft = pLeft
4b90: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
4ba0: 20 7d 0a 20 20 70 4c 61 73 74 2d 3e 70 4e 65 78   }.  pLast->pNex
4bb0: 74 20 3d 20 70 52 69 67 68 74 20 3f 20 70 52 69  t = pRight ? pRi
4bc0: 67 68 74 20 3a 20 70 4c 65 66 74 3b 0a 20 20 72  ght : pLeft;.  r
4bd0: 65 74 75 72 6e 20 68 65 61 64 2e 70 4e 65 78 74  eturn head.pNext
4be0: 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 72  ;  .}../*.** Sor
4bf0: 74 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6e 45  t an array of nE
4c00: 76 65 6e 74 20 65 76 65 6e 74 20 6f 62 6a 65 63  vent event objec
4c10: 74 73 20 69 6e 74 6f 20 61 20 6c 69 73 74 2e 0a  ts into a list..
4c20: 2a 2f 0a 73 74 61 74 69 63 20 47 65 6f 45 76 65  */.static GeoEve
4c30: 6e 74 20 2a 67 65 6f 70 6f 6c 79 53 6f 72 74 45  nt *geopolySortE
4c40: 76 65 6e 74 73 42 79 58 28 47 65 6f 45 76 65 6e  ventsByX(GeoEven
4c50: 74 20 2a 61 45 76 65 6e 74 2c 20 69 6e 74 20 6e  t *aEvent, int n
4c60: 45 76 65 6e 74 29 7b 0a 20 20 69 6e 74 20 6d 78  Event){.  int mx
4c70: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a   = 0;.  int i, j
4c80: 3b 0a 20 20 47 65 6f 45 76 65 6e 74 20 2a 70 3b  ;.  GeoEvent *p;
4c90: 0a 20 20 47 65 6f 45 76 65 6e 74 20 2a 61 5b 35  .  GeoEvent *a[5
4ca0: 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  0];.  for(i=0; i
4cb0: 3c 6e 45 76 65 6e 74 3b 20 69 2b 2b 29 7b 0a 20  <nEvent; i++){. 
4cc0: 20 20 20 70 20 3d 20 26 61 45 76 65 6e 74 5b 69     p = &aEvent[i
4cd0: 5d 3b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 20  ];.    p->pNext 
4ce0: 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  = 0;.    for(j=0
4cf0: 3b 20 6a 3c 6d 78 20 26 26 20 61 5b 6a 5d 3b 20  ; j<mx && a[j]; 
4d00: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 70 20 3d 20  j++){.      p = 
4d10: 67 65 6f 70 6f 6c 79 45 76 65 6e 74 4d 65 72 67  geopolyEventMerg
4d20: 65 28 61 5b 6a 5d 2c 20 70 29 3b 0a 20 20 20 20  e(a[j], p);.    
4d30: 20 20 61 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20    a[j] = 0;.    
4d40: 7d 0a 20 20 20 20 61 5b 6a 5d 20 3d 20 70 3b 0a  }.    a[j] = p;.
4d50: 20 20 20 20 69 66 28 20 6a 3e 3d 6d 78 20 29 20      if( j>=mx ) 
4d60: 6d 78 20 3d 20 6a 2b 31 3b 0a 20 20 7d 0a 20 20  mx = j+1;.  }.  
4d70: 70 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  p = 0;.  for(i=0
4d80: 3b 20 69 3c 6d 78 3b 20 69 2b 2b 29 7b 0a 20 20  ; i<mx; i++){.  
4d90: 20 20 70 20 3d 20 67 65 6f 70 6f 6c 79 45 76 65    p = geopolyEve
4da0: 6e 74 4d 65 72 67 65 28 61 5b 69 5d 2c 20 70 29  ntMerge(a[i], p)
4db0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
4dc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72 67 65  ;.}../*.** Merge
4dd0: 20 74 77 6f 20 6c 69 73 74 73 20 6f 66 20 73 6f   two lists of so
4de0: 72 74 65 64 20 73 65 67 6d 65 6e 74 73 20 62 79  rted segments by
4df0: 20 59 2c 20 61 6e 64 20 74 68 65 6e 20 62 79 20   Y, and then by 
4e00: 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 47 65 6f  C..*/.static Geo
4e10: 53 65 67 6d 65 6e 74 20 2a 67 65 6f 70 6f 6c 79  Segment *geopoly
4e20: 53 65 67 6d 65 6e 74 4d 65 72 67 65 28 47 65 6f  SegmentMerge(Geo
4e30: 53 65 67 6d 65 6e 74 20 2a 70 4c 65 66 74 2c 20  Segment *pLeft, 
4e40: 47 65 6f 53 65 67 6d 65 6e 74 20 2a 70 52 69 67  GeoSegment *pRig
4e50: 68 74 29 7b 0a 20 20 47 65 6f 53 65 67 6d 65 6e  ht){.  GeoSegmen
4e60: 74 20 68 65 61 64 2c 20 2a 70 4c 61 73 74 3b 0a  t head, *pLast;.
4e70: 20 20 68 65 61 64 2e 70 4e 65 78 74 20 3d 20 30    head.pNext = 0
4e80: 3b 0a 20 20 70 4c 61 73 74 20 3d 20 26 68 65 61  ;.  pLast = &hea
4e90: 64 3b 0a 20 20 77 68 69 6c 65 28 20 70 52 69 67  d;.  while( pRig
4ea0: 68 74 20 26 26 20 70 4c 65 66 74 20 29 7b 0a 20  ht && pLeft ){. 
4eb0: 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 70 52     double r = pR
4ec0: 69 67 68 74 2d 3e 79 20 2d 20 70 4c 65 66 74 2d  ight->y - pLeft-
4ed0: 3e 79 3b 0a 20 20 20 20 69 66 28 20 72 3d 3d 30  >y;.    if( r==0
4ee0: 2e 30 20 29 20 72 20 3d 20 70 52 69 67 68 74 2d  .0 ) r = pRight-
4ef0: 3e 43 20 2d 20 70 4c 65 66 74 2d 3e 43 3b 0a 20  >C - pLeft->C;. 
4f00: 20 20 20 69 66 28 20 72 3c 30 2e 30 20 29 7b 0a     if( r<0.0 ){.
4f10: 20 20 20 20 20 20 70 4c 61 73 74 2d 3e 70 4e 65        pLast->pNe
4f20: 78 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20  xt = pRight;.   
4f30: 20 20 20 70 4c 61 73 74 20 3d 20 70 52 69 67 68     pLast = pRigh
4f40: 74 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 20  t;.      pRight 
4f50: 3d 20 70 52 69 67 68 74 2d 3e 70 4e 65 78 74 3b  = pRight->pNext;
4f60: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4f70: 20 20 70 4c 61 73 74 2d 3e 70 4e 65 78 74 20 3d    pLast->pNext =
4f80: 20 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 4c   pLeft;.      pL
4f90: 61 73 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20 20  ast = pLeft;.   
4fa0: 20 20 20 70 4c 65 66 74 20 3d 20 70 4c 65 66 74     pLeft = pLeft
4fb0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
4fc0: 20 7d 0a 20 20 70 4c 61 73 74 2d 3e 70 4e 65 78   }.  pLast->pNex
4fd0: 74 20 3d 20 70 52 69 67 68 74 20 3f 20 70 52 69  t = pRight ? pRi
4fe0: 67 68 74 20 3a 20 70 4c 65 66 74 3b 0a 20 20 72  ght : pLeft;.  r
4ff0: 65 74 75 72 6e 20 68 65 61 64 2e 70 4e 65 78 74  eturn head.pNext
5000: 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 72  ;  .}../*.** Sor
5010: 74 20 61 20 6c 69 73 74 20 6f 66 20 47 65 6f 53  t a list of GeoS
5020: 65 67 6d 65 6e 74 73 20 69 6e 20 6f 72 64 65 72  egments in order
5030: 20 6f 66 20 69 6e 63 72 65 61 73 69 6e 67 20 59   of increasing Y
5040: 20 61 6e 64 20 69 6e 20 74 68 65 20 65 76 65 6e   and in the even
5050: 74 20 6f 66 0a 2a 2a 20 61 20 74 69 65 2c 20 69  t of.** a tie, i
5060: 6e 63 72 65 61 73 69 6e 67 20 43 20 28 73 6c 6f  ncreasing C (slo
5070: 70 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 47  pe)..*/.static G
5080: 65 6f 53 65 67 6d 65 6e 74 20 2a 67 65 6f 70 6f  eoSegment *geopo
5090: 6c 79 53 6f 72 74 53 65 67 6d 65 6e 74 73 42 79  lySortSegmentsBy
50a0: 59 41 6e 64 43 28 47 65 6f 53 65 67 6d 65 6e 74  YAndC(GeoSegment
50b0: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
50c0: 6d 78 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  mx = 0;.  int i;
50d0: 0a 20 20 47 65 6f 53 65 67 6d 65 6e 74 20 2a 70  .  GeoSegment *p
50e0: 3b 0a 20 20 47 65 6f 53 65 67 6d 65 6e 74 20 2a  ;.  GeoSegment *
50f0: 61 5b 35 30 5d 3b 0a 20 20 77 68 69 6c 65 28 20  a[50];.  while( 
5100: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 70 20 3d  pList ){.    p =
5110: 20 70 4c 69 73 74 3b 0a 20 20 20 20 70 4c 69 73   pList;.    pLis
5120: 74 20 3d 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74  t = pList->pNext
5130: 3b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d  ;.    p->pNext =
5140: 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   0;.    for(i=0;
5150: 20 69 3c 6d 78 20 26 26 20 61 5b 69 5d 3b 20 69   i<mx && a[i]; i
5160: 2b 2b 29 7b 0a 20 20 20 20 20 20 70 20 3d 20 67  ++){.      p = g
5170: 65 6f 70 6f 6c 79 53 65 67 6d 65 6e 74 4d 65 72  eopolySegmentMer
5180: 67 65 28 61 5b 69 5d 2c 20 70 29 3b 0a 20 20 20  ge(a[i], p);.   
5190: 20 20 20 61 5b 69 5d 20 3d 20 30 3b 0a 20 20 20     a[i] = 0;.   
51a0: 20 7d 0a 20 20 20 20 61 5b 69 5d 20 3d 20 70 3b   }.    a[i] = p;
51b0: 0a 20 20 20 20 69 66 28 20 69 3e 3d 6d 78 20 29  .    if( i>=mx )
51c0: 20 6d 78 20 3d 20 69 2b 31 3b 0a 20 20 7d 0a 20   mx = i+1;.  }. 
51d0: 20 70 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d   p = 0;.  for(i=
51e0: 30 3b 20 69 3c 6d 78 3b 20 69 2b 2b 29 7b 0a 20  0; i<mx; i++){. 
51f0: 20 20 20 70 20 3d 20 67 65 6f 70 6f 6c 79 53 65     p = geopolySe
5200: 67 6d 65 6e 74 4d 65 72 67 65 28 61 5b 69 5d 2c  gmentMerge(a[i],
5210: 20 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   p);.  }.  retur
5220: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  n p;.}../*.** De
5230: 74 65 72 6d 69 6e 65 20 74 68 65 20 6f 76 65 72  termine the over
5240: 6c 61 70 20 62 65 74 77 65 65 6e 20 74 77 6f 20  lap between two 
5250: 70 6f 6c 79 67 6f 6e 73 0a 2a 2f 0a 73 74 61 74  polygons.*/.stat
5260: 69 63 20 69 6e 74 20 67 65 6f 70 6f 6c 79 4f 76  ic int geopolyOv
5270: 65 72 6c 61 70 28 47 65 6f 50 6f 6c 79 20 2a 70  erlap(GeoPoly *p
5280: 31 2c 20 47 65 6f 50 6f 6c 79 20 2a 70 32 29 7b  1, GeoPoly *p2){
5290: 0a 20 20 69 6e 74 20 6e 56 65 72 74 65 78 20 3d  .  int nVertex =
52a0: 20 70 31 2d 3e 6e 56 65 72 74 65 78 20 2b 20 70   p1->nVertex + p
52b0: 32 2d 3e 6e 56 65 72 74 65 78 20 2b 20 32 3b 0a  2->nVertex + 2;.
52c0: 20 20 47 65 6f 4f 76 65 72 6c 61 70 20 2a 70 3b    GeoOverlap *p;
52d0: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
52e0: 47 65 6f 45 76 65 6e 74 20 2a 70 54 68 69 73 45  GeoEvent *pThisE
52f0: 76 65 6e 74 3b 0a 20 20 64 6f 75 62 6c 65 20 72  vent;.  double r
5300: 58 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  X;.  int rc = 0;
5310: 0a 20 20 69 6e 74 20 6e 65 65 64 53 6f 72 74 20  .  int needSort 
5320: 3d 20 30 3b 0a 20 20 47 65 6f 53 65 67 6d 65 6e  = 0;.  GeoSegmen
5330: 74 20 2a 70 41 63 74 69 76 65 20 3d 20 30 3b 0a  t *pActive = 0;.
5340: 20 20 47 65 6f 53 65 67 6d 65 6e 74 20 2a 70 53    GeoSegment *pS
5350: 65 67 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  eg;.  unsigned c
5360: 68 61 72 20 61 4f 76 65 72 6c 61 70 5b 34 5d 3b  har aOverlap[4];
5370: 0a 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  ..  nByte = size
5380: 6f 66 28 47 65 6f 45 76 65 6e 74 29 2a 6e 56 65  of(GeoEvent)*nVe
5390: 72 74 65 78 2a 32 20 0a 20 20 20 20 20 20 20 20  rtex*2 .        
53a0: 20 20 20 2b 20 73 69 7a 65 6f 66 28 47 65 6f 53     + sizeof(GeoS
53b0: 65 67 6d 65 6e 74 29 2a 6e 56 65 72 74 65 78 20  egment)*nVertex 
53c0: 0a 20 20 20 20 20 20 20 20 20 20 20 2b 20 73 69  .           + si
53d0: 7a 65 6f 66 28 47 65 6f 4f 76 65 72 6c 61 70 29  zeof(GeoOverlap)
53e0: 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  p = sqlite3_
53f0: 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b  malloc( nByte );
5400: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
5410: 74 75 72 6e 20 2d 31 3b 0a 20 20 70 2d 3e 61 45  turn -1;.  p->aE
5420: 76 65 6e 74 20 3d 20 28 47 65 6f 45 76 65 6e 74  vent = (GeoEvent
5430: 2a 29 26 70 5b 31 5d 3b 0a 20 20 70 2d 3e 61 53  *)&p[1];.  p->aS
5440: 65 67 6d 65 6e 74 20 3d 20 28 47 65 6f 53 65 67  egment = (GeoSeg
5450: 6d 65 6e 74 2a 29 26 70 2d 3e 61 45 76 65 6e 74  ment*)&p->aEvent
5460: 5b 6e 56 65 72 74 65 78 2a 32 5d 3b 0a 20 20 70  [nVertex*2];.  p
5470: 2d 3e 6e 45 76 65 6e 74 20 3d 20 70 2d 3e 6e 53  ->nEvent = p->nS
5480: 65 67 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 67 65  egment = 0;.  ge
5490: 6f 70 6f 6c 79 41 64 64 53 65 67 6d 65 6e 74 73  opolyAddSegments
54a0: 28 70 2c 20 70 31 2c 20 31 29 3b 0a 20 20 67 65  (p, p1, 1);.  ge
54b0: 6f 70 6f 6c 79 41 64 64 53 65 67 6d 65 6e 74 73  opolyAddSegments
54c0: 28 70 2c 20 70 32 2c 20 32 29 3b 0a 20 20 70 54  (p, p2, 2);.  pT
54d0: 68 69 73 45 76 65 6e 74 20 3d 20 67 65 6f 70 6f  hisEvent = geopo
54e0: 6c 79 53 6f 72 74 45 76 65 6e 74 73 42 79 58 28  lySortEventsByX(
54f0: 70 2d 3e 61 45 76 65 6e 74 2c 20 70 2d 3e 6e 45  p->aEvent, p->nE
5500: 76 65 6e 74 29 3b 0a 20 20 72 58 20 3d 20 70 54  vent);.  rX = pT
5510: 68 69 73 45 76 65 6e 74 2d 3e 78 3d 3d 30 2e 30  hisEvent->x==0.0
5520: 20 3f 20 2d 31 2e 30 20 3a 20 30 2e 30 3b 0a 20   ? -1.0 : 0.0;. 
5530: 20 6d 65 6d 73 65 74 28 61 4f 76 65 72 6c 61 70   memset(aOverlap
5540: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 4f 76 65  , 0, sizeof(aOve
5550: 72 6c 61 70 29 29 3b 0a 20 20 77 68 69 6c 65 28  rlap));.  while(
5560: 20 70 54 68 69 73 45 76 65 6e 74 20 29 7b 0a 20   pThisEvent ){. 
5570: 20 20 20 69 66 28 20 70 54 68 69 73 45 76 65 6e     if( pThisEven
5580: 74 2d 3e 78 21 3d 72 58 20 29 7b 0a 20 20 20 20  t->x!=rX ){.    
5590: 20 20 47 65 6f 53 65 67 6d 65 6e 74 20 2a 70 50    GeoSegment *pP
55a0: 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  rev = 0;.      i
55b0: 6e 74 20 69 4d 61 73 6b 20 3d 20 30 3b 0a 20 20  nt iMask = 0;.  
55c0: 20 20 20 20 47 45 4f 44 45 42 55 47 28 28 22 44      GEODEBUG(("D
55d0: 69 73 74 69 6e 63 74 20 58 3a 20 25 67 5c 6e 22  istinct X: %g\n"
55e0: 2c 20 70 54 68 69 73 45 76 65 6e 74 2d 3e 78 29  , pThisEvent->x)
55f0: 29 3b 0a 20 20 20 20 20 20 72 58 20 3d 20 70 54  );.      rX = pT
5600: 68 69 73 45 76 65 6e 74 2d 3e 78 3b 0a 20 20 20  hisEvent->x;.   
5610: 20 20 20 69 66 28 20 6e 65 65 64 53 6f 72 74 20     if( needSort 
5620: 29 7b 0a 20 20 20 20 20 20 20 20 47 45 4f 44 45  ){.        GEODE
5630: 42 55 47 28 28 22 53 4f 52 54 5c 6e 22 29 29 3b  BUG(("SORT\n"));
5640: 0a 20 20 20 20 20 20 20 20 70 41 63 74 69 76 65  .        pActive
5650: 20 3d 20 67 65 6f 70 6f 6c 79 53 6f 72 74 53 65   = geopolySortSe
5660: 67 6d 65 6e 74 73 42 79 59 41 6e 64 43 28 70 41  gmentsByYAndC(pA
5670: 63 74 69 76 65 29 3b 0a 20 20 20 20 20 20 20 20  ctive);.        
5680: 6e 65 65 64 53 6f 72 74 20 3d 20 30 3b 0a 20 20  needSort = 0;.  
5690: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
56a0: 70 53 65 67 3d 70 41 63 74 69 76 65 3b 20 70 53  pSeg=pActive; pS
56b0: 65 67 3b 20 70 53 65 67 3d 70 53 65 67 2d 3e 70  eg; pSeg=pSeg->p
56c0: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69  Next){.        i
56d0: 66 28 20 70 50 72 65 76 20 29 7b 0a 20 20 20 20  f( pPrev ){.    
56e0: 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76 2d        if( pPrev-
56f0: 3e 79 21 3d 70 53 65 67 2d 3e 79 20 29 7b 0a 20  >y!=pSeg->y ){. 
5700: 20 20 20 20 20 20 20 20 20 20 20 47 45 4f 44 45             GEODE
5710: 42 55 47 28 28 22 4d 41 53 4b 3a 20 25 64 5c 6e  BUG(("MASK: %d\n
5720: 22 2c 20 69 4d 61 73 6b 29 29 3b 0a 20 20 20 20  ", iMask));.    
5730: 20 20 20 20 20 20 20 20 61 4f 76 65 72 6c 61 70          aOverlap
5740: 5b 69 4d 61 73 6b 5d 20 3d 20 31 3b 0a 20 20 20  [iMask] = 1;.   
5750: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5760: 20 7d 0a 20 20 20 20 20 20 20 20 69 4d 61 73 6b   }.        iMask
5770: 20 5e 3d 20 70 53 65 67 2d 3e 73 69 64 65 3b 0a   ^= pSeg->side;.
5780: 20 20 20 20 20 20 20 20 70 50 72 65 76 20 3d 20          pPrev = 
5790: 70 53 65 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pSeg;.      }.  
57a0: 20 20 20 20 70 50 72 65 76 20 3d 20 30 3b 0a 20      pPrev = 0;. 
57b0: 20 20 20 20 20 66 6f 72 28 70 53 65 67 3d 70 41       for(pSeg=pA
57c0: 63 74 69 76 65 3b 20 70 53 65 67 3b 20 70 53 65  ctive; pSeg; pSe
57d0: 67 3d 70 53 65 67 2d 3e 70 4e 65 78 74 29 7b 0a  g=pSeg->pNext){.
57e0: 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 79          double y
57f0: 20 3d 20 70 53 65 67 2d 3e 43 2a 72 58 20 2b 20   = pSeg->C*rX + 
5800: 70 53 65 67 2d 3e 42 3b 0a 20 20 20 20 20 20 20  pSeg->B;.       
5810: 20 47 45 4f 44 45 42 55 47 28 28 22 53 65 67 6d   GEODEBUG(("Segm
5820: 65 6e 74 20 25 64 2e 25 64 20 25 67 2d 3e 25 67  ent %d.%d %g->%g
5830: 5c 6e 22 2c 20 70 53 65 67 2d 3e 73 69 64 65 2c  \n", pSeg->side,
5840: 20 70 53 65 67 2d 3e 69 64 78 2c 20 70 53 65 67   pSeg->idx, pSeg
5850: 2d 3e 79 2c 20 79 29 29 3b 0a 20 20 20 20 20 20  ->y, y));.      
5860: 20 20 70 53 65 67 2d 3e 79 20 3d 20 79 3b 0a 20    pSeg->y = y;. 
5870: 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76         if( pPrev
5880: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
5890: 28 20 70 50 72 65 76 2d 3e 79 3e 70 53 65 67 2d  ( pPrev->y>pSeg-
58a0: 3e 79 20 26 26 20 70 50 72 65 76 2d 3e 73 69 64  >y && pPrev->sid
58b0: 65 21 3d 70 53 65 67 2d 3e 73 69 64 65 20 29 7b  e!=pSeg->side ){
58c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
58d0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
58e0: 20 47 45 4f 44 45 42 55 47 28 28 22 43 72 6f 73   GEODEBUG(("Cros
58f0: 73 69 6e 67 3a 20 25 64 2e 25 64 20 61 6e 64 20  sing: %d.%d and 
5900: 25 64 2e 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  %d.%d\n",.      
5910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
5920: 72 65 76 2d 3e 73 69 64 65 2c 20 70 50 72 65 76  rev->side, pPrev
5930: 2d 3e 69 64 78 2c 0a 20 20 20 20 20 20 20 20 20  ->idx,.         
5940: 20 20 20 20 20 20 20 20 20 20 20 70 53 65 67 2d             pSeg-
5950: 3e 73 69 64 65 2c 20 70 53 65 67 2d 3e 69 64 78  >side, pSeg->idx
5960: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
5970: 67 6f 74 6f 20 67 65 6f 70 6f 6c 79 4f 76 65 72  goto geopolyOver
5980: 6c 61 70 44 6f 6e 65 3b 0a 20 20 20 20 20 20 20  lapDone;.       
5990: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 72     }else if( pPr
59a0: 65 76 2d 3e 79 21 3d 70 53 65 67 2d 3e 79 20 29  ev->y!=pSeg->y )
59b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 47 45  {.            GE
59c0: 4f 44 45 42 55 47 28 28 22 4d 41 53 4b 3a 20 25  ODEBUG(("MASK: %
59d0: 64 5c 6e 22 2c 20 69 4d 61 73 6b 29 29 3b 0a 20  d\n", iMask));. 
59e0: 20 20 20 20 20 20 20 20 20 20 20 61 4f 76 65 72             aOver
59f0: 6c 61 70 5b 69 4d 61 73 6b 5d 20 3d 20 31 3b 0a  lap[iMask] = 1;.
5a00: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
5a10: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 4d      }.        iM
5a20: 61 73 6b 20 5e 3d 20 70 53 65 67 2d 3e 73 69 64  ask ^= pSeg->sid
5a30: 65 3b 0a 20 20 20 20 20 20 20 20 70 50 72 65 76  e;.        pPrev
5a40: 20 3d 20 70 53 65 67 3b 0a 20 20 20 20 20 20 7d   = pSeg;.      }
5a50: 0a 20 20 20 20 7d 0a 20 20 20 20 47 45 4f 44 45  .    }.    GEODE
5a60: 42 55 47 28 28 22 25 73 20 25 64 2e 25 64 20 43  BUG(("%s %d.%d C
5a70: 3d 25 67 20 42 3d 25 67 5c 6e 22 2c 0a 20 20 20  =%g B=%g\n",.   
5a80: 20 20 20 70 54 68 69 73 45 76 65 6e 74 2d 3e 65     pThisEvent->e
5a90: 54 79 70 65 20 3f 20 22 52 4d 20 22 20 3a 20 22  Type ? "RM " : "
5aa0: 41 44 44 22 2c 0a 20 20 20 20 20 20 70 54 68 69  ADD",.      pThi
5ab0: 73 45 76 65 6e 74 2d 3e 70 53 65 67 2d 3e 73 69  sEvent->pSeg->si
5ac0: 64 65 2c 20 70 54 68 69 73 45 76 65 6e 74 2d 3e  de, pThisEvent->
5ad0: 70 53 65 67 2d 3e 69 64 78 2c 0a 20 20 20 20 20  pSeg->idx,.     
5ae0: 20 70 54 68 69 73 45 76 65 6e 74 2d 3e 70 53 65   pThisEvent->pSe
5af0: 67 2d 3e 43 2c 0a 20 20 20 20 20 20 70 54 68 69  g->C,.      pThi
5b00: 73 45 76 65 6e 74 2d 3e 70 53 65 67 2d 3e 42 29  sEvent->pSeg->B)
5b10: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 68 69 73  );.    if( pThis
5b20: 45 76 65 6e 74 2d 3e 65 54 79 70 65 3d 3d 30 20  Event->eType==0 
5b30: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 64 20  ){.      /* Add 
5b40: 61 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 20  a segment */.   
5b50: 20 20 20 70 53 65 67 20 3d 20 70 54 68 69 73 45     pSeg = pThisE
5b60: 76 65 6e 74 2d 3e 70 53 65 67 3b 0a 20 20 20 20  vent->pSeg;.    
5b70: 20 20 70 53 65 67 2d 3e 79 20 3d 20 70 53 65 67    pSeg->y = pSeg
5b80: 2d 3e 79 30 3b 0a 20 20 20 20 20 20 70 53 65 67  ->y0;.      pSeg
5b90: 2d 3e 70 4e 65 78 74 20 3d 20 70 41 63 74 69 76  ->pNext = pActiv
5ba0: 65 3b 0a 20 20 20 20 20 20 70 41 63 74 69 76 65  e;.      pActive
5bb0: 20 3d 20 70 53 65 67 3b 0a 20 20 20 20 20 20 6e   = pSeg;.      n
5bc0: 65 65 64 53 6f 72 74 20 3d 20 31 3b 0a 20 20 20  eedSort = 1;.   
5bd0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
5be0: 20 52 65 6d 6f 76 65 20 61 20 73 65 67 6d 65 6e   Remove a segmen
5bf0: 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  t */.      if( p
5c00: 41 63 74 69 76 65 3d 3d 70 54 68 69 73 45 76 65  Active==pThisEve
5c10: 6e 74 2d 3e 70 53 65 67 20 29 7b 0a 20 20 20 20  nt->pSeg ){.    
5c20: 20 20 20 20 70 41 63 74 69 76 65 20 3d 20 70 41      pActive = pA
5c30: 63 74 69 76 65 2d 3e 70 4e 65 78 74 3b 0a 20 20  ctive->pNext;.  
5c40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5c50: 20 20 20 66 6f 72 28 70 53 65 67 3d 70 41 63 74     for(pSeg=pAct
5c60: 69 76 65 3b 20 70 53 65 67 3b 20 70 53 65 67 3d  ive; pSeg; pSeg=
5c70: 70 53 65 67 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pSeg->pNext){.  
5c80: 20 20 20 20 20 20 20 20 69 66 28 20 70 53 65 67          if( pSeg
5c90: 2d 3e 70 4e 65 78 74 3d 3d 70 54 68 69 73 45 76  ->pNext==pThisEv
5ca0: 65 6e 74 2d 3e 70 53 65 67 20 29 7b 0a 20 20 20  ent->pSeg ){.   
5cb0: 20 20 20 20 20 20 20 20 20 70 53 65 67 2d 3e 70           pSeg->p
5cc0: 4e 65 78 74 20 3d 20 70 53 65 67 2d 3e 70 4e 65  Next = pSeg->pNe
5cd0: 78 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  xt->pNext;.     
5ce0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5cf0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5d00: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
5d10: 7d 0a 20 20 20 20 70 54 68 69 73 45 76 65 6e 74  }.    pThisEvent
5d20: 20 3d 20 70 54 68 69 73 45 76 65 6e 74 2d 3e 70   = pThisEvent->p
5d30: 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Next;.  }.  if( 
5d40: 61 4f 76 65 72 6c 61 70 5b 33 5d 3d 3d 30 20 29  aOverlap[3]==0 )
5d50: 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20  {.    rc = 0;.  
5d60: 7d 65 6c 73 65 20 69 66 28 20 61 4f 76 65 72 6c  }else if( aOverl
5d70: 61 70 5b 31 5d 21 3d 30 20 26 26 20 61 4f 76 65  ap[1]!=0 && aOve
5d80: 72 6c 61 70 5b 32 5d 3d 3d 30 20 29 7b 0a 20 20  rlap[2]==0 ){.  
5d90: 20 20 72 63 20 3d 20 33 3b 0a 20 20 7d 65 6c 73    rc = 3;.  }els
5da0: 65 20 69 66 28 20 61 4f 76 65 72 6c 61 70 5b 31  e if( aOverlap[1
5db0: 5d 3d 3d 30 20 26 26 20 61 4f 76 65 72 6c 61 70  ]==0 && aOverlap
5dc0: 5b 32 5d 21 3d 30 20 29 7b 0a 20 20 20 20 72 63  [2]!=0 ){.    rc
5dd0: 20 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 2;.  }else if
5de0: 28 20 61 4f 76 65 72 6c 61 70 5b 31 5d 3d 3d 30  ( aOverlap[1]==0
5df0: 20 26 26 20 61 4f 76 65 72 6c 61 70 5b 32 5d 3d   && aOverlap[2]=
5e00: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 34  =0 ){.    rc = 4
5e10: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
5e20: 63 20 3d 20 31 3b 0a 20 20 7d 0a 0a 67 65 6f 70  c = 1;.  }..geop
5e30: 6f 6c 79 4f 76 65 72 6c 61 70 44 6f 6e 65 3a 0a  olyOverlapDone:.
5e40: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
5e50: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
5e60: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 20 66 75 6e  }../*.** SQL fun
5e70: 63 74 69 6f 6e 3a 20 20 20 20 67 65 6f 70 6f 6c  ction:    geopol
5e80: 79 5f 6f 76 65 72 6c 61 70 28 50 31 2c 50 32 29  y_overlap(P1,P2)
5e90: 0a 2a 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65  .**.** Determine
5ea0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
5eb0: 50 31 20 61 6e 64 20 50 32 20 6f 76 65 72 6c 61  P1 and P2 overla
5ec0: 70 2e 20 52 65 74 75 72 6e 20 76 61 6c 75 65 3a  p. Return value:
5ed0: 0a 2a 2a 0a 2a 2a 20 20 20 30 20 20 20 20 20 54  .**.**   0     T
5ee0: 68 65 20 74 77 6f 20 70 6f 6c 79 67 6f 6e 73 20  he two polygons 
5ef0: 61 72 65 20 64 69 73 6a 6f 69 6e 74 0a 2a 2a 20  are disjoint.** 
5f00: 20 20 31 20 20 20 20 20 54 68 65 79 20 6f 76 65    1     They ove
5f10: 72 6c 61 70 0a 2a 2a 20 20 20 32 20 20 20 20 20  rlap.**   2     
5f20: 50 31 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79  P1 is completely
5f30: 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69   contained withi
5f40: 6e 20 50 32 0a 2a 2a 20 20 20 33 20 20 20 20 20  n P2.**   3     
5f50: 50 32 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79  P2 is completely
5f60: 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69   contained withi
5f70: 6e 20 50 31 0a 2a 2a 20 20 20 34 20 20 20 20 20  n P1.**   4     
5f80: 50 31 20 61 6e 64 20 50 32 20 61 72 65 20 74 68  P1 and P2 are th
5f90: 65 20 73 61 6d 65 20 70 6f 6c 79 67 6f 6e 0a 2a  e same polygon.*
5fa0: 2a 20 20 20 4e 55 4c 4c 20 20 45 69 74 68 65 72  *   NULL  Either
5fb0: 20 50 31 20 6f 72 20 50 32 20 6f 72 20 62 6f 74   P1 or P2 or bot
5fc0: 68 20 61 72 65 20 6e 6f 74 20 76 61 6c 69 64 20  h are not valid 
5fd0: 70 6f 6c 79 67 6f 6e 73 0a 2a 2f 0a 73 74 61 74  polygons.*/.stat
5fe0: 69 63 20 76 6f 69 64 20 67 65 6f 70 6f 6c 79 4f  ic void geopolyO
5ff0: 76 65 72 6c 61 70 46 75 6e 63 28 0a 20 20 73 71  verlapFunc(.  sq
6000: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
6010: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
6020: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
6030: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
6040: 47 65 6f 50 6f 6c 79 20 2a 70 31 20 3d 20 67 65  GeoPoly *p1 = ge
6050: 6f 70 6f 6c 79 46 75 6e 63 50 61 72 61 6d 28 63  opolyFuncParam(c
6060: 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 30 5d 2c  ontext, argv[0],
6070: 20 30 29 3b 0a 20 20 47 65 6f 50 6f 6c 79 20 2a   0);.  GeoPoly *
6080: 70 32 20 3d 20 67 65 6f 70 6f 6c 79 46 75 6e 63  p2 = geopolyFunc
6090: 50 61 72 61 6d 28 63 6f 6e 74 65 78 74 2c 20 61  Param(context, a
60a0: 72 67 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 69 66  rgv[1], 0);.  if
60b0: 28 20 70 31 20 26 26 20 70 32 20 29 7b 0a 20 20  ( p1 && p2 ){.  
60c0: 20 20 69 6e 74 20 78 20 3d 20 67 65 6f 70 6f 6c    int x = geopol
60d0: 79 4f 76 65 72 6c 61 70 28 70 31 2c 20 70 32 29  yOverlap(p1, p2)
60e0: 3b 0a 20 20 20 20 69 66 28 20 78 3c 30 20 29 7b  ;.    if( x<0 ){
60f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
6100: 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65  esult_error_nome
6110: 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  m(context);.    
6120: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
6130: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28  ite3_result_int(
6140: 63 6f 6e 74 65 78 74 2c 20 78 29 3b 0a 20 20 20  context, x);.   
6150: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
6160: 5f 66 72 65 65 28 70 31 29 3b 0a 20 20 73 71 6c  _free(p1);.  sql
6170: 69 74 65 33 5f 66 72 65 65 28 70 32 29 3b 0a 7d  ite3_free(p2);.}
6180: 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f  ../*.** Enable o
6190: 72 20 64 69 73 61 62 6c 65 20 64 65 62 75 67 67  r disable debugg
61a0: 69 6e 67 20 6f 75 74 70 75 74 0a 2a 2f 0a 73 74  ing output.*/.st
61b0: 61 74 69 63 20 76 6f 69 64 20 67 65 6f 70 6f 6c  atic void geopol
61c0: 79 44 65 62 75 67 46 75 6e 63 28 0a 20 20 73 71  yDebugFunc(.  sq
61d0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
61e0: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
61f0: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
6200: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 23 69  lue **argv.){.#i
6210: 66 64 65 66 20 47 45 4f 50 4f 4c 59 5f 45 4e 41  fdef GEOPOLY_ENA
6220: 42 4c 45 5f 44 45 42 55 47 0a 20 20 67 65 6f 5f  BLE_DEBUG.  geo_
6230: 64 65 62 75 67 20 3d 20 73 71 6c 69 74 65 33 5f  debug = sqlite3_
6240: 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 30  value_int(argv[0
6250: 5d 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  ]);.#endif.}../*
6260: 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69   .** This functi
6270: 6f 6e 20 69 73 20 74 68 65 20 69 6d 70 6c 65 6d  on is the implem
6280: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 62 6f 74 68  entation of both
6290: 20 74 68 65 20 78 43 6f 6e 6e 65 63 74 20 61 6e   the xConnect an
62a0: 64 20 78 43 72 65 61 74 65 0a 2a 2a 20 6d 65 74  d xCreate.** met
62b0: 68 6f 64 73 20 6f 66 20 74 68 65 20 67 65 6f 70  hods of the geop
62c0: 6f 6c 79 20 76 69 72 74 75 61 6c 20 74 61 62 6c  oly virtual tabl
62d0: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 61 72 67 76 5b  e..**.**   argv[
62e0: 30 5d 20 20 20 2d 3e 20 6d 6f 64 75 6c 65 20 6e  0]   -> module n
62f0: 61 6d 65 0a 2a 2a 20 20 20 61 72 67 76 5b 31 5d  ame.**   argv[1]
6300: 20 20 20 2d 3e 20 64 61 74 61 62 61 73 65 20 6e     -> database n
6310: 61 6d 65 0a 2a 2a 20 20 20 61 72 67 76 5b 32 5d  ame.**   argv[2]
6320: 20 20 20 2d 3e 20 74 61 62 6c 65 20 6e 61 6d 65     -> table name
6330: 0a 2a 2a 20 20 20 61 72 67 76 5b 2e 2e 2e 5d 20  .**   argv[...] 
6340: 2d 3e 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e  -> column names.
6350: 2e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ...*/.static int
6360: 20 67 65 6f 70 6f 6c 79 49 6e 69 74 28 0a 20 20   geopolyInit(.  
6370: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
6380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6390: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
63a0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
63b0: 76 6f 69 64 20 2a 70 41 75 78 2c 20 20 20 20 20  void *pAux,     
63c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63d0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
63e0: 65 20 52 54 52 45 45 5f 43 4f 4f 52 44 5f 2a 20  e RTREE_COORD_* 
63f0: 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20 20 69  constants */.  i
6400: 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63  nt argc, const c
6410: 68 61 72 20 2a 63 6f 6e 73 74 2a 61 72 67 76 2c  har *const*argv,
6420: 20 20 20 2f 2a 20 50 61 72 61 6d 65 74 65 72 73     /* Parameters
6430: 20 74 6f 20 43 52 45 41 54 45 20 54 41 42 4c 45   to CREATE TABLE
6440: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
6450: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a 70  sqlite3_vtab **p
6460: 70 56 74 61 62 2c 20 20 20 20 20 20 20 20 20 20  pVtab,          
6470: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20      /* OUT: New 
6480: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f  virtual table */
6490: 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 2c  .  char **pzErr,
64a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64b0: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45         /* OUT: E
64c0: 72 72 6f 72 20 6d 65 73 73 61 67 65 2c 20 69 66  rror message, if
64d0: 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73   any */.  int is
64e0: 43 72 65 61 74 65 20 20 20 20 20 20 20 20 20 20  Create          
64f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6500: 20 54 72 75 65 20 66 6f 72 20 78 43 72 65 61 74   True for xCreat
6510: 65 2c 20 66 61 6c 73 65 20 66 6f 72 20 78 43 6f  e, false for xCo
6520: 6e 6e 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  nnect */.){.  in
6530: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
6540: 3b 0a 20 20 52 74 72 65 65 20 2a 70 52 74 72 65  ;.  Rtree *pRtre
6550: 65 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 20 20 20  e;.  int nDb;   
6560: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
6570: 6e 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20 61  ngth of string a
6580: 72 67 76 5b 31 5d 20 2a 2f 0a 20 20 69 6e 74 20  rgv[1] */.  int 
6590: 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  nName;          
65a0: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 73    /* Length of s
65b0: 74 72 69 6e 67 20 61 72 67 76 5b 32 5d 20 2a 2f  tring argv[2] */
65c0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 72 20 2a  .  sqlite3_str *
65d0: 70 53 71 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 53  pSql;.  char *zS
65e0: 71 6c 3b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20  ql;.  int ii;.  
65f0: 63 68 61 72 20 63 53 65 70 3b 0a 0a 20 20 73 71  char cSep;..  sq
6600: 6c 69 74 65 33 5f 76 74 61 62 5f 63 6f 6e 66 69  lite3_vtab_confi
6610: 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 56 54 41  g(db, SQLITE_VTA
6620: 42 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 53 55 50  B_CONSTRAINT_SUP
6630: 50 4f 52 54 2c 20 31 29 3b 0a 0a 20 20 2f 2a 20  PORT, 1);..  /* 
6640: 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c  Allocate the sql
6650: 69 74 65 33 5f 76 74 61 62 20 73 74 72 75 63 74  ite3_vtab struct
6660: 75 72 65 20 2a 2f 0a 20 20 6e 44 62 20 3d 20 28  ure */.  nDb = (
6670: 69 6e 74 29 73 74 72 6c 65 6e 28 61 72 67 76 5b  int)strlen(argv[
6680: 31 5d 29 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20 28  1]);.  nName = (
6690: 69 6e 74 29 73 74 72 6c 65 6e 28 61 72 67 76 5b  int)strlen(argv[
66a0: 32 5d 29 3b 0a 20 20 70 52 74 72 65 65 20 3d 20  2]);.  pRtree = 
66b0: 28 52 74 72 65 65 20 2a 29 73 71 6c 69 74 65 33  (Rtree *)sqlite3
66c0: 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 52  _malloc(sizeof(R
66d0: 74 72 65 65 29 2b 6e 44 62 2b 6e 4e 61 6d 65 2b  tree)+nDb+nName+
66e0: 32 29 3b 0a 20 20 69 66 28 20 21 70 52 74 72 65  2);.  if( !pRtre
66f0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
6700: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
6710: 7d 0a 20 20 6d 65 6d 73 65 74 28 70 52 74 72 65  }.  memset(pRtre
6720: 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 52 74 72  e, 0, sizeof(Rtr
6730: 65 65 29 2b 6e 44 62 2b 6e 4e 61 6d 65 2b 32 29  ee)+nDb+nName+2)
6740: 3b 0a 20 20 70 52 74 72 65 65 2d 3e 6e 42 75 73  ;.  pRtree->nBus
6750: 79 20 3d 20 31 3b 0a 20 20 70 52 74 72 65 65 2d  y = 1;.  pRtree-
6760: 3e 62 61 73 65 2e 70 4d 6f 64 75 6c 65 20 3d 20  >base.pModule = 
6770: 26 72 74 72 65 65 4d 6f 64 75 6c 65 3b 0a 20 20  &rtreeModule;.  
6780: 70 52 74 72 65 65 2d 3e 7a 44 62 20 3d 20 28 63  pRtree->zDb = (c
6790: 68 61 72 20 2a 29 26 70 52 74 72 65 65 5b 31 5d  har *)&pRtree[1]
67a0: 3b 0a 20 20 70 52 74 72 65 65 2d 3e 7a 4e 61 6d  ;.  pRtree->zNam
67b0: 65 20 3d 20 26 70 52 74 72 65 65 2d 3e 7a 44 62  e = &pRtree->zDb
67c0: 5b 6e 44 62 2b 31 5d 3b 0a 20 20 70 52 74 72 65  [nDb+1];.  pRtre
67d0: 65 2d 3e 65 43 6f 6f 72 64 54 79 70 65 20 3d 20  e->eCoordType = 
67e0: 52 54 52 45 45 5f 43 4f 4f 52 44 5f 52 45 41 4c  RTREE_COORD_REAL
67f0: 33 32 3b 0a 20 20 70 52 74 72 65 65 2d 3e 6e 44  32;.  pRtree->nD
6800: 69 6d 20 3d 20 32 3b 0a 20 20 70 52 74 72 65 65  im = 2;.  pRtree
6810: 2d 3e 6e 44 69 6d 32 20 3d 20 34 3b 0a 20 20 6d  ->nDim2 = 4;.  m
6820: 65 6d 63 70 79 28 70 52 74 72 65 65 2d 3e 7a 44  emcpy(pRtree->zD
6830: 62 2c 20 61 72 67 76 5b 31 5d 2c 20 6e 44 62 29  b, argv[1], nDb)
6840: 3b 0a 20 20 6d 65 6d 63 70 79 28 70 52 74 72 65  ;.  memcpy(pRtre
6850: 65 2d 3e 7a 4e 61 6d 65 2c 20 61 72 67 76 5b 32  e->zName, argv[2
6860: 5d 2c 20 6e 4e 61 6d 65 29 3b 0a 0a 0a 20 20 2f  ], nName);...  /
6870: 2a 20 43 72 65 61 74 65 2f 43 6f 6e 6e 65 63 74  * Create/Connect
6880: 20 74 6f 20 74 68 65 20 75 6e 64 65 72 6c 79 69   to the underlyi
6890: 6e 67 20 72 65 6c 61 74 69 6f 6e 61 6c 20 64 61  ng relational da
68a0: 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49  tabase schema. I
68b0: 66 0a 20 20 2a 2a 20 74 68 61 74 20 69 73 20 73  f.  ** that is s
68c0: 75 63 63 65 73 73 66 75 6c 2c 20 63 61 6c 6c 20  uccessful, call 
68d0: 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f  sqlite3_declare_
68e0: 76 74 61 62 28 29 20 74 6f 20 63 6f 6e 66 69 67  vtab() to config
68f0: 75 72 65 0a 20 20 2a 2a 20 74 68 65 20 72 2d 74  ure.  ** the r-t
6900: 72 65 65 20 74 61 62 6c 65 20 73 63 68 65 6d 61  ree table schema
6910: 2e 0a 20 20 2a 2f 0a 20 20 70 53 71 6c 20 3d 20  ..  */.  pSql = 
6920: 73 71 6c 69 74 65 33 5f 73 74 72 5f 6e 65 77 28  sqlite3_str_new(
6930: 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  db);.  sqlite3_s
6940: 74 72 5f 61 70 70 65 6e 64 66 28 70 53 71 6c 2c  tr_appendf(pSql,
6950: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 78   "CREATE TABLE x
6960: 22 29 3b 0a 20 20 63 53 65 70 20 3d 20 27 28 27  ");.  cSep = '('
6970: 3b 0a 20 20 70 52 74 72 65 65 2d 3e 6e 41 75 78  ;.  pRtree->nAux
6980: 20 3d 20 31 3b 20 20 20 2f 2a 20 41 64 64 20 6f   = 1;   /* Add o
6990: 6e 65 20 66 6f 72 20 5f 73 68 61 70 65 20 2a 2f  ne for _shape */
69a0: 0a 20 20 66 6f 72 28 69 69 3d 33 3b 20 69 69 3c  .  for(ii=3; ii<
69b0: 61 72 67 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  argc; ii++){.   
69c0: 20 70 52 74 72 65 65 2d 3e 6e 41 75 78 2b 2b 3b   pRtree->nAux++;
69d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72  .    sqlite3_str
69e0: 5f 61 70 70 65 6e 64 66 28 70 53 71 6c 2c 20 22  _appendf(pSql, "
69f0: 25 63 25 73 22 2c 20 63 53 65 70 2c 20 61 72 67  %c%s", cSep, arg
6a00: 76 5b 69 69 5d 2b 31 29 3b 0a 20 20 20 20 63 53  v[ii]+1);.    cS
6a10: 65 70 20 3d 20 27 2c 27 3b 0a 20 20 7d 0a 20 20  ep = ',';.  }.  
6a20: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
6a30: 6e 64 66 28 70 53 71 6c 2c 20 22 25 63 20 5f 73  ndf(pSql, "%c _s
6a40: 68 61 70 65 2c 20 5f 62 62 6f 78 20 48 49 44 44  hape, _bbox HIDD
6a50: 45 4e 29 3b 22 2c 20 63 53 65 70 29 3b 0a 20 20  EN);", cSep);.  
6a60: 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 73  zSql = sqlite3_s
6a70: 74 72 5f 66 69 6e 69 73 68 28 70 53 71 6c 29 3b  tr_finish(pSql);
6a80: 0a 20 20 69 66 28 20 21 7a 53 71 6c 20 29 7b 0a  .  if( !zSql ){.
6a90: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
6aa0: 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 20 69  NOMEM;.  }else i
6ab0: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
6ac0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 64 65 63 6c  c = sqlite3_decl
6ad0: 61 72 65 5f 76 74 61 62 28 64 62 2c 20 7a 53 71  are_vtab(db, zSq
6ae0: 6c 29 29 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72  l)) ){.    *pzEr
6af0: 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  r = sqlite3_mpri
6b00: 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65  ntf("%s", sqlite
6b10: 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20  3_errmsg(db));. 
6b20: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
6b30: 65 28 7a 53 71 6c 29 3b 0a 20 20 69 66 28 20 72  e(zSql);.  if( r
6b40: 63 20 29 20 67 6f 74 6f 20 67 65 6f 70 6f 6c 79  c ) goto geopoly
6b50: 49 6e 69 74 5f 66 61 69 6c 3b 0a 20 20 70 52 74  Init_fail;.  pRt
6b60: 72 65 65 2d 3e 6e 42 79 74 65 73 50 65 72 43 65  ree->nBytesPerCe
6b70: 6c 6c 20 3d 20 38 20 2b 20 70 52 74 72 65 65 2d  ll = 8 + pRtree-
6b80: 3e 6e 44 69 6d 32 2a 34 3b 0a 0a 20 20 2f 2a 20  >nDim2*4;..  /* 
6b90: 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 6e  Figure out the n
6ba0: 6f 64 65 20 73 69 7a 65 20 74 6f 20 75 73 65 2e  ode size to use.
6bb0: 20 2a 2f 0a 20 20 72 63 20 3d 20 67 65 74 4e 6f   */.  rc = getNo
6bc0: 64 65 53 69 7a 65 28 64 62 2c 20 70 52 74 72 65  deSize(db, pRtre
6bd0: 65 2c 20 69 73 43 72 65 61 74 65 2c 20 70 7a 45  e, isCreate, pzE
6be0: 72 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  rr);.  if( rc ) 
6bf0: 67 6f 74 6f 20 67 65 6f 70 6f 6c 79 49 6e 69 74  goto geopolyInit
6c00: 5f 66 61 69 6c 3b 0a 20 20 72 63 20 3d 20 72 74  _fail;.  rc = rt
6c10: 72 65 65 53 71 6c 49 6e 69 74 28 70 52 74 72 65  reeSqlInit(pRtre
6c20: 65 2c 20 64 62 2c 20 61 72 67 76 5b 31 5d 2c 20  e, db, argv[1], 
6c30: 61 72 67 76 5b 32 5d 2c 20 69 73 43 72 65 61 74  argv[2], isCreat
6c40: 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  e);.  if( rc ){.
6c50: 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c      *pzErr = sql
6c60: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
6c70: 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
6c80: 67 28 64 62 29 29 3b 0a 20 20 20 20 67 6f 74 6f  g(db));.    goto
6c90: 20 67 65 6f 70 6f 6c 79 49 6e 69 74 5f 66 61 69   geopolyInit_fai
6ca0: 6c 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70 56 74 61  l;.  }..  *ppVta
6cb0: 62 20 3d 20 28 73 71 6c 69 74 65 33 5f 76 74 61  b = (sqlite3_vta
6cc0: 62 20 2a 29 70 52 74 72 65 65 3b 0a 20 20 72 65  b *)pRtree;.  re
6cd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6ce0: 0a 67 65 6f 70 6f 6c 79 49 6e 69 74 5f 66 61 69  .geopolyInit_fai
6cf0: 6c 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  l:.  if( rc==SQL
6d00: 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 53 51  ITE_OK ) rc = SQ
6d10: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 61 73  LITE_ERROR;.  as
6d20: 73 65 72 74 28 20 2a 70 70 56 74 61 62 3d 3d 30  sert( *ppVtab==0
6d30: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52   );.  assert( pR
6d40: 74 72 65 65 2d 3e 6e 42 75 73 79 3d 3d 31 20 29  tree->nBusy==1 )
6d50: 3b 0a 20 20 72 74 72 65 65 52 65 6c 65 61 73 65  ;.  rtreeRelease
6d60: 28 70 52 74 72 65 65 29 3b 0a 20 20 72 65 74 75  (pRtree);.  retu
6d70: 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 20 0a 2a  rn rc;.}.../* .*
6d80: 2a 20 47 45 4f 50 4f 4c 59 20 76 69 72 74 75 61  * GEOPOLY virtua
6d90: 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78  l table module x
6da0: 43 72 65 61 74 65 20 6d 65 74 68 6f 64 2e 0a 2a  Create method..*
6db0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 6f  /.static int geo
6dc0: 70 6f 6c 79 43 72 65 61 74 65 28 0a 20 20 73 71  polyCreate(.  sq
6dd0: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69  lite3 *db,.  voi
6de0: 64 20 2a 70 41 75 78 2c 0a 20 20 69 6e 74 20 61  d *pAux,.  int a
6df0: 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rgc, const char 
6e00: 2a 63 6f 6e 73 74 2a 61 72 67 76 2c 0a 20 20 73  *const*argv,.  s
6e10: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a 70 70  qlite3_vtab **pp
6e20: 56 74 61 62 2c 0a 20 20 63 68 61 72 20 2a 2a 70  Vtab,.  char **p
6e30: 7a 45 72 72 0a 29 7b 0a 20 20 72 65 74 75 72 6e  zErr.){.  return
6e40: 20 67 65 6f 70 6f 6c 79 49 6e 69 74 28 64 62 2c   geopolyInit(db,
6e50: 20 70 41 75 78 2c 20 61 72 67 63 2c 20 61 72 67   pAux, argc, arg
6e60: 76 2c 20 70 70 56 74 61 62 2c 20 70 7a 45 72 72  v, ppVtab, pzErr
6e70: 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  , 1);.}../* .** 
6e80: 47 45 4f 50 4f 4c 59 20 76 69 72 74 75 61 6c 20  GEOPOLY virtual 
6e90: 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78 43 6f  table module xCo
6ea0: 6e 6e 65 63 74 20 6d 65 74 68 6f 64 2e 0a 2a 2f  nnect method..*/
6eb0: 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 6f 70  .static int geop
6ec0: 6f 6c 79 43 6f 6e 6e 65 63 74 28 0a 20 20 73 71  olyConnect(.  sq
6ed0: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69  lite3 *db,.  voi
6ee0: 64 20 2a 70 41 75 78 2c 0a 20 20 69 6e 74 20 61  d *pAux,.  int a
6ef0: 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rgc, const char 
6f00: 2a 63 6f 6e 73 74 2a 61 72 67 76 2c 0a 20 20 73  *const*argv,.  s
6f10: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a 70 70  qlite3_vtab **pp
6f20: 56 74 61 62 2c 0a 20 20 63 68 61 72 20 2a 2a 70  Vtab,.  char **p
6f30: 7a 45 72 72 0a 29 7b 0a 20 20 72 65 74 75 72 6e  zErr.){.  return
6f40: 20 67 65 6f 70 6f 6c 79 49 6e 69 74 28 64 62 2c   geopolyInit(db,
6f50: 20 70 41 75 78 2c 20 61 72 67 63 2c 20 61 72 67   pAux, argc, arg
6f60: 76 2c 20 70 70 56 74 61 62 2c 20 70 7a 45 72 72  v, ppVtab, pzErr
6f70: 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  , 0);.}.../*.** 
6f80: 47 45 4f 50 4f 4c 59 20 76 69 72 74 75 61 6c 20  GEOPOLY virtual 
6f90: 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78 42 65  table module xBe
6fa0: 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 2e 20  stIndex method. 
6fb0: 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65 0a  There are three.
6fc0: 2a 2a 20 74 61 62 6c 65 20 73 63 61 6e 20 73 74  ** table scan st
6fd0: 72 61 74 65 67 69 65 73 20 74 6f 20 63 68 6f 6f  rategies to choo
6fe0: 73 65 20 66 72 6f 6d 20 28 69 6e 20 6f 72 64 65  se from (in orde
6ff0: 72 20 66 72 6f 6d 20 6d 6f 73 74 20 74 6f 20 0a  r from most to .
7000: 2a 2a 20 6c 65 61 73 74 20 64 65 73 69 72 61 62  ** least desirab
7010: 6c 65 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 64 78  le):.**.**   idx
7020: 4e 75 6d 20 20 20 20 20 69 64 78 53 74 72 20 20  Num     idxStr  
7030: 20 20 20 20 20 20 53 74 72 61 74 65 67 79 0a 2a        Strategy.*
7040: 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
7050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7070: 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 31 20 20 20  ----.**     1   
7080: 20 20 20 20 20 55 6e 75 73 65 64 20 20 20 20 20       Unused     
7090: 20 20 20 44 69 72 65 63 74 20 6c 6f 6f 6b 75 70     Direct lookup
70a0: 20 62 79 20 72 6f 77 69 64 2e 0a 2a 2a 20 20 20   by rowid..**   
70b0: 20 20 32 20 20 20 20 20 20 20 20 27 46 78 27 20    2        'Fx' 
70c0: 20 20 20 20 20 20 20 20 20 20 73 68 61 70 65 20            shape 
70d0: 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 32 20 20  query.**     2  
70e0: 20 20 20 20 20 20 27 27 20 20 20 20 20 20 20 20        ''        
70f0: 20 20 20 20 66 75 6c 6c 2d 74 61 62 6c 65 20 73      full-table s
7100: 63 61 6e 2e 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d  can..**   ------
7110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a  ----------.**.**
7140: 20 49 66 20 73 74 72 61 74 65 67 79 20 31 20 69   If strategy 1 i
7150: 73 20 75 73 65 64 2c 20 74 68 65 6e 20 69 64 78  s used, then idx
7160: 53 74 72 20 69 73 20 6e 6f 74 20 6d 65 61 6e 69  Str is not meani
7170: 6e 67 66 75 6c 2e 20 49 66 20 73 74 72 61 74 65  ngful. If strate
7180: 67 79 0a 2a 2a 20 32 20 69 73 20 75 73 65 64 2c  gy.** 2 is used,
7190: 20 69 64 78 53 74 72 20 69 73 20 65 69 74 68 65   idxStr is eithe
71a0: 72 20 74 68 65 20 74 77 6f 2d 62 79 74 65 20 73  r the two-byte s
71b0: 74 72 69 6e 67 20 27 46 78 27 20 6f 72 20 61 6e  tring 'Fx' or an
71c0: 20 65 6d 70 74 79 0a 2a 2a 20 73 74 72 69 6e 67   empty.** string
71d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
71e0: 67 65 6f 70 6f 6c 79 42 65 73 74 49 6e 64 65 78  geopolyBestIndex
71f0: 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 74  (sqlite3_vtab *t
7200: 61 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  ab, sqlite3_inde
7210: 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f  x_info *pIdxInfo
7220: 29 7b 0a 20 20 52 74 72 65 65 20 2a 70 52 74 72  ){.  Rtree *pRtr
7230: 65 65 20 3d 20 28 52 74 72 65 65 2a 29 74 61 62  ee = (Rtree*)tab
7240: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
7250: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 69  ITE_OK;.  int ii
7260: 3b 0a 20 20 69 6e 74 20 62 4d 61 74 63 68 20 3d  ;.  int bMatch =
7270: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
7280: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
7290: 68 65 72 65 20 65 78 69 73 74 73 20 61 20 4d 41  here exists a MA
72a0: 54 43 48 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  TCH constraint *
72b0: 2f 0a 20 20 69 36 34 20 6e 52 6f 77 3b 20 20 20  /.  i64 nRow;   
72c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72d0: 20 20 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 64      /* Estimated
72e0: 20 72 6f 77 73 20 72 65 74 75 72 6e 65 64 20 62   rows returned b
72f0: 79 20 74 68 69 73 20 73 63 61 6e 20 2a 2f 0a 0a  y this scan */..
7300: 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a    int iIdx = 0;.
7310: 20 20 63 68 61 72 20 7a 49 64 78 53 74 72 5b 33    char zIdxStr[3
7320: 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 7a 49 64 78  ];.  memset(zIdx
7330: 53 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 7a  Str, 0, sizeof(z
7340: 49 64 78 53 74 72 29 29 3b 0a 0a 20 20 2f 2a 20  IdxStr));..  /* 
7350: 43 68 65 63 6b 20 69 66 20 74 68 65 72 65 20 65  Check if there e
7360: 78 69 73 74 73 20 61 20 4d 41 54 43 48 20 63 6f  xists a MATCH co
7370: 6e 73 74 72 61 69 6e 74 20 2d 20 65 76 65 6e 20  nstraint - even 
7380: 61 6e 20 75 6e 75 73 61 62 6c 65 20 6f 6e 65 2e  an unusable one.
7390: 20 49 66 20 74 68 65 72 65 0a 20 20 2a 2a 20 69   If there.  ** i
73a0: 73 2c 20 64 6f 20 6e 6f 74 20 63 6f 6e 73 69 64  s, do not consid
73b0: 65 72 20 74 68 65 20 6c 6f 6f 6b 75 70 2d 62 79  er the lookup-by
73c0: 2d 72 6f 77 69 64 20 70 6c 61 6e 20 61 73 20 75  -rowid plan as u
73d0: 73 69 6e 67 20 73 75 63 68 20 61 20 70 6c 61 6e  sing such a plan
73e0: 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 72 65 71 75   would.  ** requ
73f0: 69 72 65 20 74 68 65 20 56 44 42 45 20 74 6f 20  ire the VDBE to 
7400: 65 76 61 6c 75 61 74 65 20 74 68 65 20 4d 41 54  evaluate the MAT
7410: 43 48 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 77  CH constraint, w
7420: 68 69 63 68 20 69 73 20 6e 6f 74 20 63 75 72 72  hich is not curr
7430: 65 6e 74 6c 79 0a 20 20 2a 2a 20 70 6f 73 73 69  ently.  ** possi
7440: 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 69  ble. */.  for(ii
7450: 3d 30 3b 20 69 69 3c 70 49 64 78 49 6e 66 6f 2d  =0; ii<pIdxInfo-
7460: 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 69  >nConstraint; ii
7470: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 49 64  ++){.    if( pId
7480: 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
7490: 6e 74 5b 69 69 5d 2e 6f 70 3d 3d 53 51 4c 49 54  nt[ii].op==SQLIT
74a0: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
74b0: 4e 54 5f 4d 41 54 43 48 20 29 7b 0a 20 20 20 20  NT_MATCH ){.    
74c0: 20 20 62 4d 61 74 63 68 20 3d 20 31 3b 0a 20 20    bMatch = 1;.  
74d0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
74e0: 74 28 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78  t( pIdxInfo->idx
74f0: 53 74 72 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28  Str==0 );.  for(
7500: 69 69 3d 30 3b 20 69 69 3c 70 49 64 78 49 6e 66  ii=0; ii<pIdxInf
7510: 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20 26  o->nConstraint &
7520: 26 20 69 49 64 78 3c 28 69 6e 74 29 28 73 69 7a  & iIdx<(int)(siz
7530: 65 6f 66 28 7a 49 64 78 53 74 72 29 2d 31 29 3b  eof(zIdxStr)-1);
7540: 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75   ii++){.    stru
7550: 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
7560: 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 20 3d  _constraint *p =
7570: 20 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e   &pIdxInfo->aCon
7580: 73 74 72 61 69 6e 74 5b 69 69 5d 3b 0a 0a 20 20  straint[ii];..  
7590: 20 20 69 66 28 20 62 4d 61 74 63 68 3d 3d 30 0a    if( bMatch==0.
75a0: 20 20 20 20 20 26 26 20 70 2d 3e 75 73 61 62 6c       && p->usabl
75b0: 65 20 0a 20 20 20 20 20 26 26 20 70 2d 3e 69 43  e .     && p->iC
75c0: 6f 6c 75 6d 6e 3c 30 0a 20 20 20 20 20 26 26 20  olumn<0.     && 
75d0: 70 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e  p->op==SQLITE_IN
75e0: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45  DEX_CONSTRAINT_E
75f0: 51 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  Q .    ){.      
7600: 2f 2a 20 57 65 20 68 61 76 65 20 61 6e 20 65 71  /* We have an eq
7610: 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
7620: 74 20 6f 6e 20 74 68 65 20 72 6f 77 69 64 2e 20  t on the rowid. 
7630: 55 73 65 20 73 74 72 61 74 65 67 79 20 31 2e 20  Use strategy 1. 
7640: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 6a 3b  */.      int jj;
7650: 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 3b  .      for(jj=0;
7660: 20 6a 6a 3c 69 69 3b 20 6a 6a 2b 2b 29 7b 0a 20   jj<ii; jj++){. 
7670: 20 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d         pIdxInfo-
7680: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
7690: 65 5b 6a 6a 5d 2e 61 72 67 76 49 6e 64 65 78 20  e[jj].argvIndex 
76a0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 49 64  = 0;.        pId
76b0: 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
76c0: 6e 74 55 73 61 67 65 5b 6a 6a 5d 2e 6f 6d 69 74  ntUsage[jj].omit
76d0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
76e0: 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64      pIdxInfo->id
76f0: 78 4e 75 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  xNum = 1;.      
7700: 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
7710: 72 61 69 6e 74 55 73 61 67 65 5b 69 69 5d 2e 61  raintUsage[ii].a
7720: 72 67 76 49 6e 64 65 78 20 3d 20 31 3b 0a 20 20  rgvIndex = 1;.  
7730: 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43      pIdxInfo->aC
7740: 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 6a  onstraintUsage[j
7750: 6a 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a 0a 20 20  j].omit = 1;..  
7760: 20 20 20 20 2f 2a 20 54 68 69 73 20 73 74 72 61      /* This stra
7770: 74 65 67 79 20 69 6e 76 6f 6c 76 65 73 20 61 20  tegy involves a 
7780: 74 77 6f 20 72 6f 77 69 64 20 6c 6f 6f 6b 75 70  two rowid lookup
7790: 73 20 6f 6e 20 61 6e 20 42 2d 54 72 65 65 20 73  s on an B-Tree s
77a0: 74 72 75 63 74 75 72 65 73 0a 20 20 20 20 20 20  tructures.      
77b0: 2a 2a 20 61 6e 64 20 74 68 65 6e 20 61 20 6c 69  ** and then a li
77c0: 6e 65 61 72 20 73 65 61 72 63 68 20 6f 66 20 61  near search of a
77d0: 6e 20 52 2d 54 72 65 65 20 6e 6f 64 65 2e 20 54  n R-Tree node. T
77e0: 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 0a 20  his should be . 
77f0: 20 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72       ** consider
7800: 65 64 20 61 6c 6d 6f 73 74 20 61 73 20 71 75 69  ed almost as qui
7810: 63 6b 20 61 73 20 61 20 64 69 72 65 63 74 20 72  ck as a direct r
7820: 6f 77 69 64 20 6c 6f 6f 6b 75 70 20 28 66 6f 72  owid lookup (for
7830: 20 77 68 69 63 68 20 0a 20 20 20 20 20 20 2a 2a   which .      **
7840: 20 73 71 6c 69 74 65 20 75 73 65 73 20 61 6e 20   sqlite uses an 
7850: 69 6e 74 65 72 6e 61 6c 20 63 6f 73 74 20 6f 66  internal cost of
7860: 20 30 2e 30 29 2e 20 49 74 20 69 73 20 65 78 70   0.0). It is exp
7870: 65 63 74 65 64 20 74 6f 20 72 65 74 75 72 6e 0a  ected to return.
7880: 20 20 20 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c        ** a singl
7890: 65 20 72 6f 77 2e 0a 20 20 20 20 20 20 2a 2f 20  e row..      */ 
78a0: 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  .      pIdxInfo-
78b0: 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d  >estimatedCost =
78c0: 20 33 30 2e 30 3b 0a 20 20 20 20 20 20 70 49 64   30.0;.      pId
78d0: 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64  xInfo->estimated
78e0: 52 6f 77 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  Rows = 1;.      
78f0: 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 46 6c 61  pIdxInfo->idxFla
7900: 67 73 20 3d 20 53 51 4c 49 54 45 5f 49 4e 44 45  gs = SQLITE_INDE
7910: 58 5f 53 43 41 4e 5f 55 4e 49 51 55 45 3b 0a 20  X_SCAN_UNIQUE;. 
7920: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
7930: 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20  TE_OK;.    }..  
7940: 20 20 2f 2a 20 41 20 4d 41 54 43 48 20 6f 70 65    /* A MATCH ope
7950: 72 61 74 6f 72 20 61 67 61 69 6e 73 74 20 74 68  rator against th
7960: 65 20 5f 73 68 61 70 65 20 63 6f 6c 75 6d 6e 20  e _shape column 
7970: 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 73  */.    if( p->us
7980: 61 62 6c 65 0a 20 20 20 20 20 26 26 20 70 2d 3e  able.     && p->
7990: 69 43 6f 6c 75 6d 6e 3d 3d 70 52 74 72 65 65 2d  iColumn==pRtree-
79a0: 3e 6e 41 75 78 0a 20 20 20 20 20 26 26 20 70 2d  >nAux.     && p-
79b0: 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  >op==SQLITE_INDE
79c0: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54  X_CONSTRAINT_MAT
79d0: 43 48 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  CH.    ){.      
79e0: 7a 49 64 78 53 74 72 5b 30 5d 20 3d 20 52 54 52  zIdxStr[0] = RTR
79f0: 45 45 5f 4d 41 54 43 48 3b 0a 20 20 20 20 20 20  EE_MATCH;.      
7a00: 7a 49 64 78 53 74 72 5b 31 5d 20 3d 20 27 78 27  zIdxStr[1] = 'x'
7a10: 3b 0a 20 20 20 20 20 20 7a 49 64 78 53 74 72 5b  ;.      zIdxStr[
7a20: 32 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 49  2] = 0;.      pI
7a30: 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
7a40: 69 6e 74 55 73 61 67 65 5b 69 69 5d 2e 61 72 67  intUsage[ii].arg
7a50: 76 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20  vIndex = 0;.    
7a60: 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e    pIdxInfo->aCon
7a70: 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 69 5d  straintUsage[ii]
7a80: 2e 6f 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 7d  .omit = 1;.    }
7a90: 0a 20 20 7d 0a 0a 20 20 70 49 64 78 49 6e 66 6f  .  }..  pIdxInfo
7aa0: 2d 3e 69 64 78 4e 75 6d 20 3d 20 32 3b 0a 20 20  ->idxNum = 2;.  
7ab0: 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f  pIdxInfo->needTo
7ac0: 46 72 65 65 49 64 78 53 74 72 20 3d 20 31 3b 0a  FreeIdxStr = 1;.
7ad0: 20 20 69 66 28 20 69 49 64 78 3e 30 20 26 26 20    if( iIdx>0 && 
7ae0: 30 3d 3d 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64  0==(pIdxInfo->id
7af0: 78 53 74 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d  xStr = sqlite3_m
7b00: 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 49 64  printf("%s", zId
7b10: 78 53 74 72 29 29 20 29 7b 0a 20 20 20 20 72 65  xStr)) ){.    re
7b20: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
7b30: 4d 3b 0a 20 20 7d 0a 0a 20 20 6e 52 6f 77 20 3d  M;.  }..  nRow =
7b40: 20 70 52 74 72 65 65 2d 3e 6e 52 6f 77 45 73 74   pRtree->nRowEst
7b50: 2f 31 30 30 20 2b 20 35 3b 0a 20 20 70 49 64 78  /100 + 5;.  pIdx
7b60: 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43  Info->estimatedC
7b70: 6f 73 74 20 3d 20 28 64 6f 75 62 6c 65 29 36 2e  ost = (double)6.
7b80: 30 20 2a 20 28 64 6f 75 62 6c 65 29 6e 52 6f 77  0 * (double)nRow
7b90: 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73  ;.  pIdxInfo->es
7ba0: 74 69 6d 61 74 65 64 52 6f 77 73 20 3d 20 6e 52  timatedRows = nR
7bb0: 6f 77 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  ow;..  return rc
7bc0: 3b 0a 7d 0a 0a 0a 2f 2a 20 0a 2a 2a 20 47 45 4f  ;.}.../* .** GEO
7bd0: 50 4f 4c 59 20 76 69 72 74 75 61 6c 20 74 61 62  POLY virtual tab
7be0: 6c 65 20 6d 6f 64 75 6c 65 20 78 43 6f 6c 75 6d  le module xColum
7bf0: 6e 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61  n method..*/.sta
7c00: 74 69 63 20 69 6e 74 20 67 65 6f 70 6f 6c 79 43  tic int geopolyC
7c10: 6f 6c 75 6d 6e 28 73 71 6c 69 74 65 33 5f 76 74  olumn(sqlite3_vt
7c20: 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 2c 20  ab_cursor *cur, 
7c30: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
7c40: 2a 63 74 78 2c 20 69 6e 74 20 69 29 7b 0a 20 20  *ctx, int i){.  
7c50: 52 74 72 65 65 20 2a 70 52 74 72 65 65 20 3d 20  Rtree *pRtree = 
7c60: 28 52 74 72 65 65 20 2a 29 63 75 72 2d 3e 70 56  (Rtree *)cur->pV
7c70: 74 61 62 3b 0a 20 20 52 74 72 65 65 43 75 72 73  tab;.  RtreeCurs
7c80: 6f 72 20 2a 70 43 73 72 20 3d 20 28 52 74 72 65  or *pCsr = (Rtre
7c90: 65 43 75 72 73 6f 72 20 2a 29 63 75 72 3b 0a 20  eCursor *)cur;. 
7ca0: 20 52 74 72 65 65 53 65 61 72 63 68 50 6f 69 6e   RtreeSearchPoin
7cb0: 74 20 2a 70 20 3d 20 72 74 72 65 65 53 65 61 72  t *p = rtreeSear
7cc0: 63 68 50 6f 69 6e 74 46 69 72 73 74 28 70 43 73  chPointFirst(pCs
7cd0: 72 29 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r);.  int rc = S
7ce0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 52 74 72 65  QLITE_OK;.  Rtre
7cf0: 65 4e 6f 64 65 20 2a 70 4e 6f 64 65 20 3d 20 72  eNode *pNode = r
7d00: 74 72 65 65 4e 6f 64 65 4f 66 46 69 72 73 74 53  treeNodeOfFirstS
7d10: 65 61 72 63 68 50 6f 69 6e 74 28 70 43 73 72 2c  earchPoint(pCsr,
7d20: 20 26 72 63 29 3b 0a 0a 20 20 69 66 28 20 72 63   &rc);..  if( rc
7d30: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
7d40: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
7d50: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  n SQLITE_OK;.  i
7d60: 66 28 20 69 3c 3d 70 52 74 72 65 65 2d 3e 6e 41  f( i<=pRtree->nA
7d70: 75 78 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70  ux ){.    if( !p
7d80: 43 73 72 2d 3e 62 41 75 78 56 61 6c 69 64 20 29  Csr->bAuxValid )
7d90: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 73 72  {.      if( pCsr
7da0: 2d 3e 70 52 65 61 64 41 75 78 3d 3d 30 20 29 7b  ->pReadAux==0 ){
7db0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
7dc0: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 33  lite3_prepare_v3
7dd0: 28 70 52 74 72 65 65 2d 3e 64 62 2c 20 70 52 74  (pRtree->db, pRt
7de0: 72 65 65 2d 3e 7a 52 65 61 64 41 75 78 53 71 6c  ree->zReadAuxSql
7df0: 2c 20 2d 31 2c 20 30 2c 0a 20 20 20 20 20 20 20  , -1, 0,.       
7e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e10: 20 20 20 20 20 20 20 20 20 26 70 43 73 72 2d 3e           &pCsr->
7e20: 70 52 65 61 64 41 75 78 2c 20 30 29 3b 0a 20 20  pReadAux, 0);.  
7e30: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
7e40: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
7e50: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
7e60: 62 69 6e 64 5f 69 6e 74 36 34 28 70 43 73 72 2d  bind_int64(pCsr-
7e70: 3e 70 52 65 61 64 41 75 78 2c 20 31 2c 20 0a 20  >pReadAux, 1, . 
7e80: 20 20 20 20 20 20 20 20 20 6e 6f 64 65 47 65 74           nodeGet
7e90: 52 6f 77 69 64 28 70 52 74 72 65 65 2c 20 70 4e  Rowid(pRtree, pN
7ea0: 6f 64 65 2c 20 70 2d 3e 69 43 65 6c 6c 29 29 3b  ode, p->iCell));
7eb0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
7ec0: 74 65 33 5f 73 74 65 70 28 70 43 73 72 2d 3e 70  te3_step(pCsr->p
7ed0: 52 65 61 64 41 75 78 29 3b 0a 20 20 20 20 20 20  ReadAux);.      
7ee0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52  if( rc==SQLITE_R
7ef0: 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  OW ){.        pC
7f00: 73 72 2d 3e 62 41 75 78 56 61 6c 69 64 20 3d 20  sr->bAuxValid = 
7f10: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
7f20: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
7f30: 72 65 73 65 74 28 70 43 73 72 2d 3e 70 52 65 61  reset(pCsr->pRea
7f40: 64 41 75 78 29 3b 0a 20 20 20 20 20 20 20 20 69  dAux);.        i
7f50: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
7f60: 4e 45 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  NE ) rc = SQLITE
7f70: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 72 65 74  _OK;.        ret
7f80: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
7f90: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
7fa0: 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63  3_result_value(c
7fb0: 74 78 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c  tx,.         sql
7fc0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75  ite3_column_valu
7fd0: 65 28 70 43 73 72 2d 3e 70 52 65 61 64 41 75 78  e(pCsr->pReadAux
7fe0: 2c 20 69 20 2d 20 70 52 74 72 65 65 2d 3e 6e 44  , i - pRtree->nD
7ff0: 69 6d 32 20 2b 20 31 29 29 3b 0a 20 20 7d 65 6c  im2 + 1));.  }el
8000: 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20  se{.    /* Must 
8010: 62 65 20 74 68 65 20 5f 62 62 6f 78 20 63 6f 6c  be the _bbox col
8020: 75 6d 6e 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74  umn */.  }.  ret
8030: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
8040: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 78 55 70  .../*.** The xUp
8050: 64 61 74 65 20 6d 65 74 68 6f 64 20 66 6f 72 20  date method for 
8060: 47 45 4f 50 4f 4c 59 20 6d 6f 64 75 6c 65 20 76  GEOPOLY module v
8070: 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 0a 2a  irtual tables..*
8080: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 6f  /.static int geo
8090: 70 6f 6c 79 55 70 64 61 74 65 28 0a 20 20 73 71  polyUpdate(.  sq
80a0: 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
80b0: 62 2c 20 0a 20 20 69 6e 74 20 6e 44 61 74 61 2c  b, .  int nData,
80c0: 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   .  sqlite3_valu
80d0: 65 20 2a 2a 61 44 61 74 61 2c 20 0a 20 20 73 71  e **aData, .  sq
80e0: 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70 52 6f 77  lite_int64 *pRow
80f0: 69 64 0a 29 7b 0a 20 20 52 74 72 65 65 20 2a 70  id.){.  Rtree *p
8100: 52 74 72 65 65 20 3d 20 28 52 74 72 65 65 20 2a  Rtree = (Rtree *
8110: 29 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 72 63  )pVtab;.  int rc
8120: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
8130: 52 74 72 65 65 43 65 6c 6c 20 63 65 6c 6c 3b 20  RtreeCell cell; 
8140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8150: 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 74 6f 20 69  /* New cell to i
8160: 6e 73 65 72 74 20 69 66 20 6e 44 61 74 61 3e 31  nsert if nData>1
8170: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 68 61 70 65   */.  int iShape
8180: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
8190: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
81a0: 66 20 74 68 65 20 5f 73 68 61 70 65 20 63 6f 6c  f the _shape col
81b0: 75 6d 6e 20 2a 2f 0a 20 20 69 36 34 20 6f 6c 64  umn */.  i64 old
81c0: 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20  Rowid;          
81d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
81e0: 6f 6c 64 20 72 6f 77 69 64 20 2a 2f 0a 20 20 69  old rowid */.  i
81f0: 6e 74 20 6f 6c 64 52 6f 77 69 64 56 61 6c 69 64  nt oldRowidValid
8200: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
8210: 2a 20 54 72 75 65 20 69 66 20 6f 6c 64 52 6f 77  * True if oldRow
8220: 69 64 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20  id is valid */. 
8230: 20 69 36 34 20 6e 65 77 52 6f 77 69 64 3b 20 20   i64 newRowid;  
8240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8250: 20 2f 2a 20 54 68 65 20 6e 65 77 20 72 6f 77 69   /* The new rowi
8260: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 77 52 6f  d */.  int newRo
8270: 77 69 64 56 61 6c 69 64 3b 20 20 20 20 20 20 20  widValid;       
8280: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
8290: 66 20 6e 65 77 52 6f 77 69 64 20 69 73 20 76 61  f newRowid is va
82a0: 6c 69 64 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6f  lid */.  int coo
82b0: 72 64 43 68 61 6e 67 65 20 3d 20 30 3b 20 20 20  rdChange = 0;   
82c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e           /* Chan
82d0: 67 65 20 69 6e 20 63 6f 6f 72 64 69 6e 61 74 65  ge in coordinate
82e0: 73 20 2a 2f 0a 0a 20 20 69 66 28 20 70 52 74 72  s */..  if( pRtr
82f0: 65 65 2d 3e 6e 4e 6f 64 65 52 65 66 20 29 7b 0a  ee->nNodeRef ){.
8300: 20 20 20 20 2f 2a 20 55 6e 61 62 6c 65 20 74 6f      /* Unable to
8310: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 62 74   write to the bt
8320: 72 65 65 20 77 68 69 6c 65 20 61 6e 6f 74 68 65  ree while anothe
8330: 72 20 63 75 72 73 6f 72 20 69 73 20 72 65 61 64  r cursor is read
8340: 69 6e 67 20 66 72 6f 6d 20 69 74 2c 0a 20 20 20  ing from it,.   
8350: 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 20 77 72   ** since the wr
8360: 69 74 65 20 6d 69 67 68 74 20 64 6f 20 61 20 72  ite might do a r
8370: 65 62 61 6c 61 6e 63 65 20 77 68 69 63 68 20 77  ebalance which w
8380: 6f 75 6c 64 20 64 69 73 72 75 70 74 20 74 68 65  ould disrupt the
8390: 20 72 65 61 64 0a 20 20 20 20 2a 2a 20 63 75 72   read.    ** cur
83a0: 73 6f 72 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  sor. */.    retu
83b0: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
83c0: 5f 56 54 41 42 3b 0a 20 20 7d 0a 20 20 72 74 72  _VTAB;.  }.  rtr
83d0: 65 65 52 65 66 65 72 65 6e 63 65 28 70 52 74 72  eeReference(pRtr
83e0: 65 65 29 3b 0a 20 20 61 73 73 65 72 74 28 6e 44  ee);.  assert(nD
83f0: 61 74 61 3e 3d 31 29 3b 0a 0a 20 20 69 53 68 61  ata>=1);..  iSha
8400: 70 65 43 6f 6c 20 3d 20 70 52 74 72 65 65 2d 3e  peCol = pRtree->
8410: 6e 41 75 78 3b 0a 20 20 72 63 20 3d 20 53 51 4c  nAux;.  rc = SQL
8420: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 6f 6c 64  ITE_ERROR;.  old
8430: 52 6f 77 69 64 56 61 6c 69 64 20 3d 20 73 71 6c  RowidValid = sql
8440: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
8450: 61 44 61 74 61 5b 30 5d 29 21 3d 53 51 4c 49 54  aData[0])!=SQLIT
8460: 45 5f 4e 55 4c 4c 3b 3b 0a 20 20 6f 6c 64 52 6f  E_NULL;;.  oldRo
8470: 77 69 64 20 3d 20 6f 6c 64 52 6f 77 69 64 56 61  wid = oldRowidVa
8480: 6c 69 64 20 3f 20 73 71 6c 69 74 65 33 5f 76 61  lid ? sqlite3_va
8490: 6c 75 65 5f 69 6e 74 36 34 28 61 44 61 74 61 5b  lue_int64(aData[
84a0: 30 5d 29 20 3a 20 30 3b 0a 20 20 6e 65 77 52 6f  0]) : 0;.  newRo
84b0: 77 69 64 56 61 6c 69 64 20 3d 20 6e 44 61 74 61  widValid = nData
84c0: 3e 31 20 26 26 20 73 71 6c 69 74 65 33 5f 76 61  >1 && sqlite3_va
84d0: 6c 75 65 5f 74 79 70 65 28 61 44 61 74 61 5b 31  lue_type(aData[1
84e0: 5d 29 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 3b  ])!=SQLITE_NULL;
84f0: 0a 20 20 6e 65 77 52 6f 77 69 64 20 3d 20 6e 65  .  newRowid = ne
8500: 77 52 6f 77 69 64 56 61 6c 69 64 20 3f 20 73 71  wRowidValid ? sq
8510: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36  lite3_value_int6
8520: 34 28 61 44 61 74 61 5b 31 5d 29 20 3a 20 30 3b  4(aData[1]) : 0;
8530: 0a 20 20 63 65 6c 6c 2e 69 52 6f 77 69 64 20 3d  .  cell.iRowid =
8540: 20 6e 65 77 52 6f 77 69 64 3b 0a 0a 20 20 69 66   newRowid;..  if
8550: 28 20 6e 44 61 74 61 3e 31 20 20 20 20 20 20 20  ( nData>1       
8560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8580: 20 20 20 20 2f 2a 20 6e 6f 74 20 61 20 44 45 4c      /* not a DEL
8590: 45 54 45 20 2a 2f 0a 20 20 20 26 26 20 28 21 6f  ETE */.   && (!o
85a0: 6c 64 52 6f 77 69 64 56 61 6c 69 64 20 20 20 20  ldRowidValid    
85b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
85d0: 2a 20 49 4e 53 45 52 54 20 2a 2f 0a 20 20 20 20  * INSERT */.    
85e0: 20 20 20 20 7c 7c 20 21 73 71 6c 69 74 65 33 5f      || !sqlite3_
85f0: 76 61 6c 75 65 5f 6e 6f 63 68 61 6e 67 65 28 61  value_nochange(a
8600: 44 61 74 61 5b 69 53 68 61 70 65 43 6f 6c 2b 32  Data[iShapeCol+2
8610: 5d 29 20 20 2f 2a 20 55 50 44 41 54 45 20 5f 73  ])  /* UPDATE _s
8620: 68 61 70 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  hape */.        
8630: 7c 7c 20 6f 6c 64 52 6f 77 69 64 21 3d 6e 65 77  || oldRowid!=new
8640: 52 6f 77 69 64 29 20 20 20 20 20 20 20 20 20 20  Rowid)          
8650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8660: 2f 2a 20 52 6f 77 69 64 20 63 68 61 6e 67 65 20  /* Rowid change 
8670: 2a 2f 0a 20 20 29 7b 0a 20 20 20 20 67 65 6f 70  */.  ){.    geop
8680: 6f 6c 79 42 42 6f 78 28 30 2c 20 61 44 61 74 61  olyBBox(0, aData
8690: 5b 69 53 68 61 70 65 43 6f 6c 2b 32 5d 2c 20 63  [iShapeCol+2], c
86a0: 65 6c 6c 2e 61 43 6f 6f 72 64 2c 20 26 72 63 29  ell.aCoord, &rc)
86b0: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
86c0: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
86d0: 4c 49 54 45 5f 45 52 52 4f 52 20 29 7b 0a 20 20  LITE_ERROR ){.  
86e0: 20 20 20 20 20 20 70 56 74 61 62 2d 3e 7a 45 72        pVtab->zEr
86f0: 72 4d 73 67 20 3d 0a 20 20 20 20 20 20 20 20 20  rMsg =.         
8700: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
8710: 28 22 5f 73 68 61 70 65 20 64 6f 65 73 20 6e 6f  ("_shape does no
8720: 74 20 63 6f 6e 74 61 69 6e 20 61 20 76 61 6c 69  t contain a vali
8730: 64 20 70 6f 6c 79 67 6f 6e 22 29 3b 0a 20 20 20  d polygon");.   
8740: 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
8750: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
8760: 63 6f 6f 72 64 43 68 61 6e 67 65 20 3d 20 31 3b  coordChange = 1;
8770: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 72 6f  ..    /* If a ro
8780: 77 69 64 20 76 61 6c 75 65 20 77 61 73 20 73 75  wid value was su
8790: 70 70 6c 69 65 64 2c 20 63 68 65 63 6b 20 69 66  pplied, check if
87a0: 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 70   it is already p
87b0: 72 65 73 65 6e 74 20 69 6e 20 0a 20 20 20 20 2a  resent in .    *
87c0: 2a 20 74 68 65 20 74 61 62 6c 65 2e 20 49 66 20  * the table. If 
87d0: 73 6f 2c 20 74 68 65 20 63 6f 6e 73 74 72 61 69  so, the constrai
87e0: 6e 74 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a  nt has failed. *
87f0: 2f 0a 20 20 20 20 69 66 28 20 6f 6c 64 52 6f 77  /.    if( oldRow
8800: 69 64 56 61 6c 69 64 20 26 26 20 6f 6c 64 52 6f  idValid && oldRo
8810: 77 69 64 21 3d 6e 65 77 52 6f 77 69 64 20 29 7b  wid!=newRowid ){
8820: 0a 20 20 20 20 20 20 69 6e 74 20 73 74 65 70 72  .      int stepr
8830: 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
8840: 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 52 74 72  _bind_int64(pRtr
8850: 65 65 2d 3e 70 52 65 61 64 52 6f 77 69 64 2c 20  ee->pReadRowid, 
8860: 31 2c 20 63 65 6c 6c 2e 69 52 6f 77 69 64 29 3b  1, cell.iRowid);
8870: 0a 20 20 20 20 20 20 73 74 65 70 72 63 20 3d 20  .      steprc = 
8880: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 52 74  sqlite3_step(pRt
8890: 72 65 65 2d 3e 70 52 65 61 64 52 6f 77 69 64 29  ree->pReadRowid)
88a0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
88b0: 69 74 65 33 5f 72 65 73 65 74 28 70 52 74 72 65  ite3_reset(pRtre
88c0: 65 2d 3e 70 52 65 61 64 52 6f 77 69 64 29 3b 0a  e->pReadRowid);.
88d0: 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
88e0: 5f 52 4f 57 3d 3d 73 74 65 70 72 63 20 29 7b 0a  _ROW==steprc ){.
88f0: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
8900: 74 65 33 5f 76 74 61 62 5f 6f 6e 5f 63 6f 6e 66  te3_vtab_on_conf
8910: 6c 69 63 74 28 70 52 74 72 65 65 2d 3e 64 62 29  lict(pRtree->db)
8920: 3d 3d 53 51 4c 49 54 45 5f 52 45 50 4c 41 43 45  ==SQLITE_REPLACE
8930: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
8940: 20 3d 20 72 74 72 65 65 44 65 6c 65 74 65 52 6f   = rtreeDeleteRo
8950: 77 69 64 28 70 52 74 72 65 65 2c 20 63 65 6c 6c  wid(pRtree, cell
8960: 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  .iRowid);.      
8970: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8980: 20 20 20 72 63 20 3d 20 72 74 72 65 65 43 6f 6e     rc = rtreeCon
8990: 73 74 72 61 69 6e 74 45 72 72 6f 72 28 70 52 74  straintError(pRt
89a0: 72 65 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ree, 0);.       
89b0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
89c0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 44  .  }..  /* If aD
89d0: 61 74 61 5b 30 5d 20 69 73 20 6e 6f 74 20 61 6e  ata[0] is not an
89e0: 20 53 51 4c 20 4e 55 4c 4c 20 76 61 6c 75 65 2c   SQL NULL value,
89f0: 20 69 74 20 69 73 20 74 68 65 20 72 6f 77 69 64   it is the rowid
8a00: 20 6f 66 20 61 0a 20 20 2a 2a 20 72 65 63 6f 72   of a.  ** recor
8a10: 64 20 74 6f 20 64 65 6c 65 74 65 20 66 72 6f 6d  d to delete from
8a20: 20 74 68 65 20 72 2d 74 72 65 65 20 74 61 62 6c   the r-tree tabl
8a30: 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e. The following
8a40: 20 62 6c 6f 63 6b 20 64 6f 65 73 0a 20 20 2a 2a   block does.  **
8a50: 20 6a 75 73 74 20 74 68 61 74 2e 0a 20 20 2a 2f   just that..  */
8a60: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
8a70: 45 5f 4f 4b 20 26 26 20 28 6e 44 61 74 61 3d 3d  E_OK && (nData==
8a80: 31 20 7c 7c 20 63 6f 6f 72 64 43 68 61 6e 67 65  1 || coordChange
8a90: 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 74  ) ){.    rc = rt
8aa0: 72 65 65 44 65 6c 65 74 65 52 6f 77 69 64 28 70  reeDeleteRowid(p
8ab0: 52 74 72 65 65 2c 20 6f 6c 64 52 6f 77 69 64 29  Rtree, oldRowid)
8ac0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
8ad0: 68 65 20 61 44 61 74 61 5b 5d 20 61 72 72 61 79  he aData[] array
8ae0: 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74   contains more t
8af0: 68 61 6e 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 2c  han one element,
8b00: 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 28   elements.  ** (
8b10: 61 44 61 74 61 5b 32 5d 2e 2e 61 44 61 74 61 5b  aData[2]..aData[
8b20: 61 72 67 63 2d 31 5d 29 20 63 6f 6e 74 61 69 6e  argc-1]) contain
8b30: 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20 74 6f   a new record to
8b40: 20 69 6e 73 65 72 74 20 69 6e 74 6f 0a 20 20 2a   insert into.  *
8b50: 2a 20 74 68 65 20 72 2d 74 72 65 65 20 73 74 72  * the r-tree str
8b60: 75 63 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 69  ucture..  */.  i
8b70: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
8b80: 20 26 26 20 6e 44 61 74 61 3e 31 20 26 26 20 63   && nData>1 && c
8b90: 6f 6f 72 64 43 68 61 6e 67 65 20 29 7b 0a 20 20  oordChange ){.  
8ba0: 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20    /* Insert the 
8bb0: 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20  new record into 
8bc0: 74 68 65 20 72 2d 74 72 65 65 20 2a 2f 0a 20 20  the r-tree */.  
8bd0: 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 4c 65    RtreeNode *pLe
8be0: 61 66 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 6f  af = 0;.    *pRo
8bf0: 77 69 64 20 3d 20 63 65 6c 6c 2e 69 52 6f 77 69  wid = cell.iRowi
8c00: 64 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  d;.    if( rc==S
8c10: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8c20: 20 20 72 63 20 3d 20 43 68 6f 6f 73 65 4c 65 61    rc = ChooseLea
8c30: 66 28 70 52 74 72 65 65 2c 20 26 63 65 6c 6c 2c  f(pRtree, &cell,
8c40: 20 30 2c 20 26 70 4c 65 61 66 29 3b 0a 20 20 20   0, &pLeaf);.   
8c50: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
8c60: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8c70: 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 20    int rc2;.     
8c80: 20 70 52 74 72 65 65 2d 3e 69 52 65 69 6e 73 65   pRtree->iReinse
8c90: 72 74 48 65 69 67 68 74 20 3d 20 2d 31 3b 0a 20  rtHeight = -1;. 
8ca0: 20 20 20 20 20 72 63 20 3d 20 72 74 72 65 65 49       rc = rtreeI
8cb0: 6e 73 65 72 74 43 65 6c 6c 28 70 52 74 72 65 65  nsertCell(pRtree
8cc0: 2c 20 70 4c 65 61 66 2c 20 26 63 65 6c 6c 2c 20  , pLeaf, &cell, 
8cd0: 30 29 3b 0a 20 20 20 20 20 20 72 63 32 20 3d 20  0);.      rc2 = 
8ce0: 6e 6f 64 65 52 65 6c 65 61 73 65 28 70 52 74 72  nodeRelease(pRtr
8cf0: 65 65 2c 20 70 4c 65 61 66 29 3b 0a 20 20 20 20  ee, pLeaf);.    
8d00: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
8d10: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
8d20: 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 7d  c = rc2;.      }
8d30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
8d40: 20 43 68 61 6e 67 65 20 74 68 65 20 64 61 74 61   Change the data
8d50: 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
8d60: 4c 49 54 45 5f 4f 4b 20 26 26 20 70 52 74 72 65  LITE_OK && pRtre
8d70: 65 2d 3e 6e 41 75 78 3e 30 20 29 7b 0a 20 20 20  e->nAux>0 ){.   
8d80: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
8d90: 55 70 20 3d 20 70 52 74 72 65 65 2d 3e 70 57 72  Up = pRtree->pWr
8da0: 69 74 65 41 75 78 3b 0a 20 20 20 20 69 6e 74 20  iteAux;.    int 
8db0: 6a 6a 3b 0a 20 20 20 20 69 6e 74 20 6e 43 68 61  jj;.    int nCha
8dc0: 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  nge = 0;.    sql
8dd0: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
8de0: 70 55 70 2c 20 31 2c 20 6e 65 77 52 6f 77 69 64  pUp, 1, newRowid
8df0: 29 3b 0a 20 20 20 20 66 6f 72 28 6a 6a 3d 30 3b  );.    for(jj=0;
8e00: 20 6a 6a 3c 70 52 74 72 65 65 2d 3e 6e 41 75 78   jj<pRtree->nAux
8e10: 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ; jj++){.      i
8e20: 66 28 20 21 73 71 6c 69 74 65 33 5f 76 61 6c 75  f( !sqlite3_valu
8e30: 65 5f 6e 6f 63 68 61 6e 67 65 28 61 44 61 74 61  e_nochange(aData
8e40: 5b 6a 6a 2b 32 5d 29 20 29 20 6e 43 68 61 6e 67  [jj+2]) ) nChang
8e50: 65 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e++;.      sqlit
8e60: 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28 70 55  e3_bind_value(pU
8e70: 70 2c 20 6a 6a 2b 32 2c 20 61 44 61 74 61 5b 6a  p, jj+2, aData[j
8e80: 6a 2b 32 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  j+2]);.    }.   
8e90: 20 69 66 28 20 6e 43 68 61 6e 67 65 20 29 7b 0a   if( nChange ){.
8ea0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
8eb0: 65 70 28 70 55 70 29 3b 0a 20 20 20 20 20 20 72  ep(pUp);.      r
8ec0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
8ed0: 74 28 70 55 70 29 3b 0a 20 20 20 20 7d 0a 20 20  t(pUp);.    }.  
8ee0: 7d 0a 0a 20 20 72 74 72 65 65 52 65 6c 65 61 73  }..  rtreeReleas
8ef0: 65 28 70 52 74 72 65 65 29 3b 0a 20 20 72 65 74  e(pRtree);.  ret
8f00: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69  urn rc;.}..stati
8f10: 63 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65  c sqlite3_module
8f20: 20 67 65 6f 70 6f 6c 79 4d 6f 64 75 6c 65 20 3d   geopolyModule =
8f30: 20 7b 0a 20 20 32 2c 20 20 20 20 20 20 20 20 20   {.  2,         
8f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f50: 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a   /* iVersion */.
8f60: 20 20 67 65 6f 70 6f 6c 79 43 72 65 61 74 65 2c    geopolyCreate,
8f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8f80: 20 78 43 72 65 61 74 65 20 2d 20 63 72 65 61 74   xCreate - creat
8f90: 65 20 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 67  e a table */.  g
8fa0: 65 6f 70 6f 6c 79 43 6f 6e 6e 65 63 74 2c 20 20  eopolyConnect,  
8fb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
8fc0: 6f 6e 6e 65 63 74 20 2d 20 63 6f 6e 6e 65 63 74  onnect - connect
8fd0: 20 74 6f 20 61 6e 20 65 78 69 73 74 69 6e 67 20   to an existing 
8fe0: 74 61 62 6c 65 20 2a 2f 0a 20 20 67 65 6f 70 6f  table */.  geopo
8ff0: 6c 79 42 65 73 74 49 6e 64 65 78 2c 20 20 20 20  lyBestIndex,    
9000: 20 20 20 20 20 20 20 2f 2a 20 78 42 65 73 74 49         /* xBestI
9010: 6e 64 65 78 20 2d 20 44 65 74 65 72 6d 69 6e 65  ndex - Determine
9020: 20 73 65 61 72 63 68 20 73 74 72 61 74 65 67 79   search strategy
9030: 20 2a 2f 0a 20 20 72 74 72 65 65 44 69 73 63 6f   */.  rtreeDisco
9040: 6e 6e 65 63 74 2c 20 20 20 20 20 20 20 20 20 20  nnect,          
9050: 20 20 2f 2a 20 78 44 69 73 63 6f 6e 6e 65 63 74    /* xDisconnect
9060: 20 2d 20 44 69 73 63 6f 6e 6e 65 63 74 20 66 72   - Disconnect fr
9070: 6f 6d 20 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20  om a table */.  
9080: 72 74 72 65 65 44 65 73 74 72 6f 79 2c 20 20 20  rtreeDestroy,   
9090: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
90a0: 44 65 73 74 72 6f 79 20 2d 20 44 72 6f 70 20 61  Destroy - Drop a
90b0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 72 74 72 65   table */.  rtre
90c0: 65 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20  eOpen,          
90d0: 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e          /* xOpen
90e0: 20 2d 20 6f 70 65 6e 20 61 20 63 75 72 73 6f 72   - open a cursor
90f0: 20 2a 2f 0a 20 20 72 74 72 65 65 43 6c 6f 73 65   */.  rtreeClose
9100: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9110: 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2d 20 63 6c    /* xClose - cl
9120: 6f 73 65 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a  ose a cursor */.
9130: 20 20 72 74 72 65 65 46 69 6c 74 65 72 2c 20 20    rtreeFilter,  
9140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9150: 20 78 46 69 6c 74 65 72 20 2d 20 63 6f 6e 66 69   xFilter - confi
9160: 67 75 72 65 20 73 63 61 6e 20 63 6f 6e 73 74 72  gure scan constr
9170: 61 69 6e 74 73 20 2a 2f 0a 20 20 72 74 72 65 65  aints */.  rtree
9180: 4e 65 78 74 2c 20 20 20 20 20 20 20 20 20 20 20  Next,           
9190: 20 20 20 20 20 20 20 2f 2a 20 78 4e 65 78 74 20         /* xNext 
91a0: 2d 20 61 64 76 61 6e 63 65 20 61 20 63 75 72 73  - advance a curs
91b0: 6f 72 20 2a 2f 0a 20 20 72 74 72 65 65 45 6f 66  or */.  rtreeEof
91c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
91d0: 20 20 20 20 2f 2a 20 78 45 6f 66 20 2a 2f 0a 20      /* xEof */. 
91e0: 20 67 65 6f 70 6f 6c 79 43 6f 6c 75 6d 6e 2c 20   geopolyColumn, 
91f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9200: 78 43 6f 6c 75 6d 6e 20 2d 20 72 65 61 64 20 64  xColumn - read d
9210: 61 74 61 20 2a 2f 0a 20 20 72 74 72 65 65 52 6f  ata */.  rtreeRo
9220: 77 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  wid,            
9230: 20 20 20 20 20 2f 2a 20 78 52 6f 77 69 64 20 2d       /* xRowid -
9240: 20 72 65 61 64 20 64 61 74 61 20 2a 2f 0a 20 20   read data */.  
9250: 67 65 6f 70 6f 6c 79 55 70 64 61 74 65 2c 20 20  geopolyUpdate,  
9260: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
9270: 55 70 64 61 74 65 20 2d 20 77 72 69 74 65 20 64  Update - write d
9280: 61 74 61 20 2a 2f 0a 20 20 72 74 72 65 65 42 65  ata */.  rtreeBe
9290: 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20  ginTransaction, 
92a0: 20 20 20 20 20 2f 2a 20 78 42 65 67 69 6e 20 2d       /* xBegin -
92b0: 20 62 65 67 69 6e 20 74 72 61 6e 73 61 63 74 69   begin transacti
92c0: 6f 6e 20 2a 2f 0a 20 20 72 74 72 65 65 45 6e 64  on */.  rtreeEnd
92d0: 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 20 20 20  Transaction,    
92e0: 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2d 20 73      /* xSync - s
92f0: 79 6e 63 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ync transaction 
9300: 2a 2f 0a 20 20 72 74 72 65 65 45 6e 64 54 72 61  */.  rtreeEndTra
9310: 6e 73 61 63 74 69 6f 6e 2c 20 20 20 20 20 20 20  nsaction,       
9320: 20 2f 2a 20 78 43 6f 6d 6d 69 74 20 2d 20 63 6f   /* xCommit - co
9330: 6d 6d 69 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  mmit transaction
9340: 20 2a 2f 0a 20 20 72 74 72 65 65 45 6e 64 54 72   */.  rtreeEndTr
9350: 61 6e 73 61 63 74 69 6f 6e 2c 20 20 20 20 20 20  ansaction,      
9360: 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 20 2d    /* xRollback -
9370: 20 72 6f 6c 6c 62 61 63 6b 20 74 72 61 6e 73 61   rollback transa
9380: 63 74 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20 20  ction */.  0,   
9390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93a0: 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6e 64 46         /* xFindF
93b0: 75 6e 63 74 69 6f 6e 20 2d 20 66 75 6e 63 74 69  unction - functi
93c0: 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e 67 20 2a  on overloading *
93d0: 2f 0a 20 20 72 74 72 65 65 52 65 6e 61 6d 65 2c  /.  rtreeRename,
93e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93f0: 2f 2a 20 78 52 65 6e 61 6d 65 20 2d 20 72 65 6e  /* xRename - ren
9400: 61 6d 65 20 74 68 65 20 74 61 62 6c 65 20 2a 2f  ame the table */
9410: 0a 20 20 72 74 72 65 65 53 61 76 65 70 6f 69 6e  .  rtreeSavepoin
9420: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t,             /
9430: 2a 20 78 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  * xSavepoint */.
9440: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
9450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9460: 20 78 52 65 6c 65 61 73 65 20 2a 2f 0a 20 20 30   xRelease */.  0
9470: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9480: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
9490: 6f 6c 6c 62 61 63 6b 54 6f 20 2a 2f 0a 7d 3b 0a  ollbackTo */.};.
94a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
94b0: 74 65 33 5f 67 65 6f 70 6f 6c 79 5f 69 6e 69 74  te3_geopoly_init
94c0: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
94d0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
94e0: 5f 4f 4b 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  _OK;.  static co
94f0: 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20  nst struct {.   
9500: 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73   void (*xFunc)(s
9510: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
9520: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
9530: 65 2a 2a 29 3b 0a 20 20 20 20 69 6e 74 20 6e 41  e**);.    int nA
9540: 72 67 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  rg;.    const ch
9550: 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 7d 20 61  ar *zName;.  } a
9560: 46 75 6e 63 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Func[] = {.     
9570: 7b 20 67 65 6f 70 6f 6c 79 41 72 65 61 46 75 6e  { geopolyAreaFun
9580: 63 2c 20 20 20 20 20 20 20 20 20 20 31 2c 20 20  c,          1,  
9590: 20 20 22 67 65 6f 70 6f 6c 79 5f 61 72 65 61 22    "geopoly_area"
95a0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 67       },.     { g
95b0: 65 6f 70 6f 6c 79 42 6c 6f 62 46 75 6e 63 2c 20  eopolyBlobFunc, 
95c0: 20 20 20 20 20 20 20 20 20 31 2c 20 20 20 20 22           1,    "
95d0: 67 65 6f 70 6f 6c 79 5f 62 6c 6f 62 22 20 20 20  geopoly_blob"   
95e0: 20 20 7d 2c 0a 20 20 20 20 20 7b 20 67 65 6f 70    },.     { geop
95f0: 6f 6c 79 4a 73 6f 6e 46 75 6e 63 2c 20 20 20 20  olyJsonFunc,    
9600: 20 20 20 20 20 20 31 2c 20 20 20 20 22 67 65 6f        1,    "geo
9610: 70 6f 6c 79 5f 6a 73 6f 6e 22 20 20 20 20 20 7d  poly_json"     }
9620: 2c 0a 20 20 20 20 20 7b 20 67 65 6f 70 6f 6c 79  ,.     { geopoly
9630: 53 76 67 46 75 6e 63 2c 20 20 20 20 20 20 20 20  SvgFunc,        
9640: 20 20 2d 31 2c 20 20 20 20 22 67 65 6f 70 6f 6c    -1,    "geopol
9650: 79 5f 73 76 67 22 20 20 20 20 20 20 7d 2c 0a 20  y_svg"      },. 
9660: 20 20 20 20 7b 20 67 65 6f 70 6f 6c 79 57 69 74      { geopolyWit
9670: 68 69 6e 46 75 6e 63 2c 20 20 20 20 20 20 20 20  hinFunc,        
9680: 33 2c 20 20 20 20 22 67 65 6f 70 6f 6c 79 5f 77  3,    "geopoly_w
9690: 69 74 68 69 6e 22 20 20 20 7d 2c 0a 20 20 20 20  ithin"   },.    
96a0: 20 7b 20 67 65 6f 70 6f 6c 79 4f 76 65 72 6c 61   { geopolyOverla
96b0: 70 46 75 6e 63 2c 20 20 20 20 20 20 20 32 2c 20  pFunc,       2, 
96c0: 20 20 20 22 67 65 6f 70 6f 6c 79 5f 6f 76 65 72     "geopoly_over
96d0: 6c 61 70 22 20 20 7d 2c 0a 20 20 20 20 20 7b 20  lap"  },.     { 
96e0: 67 65 6f 70 6f 6c 79 44 65 62 75 67 46 75 6e 63  geopolyDebugFunc
96f0: 2c 20 20 20 20 20 20 20 20 20 31 2c 20 20 20 20  ,         1,    
9700: 22 67 65 6f 70 6f 6c 79 5f 64 65 62 75 67 22 20  "geopoly_debug" 
9710: 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 67 65 6f     },.     { geo
9720: 70 6f 6c 79 42 42 6f 78 46 75 6e 63 2c 20 20 20  polyBBoxFunc,   
9730: 20 20 20 20 20 20 20 31 2c 20 20 20 20 22 67 65         1,    "ge
9740: 6f 70 6f 6c 79 5f 62 62 6f 78 22 20 20 20 20 20  opoly_bbox"     
9750: 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b  },.  };.  int i;
9760: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
9770: 7a 65 6f 66 28 61 46 75 6e 63 29 2f 73 69 7a 65  zeof(aFunc)/size
9780: 6f 66 28 61 46 75 6e 63 5b 30 5d 29 20 26 26 20  of(aFunc[0]) && 
9790: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
97a0: 2b 2b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ++){.    rc = sq
97b0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
97c0: 63 74 69 6f 6e 28 64 62 2c 20 61 46 75 6e 63 5b  ction(db, aFunc[
97d0: 69 5d 2e 7a 4e 61 6d 65 2c 20 61 46 75 6e 63 5b  i].zName, aFunc[
97e0: 69 5d 2e 6e 41 72 67 2c 0a 20 20 20 20 20 20 20  i].nArg,.       
97f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9800: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
9810: 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20  _UTF8, 0,.      
9820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9830: 20 20 20 20 20 20 20 20 20 20 20 61 46 75 6e 63             aFunc
9840: 5b 69 5d 2e 78 46 75 6e 63 2c 20 30 2c 20 30 29  [i].xFunc, 0, 0)
9850: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
9860: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
9870: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
9880: 65 61 74 65 5f 6d 6f 64 75 6c 65 5f 76 32 28 64  eate_module_v2(d
9890: 62 2c 20 22 67 65 6f 70 6f 6c 79 22 2c 20 26 67  b, "geopoly", &g
98a0: 65 6f 70 6f 6c 79 4d 6f 64 75 6c 65 2c 20 30 2c  eopolyModule, 0,
98b0: 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
98c0: 6e 20 72 63 3b 0a 7d 0a                          n rc;.}.