Hex Artifact Content
Not logged in

Artifact 770801a0bb984ed666e9fbffabc2757a2aea6827:


0000: 2f 2a 0a 0a 20 76 69 72 74 75 61 6c 67 65 6f 6a  /*.. virtualgeoj
0010: 73 6f 6e 2e 63 20 2d 2d 20 53 51 4c 69 74 65 33  son.c -- SQLite3
0020: 20 65 78 74 65 6e 73 69 6f 6e 20 5b 56 49 52 54   extension [VIRT
0030: 55 41 4c 20 54 41 42 4c 45 20 47 65 6f 4a 73 6f  UAL TABLE GeoJso
0040: 6e 5d 0a 0a 20 76 65 72 73 69 6f 6e 20 35 2e 31  n].. version 5.1
0050: 2e 30 2c 20 32 30 32 33 20 41 75 67 75 73 74 20  .0, 2023 August 
0060: 34 0a 0a 20 41 75 74 68 6f 72 3a 20 53 61 6e 64  4.. Author: Sand
0070: 72 6f 20 46 75 72 69 65 72 69 20 61 2e 66 75 72  ro Furieri a.fur
0080: 69 65 72 69 40 6c 71 74 2e 69 74 0a 0a 20 2d 2d  ieri@lqt.it.. --
0090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
00a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
00b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
00c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
00d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 0a 20 56  -----------. . V
00e0: 65 72 73 69 6f 6e 3a 20 4d 50 4c 20 31 2e 31 2f  ersion: MPL 1.1/
00f0: 47 50 4c 20 32 2e 30 2f 4c 47 50 4c 20 32 2e 31  GPL 2.0/LGPL 2.1
0100: 0a 20 0a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73  . . The contents
0110: 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20 61 72   of this file ar
0120: 65 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65  e subject to the
0130: 20 4d 6f 7a 69 6c 6c 61 20 50 75 62 6c 69 63 20   Mozilla Public 
0140: 4c 69 63 65 6e 73 65 20 56 65 72 73 69 6f 6e 0a  License Version.
0150: 20 31 2e 31 20 28 74 68 65 20 22 4c 69 63 65 6e   1.1 (the "Licen
0160: 73 65 22 29 3b 20 79 6f 75 20 6d 61 79 20 6e 6f  se"); you may no
0170: 74 20 75 73 65 20 74 68 69 73 20 66 69 6c 65 20  t use this file 
0180: 65 78 63 65 70 74 20 69 6e 20 63 6f 6d 70 6c 69  except in compli
0190: 61 6e 63 65 20 77 69 74 68 0a 20 74 68 65 20 4c  ance with. the L
01a0: 69 63 65 6e 73 65 2e 20 59 6f 75 20 6d 61 79 20  icense. You may 
01b0: 6f 62 74 61 69 6e 20 61 20 63 6f 70 79 20 6f 66  obtain a copy of
01c0: 20 74 68 65 20 4c 69 63 65 6e 73 65 20 61 74 0a   the License at.
01d0: 20 68 74 74 70 3a 2f 2f 77 77 77 2e 6d 6f 7a 69   http://www.mozi
01e0: 6c 6c 61 2e 6f 72 67 2f 4d 50 4c 2f 0a 20 0a 53  lla.org/MPL/. .S
01f0: 6f 66 74 77 61 72 65 20 64 69 73 74 72 69 62 75  oftware distribu
0200: 74 65 64 20 75 6e 64 65 72 20 74 68 65 20 4c 69  ted under the Li
0210: 63 65 6e 73 65 20 69 73 20 64 69 73 74 72 69 62  cense is distrib
0220: 75 74 65 64 20 6f 6e 20 61 6e 20 22 41 53 20 49  uted on an "AS I
0230: 53 22 20 62 61 73 69 73 2c 0a 57 49 54 48 4f 55  S" basis,.WITHOU
0240: 54 20 57 41 52 52 41 4e 54 59 20 4f 46 20 41 4e  T WARRANTY OF AN
0250: 59 20 4b 49 4e 44 2c 20 65 69 74 68 65 72 20 65  Y KIND, either e
0260: 78 70 72 65 73 73 20 6f 72 20 69 6d 70 6c 69 65  xpress or implie
0270: 64 2e 20 53 65 65 20 74 68 65 20 4c 69 63 65 6e  d. See the Licen
0280: 73 65 0a 66 6f 72 20 74 68 65 20 73 70 65 63 69  se.for the speci
0290: 66 69 63 20 6c 61 6e 67 75 61 67 65 20 67 6f 76  fic language gov
02a0: 65 72 6e 69 6e 67 20 72 69 67 68 74 73 20 61 6e  erning rights an
02b0: 64 20 6c 69 6d 69 74 61 74 69 6f 6e 73 20 75 6e  d limitations un
02c0: 64 65 72 20 74 68 65 0a 4c 69 63 65 6e 73 65 2e  der the.License.
02d0: 0a 0a 54 68 65 20 4f 72 69 67 69 6e 61 6c 20 43  ..The Original C
02e0: 6f 64 65 20 69 73 20 74 68 65 20 53 70 61 74 69  ode is the Spati
02f0: 61 4c 69 74 65 20 6c 69 62 72 61 72 79 0a 0a 54  aLite library..T
0300: 68 65 20 49 6e 69 74 69 61 6c 20 44 65 76 65 6c  he Initial Devel
0310: 6f 70 65 72 20 6f 66 20 74 68 65 20 4f 72 69 67  oper of the Orig
0320: 69 6e 61 6c 20 43 6f 64 65 20 69 73 20 41 6c 65  inal Code is Ale
0330: 73 73 61 6e 64 72 6f 20 46 75 72 69 65 72 69 0a  ssandro Furieri.
0340: 20 0a 50 6f 72 74 69 6f 6e 73 20 63 72 65 61 74   .Portions creat
0350: 65 64 20 62 79 20 74 68 65 20 49 6e 69 74 69 61  ed by the Initia
0360: 6c 20 44 65 76 65 6c 6f 70 65 72 20 61 72 65 20  l Developer are 
0370: 43 6f 70 79 72 69 67 68 74 20 28 43 29 20 32 30  Copyright (C) 20
0380: 31 36 2d 32 30 32 33 0a 74 68 65 20 49 6e 69 74  16-2023.the Init
0390: 69 61 6c 20 44 65 76 65 6c 6f 70 65 72 2e 20 41  ial Developer. A
03a0: 6c 6c 20 52 69 67 68 74 73 20 52 65 73 65 72 76  ll Rights Reserv
03b0: 65 64 2e 0a 0a 43 6f 6e 74 72 69 62 75 74 6f 72  ed...Contributor
03c0: 28 73 29 3a 0a 0a 41 6c 74 65 72 6e 61 74 69 76  (s):..Alternativ
03d0: 65 6c 79 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  ely, the content
03e0: 73 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20 6d  s of this file m
03f0: 61 79 20 62 65 20 75 73 65 64 20 75 6e 64 65 72  ay be used under
0400: 20 74 68 65 20 74 65 72 6d 73 20 6f 66 0a 65 69   the terms of.ei
0410: 74 68 65 72 20 74 68 65 20 47 4e 55 20 47 65 6e  ther the GNU Gen
0420: 65 72 61 6c 20 50 75 62 6c 69 63 20 4c 69 63 65  eral Public Lice
0430: 6e 73 65 20 56 65 72 73 69 6f 6e 20 32 20 6f 72  nse Version 2 or
0440: 20 6c 61 74 65 72 20 28 74 68 65 20 22 47 50 4c   later (the "GPL
0450: 22 29 2c 20 6f 72 0a 74 68 65 20 47 4e 55 20 4c  "), or.the GNU L
0460: 65 73 73 65 72 20 47 65 6e 65 72 61 6c 20 50 75  esser General Pu
0470: 62 6c 69 63 20 4c 69 63 65 6e 73 65 20 56 65 72  blic License Ver
0480: 73 69 6f 6e 20 32 2e 31 20 6f 72 20 6c 61 74 65  sion 2.1 or late
0490: 72 20 28 74 68 65 20 22 4c 47 50 4c 22 29 2c 0a  r (the "LGPL"),.
04a0: 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  in which case th
04b0: 65 20 70 72 6f 76 69 73 69 6f 6e 73 20 6f 66 20  e provisions of 
04c0: 74 68 65 20 47 50 4c 20 6f 72 20 74 68 65 20 4c  the GPL or the L
04d0: 47 50 4c 20 61 72 65 20 61 70 70 6c 69 63 61 62  GPL are applicab
04e0: 6c 65 20 69 6e 73 74 65 61 64 0a 6f 66 20 74 68  le instead.of th
04f0: 6f 73 65 20 61 62 6f 76 65 2e 20 49 66 20 79 6f  ose above. If yo
0500: 75 20 77 69 73 68 20 74 6f 20 61 6c 6c 6f 77 20  u wish to allow 
0510: 75 73 65 20 6f 66 20 79 6f 75 72 20 76 65 72 73  use of your vers
0520: 69 6f 6e 20 6f 66 20 74 68 69 73 20 66 69 6c 65  ion of this file
0530: 20 6f 6e 6c 79 0a 75 6e 64 65 72 20 74 68 65 20   only.under the 
0540: 74 65 72 6d 73 20 6f 66 20 65 69 74 68 65 72 20  terms of either 
0550: 74 68 65 20 47 50 4c 20 6f 72 20 74 68 65 20 4c  the GPL or the L
0560: 47 50 4c 2c 20 61 6e 64 20 6e 6f 74 20 74 6f 20  GPL, and not to 
0570: 61 6c 6c 6f 77 20 6f 74 68 65 72 73 20 74 6f 0a  allow others to.
0580: 75 73 65 20 79 6f 75 72 20 76 65 72 73 69 6f 6e  use your version
0590: 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20 75 6e   of this file un
05a0: 64 65 72 20 74 68 65 20 74 65 72 6d 73 20 6f 66  der the terms of
05b0: 20 74 68 65 20 4d 50 4c 2c 20 69 6e 64 69 63 61   the MPL, indica
05c0: 74 65 20 79 6f 75 72 0a 64 65 63 69 73 69 6f 6e  te your.decision
05d0: 20 62 79 20 64 65 6c 65 74 69 6e 67 20 74 68 65   by deleting the
05e0: 20 70 72 6f 76 69 73 69 6f 6e 73 20 61 62 6f 76   provisions abov
05f0: 65 20 61 6e 64 20 72 65 70 6c 61 63 65 20 74 68  e and replace th
0600: 65 6d 20 77 69 74 68 20 74 68 65 20 6e 6f 74 69  em with the noti
0610: 63 65 0a 61 6e 64 20 6f 74 68 65 72 20 70 72 6f  ce.and other pro
0620: 76 69 73 69 6f 6e 73 20 72 65 71 75 69 72 65 64  visions required
0630: 20 62 79 20 74 68 65 20 47 50 4c 20 6f 72 20 74   by the GPL or t
0640: 68 65 20 4c 47 50 4c 2e 20 49 66 20 79 6f 75 20  he LGPL. If you 
0650: 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 0a 74 68  do not delete.th
0660: 65 20 70 72 6f 76 69 73 69 6f 6e 73 20 61 62 6f  e provisions abo
0670: 76 65 2c 20 61 20 72 65 63 69 70 69 65 6e 74 20  ve, a recipient 
0680: 6d 61 79 20 75 73 65 20 79 6f 75 72 20 76 65 72  may use your ver
0690: 73 69 6f 6e 20 6f 66 20 74 68 69 73 20 66 69 6c  sion of this fil
06a0: 65 20 75 6e 64 65 72 0a 74 68 65 20 74 65 72 6d  e under.the term
06b0: 73 20 6f 66 20 61 6e 79 20 6f 6e 65 20 6f 66 20  s of any one of 
06c0: 74 68 65 20 4d 50 4c 2c 20 74 68 65 20 47 50 4c  the MPL, the GPL
06d0: 20 6f 72 20 74 68 65 20 4c 47 50 4c 2e 0a 20 0a   or the LGPL.. .
06e0: 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  */..#include <sy
06f0: 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c  s/types.h>.#incl
0700: 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23  ude <stdlib.h>.#
0710: 69 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68  include <stdio.h
0720: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69  >.#include <stri
0730: 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  ng.h>.#include <
0740: 66 6c 6f 61 74 2e 68 3e 0a 0a 23 69 66 20 64 65  float.h>..#if de
0750: 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 26 26  fined(_WIN32) &&
0760: 20 21 64 65 66 69 6e 65 64 28 5f 5f 4d 49 4e 47   !defined(__MING
0770: 57 33 32 5f 5f 29 0a 23 69 6e 63 6c 75 64 65 20  W32__).#include 
0780: 22 63 6f 6e 66 69 67 2d 6d 73 76 63 2e 68 22 0a  "config-msvc.h".
0790: 23 65 6c 73 65 0a 23 69 6e 63 6c 75 64 65 20 22  #else.#include "
07a0: 63 6f 6e 66 69 67 2e 68 22 0a 23 65 6e 64 69 66  config.h".#endif
07b0: 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 73 70 61 74  ..#include <spat
07c0: 69 61 6c 69 74 65 2f 73 71 6c 69 74 65 2e 68 3e  ialite/sqlite.h>
07d0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 70 61 74 69  .#include <spati
07e0: 61 6c 69 74 65 2f 64 65 62 75 67 2e 68 3e 0a 0a  alite/debug.h>..
07f0: 23 69 6e 63 6c 75 64 65 20 3c 73 70 61 74 69 61  #include <spatia
0800: 6c 69 74 65 2f 67 61 69 61 61 75 78 2e 68 3e 0a  lite/gaiaaux.h>.
0810: 23 69 6e 63 6c 75 64 65 20 3c 73 70 61 74 69 61  #include <spatia
0820: 6c 69 74 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  lite.h>.#include
0830: 20 3c 73 70 61 74 69 61 6c 69 74 65 2f 73 70 61   <spatialite/spa
0840: 74 69 61 6c 69 74 65 5f 65 78 74 2e 68 3e 0a 23  tialite_ext.h>.#
0850: 69 6e 63 6c 75 64 65 20 3c 73 70 61 74 69 61 6c  include <spatial
0860: 69 74 65 2f 67 65 6f 6a 73 6f 6e 2e 68 3e 0a 0a  ite/geojson.h>..
0870: 23 69 66 64 65 66 20 5f 57 49 4e 33 32 0a 23 64  #ifdef _WIN32.#d
0880: 65 66 69 6e 65 20 73 74 72 63 61 73 65 63 6d 70  efine strcasecmp
0890: 09 5f 73 74 72 69 63 6d 70 0a 23 65 6e 64 69 66  ._stricmp.#endif
08a0: 20 2f 2a 20 6e 6f 74 20 57 49 4e 33 32 20 2a 2f   /* not WIN32 */
08b0: 0a 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  ..static struct 
08c0: 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 6d  sqlite3_module m
08d0: 79 5f 67 65 6f 6a 73 6f 6e 5f 6d 6f 64 75 6c 65  y_geojson_module
08e0: 3b 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  ;..typedef struc
08f0: 74 20 56 69 72 74 75 61 6c 47 65 6f 4a 73 6f 6e  t VirtualGeoJson
0900: 53 74 72 75 63 74 0a 7b 0a 2f 2a 20 65 78 74 65  Struct.{./* exte
0910: 6e 64 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f  nds the sqlite3_
0920: 76 74 61 62 20 73 74 72 75 63 74 20 2a 2f 0a 20  vtab struct */. 
0930: 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33     const sqlite3
0940: 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65  _module *pModule
0950: 3b 09 2f 2a 20 70 74 72 20 74 6f 20 73 71 6c 69  ;./* ptr to sqli
0960: 74 65 20 6d 6f 64 75 6c 65 3a 20 55 53 45 44 20  te module: USED 
0970: 49 4e 54 45 52 4e 41 4c 4c 59 20 42 59 20 53 51  INTERNALLY BY SQ
0980: 4c 49 54 45 20 2a 2f 0a 20 20 20 20 69 6e 74 20  LITE */.    int 
0990: 6e 52 65 66 3b 09 09 09 2f 2a 20 23 20 72 65 66  nRef;.../* # ref
09a0: 65 72 65 6e 63 65 73 3a 20 55 53 45 44 20 49 4e  erences: USED IN
09b0: 54 45 52 4e 41 4c 4c 59 20 42 59 20 53 51 4c 49  TERNALLY BY SQLI
09c0: 54 45 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  TE */.    char *
09d0: 7a 45 72 72 4d 73 67 3b 09 09 2f 2a 20 65 72 72  zErrMsg;../* err
09e0: 6f 72 20 6d 65 73 73 61 67 65 3a 20 55 53 45 20  or message: USE 
09f0: 49 4e 54 45 52 4e 41 4c 4c 59 20 42 59 20 53 51  INTERNALLY BY SQ
0a00: 4c 49 54 45 20 2a 2f 0a 20 20 20 20 73 71 6c 69  LITE */.    sqli
0a10: 74 65 33 20 2a 64 62 3b 09 09 2f 2a 20 74 68 65  te3 *db;../* the
0a20: 20 73 71 6c 69 74 65 20 64 62 20 68 6f 6c 64 69   sqlite db holdi
0a30: 6e 67 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  ng the virtual t
0a40: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  able */.    int 
0a50: 53 72 69 64 3b 09 09 09 2f 2a 20 74 68 65 20 47  Srid;.../* the G
0a60: 65 6f 4a 53 4f 4e 20 53 52 49 44 20 2a 2f 0a 20  eoJSON SRID */. 
0a70: 20 20 20 63 68 61 72 20 2a 54 61 62 6c 65 4e 61     char *TableNa
0a80: 6d 65 3b 09 09 2f 2a 20 74 68 65 20 56 69 72 74  me;../* the Virt
0a90: 75 61 6c 54 61 62 6c 65 20 6e 61 6d 65 20 2a 2f  ualTable name */
0aa0: 0a 20 20 20 20 69 6e 74 20 56 61 6c 69 64 3b 09  .    int Valid;.
0ab0: 09 09 2f 2a 20 76 61 6c 69 64 69 74 79 20 66 6c  ../* validity fl
0ac0: 61 67 20 2a 2f 0a 20 20 20 20 67 65 6f 6a 73 6f  ag */.    geojso
0ad0: 6e 5f 70 61 72 73 65 72 5f 70 74 72 20 50 61 72  n_parser_ptr Par
0ae0: 73 65 72 3b 09 2f 2a 20 74 68 65 20 47 65 6f 4a  ser;./* the GeoJ
0af0: 53 4f 4e 20 50 61 72 73 65 72 20 2a 2f 0a 20 20  SON Parser */.  
0b00: 20 20 69 6e 74 20 44 65 63 6c 61 72 65 64 54 79    int DeclaredTy
0b10: 70 65 3b 09 09 2f 2a 20 47 65 6f 6d 65 74 72 79  pe;../* Geometry
0b20: 20 44 65 63 6c 61 72 65 64 54 79 70 65 20 2a 2f   DeclaredType */
0b30: 0a 20 20 20 20 69 6e 74 20 44 69 6d 65 6e 73 69  .    int Dimensi
0b40: 6f 6e 4d 6f 64 65 6c 3b 09 09 2f 2a 20 47 65 6f  onModel;../* Geo
0b50: 6d 65 74 72 79 20 44 69 6d 65 6e 73 69 6f 6e 20  metry Dimension 
0b60: 4d 6f 64 65 6c 20 2a 2f 0a 20 20 20 20 64 6f 75  Model */.    dou
0b70: 62 6c 65 20 4d 69 6e 58 3b 09 09 2f 2a 20 74 68  ble MinX;../* th
0b80: 65 20 47 65 6f 4a 53 4f 4e 20 46 75 6c 6c 20 45  e GeoJSON Full E
0b90: 78 74 65 6e 74 20 2a 2f 0a 20 20 20 20 64 6f 75  xtent */.    dou
0ba0: 62 6c 65 20 4d 69 6e 59 3b 0a 20 20 20 20 64 6f  ble MinY;.    do
0bb0: 75 62 6c 65 20 4d 61 78 58 3b 0a 20 20 20 20 64  uble MaxX;.    d
0bc0: 6f 75 62 6c 65 20 4d 61 78 59 3b 0a 7d 20 56 69  ouble MaxY;.} Vi
0bd0: 72 74 75 61 6c 47 65 6f 4a 73 6f 6e 3b 0a 74 79  rtualGeoJson;.ty
0be0: 70 65 64 65 66 20 56 69 72 74 75 61 6c 47 65 6f  pedef VirtualGeo
0bf0: 4a 73 6f 6e 20 2a 56 69 72 74 75 61 6c 47 65 6f  Json *VirtualGeo
0c00: 4a 73 6f 6e 50 74 72 3b 0a 0a 74 79 70 65 64 65  JsonPtr;..typede
0c10: 66 20 73 74 72 75 63 74 20 56 69 72 74 75 61 6c  f struct Virtual
0c20: 47 65 6f 4a 73 6f 6e 43 6f 6e 73 74 72 61 69 6e  GeoJsonConstrain
0c30: 74 53 74 72 75 63 74 0a 7b 0a 2f 2a 20 61 20 63  tStruct.{./* a c
0c40: 6f 6e 73 74 72 61 69 6e 74 20 74 6f 20 62 65 20  onstraint to be 
0c50: 76 65 72 69 66 69 65 64 20 66 6f 72 20 78 46 69  verified for xFi
0c60: 6c 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  lter */.    int 
0c70: 69 43 6f 6c 75 6d 6e 3b 09 09 2f 2a 20 43 6f 6c  iColumn;../* Col
0c80: 75 6d 6e 20 6f 6e 20 6c 65 66 74 2d 68 61 6e 64  umn on left-hand
0c90: 20 73 69 64 65 20 6f 66 20 63 6f 6e 73 74 72 61   side of constra
0ca0: 69 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f  int */.    int o
0cb0: 70 3b 09 09 09 2f 2a 20 43 6f 6e 73 74 72 61 69  p;.../* Constrai
0cc0: 6e 74 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  nt operator */. 
0cd0: 20 20 20 63 68 61 72 20 76 61 6c 75 65 54 79 70     char valueTyp
0ce0: 65 3b 09 09 2f 2a 20 76 61 6c 75 65 20 54 79 70  e;../* value Typ
0cf0: 65 20 28 47 45 4f 4a 53 4f 4e 5f 54 45 58 54 2c  e (GEOJSON_TEXT,
0d00: 20 47 45 4f 4a 53 4f 4e 5f 49 4e 54 45 47 45 52   GEOJSON_INTEGER
0d10: 2c 20 47 45 4f 4a 53 4f 4e 5f 44 4f 55 42 4c 45  , GEOJSON_DOUBLE
0d20: 20 65 74 63 29 20 2a 2f 0a 20 20 20 20 73 71 6c   etc) */.    sql
0d30: 69 74 65 33 5f 69 6e 74 36 34 20 69 6e 74 56 61  ite3_int64 intVa
0d40: 6c 75 65 3b 09 2f 2a 20 49 6e 74 36 34 20 63 6f  lue;./* Int64 co
0d50: 6d 70 61 72 69 73 6f 6e 20 76 61 6c 75 65 20 2a  mparison value *
0d60: 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20 64 62 6c  /.    double dbl
0d70: 56 61 6c 75 65 3b 09 09 2f 2a 20 44 6f 75 62 6c  Value;../* Doubl
0d80: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 76 61 6c  e comparison val
0d90: 75 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  ue */.    char *
0da0: 74 78 74 56 61 6c 75 65 3b 09 09 2f 2a 20 54 65  txtValue;../* Te
0db0: 78 74 20 63 6f 6d 70 61 72 69 73 6f 6e 20 76 61  xt comparison va
0dc0: 6c 75 65 20 2a 2f 0a 20 20 20 20 73 74 72 75 63  lue */.    struc
0dd0: 74 20 56 69 72 74 75 61 6c 47 65 6f 4a 73 6f 6e  t VirtualGeoJson
0de0: 43 6f 6e 73 74 72 61 69 6e 74 53 74 72 75 63 74  ConstraintStruct
0df0: 20 2a 6e 65 78 74 3b 0a 7d 20 56 69 72 74 75 61   *next;.} Virtua
0e00: 6c 47 65 6f 4a 73 6f 6e 43 6f 6e 73 74 72 61 69  lGeoJsonConstrai
0e10: 6e 74 3b 0a 74 79 70 65 64 65 66 20 56 69 72 74  nt;.typedef Virt
0e20: 75 61 6c 47 65 6f 4a 73 6f 6e 43 6f 6e 73 74 72  ualGeoJsonConstr
0e30: 61 69 6e 74 20 2a 56 69 72 74 75 61 6c 47 65 6f  aint *VirtualGeo
0e40: 4a 73 6f 6e 43 6f 6e 73 74 72 61 69 6e 74 50 74  JsonConstraintPt
0e50: 72 3b 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75  r;..typedef stru
0e60: 63 74 20 56 69 72 74 75 61 6c 47 65 6f 4a 73 6f  ct VirtualGeoJso
0e70: 6e 43 75 72 73 6f 72 53 74 72 75 63 74 0a 7b 0a  nCursorStruct.{.
0e80: 2f 2a 20 65 78 74 65 6e 64 73 20 74 68 65 20 73  /* extends the s
0e90: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
0ea0: 6f 72 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 20  or struct */.   
0eb0: 20 56 69 72 74 75 61 6c 47 65 6f 4a 73 6f 6e 50   VirtualGeoJsonP
0ec0: 74 72 20 70 56 74 61 62 3b 09 2f 2a 20 56 69 72  tr pVtab;./* Vir
0ed0: 74 75 61 6c 20 74 61 62 6c 65 20 6f 66 20 74 68  tual table of th
0ee0: 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 20  is cursor */.   
0ef0: 20 69 6e 74 20 63 75 72 72 65 6e 74 5f 66 69 64   int current_fid
0f00: 3b 09 09 2f 2a 20 74 68 65 20 63 75 72 72 65 6e  ;../* the curren
0f10: 74 20 72 6f 77 20 46 49 44 20 2a 2f 0a 20 20 20  t row FID */.   
0f20: 20 67 65 6f 6a 73 6f 6e 5f 66 65 61 74 75 72 65   geojson_feature
0f30: 5f 70 74 72 20 46 65 61 74 75 72 65 3b 09 2f 2a  _ptr Feature;./*
0f40: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
0f50: 63 75 72 72 65 6e 74 20 46 65 61 74 75 72 65 20  current Feature 
0f60: 2a 2f 0a 20 20 20 20 69 6e 74 20 65 6f 66 3b 09  */.    int eof;.
0f70: 09 09 2f 2a 20 74 68 65 20 45 4f 46 20 6d 61 72  ../* the EOF mar
0f80: 6b 65 72 20 2a 2f 0a 20 20 20 20 56 69 72 74 75  ker */.    Virtu
0f90: 61 6c 47 65 6f 4a 73 6f 6e 43 6f 6e 73 74 72 61  alGeoJsonConstra
0fa0: 69 6e 74 50 74 72 20 66 69 72 73 74 43 6f 6e 73  intPtr firstCons
0fb0: 74 72 61 69 6e 74 3b 0a 20 20 20 20 56 69 72 74  traint;.    Virt
0fc0: 75 61 6c 47 65 6f 4a 73 6f 6e 43 6f 6e 73 74 72  ualGeoJsonConstr
0fd0: 61 69 6e 74 50 74 72 20 6c 61 73 74 43 6f 6e 73  aintPtr lastCons
0fe0: 74 72 61 69 6e 74 3b 0a 7d 20 56 69 72 74 75 61  traint;.} Virtua
0ff0: 6c 47 65 6f 4a 73 6f 6e 43 75 72 73 6f 72 3b 0a  lGeoJsonCursor;.
1000: 74 79 70 65 64 65 66 20 56 69 72 74 75 61 6c 47  typedef VirtualG
1010: 65 6f 4a 73 6f 6e 43 75 72 73 6f 72 20 2a 56 69  eoJsonCursor *Vi
1020: 72 74 75 61 6c 47 65 6f 4a 73 6f 6e 43 75 72 73  rtualGeoJsonCurs
1030: 6f 72 50 74 72 3b 0a 0a 0a 73 74 61 74 69 63 20  orPtr;...static 
1040: 69 6e 74 0a 67 65 6f 6a 73 6f 6e 5f 69 73 5f 66  int.geojson_is_f
1050: 6c 6f 61 74 20 28 63 6f 6e 73 74 20 63 68 61 72  loat (const char
1060: 20 2a 62 75 66 29 0a 7b 0a 2f 2a 20 63 68 65 63   *buf).{./* chec
1070: 6b 69 6e 67 20 66 6f 72 20 61 20 70 6f 73 73 69  king for a possi
1080: 62 6c 65 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  ble floating poi
1090: 6e 74 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20  nt number */.   
10a0: 20 69 6e 74 20 6f 6b 20 3d 20 30 3b 0a 20 20 20   int ok = 0;.   
10b0: 20 69 6e 74 20 65 72 72 20 3d 20 30 3b 0a 20 20   int err = 0;.  
10c0: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
10d0: 3b 0a 20 20 20 20 66 6f 72 20 28 69 20 3d 20 30  ;.    for (i = 0
10e0: 3b 20 69 20 3c 20 73 74 72 6c 65 6e 20 28 62 75  ; i < strlen (bu
10f0: 66 29 3b 20 69 2b 2b 29 0a 20 20 20 20 20 20 7b  f); i++).      {
1100: 0a 09 20 20 69 66 20 28 69 20 3d 3d 20 30 20 26  ..  if (i == 0 &
1110: 26 20 28 2a 28 62 75 66 20 2b 20 69 29 20 3d 3d  & (*(buf + i) ==
1120: 20 27 2d 27 20 7c 7c 20 2a 28 62 75 66 20 2b 20   '-' || *(buf + 
1130: 69 29 20 3d 3d 20 27 2b 27 29 29 0a 09 20 20 20  i) == '+'))..   
1140: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 09 20 20     continue;..  
1150: 69 66 20 28 2a 28 62 75 66 20 2b 20 69 29 20 3d  if (*(buf + i) =
1160: 3d 20 27 2e 27 29 0a 09 20 20 20 20 7b 0a 09 09  = '.')..    {...
1170: 6f 6b 2b 2b 3b 0a 09 09 63 6f 6e 74 69 6e 75 65  ok++;...continue
1180: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 69 66 20 28  ;..    }..  if (
1190: 2a 28 62 75 66 20 2b 20 69 29 20 3d 3d 20 27 65  *(buf + i) == 'e
11a0: 27 20 7c 7c 20 2a 28 62 75 66 20 2b 20 69 29 20  ' || *(buf + i) 
11b0: 3d 3d 20 27 45 27 29 0a 09 20 20 20 20 7b 0a 09  == 'E')..    {..
11c0: 09 6f 6b 2b 2b 3b 0a 09 09 63 6f 6e 74 69 6e 75  .ok++;...continu
11d0: 65 3b 0a 09 20 20 20 20 7d 0a 09 20 20 69 66 20  e;..    }..  if 
11e0: 28 2a 28 62 75 66 20 2b 20 69 29 20 3e 3d 20 27  (*(buf + i) >= '
11f0: 30 27 20 26 26 20 2a 28 62 75 66 20 2b 20 69 29  0' && *(buf + i)
1200: 20 3c 3d 20 27 39 27 29 0a 09 20 20 20 20 20 20   <= '9')..      
1210: 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20  ;..  else..     
1220: 20 65 72 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a   err++;.      }.
1230: 20 20 20 20 69 66 20 28 21 65 72 72 20 26 26 20      if (!err && 
1240: 6f 6b 20 3d 3d 20 31 29 0a 09 72 65 74 75 72 6e  ok == 1)..return
1250: 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   1;.    return 0
1260: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 67 65 6f 6a  ;.}..static geoj
1270: 73 6f 6e 5f 70 72 6f 70 65 72 74 79 5f 70 74 72  son_property_ptr
1280: 0a 67 65 6f 6a 73 6f 6e 5f 63 72 65 61 74 65 5f  .geojson_create_
1290: 70 72 6f 70 65 72 74 79 20 28 29 0a 7b 0a 2f 2a  property ().{./*
12a0: 20 63 72 65 61 74 69 6e 67 20 61 6e 20 65 6d 70   creating an emp
12b0: 74 79 20 47 65 6f 4a 53 4f 4e 20 70 72 6f 70 65  ty GeoJSON prope
12c0: 72 74 79 20 2a 2f 0a 20 20 20 20 67 65 6f 6a 73  rty */.    geojs
12d0: 6f 6e 5f 70 72 6f 70 65 72 74 79 5f 70 74 72 20  on_property_ptr 
12e0: 70 72 6f 70 20 3d 20 6d 61 6c 6c 6f 63 20 28 73  prop = malloc (s
12f0: 69 7a 65 6f 66 20 28 67 65 6f 6a 73 6f 6e 5f 70  izeof (geojson_p
1300: 72 6f 70 65 72 74 79 29 29 3b 0a 20 20 20 20 70  roperty));.    p
1310: 72 6f 70 2d 3e 6e 61 6d 65 20 3d 20 4e 55 4c 4c  rop->name = NULL
1320: 3b 0a 20 20 20 20 70 72 6f 70 2d 3e 74 79 70 65  ;.    prop->type
1330: 20 3d 20 47 45 4f 4a 53 4f 4e 5f 55 4e 4b 4e 4f   = GEOJSON_UNKNO
1340: 57 4e 3b 0a 20 20 20 20 70 72 6f 70 2d 3e 74 78  WN;.    prop->tx
1350: 74 5f 76 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a  t_value = NULL;.
1360: 20 20 20 20 70 72 6f 70 2d 3e 6e 65 78 74 20 3d      prop->next =
1370: 20 4e 55 4c 4c 3b 0a 20 20 20 20 72 65 74 75 72   NULL;.    retur
1380: 6e 20 70 72 6f 70 3b 0a 7d 0a 0a 73 74 61 74 69  n prop;.}..stati
1390: 63 20 76 6f 69 64 0a 67 65 6f 6a 73 6f 6e 5f 64  c void.geojson_d
13a0: 65 73 74 72 6f 79 5f 70 72 6f 70 65 72 74 79 20  estroy_property 
13b0: 28 67 65 6f 6a 73 6f 6e 5f 70 72 6f 70 65 72 74  (geojson_propert
13c0: 79 5f 70 74 72 20 70 72 6f 70 29 0a 7b 0a 2f 2a  y_ptr prop).{./*
13d0: 20 64 65 73 74 72 6f 79 69 6e 67 20 61 20 47 65   destroying a Ge
13e0: 6f 4a 53 4f 4e 20 70 72 6f 70 65 72 74 79 20 2a  oJSON property *
13f0: 2f 0a 20 20 20 20 69 66 20 28 70 72 6f 70 2d 3e  /.    if (prop->
1400: 6e 61 6d 65 20 21 3d 20 4e 55 4c 4c 29 0a 09 66  name != NULL)..f
1410: 72 65 65 20 28 70 72 6f 70 2d 3e 6e 61 6d 65 29  ree (prop->name)
1420: 3b 0a 20 20 20 20 69 66 20 28 70 72 6f 70 2d 3e  ;.    if (prop->
1430: 74 78 74 5f 76 61 6c 75 65 20 21 3d 20 4e 55 4c  txt_value != NUL
1440: 4c 29 0a 09 66 72 65 65 20 28 70 72 6f 70 2d 3e  L)..free (prop->
1450: 74 78 74 5f 76 61 6c 75 65 29 3b 0a 20 20 20 20  txt_value);.    
1460: 66 72 65 65 20 28 70 72 6f 70 29 3b 0a 7d 0a 0a  free (prop);.}..
1470: 73 74 61 74 69 63 20 76 6f 69 64 0a 67 65 6f 6a  static void.geoj
1480: 73 6f 6e 5f 69 6e 69 74 5f 70 72 6f 70 65 72 74  son_init_propert
1490: 79 20 28 67 65 6f 6a 73 6f 6e 5f 70 72 6f 70 65  y (geojson_prope
14a0: 72 74 79 5f 70 74 72 20 70 72 6f 70 29 0a 7b 0a  rty_ptr prop).{.
14b0: 2f 2a 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  /* initializing 
14c0: 61 6e 20 65 6d 70 74 79 20 47 65 6f 4a 53 4f 4e  an empty GeoJSON
14d0: 20 70 72 6f 70 65 72 74 79 20 2a 2f 0a 20 20 20   property */.   
14e0: 20 70 72 6f 70 2d 3e 6e 61 6d 65 20 3d 20 4e 55   prop->name = NU
14f0: 4c 4c 3b 0a 20 20 20 20 70 72 6f 70 2d 3e 74 79  LL;.    prop->ty
1500: 70 65 20 3d 20 47 45 4f 4a 53 4f 4e 5f 55 4e 4b  pe = GEOJSON_UNK
1510: 4e 4f 57 4e 3b 0a 20 20 20 20 70 72 6f 70 2d 3e  NOWN;.    prop->
1520: 74 78 74 5f 76 61 6c 75 65 20 3d 20 4e 55 4c 4c  txt_value = NULL
1530: 3b 0a 20 20 20 20 70 72 6f 70 2d 3e 6e 65 78 74  ;.    prop->next
1540: 20 3d 20 4e 55 4c 4c 3b 0a 7d 0a 0a 73 74 61 74   = NULL;.}..stat
1550: 69 63 20 76 6f 69 64 0a 67 65 6f 6a 73 6f 6e 5f  ic void.geojson_
1560: 72 65 73 65 74 5f 70 72 6f 70 65 72 74 79 20 28  reset_property (
1570: 67 65 6f 6a 73 6f 6e 5f 70 72 6f 70 65 72 74 79  geojson_property
1580: 5f 70 74 72 20 70 72 6f 70 29 0a 7b 0a 2f 2a 20  _ptr prop).{./* 
1590: 72 65 73 65 74 74 69 6e 67 20 61 20 47 65 6f 4a  resetting a GeoJ
15a0: 53 4f 4e 20 70 72 6f 70 65 72 74 79 20 2a 2f 0a  SON property */.
15b0: 20 20 20 20 69 66 20 28 70 72 6f 70 2d 3e 6e 61      if (prop->na
15c0: 6d 65 20 21 3d 20 4e 55 4c 4c 29 0a 09 66 72 65  me != NULL)..fre
15d0: 65 20 28 70 72 6f 70 2d 3e 6e 61 6d 65 29 3b 0a  e (prop->name);.
15e0: 20 20 20 20 69 66 20 28 70 72 6f 70 2d 3e 74 78      if (prop->tx
15f0: 74 5f 76 61 6c 75 65 20 21 3d 20 4e 55 4c 4c 29  t_value != NULL)
1600: 0a 09 66 72 65 65 20 28 70 72 6f 70 2d 3e 74 78  ..free (prop->tx
1610: 74 5f 76 61 6c 75 65 29 3b 0a 20 20 20 20 67 65  t_value);.    ge
1620: 6f 6a 73 6f 6e 5f 69 6e 69 74 5f 70 72 6f 70 65  ojson_init_prope
1630: 72 74 79 20 28 70 72 6f 70 29 3b 0a 7d 0a 0a 73  rty (prop);.}..s
1640: 74 61 74 69 63 20 67 65 6f 6a 73 6f 6e 5f 63 6f  tatic geojson_co
1650: 6c 75 6d 6e 5f 70 74 72 0a 67 65 6f 6a 73 6f 6e  lumn_ptr.geojson
1660: 5f 63 72 65 61 74 65 5f 63 6f 6c 75 6d 6e 20 28  _create_column (
1670: 63 6f 6e 73 74 20 63 68 61 72 20 2a 6e 61 6d 65  const char *name
1680: 2c 20 69 6e 74 20 74 79 70 65 29 0a 7b 0a 2f 2a  , int type).{./*
1690: 20 63 72 65 61 74 69 6e 67 20 61 20 47 65 6f 4a   creating a GeoJ
16a0: 53 4f 4e 20 63 6f 6c 75 6d 6e 20 6f 62 6a 65 63  SON column objec
16b0: 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 65 6e  t */.    int len
16c0: 3b 0a 20 20 20 20 67 65 6f 6a 73 6f 6e 5f 63 6f  ;.    geojson_co
16d0: 6c 75 6d 6e 5f 70 74 72 20 63 6f 6c 20 3d 20 6d  lumn_ptr col = m
16e0: 61 6c 6c 6f 63 20 28 73 69 7a 65 6f 66 20 28 67  alloc (sizeof (g
16f0: 65 6f 6a 73 6f 6e 5f 63 6f 6c 75 6d 6e 29 29 3b  eojson_column));
1700: 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65  .    len = strle
1710: 6e 20 28 6e 61 6d 65 29 3b 0a 20 20 20 20 63 6f  n (name);.    co
1720: 6c 2d 3e 6e 61 6d 65 20 3d 20 6d 61 6c 6c 6f 63  l->name = malloc
1730: 20 28 6c 65 6e 20 2b 20 31 29 3b 0a 20 20 20 20   (len + 1);.    
1740: 73 74 72 63 70 79 20 28 63 6f 6c 2d 3e 6e 61 6d  strcpy (col->nam
1750: 65 2c 20 6e 61 6d 65 29 3b 0a 20 20 20 20 63 6f  e, name);.    co
1760: 6c 2d 3e 6e 5f 74 65 78 74 20 3d 20 30 3b 0a 20  l->n_text = 0;. 
1770: 20 20 20 63 6f 6c 2d 3e 6e 5f 69 6e 74 20 3d 20     col->n_int = 
1780: 30 3b 0a 20 20 20 20 63 6f 6c 2d 3e 6e 5f 64 6f  0;.    col->n_do
1790: 75 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 63 6f  uble = 0;.    co
17a0: 6c 2d 3e 6e 5f 62 6f 6f 6c 20 3d 20 30 3b 0a 20  l->n_bool = 0;. 
17b0: 20 20 20 63 6f 6c 2d 3e 6e 5f 6e 75 6c 6c 20 3d     col->n_null =
17c0: 20 30 3b 0a 20 20 20 20 63 6f 6c 2d 3e 6e 65 78   0;.    col->nex
17d0: 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 73 77  t = NULL;.    sw
17e0: 69 74 63 68 20 28 74 79 70 65 29 0a 20 20 20 20  itch (type).    
17f0: 20 20 7b 0a 20 20 20 20 20 20 63 61 73 65 20 47    {.      case G
1800: 45 4f 4a 53 4f 4e 5f 54 45 58 54 3a 0a 09 20 20  EOJSON_TEXT:..  
1810: 63 6f 6c 2d 3e 6e 5f 74 65 78 74 20 3d 20 31 3b  col->n_text = 1;
1820: 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ..  break;.     
1830: 20 63 61 73 65 20 47 45 4f 4a 53 4f 4e 5f 49 4e   case GEOJSON_IN
1840: 54 45 47 45 52 3a 0a 09 20 20 63 6f 6c 2d 3e 6e  TEGER:..  col->n
1850: 5f 69 6e 74 20 3d 20 31 3b 0a 09 20 20 62 72 65  _int = 1;..  bre
1860: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 47  ak;.      case G
1870: 45 4f 4a 53 4f 4e 5f 44 4f 55 42 4c 45 3a 0a 09  EOJSON_DOUBLE:..
1880: 20 20 63 6f 6c 2d 3e 6e 5f 64 6f 75 62 6c 65 20    col->n_double 
1890: 3d 20 31 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20  = 1;..  break;. 
18a0: 20 20 20 20 20 63 61 73 65 20 47 45 4f 4a 53 4f       case GEOJSO
18b0: 4e 5f 54 52 55 45 3a 0a 20 20 20 20 20 20 63 61  N_TRUE:.      ca
18c0: 73 65 20 47 45 4f 4a 53 4f 4e 5f 46 41 4c 53 45  se GEOJSON_FALSE
18d0: 3a 0a 09 20 20 63 6f 6c 2d 3e 6e 5f 62 6f 6f 6c  :..  col->n_bool
18e0: 20 3d 20 31 3b 0a 09 20 20 62 72 65 61 6b 3b 0a   = 1;..  break;.
18f0: 20 20 20 20 20 20 63 61 73 65 20 47 45 4f 4a 53        case GEOJS
1900: 4f 4e 5f 4e 55 4c 4c 3a 0a 09 20 20 63 6f 6c 2d  ON_NULL:..  col-
1910: 3e 6e 5f 6e 75 6c 6c 20 3d 20 31 3b 0a 09 20 20  >n_null = 1;..  
1920: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 3b 0a  break;.      };.
1930: 20 20 20 20 72 65 74 75 72 6e 20 63 6f 6c 3b 0a      return col;.
1940: 7d 0a 0a 73 74 61 74 69 63 20 67 65 6f 6a 73 6f  }..static geojso
1950: 6e 5f 73 74 61 63 6b 5f 70 74 72 0a 67 65 6f 6a  n_stack_ptr.geoj
1960: 73 6f 6e 5f 63 72 65 61 74 65 5f 73 74 61 63 6b  son_create_stack
1970: 20 28 29 0a 7b 0a 2f 2a 20 63 72 65 61 74 69 6e   ().{./* creatin
1980: 67 20 61 6e 20 65 6d 70 74 79 20 47 65 6f 4a 53  g an empty GeoJS
1990: 4f 4e 20 73 74 61 63 6b 20 6f 62 6a 65 63 74 20  ON stack object 
19a0: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  */.    int i;.  
19b0: 20 20 67 65 6f 6a 73 6f 6e 5f 73 74 61 63 6b 5f    geojson_stack_
19c0: 70 74 72 20 70 74 72 20 3d 20 6d 61 6c 6c 6f 63  ptr ptr = malloc
19d0: 20 28 73 69 7a 65 6f 66 20 28 67 65 6f 6a 73 6f   (sizeof (geojso
19e0: 6e 5f 73 74 61 63 6b 29 29 3b 0a 20 20 20 20 70  n_stack));.    p
19f0: 74 72 2d 3e 6c 65 76 65 6c 20 3d 20 2d 31 3b 0a  tr->level = -1;.
1a00: 20 20 20 20 6d 65 6d 73 65 74 20 28 70 74 72 2d      memset (ptr-
1a10: 3e 6b 65 79 2c 20 27 5c 30 27 2c 20 47 45 4f 4a  >key, '\0', GEOJ
1a20: 53 4f 4e 5f 4d 41 58 29 3b 0a 20 20 20 20 70 74  SON_MAX);.    pt
1a30: 72 2d 3e 6b 65 79 5f 69 64 78 20 3d 20 30 3b 0a  r->key_idx = 0;.
1a40: 20 20 20 20 6d 65 6d 73 65 74 20 28 70 74 72 2d      memset (ptr-
1a50: 3e 76 61 6c 75 65 2c 20 27 5c 30 27 2c 20 47 45  >value, '\0', GE
1a60: 4f 4a 53 4f 4e 5f 4d 41 58 29 3b 0a 20 20 20 20  OJSON_MAX);.    
1a70: 70 74 72 2d 3e 76 61 6c 75 65 5f 69 64 78 20 3d  ptr->value_idx =
1a80: 20 30 3b 0a 20 20 20 20 6d 65 6d 73 65 74 20 28   0;.    memset (
1a90: 70 74 72 2d 3e 6e 75 6d 76 61 6c 75 65 2c 20 27  ptr->numvalue, '
1aa0: 5c 30 27 2c 20 47 45 4f 4a 53 4f 4e 5f 4d 41 58  \0', GEOJSON_MAX
1ab0: 29 3b 0a 20 20 20 20 70 74 72 2d 3e 6e 75 6d 76  );.    ptr->numv
1ac0: 61 6c 75 65 5f 69 64 78 20 3d 20 30 3b 0a 20 20  alue_idx = 0;.  
1ad0: 20 20 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20    for (i = 0; i 
1ae0: 3c 20 47 45 4f 4a 53 4f 4e 5f 53 54 41 43 4b 3b  < GEOJSON_STACK;
1af0: 20 69 2b 2b 29 0a 20 20 20 20 20 20 7b 0a 09 20   i++).      {.. 
1b00: 20 67 65 6f 6a 73 6f 6e 5f 73 74 61 63 6b 5f 65   geojson_stack_e
1b10: 6e 74 72 79 5f 70 74 72 20 70 20 3d 20 70 74 72  ntry_ptr p = ptr
1b20: 2d 3e 65 6e 74 72 69 65 73 20 2b 20 69 3b 0a 09  ->entries + i;..
1b30: 20 20 70 2d 3e 6f 62 6a 20 3d 20 4e 55 4c 4c 3b    p->obj = NULL;
1b40: 0a 09 20 20 70 2d 3e 66 69 72 73 74 20 3d 20 4e  ..  p->first = N
1b50: 55 4c 4c 3b 0a 09 20 20 70 2d 3e 6c 61 73 74 20  ULL;..  p->last 
1b60: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a  = NULL;.      }.
1b70: 20 20 20 20 72 65 74 75 72 6e 20 70 74 72 3b 0a      return ptr;.
1b80: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 67  }..static void.g
1b90: 65 6f 6a 73 6f 6e 5f 64 65 73 74 72 6f 79 5f 73  eojson_destroy_s
1ba0: 74 61 63 6b 20 28 67 65 6f 6a 73 6f 6e 5f 73 74  tack (geojson_st
1bb0: 61 63 6b 5f 70 74 72 20 70 74 72 29 0a 7b 0a 2f  ack_ptr ptr).{./
1bc0: 2a 20 6d 65 6d 6f 72 79 20 63 6c 65 61 6e 75 70  * memory cleanup
1bd0: 20 2d 20 64 65 73 74 72 6f 79 69 6e 67 20 61 20   - destroying a 
1be0: 47 65 6f 4a 53 4f 4e 20 73 74 61 63 6b 20 6f 62  GeoJSON stack ob
1bf0: 6a 65 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ject */.    int 
1c00: 69 3b 0a 20 20 20 20 69 66 20 28 70 74 72 20 3d  i;.    if (ptr =
1c10: 3d 20 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 3b  = NULL)..return;
1c20: 0a 20 20 20 20 66 6f 72 20 28 69 20 3d 20 30 3b  .    for (i = 0;
1c30: 20 69 20 3c 20 47 45 4f 4a 53 4f 4e 5f 53 54 41   i < GEOJSON_STA
1c40: 43 4b 3b 20 69 2b 2b 29 0a 20 20 20 20 20 20 7b  CK; i++).      {
1c50: 0a 09 20 20 67 65 6f 6a 73 6f 6e 5f 73 74 61 63  ..  geojson_stac
1c60: 6b 5f 65 6e 74 72 79 5f 70 74 72 20 70 20 3d 20  k_entry_ptr p = 
1c70: 70 74 72 2d 3e 65 6e 74 72 69 65 73 20 2b 20 69  ptr->entries + i
1c80: 3b 0a 09 20 20 67 65 6f 6a 73 6f 6e 5f 6b 65 79  ;..  geojson_key
1c90: 76 61 6c 5f 70 74 72 20 70 6b 76 20 3d 20 70 2d  val_ptr pkv = p-
1ca0: 3e 66 69 72 73 74 3b 0a 09 20 20 77 68 69 6c 65  >first;..  while
1cb0: 20 28 70 6b 76 20 21 3d 20 4e 55 4c 4c 29 0a 09   (pkv != NULL)..
1cc0: 20 20 20 20 7b 0a 09 09 67 65 6f 6a 73 6f 6e 5f      {...geojson_
1cd0: 6b 65 79 76 61 6c 5f 70 74 72 20 70 6e 20 3d 20  keyval_ptr pn = 
1ce0: 70 6b 76 2d 3e 6e 65 78 74 3b 0a 09 09 69 66 20  pkv->next;...if 
1cf0: 28 70 6b 76 2d 3e 6b 65 79 20 21 3d 20 4e 55 4c  (pkv->key != NUL
1d00: 4c 29 0a 09 09 20 20 20 20 66 72 65 65 20 28 70  L)...    free (p
1d10: 6b 76 2d 3e 6b 65 79 29 3b 0a 09 09 69 66 20 28  kv->key);...if (
1d20: 70 6b 76 2d 3e 76 61 6c 75 65 20 21 3d 20 4e 55  pkv->value != NU
1d30: 4c 4c 29 0a 09 09 20 20 20 20 66 72 65 65 20 28  LL)...    free (
1d40: 70 6b 76 2d 3e 76 61 6c 75 65 29 3b 0a 09 09 66  pkv->value);...f
1d50: 72 65 65 20 28 70 6b 76 29 3b 0a 09 09 70 6b 76  ree (pkv);...pkv
1d60: 20 3d 20 70 6e 3b 0a 09 20 20 20 20 7d 0a 20 20   = pn;..    }.  
1d70: 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 20 28      }.    free (
1d80: 70 74 72 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  ptr);.}..static 
1d90: 69 6e 74 0a 67 65 6f 6a 73 6f 6e 5f 70 61 72 73  int.geojson_pars
1da0: 65 5f 6b 65 79 20 28 67 65 6f 6a 73 6f 6e 5f 73  e_key (geojson_s
1db0: 74 61 63 6b 5f 70 74 72 20 73 74 61 63 6b 2c 20  tack_ptr stack, 
1dc0: 63 68 61 72 20 63 2c 20 63 68 61 72 20 2a 2a 65  char c, char **e
1dd0: 72 72 6f 72 5f 6d 65 73 73 61 67 65 29 0a 7b 0a  rror_message).{.
1de0: 2f 2a 20 70 61 72 73 69 6e 67 20 61 20 47 65 6f  /* parsing a Geo
1df0: 4a 53 4f 4e 20 4f 62 6a 65 63 74 27 73 20 4b 65  JSON Object's Ke
1e00: 79 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20  y string */.    
1e10: 69 66 20 28 73 74 61 63 6b 2d 3e 6b 65 79 5f 69  if (stack->key_i
1e20: 64 78 20 3e 3d 20 47 45 4f 4a 53 4f 4e 5f 4d 41  dx >= GEOJSON_MA
1e30: 58 20 2d 20 31 29 0a 20 20 20 20 20 20 7b 0a 09  X - 1).      {..
1e40: 20 20 2a 65 72 72 6f 72 5f 6d 65 73 73 61 67 65    *error_message
1e50: 20 3d 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65   =..      sqlite
1e60: 33 5f 6d 70 72 69 6e 74 66 20 28 22 47 65 6f 4a  3_mprintf ("GeoJ
1e70: 53 4f 4e 20 4f 62 6a 65 63 74 27 73 20 4b 65 79  SON Object's Key
1e80: 20 73 74 72 69 6e 67 3a 20 6c 65 6e 20 3e 20 25   string: len > %
1e90: 64 20 63 68 61 72 73 5c 6e 22 2c 0a 09 09 09 20  d chars\n",.... 
1ea0: 20 20 20 20 20 20 47 45 4f 4a 53 4f 4e 5f 4d 41        GEOJSON_MA
1eb0: 58 29 3b 0a 09 20 20 72 65 74 75 72 6e 20 30 3b  X);..  return 0;
1ec0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 2a 28 73  .      }.    *(s
1ed0: 74 61 63 6b 2d 3e 6b 65 79 20 2b 20 73 74 61 63  tack->key + stac
1ee0: 6b 2d 3e 6b 65 79 5f 69 64 78 29 20 3d 20 63 3b  k->key_idx) = c;
1ef0: 0a 20 20 20 20 73 74 61 63 6b 2d 3e 6b 65 79 5f  .    stack->key_
1f00: 69 64 78 20 2b 3d 20 31 3b 0a 20 20 20 20 72 65  idx += 1;.    re
1f10: 74 75 72 6e 20 31 3b 0a 7d 0a 0a 73 74 61 74 69  turn 1;.}..stati
1f20: 63 20 69 6e 74 0a 67 65 6f 6a 73 6f 6e 5f 70 61  c int.geojson_pa
1f30: 72 73 65 5f 76 61 6c 75 65 20 28 67 65 6f 6a 73  rse_value (geojs
1f40: 6f 6e 5f 73 74 61 63 6b 5f 70 74 72 20 73 74 61  on_stack_ptr sta
1f50: 63 6b 2c 20 63 68 61 72 20 63 2c 20 63 68 61 72  ck, char c, char
1f60: 20 2a 2a 65 72 72 6f 72 5f 6d 65 73 73 61 67 65   **error_message
1f70: 29 0a 7b 0a 2f 2a 20 70 61 72 73 69 6e 67 20 61  ).{./* parsing a
1f80: 20 47 65 6f 4a 53 4f 4e 20 4f 62 6a 65 63 74 27   GeoJSON Object'
1f90: 73 20 56 61 6c 75 65 20 73 74 72 69 6e 67 20 2a  s Value string *
1fa0: 2f 0a 20 20 20 20 69 66 20 28 73 74 61 63 6b 2d  /.    if (stack-
1fb0: 3e 6b 65 79 5f 69 64 78 20 3e 3d 20 47 45 4f 4a  >key_idx >= GEOJ
1fc0: 53 4f 4e 5f 4d 41 58 20 2d 20 31 29 0a 20 20 20  SON_MAX - 1).   
1fd0: 20 20 20 7b 0a 09 20 20 2a 65 72 72 6f 72 5f 6d     {..  *error_m
1fe0: 65 73 73 61 67 65 20 3d 0a 09 20 20 20 20 20 20  essage =..      
1ff0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 0a  sqlite3_mprintf.
2000: 09 20 20 20 20 20 20 28 22 47 65 6f 4a 53 4f 4e  .      ("GeoJSON
2010: 20 4f 62 6a 65 63 74 27 73 20 56 61 6c 75 65 20   Object's Value 
2020: 73 74 72 69 6e 67 3a 20 6c 65 6e 20 3e 20 25 64  string: len > %d
2030: 20 63 68 61 72 73 5c 6e 22 2c 20 47 45 4f 4a 53   chars\n", GEOJS
2040: 4f 4e 5f 4d 41 58 29 3b 0a 09 20 20 72 65 74 75  ON_MAX);..  retu
2050: 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
2060: 20 20 2a 28 73 74 61 63 6b 2d 3e 76 61 6c 75 65    *(stack->value
2070: 20 2b 20 73 74 61 63 6b 2d 3e 76 61 6c 75 65 5f   + stack->value_
2080: 69 64 78 29 20 3d 20 63 3b 0a 20 20 20 20 73 74  idx) = c;.    st
2090: 61 63 6b 2d 3e 76 61 6c 75 65 5f 69 64 78 20 2b  ack->value_idx +
20a0: 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
20b0: 31 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  1;.}..static int
20c0: 0a 67 65 6f 6a 73 6f 6e 5f 70 61 72 73 65 5f 6e  .geojson_parse_n
20d0: 75 6d 76 61 6c 75 65 20 28 67 65 6f 6a 73 6f 6e  umvalue (geojson
20e0: 5f 73 74 61 63 6b 5f 70 74 72 20 73 74 61 63 6b  _stack_ptr stack
20f0: 2c 20 63 68 61 72 20 63 2c 20 63 68 61 72 20 2a  , char c, char *
2100: 2a 65 72 72 6f 72 5f 6d 65 73 73 61 67 65 29 0a  *error_message).
2110: 7b 0a 2f 2a 20 70 61 72 73 69 6e 67 20 61 20 47  {./* parsing a G
2120: 65 6f 4a 53 4f 4e 20 4f 62 6a 65 63 74 27 73 20  eoJSON Object's 
2130: 6e 75 6d 65 72 69 63 20 6f 72 20 73 70 65 63 69  numeric or speci
2140: 61 6c 20 56 61 6c 75 65 20 2a 2f 0a 20 20 20 20  al Value */.    
2150: 69 66 20 28 73 74 61 63 6b 2d 3e 6e 75 6d 76 61  if (stack->numva
2160: 6c 75 65 5f 69 64 78 20 3e 3d 20 47 45 4f 4a 53  lue_idx >= GEOJS
2170: 4f 4e 5f 4d 41 58 20 2d 20 31 29 0a 20 20 20 20  ON_MAX - 1).    
2180: 20 20 7b 0a 09 20 20 2a 65 72 72 6f 72 5f 6d 65    {..  *error_me
2190: 73 73 61 67 65 20 3d 0a 09 20 20 20 20 20 20 73  ssage =..      s
21a0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 0a 09  qlite3_mprintf..
21b0: 20 20 20 20 20 20 28 22 47 65 6f 4a 53 4f 4e 20        ("GeoJSON 
21c0: 4f 62 6a 65 63 74 27 73 20 4e 75 6d 65 72 69 63  Object's Numeric
21d0: 20 56 61 6c 75 65 3a 20 6c 65 6e 20 3e 20 25 64   Value: len > %d
21e0: 20 63 68 61 72 73 5c 6e 22 2c 20 47 45 4f 4a 53   chars\n", GEOJS
21f0: 4f 4e 5f 4d 41 58 29 3b 0a 09 20 20 72 65 74 75  ON_MAX);..  retu
2200: 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
2210: 20 20 2a 28 73 74 61 63 6b 2d 3e 6e 75 6d 76 61    *(stack->numva
2220: 6c 75 65 20 2b 20 73 74 61 63 6b 2d 3e 6e 75 6d  lue + stack->num
2230: 76 61 6c 75 65 5f 69 64 78 29 20 3d 20 63 3b 0a  value_idx) = c;.
2240: 20 20 20 20 73 74 61 63 6b 2d 3e 6e 75 6d 76 61      stack->numva
2250: 6c 75 65 5f 69 64 78 20 2b 3d 20 31 3b 0a 20 20  lue_idx += 1;.  
2260: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 73    return 1;.}..s
2270: 74 61 74 69 63 20 76 6f 69 64 0a 67 65 6f 6a 73  tatic void.geojs
2280: 6f 6e 5f 61 64 64 5f 6b 65 79 76 61 6c 20 28 67  on_add_keyval (g
2290: 65 6f 6a 73 6f 6e 5f 73 74 61 63 6b 5f 70 74 72  eojson_stack_ptr
22a0: 20 73 74 61 63 6b 2c 20 69 6e 74 20 6c 65 76 65   stack, int leve
22b0: 6c 29 0a 7b 0a 2f 2a 20 61 64 64 69 6e 67 20 61  l).{./* adding a
22c0: 20 4b 65 79 2d 56 61 6c 75 65 20 69 74 65 6d 20   Key-Value item 
22d0: 74 6f 20 61 20 47 65 6f 4a 53 4f 4e 20 4f 62 6a  to a GeoJSON Obj
22e0: 65 63 74 20 2a 2f 0a 20 20 20 20 67 65 6f 6a 73  ect */.    geojs
22f0: 6f 6e 5f 73 74 61 63 6b 5f 65 6e 74 72 79 5f 70  on_stack_entry_p
2300: 74 72 20 65 6e 74 72 79 3b 0a 20 20 20 20 67 65  tr entry;.    ge
2310: 6f 6a 73 6f 6e 5f 6b 65 79 76 61 6c 5f 70 74 72  ojson_keyval_ptr
2320: 20 70 6b 76 3b 0a 20 20 20 20 69 6e 74 20 6c 65   pkv;.    int le
2330: 6e 3b 0a 0a 20 20 20 20 69 66 20 28 2a 28 73 74  n;..    if (*(st
2340: 61 63 6b 2d 3e 6b 65 79 29 20 3d 3d 20 27 5c 30  ack->key) == '\0
2350: 27 29 0a 09 67 6f 74 6f 20 72 65 73 65 74 3b 0a  ')..goto reset;.
2360: 20 20 20 20 65 6e 74 72 79 20 3d 20 73 74 61 63      entry = stac
2370: 6b 2d 3e 65 6e 74 72 69 65 73 20 2b 20 6c 65 76  k->entries + lev
2380: 65 6c 3b 0a 2f 2a 20 73 65 74 74 69 6e 67 20 74  el;./* setting t
2390: 68 65 20 4b 65 79 20 6e 61 6d 65 20 2a 2f 0a 20  he Key name */. 
23a0: 20 20 20 70 6b 76 20 3d 20 6d 61 6c 6c 6f 63 20     pkv = malloc 
23b0: 28 73 69 7a 65 6f 66 20 28 67 65 6f 6a 73 6f 6e  (sizeof (geojson
23c0: 5f 6b 65 79 76 61 6c 29 29 3b 0a 20 20 20 20 6c  _keyval));.    l
23d0: 65 6e 20 3d 20 73 74 72 6c 65 6e 20 28 73 74 61  en = strlen (sta
23e0: 63 6b 2d 3e 6b 65 79 29 3b 0a 20 20 20 20 69 66  ck->key);.    if
23f0: 20 28 6c 65 6e 20 3e 20 30 29 0a 20 20 20 20 20   (len > 0).     
2400: 20 7b 0a 09 20 20 70 6b 76 2d 3e 6b 65 79 20 3d   {..  pkv->key =
2410: 20 6d 61 6c 6c 6f 63 20 28 6c 65 6e 20 2b 20 31   malloc (len + 1
2420: 29 3b 0a 09 20 20 73 74 72 63 70 79 20 28 70 6b  );..  strcpy (pk
2430: 76 2d 3e 6b 65 79 2c 20 73 74 61 63 6b 2d 3e 6b  v->key, stack->k
2440: 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ey);.      }.   
2450: 20 65 6c 73 65 0a 09 70 6b 76 2d 3e 6b 65 79 20   else..pkv->key 
2460: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 6c 65 6e 20  = NULL;.    len 
2470: 3d 20 73 74 72 6c 65 6e 20 28 73 74 61 63 6b 2d  = strlen (stack-
2480: 3e 76 61 6c 75 65 29 3b 0a 20 20 20 20 69 66 20  >value);.    if 
2490: 28 6c 65 6e 20 3e 20 30 29 0a 20 20 20 20 20 20  (len > 0).      
24a0: 7b 0a 09 20 20 2f 2a 20 73 65 74 74 69 6e 67 20  {..  /* setting 
24b0: 61 20 73 74 72 69 6e 67 20 76 61 6c 75 65 20 2a  a string value *
24c0: 2f 0a 09 20 20 70 6b 76 2d 3e 76 61 6c 75 65 20  /..  pkv->value 
24d0: 3d 20 6d 61 6c 6c 6f 63 20 28 6c 65 6e 20 2b 20  = malloc (len + 
24e0: 31 29 3b 0a 09 20 20 73 74 72 63 70 79 20 28 70  1);..  strcpy (p
24f0: 6b 76 2d 3e 76 61 6c 75 65 2c 20 73 74 61 63 6b  kv->value, stack
2500: 2d 3e 76 61 6c 75 65 29 3b 0a 09 20 20 70 6b 76  ->value);..  pkv
2510: 2d 3e 6e 75 6d 76 61 6c 75 65 20 3d 20 30 3b 0a  ->numvalue = 0;.
2520: 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65        }.    else
2530: 0a 09 70 6b 76 2d 3e 76 61 6c 75 65 20 3d 20 4e  ..pkv->value = N
2540: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 70 6b 76  ULL;.    if (pkv
2550: 2d 3e 76 61 6c 75 65 20 3d 3d 20 4e 55 4c 4c 29  ->value == NULL)
2560: 0a 20 20 20 20 20 20 7b 0a 09 20 20 6c 65 6e 20  .      {..  len 
2570: 3d 20 73 74 72 6c 65 6e 20 28 73 74 61 63 6b 2d  = strlen (stack-
2580: 3e 6e 75 6d 76 61 6c 75 65 29 3b 0a 09 20 20 69  >numvalue);..  i
2590: 66 20 28 6c 65 6e 20 3e 20 30 29 0a 09 20 20 20  f (len > 0)..   
25a0: 20 7b 0a 09 09 2f 2a 20 73 65 74 74 69 6e 67 20   {.../* setting 
25b0: 61 20 6e 75 6d 65 72 69 63 20 6f 72 20 73 70 65  a numeric or spe
25c0: 63 69 61 6c 20 76 61 6c 75 65 20 2a 2f 0a 09 09  cial value */...
25d0: 70 6b 76 2d 3e 76 61 6c 75 65 20 3d 20 6d 61 6c  pkv->value = mal
25e0: 6c 6f 63 20 28 6c 65 6e 20 2b 20 31 29 3b 0a 09  loc (len + 1);..
25f0: 09 73 74 72 63 70 79 20 28 70 6b 76 2d 3e 76 61  .strcpy (pkv->va
2600: 6c 75 65 2c 20 73 74 61 63 6b 2d 3e 6e 75 6d 76  lue, stack->numv
2610: 61 6c 75 65 29 3b 0a 09 09 70 6b 76 2d 3e 6e 75  alue);...pkv->nu
2620: 6d 76 61 6c 75 65 20 3d 20 31 3b 0a 09 20 20 20  mvalue = 1;..   
2630: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 70   }.      }.    p
2640: 6b 76 2d 3e 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b  kv->next = NULL;
2650: 0a 2f 2a 20 75 70 64 61 74 69 6e 67 20 74 68 65  ./* updating the
2660: 20 4b 65 79 2d 56 61 6c 75 65 20 6c 69 6e 6b 65   Key-Value linke
2670: 64 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69 66  d list */.    if
2680: 20 28 65 6e 74 72 79 2d 3e 66 69 72 73 74 20 3d   (entry->first =
2690: 3d 20 4e 55 4c 4c 29 0a 09 65 6e 74 72 79 2d 3e  = NULL)..entry->
26a0: 66 69 72 73 74 20 3d 20 70 6b 76 3b 0a 20 20 20  first = pkv;.   
26b0: 20 69 66 20 28 65 6e 74 72 79 2d 3e 6c 61 73 74   if (entry->last
26c0: 20 21 3d 20 4e 55 4c 4c 29 0a 09 65 6e 74 72 79   != NULL)..entry
26d0: 2d 3e 6c 61 73 74 2d 3e 6e 65 78 74 20 3d 20 70  ->last->next = p
26e0: 6b 76 3b 0a 20 20 20 20 65 6e 74 72 79 2d 3e 6c  kv;.    entry->l
26f0: 61 73 74 20 3d 20 70 6b 76 3b 0a 0a 2f 2a 20 72  ast = pkv;../* r
2700: 65 73 65 74 74 69 6e 67 20 74 68 65 20 4b 65 79  esetting the Key
2710: 2d 56 61 6c 75 65 20 69 6e 70 75 74 20 62 75 66  -Value input buf
2720: 66 65 72 73 20 2a 2f 0a 20 20 72 65 73 65 74 3a  fers */.  reset:
2730: 0a 20 20 20 20 6d 65 6d 73 65 74 20 28 73 74 61  .    memset (sta
2740: 63 6b 2d 3e 6b 65 79 2c 20 27 5c 30 27 2c 20 47  ck->key, '\0', G
2750: 45 4f 4a 53 4f 4e 5f 4d 41 58 29 3b 0a 20 20 20  EOJSON_MAX);.   
2760: 20 73 74 61 63 6b 2d 3e 6b 65 79 5f 69 64 78 20   stack->key_idx 
2770: 3d 20 30 3b 0a 20 20 20 20 6d 65 6d 73 65 74 20  = 0;.    memset 
2780: 28 73 74 61 63 6b 2d 3e 76 61 6c 75 65 2c 20 27  (stack->value, '
2790: 5c 30 27 2c 20 47 45 4f 4a 53 4f 4e 5f 4d 41 58  \0', GEOJSON_MAX
27a0: 29 3b 0a 20 20 20 20 73 74 61 63 6b 2d 3e 76 61  );.    stack->va
27b0: 6c 75 65 5f 69 64 78 20 3d 20 30 3b 0a 20 20 20  lue_idx = 0;.   
27c0: 20 6d 65 6d 73 65 74 20 28 73 74 61 63 6b 2d 3e   memset (stack->
27d0: 6e 75 6d 76 61 6c 75 65 2c 20 27 5c 30 27 2c 20  numvalue, '\0', 
27e0: 47 45 4f 4a 53 4f 4e 5f 4d 41 58 29 3b 0a 20 20  GEOJSON_MAX);.  
27f0: 20 20 73 74 61 63 6b 2d 3e 6e 75 6d 76 61 6c 75    stack->numvalu
2800: 65 5f 69 64 78 20 3d 20 30 3b 0a 7d 0a 0a 73 74  e_idx = 0;.}..st
2810: 61 74 69 63 20 67 65 6f 6a 73 6f 6e 5f 62 6c 6f  atic geojson_blo
2820: 63 6b 5f 70 74 72 0a 67 65 6f 6a 73 6f 6e 5f 61  ck_ptr.geojson_a
2830: 64 64 5f 62 6c 6f 63 6b 20 28 67 65 6f 6a 73 6f  dd_block (geojso
2840: 6e 5f 70 61 72 73 65 72 5f 70 74 72 20 70 61 72  n_parser_ptr par
2850: 73 65 72 29 0a 7b 0a 2f 2a 20 61 64 64 69 6e 67  ser).{./* adding
2860: 20 61 20 6e 65 77 20 62 6c 6f 63 6b 20 6f 66 20   a new block of 
2870: 6f 62 6a 65 63 74 73 20 74 6f 20 74 68 65 20 47  objects to the G
2880: 65 6f 4a 53 4f 4e 20 70 61 72 73 65 72 20 2a 2f  eoJSON parser */
2890: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
28a0: 67 65 6f 6a 73 6f 6e 5f 62 6c 6f 63 6b 5f 70 74  geojson_block_pt
28b0: 72 20 62 6c 6f 63 6b 3b 0a 20 20 20 20 69 66 20  r block;.    if 
28c0: 28 70 61 72 73 65 72 20 3d 3d 20 4e 55 4c 4c 29  (parser == NULL)
28d0: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20  ..return NULL;. 
28e0: 20 20 20 62 6c 6f 63 6b 20 3d 20 6d 61 6c 6c 6f     block = mallo
28f0: 63 20 28 73 69 7a 65 6f 66 20 28 67 65 6f 6a 73  c (sizeof (geojs
2900: 6f 6e 5f 62 6c 6f 63 6b 29 29 3b 0a 2f 2a 20 69  on_block));./* i
2910: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 6e 20 65  nitializing an e
2920: 6d 70 74 79 20 62 6c 6f 63 6b 20 2a 2f 0a 20 20  mpty block */.  
2930: 20 20 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20    for (i = 0; i 
2940: 3c 20 47 45 4f 4a 53 4f 4e 5f 42 4c 4f 43 4b 3b  < GEOJSON_BLOCK;
2950: 20 69 2b 2b 29 0a 20 20 20 20 20 20 7b 0a 09 20   i++).      {.. 
2960: 20 67 65 6f 6a 73 6f 6e 5f 65 6e 74 72 79 5f 70   geojson_entry_p
2970: 74 72 20 65 6e 74 72 79 20 3d 20 62 6c 6f 63 6b  tr entry = block
2980: 2d 3e 65 6e 74 72 69 65 73 20 2b 20 69 3b 0a 09  ->entries + i;..
2990: 20 20 65 6e 74 72 79 2d 3e 70 61 72 65 6e 74 5f    entry->parent_
29a0: 6b 65 79 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 65  key = NULL;..  e
29b0: 6e 74 72 79 2d 3e 74 79 70 65 20 3d 20 47 45 4f  ntry->type = GEO
29c0: 4a 53 4f 4e 5f 55 4e 4b 4e 4f 57 4e 3b 0a 09 20  JSON_UNKNOWN;.. 
29d0: 20 65 6e 74 72 79 2d 3e 70 72 6f 70 65 72 74 69   entry->properti
29e0: 65 73 20 3d 20 30 3b 0a 09 20 20 65 6e 74 72 79  es = 0;..  entry
29f0: 2d 3e 67 65 6f 6d 65 74 72 79 20 3d 20 30 3b 0a  ->geometry = 0;.
2a00: 09 20 20 65 6e 74 72 79 2d 3e 6f 66 66 73 65 74  .  entry->offset
2a10: 5f 73 74 61 72 74 20 3d 20 2d 31 3b 0a 09 20 20  _start = -1;..  
2a20: 65 6e 74 72 79 2d 3e 6f 66 66 73 65 74 5f 65 6e  entry->offset_en
2a30: 64 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a  d = -1;.      }.
2a40: 20 20 20 20 62 6c 6f 63 6b 2d 3e 6e 65 78 74 5f      block->next_
2a50: 66 72 65 65 5f 65 6e 74 72 79 20 3d 20 30 3b 0a  free_entry = 0;.
2a60: 20 20 20 20 62 6c 6f 63 6b 2d 3e 6e 65 78 74 20      block->next 
2a70: 3d 20 4e 55 4c 4c 3b 0a 2f 2a 20 61 70 70 65 6e  = NULL;./* appen
2a80: 64 69 6e 67 20 74 6f 20 74 68 65 20 6c 69 6e 6b  ding to the link
2a90: 65 64 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69  ed list */.    i
2aa0: 66 20 28 70 61 72 73 65 72 2d 3e 66 69 72 73 74  f (parser->first
2ab0: 20 3d 3d 20 4e 55 4c 4c 29 0a 09 70 61 72 73 65   == NULL)..parse
2ac0: 72 2d 3e 66 69 72 73 74 20 3d 20 62 6c 6f 63 6b  r->first = block
2ad0: 3b 0a 20 20 20 20 69 66 20 28 70 61 72 73 65 72  ;.    if (parser
2ae0: 2d 3e 6c 61 73 74 20 21 3d 20 4e 55 4c 4c 29 0a  ->last != NULL).
2af0: 09 70 61 72 73 65 72 2d 3e 6c 61 73 74 2d 3e 6e  .parser->last->n
2b00: 65 78 74 20 3d 20 62 6c 6f 63 6b 3b 0a 20 20 20  ext = block;.   
2b10: 20 70 61 72 73 65 72 2d 3e 6c 61 73 74 20 3d 20   parser->last = 
2b20: 62 6c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72  block;.    retur
2b30: 6e 20 62 6c 6f 63 6b 3b 0a 7d 0a 0a 73 74 61 74  n block;.}..stat
2b40: 69 63 20 76 6f 69 64 0a 67 65 6f 6a 73 6f 6e 5f  ic void.geojson_
2b50: 61 64 64 5f 63 6f 6c 75 6d 6e 20 28 67 65 6f 6a  add_column (geoj
2b60: 73 6f 6e 5f 70 61 72 73 65 72 5f 70 74 72 20 70  son_parser_ptr p
2b70: 61 72 73 65 72 2c 20 63 6f 6e 73 74 20 63 68 61  arser, const cha
2b80: 72 20 2a 6e 61 6d 65 2c 20 69 6e 74 20 74 79 70  r *name, int typ
2b90: 65 29 0a 7b 0a 2f 2a 20 75 70 64 61 74 69 6e 67  e).{./* updating
2ba0: 20 74 68 65 20 43 6f 6c 75 6d 6e 73 20 6c 69 73   the Columns lis
2bb0: 74 20 2a 2f 0a 20 20 20 20 67 65 6f 6a 73 6f 6e  t */.    geojson
2bc0: 5f 63 6f 6c 75 6d 6e 5f 70 74 72 20 63 6f 6c 3b  _column_ptr col;
2bd0: 0a 0a 20 20 20 20 63 6f 6c 20 3d 20 70 61 72 73  ..    col = pars
2be0: 65 72 2d 3e 66 69 72 73 74 5f 63 6f 6c 3b 0a 20  er->first_col;. 
2bf0: 20 20 20 77 68 69 6c 65 20 28 63 6f 6c 20 21 3d     while (col !=
2c00: 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09   NULL).      {..
2c10: 20 20 69 66 20 28 73 74 72 63 61 73 65 63 6d 70    if (strcasecmp
2c20: 20 28 63 6f 6c 2d 3e 6e 61 6d 65 2c 20 6e 61 6d   (col->name, nam
2c30: 65 29 20 3d 3d 20 30 29 0a 09 20 20 20 20 7b 0a  e) == 0)..    {.
2c40: 09 09 2f 2a 20 61 6c 72 65 61 64 79 20 64 65 66  ../* already def
2c50: 69 6e 65 64 3a 20 75 70 64 61 74 69 6e 67 20 73  ined: updating s
2c60: 74 61 74 73 20 2a 2f 0a 09 09 73 77 69 74 63 68  tats */...switch
2c70: 20 28 74 79 70 65 29 0a 09 09 20 20 7b 0a 09 09   (type)...  {...
2c80: 20 20 63 61 73 65 20 47 45 4f 4a 53 4f 4e 5f 54    case GEOJSON_T
2c90: 45 58 54 3a 0a 09 09 20 20 20 20 20 20 63 6f 6c  EXT:...      col
2ca0: 2d 3e 6e 5f 74 65 78 74 20 2b 3d 20 31 3b 0a 09  ->n_text += 1;..
2cb0: 09 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 09 09  .      break;...
2cc0: 20 20 63 61 73 65 20 47 45 4f 4a 53 4f 4e 5f 49    case GEOJSON_I
2cd0: 4e 54 45 47 45 52 3a 0a 09 09 20 20 20 20 20 20  NTEGER:...      
2ce0: 63 6f 6c 2d 3e 6e 5f 69 6e 74 20 2b 3d 20 31 3b  col->n_int += 1;
2cf0: 0a 09 09 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ...      break;.
2d00: 09 09 20 20 63 61 73 65 20 47 45 4f 4a 53 4f 4e  ..  case GEOJSON
2d10: 5f 44 4f 55 42 4c 45 3a 0a 09 09 20 20 20 20 20  _DOUBLE:...     
2d20: 20 63 6f 6c 2d 3e 6e 5f 64 6f 75 62 6c 65 20 2b   col->n_double +
2d30: 3d 20 31 3b 0a 09 09 20 20 20 20 20 20 62 72 65  = 1;...      bre
2d40: 61 6b 3b 0a 09 09 20 20 63 61 73 65 20 47 45 4f  ak;...  case GEO
2d50: 4a 53 4f 4e 5f 54 52 55 45 3a 0a 09 09 20 20 63  JSON_TRUE:...  c
2d60: 61 73 65 20 47 45 4f 4a 53 4f 4e 5f 46 41 4c 53  ase GEOJSON_FALS
2d70: 45 3a 0a 09 09 20 20 20 20 20 20 63 6f 6c 2d 3e  E:...      col->
2d80: 6e 5f 62 6f 6f 6c 20 2b 3d 20 31 3b 0a 09 09 20  n_bool += 1;... 
2d90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 09 09 20 20       break;...  
2da0: 63 61 73 65 20 47 45 4f 4a 53 4f 4e 5f 4e 55 4c  case GEOJSON_NUL
2db0: 4c 3a 0a 09 09 20 20 20 20 20 20 63 6f 6c 2d 3e  L:...      col->
2dc0: 6e 5f 6e 75 6c 6c 20 2b 3d 20 31 3b 0a 09 09 20  n_null += 1;... 
2dd0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 09 09 20 20       break;...  
2de0: 7d 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20  };...return;..  
2df0: 20 20 7d 0a 09 20 20 63 6f 6c 20 3d 20 63 6f 6c    }..  col = col
2e00: 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  ->next;.      }.
2e10: 0a 2f 2a 20 69 6e 73 65 72 74 69 6e 67 20 61 20  ./* inserting a 
2e20: 6e 65 77 20 63 6f 6c 75 6d 6e 20 69 6e 74 6f 20  new column into 
2e30: 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20  the list */.    
2e40: 63 6f 6c 20 3d 20 67 65 6f 6a 73 6f 6e 5f 63 72  col = geojson_cr
2e50: 65 61 74 65 5f 63 6f 6c 75 6d 6e 20 28 6e 61 6d  eate_column (nam
2e60: 65 2c 20 74 79 70 65 29 3b 0a 20 20 20 20 69 66  e, type);.    if
2e70: 20 28 70 61 72 73 65 72 2d 3e 66 69 72 73 74 5f   (parser->first_
2e80: 63 6f 6c 20 3d 3d 20 4e 55 4c 4c 29 0a 09 70 61  col == NULL)..pa
2e90: 72 73 65 72 2d 3e 66 69 72 73 74 5f 63 6f 6c 20  rser->first_col 
2ea0: 3d 20 63 6f 6c 3b 0a 20 20 20 20 69 66 20 28 70  = col;.    if (p
2eb0: 61 72 73 65 72 2d 3e 6c 61 73 74 5f 63 6f 6c 20  arser->last_col 
2ec0: 21 3d 20 4e 55 4c 4c 29 0a 09 70 61 72 73 65 72  != NULL)..parser
2ed0: 2d 3e 6c 61 73 74 5f 63 6f 6c 2d 3e 6e 65 78 74  ->last_col->next
2ee0: 20 3d 20 63 6f 6c 3b 0a 20 20 20 20 70 61 72 73   = col;.    pars
2ef0: 65 72 2d 3e 6c 61 73 74 5f 63 6f 6c 20 3d 20 63  er->last_col = c
2f00: 6f 6c 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  ol;.}..static in
2f10: 74 0a 67 65 6f 6a 73 6f 6e 5f 70 75 73 68 20 28  t.geojson_push (
2f20: 67 65 6f 6a 73 6f 6e 5f 73 74 61 63 6b 5f 70 74  geojson_stack_pt
2f30: 72 20 73 74 61 63 6b 2c 20 67 65 6f 6a 73 6f 6e  r stack, geojson
2f40: 5f 65 6e 74 72 79 5f 70 74 72 20 65 6e 74 72 79  _entry_ptr entry
2f50: 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 0a 09 20 20  , int level,..  
2f60: 20 20 20 20 63 68 61 72 20 2a 2a 65 72 72 6f 72      char **error
2f70: 5f 6d 65 73 73 61 67 65 29 0a 7b 0a 2f 2a 20 47  _message).{./* G
2f80: 65 6f 4a 53 4f 4e 20 73 74 61 63 6b 20 70 73 65  eoJSON stack pse
2f90: 75 64 6f 2d 70 75 73 68 20 2a 2f 0a 20 20 20 20  udo-push */.    
2fa0: 67 65 6f 6a 73 6f 6e 5f 73 74 61 63 6b 5f 65 6e  geojson_stack_en
2fb0: 74 72 79 5f 70 74 72 20 70 5f 65 6e 74 72 79 3b  try_ptr p_entry;
2fc0: 0a 20 20 20 20 69 66 20 28 73 74 61 63 6b 20 3d  .    if (stack =
2fd0: 3d 20 4e 55 4c 4c 20 7c 7c 20 65 6e 74 72 79 20  = NULL || entry 
2fe0: 3d 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b  == NULL).      {
2ff0: 0a 09 20 20 2a 65 72 72 6f 72 5f 6d 65 73 73 61  ..  *error_messa
3000: 67 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ge = sqlite3_mpr
3010: 69 6e 74 66 20 28 22 47 65 6f 4a 53 4f 4e 20 70  intf ("GeoJSON p
3020: 75 73 68 3a 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  ush: NULL pointe
3030: 72 5c 6e 22 29 3b 0a 09 20 20 72 65 74 75 72 6e  r\n");..  return
3040: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
3050: 69 66 20 28 6c 65 76 65 6c 20 3c 20 30 20 7c 7c  if (level < 0 ||
3060: 20 6c 65 76 65 6c 20 3e 3d 20 47 45 4f 4a 53 4f   level >= GEOJSO
3070: 4e 5f 53 54 41 43 4b 29 0a 20 20 20 20 20 20 7b  N_STACK).      {
3080: 0a 09 20 20 2a 65 72 72 6f 72 5f 6d 65 73 73 61  ..  *error_messa
3090: 67 65 20 3d 0a 09 20 20 20 20 20 20 73 71 6c 69  ge =..      sqli
30a0: 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 47 65  te3_mprintf ("Ge
30b0: 6f 4a 53 4f 4e 20 70 75 73 68 3a 20 66 6f 72 62  oJSON push: forb
30c0: 69 64 64 65 6e 20 6e 65 73 74 69 6e 67 20 6c 65  idden nesting le
30d0: 76 65 6c 20 25 64 5c 6e 22 2c 0a 09 09 09 20 20  vel %d\n",....  
30e0: 20 20 20 20 20 6c 65 76 65 6c 29 3b 0a 09 20 20       level);..  
30f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
3100: 7d 0a 20 20 20 20 69 66 20 28 6c 65 76 65 6c 20  }.    if (level 
3110: 21 3d 20 28 73 74 61 63 6b 2d 3e 6c 65 76 65 6c  != (stack->level
3120: 20 2b 20 31 29 29 0a 20 20 20 20 20 20 7b 0a 09   + 1)).      {..
3130: 20 20 2a 65 72 72 6f 72 5f 6d 65 73 73 61 67 65    *error_message
3140: 20 3d 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65   =..      sqlite
3150: 33 5f 6d 70 72 69 6e 74 66 0a 09 20 20 20 20 20  3_mprintf..     
3160: 20 28 22 47 65 6f 4a 53 4f 4e 20 70 75 73 68 3a   ("GeoJSON push:
3170: 20 75 6e 65 78 70 65 63 74 65 64 20 6e 65 73 74   unexpected nest
3180: 69 6e 67 20 6c 65 76 65 6c 20 25 64 20 28 25 64  ing level %d (%d
3190: 29 5c 6e 22 2c 20 6c 65 76 65 6c 2c 0a 09 20 20  )\n", level,..  
31a0: 20 20 20 20 20 73 74 61 63 6b 2d 3e 6c 65 76 65       stack->leve
31b0: 6c 29 3b 0a 09 20 20 72 65 74 75 72 6e 20 30 3b  l);..  return 0;
31c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 73 74 61  .      }.    sta
31d0: 63 6b 2d 3e 6c 65 76 65 6c 20 2b 3d 20 31 3b 0a  ck->level += 1;.
31e0: 20 20 20 20 70 5f 65 6e 74 72 79 20 3d 20 73 74      p_entry = st
31f0: 61 63 6b 2d 3e 65 6e 74 72 69 65 73 20 2b 20 6c  ack->entries + l
3200: 65 76 65 6c 3b 0a 20 20 20 20 69 66 20 28 70 5f  evel;.    if (p_
3210: 65 6e 74 72 79 2d 3e 6f 62 6a 20 21 3d 20 4e 55  entry->obj != NU
3220: 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2a  LL).      {..  *
3230: 65 72 72 6f 72 5f 6d 65 73 73 61 67 65 20 3d 0a  error_message =.
3240: 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
3250: 70 72 69 6e 74 66 20 28 22 47 65 6f 4a 53 4f 4e  printf ("GeoJSON
3260: 20 70 75 73 68 3a 20 75 6e 65 78 70 65 63 74 65   push: unexpecte
3270: 64 20 75 6e 66 72 65 65 64 20 6c 65 76 65 6c 20  d unfreed level 
3280: 25 64 5c 6e 22 2c 0a 09 09 09 20 20 20 20 20 20  %d\n",....      
3290: 20 6c 65 76 65 6c 29 3b 0a 09 20 20 72 65 74 75   level);..  retu
32a0: 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 2f 2a  rn 0;.      }./*
32b0: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
32c0: 65 20 73 74 61 63 6b 20 65 6e 74 72 79 20 2a 2f  e stack entry */
32d0: 0a 20 20 20 20 70 5f 65 6e 74 72 79 2d 3e 6f 62  .    p_entry->ob
32e0: 6a 20 3d 20 65 6e 74 72 79 3b 0a 20 20 20 20 6d  j = entry;.    m
32f0: 65 6d 73 65 74 20 28 73 74 61 63 6b 2d 3e 6b 65  emset (stack->ke
3300: 79 2c 20 27 5c 30 27 2c 20 47 45 4f 4a 53 4f 4e  y, '\0', GEOJSON
3310: 5f 4d 41 58 29 3b 0a 20 20 20 20 73 74 61 63 6b  _MAX);.    stack
3320: 2d 3e 6b 65 79 5f 69 64 78 20 3d 20 30 3b 0a 20  ->key_idx = 0;. 
3330: 20 20 20 6d 65 6d 73 65 74 20 28 73 74 61 63 6b     memset (stack
3340: 2d 3e 76 61 6c 75 65 2c 20 27 5c 30 27 2c 20 47  ->value, '\0', G
3350: 45 4f 4a 53 4f 4e 5f 4d 41 58 29 3b 0a 20 20 20  EOJSON_MAX);.   
3360: 20 73 74 61 63 6b 2d 3e 76 61 6c 75 65 5f 69 64   stack->value_id
3370: 78 20 3d 20 30 3b 0a 20 20 20 20 6d 65 6d 73 65  x = 0;.    memse
3380: 74 20 28 73 74 61 63 6b 2d 3e 6e 75 6d 76 61 6c  t (stack->numval
3390: 75 65 2c 20 27 5c 30 27 2c 20 47 45 4f 4a 53 4f  ue, '\0', GEOJSO
33a0: 4e 5f 4d 41 58 29 3b 0a 20 20 20 20 73 74 61 63  N_MAX);.    stac
33b0: 6b 2d 3e 6e 75 6d 76 61 6c 75 65 5f 69 64 78 20  k->numvalue_idx 
33c0: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
33d0: 31 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  1;.}..static int
33e0: 0a 67 65 6f 6a 73 6f 6e 5f 70 6f 70 20 28 67 65  .geojson_pop (ge
33f0: 6f 6a 73 6f 6e 5f 73 74 61 63 6b 5f 70 74 72 20  ojson_stack_ptr 
3400: 73 74 61 63 6b 2c 20 69 6e 74 20 6c 65 76 65 6c  stack, int level
3410: 2c 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c 0a 09  , long offset,..
3420: 20 20 20 20 20 63 68 61 72 20 2a 2a 65 72 72 6f       char **erro
3430: 72 5f 6d 65 73 73 61 67 65 29 0a 7b 0a 2f 2a 20  r_message).{./* 
3440: 47 65 6f 4a 53 4f 4e 20 73 74 61 63 6b 20 70 73  GeoJSON stack ps
3450: 65 75 64 6f 2d 70 6f 70 20 2a 2f 0a 20 20 20 20  eudo-pop */.    
3460: 67 65 6f 6a 73 6f 6e 5f 73 74 61 63 6b 5f 65 6e  geojson_stack_en
3470: 74 72 79 5f 70 74 72 20 70 5f 65 6e 74 72 79 3b  try_ptr p_entry;
3480: 0a 20 20 20 20 67 65 6f 6a 73 6f 6e 5f 6b 65 79  .    geojson_key
3490: 76 61 6c 5f 70 74 72 20 70 6b 76 3b 0a 20 20 20  val_ptr pkv;.   
34a0: 20 69 66 20 28 6c 65 76 65 6c 20 3c 20 30 20 7c   if (level < 0 |
34b0: 7c 20 6c 65 76 65 6c 20 3e 3d 20 47 45 4f 4a 53  | level >= GEOJS
34c0: 4f 4e 5f 53 54 41 43 4b 29 0a 20 20 20 20 20 20  ON_STACK).      
34d0: 7b 0a 09 20 20 2a 65 72 72 6f 72 5f 6d 65 73 73  {..  *error_mess
34e0: 61 67 65 20 3d 0a 09 20 20 20 20 20 20 73 71 6c  age =..      sql
34f0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 47  ite3_mprintf ("G
3500: 65 6f 4a 53 4f 4e 20 70 6f 70 3a 20 66 6f 72 62  eoJSON pop: forb
3510: 69 64 64 65 6e 20 6e 65 73 74 69 6e 67 20 6c 65  idden nesting le
3520: 76 65 6c 20 25 64 5c 6e 22 2c 0a 09 09 09 20 20  vel %d\n",....  
3530: 20 20 20 20 20 6c 65 76 65 6c 29 3b 0a 09 20 20       level);..  
3540: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
3550: 7d 0a 20 20 20 20 69 66 20 28 6c 65 76 65 6c 20  }.    if (level 
3560: 21 3d 20 73 74 61 63 6b 2d 3e 6c 65 76 65 6c 29  != stack->level)
3570: 0a 20 20 20 20 20 20 7b 0a 09 20 20 2a 65 72 72  .      {..  *err
3580: 6f 72 5f 6d 65 73 73 61 67 65 20 3d 0a 09 20 20  or_message =..  
3590: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69      sqlite3_mpri
35a0: 6e 74 66 0a 09 20 20 20 20 20 20 28 22 47 65 6f  ntf..      ("Geo
35b0: 4a 53 4f 4e 20 70 6f 70 3a 20 75 6e 65 78 70 65  JSON pop: unexpe
35c0: 63 74 65 64 20 6e 65 73 74 69 6e 67 20 6c 65 76  cted nesting lev
35d0: 65 6c 20 25 64 20 28 25 64 29 5c 6e 22 2c 20 6c  el %d (%d)\n", l
35e0: 65 76 65 6c 2c 0a 09 20 20 20 20 20 20 20 73 74  evel,..       st
35f0: 61 63 6b 2d 3e 6c 65 76 65 6c 29 3b 0a 09 20 20  ack->level);..  
3600: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
3610: 7d 0a 20 20 20 20 70 5f 65 6e 74 72 79 20 3d 20  }.    p_entry = 
3620: 73 74 61 63 6b 2d 3e 65 6e 74 72 69 65 73 20 2b  stack->entries +
3630: 20 6c 65 76 65 6c 3b 0a 20 20 20 20 69 66 20 28   level;.    if (
3640: 70 5f 65 6e 74 72 79 2d 3e 6f 62 6a 20 3d 3d 20  p_entry->obj == 
3650: 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20  NULL).      {.. 
3660: 20 2a 65 72 72 6f 72 5f 6d 65 73 73 61 67 65 20   *error_message 
3670: 3d 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65 33  =..      sqlite3
3680: 5f 6d 70 72 69 6e 74 66 0a 09 20 20 20 20 20 20  _mprintf..      
3690: 28 22 47 65 6f 4a 53 4f 4e 20 70 6f 70 3a 20 75  ("GeoJSON pop: u
36a0: 6e 65 78 70 65 63 74 65 64 20 75 6e 69 6e 69 74  nexpected uninit
36b0: 69 61 6c 69 7a 65 64 20 6c 65 76 65 6c 20 25 64  ialized level %d
36c0: 5c 6e 22 2c 20 6c 65 76 65 6c 29 3b 0a 09 20 20  \n", level);..  
36d0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
36e0: 7d 0a 20 20 20 20 70 5f 65 6e 74 72 79 2d 3e 6f  }.    p_entry->o
36f0: 62 6a 2d 3e 6f 66 66 73 65 74 5f 65 6e 64 20 3d  bj->offset_end =
3700: 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 69 66 20   offset;.    if 
3710: 28 73 74 72 63 61 73 65 63 6d 70 20 28 70 5f 65  (strcasecmp (p_e
3720: 6e 74 72 79 2d 3e 6f 62 6a 2d 3e 70 61 72 65 6e  ntry->obj->paren
3730: 74 5f 6b 65 79 2c 20 22 70 72 6f 70 65 72 74 69  t_key, "properti
3740: 65 73 22 29 20 3d 3d 20 30 29 0a 09 70 5f 65 6e  es") == 0)..p_en
3750: 74 72 79 2d 3e 6f 62 6a 2d 3e 74 79 70 65 20 3d  try->obj->type =
3760: 20 47 45 4f 4a 53 4f 4e 5f 50 52 4f 50 45 52 54   GEOJSON_PROPERT
3770: 49 45 53 3b 0a 20 20 20 20 70 6b 76 20 3d 20 70  IES;.    pkv = p
3780: 5f 65 6e 74 72 79 2d 3e 66 69 72 73 74 3b 0a 20  _entry->first;. 
3790: 20 20 20 69 66 20 28 70 6b 76 20 21 3d 20 4e 55     if (pkv != NU
37a0: 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69  LL).      {..  i
37b0: 66 20 28 70 6b 76 2d 3e 6b 65 79 20 21 3d 20 4e  f (pkv->key != N
37c0: 55 4c 4c 29 0a 09 20 20 20 20 7b 0a 09 09 69 66  ULL)..    {...if
37d0: 20 28 73 74 72 63 61 73 65 63 6d 70 20 28 70 6b   (strcasecmp (pk
37e0: 76 2d 3e 6b 65 79 2c 20 22 74 79 70 65 22 29 20  v->key, "type") 
37f0: 3d 3d 20 30 29 0a 09 09 20 20 7b 0a 09 09 20 20  == 0)...  {...  
3800: 20 20 20 20 69 66 20 28 70 6b 76 2d 3e 76 61 6c      if (pkv->val
3810: 75 65 20 21 3d 20 4e 55 4c 4c 29 0a 09 09 09 7b  ue != NULL)....{
3820: 0a 09 09 09 20 20 20 20 69 66 20 28 73 74 72 63  ....    if (strc
3830: 61 73 65 63 6d 70 20 28 70 6b 76 2d 3e 76 61 6c  asecmp (pkv->val
3840: 75 65 2c 20 22 46 65 61 74 75 72 65 43 6f 6c 6c  ue, "FeatureColl
3850: 65 63 74 69 6f 6e 22 29 20 3d 3d 0a 09 09 09 09  ection") ==.....
3860: 30 29 0a 09 09 09 09 70 5f 65 6e 74 72 79 2d 3e  0).....p_entry->
3870: 6f 62 6a 2d 3e 74 79 70 65 20 3d 20 47 45 4f 4a  obj->type = GEOJ
3880: 53 4f 4e 5f 46 43 4f 4c 4c 45 43 54 49 4f 4e 3b  SON_FCOLLECTION;
3890: 0a 09 09 09 20 20 20 20 69 66 20 28 73 74 72 63  ....    if (strc
38a0: 61 73 65 63 6d 70 20 28 70 6b 76 2d 3e 76 61 6c  asecmp (pkv->val
38b0: 75 65 2c 20 22 46 65 61 74 75 72 65 22 29 20 3d  ue, "Feature") =
38c0: 3d 20 30 29 0a 09 09 09 09 70 5f 65 6e 74 72 79  = 0).....p_entry
38d0: 2d 3e 6f 62 6a 2d 3e 74 79 70 65 20 3d 20 47 45  ->obj->type = GE
38e0: 4f 4a 53 4f 4e 5f 46 45 41 54 55 52 45 3b 0a 09  OJSON_FEATURE;..
38f0: 09 09 20 20 20 20 69 66 20 28 73 74 72 63 61 73  ..    if (strcas
3900: 65 63 6d 70 0a 09 09 09 09 28 70 5f 65 6e 74 72  ecmp.....(p_entr
3910: 79 2d 3e 6f 62 6a 2d 3e 70 61 72 65 6e 74 5f 6b  y->obj->parent_k
3920: 65 79 2c 20 22 67 65 6f 6d 65 74 72 79 22 29 20  ey, "geometry") 
3930: 3d 3d 20 30 29 0a 09 09 09 20 20 20 20 20 20 7b  == 0)....      {
3940: 0a 09 09 09 09 20 20 69 66 20 28 73 74 72 63 61  .....  if (strca
3950: 73 65 63 6d 70 20 28 70 6b 76 2d 3e 76 61 6c 75  secmp (pkv->valu
3960: 65 2c 20 22 50 6f 69 6e 74 22 29 20 3d 3d 20 30  e, "Point") == 0
3970: 29 0a 09 09 09 09 20 20 20 20 20 20 70 5f 65 6e  ).....      p_en
3980: 74 72 79 2d 3e 6f 62 6a 2d 3e 74 79 70 65 20 3d  try->obj->type =
3990: 20 47 45 4f 4a 53 4f 4e 5f 50 4f 49 4e 54 3b 0a   GEOJSON_POINT;.
39a0: 09 09 09 09 20 20 69 66 20 28 73 74 72 63 61 73  ....  if (strcas
39b0: 65 63 6d 70 20 28 70 6b 76 2d 3e 76 61 6c 75 65  ecmp (pkv->value
39c0: 2c 20 22 4c 69 6e 65 53 74 72 69 6e 67 22 29 20  , "LineString") 
39d0: 3d 3d 0a 09 09 09 09 20 20 20 20 20 20 30 29 0a  ==.....      0).
39e0: 09 09 09 09 20 20 20 20 20 20 70 5f 65 6e 74 72  ....      p_entr
39f0: 79 2d 3e 6f 62 6a 2d 3e 74 79 70 65 20 3d 20 47  y->obj->type = G
3a00: 45 4f 4a 53 4f 4e 5f 4c 49 4e 45 53 54 52 49 4e  EOJSON_LINESTRIN
3a10: 47 3b 0a 09 09 09 09 20 20 69 66 20 28 73 74 72  G;.....  if (str
3a20: 63 61 73 65 63 6d 70 20 28 70 6b 76 2d 3e 76 61  casecmp (pkv->va
3a30: 6c 75 65 2c 20 22 50 6f 6c 79 67 6f 6e 22 29 20  lue, "Polygon") 
3a40: 3d 3d 20 30 29 0a 09 09 09 09 20 20 20 20 20 20  == 0).....      
3a50: 70 5f 65 6e 74 72 79 2d 3e 6f 62 6a 2d 3e 74 79  p_entry->obj->ty
3a60: 70 65 20 3d 20 47 45 4f 4a 53 4f 4e 5f 50 4f 4c  pe = GEOJSON_POL
3a70: 59 47 4f 4e 3b 0a 09 09 09 09 20 20 69 66 20 28  YGON;.....  if (
3a80: 73 74 72 63 61 73 65 63 6d 70 20 28 70 6b 76 2d  strcasecmp (pkv-
3a90: 3e 76 61 6c 75 65 2c 20 22 4d 75 6c 74 69 50 6f  >value, "MultiPo
3aa0: 69 6e 74 22 29 20 3d 3d 0a 09 09 09 09 20 20 20  int") ==.....   
3ab0: 20 20 20 30 29 0a 09 09 09 09 20 20 20 20 20 20     0).....      
3ac0: 70 5f 65 6e 74 72 79 2d 3e 6f 62 6a 2d 3e 74 79  p_entry->obj->ty
3ad0: 70 65 20 3d 20 47 45 4f 4a 53 4f 4e 5f 4d 55 4c  pe = GEOJSON_MUL
3ae0: 54 49 50 4f 49 4e 54 3b 0a 09 09 09 09 20 20 69  TIPOINT;.....  i
3af0: 66 20 28 73 74 72 63 61 73 65 63 6d 70 20 28 70  f (strcasecmp (p
3b00: 6b 76 2d 3e 76 61 6c 75 65 2c 20 22 4d 75 6c 74  kv->value, "Mult
3b10: 69 4c 69 6e 65 53 74 72 69 6e 67 22 29 0a 09 09  iLineString")...
3b20: 09 09 20 20 20 20 20 20 3d 3d 20 30 29 0a 09 09  ..      == 0)...
3b30: 09 09 20 20 20 20 20 20 70 5f 65 6e 74 72 79 2d  ..      p_entry-
3b40: 3e 6f 62 6a 2d 3e 74 79 70 65 20 3d 0a 09 09 09  >obj->type =....
3b50: 09 09 20 20 47 45 4f 4a 53 4f 4e 5f 4d 55 4c 54  ..  GEOJSON_MULT
3b60: 49 4c 49 4e 45 53 54 52 49 4e 47 3b 0a 09 09 09  ILINESTRING;....
3b70: 09 20 20 69 66 20 28 73 74 72 63 61 73 65 63 6d  .  if (strcasecm
3b80: 70 20 28 70 6b 76 2d 3e 76 61 6c 75 65 2c 20 22  p (pkv->value, "
3b90: 4d 75 6c 74 69 50 6f 6c 79 67 6f 6e 22 29 20 3d  MultiPolygon") =
3ba0: 3d 0a 09 09 09 09 20 20 20 20 20 20 30 29 0a 09  =.....      0)..
3bb0: 09 09 09 20 20 20 20 20 20 70 5f 65 6e 74 72 79  ...      p_entry
3bc0: 2d 3e 6f 62 6a 2d 3e 74 79 70 65 20 3d 20 47 45  ->obj->type = GE
3bd0: 4f 4a 53 4f 4e 5f 4d 55 4c 54 49 50 4f 4c 59 47  OJSON_MULTIPOLYG
3be0: 4f 4e 3b 0a 09 09 09 09 20 20 69 66 20 28 73 74  ON;.....  if (st
3bf0: 72 63 61 73 65 63 6d 70 0a 09 09 09 09 20 20 20  rcasecmp.....   
3c00: 20 20 20 28 70 6b 76 2d 3e 76 61 6c 75 65 2c 20     (pkv->value, 
3c10: 22 47 65 6f 6d 65 74 72 79 43 6f 6c 6c 65 63 74  "GeometryCollect
3c20: 69 6f 6e 22 29 20 3d 3d 20 30 29 0a 09 09 09 09  ion") == 0).....
3c30: 20 20 20 20 20 20 70 5f 65 6e 74 72 79 2d 3e 6f        p_entry->o
3c40: 62 6a 2d 3e 74 79 70 65 20 3d 0a 09 09 09 09 09  bj->type =......
3c50: 20 20 47 45 4f 4a 53 4f 4e 5f 47 45 4f 4d 43 4f    GEOJSON_GEOMCO
3c60: 4c 4c 45 43 54 49 4f 4e 3b 0a 09 09 09 20 20 20  LLECTION;....   
3c70: 20 20 20 7d 0a 09 09 09 7d 0a 09 09 20 20 7d 0a     }....}...  }.
3c80: 09 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20  .    }.      }. 
3c90: 20 20 20 69 66 20 28 70 5f 65 6e 74 72 79 2d 3e     if (p_entry->
3ca0: 6f 62 6a 2d 3e 74 79 70 65 20 3d 3d 20 47 45 4f  obj->type == GEO
3cb0: 4a 53 4f 4e 5f 46 45 41 54 55 52 45 29 0a 20 20  JSON_FEATURE).  
3cc0: 20 20 20 20 7b 0a 09 20 20 70 6b 76 20 3d 20 70      {..  pkv = p
3cd0: 5f 65 6e 74 72 79 2d 3e 66 69 72 73 74 3b 0a 09  _entry->first;..
3ce0: 20 20 77 68 69 6c 65 20 28 70 6b 76 20 21 3d 20    while (pkv != 
3cf0: 4e 55 4c 4c 29 0a 09 20 20 20 20 7b 0a 09 09 69  NULL)..    {...i
3d00: 66 20 28 73 74 72 63 61 73 65 63 6d 70 20 28 70  f (strcasecmp (p
3d10: 6b 76 2d 3e 6b 65 79 2c 20 22 67 65 6f 6d 65 74  kv->key, "geomet
3d20: 72 79 22 29 20 3d 3d 20 30 0a 09 09 20 20 20 20  ry") == 0...    
3d30: 26 26 20 70 6b 76 2d 3e 76 61 6c 75 65 20 3d 3d  && pkv->value ==
3d40: 20 4e 55 4c 4c 29 0a 09 09 20 20 20 20 70 5f 65   NULL)...    p_e
3d50: 6e 74 72 79 2d 3e 6f 62 6a 2d 3e 67 65 6f 6d 65  ntry->obj->geome
3d60: 74 72 79 20 2b 3d 20 31 3b 0a 09 09 69 66 20 28  try += 1;...if (
3d70: 73 74 72 63 61 73 65 63 6d 70 20 28 70 6b 76 2d  strcasecmp (pkv-
3d80: 3e 6b 65 79 2c 20 22 70 72 6f 70 65 72 74 69 65  >key, "propertie
3d90: 73 22 29 20 3d 3d 20 30 0a 09 09 20 20 20 20 26  s") == 0...    &
3da0: 26 20 70 6b 76 2d 3e 76 61 6c 75 65 20 3d 3d 20  & pkv->value == 
3db0: 4e 55 4c 4c 29 0a 09 09 20 20 20 20 70 5f 65 6e  NULL)...    p_en
3dc0: 74 72 79 2d 3e 6f 62 6a 2d 3e 70 72 6f 70 65 72  try->obj->proper
3dd0: 74 69 65 73 20 2b 3d 20 31 3b 0a 09 09 70 6b 76  ties += 1;...pkv
3de0: 20 3d 20 70 6b 76 2d 3e 6e 65 78 74 3b 0a 09 20   = pkv->next;.. 
3df0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 2f 2a     }.      }../*
3e00: 20 72 65 73 65 74 74 69 6e 67 20 74 68 65 20 4b   resetting the K
3e10: 65 79 2d 56 61 6c 75 65 20 6c 69 73 74 20 2a 2f  ey-Value list */
3e20: 0a 20 20 20 20 70 6b 76 20 3d 20 70 5f 65 6e 74  .    pkv = p_ent
3e30: 72 79 2d 3e 66 69 72 73 74 3b 0a 20 20 20 20 77  ry->first;.    w
3e40: 68 69 6c 65 20 28 70 6b 76 20 21 3d 20 4e 55 4c  hile (pkv != NUL
3e50: 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 67 65  L).      {..  ge
3e60: 6f 6a 73 6f 6e 5f 6b 65 79 76 61 6c 5f 70 74 72  ojson_keyval_ptr
3e70: 20 70 6e 20 3d 20 70 6b 76 2d 3e 6e 65 78 74 3b   pn = pkv->next;
3e80: 0a 09 20 20 69 66 20 28 70 6b 76 2d 3e 6b 65 79  ..  if (pkv->key
3e90: 20 21 3d 20 4e 55 4c 4c 29 0a 09 20 20 20 20 20   != NULL)..     
3ea0: 20 66 72 65 65 20 28 70 6b 76 2d 3e 6b 65 79 29   free (pkv->key)
3eb0: 3b 0a 09 20 20 69 66 20 28 70 6b 76 2d 3e 76 61  ;..  if (pkv->va
3ec0: 6c 75 65 20 21 3d 20 4e 55 4c 4c 29 0a 09 20 20  lue != NULL)..  
3ed0: 20 20 20 20 66 72 65 65 20 28 70 6b 76 2d 3e 76      free (pkv->v
3ee0: 61 6c 75 65 29 3b 0a 09 20 20 66 72 65 65 20 28  alue);..  free (
3ef0: 70 6b 76 29 3b 0a 09 20 20 70 6b 76 20 3d 20 70  pkv);..  pkv = p
3f00: 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 70  n;.      }.    p
3f10: 5f 65 6e 74 72 79 2d 3e 66 69 72 73 74 20 3d 20  _entry->first = 
3f20: 4e 55 4c 4c 3b 0a 20 20 20 20 70 5f 65 6e 74 72  NULL;.    p_entr
3f30: 79 2d 3e 6c 61 73 74 20 3d 20 4e 55 4c 4c 3b 0a  y->last = NULL;.
3f40: 0a 2f 2a 20 72 65 73 65 74 74 69 6e 67 20 74 68  ./* resetting th
3f50: 65 20 73 74 61 63 6b 20 65 6e 74 72 79 20 2a 2f  e stack entry */
3f60: 0a 20 20 20 20 70 5f 65 6e 74 72 79 2d 3e 6f 62  .    p_entry->ob
3f70: 6a 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 6d 65  j = NULL;.    me
3f80: 6d 73 65 74 20 28 73 74 61 63 6b 2d 3e 6b 65 79  mset (stack->key
3f90: 2c 20 27 5c 30 27 2c 20 47 45 4f 4a 53 4f 4e 5f  , '\0', GEOJSON_
3fa0: 4d 41 58 29 3b 0a 20 20 20 20 73 74 61 63 6b 2d  MAX);.    stack-
3fb0: 3e 6b 65 79 5f 69 64 78 20 3d 20 30 3b 0a 20 20  >key_idx = 0;.  
3fc0: 20 20 6d 65 6d 73 65 74 20 28 73 74 61 63 6b 2d    memset (stack-
3fd0: 3e 76 61 6c 75 65 2c 20 27 5c 30 27 2c 20 47 45  >value, '\0', GE
3fe0: 4f 4a 53 4f 4e 5f 4d 41 58 29 3b 0a 20 20 20 20  OJSON_MAX);.    
3ff0: 73 74 61 63 6b 2d 3e 76 61 6c 75 65 5f 69 64 78  stack->value_idx
4000: 20 3d 20 30 3b 0a 20 20 20 20 6d 65 6d 73 65 74   = 0;.    memset
4010: 20 28 73 74 61 63 6b 2d 3e 6e 75 6d 76 61 6c 75   (stack->numvalu
4020: 65 2c 20 27 5c 30 27 2c 20 47 45 4f 4a 53 4f 4e  e, '\0', GEOJSON
4030: 5f 4d 41 58 29 3b 0a 20 20 20 20 73 74 61 63 6b  _MAX);.    stack
4040: 2d 3e 6e 75 6d 76 61 6c 75 65 5f 69 64 78 20 3d  ->numvalue_idx =
4050: 20 30 3b 0a 20 20 20 20 73 74 61 63 6b 2d 3e 6c   0;.    stack->l
4060: 65 76 65 6c 20 2d 3d 20 31 3b 0a 20 20 20 20 72  evel -= 1;.    r
4070: 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 73 74 61 74  eturn 1;.}..stat
4080: 69 63 20 67 65 6f 6a 73 6f 6e 5f 65 6e 74 72 79  ic geojson_entry
4090: 5f 70 74 72 0a 67 65 6f 6a 73 6f 6e 5f 61 64 64  _ptr.geojson_add
40a0: 5f 6f 62 6a 65 63 74 20 28 67 65 6f 6a 73 6f 6e  _object (geojson
40b0: 5f 62 6c 6f 63 6b 5f 70 74 72 20 62 6c 6f 63 6b  _block_ptr block
40c0: 2c 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c 0a 09  , long offset,..
40d0: 09 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
40e0: 2a 70 61 72 65 6e 74 5f 6b 65 79 29 0a 7b 0a 2f  *parent_key).{./
40f0: 2a 20 61 64 64 69 6e 67 20 61 20 6e 65 77 20 47  * adding a new G
4100: 65 6f 4a 53 4f 4e 20 6f 62 6a 65 63 74 20 2a 2f  eoJSON object */
4110: 0a 20 20 20 20 67 65 6f 6a 73 6f 6e 5f 65 6e 74  .    geojson_ent
4120: 72 79 5f 70 74 72 20 65 6e 74 72 79 3b 0a 20 20  ry_ptr entry;.  
4130: 20 20 69 66 20 28 62 6c 6f 63 6b 2d 3e 6e 65 78    if (block->nex
4140: 74 5f 66 72 65 65 5f 65 6e 74 72 79 20 3c 20 30  t_free_entry < 0
4150: 20 7c 7c 20 62 6c 6f 63 6b 2d 3e 6e 65 78 74 5f   || block->next_
4160: 66 72 65 65 5f 65 6e 74 72 79 20 3e 3d 20 47 45  free_entry >= GE
4170: 4f 4a 53 4f 4e 5f 42 4c 4f 43 4b 29 0a 09 72 65  OJSON_BLOCK)..re
4180: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 65  turn NULL;.    e
4190: 6e 74 72 79 20 3d 20 62 6c 6f 63 6b 2d 3e 65 6e  ntry = block->en
41a0: 74 72 69 65 73 20 2b 20 62 6c 6f 63 6b 2d 3e 6e  tries + block->n
41b0: 65 78 74 5f 66 72 65 65 5f 65 6e 74 72 79 3b 0a  ext_free_entry;.
41c0: 20 20 20 20 62 6c 6f 63 6b 2d 3e 6e 65 78 74 5f      block->next_
41d0: 66 72 65 65 5f 65 6e 74 72 79 20 2b 3d 20 31 3b  free_entry += 1;
41e0: 0a 20 20 20 20 65 6e 74 72 79 2d 3e 74 79 70 65  .    entry->type
41f0: 20 3d 20 47 45 4f 4a 53 4f 4e 5f 55 4e 4b 4e 4f   = GEOJSON_UNKNO
4200: 57 4e 3b 0a 20 20 20 20 69 66 20 28 65 6e 74 72  WN;.    if (entr
4210: 79 2d 3e 70 61 72 65 6e 74 5f 6b 65 79 20 21 3d  y->parent_key !=
4220: 20 4e 55 4c 4c 29 0a 09 66 72 65 65 20 28 65 6e   NULL)..free (en
4230: 74 72 79 2d 3e 70 61 72 65 6e 74 5f 6b 65 79 29  try->parent_key)
4240: 3b 0a 20 20 20 20 65 6e 74 72 79 2d 3e 70 61 72  ;.    entry->par
4250: 65 6e 74 5f 6b 65 79 20 3d 20 4e 55 4c 4c 3b 0a  ent_key = NULL;.
4260: 20 20 20 20 69 66 20 28 70 61 72 65 6e 74 5f 6b      if (parent_k
4270: 65 79 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20  ey != NULL).    
4280: 20 20 7b 0a 09 20 20 69 6e 74 20 6c 65 6e 20 3d    {..  int len =
4290: 20 73 74 72 6c 65 6e 20 28 70 61 72 65 6e 74 5f   strlen (parent_
42a0: 6b 65 79 29 3b 0a 09 20 20 65 6e 74 72 79 2d 3e  key);..  entry->
42b0: 70 61 72 65 6e 74 5f 6b 65 79 20 3d 20 6d 61 6c  parent_key = mal
42c0: 6c 6f 63 20 28 6c 65 6e 20 2b 20 31 29 3b 0a 09  loc (len + 1);..
42d0: 20 20 73 74 72 63 70 79 20 28 65 6e 74 72 79 2d    strcpy (entry-
42e0: 3e 70 61 72 65 6e 74 5f 6b 65 79 2c 20 70 61 72  >parent_key, par
42f0: 65 6e 74 5f 6b 65 79 29 3b 0a 20 20 20 20 20 20  ent_key);.      
4300: 7d 0a 20 20 20 20 65 6e 74 72 79 2d 3e 6f 66 66  }.    entry->off
4310: 73 65 74 5f 73 74 61 72 74 20 3d 20 6f 66 66 73  set_start = offs
4320: 65 74 3b 0a 20 20 20 20 65 6e 74 72 79 2d 3e 6f  et;.    entry->o
4330: 66 66 73 65 74 5f 65 6e 64 20 3d 20 2d 31 3b 0a  ffset_end = -1;.
4340: 20 20 20 20 72 65 74 75 72 6e 20 65 6e 74 72 79      return entry
4350: 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 69 6e 74  ;.}...static int
4360: 0a 67 65 6f 6a 73 6f 6e 5f 73 74 61 72 74 5f 6f  .geojson_start_o
4370: 62 6a 65 63 74 20 28 67 65 6f 6a 73 6f 6e 5f 70  bject (geojson_p
4380: 61 72 73 65 72 5f 70 74 72 20 70 61 72 73 65 72  arser_ptr parser
4390: 2c 20 67 65 6f 6a 73 6f 6e 5f 73 74 61 63 6b 5f  , geojson_stack_
43a0: 70 74 72 20 73 74 61 63 6b 2c 0a 09 09 20 20 20  ptr stack,...   
43b0: 20 20 20 69 6e 74 20 6c 65 76 65 6c 2c 20 6c 6f     int level, lo
43c0: 6e 67 20 6f 66 66 73 65 74 2c 20 63 6f 6e 73 74  ng offset, const
43d0: 20 63 68 61 72 20 2a 70 61 72 65 6e 74 5f 6b 65   char *parent_ke
43e0: 79 2c 0a 09 09 20 20 20 20 20 20 63 68 61 72 20  y,...      char 
43f0: 2a 2a 65 72 72 6f 72 5f 6d 65 73 73 61 67 65 29  **error_message)
4400: 0a 7b 0a 2f 2a 20 72 65 67 69 73 74 65 72 69 6e  .{./* registerin
4410: 67 20 61 20 47 65 6f 4a 53 4f 4e 20 6f 62 6a 65  g a GeoJSON obje
4420: 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 78  ct */.    int ex
4430: 70 61 6e 64 20 3d 20 30 3b 0a 20 20 20 20 67 65  pand = 0;.    ge
4440: 6f 6a 73 6f 6e 5f 62 6c 6f 63 6b 5f 70 74 72 20  ojson_block_ptr 
4450: 62 6c 6f 63 6b 3b 0a 20 20 20 20 67 65 6f 6a 73  block;.    geojs
4460: 6f 6e 5f 65 6e 74 72 79 5f 70 74 72 20 65 6e 74  on_entry_ptr ent
4470: 72 79 3b 0a 0a 20 20 20 20 69 66 20 28 70 61 72  ry;..    if (par
4480: 73 65 72 2d 3e 6c 61 73 74 20 3d 3d 20 4e 55 4c  ser->last == NUL
4490: 4c 29 0a 09 65 78 70 61 6e 64 20 3d 20 31 3b 0a  L)..expand = 1;.
44a0: 20 20 20 20 65 6c 73 65 20 69 66 20 28 70 61 72      else if (par
44b0: 73 65 72 2d 3e 6c 61 73 74 2d 3e 6e 65 78 74 5f  ser->last->next_
44c0: 66 72 65 65 5f 65 6e 74 72 79 20 3e 3d 20 47 45  free_entry >= GE
44d0: 4f 4a 53 4f 4e 5f 42 4c 4f 43 4b 29 0a 09 65 78  OJSON_BLOCK)..ex
44e0: 70 61 6e 64 20 3d 20 31 3b 0a 20 20 20 20 69 66  pand = 1;.    if
44f0: 20 28 65 78 70 61 6e 64 29 0a 20 20 20 20 20 20   (expand).      
4500: 7b 0a 09 20 20 2f 2a 20 61 64 64 69 6e 67 20 61  {..  /* adding a
4510: 20 6e 65 77 20 47 65 6f 4a 53 4f 4e 20 42 6c 6f   new GeoJSON Blo
4520: 63 6b 20 74 6f 20 74 68 65 20 70 61 72 73 65 72  ck to the parser
4530: 27 73 20 6c 69 73 74 20 2a 2f 0a 09 20 20 62 6c  's list */..  bl
4540: 6f 63 6b 20 3d 20 67 65 6f 6a 73 6f 6e 5f 61 64  ock = geojson_ad
4550: 64 5f 62 6c 6f 63 6b 20 28 70 61 72 73 65 72 29  d_block (parser)
4560: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c  ;.      }.    el
4570: 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a  se.      {..  /*
4580: 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 69   continuing to i
4590: 6e 73 65 72 74 20 69 6e 74 6f 20 74 68 65 20 6c  nsert into the l
45a0: 61 73 74 20 42 6c 6f 63 6b 20 2a 2f 0a 09 20 20  ast Block */..  
45b0: 62 6c 6f 63 6b 20 3d 20 70 61 72 73 65 72 2d 3e  block = parser->
45c0: 6c 61 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  last;.      }.  
45d0: 20 20 69 66 20 28 62 6c 6f 63 6b 20 3d 3d 20 4e    if (block == N
45e0: 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  ULL).      {..  
45f0: 2a 65 72 72 6f 72 5f 6d 65 73 73 61 67 65 20 3d  *error_message =
4600: 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ..      sqlite3_
4610: 6d 70 72 69 6e 74 66 20 28 22 47 65 6f 4a 53 4f  mprintf ("GeoJSO
4620: 4e 20 73 74 61 72 74 5f 6f 62 6a 65 63 74 3a 20  N start_object: 
4630: 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 5c 6e 22 29  NULL pointer\n")
4640: 3b 0a 09 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  ;..  return 0;. 
4650: 20 20 20 20 20 7d 0a 20 20 20 20 65 6e 74 72 79       }.    entry
4660: 20 3d 20 67 65 6f 6a 73 6f 6e 5f 61 64 64 5f 6f   = geojson_add_o
4670: 62 6a 65 63 74 20 28 62 6c 6f 63 6b 2c 20 6f 66  bject (block, of
4680: 66 73 65 74 2c 20 70 61 72 65 6e 74 5f 6b 65 79  fset, parent_key
4690: 29 3b 0a 20 20 20 20 69 66 20 28 21 67 65 6f 6a  );.    if (!geoj
46a0: 73 6f 6e 5f 70 75 73 68 20 28 73 74 61 63 6b 2c  son_push (stack,
46b0: 20 65 6e 74 72 79 2c 20 6c 65 76 65 6c 2c 20 65   entry, level, e
46c0: 72 72 6f 72 5f 6d 65 73 73 61 67 65 29 29 0a 09  rror_message))..
46d0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 72 65  return 0;.    re
46e0: 74 75 72 6e 20 31 3b 0a 7d 0a 0a 73 74 61 74 69  turn 1;.}..stati
46f0: 63 20 69 6e 74 0a 67 65 6f 6a 73 6f 6e 5f 65 6e  c int.geojson_en
4700: 64 5f 6f 62 6a 65 63 74 20 28 67 65 6f 6a 73 6f  d_object (geojso
4710: 6e 5f 73 74 61 63 6b 5f 70 74 72 20 73 74 61 63  n_stack_ptr stac
4720: 6b 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 6c 6f  k, int level, lo
4730: 6e 67 20 6f 66 66 73 65 74 2c 0a 09 09 20 20 20  ng offset,...   
4740: 20 63 68 61 72 20 2a 2a 65 72 72 6f 72 5f 6d 65   char **error_me
4750: 73 73 61 67 65 29 0a 7b 0a 2f 2a 20 63 6f 6d 70  ssage).{./* comp
4760: 6c 65 74 69 6e 67 20 74 68 65 20 64 65 66 69 6e  leting the defin
4770: 69 74 69 6f 6e 20 6f 66 20 61 20 47 65 6f 4a 53  ition of a GeoJS
4780: 4f 4e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20  ON object */.   
4790: 20 69 66 20 28 21 67 65 6f 6a 73 6f 6e 5f 70 6f   if (!geojson_po
47a0: 70 20 28 73 74 61 63 6b 2c 20 6c 65 76 65 6c 2c  p (stack, level,
47b0: 20 6f 66 66 73 65 74 2c 20 65 72 72 6f 72 5f 6d   offset, error_m
47c0: 65 73 73 61 67 65 29 29 0a 09 72 65 74 75 72 6e  essage))..return
47d0: 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   0;.    return 1
47e0: 3b 0a 7d 0a 0a 53 50 41 54 49 41 4c 49 54 45 5f  ;.}..SPATIALITE_
47f0: 44 45 43 4c 41 52 45 20 67 65 6f 6a 73 6f 6e 5f  DECLARE geojson_
4800: 70 61 72 73 65 72 5f 70 74 72 0a 67 65 6f 6a 73  parser_ptr.geojs
4810: 6f 6e 5f 63 72 65 61 74 65 5f 70 61 72 73 65 72  on_create_parser
4820: 20 28 46 49 4c 45 20 2a 20 69 6e 29 0a 7b 0a 2f   (FILE * in).{./
4830: 2a 20 63 72 65 61 74 69 6e 67 20 61 6e 20 65 6d  * creating an em
4840: 70 74 79 20 47 65 6f 4a 53 4f 4e 20 70 61 72 73  pty GeoJSON pars
4850: 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20  er object */.   
4860: 20 67 65 6f 6a 73 6f 6e 5f 70 61 72 73 65 72 5f   geojson_parser_
4870: 70 74 72 20 70 74 72 20 3d 20 6d 61 6c 6c 6f 63  ptr ptr = malloc
4880: 20 28 73 69 7a 65 6f 66 20 28 67 65 6f 6a 73 6f   (sizeof (geojso
4890: 6e 5f 70 61 72 73 65 72 29 29 3b 0a 20 20 20 20  n_parser));.    
48a0: 70 74 72 2d 3e 69 6e 20 3d 20 69 6e 3b 0a 20 20  ptr->in = in;.  
48b0: 20 20 70 74 72 2d 3e 66 69 72 73 74 20 3d 20 4e    ptr->first = N
48c0: 55 4c 4c 3b 0a 20 20 20 20 70 74 72 2d 3e 6c 61  ULL;.    ptr->la
48d0: 73 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 70  st = NULL;.    p
48e0: 74 72 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20  tr->count = 0;. 
48f0: 20 20 20 70 74 72 2d 3e 66 65 61 74 75 72 65 73     ptr->features
4900: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 70 74 72   = NULL;.    ptr
4910: 2d 3e 66 69 72 73 74 5f 63 6f 6c 20 3d 20 4e 55  ->first_col = NU
4920: 4c 4c 3b 0a 20 20 20 20 70 74 72 2d 3e 6c 61 73  LL;.    ptr->las
4930: 74 5f 63 6f 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20  t_col = NULL;.  
4940: 20 20 70 74 72 2d 3e 6e 5f 70 6f 69 6e 74 73 20    ptr->n_points 
4950: 3d 20 30 3b 0a 20 20 20 20 70 74 72 2d 3e 6e 5f  = 0;.    ptr->n_
4960: 6c 69 6e 65 73 74 72 69 6e 67 73 20 3d 20 30 3b  linestrings = 0;
4970: 0a 20 20 20 20 70 74 72 2d 3e 6e 5f 70 6f 6c 79  .    ptr->n_poly
4980: 67 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 70 74  gons = 0;.    pt
4990: 72 2d 3e 6e 5f 6d 70 6f 69 6e 74 73 20 3d 20 30  r->n_mpoints = 0
49a0: 3b 0a 20 20 20 20 70 74 72 2d 3e 6e 5f 6d 6c 69  ;.    ptr->n_mli
49b0: 6e 65 73 74 72 69 6e 67 73 20 3d 20 30 3b 0a 20  nestrings = 0;. 
49c0: 20 20 20 70 74 72 2d 3e 6e 5f 6d 70 6f 6c 79 67     ptr->n_mpolyg
49d0: 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 70 74 72  ons = 0;.    ptr
49e0: 2d 3e 6e 5f 67 65 6f 6d 63 6f 6c 6c 73 20 3d 20  ->n_geomcolls = 
49f0: 30 3b 0a 20 20 20 20 70 74 72 2d 3e 6e 5f 67 65  0;.    ptr->n_ge
4a00: 6f 6d 5f 32 64 20 3d 20 30 3b 0a 20 20 20 20 70  om_2d = 0;.    p
4a10: 74 72 2d 3e 6e 5f 67 65 6f 6d 5f 33 64 20 3d 20  tr->n_geom_3d = 
4a20: 30 3b 0a 20 20 20 20 70 74 72 2d 3e 6e 5f 67 65  0;.    ptr->n_ge
4a30: 6f 6d 5f 34 64 20 3d 20 30 3b 0a 20 20 20 20 2a  om_4d = 0;.    *
4a40: 28 70 74 72 2d 3e 63 61 73 74 5f 74 79 70 65 29  (ptr->cast_type)
4a50: 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 2a 28 70   = '\0';.    *(p
4a60: 74 72 2d 3e 63 61 73 74 5f 64 69 6d 73 29 20 3d  tr->cast_dims) =
4a70: 20 27 5c 30 27 3b 0a 20 20 20 20 72 65 74 75 72   '\0';.    retur
4a80: 6e 20 70 74 72 3b 0a 7d 0a 0a 53 50 41 54 49 41  n ptr;.}..SPATIA
4a90: 4c 49 54 45 5f 44 45 43 4c 41 52 45 20 76 6f 69  LITE_DECLARE voi
4aa0: 64 0a 67 65 6f 6a 73 6f 6e 5f 64 65 73 74 72 6f  d.geojson_destro
4ab0: 79 5f 70 61 72 73 65 72 20 28 67 65 6f 6a 73 6f  y_parser (geojso
4ac0: 6e 5f 70 61 72 73 65 72 5f 70 74 72 20 70 74 72  n_parser_ptr ptr
4ad0: 29 0a 7b 0a 2f 2a 20 6d 65 6d 6f 72 79 20 63 6c  ).{./* memory cl
4ae0: 65 61 6e 75 70 20 2d 20 64 65 73 74 72 6f 79 69  eanup - destroyi
4af0: 6e 67 20 61 20 47 65 6f 4a 53 4f 4e 20 70 61 72  ng a GeoJSON par
4b00: 73 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ser object */.  
4b10: 20 20 67 65 6f 6a 73 6f 6e 5f 62 6c 6f 63 6b 5f    geojson_block_
4b20: 70 74 72 20 70 62 3b 0a 20 20 20 20 67 65 6f 6a  ptr pb;.    geoj
4b30: 73 6f 6e 5f 62 6c 6f 63 6b 5f 70 74 72 20 70 62  son_block_ptr pb
4b40: 6e 3b 0a 20 20 20 20 67 65 6f 6a 73 6f 6e 5f 63  n;.    geojson_c
4b50: 6f 6c 75 6d 6e 5f 70 74 72 20 70 63 3b 0a 20 20  olumn_ptr pc;.  
4b60: 20 20 67 65 6f 6a 73 6f 6e 5f 63 6f 6c 75 6d 6e    geojson_column
4b70: 5f 70 74 72 20 70 63 6e 3b 0a 20 20 20 20 69 6e  _ptr pcn;.    in
4b80: 74 20 69 3b 0a 20 20 20 20 69 66 20 28 70 74 72  t i;.    if (ptr
4b90: 20 3d 3d 20 4e 55 4c 4c 29 0a 09 72 65 74 75 72   == NULL)..retur
4ba0: 6e 3b 0a 20 20 20 20 70 62 20 3d 20 70 74 72 2d  n;.    pb = ptr-
4bb0: 3e 66 69 72 73 74 3b 0a 20 20 20 20 77 68 69 6c  >first;.    whil
4bc0: 65 20 28 70 62 20 21 3d 20 4e 55 4c 4c 29 0a 20  e (pb != NULL). 
4bd0: 20 20 20 20 20 7b 0a 09 20 20 70 62 6e 20 3d 20       {..  pbn = 
4be0: 70 62 2d 3e 6e 65 78 74 3b 0a 09 20 20 66 72 65  pb->next;..  fre
4bf0: 65 20 28 70 62 29 3b 0a 09 20 20 70 62 20 3d 20  e (pb);..  pb = 
4c00: 70 62 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pbn;.      }.   
4c10: 20 70 63 20 3d 20 70 74 72 2d 3e 66 69 72 73 74   pc = ptr->first
4c20: 5f 63 6f 6c 3b 0a 20 20 20 20 77 68 69 6c 65 20  _col;.    while 
4c30: 28 70 63 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20  (pc != NULL).   
4c40: 20 20 20 7b 0a 09 20 20 70 63 6e 20 3d 20 70 63     {..  pcn = pc
4c50: 2d 3e 6e 65 78 74 3b 0a 09 20 20 69 66 20 28 70  ->next;..  if (p
4c60: 63 2d 3e 6e 61 6d 65 20 21 3d 20 4e 55 4c 4c 29  c->name != NULL)
4c70: 0a 09 20 20 20 20 20 20 66 72 65 65 20 28 70 63  ..      free (pc
4c80: 2d 3e 6e 61 6d 65 29 3b 0a 09 20 20 66 72 65 65  ->name);..  free
4c90: 20 28 70 63 29 3b 0a 09 20 20 70 63 20 3d 20 70   (pc);..  pc = p
4ca0: 63 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  cn;.      }.    
4cb0: 69 66 20 28 70 74 72 2d 3e 66 65 61 74 75 72 65  if (ptr->feature
4cc0: 73 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20  s != NULL).     
4cd0: 20 7b 0a 09 20 20 66 6f 72 20 28 69 20 3d 20 30   {..  for (i = 0
4ce0: 3b 20 69 20 3c 20 70 74 72 2d 3e 63 6f 75 6e 74  ; i < ptr->count
4cf0: 3b 20 69 2b 2b 29 0a 09 20 20 20 20 7b 0a 09 09  ; i++)..    {...
4d00: 67 65 6f 6a 73 6f 6e 5f 70 72 6f 70 65 72 74 79  geojson_property
4d10: 5f 70 74 72 20 70 70 3b 0a 09 09 67 65 6f 6a 73  _ptr pp;...geojs
4d20: 6f 6e 5f 66 65 61 74 75 72 65 5f 70 74 72 20 70  on_feature_ptr p
4d30: 66 20 3d 20 70 74 72 2d 3e 66 65 61 74 75 72 65  f = ptr->feature
4d40: 73 20 2b 20 69 3b 0a 09 09 69 66 20 28 70 66 2d  s + i;...if (pf-
4d50: 3e 67 65 6f 6d 65 74 72 79 20 21 3d 20 4e 55 4c  >geometry != NUL
4d60: 4c 29 0a 09 09 20 20 20 20 66 72 65 65 20 28 70  L)...    free (p
4d70: 66 2d 3e 67 65 6f 6d 65 74 72 79 29 3b 0a 09 09  f->geometry);...
4d80: 70 70 20 3d 20 70 66 2d 3e 66 69 72 73 74 3b 0a  pp = pf->first;.
4d90: 09 09 77 68 69 6c 65 20 28 70 70 20 21 3d 20 4e  ..while (pp != N
4da0: 55 4c 4c 29 0a 09 09 20 20 7b 0a 09 09 20 20 20  ULL)...  {...   
4db0: 20 20 20 67 65 6f 6a 73 6f 6e 5f 70 72 6f 70 65     geojson_prope
4dc0: 72 74 79 5f 70 74 72 20 70 70 6e 20 3d 20 70 70  rty_ptr ppn = pp
4dd0: 2d 3e 6e 65 78 74 3b 0a 09 09 20 20 20 20 20 20  ->next;...      
4de0: 69 66 20 28 70 70 2d 3e 6e 61 6d 65 20 21 3d 20  if (pp->name != 
4df0: 4e 55 4c 4c 29 0a 09 09 09 20 20 66 72 65 65 20  NULL)....  free 
4e00: 28 70 70 2d 3e 6e 61 6d 65 29 3b 0a 09 09 20 20  (pp->name);...  
4e10: 20 20 20 20 69 66 20 28 70 70 2d 3e 74 78 74 5f      if (pp->txt_
4e20: 76 61 6c 75 65 20 21 3d 20 4e 55 4c 4c 29 0a 09  value != NULL)..
4e30: 09 09 20 20 66 72 65 65 20 28 70 70 2d 3e 74 78  ..  free (pp->tx
4e40: 74 5f 76 61 6c 75 65 29 3b 0a 09 09 20 20 20 20  t_value);...    
4e50: 20 20 66 72 65 65 20 28 70 70 29 3b 0a 09 09 20    free (pp);... 
4e60: 20 20 20 20 20 70 70 20 3d 20 70 70 6e 3b 0a 09       pp = ppn;..
4e70: 09 20 20 7d 0a 09 20 20 20 20 7d 0a 09 20 20 66  .  }..    }..  f
4e80: 72 65 65 20 28 70 74 72 2d 3e 66 65 61 74 75 72  ree (ptr->featur
4e90: 65 73 29 3b 0a 20 20 20 20 20 20 7d 0a 2f 2a 20  es);.      }./* 
4ea0: 63 6c 6f 73 65 20 74 68 65 20 47 65 6f 4a 53 4f  close the GeoJSO
4eb0: 4e 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f  N file handle */
4ec0: 0a 20 20 20 20 69 66 20 28 70 74 72 2d 3e 69 6e  .    if (ptr->in
4ed0: 20 21 3d 20 4e 55 4c 4c 29 0a 09 66 63 6c 6f 73   != NULL)..fclos
4ee0: 65 20 28 70 74 72 2d 3e 69 6e 29 3b 0a 20 20 20  e (ptr->in);.   
4ef0: 20 66 72 65 65 20 28 70 74 72 29 3b 0a 7d 0a 0a   free (ptr);.}..
4f00: 53 50 41 54 49 41 4c 49 54 45 5f 44 45 43 4c 41  SPATIALITE_DECLA
4f10: 52 45 20 69 6e 74 0a 67 65 6f 6a 73 6f 6e 5f 70  RE int.geojson_p
4f20: 61 72 73 65 72 5f 69 6e 69 74 20 28 67 65 6f 6a  arser_init (geoj
4f30: 73 6f 6e 5f 70 61 72 73 65 72 5f 70 74 72 20 70  son_parser_ptr p
4f40: 61 72 73 65 72 2c 20 63 68 61 72 20 2a 2a 65 72  arser, char **er
4f50: 72 6f 72 5f 6d 65 73 73 61 67 65 29 0a 7b 0a 2f  ror_message).{./
4f60: 2a 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  * initializing t
4f70: 68 65 20 47 65 6f 4a 53 4f 4e 20 70 61 72 73 65  he GeoJSON parse
4f80: 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20  r object */.    
4f90: 69 6e 74 20 63 3b 0a 20 20 20 20 6c 6f 6e 67 20  int c;.    long 
4fa0: 6f 66 66 73 65 74 3b 0a 20 20 20 20 69 6e 74 20  offset;.    int 
4fb0: 6c 65 76 65 6c 20 3d 20 2d 31 3b 0a 20 20 20 20  level = -1;.    
4fc0: 69 6e 74 20 69 73 5f 73 74 72 69 6e 67 20 3d 20  int is_string = 
4fd0: 30 3b 0a 20 20 20 20 69 6e 74 20 70 72 65 76 5f  0;.    int prev_
4fe0: 63 68 61 72 20 3d 20 27 5c 30 27 3b 0a 20 20 20  char = '\0';.   
4ff0: 20 69 6e 74 20 69 73 5f 66 69 72 73 74 20 3d 20   int is_first = 
5000: 30 3b 0a 20 20 20 20 69 6e 74 20 69 73 5f 73 65  0;.    int is_se
5010: 63 6f 6e 64 20 3d 20 30 3b 0a 20 20 20 20 69 6e  cond = 0;.    in
5020: 74 20 69 73 5f 66 69 72 73 74 5f 72 65 61 64 79  t is_first_ready
5030: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 73   = 0;.    int is
5040: 5f 73 65 63 6f 6e 64 5f 72 65 61 64 79 20 3d 20  _second_ready = 
5050: 30 3b 0a 20 20 20 20 69 6e 74 20 69 73 5f 6e 75  0;.    int is_nu
5060: 6d 65 72 69 63 20 3d 20 30 3b 0a 20 20 20 20 67  meric = 0;.    g
5070: 65 6f 6a 73 6f 6e 5f 73 74 61 63 6b 5f 70 74 72  eojson_stack_ptr
5080: 20 73 74 61 63 6b 20 3d 20 67 65 6f 6a 73 6f 6e   stack = geojson
5090: 5f 63 72 65 61 74 65 5f 73 74 61 63 6b 20 28 29  _create_stack ()
50a0: 3b 0a 20 20 20 20 2a 65 72 72 6f 72 5f 6d 65 73  ;.    *error_mes
50b0: 73 61 67 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20  sage = NULL;..  
50c0: 20 20 77 68 69 6c 65 20 28 28 63 20 3d 20 67 65    while ((c = ge
50d0: 74 63 20 28 70 61 72 73 65 72 2d 3e 69 6e 29 29  tc (parser->in))
50e0: 20 21 3d 20 45 4f 46 29 0a 20 20 20 20 20 20 7b   != EOF).      {
50f0: 0a 09 20 20 2f 2a 20 63 6f 6e 73 75 6d 69 6e 67  ..  /* consuming
5100: 20 74 68 65 20 47 65 6f 4a 53 4f 4e 20 69 6e 70   the GeoJSON inp
5110: 75 74 20 66 69 6c 65 20 2a 2f 0a 09 20 20 69 66  ut file */..  if
5120: 20 28 69 73 5f 73 74 72 69 6e 67 29 0a 09 20 20   (is_string)..  
5130: 20 20 7b 0a 09 09 2f 2a 20 63 6f 6e 73 75 6d 69    {.../* consumi
5140: 6e 67 20 61 20 71 75 6f 74 65 64 20 74 65 78 74  ng a quoted text
5150: 20 73 74 72 69 6e 67 20 2a 2f 0a 09 09 69 66 20   string */...if 
5160: 28 63 20 3d 3d 20 27 22 27 20 26 26 20 70 72 65  (c == '"' && pre
5170: 76 5f 63 68 61 72 20 21 3d 20 27 5c 5c 27 29 0a  v_char != '\\').
5180: 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20 69 73  ..  {...      is
5190: 5f 73 74 72 69 6e 67 20 3d 20 30 3b 09 2f 2a 20  _string = 0;./* 
51a0: 65 6e 64 20 73 74 72 69 6e 67 20 6d 61 72 6b 65  end string marke
51b0: 72 20 2a 2f 0a 09 09 20 20 20 20 20 20 69 66 20  r */...      if 
51c0: 28 69 73 5f 66 69 72 73 74 29 0a 09 09 09 7b 0a  (is_first)....{.
51d0: 09 09 09 20 20 20 20 2f 2a 20 66 6f 75 6e 64 20  ...    /* found 
51e0: 74 68 65 20 47 65 6f 4a 53 4f 4e 20 6f 62 6a 65  the GeoJSON obje
51f0: 63 74 20 4b 65 79 20 74 65 72 6d 69 6e 61 74 6f  ct Key terminato
5200: 72 20 2a 2f 0a 09 09 09 20 20 20 20 69 73 5f 66  r */....    is_f
5210: 69 72 73 74 20 3d 20 30 3b 0a 09 09 09 7d 0a 09  irst = 0;....}..
5220: 09 20 20 20 20 20 20 69 66 20 28 69 73 5f 73 65  .      if (is_se
5230: 63 6f 6e 64 29 0a 09 09 09 7b 0a 09 09 09 20 20  cond)....{....  
5240: 20 20 2f 2a 20 66 6f 75 6e 64 20 74 68 65 20 47    /* found the G
5250: 65 6f 4a 53 4f 4e 20 6f 62 6a 65 63 74 20 56 61  eoJSON object Va
5260: 6c 75 65 20 74 65 72 6d 69 6e 61 74 6f 72 20 2a  lue terminator *
5270: 2f 0a 09 09 09 20 20 20 20 69 73 5f 73 65 63 6f  /....    is_seco
5280: 6e 64 20 3d 20 30 3b 0a 09 09 09 7d 0a 09 09 20  nd = 0;....}... 
5290: 20 7d 0a 09 09 65 6c 73 65 0a 09 09 20 20 7b 0a   }...else...  {.
52a0: 09 09 20 20 20 20 20 20 69 66 20 28 69 73 5f 66  ..      if (is_f
52b0: 69 72 73 74 29 0a 09 09 09 7b 0a 09 09 09 20 20  irst)....{....  
52c0: 20 20 2f 2a 20 66 6f 75 6e 64 20 74 68 65 20 47    /* found the G
52d0: 65 6f 4a 53 4f 4e 20 6f 62 6a 65 63 74 20 4b 65  eoJSON object Ke
52e0: 79 20 2a 2f 0a 09 09 09 20 20 20 20 69 66 20 28  y */....    if (
52f0: 21 67 65 6f 6a 73 6f 6e 5f 70 61 72 73 65 5f 6b  !geojson_parse_k
5300: 65 79 20 28 73 74 61 63 6b 2c 20 63 2c 20 65 72  ey (stack, c, er
5310: 72 6f 72 5f 6d 65 73 73 61 67 65 29 29 0a 09 09  ror_message))...
5320: 09 09 67 6f 74 6f 20 65 72 72 3b 0a 09 09 09 7d  ..goto err;....}
5330: 0a 09 09 20 20 20 20 20 20 69 66 20 28 69 73 5f  ...      if (is_
5340: 73 65 63 6f 6e 64 29 0a 09 09 09 7b 0a 09 09 09  second)....{....
5350: 20 20 20 20 2f 2a 20 66 6f 75 6e 64 20 74 68 65      /* found the
5360: 20 47 65 6f 4a 53 4f 4e 20 6f 62 6a 65 63 74 20   GeoJSON object 
5370: 56 61 6c 75 65 20 2a 2f 0a 09 09 09 20 20 20 20  Value */....    
5380: 69 66 20 28 21 67 65 6f 6a 73 6f 6e 5f 70 61 72  if (!geojson_par
5390: 73 65 5f 76 61 6c 75 65 20 28 73 74 61 63 6b 2c  se_value (stack,
53a0: 20 63 2c 20 65 72 72 6f 72 5f 6d 65 73 73 61 67   c, error_messag
53b0: 65 29 29 0a 09 09 09 09 67 6f 74 6f 20 65 72 72  e)).....goto err
53c0: 3b 0a 09 09 09 7d 0a 09 09 20 20 7d 0a 09 09 70  ;....}...  }...p
53d0: 72 65 76 5f 63 68 61 72 20 3d 20 63 3b 0a 09 09  rev_char = c;...
53e0: 63 6f 6e 74 69 6e 75 65 3b 0a 09 20 20 20 20 7d  continue;..    }
53f0: 0a 09 20 20 69 66 20 28 63 20 3d 3d 20 27 20 27  ..  if (c == ' '
5400: 20 7c 7c 20 63 20 3d 3d 20 27 5c 74 27 20 7c 7c   || c == '\t' ||
5410: 20 63 20 3d 3d 20 27 5c 72 27 20 7c 7c 20 63 20   c == '\r' || c 
5420: 3d 3d 20 27 5c 6e 27 29 0a 09 20 20 20 20 7b 0a  == '\n')..    {.
5430: 09 09 2f 2a 20 69 67 6e 6f 72 69 6e 67 20 77 68  ../* ignoring wh
5440: 69 74 65 20 73 70 61 63 65 73 20 2a 2f 0a 09 09  ite spaces */...
5450: 70 72 65 76 5f 63 68 61 72 20 3d 20 63 3b 0a 09  prev_char = c;..
5460: 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 20 20 20 20  .continue;..    
5470: 7d 0a 09 20 20 69 66 20 28 63 20 3d 3d 20 27 5b  }..  if (c == '[
5480: 27 20 7c 7c 20 63 20 3d 3d 20 27 5d 27 29 0a 09  ' || c == ']')..
5490: 20 20 20 20 7b 0a 09 09 70 72 65 76 5f 63 68 61      {...prev_cha
54a0: 72 20 3d 20 63 3b 0a 09 09 69 73 5f 73 65 63 6f  r = c;...is_seco
54b0: 6e 64 5f 72 65 61 64 79 20 3d 20 30 3b 0a 09 09  nd_ready = 0;...
54c0: 69 73 5f 73 65 63 6f 6e 64 20 3d 20 30 3b 0a 09  is_second = 0;..
54d0: 09 69 73 5f 6e 75 6d 65 72 69 63 20 3d 20 30 3b  .is_numeric = 0;
54e0: 0a 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 20 20  ...continue;..  
54f0: 20 20 7d 0a 09 20 20 69 66 20 28 63 20 3d 3d 20    }..  if (c == 
5500: 27 7b 27 29 0a 09 20 20 20 20 7b 0a 09 09 2f 2a  '{')..    {.../*
5510: 20 66 6f 75 6e 64 20 61 20 4a 53 4f 4e 20 53 74   found a JSON St
5520: 61 72 74 20 4f 62 6a 65 63 74 20 6d 61 72 6b 65  art Object marke
5530: 72 20 2a 2f 0a 09 09 63 68 61 72 20 70 61 72 65  r */...char pare
5540: 6e 74 5f 6b 65 79 5b 47 45 4f 4a 53 4f 4e 5f 4d  nt_key[GEOJSON_M
5550: 41 58 5d 3b 0a 09 09 73 74 72 63 70 79 20 28 70  AX];...strcpy (p
5560: 61 72 65 6e 74 5f 6b 65 79 2c 20 73 74 61 63 6b  arent_key, stack
5570: 2d 3e 6b 65 79 29 3b 0a 09 09 69 66 20 28 6c 65  ->key);...if (le
5580: 76 65 6c 20 3e 3d 20 30 29 0a 09 09 20 20 20 20  vel >= 0)...    
5590: 67 65 6f 6a 73 6f 6e 5f 61 64 64 5f 6b 65 79 76  geojson_add_keyv
55a0: 61 6c 20 28 73 74 61 63 6b 2c 20 6c 65 76 65 6c  al (stack, level
55b0: 29 3b 0a 09 09 6c 65 76 65 6c 2b 2b 3b 0a 09 09  );...level++;...
55c0: 6f 66 66 73 65 74 20 3d 20 66 74 65 6c 6c 20 28  offset = ftell (
55d0: 70 61 72 73 65 72 2d 3e 69 6e 29 3b 0a 09 09 69  parser->in);...i
55e0: 66 20 28 21 67 65 6f 6a 73 6f 6e 5f 73 74 61 72  f (!geojson_star
55f0: 74 5f 6f 62 6a 65 63 74 0a 09 09 20 20 20 20 28  t_object...    (
5600: 70 61 72 73 65 72 2c 20 73 74 61 63 6b 2c 20 6c  parser, stack, l
5610: 65 76 65 6c 2c 20 6f 66 66 73 65 74 2c 20 70 61  evel, offset, pa
5620: 72 65 6e 74 5f 6b 65 79 2c 20 65 72 72 6f 72 5f  rent_key, error_
5630: 6d 65 73 73 61 67 65 29 29 0a 09 09 20 20 20 20  message))...    
5640: 67 6f 74 6f 20 65 72 72 3b 0a 09 09 70 72 65 76  goto err;...prev
5650: 5f 63 68 61 72 20 3d 20 63 3b 0a 09 09 69 73 5f  _char = c;...is_
5660: 66 69 72 73 74 5f 72 65 61 64 79 20 3d 20 31 3b  first_ready = 1;
5670: 0a 09 09 69 73 5f 66 69 72 73 74 20 3d 20 30 3b  ...is_first = 0;
5680: 0a 09 09 69 73 5f 73 65 63 6f 6e 64 5f 72 65 61  ...is_second_rea
5690: 64 79 20 3d 20 30 3b 0a 09 09 69 73 5f 73 65 63  dy = 0;...is_sec
56a0: 6f 6e 64 20 3d 20 30 3b 0a 09 09 69 73 5f 6e 75  ond = 0;...is_nu
56b0: 6d 65 72 69 63 20 3d 20 30 3b 0a 09 09 63 6f 6e  meric = 0;...con
56c0: 74 69 6e 75 65 3b 0a 09 20 20 20 20 7d 0a 09 20  tinue;..    }.. 
56d0: 20 69 66 20 28 63 20 3d 3d 20 27 7d 27 29 0a 09   if (c == '}')..
56e0: 20 20 20 20 7b 0a 09 09 2f 2a 20 66 6f 75 6e 64      {.../* found
56f0: 20 61 20 4a 53 4f 4e 20 45 6e 64 20 4f 62 6a 65   a JSON End Obje
5700: 63 74 20 6d 61 72 6b 65 72 20 2a 2f 0a 09 09 67  ct marker */...g
5710: 65 6f 6a 73 6f 6e 5f 61 64 64 5f 6b 65 79 76 61  eojson_add_keyva
5720: 6c 20 28 73 74 61 63 6b 2c 20 6c 65 76 65 6c 29  l (stack, level)
5730: 3b 0a 09 09 6f 66 66 73 65 74 20 3d 20 66 74 65  ;...offset = fte
5740: 6c 6c 20 28 70 61 72 73 65 72 2d 3e 69 6e 29 3b  ll (parser->in);
5750: 0a 09 09 69 66 20 28 21 67 65 6f 6a 73 6f 6e 5f  ...if (!geojson_
5760: 65 6e 64 5f 6f 62 6a 65 63 74 20 28 73 74 61 63  end_object (stac
5770: 6b 2c 20 6c 65 76 65 6c 2c 20 6f 66 66 73 65 74  k, level, offset
5780: 2c 20 65 72 72 6f 72 5f 6d 65 73 73 61 67 65 29  , error_message)
5790: 29 0a 09 09 20 20 20 20 67 6f 74 6f 20 65 72 72  )...    goto err
57a0: 3b 0a 09 09 6c 65 76 65 6c 2d 2d 3b 0a 09 09 70  ;...level--;...p
57b0: 72 65 76 5f 63 68 61 72 20 3d 20 63 3b 0a 09 09  rev_char = c;...
57c0: 69 73 5f 66 69 72 73 74 5f 72 65 61 64 79 20 3d  is_first_ready =
57d0: 20 30 3b 0a 09 09 69 73 5f 66 69 72 73 74 20 3d   0;...is_first =
57e0: 20 30 3b 0a 09 09 69 73 5f 73 65 63 6f 6e 64 5f   0;...is_second_
57f0: 72 65 61 64 79 20 3d 20 30 3b 0a 09 09 69 73 5f  ready = 0;...is_
5800: 73 65 63 6f 6e 64 20 3d 20 30 3b 0a 09 09 69 73  second = 0;...is
5810: 5f 6e 75 6d 65 72 69 63 20 3d 20 30 3b 0a 09 09  _numeric = 0;...
5820: 63 6f 6e 74 69 6e 75 65 3b 0a 09 20 20 20 20 7d  continue;..    }
5830: 0a 09 20 20 69 66 20 28 63 20 3d 3d 20 27 3a 27  ..  if (c == ':'
5840: 29 0a 09 20 20 20 20 7b 0a 09 09 70 72 65 76 5f  )..    {...prev_
5850: 63 68 61 72 20 3d 20 63 3b 0a 09 09 69 73 5f 66  char = c;...is_f
5860: 69 72 73 74 5f 72 65 61 64 79 20 3d 20 30 3b 0a  irst_ready = 0;.
5870: 09 09 69 73 5f 73 65 63 6f 6e 64 5f 72 65 61 64  ..is_second_read
5880: 79 20 3d 20 31 3b 0a 09 09 63 6f 6e 74 69 6e 75  y = 1;...continu
5890: 65 3b 0a 09 20 20 20 20 7d 0a 09 20 20 69 66 20  e;..    }..  if 
58a0: 28 63 20 3d 3d 20 27 2c 27 29 0a 09 20 20 20 20  (c == ',')..    
58b0: 7b 0a 09 09 67 65 6f 6a 73 6f 6e 5f 61 64 64 5f  {...geojson_add_
58c0: 6b 65 79 76 61 6c 20 28 73 74 61 63 6b 2c 20 6c  keyval (stack, l
58d0: 65 76 65 6c 29 3b 0a 09 09 70 72 65 76 5f 63 68  evel);...prev_ch
58e0: 61 72 20 3d 20 63 3b 0a 09 09 69 73 5f 66 69 72  ar = c;...is_fir
58f0: 73 74 5f 72 65 61 64 79 20 3d 20 31 3b 0a 09 09  st_ready = 1;...
5900: 69 73 5f 66 69 72 73 74 20 3d 20 30 3b 0a 09 09  is_first = 0;...
5910: 69 73 5f 73 65 63 6f 6e 64 5f 72 65 61 64 79 20  is_second_ready 
5920: 3d 20 30 3b 0a 09 09 69 73 5f 73 65 63 6f 6e 64  = 0;...is_second
5930: 20 3d 20 30 3b 0a 09 09 69 73 5f 6e 75 6d 65 72   = 0;...is_numer
5940: 69 63 20 3d 20 30 3b 0a 09 09 63 6f 6e 74 69 6e  ic = 0;...contin
5950: 75 65 3b 0a 09 20 20 20 20 7d 0a 09 20 20 69 66  ue;..    }..  if
5960: 20 28 63 20 3d 3d 20 27 22 27 29 0a 09 20 20 20   (c == '"')..   
5970: 20 7b 0a 09 09 2f 2a 20 61 20 71 75 6f 74 65 64   {.../* a quoted
5980: 20 74 65 78 74 20 73 74 72 69 6e 67 20 73 74 61   text string sta
5990: 72 74 73 20 68 65 72 65 20 2a 2f 0a 09 09 69 73  rts here */...is
59a0: 5f 73 74 72 69 6e 67 20 3d 20 31 3b 0a 09 09 70  _string = 1;...p
59b0: 72 65 76 5f 63 68 61 72 20 3d 20 63 3b 0a 09 09  rev_char = c;...
59c0: 69 66 20 28 69 73 5f 66 69 72 73 74 5f 72 65 61  if (is_first_rea
59d0: 64 79 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 20  dy)...  {...    
59e0: 20 20 69 73 5f 66 69 72 73 74 5f 72 65 61 64 79    is_first_ready
59f0: 20 3d 20 30 3b 0a 09 09 20 20 20 20 20 20 69 73   = 0;...      is
5a00: 5f 66 69 72 73 74 20 3d 20 31 3b 0a 09 09 20 20  _first = 1;...  
5a10: 7d 0a 09 09 69 66 20 28 69 73 5f 73 65 63 6f 6e  }...if (is_secon
5a20: 64 5f 72 65 61 64 79 29 0a 09 09 20 20 7b 0a 09  d_ready)...  {..
5a30: 09 20 20 20 20 20 20 69 73 5f 73 65 63 6f 6e 64  .      is_second
5a40: 5f 72 65 61 64 79 20 3d 20 30 3b 0a 09 09 20 20  _ready = 0;...  
5a50: 20 20 20 20 69 73 5f 73 65 63 6f 6e 64 20 3d 20      is_second = 
5a60: 31 3b 0a 09 09 20 20 7d 0a 09 09 63 6f 6e 74 69  1;...  }...conti
5a70: 6e 75 65 3b 0a 09 20 20 20 20 7d 0a 09 20 20 69  nue;..    }..  i
5a80: 66 20 28 69 73 5f 73 65 63 6f 6e 64 5f 72 65 61  f (is_second_rea
5a90: 64 79 29 0a 09 20 20 20 20 7b 0a 09 09 2f 2a 20  dy)..    {.../* 
5aa0: 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 62 65  should be the be
5ab0: 67 69 6e 6e 69 6e 67 20 6f 66 20 73 6f 6d 65 20  ginning of some 
5ac0: 73 74 72 69 6e 67 20 76 61 6c 75 65 20 2a 2f 0a  string value */.
5ad0: 09 09 69 73 5f 73 65 63 6f 6e 64 5f 72 65 61 64  ..is_second_read
5ae0: 79 20 3d 20 30 3b 0a 09 20 20 20 20 7d 0a 09 20  y = 0;..    }.. 
5af0: 20 69 66 20 28 69 73 5f 6e 75 6d 65 72 69 63 29   if (is_numeric)
5b00: 0a 09 20 20 20 20 7b 0a 09 09 2f 2a 20 63 6f 6e  ..    {.../* con
5b10: 73 75 6d 69 6e 67 20 61 20 6e 75 6d 65 72 69 63  suming a numeric
5b20: 20 6f 72 20 73 70 65 63 69 61 6c 20 76 61 6c 75   or special valu
5b30: 65 20 2a 2f 0a 09 09 69 66 20 28 21 67 65 6f 6a  e */...if (!geoj
5b40: 73 6f 6e 5f 70 61 72 73 65 5f 6e 75 6d 76 61 6c  son_parse_numval
5b50: 75 65 20 28 73 74 61 63 6b 2c 20 63 2c 20 65 72  ue (stack, c, er
5b60: 72 6f 72 5f 6d 65 73 73 61 67 65 29 29 0a 09 09  ror_message))...
5b70: 20 20 20 20 67 6f 74 6f 20 65 72 72 3b 0a 09 09      goto err;...
5b80: 70 72 65 76 5f 63 68 61 72 20 3d 20 63 3b 0a 09  prev_char = c;..
5b90: 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 20 20 20 20  .continue;..    
5ba0: 7d 0a 09 20 20 70 72 65 76 5f 63 68 61 72 20 3d  }..  prev_char =
5bb0: 20 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   c;.      }.    
5bc0: 67 65 6f 6a 73 6f 6e 5f 64 65 73 74 72 6f 79 5f  geojson_destroy_
5bd0: 73 74 61 63 6b 20 28 73 74 61 63 6b 29 3b 0a 20  stack (stack);. 
5be0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20 20     return 1;..  
5bf0: 65 72 72 3a 0a 20 20 20 20 67 65 6f 6a 73 6f 6e  err:.    geojson
5c00: 5f 64 65 73 74 72 6f 79 5f 73 74 61 63 6b 20 28  _destroy_stack (
5c10: 73 74 61 63 6b 29 3b 0a 20 20 20 20 72 65 74 75  stack);.    retu
5c20: 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  rn 0;.}..static 
5c30: 69 6e 74 0a 67 65 6f 6a 73 6f 6e 5f 67 65 74 5f  int.geojson_get_
5c40: 70 72 6f 70 65 72 74 79 20 28 63 6f 6e 73 74 20  property (const 
5c50: 63 68 61 72 20 2a 62 75 66 2c 20 67 65 6f 6a 73  char *buf, geojs
5c60: 6f 6e 5f 73 74 61 63 6b 5f 70 74 72 20 73 74 61  on_stack_ptr sta
5c70: 63 6b 2c 0a 09 09 20 20 20 20 20 20 67 65 6f 6a  ck,...      geoj
5c80: 73 6f 6e 5f 70 72 6f 70 65 72 74 79 5f 70 74 72  son_property_ptr
5c90: 20 70 72 6f 70 2c 20 69 6e 74 20 2a 6f 66 66 2c   prop, int *off,
5ca0: 20 63 68 61 72 20 2a 2a 65 72 72 6f 72 5f 6d 65   char **error_me
5cb0: 73 73 61 67 65 29 0a 7b 0a 2f 2a 20 70 61 72 73  ssage).{./* pars
5cc0: 69 6e 67 20 74 68 65 20 46 65 61 74 75 72 65 27  ing the Feature'
5cd0: 73 20 50 72 6f 70 65 72 74 69 65 73 20 73 74 72  s Properties str
5ce0: 69 6e 67 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  ing */.    char 
5cf0: 63 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  c;.    int len;.
5d00: 20 20 20 20 69 6e 74 20 69 73 5f 73 74 72 69 6e      int is_strin
5d10: 67 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 70  g = 0;.    int p
5d20: 72 65 76 5f 63 68 61 72 20 3d 20 27 5c 30 27 3b  rev_char = '\0';
5d30: 0a 20 20 20 20 69 6e 74 20 69 73 5f 66 69 72 73  .    int is_firs
5d40: 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  t = 0;.    int i
5d50: 73 5f 73 65 63 6f 6e 64 20 3d 20 30 3b 0a 20 20  s_second = 0;.  
5d60: 20 20 69 6e 74 20 69 73 5f 66 69 72 73 74 5f 72    int is_first_r
5d70: 65 61 64 79 20 3d 20 31 3b 0a 20 20 20 20 69 6e  eady = 1;.    in
5d80: 74 20 69 73 5f 73 65 63 6f 6e 64 5f 72 65 61 64  t is_second_read
5d90: 79 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  y = 0;.    int i
5da0: 73 5f 6e 75 6d 65 72 69 63 20 3d 20 30 3b 0a 20  s_numeric = 0;. 
5db0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 65     const char *e
5dc0: 6e 64 5f 70 20 3d 20 62 75 66 20 2b 20 73 74 72  nd_p = buf + str
5dd0: 6c 65 6e 20 28 62 75 66 29 3b 0a 20 20 20 20 63  len (buf);.    c
5de0: 6f 6e 73 74 20 63 68 61 72 20 2a 70 20 3d 20 62  onst char *p = b
5df0: 75 66 20 2b 20 2a 6f 66 66 3b 0a 20 20 20 20 69  uf + *off;.    i
5e00: 66 20 28 70 20 3c 20 62 75 66 20 7c 7c 20 70 20  f (p < buf || p 
5e10: 3e 3d 20 65 6e 64 5f 70 29 0a 09 72 65 74 75 72  >= end_p)..retur
5e20: 6e 20 2d 31 3b 09 09 2f 2a 20 74 68 65 20 73 74  n -1;../* the st
5e30: 72 69 6e 67 20 68 61 73 20 62 65 65 6e 20 63 6f  ring has been co
5e40: 6d 70 6c 65 74 65 6c 79 20 70 61 72 73 65 64 20  mpletely parsed 
5e50: 2a 2f 0a 0a 2f 2a 20 72 65 73 65 74 74 69 6e 67  */../* resetting
5e60: 20 61 6c 6c 20 73 74 61 63 6b 20 62 75 66 66 65   all stack buffe
5e70: 72 73 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  rs */.    memset
5e80: 20 28 73 74 61 63 6b 2d 3e 6b 65 79 2c 20 27 5c   (stack->key, '\
5e90: 30 27 2c 20 47 45 4f 4a 53 4f 4e 5f 4d 41 58 29  0', GEOJSON_MAX)
5ea0: 3b 0a 20 20 20 20 73 74 61 63 6b 2d 3e 6b 65 79  ;.    stack->key
5eb0: 5f 69 64 78 20 3d 20 30 3b 0a 20 20 20 20 6d 65  _idx = 0;.    me
5ec0: 6d 73 65 74 20 28 73 74 61 63 6b 2d 3e 76 61 6c  mset (stack->val
5ed0: 75 65 2c 20 27 5c 30 27 2c 20 47 45 4f 4a 53 4f  ue, '\0', GEOJSO
5ee0: 4e 5f 4d 41 58 29 3b 0a 20 20 20 20 73 74 61 63  N_MAX);.    stac
5ef0: 6b 2d 3e 76 61 6c 75 65 5f 69 64 78 20 3d 20 30  k->value_idx = 0
5f00: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 20 28 73 74  ;.    memset (st
5f10: 61 63 6b 2d 3e 6e 75 6d 76 61 6c 75 65 2c 20 27  ack->numvalue, '
5f20: 5c 30 27 2c 20 47 45 4f 4a 53 4f 4e 5f 4d 41 58  \0', GEOJSON_MAX
5f30: 29 3b 0a 20 20 20 20 73 74 61 63 6b 2d 3e 6e 75  );.    stack->nu
5f40: 6d 76 61 6c 75 65 5f 69 64 78 20 3d 20 30 3b 0a  mvalue_idx = 0;.
5f50: 0a 20 20 20 20 77 68 69 6c 65 20 28 31 29 0a 20  .    while (1). 
5f60: 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 63 6f 6e       {..  /* con
5f70: 73 75 6d 69 6e 67 20 74 68 65 20 47 65 6f 4a 53  suming the GeoJS
5f80: 4f 4e 20 50 72 6f 70 65 72 74 69 65 73 20 73 74  ON Properties st
5f90: 72 69 6e 67 20 2a 2f 0a 09 20 20 69 66 20 28 70  ring */..  if (p
5fa0: 20 3e 3d 20 65 6e 64 5f 70 29 0a 09 20 20 20 20   >= end_p)..    
5fb0: 20 20 62 72 65 61 6b 3b 0a 09 20 20 63 20 3d 20    break;..  c = 
5fc0: 2a 70 2b 2b 3b 0a 09 20 20 69 66 20 28 69 73 5f  *p++;..  if (is_
5fd0: 73 74 72 69 6e 67 29 0a 09 20 20 20 20 7b 0a 09  string)..    {..
5fe0: 09 2f 2a 20 63 6f 6e 73 75 6d 69 6e 67 20 61 20  ./* consuming a 
5ff0: 71 75 6f 74 65 64 20 74 65 78 74 20 73 74 72 69  quoted text stri
6000: 6e 67 20 2a 2f 0a 09 09 69 66 20 28 63 20 3d 3d  ng */...if (c ==
6010: 20 27 22 27 20 26 26 20 70 72 65 76 5f 63 68 61   '"' && prev_cha
6020: 72 20 21 3d 20 27 5c 5c 27 29 0a 09 09 20 20 7b  r != '\\')...  {
6030: 0a 09 09 20 20 20 20 20 20 69 73 5f 73 74 72 69  ...      is_stri
6040: 6e 67 20 3d 20 30 3b 09 2f 2a 20 65 6e 64 20 73  ng = 0;./* end s
6050: 74 72 69 6e 67 20 6d 61 72 6b 65 72 20 2a 2f 0a  tring marker */.
6060: 09 09 20 20 20 20 20 20 69 66 20 28 69 73 5f 66  ..      if (is_f
6070: 69 72 73 74 29 0a 09 09 09 7b 0a 09 09 09 20 20  irst)....{....  
6080: 20 20 2f 2a 20 66 6f 75 6e 64 20 74 68 65 20 47    /* found the G
6090: 65 6f 4a 53 4f 4e 20 6f 62 6a 65 63 74 20 4b 65  eoJSON object Ke
60a0: 79 20 74 65 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a  y terminator */.
60b0: 09 09 09 20 20 20 20 69 73 5f 66 69 72 73 74 20  ...    is_first 
60c0: 3d 20 30 3b 0a 09 09 09 7d 0a 09 09 20 20 20 20  = 0;....}...    
60d0: 20 20 69 66 20 28 69 73 5f 73 65 63 6f 6e 64 29    if (is_second)
60e0: 0a 09 09 09 7b 0a 09 09 09 20 20 20 20 2f 2a 20  ....{....    /* 
60f0: 66 6f 75 6e 64 20 74 68 65 20 47 65 6f 4a 53 4f  found the GeoJSO
6100: 4e 20 6f 62 6a 65 63 74 20 56 61 6c 75 65 20 74  N object Value t
6110: 65 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a 09 09 09  erminator */....
6120: 20 20 20 20 69 73 5f 73 65 63 6f 6e 64 20 3d 20      is_second = 
6130: 30 3b 0a 09 09 09 7d 0a 09 09 20 20 7d 0a 09 09  0;....}...  }...
6140: 65 6c 73 65 0a 09 09 20 20 7b 0a 09 09 20 20 20  else...  {...   
6150: 20 20 20 69 66 20 28 69 73 5f 66 69 72 73 74 29     if (is_first)
6160: 0a 09 09 09 7b 0a 09 09 09 20 20 20 20 2f 2a 20  ....{....    /* 
6170: 66 6f 75 6e 64 20 74 68 65 20 47 65 6f 4a 53 4f  found the GeoJSO
6180: 4e 20 6f 62 6a 65 63 74 20 4b 65 79 20 2a 2f 0a  N object Key */.
6190: 09 09 09 20 20 20 20 69 66 20 28 21 67 65 6f 6a  ...    if (!geoj
61a0: 73 6f 6e 5f 70 61 72 73 65 5f 6b 65 79 20 28 73  son_parse_key (s
61b0: 74 61 63 6b 2c 20 63 2c 20 65 72 72 6f 72 5f 6d  tack, c, error_m
61c0: 65 73 73 61 67 65 29 29 0a 09 09 09 09 67 6f 74  essage)).....got
61d0: 6f 20 65 72 72 3b 0a 09 09 09 20 20 20 20 69 66  o err;....    if
61e0: 20 28 70 72 6f 70 2d 3e 6e 61 6d 65 20 21 3d 20   (prop->name != 
61f0: 4e 55 4c 4c 29 0a 09 09 09 09 66 72 65 65 20 28  NULL).....free (
6200: 70 72 6f 70 2d 3e 6e 61 6d 65 29 3b 0a 09 09 09  prop->name);....
6210: 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e      len = strlen
6220: 20 28 73 74 61 63 6b 2d 3e 6b 65 79 29 3b 0a 09   (stack->key);..
6230: 09 09 20 20 20 20 69 66 20 28 6c 65 6e 20 3d 3d  ..    if (len ==
6240: 20 30 29 0a 09 09 09 09 70 72 6f 70 2d 3e 6e 61   0).....prop->na
6250: 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 20 20  me = NULL;....  
6260: 20 20 65 6c 73 65 0a 09 09 09 20 20 20 20 20 20    else....      
6270: 7b 0a 09 09 09 09 20 20 70 72 6f 70 2d 3e 6e 61  {.....  prop->na
6280: 6d 65 20 3d 20 6d 61 6c 6c 6f 63 20 28 6c 65 6e  me = malloc (len
6290: 20 2b 20 31 29 3b 0a 09 09 09 09 20 20 73 74 72   + 1);.....  str
62a0: 63 70 79 20 28 70 72 6f 70 2d 3e 6e 61 6d 65 2c  cpy (prop->name,
62b0: 20 73 74 61 63 6b 2d 3e 6b 65 79 29 3b 0a 09 09   stack->key);...
62c0: 09 20 20 20 20 20 20 7d 0a 09 09 09 7d 0a 09 09  .      }....}...
62d0: 20 20 20 20 20 20 69 66 20 28 69 73 5f 73 65 63        if (is_sec
62e0: 6f 6e 64 29 0a 09 09 09 7b 0a 09 09 09 20 20 20  ond)....{....   
62f0: 20 2f 2a 20 66 6f 75 6e 64 20 74 68 65 20 47 65   /* found the Ge
6300: 6f 4a 53 4f 4e 20 6f 62 6a 65 63 74 20 56 61 6c  oJSON object Val
6310: 75 65 20 2a 2f 0a 09 09 09 20 20 20 20 69 66 20  ue */....    if 
6320: 28 21 67 65 6f 6a 73 6f 6e 5f 70 61 72 73 65 5f  (!geojson_parse_
6330: 76 61 6c 75 65 20 28 73 74 61 63 6b 2c 20 63 2c  value (stack, c,
6340: 20 65 72 72 6f 72 5f 6d 65 73 73 61 67 65 29 29   error_message))
6350: 0a 09 09 09 09 67 6f 74 6f 20 65 72 72 3b 0a 09  .....goto err;..
6360: 09 09 20 20 20 20 69 66 20 28 70 72 6f 70 2d 3e  ..    if (prop->
6370: 74 78 74 5f 76 61 6c 75 65 20 21 3d 20 4e 55 4c  txt_value != NUL
6380: 4c 29 0a 09 09 09 09 66 72 65 65 20 28 70 72 6f  L).....free (pro
6390: 70 2d 3e 74 78 74 5f 76 61 6c 75 65 29 3b 0a 09  p->txt_value);..
63a0: 09 09 20 20 20 20 70 72 6f 70 2d 3e 74 78 74 5f  ..    prop->txt_
63b0: 76 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09  value = NULL;...
63c0: 09 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65  .    len = strle
63d0: 6e 20 28 73 74 61 63 6b 2d 3e 76 61 6c 75 65 29  n (stack->value)
63e0: 3b 0a 09 09 09 20 20 20 20 69 66 20 28 6c 65 6e  ;....    if (len
63f0: 20 3e 20 30 29 0a 09 09 09 20 20 20 20 20 20 7b   > 0)....      {
6400: 0a 09 09 09 09 20 20 70 72 6f 70 2d 3e 74 78 74  .....  prop->txt
6410: 5f 76 61 6c 75 65 20 3d 20 6d 61 6c 6c 6f 63 20  _value = malloc 
6420: 28 6c 65 6e 20 2b 20 31 29 3b 0a 09 09 09 09 20  (len + 1);..... 
6430: 20 73 74 72 63 70 79 20 28 70 72 6f 70 2d 3e 74   strcpy (prop->t
6440: 78 74 5f 76 61 6c 75 65 2c 20 73 74 61 63 6b 2d  xt_value, stack-
6450: 3e 76 61 6c 75 65 29 3b 0a 09 09 09 20 20 20 20  >value);....    
6460: 20 20 7d 0a 09 09 09 20 20 20 20 70 72 6f 70 2d    }....    prop-
6470: 3e 74 79 70 65 20 3d 20 47 45 4f 4a 53 4f 4e 5f  >type = GEOJSON_
6480: 54 45 58 54 3b 0a 09 09 09 7d 0a 09 09 20 20 7d  TEXT;....}...  }
6490: 0a 09 09 70 72 65 76 5f 63 68 61 72 20 3d 20 63  ...prev_char = c
64a0: 3b 0a 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 20  ;...continue;.. 
64b0: 20 20 20 7d 0a 09 20 20 69 66 20 28 63 20 3d 3d     }..  if (c ==
64c0: 20 27 20 27 20 7c 7c 20 63 20 3d 3d 20 27 5c 74   ' ' || c == '\t
64d0: 27 20 7c 7c 20 63 20 3d 3d 20 27 5c 72 27 20 7c  ' || c == '\r' |
64e0: 7c 20 63 20 3d 3d 20 27 5c 6e 27 29 0a 09 20 20  | c == '\n')..  
64f0: 20 20 7b 0a 09 09 2f 2a 20 69 67 6e 6f 72 69 6e    {.../* ignorin
6500: 67 20 77 68 69 74 65 20 73 70 61 63 65 73 20 2a  g white spaces *
6510: 2f 0a 09 09 70 72 65 76 5f 63 68 61 72 20 3d 20  /...prev_char = 
6520: 63 3b 0a 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09  c;...continue;..
6530: 20 20 20 20 7d 0a 09 20 20 69 66 20 28 63 20 3d      }..  if (c =
6540: 3d 20 27 3a 27 29 0a 09 20 20 20 20 7b 0a 09 09  = ':')..    {...
6550: 70 72 65 76 5f 63 68 61 72 20 3d 20 63 3b 0a 09  prev_char = c;..
6560: 09 69 73 5f 66 69 72 73 74 20 3d 20 30 3b 0a 09  .is_first = 0;..
6570: 09 69 73 5f 66 69 72 73 74 5f 72 65 61 64 79 20  .is_first_ready 
6580: 3d 20 30 3b 0a 09 09 69 73 5f 73 65 63 6f 6e 64  = 0;...is_second
6590: 5f 72 65 61 64 79 20 3d 20 31 3b 0a 09 09 63 6f  _ready = 1;...co
65a0: 6e 74 69 6e 75 65 3b 0a 09 20 20 20 20 7d 0a 09  ntinue;..    }..
65b0: 20 20 69 66 20 28 63 20 3d 3d 20 27 2c 27 29 0a    if (c == ',').
65c0: 09 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 09 20  .      break;.. 
65d0: 20 69 66 20 28 63 20 3d 3d 20 27 22 27 29 0a 09   if (c == '"')..
65e0: 20 20 20 20 7b 0a 09 09 2f 2a 20 61 20 71 75 6f      {.../* a quo
65f0: 74 65 64 20 74 65 78 74 20 73 74 72 69 6e 67 20  ted text string 
6600: 73 74 61 72 74 73 20 68 65 72 65 20 2a 2f 0a 09  starts here */..
6610: 09 69 73 5f 73 74 72 69 6e 67 20 3d 20 31 3b 0a  .is_string = 1;.
6620: 09 09 70 72 65 76 5f 63 68 61 72 20 3d 20 63 3b  ..prev_char = c;
6630: 0a 09 09 69 66 20 28 69 73 5f 66 69 72 73 74 5f  ...if (is_first_
6640: 72 65 61 64 79 29 0a 09 09 20 20 7b 0a 09 09 20  ready)...  {... 
6650: 20 20 20 20 20 69 73 5f 66 69 72 73 74 5f 72 65       is_first_re
6660: 61 64 79 20 3d 20 30 3b 0a 09 09 20 20 20 20 20  ady = 0;...     
6670: 20 69 73 5f 66 69 72 73 74 20 3d 20 31 3b 0a 09   is_first = 1;..
6680: 09 20 20 7d 0a 09 09 69 66 20 28 69 73 5f 73 65  .  }...if (is_se
6690: 63 6f 6e 64 5f 72 65 61 64 79 29 0a 09 09 20 20  cond_ready)...  
66a0: 7b 0a 09 09 20 20 20 20 20 20 69 73 5f 73 65 63  {...      is_sec
66b0: 6f 6e 64 5f 72 65 61 64 79 20 3d 20 30 3b 0a 09  ond_ready = 0;..
66c0: 09 20 20 20 20 20 20 69 73 5f 73 65 63 6f 6e 64  .      is_second
66d0: 20 3d 20 31 3b 0a 09 09 20 20 7d 0a 09 09 63 6f   = 1;...  }...co
66e0: 6e 74 69 6e 75 65 3b 0a 09 20 20 20 20 7d 0a 09  ntinue;..    }..
66f0: 20 20 69 66 20 28 69 73 5f 73 65 63 6f 6e 64 5f    if (is_second_
6700: 72 65 61 64 79 29 0a 09 20 20 20 20 7b 0a 09 09  ready)..    {...
6710: 2f 2a 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65  /* should be the
6720: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 73 6f   beginning of so
6730: 6d 65 20 6e 75 6d 65 72 69 63 20 76 61 6c 75 65  me numeric value
6740: 20 2a 2f 0a 09 09 69 73 5f 73 65 63 6f 6e 64 5f   */...is_second_
6750: 72 65 61 64 79 20 3d 20 30 3b 0a 09 09 69 73 5f  ready = 0;...is_
6760: 6e 75 6d 65 72 69 63 20 3d 20 31 3b 0a 09 20 20  numeric = 1;..  
6770: 20 20 7d 0a 09 20 20 69 66 20 28 69 73 5f 6e 75    }..  if (is_nu
6780: 6d 65 72 69 63 29 0a 09 20 20 20 20 7b 0a 09 09  meric)..    {...
6790: 2f 2a 20 63 6f 6e 73 75 6d 69 6e 67 20 61 20 6e  /* consuming a n
67a0: 75 6d 65 72 69 63 20 6f 72 20 73 70 65 63 69 61  umeric or specia
67b0: 6c 20 76 61 6c 75 65 20 2a 2f 0a 09 09 69 66 20  l value */...if 
67c0: 28 21 67 65 6f 6a 73 6f 6e 5f 70 61 72 73 65 5f  (!geojson_parse_
67d0: 6e 75 6d 76 61 6c 75 65 20 28 73 74 61 63 6b 2c  numvalue (stack,
67e0: 20 63 2c 20 65 72 72 6f 72 5f 6d 65 73 73 61 67   c, error_messag
67f0: 65 29 29 0a 09 09 20 20 20 20 67 6f 74 6f 20 65  e))...    goto e
6800: 72 72 3b 0a 09 09 70 72 65 76 5f 63 68 61 72 20  rr;...prev_char 
6810: 3d 20 63 3b 0a 09 09 63 6f 6e 74 69 6e 75 65 3b  = c;...continue;
6820: 0a 09 20 20 20 20 7d 0a 09 20 20 70 72 65 76 5f  ..    }..  prev_
6830: 63 68 61 72 20 3d 20 63 3b 0a 20 20 20 20 20 20  char = c;.      
6840: 7d 0a 20 20 20 20 69 66 20 28 69 73 5f 6e 75 6d  }.    if (is_num
6850: 65 72 69 63 29 0a 20 20 20 20 20 20 7b 0a 09 20  eric).      {.. 
6860: 20 69 66 20 28 73 74 72 63 6d 70 20 28 73 74 61   if (strcmp (sta
6870: 63 6b 2d 3e 6e 75 6d 76 61 6c 75 65 2c 20 22 6e  ck->numvalue, "n
6880: 75 6c 6c 22 29 20 3d 3d 20 30 29 0a 09 20 20 20  ull") == 0)..   
6890: 20 20 20 70 72 6f 70 2d 3e 74 79 70 65 20 3d 20     prop->type = 
68a0: 47 45 4f 4a 53 4f 4e 5f 4e 55 4c 4c 3b 0a 09 20  GEOJSON_NULL;.. 
68b0: 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70   else if (strcmp
68c0: 20 28 73 74 61 63 6b 2d 3e 6e 75 6d 76 61 6c 75   (stack->numvalu
68d0: 65 2c 20 22 74 72 75 65 22 29 20 3d 3d 20 30 29  e, "true") == 0)
68e0: 0a 09 20 20 20 20 20 20 70 72 6f 70 2d 3e 74 79  ..      prop->ty
68f0: 70 65 20 3d 20 47 45 4f 4a 53 4f 4e 5f 54 52 55  pe = GEOJSON_TRU
6900: 45 3b 0a 09 20 20 65 6c 73 65 20 69 66 20 28 73  E;..  else if (s
6910: 74 72 63 6d 70 20 28 73 74 61 63 6b 2d 3e 6e 75  trcmp (stack->nu
6920: 6d 76 61 6c 75 65 2c 20 22 66 61 6c 73 65 22 29  mvalue, "false")
6930: 20 3d 3d 20 30 29 0a 09 20 20 20 20 20 20 70 72   == 0)..      pr
6940: 6f 70 2d 3e 74 79 70 65 20 3d 20 47 45 4f 4a 53  op->type = GEOJS
6950: 4f 4e 5f 46 41 4c 53 45 3b 0a 09 20 20 65 6c 73  ON_FALSE;..  els
6960: 65 0a 09 20 20 20 20 7b 0a 09 09 6c 65 6e 20 3d  e..    {...len =
6970: 20 73 74 72 6c 65 6e 20 28 73 74 61 63 6b 2d 3e   strlen (stack->
6980: 6e 75 6d 76 61 6c 75 65 29 3b 0a 09 09 69 66 20  numvalue);...if 
6990: 28 6c 65 6e 20 3e 20 30 29 0a 09 09 20 20 7b 0a  (len > 0)...  {.
69a0: 09 09 20 20 20 20 20 20 69 66 20 28 67 65 6f 6a  ..      if (geoj
69b0: 73 6f 6e 5f 69 73 5f 66 6c 6f 61 74 20 28 73 74  son_is_float (st
69c0: 61 63 6b 2d 3e 6e 75 6d 76 61 6c 75 65 29 29 0a  ack->numvalue)).
69d0: 09 09 09 7b 0a 09 09 09 20 20 20 20 70 72 6f 70  ...{....    prop
69e0: 2d 3e 64 62 6c 5f 76 61 6c 75 65 20 3d 20 61 74  ->dbl_value = at
69f0: 6f 66 20 28 73 74 61 63 6b 2d 3e 6e 75 6d 76 61  of (stack->numva
6a00: 6c 75 65 29 3b 0a 09 09 09 20 20 20 20 70 72 6f  lue);....    pro
6a10: 70 2d 3e 74 79 70 65 20 3d 20 47 45 4f 4a 53 4f  p->type = GEOJSO
6a20: 4e 5f 44 4f 55 42 4c 45 3b 0a 09 09 09 7d 0a 09  N_DOUBLE;....}..
6a30: 09 20 20 20 20 20 20 65 6c 73 65 0a 09 09 09 7b  .      else....{
6a40: 0a 09 09 09 20 20 20 20 70 72 6f 70 2d 3e 69 6e  ....    prop->in
6a50: 74 5f 76 61 6c 75 65 20 3d 20 61 74 6f 6c 6c 20  t_value = atoll 
6a60: 28 73 74 61 63 6b 2d 3e 6e 75 6d 76 61 6c 75 65  (stack->numvalue
6a70: 29 3b 0a 09 09 09 20 20 20 20 70 72 6f 70 2d 3e  );....    prop->
6a80: 74 79 70 65 20 3d 20 47 45 4f 4a 53 4f 4e 5f 49  type = GEOJSON_I
6a90: 4e 54 45 47 45 52 3b 0a 09 09 09 7d 0a 09 09 20  NTEGER;....}... 
6aa0: 20 7d 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 20   }..    }.      
6ab0: 7d 0a 0a 20 20 20 20 2a 6f 66 66 20 3d 20 70 20  }..    *off = p 
6ac0: 2d 20 62 75 66 3b 0a 20 20 20 20 72 65 74 75 72  - buf;.    retur
6ad0: 6e 20 31 3b 0a 0a 20 20 65 72 72 3a 0a 20 20 20  n 1;..  err:.   
6ae0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74   return 0;.}..st
6af0: 61 74 69 63 20 69 6e 74 0a 67 65 6f 6a 73 6f 6e  atic int.geojson
6b00: 5f 70 61 72 73 65 5f 63 6f 6c 75 6d 6e 73 20 28  _parse_columns (
6b10: 67 65 6f 6a 73 6f 6e 5f 70 61 72 73 65 72 5f 70  geojson_parser_p
6b20: 74 72 20 70 61 72 73 65 72 2c 20 63 6f 6e 73 74  tr parser, const
6b30: 20 63 68 61 72 20 2a 62 75 66 2c 0a 09 09 20 20   char *buf,...  
6b40: 20 20 20 20 20 63 68 61 72 20 2a 2a 65 72 72 6f       char **erro
6b50: 72 5f 6d 65 73 73 61 67 65 29 0a 7b 0a 2f 2a 20  r_message).{./* 
6b60: 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 70 61  attempting to pa
6b70: 72 73 65 20 46 65 61 74 75 72 65 27 73 20 50 72  rse Feature's Pr
6b80: 6f 70 65 72 74 69 65 73 20 66 6f 72 20 64 65 74  operties for det
6b90: 65 63 74 69 6e 67 20 43 6f 6c 75 6d 6e 20 74 79  ecting Column ty
6ba0: 70 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f  pes */.    int o
6bb0: 66 66 20 3d 20 30 3b 0a 20 20 20 20 67 65 6f 6a  ff = 0;.    geoj
6bc0: 73 6f 6e 5f 73 74 61 63 6b 5f 70 74 72 20 73 74  son_stack_ptr st
6bd0: 61 63 6b 20 3d 20 67 65 6f 6a 73 6f 6e 5f 63 72  ack = geojson_cr
6be0: 65 61 74 65 5f 73 74 61 63 6b 20 28 29 3b 0a 20  eate_stack ();. 
6bf0: 20 20 20 67 65 6f 6a 73 6f 6e 5f 70 72 6f 70 65     geojson_prope
6c00: 72 74 79 20 70 72 6f 70 3b 0a 20 20 20 20 67 65  rty prop;.    ge
6c10: 6f 6a 73 6f 6e 5f 69 6e 69 74 5f 70 72 6f 70 65  ojson_init_prope
6c20: 72 74 79 20 28 26 70 72 6f 70 29 3b 0a 0a 20 20  rty (&prop);..  
6c30: 20 20 77 68 69 6c 65 20 28 31 29 0a 20 20 20 20    while (1).    
6c40: 20 20 7b 0a 09 20 20 69 6e 74 20 72 65 74 3b 0a    {..  int ret;.
6c50: 09 20 20 67 65 6f 6a 73 6f 6e 5f 72 65 73 65 74  .  geojson_reset
6c60: 5f 70 72 6f 70 65 72 74 79 20 28 26 70 72 6f 70  _property (&prop
6c70: 29 3b 0a 09 20 20 72 65 74 20 3d 20 67 65 6f 6a  );..  ret = geoj
6c80: 73 6f 6e 5f 67 65 74 5f 70 72 6f 70 65 72 74 79  son_get_property
6c90: 20 28 62 75 66 2c 20 73 74 61 63 6b 2c 20 26 70   (buf, stack, &p
6ca0: 72 6f 70 2c 20 26 6f 66 66 2c 20 65 72 72 6f 72  rop, &off, error
6cb0: 5f 6d 65 73 73 61 67 65 29 3b 0a 09 20 20 69 66  _message);..  if
6cc0: 20 28 72 65 74 20 3c 3d 20 30 29 0a 09 20 20 20   (ret <= 0)..   
6cd0: 20 20 20 67 65 6f 6a 73 6f 6e 5f 72 65 73 65 74     geojson_reset
6ce0: 5f 70 72 6f 70 65 72 74 79 20 28 26 70 72 6f 70  _property (&prop
6cf0: 29 3b 0a 09 20 20 69 66 20 28 72 65 74 20 3c 20  );..  if (ret < 
6d00: 30 29 0a 09 20 20 20 20 20 20 62 72 65 61 6b 3b  0)..      break;
6d10: 0a 09 20 20 69 66 20 28 72 65 74 20 3d 3d 20 30  ..  if (ret == 0
6d20: 29 0a 09 20 20 20 20 20 20 67 6f 74 6f 20 65 72  )..      goto er
6d30: 72 3b 0a 09 20 20 69 66 20 28 70 72 6f 70 2e 6e  r;..  if (prop.n
6d40: 61 6d 65 20 21 3d 20 4e 55 4c 4c 29 0a 09 20 20  ame != NULL)..  
6d50: 20 20 7b 0a 09 09 73 77 69 74 63 68 20 28 70 72    {...switch (pr
6d60: 6f 70 2e 74 79 70 65 29 0a 09 09 20 20 7b 0a 09  op.type)...  {..
6d70: 09 20 20 63 61 73 65 20 47 45 4f 4a 53 4f 4e 5f  .  case GEOJSON_
6d80: 54 45 58 54 3a 0a 09 09 20 20 63 61 73 65 20 47  TEXT:...  case G
6d90: 45 4f 4a 53 4f 4e 5f 49 4e 54 45 47 45 52 3a 0a  EOJSON_INTEGER:.
6da0: 09 09 20 20 63 61 73 65 20 47 45 4f 4a 53 4f 4e  ..  case GEOJSON
6db0: 5f 44 4f 55 42 4c 45 3a 0a 09 09 20 20 63 61 73  _DOUBLE:...  cas
6dc0: 65 20 47 45 4f 4a 53 4f 4e 5f 54 52 55 45 3a 0a  e GEOJSON_TRUE:.
6dd0: 09 09 20 20 63 61 73 65 20 47 45 4f 4a 53 4f 4e  ..  case GEOJSON
6de0: 5f 46 41 4c 53 45 3a 0a 09 09 20 20 63 61 73 65  _FALSE:...  case
6df0: 20 47 45 4f 4a 53 4f 4e 5f 4e 55 4c 4c 3a 0a 09   GEOJSON_NULL:..
6e00: 09 20 20 20 20 20 20 67 65 6f 6a 73 6f 6e 5f 61  .      geojson_a
6e10: 64 64 5f 63 6f 6c 75 6d 6e 20 28 70 61 72 73 65  dd_column (parse
6e20: 72 2c 20 70 72 6f 70 2e 6e 61 6d 65 2c 20 70 72  r, prop.name, pr
6e30: 6f 70 2e 74 79 70 65 29 3b 0a 09 09 20 20 20 20  op.type);...    
6e40: 20 20 62 72 65 61 6b 3b 0a 09 09 20 20 64 65 66    break;...  def
6e50: 61 75 6c 74 3a 0a 09 09 20 20 20 20 20 20 67 6f  ault:...      go
6e60: 74 6f 20 65 72 72 3b 0a 09 09 20 20 7d 3b 0a 09  to err;...  };..
6e70: 20 20 20 20 7d 0a 09 20 20 65 6c 73 65 0a 09 20      }..  else.. 
6e80: 20 20 20 20 20 67 6f 74 6f 20 65 72 72 3b 0a 09       goto err;..
6e90: 20 20 67 65 6f 6a 73 6f 6e 5f 72 65 73 65 74 5f    geojson_reset_
6ea0: 70 72 6f 70 65 72 74 79 20 28 26 70 72 6f 70 29  property (&prop)
6eb0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 67 65  ;.      }.    ge
6ec0: 6f 6a 73 6f 6e 5f 64 65 73 74 72 6f 79 5f 73 74  ojson_destroy_st
6ed0: 61 63 6b 20 28 73 74 61 63 6b 29 3b 0a 20 20 20  ack (stack);.   
6ee0: 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20 20 65 72   return 1;..  er
6ef0: 72 3a 0a 20 20 20 20 67 65 6f 6a 73 6f 6e 5f 64  r:.    geojson_d
6f00: 65 73 74 72 6f 79 5f 73 74 61 63 6b 20 28 73 74  estroy_stack (st
6f10: 61 63 6b 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ack);.    return
6f20: 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e   0;.}..static in
6f30: 74 0a 67 65 6f 6a 73 6f 6e 5f 70 61 72 73 65 5f  t.geojson_parse_
6f40: 70 72 6f 70 65 72 74 69 65 73 20 28 67 65 6f 6a  properties (geoj
6f50: 73 6f 6e 5f 66 65 61 74 75 72 65 5f 70 74 72 20  son_feature_ptr 
6f60: 66 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ft, const char *
6f70: 62 75 66 2c 0a 09 09 09 20 20 63 68 61 72 20 2a  buf,....  char *
6f80: 2a 65 72 72 6f 72 5f 6d 65 73 73 61 67 65 29 0a  *error_message).
6f90: 7b 0a 2f 2a 20 61 74 74 65 6d 70 74 69 6e 67 20  {./* attempting 
6fa0: 74 6f 20 70 61 72 73 65 20 46 65 61 74 75 72 65  to parse Feature
6fb0: 27 73 20 50 72 6f 70 65 72 74 69 65 73 20 66 6f  's Properties fo
6fc0: 72 20 6c 6f 61 64 69 6e 67 20 56 61 6c 75 65 73  r loading Values
6fd0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 66 66 20   */.    int off 
6fe0: 3d 20 30 3b 0a 20 20 20 20 67 65 6f 6a 73 6f 6e  = 0;.    geojson
6ff0: 5f 73 74 61 63 6b 5f 70 74 72 20 73 74 61 63 6b  _stack_ptr stack
7000: 20 3d 20 67 65 6f 6a 73 6f 6e 5f 63 72 65 61 74   = geojson_creat
7010: 65 5f 73 74 61 63 6b 20 28 29 3b 0a 20 20 20 20  e_stack ();.    
7020: 67 65 6f 6a 73 6f 6e 5f 70 72 6f 70 65 72 74 79  geojson_property
7030: 5f 70 74 72 20 70 72 6f 70 3b 0a 0a 20 20 20 20  _ptr prop;..    
7040: 77 68 69 6c 65 20 28 31 29 0a 20 20 20 20 20 20  while (1).      
7050: 7b 0a 09 20 20 69 6e 74 20 72 65 74 3b 0a 09 20  {..  int ret;.. 
7060: 20 70 72 6f 70 20 3d 20 67 65 6f 6a 73 6f 6e 5f   prop = geojson_
7070: 63 72 65 61 74 65 5f 70 72 6f 70 65 72 74 79 20  create_property 
7080: 28 29 3b 0a 09 20 20 72 65 74 20 3d 20 67 65 6f  ();..  ret = geo
7090: 6a 73 6f 6e 5f 67 65 74 5f 70 72 6f 70 65 72 74  json_get_propert
70a0: 79 20 28 62 75 66 2c 20 73 74 61 63 6b 2c 20 70  y (buf, stack, p
70b0: 72 6f 70 2c 20 26 6f 66 66 2c 20 65 72 72 6f 72  rop, &off, error
70c0: 5f 6d 65 73 73 61 67 65 29 3b 0a 09 20 20 69 66  _message);..  if
70d0: 20 28 72 65 74 20 3c 3d 20 30 29 0a 09 20 20 20   (ret <= 0)..   
70e0: 20 20 20 67 65 6f 6a 73 6f 6e 5f 64 65 73 74 72     geojson_destr
70f0: 6f 79 5f 70 72 6f 70 65 72 74 79 20 28 70 72 6f  oy_property (pro
7100: 70 29 3b 0a 09 20 20 69 66 20 28 72 65 74 20 3c  p);..  if (ret <
7110: 20 30 29 0a 09 20 20 20 20 20 20 62 72 65 61 6b   0)..      break
7120: 3b 0a 09 20 20 69 66 20 28 72 65 74 20 3d 3d 20  ;..  if (ret == 
7130: 30 29 0a 09 20 20 20 20 20 20 67 6f 74 6f 20 65  0)..      goto e
7140: 72 72 3b 0a 09 20 20 69 66 20 28 70 72 6f 70 2d  rr;..  if (prop-
7150: 3e 6e 61 6d 65 20 21 3d 20 4e 55 4c 4c 29 0a 09  >name != NULL)..
7160: 20 20 20 20 7b 0a 09 09 73 77 69 74 63 68 20 28      {...switch (
7170: 70 72 6f 70 2d 3e 74 79 70 65 29 0a 09 09 20 20  prop->type)...  
7180: 7b 0a 09 09 20 20 63 61 73 65 20 47 45 4f 4a 53  {...  case GEOJS
7190: 4f 4e 5f 54 45 58 54 3a 0a 09 09 20 20 63 61 73  ON_TEXT:...  cas
71a0: 65 20 47 45 4f 4a 53 4f 4e 5f 49 4e 54 45 47 45  e GEOJSON_INTEGE
71b0: 52 3a 0a 09 09 20 20 63 61 73 65 20 47 45 4f 4a  R:...  case GEOJ
71c0: 53 4f 4e 5f 44 4f 55 42 4c 45 3a 0a 09 09 20 20  SON_DOUBLE:...  
71d0: 63 61 73 65 20 47 45 4f 4a 53 4f 4e 5f 54 52 55  case GEOJSON_TRU
71e0: 45 3a 0a 09 09 20 20 63 61 73 65 20 47 45 4f 4a  E:...  case GEOJ
71f0: 53 4f 4e 5f 46 41 4c 53 45 3a 0a 09 09 20 20 63  SON_FALSE:...  c
7200: 61 73 65 20 47 45 4f 4a 53 4f 4e 5f 4e 55 4c 4c  ase GEOJSON_NULL
7210: 3a 0a 09 09 20 20 20 20 20 20 2f 2a 20 61 64 64  :...      /* add
7220: 69 6e 67 20 61 20 50 72 6f 70 65 72 74 79 20 69  ing a Property i
7230: 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c  nto the linked l
7240: 69 73 74 20 2a 2f 0a 09 09 20 20 20 20 20 20 69  ist */...      i
7250: 66 20 28 66 74 2d 3e 66 69 72 73 74 20 3d 3d 20  f (ft->first == 
7260: 4e 55 4c 4c 29 0a 09 09 09 20 20 66 74 2d 3e 66  NULL)....  ft->f
7270: 69 72 73 74 20 3d 20 70 72 6f 70 3b 0a 09 09 20  irst = prop;... 
7280: 20 20 20 20 20 69 66 20 28 66 74 2d 3e 6c 61 73       if (ft->las
7290: 74 20 21 3d 20 4e 55 4c 4c 29 0a 09 09 09 20 20  t != NULL)....  
72a0: 66 74 2d 3e 6c 61 73 74 2d 3e 6e 65 78 74 20 3d  ft->last->next =
72b0: 20 70 72 6f 70 3b 0a 09 09 20 20 20 20 20 20 66   prop;...      f
72c0: 74 2d 3e 6c 61 73 74 20 3d 20 70 72 6f 70 3b 0a  t->last = prop;.
72d0: 09 09 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 09  ..      break;..
72e0: 09 20 20 64 65 66 61 75 6c 74 3a 0a 09 09 20 20  .  default:...  
72f0: 20 20 20 20 67 65 6f 6a 73 6f 6e 5f 64 65 73 74      geojson_dest
7300: 72 6f 79 5f 70 72 6f 70 65 72 74 79 20 28 70 72  roy_property (pr
7310: 6f 70 29 3b 0a 09 09 20 20 20 20 20 20 67 6f 74  op);...      got
7320: 6f 20 65 72 72 3b 0a 09 09 20 20 7d 3b 0a 09 20  o err;...  };.. 
7330: 20 20 20 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20     }..  else..  
7340: 20 20 7b 0a 09 09 67 65 6f 6a 73 6f 6e 5f 64 65    {...geojson_de
7350: 73 74 72 6f 79 5f 70 72 6f 70 65 72 74 79 20 28  stroy_property (
7360: 70 72 6f 70 29 3b 0a 09 09 67 6f 74 6f 20 65 72  prop);...goto er
7370: 72 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 20  r;..    }.      
7380: 7d 0a 20 20 20 20 67 65 6f 6a 73 6f 6e 5f 64 65  }.    geojson_de
7390: 73 74 72 6f 79 5f 73 74 61 63 6b 20 28 73 74 61  stroy_stack (sta
73a0: 63 6b 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ck);.    return 
73b0: 31 3b 0a 0a 20 20 65 72 72 3a 0a 20 20 20 20 67  1;..  err:.    g
73c0: 65 6f 6a 73 6f 6e 5f 64 65 73 74 72 6f 79 5f 73  eojson_destroy_s
73d0: 74 61 63 6b 20 28 73 74 61 63 6b 29 3b 0a 20 20  tack (stack);.  
73e0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 53    return 0;.}..S
73f0: 50 41 54 49 41 4c 49 54 45 5f 44 45 43 4c 41 52  PATIALITE_DECLAR
7400: 45 20 69 6e 74 0a 67 65 6f 6a 73 6f 6e 5f 63 68  E int.geojson_ch
7410: 65 63 6b 5f 66 65 61 74 75 72 65 73 20 28 67 65  eck_features (ge
7420: 6f 6a 73 6f 6e 5f 70 61 72 73 65 72 5f 70 74 72  ojson_parser_ptr
7430: 20 70 61 72 73 65 72 2c 20 63 68 61 72 20 2a 2a   parser, char **
7440: 65 72 72 6f 72 5f 6d 65 73 73 61 67 65 29 0a 7b  error_message).{
7450: 0a 2f 2a 20 63 68 65 63 6b 69 6e 67 20 46 65 61  ./* checking Fea
7460: 74 75 72 65 73 20 66 6f 72 20 76 61 6c 69 64 69  tures for validi
7470: 74 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b  ty */.    int i;
7480: 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20  .    int len;.  
7490: 20 20 63 68 61 72 20 2a 62 75 66 3b 0a 20 20 20    char *buf;.   
74a0: 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72   gaiaGeomCollPtr
74b0: 20 67 65 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20   geo = NULL;.   
74c0: 20 2a 65 72 72 6f 72 5f 6d 65 73 73 61 67 65 20   *error_message 
74d0: 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 69 66 20  = NULL;..    if 
74e0: 28 70 61 72 73 65 72 20 3d 3d 20 4e 55 4c 4c 29  (parser == NULL)
74f0: 0a 20 20 20 20 20 20 7b 0a 09 20 20 2a 65 72 72  .      {..  *err
7500: 6f 72 5f 6d 65 73 73 61 67 65 20 3d 20 73 71 6c  or_message = sql
7510: 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 47  ite3_mprintf ("G
7520: 65 6f 4a 53 4f 4e 20 70 61 72 73 65 72 3a 20 4e  eoJSON parser: N
7530: 55 4c 4c 20 6f 62 6a 65 63 74 5c 6e 22 29 3b 0a  ULL object\n");.
7540: 09 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20  .  return 0;.   
7550: 20 20 20 7d 0a 20 20 20 20 70 61 72 73 65 72 2d     }.    parser-
7560: 3e 6e 5f 70 6f 69 6e 74 73 20 3d 20 30 3b 0a 20  >n_points = 0;. 
7570: 20 20 20 70 61 72 73 65 72 2d 3e 6e 5f 6c 69 6e     parser->n_lin
7580: 65 73 74 72 69 6e 67 73 20 3d 20 30 3b 0a 20 20  estrings = 0;.  
7590: 20 20 70 61 72 73 65 72 2d 3e 6e 5f 70 6f 6c 79    parser->n_poly
75a0: 67 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 70 61  gons = 0;.    pa
75b0: 72 73 65 72 2d 3e 6e 5f 6d 70 6f 69 6e 74 73 20  rser->n_mpoints 
75c0: 3d 20 30 3b 0a 20 20 20 20 70 61 72 73 65 72 2d  = 0;.    parser-
75d0: 3e 6e 5f 6d 6c 69 6e 65 73 74 72 69 6e 67 73 20  >n_mlinestrings 
75e0: 3d 20 30 3b 0a 20 20 20 20 70 61 72 73 65 72 2d  = 0;.    parser-
75f0: 3e 6e 5f 6d 70 6f 6c 79 67 6f 6e 73 20 3d 20 30  >n_mpolygons = 0
7600: 3b 0a 20 20 20 20 70 61 72 73 65 72 2d 3e 6e 5f  ;.    parser->n_
7610: 67 65 6f 6d 63 6f 6c 6c 73 20 3d 20 30 3b 0a 20  geomcolls = 0;. 
7620: 20 20 20 70 61 72 73 65 72 2d 3e 6e 5f 67 65 6f     parser->n_geo
7630: 6d 5f 32 64 20 3d 20 30 3b 0a 20 20 20 20 70 61  m_2d = 0;.    pa
7640: 72 73 65 72 2d 3e 6e 5f 67 65 6f 6d 5f 33 64 20  rser->n_geom_3d 
7650: 3d 20 30 3b 0a 20 20 20 20 70 61 72 73 65 72 2d  = 0;.    parser-
7660: 3e 6e 5f 67 65 6f 6d 5f 34 64 20 3d 20 30 3b 0a  >n_geom_4d = 0;.
7670: 20 20 20 20 2a 28 70 61 72 73 65 72 2d 3e 63 61      *(parser->ca
7680: 73 74 5f 74 79 70 65 29 20 3d 20 27 5c 30 27 3b  st_type) = '\0';
7690: 0a 20 20 20 20 2a 28 70 61 72 73 65 72 2d 3e 63  .    *(parser->c
76a0: 61 73 74 5f 64 69 6d 73 29 20 3d 20 27 5c 30 27  ast_dims) = '\0'
76b0: 3b 0a 20 20 20 20 66 6f 72 20 28 69 20 3d 20 30  ;.    for (i = 0
76c0: 3b 20 69 20 3c 20 70 61 72 73 65 72 2d 3e 63 6f  ; i < parser->co
76d0: 75 6e 74 3b 20 69 2b 2b 29 0a 20 20 20 20 20 20  unt; i++).      
76e0: 7b 0a 09 20 20 2f 2a 20 72 65 61 64 69 6e 67 20  {..  /* reading 
76f0: 61 6e 64 20 70 61 72 73 69 6e 67 20 50 72 6f 70  and parsing Prop
7700: 65 72 74 69 65 73 20 66 6f 72 20 65 61 63 68 20  erties for each 
7710: 46 65 61 74 75 72 65 20 2a 2f 0a 09 20 20 69 6e  Feature */..  in
7720: 74 20 72 65 74 3b 0a 09 20 20 67 65 6f 6a 73 6f  t ret;..  geojso
7730: 6e 5f 66 65 61 74 75 72 65 5f 70 74 72 20 66 74  n_feature_ptr ft
7740: 20 3d 20 70 61 72 73 65 72 2d 3e 66 65 61 74 75   = parser->featu
7750: 72 65 73 20 2b 20 69 3b 0a 09 20 20 69 66 20 28  res + i;..  if (
7760: 66 74 2d 3e 70 72 6f 70 5f 6f 66 66 73 65 74 5f  ft->prop_offset_
7770: 73 74 61 72 74 20 3c 20 30 20 7c 7c 20 66 74 2d  start < 0 || ft-
7780: 3e 70 72 6f 70 5f 6f 66 66 73 65 74 5f 65 6e 64  >prop_offset_end
7790: 20 3c 20 30 29 0a 09 20 20 20 20 7b 0a 09 09 2a   < 0)..    {...*
77a0: 65 72 72 6f 72 5f 6d 65 73 73 61 67 65 20 3d 0a  error_message =.
77b0: 09 09 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70  ..    sqlite3_mp
77c0: 72 69 6e 74 66 0a 09 09 20 20 20 20 28 22 47 65  rintf...    ("Ge
77d0: 6f 4a 53 4f 4e 20 70 61 72 73 65 72 3a 20 69 6e  oJSON parser: in
77e0: 76 61 6c 69 64 20 50 72 6f 70 65 72 74 69 65 73  valid Properties
77f0: 20 28 66 69 64 3d 25 64 29 5c 6e 22 2c 20 66 74   (fid=%d)\n", ft
7800: 2d 3e 66 69 64 29 3b 0a 09 09 72 65 74 75 72 6e  ->fid);...return
7810: 20 30 3b 0a 09 20 20 20 20 7d 0a 09 20 20 69 66   0;..    }..  if
7820: 20 28 66 74 2d 3e 70 72 6f 70 5f 6f 66 66 73 65   (ft->prop_offse
7830: 74 5f 65 6e 64 20 3c 3d 20 66 74 2d 3e 70 72 6f  t_end <= ft->pro
7840: 70 5f 6f 66 66 73 65 74 5f 73 74 61 72 74 29 0a  p_offset_start).
7850: 09 20 20 20 20 7b 0a 09 09 2a 65 72 72 6f 72 5f  .    {...*error_
7860: 6d 65 73 73 61 67 65 20 3d 0a 09 09 20 20 20 20  message =...    
7870: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 0a  sqlite3_mprintf.
7880: 09 09 20 20 20 20 28 22 47 65 6f 4a 53 4f 4e 20  ..    ("GeoJSON 
7890: 70 61 72 73 65 72 3a 20 69 6e 76 61 6c 69 64 20  parser: invalid 
78a0: 50 72 6f 70 65 72 74 69 65 73 20 28 66 69 64 3d  Properties (fid=
78b0: 25 64 29 5c 6e 22 2c 20 66 74 2d 3e 66 69 64 29  %d)\n", ft->fid)
78c0: 3b 0a 09 09 72 65 74 75 72 6e 20 30 3b 0a 09 20  ;...return 0;.. 
78d0: 20 20 20 7d 0a 09 20 20 72 65 74 20 3d 20 66 73     }..  ret = fs
78e0: 65 65 6b 20 28 70 61 72 73 65 72 2d 3e 69 6e 2c  eek (parser->in,
78f0: 20 66 74 2d 3e 70 72 6f 70 5f 6f 66 66 73 65 74   ft->prop_offset
7900: 5f 73 74 61 72 74 2c 20 53 45 45 4b 5f 53 45 54  _start, SEEK_SET
7910: 29 3b 0a 09 20 20 69 66 20 28 72 65 74 20 21 3d  );..  if (ret !=
7920: 20 30 29 0a 09 20 20 20 20 7b 0a 09 09 2a 65 72   0)..    {...*er
7930: 72 6f 72 5f 6d 65 73 73 61 67 65 20 3d 0a 09 09  ror_message =...
7940: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69      sqlite3_mpri
7950: 6e 74 66 0a 09 09 20 20 20 20 28 22 47 65 6f 4a  ntf...    ("GeoJ
7960: 53 4f 4e 20 70 61 72 73 65 72 3a 20 50 72 6f 70  SON parser: Prop
7970: 65 72 74 69 65 73 20 69 6e 76 61 6c 69 64 20 73  erties invalid s
7980: 65 65 6b 20 28 66 69 64 3d 25 64 29 5c 6e 22 2c  eek (fid=%d)\n",
7990: 0a 09 09 20 20 20 20 20 66 74 2d 3e 66 69 64 29  ...     ft->fid)
79a0: 3b 0a 09 09 72 65 74 75 72 6e 20 30 3b 0a 09 20  ;...return 0;.. 
79b0: 20 20 20 7d 0a 09 20 20 6c 65 6e 20 3d 20 66 74     }..  len = ft
79c0: 2d 3e 70 72 6f 70 5f 6f 66 66 73 65 74 5f 65 6e  ->prop_offset_en
79d0: 64 20 2d 20 66 74 2d 3e 70 72 6f 70 5f 6f 66 66  d - ft->prop_off
79e0: 73 65 74 5f 73 74 61 72 74 20 2d 20 31 3b 0a 09  set_start - 1;..
79f0: 20 20 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 20 28    buf = malloc (
7a00: 6c 65 6e 20 2b 20 31 29 3b 0a 09 20 20 69 66 20  len + 1);..  if 
7a10: 28 62 75 66 20 3d 3d 20 4e 55 4c 4c 29 0a 09 20  (buf == NULL).. 
7a20: 20 20 20 7b 0a 09 09 2a 65 72 72 6f 72 5f 6d 65     {...*error_me
7a30: 73 73 61 67 65 20 3d 0a 09 09 20 20 20 20 73 71  ssage =...    sq
7a40: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 0a 09 09  lite3_mprintf...
7a50: 20 20 20 20 28 22 47 65 6f 4a 53 4f 4e 20 70 61      ("GeoJSON pa
7a60: 72 73 65 72 3a 20 50 72 6f 70 65 72 74 69 65 73  rser: Properties
7a70: 20 69 6e 73 75 66 66 69 63 69 65 6e 74 20 6d 65   insufficient me
7a80: 6d 6f 72 79 20 28 66 69 64 3d 25 64 29 5c 6e 22  mory (fid=%d)\n"
7a90: 2c 0a 09 09 20 20 20 20 20 66 74 2d 3e 66 69 64  ,...     ft->fid
7aa0: 29 3b 0a 09 09 72 65 74 75 72 6e 20 30 3b 0a 09  );...return 0;..
7ab0: 20 20 20 20 7d 0a 09 20 20 72 65 74 20 3d 20 66      }..  ret = f
7ac0: 72 65 61 64 20 28 62 75 66 2c 20 31 2c 20 6c 65  read (buf, 1, le
7ad0: 6e 2c 20 70 61 72 73 65 72 2d 3e 69 6e 29 3b 0a  n, parser->in);.
7ae0: 09 20 20 69 66 20 28 72 65 74 20 21 3d 20 6c 65  .  if (ret != le
7af0: 6e 29 0a 09 20 20 20 20 7b 0a 09 09 2a 65 72 72  n)..    {...*err
7b00: 6f 72 5f 6d 65 73 73 61 67 65 20 3d 0a 09 09 20  or_message =... 
7b10: 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e     sqlite3_mprin
7b20: 74 66 0a 09 09 20 20 20 20 28 22 47 65 6f 4a 53  tf...    ("GeoJS
7b30: 4f 4e 20 70 61 72 73 65 72 3a 20 50 72 6f 70 65  ON parser: Prope
7b40: 72 74 69 65 73 20 72 65 61 64 20 65 72 72 6f 72  rties read error
7b50: 20 28 66 69 64 3d 25 64 29 5c 6e 22 2c 0a 09 09   (fid=%d)\n",...
7b60: 20 20 20 20 20 66 74 2d 3e 66 69 64 29 3b 0a 09       ft->fid);..
7b70: 09 66 72 65 65 20 28 62 75 66 29 3b 0a 09 09 72  .free (buf);...r
7b80: 65 74 75 72 6e 20 30 3b 0a 09 20 20 20 20 7d 0a  eturn 0;..    }.
7b90: 09 20 20 2a 28 62 75 66 20 2b 20 6c 65 6e 29 20  .  *(buf + len) 
7ba0: 3d 20 27 5c 30 27 3b 0a 09 20 20 67 65 6f 6a 73  = '\0';..  geojs
7bb0: 6f 6e 5f 70 61 72 73 65 5f 63 6f 6c 75 6d 6e 73  on_parse_columns
7bc0: 20 28 70 61 72 73 65 72 2c 20 62 75 66 2c 20 65   (parser, buf, e
7bd0: 72 72 6f 72 5f 6d 65 73 73 61 67 65 29 3b 0a 09  rror_message);..
7be0: 20 20 66 72 65 65 20 28 62 75 66 29 3b 0a 20 20    free (buf);.  
7bf0: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 20 28 69      }.    for (i
7c00: 20 3d 20 30 3b 20 69 20 3c 20 70 61 72 73 65 72   = 0; i < parser
7c10: 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 0a 20 20  ->count; i++).  
7c20: 20 20 20 20 7b 0a 09 20 20 2f 2a 20 72 65 61 64      {..  /* read
7c30: 69 6e 67 20 61 6e 64 20 70 61 72 73 69 6e 67 20  ing and parsing 
7c40: 47 65 6f 6d 65 74 72 79 20 66 6f 72 20 65 61 63  Geometry for eac
7c50: 68 20 46 65 61 74 75 72 65 20 2a 2f 0a 09 20 20  h Feature */..  
7c60: 69 6e 74 20 72 65 74 3b 0a 09 20 20 67 65 6f 6a  int ret;..  geoj
7c70: 73 6f 6e 5f 66 65 61 74 75 72 65 5f 70 74 72 20  son_feature_ptr 
7c80: 66 74 20 3d 20 70 61 72 73 65 72 2d 3e 66 65 61  ft = parser->fea
7c90: 74 75 72 65 73 20 2b 20 69 3b 0a 09 20 20 69 66  tures + i;..  if
7ca0: 20 28 66 74 2d 3e 67 65 6f 6d 5f 6f 66 66 73 65   (ft->geom_offse
7cb0: 74 5f 73 74 61 72 74 20 3c 20 30 20 7c 7c 20 66  t_start < 0 || f
7cc0: 74 2d 3e 67 65 6f 6d 5f 6f 66 66 73 65 74 5f 65  t->geom_offset_e
7cd0: 6e 64 20 3c 20 30 29 0a 09 20 20 20 20 7b 0a 09  nd < 0)..    {..
7ce0: 09 2a 65 72 72 6f 72 5f 6d 65 73 73 61 67 65 20  .*error_message 
7cf0: 3d 0a 09 09 20 20 20 20 73 71 6c 69 74 65 33 5f  =...    sqlite3_
7d00: 6d 70 72 69 6e 74 66 0a 09 09 20 20 20 20 28 22  mprintf...    ("
7d10: 47 65 6f 4a 53 4f 4e 20 70 61 72 73 65 72 3a 20  GeoJSON parser: 
7d20: 69 6e 76 61 6c 69 64 20 47 65 6f 6d 65 74 72 79  invalid Geometry
7d30: 20 28 66 69 64 3d 25 64 29 5c 6e 22 2c 20 66 74   (fid=%d)\n", ft
7d40: 2d 3e 66 69 64 29 3b 0a 09 09 72 65 74 75 72 6e  ->fid);...return
7d50: 20 30 3b 0a 09 20 20 20 20 7d 0a 09 20 20 69 66   0;..    }..  if
7d60: 20 28 66 74 2d 3e 67 65 6f 6d 5f 6f 66 66 73 65   (ft->geom_offse
7d70: 74 5f 65 6e 64 20 3c 3d 20 66 74 2d 3e 67 65 6f  t_end <= ft->geo
7d80: 6d 5f 6f 66 66 73 65 74 5f 73 74 61 72 74 29 0a  m_offset_start).
7d90: 09 20 20 20 20 7b 0a 09 09 2a 65 72 72 6f 72 5f  .    {...*error_
7da0: 6d 65 73 73 61 67 65 20 3d 0a 09 09 20 20 20 20  message =...    
7db0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 0a  sqlite3_mprintf.
7dc0: 09 09 20 20 20 20 28 22 47 65 6f 4a 53 4f 4e 20  ..    ("GeoJSON 
7dd0: 70 61 72 73 65 72 3a 20 69 6e 76 61 6c 69 64 20  parser: invalid 
7de0: 47 65 6f 6d 65 74 72 79 20 28 66 69 64 3d 25 64  Geometry (fid=%d
7df0: 29 5c 6e 22 2c 20 66 74 2d 3e 66 69 64 29 3b 0a  )\n", ft->fid);.
7e00: 09 09 72 65 74 75 72 6e 20 30 3b 0a 09 20 20 20  ..return 0;..   
7e10: 20 7d 0a 09 20 20 72 65 74 20 3d 20 66 73 65 65   }..  ret = fsee
7e20: 6b 20 28 70 61 72 73 65 72 2d 3e 69 6e 2c 20 66  k (parser->in, f
7e30: 74 2d 3e 67 65 6f 6d 5f 6f 66 66 73 65 74 5f 73  t->geom_offset_s
7e40: 74 61 72 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b  tart, SEEK_SET);
7e50: 0a 09 20 20 69 66 20 28 72 65 74 20 21 3d 20 30  ..  if (ret != 0
7e60: 29 0a 09 20 20 20 20 7b 0a 09 09 2a 65 72 72 6f  )..    {...*erro
7e70: 72 5f 6d 65 73 73 61 67 65 20 3d 0a 09 09 20 20  r_message =...  
7e80: 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74    sqlite3_mprint
7e90: 66 0a 09 09 20 20 20 20 28 22 47 65 6f 4a 53 4f  f...    ("GeoJSO
7ea0: 4e 20 70 61 72 73 65 72 3a 20 47 65 6f 6d 65 74  N parser: Geomet
7eb0: 72 79 20 69 6e 76 61 6c 69 64 20 73 65 65 6b 20  ry invalid seek 
7ec0: 28 66 69 64 3d 25 64 29 5c 6e 22 2c 0a 09 09 20  (fid=%d)\n",... 
7ed0: 20 20 20 20 66 74 2d 3e 66 69 64 29 3b 0a 09 09      ft->fid);...
7ee0: 72 65 74 75 72 6e 20 30 3b 0a 09 20 20 20 20 7d  return 0;..    }
7ef0: 0a 09 20 20 6c 65 6e 20 3d 20 66 74 2d 3e 67 65  ..  len = ft->ge
7f00: 6f 6d 5f 6f 66 66 73 65 74 5f 65 6e 64 20 2d 20  om_offset_end - 
7f10: 66 74 2d 3e 67 65 6f 6d 5f 6f 66 66 73 65 74 5f  ft->geom_offset_
7f20: 73 74 61 72 74 3b 0a 09 20 20 69 66 20 28 6c 65  start;..  if (le
7f30: 6e 20 3d 3d 20 30 29 0a 09 20 20 20 20 7b 0a 09  n == 0)..    {..
7f40: 09 2f 2a 20 4e 55 4c 4c 20 47 65 6f 6d 65 74 72  ./* NULL Geometr
7f50: 79 20 2a 2f 0a 09 09 70 61 72 73 65 72 2d 3e 6e  y */...parser->n
7f60: 5f 67 65 6f 6d 5f 6e 75 6c 6c 20 2b 3d 20 31 3b  _geom_null += 1;
7f70: 0a 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 20 20  ...continue;..  
7f80: 20 20 7d 0a 09 20 20 62 75 66 20 3d 20 6d 61 6c    }..  buf = mal
7f90: 6c 6f 63 20 28 6c 65 6e 20 2b 20 32 29 3b 0a 09  loc (len + 2);..
7fa0: 20 20 69 66 20 28 62 75 66 20 3d 3d 20 4e 55 4c    if (buf == NUL
7fb0: 4c 29 0a 09 20 20 20 20 7b 0a 09 09 2a 65 72 72  L)..    {...*err
7fc0: 6f 72 5f 6d 65 73 73 61 67 65 20 3d 0a 09 09 20  or_message =... 
7fd0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e     sqlite3_mprin
7fe0: 74 66 0a 09 09 20 20 20 20 28 22 47 65 6f 4a 53  tf...    ("GeoJS
7ff0: 4f 4e 20 70 61 72 73 65 72 3a 20 47 65 6f 6d 65  ON parser: Geome
8000: 74 72 79 20 69 6e 73 75 66 66 69 63 69 65 6e 74  try insufficient
8010: 20 6d 65 6d 6f 72 79 20 28 66 69 64 3d 25 64 29   memory (fid=%d)
8020: 5c 6e 22 2c 0a 09 09 20 20 20 20 20 66 74 2d 3e  \n",...     ft->
8030: 66 69 64 29 3b 0a 09 09 72 65 74 75 72 6e 20 30  fid);...return 0
8040: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 2a 62 75 66  ;..    }..  *buf
8050: 20 3d 20 27 7b 27 3b 0a 09 20 20 72 65 74 20 3d   = '{';..  ret =
8060: 20 66 72 65 61 64 20 28 62 75 66 20 2b 20 31 2c   fread (buf + 1,
8070: 20 31 2c 20 6c 65 6e 2c 20 70 61 72 73 65 72 2d   1, len, parser-
8080: 3e 69 6e 29 3b 0a 09 20 20 69 66 20 28 72 65 74  >in);..  if (ret
8090: 20 21 3d 20 6c 65 6e 29 0a 09 20 20 20 20 7b 0a   != len)..    {.
80a0: 09 09 2a 65 72 72 6f 72 5f 6d 65 73 73 61 67 65  ..*error_message
80b0: 20 3d 0a 09 09 20 20 20 20 73 71 6c 69 74 65 33   =...    sqlite3
80c0: 5f 6d 70 72 69 6e 74 66 0a 09 09 20 20 20 20 28  _mprintf...    (
80d0: 22 47 65 6f 4a 53 4f 4e 20 70 61 72 73 65 72 3a  "GeoJSON parser:
80e0: 20 47 65 6f 6d 65 74 72 79 20 72 65 61 64 20 65   Geometry read e
80f0: 72 72 6f 72 20 28 66 69 64 3d 25 64 29 5c 6e 22  rror (fid=%d)\n"
8100: 2c 20 66 74 2d 3e 66 69 64 29 3b 0a 09 09 66 72  , ft->fid);...fr
8110: 65 65 20 28 62 75 66 29 3b 0a 09 09 72 65 74 75  ee (buf);...retu
8120: 72 6e 20 30 3b 0a 09 20 20 20 20 7d 0a 09 20 20  rn 0;..    }..  
8130: 2a 28 62 75 66 20 2b 20 6c 65 6e 20 2b 20 31 29  *(buf + len + 1)
8140: 20 3d 20 27 5c 30 27 3b 0a 09 20 20 67 65 6f 20   = '\0';..  geo 
8150: 3d 20 67 61 69 61 50 61 72 73 65 47 65 6f 4a 53  = gaiaParseGeoJS
8160: 4f 4e 20 28 28 63 6f 6e 73 74 20 75 6e 73 69 67  ON ((const unsig
8170: 6e 65 64 20 63 68 61 72 20 2a 29 20 62 75 66 29  ned char *) buf)
8180: 3b 0a 09 20 20 69 66 20 28 67 65 6f 20 21 3d 20  ;..  if (geo != 
8190: 4e 55 4c 4c 29 0a 09 20 20 20 20 7b 0a 09 09 2f  NULL)..    {.../
81a0: 2a 20 73 6e 69 66 66 69 6e 67 20 47 65 6f 6d 65  * sniffing Geome
81b0: 74 72 79 54 79 70 65 20 61 6e 64 20 44 69 6d 65  tryType and Dime
81c0: 6e 73 69 6f 6e 73 20 2a 2f 0a 09 09 73 77 69 74  nsions */...swit
81d0: 63 68 20 28 67 65 6f 2d 3e 44 69 6d 65 6e 73 69  ch (geo->Dimensi
81e0: 6f 6e 4d 6f 64 65 6c 29 0a 09 09 20 20 7b 0a 09  onModel)...  {..
81f0: 09 20 20 63 61 73 65 20 47 41 49 41 5f 58 59 3a  .  case GAIA_XY:
8200: 0a 09 09 20 20 20 20 20 20 70 61 72 73 65 72 2d  ...      parser-
8210: 3e 6e 5f 67 65 6f 6d 5f 32 64 20 2b 3d 20 31 3b  >n_geom_2d += 1;
8220: 0a 09 09 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ...      break;.
8230: 09 09 20 20 63 61 73 65 20 47 41 49 41 5f 58 59  ..  case GAIA_XY
8240: 5f 5a 3a 0a 09 09 20 20 20 20 20 20 70 61 72 73  _Z:...      pars
8250: 65 72 2d 3e 6e 5f 67 65 6f 6d 5f 33 64 20 2b 3d  er->n_geom_3d +=
8260: 20 31 3b 0a 09 09 20 20 20 20 20 20 62 72 65 61   1;...      brea
8270: 6b 3b 0a 09 09 20 20 63 61 73 65 20 47 41 49 41  k;...  case GAIA
8280: 5f 58 59 5f 5a 5f 4d 3a 0a 09 09 20 20 20 20 20  _XY_Z_M:...     
8290: 20 70 61 72 73 65 72 2d 3e 6e 5f 67 65 6f 6d 5f   parser->n_geom_
82a0: 34 64 20 2b 3d 20 31 3b 0a 09 09 20 20 20 20 20  4d += 1;...     
82b0: 20 62 72 65 61 6b 3b 0a 09 09 20 20 64 65 66 61   break;...  defa
82c0: 75 6c 74 3a 0a 09 09 20 20 20 20 20 20 2a 65 72  ult:...      *er
82d0: 72 6f 72 5f 6d 65 73 73 61 67 65 20 3d 0a 09 09  ror_message =...
82e0: 09 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  .  sqlite3_mprin
82f0: 74 66 0a 09 09 09 20 20 28 22 47 65 6f 4a 53 4f  tf....  ("GeoJSO
8300: 4e 20 70 61 72 73 65 72 3a 20 47 65 6f 6d 65 74  N parser: Geomet
8310: 72 79 20 68 61 73 20 69 6e 76 61 6c 69 64 20 64  ry has invalid d
8320: 69 6d 65 6e 73 69 6f 6e 73 20 28 66 69 64 3d 25  imensions (fid=%
8330: 64 29 5c 6e 22 2c 0a 09 09 09 20 20 20 66 74 2d  d)\n",....   ft-
8340: 3e 66 69 64 29 3b 0a 09 09 20 20 20 20 20 20 66  >fid);...      f
8350: 72 65 65 20 28 62 75 66 29 3b 0a 09 09 20 20 20  ree (buf);...   
8360: 20 20 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43     gaiaFreeGeomC
8370: 6f 6c 6c 20 28 67 65 6f 29 3b 0a 09 09 20 20 20  oll (geo);...   
8380: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 09 09 20     return 0;... 
8390: 20 7d 3b 0a 09 09 73 77 69 74 63 68 20 28 67 65   };...switch (ge
83a0: 6f 2d 3e 44 65 63 6c 61 72 65 64 54 79 70 65 29  o->DeclaredType)
83b0: 0a 09 09 20 20 7b 0a 09 09 20 20 63 61 73 65 20  ...  {...  case 
83c0: 47 41 49 41 5f 50 4f 49 4e 54 3a 0a 09 09 20 20  GAIA_POINT:...  
83d0: 20 20 20 20 70 61 72 73 65 72 2d 3e 6e 5f 70 6f      parser->n_po
83e0: 69 6e 74 73 20 2b 3d 20 31 3b 0a 09 09 20 20 20  ints += 1;...   
83f0: 20 20 20 62 72 65 61 6b 3b 0a 09 09 20 20 63 61     break;...  ca
8400: 73 65 20 47 41 49 41 5f 4c 49 4e 45 53 54 52 49  se GAIA_LINESTRI
8410: 4e 47 3a 0a 09 09 20 20 20 20 20 20 70 61 72 73  NG:...      pars
8420: 65 72 2d 3e 6e 5f 6c 69 6e 65 73 74 72 69 6e 67  er->n_linestring
8430: 73 20 2b 3d 20 31 3b 0a 09 09 20 20 20 20 20 20  s += 1;...      
8440: 62 72 65 61 6b 3b 0a 09 09 20 20 63 61 73 65 20  break;...  case 
8450: 47 41 49 41 5f 50 4f 4c 59 47 4f 4e 3a 0a 09 09  GAIA_POLYGON:...
8460: 20 20 20 20 20 20 70 61 72 73 65 72 2d 3e 6e 5f        parser->n_
8470: 70 6f 6c 79 67 6f 6e 73 20 2b 3d 20 31 3b 0a 09  polygons += 1;..
8480: 09 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 09 09  .      break;...
8490: 20 20 63 61 73 65 20 47 41 49 41 5f 4d 55 4c 54    case GAIA_MULT
84a0: 49 50 4f 49 4e 54 3a 0a 09 09 20 20 20 20 20 20  IPOINT:...      
84b0: 70 61 72 73 65 72 2d 3e 6e 5f 6d 70 6f 69 6e 74  parser->n_mpoint
84c0: 73 20 2b 3d 20 31 3b 0a 09 09 20 20 20 20 20 20  s += 1;...      
84d0: 62 72 65 61 6b 3b 0a 09 09 20 20 63 61 73 65 20  break;...  case 
84e0: 47 41 49 41 5f 4d 55 4c 54 49 4c 49 4e 45 53 54  GAIA_MULTILINEST
84f0: 52 49 4e 47 3a 0a 09 09 20 20 20 20 20 20 70 61  RING:...      pa
8500: 72 73 65 72 2d 3e 6e 5f 6d 6c 69 6e 65 73 74 72  rser->n_mlinestr
8510: 69 6e 67 73 20 2b 3d 20 31 3b 0a 09 09 20 20 20  ings += 1;...   
8520: 20 20 20 62 72 65 61 6b 3b 0a 09 09 20 20 63 61     break;...  ca
8530: 73 65 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 4c  se GAIA_MULTIPOL
8540: 59 47 4f 4e 3a 0a 09 09 20 20 20 20 20 20 70 61  YGON:...      pa
8550: 72 73 65 72 2d 3e 6e 5f 6d 70 6f 6c 79 67 6f 6e  rser->n_mpolygon
8560: 73 20 2b 3d 20 31 3b 0a 09 09 20 20 20 20 20 20  s += 1;...      
8570: 62 72 65 61 6b 3b 0a 09 09 20 20 63 61 73 65 20  break;...  case 
8580: 47 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c  GAIA_GEOMETRYCOL
8590: 4c 45 43 54 49 4f 4e 3a 0a 09 09 20 20 20 20 20  LECTION:...     
85a0: 20 70 61 72 73 65 72 2d 3e 6e 5f 67 65 6f 6d 63   parser->n_geomc
85b0: 6f 6c 6c 73 20 2b 3d 20 31 3b 0a 09 09 20 20 20  olls += 1;...   
85c0: 20 20 20 62 72 65 61 6b 3b 0a 09 09 20 20 64 65     break;...  de
85d0: 66 61 75 6c 74 3a 0a 09 09 20 20 20 20 20 20 2a  fault:...      *
85e0: 65 72 72 6f 72 5f 6d 65 73 73 61 67 65 20 3d 0a  error_message =.
85f0: 09 09 09 20 20 73 71 6c 69 74 65 33 5f 6d 70 72  ...  sqlite3_mpr
8600: 69 6e 74 66 0a 09 09 09 20 20 28 22 47 65 6f 4a  intf....  ("GeoJ
8610: 53 4f 4e 20 70 61 72 73 65 72 3a 20 47 65 6f 6d  SON parser: Geom
8620: 65 74 72 79 20 68 61 73 20 61 6e 20 69 6e 76 61  etry has an inva
8630: 6c 69 64 20 54 79 70 65 20 28 66 69 64 3d 25 64  lid Type (fid=%d
8640: 29 5c 6e 22 2c 0a 09 09 09 20 20 20 66 74 2d 3e  )\n",....   ft->
8650: 66 69 64 29 3b 0a 09 09 20 20 20 20 20 20 66 72  fid);...      fr
8660: 65 65 20 28 62 75 66 29 3b 0a 09 09 20 20 20 20  ee (buf);...    
8670: 20 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f    gaiaFreeGeomCo
8680: 6c 6c 20 28 67 65 6f 29 3b 0a 09 09 20 20 20 20  ll (geo);...    
8690: 20 20 72 65 74 75 72 6e 20 30 3b 0a 09 09 20 20    return 0;...  
86a0: 7d 3b 0a 09 09 67 61 69 61 46 72 65 65 47 65 6f  };...gaiaFreeGeo
86b0: 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b 0a 09 20 20  mColl (geo);..  
86c0: 20 20 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20 20    }..  else..   
86d0: 20 20 20 70 61 72 73 65 72 2d 3e 6e 5f 67 65 6f     parser->n_geo
86e0: 6d 5f 6e 75 6c 6c 20 2b 3d 20 31 3b 0a 09 20 20  m_null += 1;..  
86f0: 66 72 65 65 20 28 62 75 66 29 3b 0a 20 20 20 20  free (buf);.    
8700: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 31    }.    return 1
8710: 3b 0a 7d 0a 0a 53 50 41 54 49 41 4c 49 54 45 5f  ;.}..SPATIALITE_
8720: 44 45 43 4c 41 52 45 20 69 6e 74 0a 67 65 6f 6a  DECLARE int.geoj
8730: 73 6f 6e 5f 63 72 65 61 74 65 5f 66 65 61 74 75  son_create_featu
8740: 72 65 73 5f 69 6e 64 65 78 20 28 67 65 6f 6a 73  res_index (geojs
8750: 6f 6e 5f 70 61 72 73 65 72 5f 70 74 72 20 70 61  on_parser_ptr pa
8760: 72 73 65 72 2c 20 63 68 61 72 20 2a 2a 65 72 72  rser, char **err
8770: 6f 72 5f 6d 65 73 73 61 67 65 29 0a 7b 0a 2f 2a  or_message).{./*
8780: 20 63 72 65 61 74 69 6e 67 20 74 68 65 20 69 6e   creating the in
8790: 64 65 78 20 6f 66 20 61 6c 6c 20 47 65 6f 4a 53  dex of all GeoJS
87a0: 4f 4e 20 46 65 61 74 75 72 65 73 20 2a 2f 0a 20  ON Features */. 
87b0: 20 20 20 67 65 6f 6a 73 6f 6e 5f 62 6c 6f 63 6b     geojson_block
87c0: 5f 70 74 72 20 70 62 3b 0a 20 20 20 20 67 65 6f  _ptr pb;.    geo
87d0: 6a 73 6f 6e 5f 62 6c 6f 63 6b 5f 70 74 72 20 70  json_block_ptr p
87e0: 62 6e 3b 0a 20 20 20 20 67 65 6f 6a 73 6f 6e 5f  bn;.    geojson_
87f0: 66 65 61 74 75 72 65 5f 70 74 72 20 70 66 20 3d  feature_ptr pf =
8800: 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 65 6f 6a 73   NULL;.    geojs
8810: 6f 6e 5f 65 6e 74 72 79 5f 70 74 72 20 65 6e 74  on_entry_ptr ent
8820: 72 79 3b 0a 20 20 20 20 69 6e 74 20 63 6f 75 6e  ry;.    int coun
8830: 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  t;.    int i;.  
8840: 20 20 2a 65 72 72 6f 72 5f 6d 65 73 73 61 67 65    *error_message
8850: 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 69 66   = NULL;..    if
8860: 20 28 70 61 72 73 65 72 20 3d 3d 20 4e 55 4c 4c   (parser == NULL
8870: 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2a 65 72  ).      {..  *er
8880: 72 6f 72 5f 6d 65 73 73 61 67 65 20 3d 20 73 71  ror_message = sq
8890: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22  lite3_mprintf ("
88a0: 47 65 6f 4a 53 4f 4e 20 70 61 72 73 65 72 3a 20  GeoJSON parser: 
88b0: 4e 55 4c 4c 20 6f 62 6a 65 63 74 5c 6e 22 29 3b  NULL object\n");
88c0: 0a 09 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ..  return 0;.  
88d0: 20 20 20 20 7d 0a 0a 20 20 20 20 70 61 72 73 65      }..    parse
88e0: 72 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20  r->count = 0;.  
88f0: 20 20 70 62 20 3d 20 70 61 72 73 65 72 2d 3e 66    pb = parser->f
8900: 69 72 73 74 3b 0a 20 20 20 20 77 68 69 6c 65 20  irst;.    while 
8910: 28 70 62 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20  (pb != NULL).   
8920: 20 20 20 7b 0a 09 20 20 2f 2a 20 63 6f 75 6e 74     {..  /* count
8930: 69 6e 67 20 68 6f 77 20 6d 61 6e 79 20 46 65 61  ing how many Fea
8940: 74 75 72 65 73 20 61 72 65 20 74 68 65 72 65 20  tures are there 
8950: 2a 2f 0a 09 20 20 66 6f 72 20 28 69 20 3d 20 30  */..  for (i = 0
8960: 3b 20 69 20 3c 20 70 62 2d 3e 6e 65 78 74 5f 66  ; i < pb->next_f
8970: 72 65 65 5f 65 6e 74 72 79 3b 20 69 2b 2b 29 0a  ree_entry; i++).
8980: 09 20 20 20 20 7b 0a 09 09 65 6e 74 72 79 20 3d  .    {...entry =
8990: 20 70 62 2d 3e 65 6e 74 72 69 65 73 20 2b 20 69   pb->entries + i
89a0: 3b 0a 09 09 69 66 20 28 65 6e 74 72 79 2d 3e 74  ;...if (entry->t
89b0: 79 70 65 20 21 3d 20 47 45 4f 4a 53 4f 4e 5f 46  ype != GEOJSON_F
89c0: 45 41 54 55 52 45 29 0a 09 09 20 20 20 20 63 6f  EATURE)...    co
89d0: 6e 74 69 6e 75 65 3b 0a 09 09 70 61 72 73 65 72  ntinue;...parser
89e0: 2d 3e 63 6f 75 6e 74 20 2b 3d 20 31 3b 0a 09 20  ->count += 1;.. 
89f0: 20 20 20 7d 0a 09 20 20 70 62 20 3d 20 70 62 2d     }..  pb = pb-
8a00: 3e 6e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  >next;.      }. 
8a10: 20 20 20 69 66 20 28 70 61 72 73 65 72 2d 3e 66     if (parser->f
8a20: 65 61 74 75 72 65 73 20 21 3d 20 4e 55 4c 4c 29  eatures != NULL)
8a30: 0a 09 66 72 65 65 20 28 70 61 72 73 65 72 2d 3e  ..free (parser->
8a40: 66 65 61 74 75 72 65 73 29 3b 0a 2f 2a 20 61 6c  features);./* al
8a50: 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 69 6e 64  locating the ind
8a60: 65 78 20 6f 66 20 61 6c 6c 20 46 65 61 74 75 72  ex of all Featur
8a70: 65 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 61  es */.    if (pa
8a80: 72 73 65 72 2d 3e 63 6f 75 6e 74 20 3c 3d 20 30  rser->count <= 0
8a90: 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2a 65 72  ).      {..  *er
8aa0: 72 6f 72 5f 6d 65 73 73 61 67 65 20 3d 0a 09 20  ror_message =.. 
8ab0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72       sqlite3_mpr
8ac0: 69 6e 74 66 0a 09 20 20 20 20 20 20 28 22 47 65  intf..      ("Ge
8ad0: 6f 4a 53 4f 4e 20 70 61 72 73 65 72 3a 20 6e 6f  oJSON parser: no
8ae0: 74 20 61 20 73 69 6e 67 6c 65 20 46 65 61 74 75  t a single Featu
8af0: 72 65 20 77 61 73 20 66 6f 75 6e 64 20 2e 2e 2e  re was found ...
8b00: 20 69 6e 76 61 6c 69 64 20 66 6f 72 6d 61 74 20   invalid format 
8b10: 3f 5c 6e 22 29 3b 0a 09 20 20 72 65 74 75 72 6e  ?\n");..  return
8b20: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
8b30: 70 61 72 73 65 72 2d 3e 66 65 61 74 75 72 65 73  parser->features
8b40: 20 3d 20 6d 61 6c 6c 6f 63 20 28 73 69 7a 65 6f   = malloc (sizeo
8b50: 66 20 28 67 65 6f 6a 73 6f 6e 5f 66 65 61 74 75  f (geojson_featu
8b60: 72 65 29 20 2a 20 70 61 72 73 65 72 2d 3e 63 6f  re) * parser->co
8b70: 75 6e 74 29 3b 0a 20 20 20 20 69 66 20 28 70 61  unt);.    if (pa
8b80: 72 73 65 72 2d 3e 66 65 61 74 75 72 65 73 20 3d  rser->features =
8b90: 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a  = NULL).      {.
8ba0: 09 20 20 2a 65 72 72 6f 72 5f 6d 65 73 73 61 67  .  *error_messag
8bb0: 65 20 3d 0a 09 20 20 20 20 20 20 73 71 6c 69 74  e =..      sqlit
8bc0: 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 47 65 6f  e3_mprintf ("Geo
8bd0: 4a 53 4f 4e 20 70 61 72 73 65 72 3a 20 69 6e 73  JSON parser: ins
8be0: 75 66 66 69 63 69 65 6e 74 20 6d 65 6d 6f 72 79  ufficient memory
8bf0: 5c 6e 22 29 3b 0a 09 20 20 72 65 74 75 72 6e 20  \n");..  return 
8c00: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 66  0;.      }.    f
8c10: 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 70  or (i = 0; i < p
8c20: 61 72 73 65 72 2d 3e 63 6f 75 6e 74 3b 20 69 2b  arser->count; i+
8c30: 2b 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a  +).      {..  /*
8c40: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 65 6d   initializing em
8c50: 70 74 79 20 46 65 61 74 75 72 65 73 20 2a 2f 0a  pty Features */.
8c60: 09 20 20 70 66 20 3d 20 70 61 72 73 65 72 2d 3e  .  pf = parser->
8c70: 66 65 61 74 75 72 65 73 20 2b 20 69 3b 0a 09 20  features + i;.. 
8c80: 20 70 66 2d 3e 66 69 64 20 3d 20 69 20 2b 20 31   pf->fid = i + 1
8c90: 3b 0a 09 20 20 70 66 2d 3e 67 65 6f 6d 5f 6f 66  ;..  pf->geom_of
8ca0: 66 73 65 74 5f 73 74 61 72 74 20 3d 20 2d 31 3b  fset_start = -1;
8cb0: 0a 09 20 20 70 66 2d 3e 67 65 6f 6d 5f 6f 66 66  ..  pf->geom_off
8cc0: 73 65 74 5f 65 6e 64 20 3d 20 2d 31 3b 0a 09 20  set_end = -1;.. 
8cd0: 20 70 66 2d 3e 70 72 6f 70 5f 6f 66 66 73 65 74   pf->prop_offset
8ce0: 5f 73 74 61 72 74 20 3d 20 2d 31 3b 0a 09 20 20  _start = -1;..  
8cf0: 70 66 2d 3e 70 72 6f 70 5f 6f 66 66 73 65 74 5f  pf->prop_offset_
8d00: 65 6e 64 20 3d 20 2d 31 3b 0a 09 20 20 70 66 2d  end = -1;..  pf-
8d10: 3e 67 65 6f 6d 65 74 72 79 20 3d 20 4e 55 4c 4c  >geometry = NULL
8d20: 3b 0a 09 20 20 70 66 2d 3e 66 69 72 73 74 20 3d  ;..  pf->first =
8d30: 20 4e 55 4c 4c 3b 0a 09 20 20 70 66 2d 3e 6c 61   NULL;..  pf->la
8d40: 73 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20  st = NULL;.     
8d50: 20 7d 0a 0a 20 20 20 20 63 6f 75 6e 74 20 3d 20   }..    count = 
8d60: 30 3b 0a 20 20 20 20 70 62 20 3d 20 70 61 72 73  0;.    pb = pars
8d70: 65 72 2d 3e 66 69 72 73 74 3b 0a 20 20 20 20 77  er->first;.    w
8d80: 68 69 6c 65 20 28 70 62 20 21 3d 20 4e 55 4c 4c  hile (pb != NULL
8d90: 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20  ).      {..  /* 
8da0: 70 72 6f 70 65 72 6c 79 20 69 6e 69 74 69 61 6c  properly initial
8db0: 69 7a 69 6e 67 20 46 65 61 74 75 72 65 73 20 2a  izing Features *
8dc0: 2f 0a 09 20 20 66 6f 72 20 28 69 20 3d 20 30 3b  /..  for (i = 0;
8dd0: 20 69 20 3c 20 70 62 2d 3e 6e 65 78 74 5f 66 72   i < pb->next_fr
8de0: 65 65 5f 65 6e 74 72 79 3b 20 69 2b 2b 29 0a 09  ee_entry; i++)..
8df0: 20 20 20 20 7b 0a 09 09 65 6e 74 72 79 20 3d 20      {...entry = 
8e00: 70 62 2d 3e 65 6e 74 72 69 65 73 20 2b 20 69 3b  pb->entries + i;
8e10: 0a 09 09 69 66 20 28 65 6e 74 72 79 2d 3e 74 79  ...if (entry->ty
8e20: 70 65 20 21 3d 20 47 45 4f 4a 53 4f 4e 5f 46 45  pe != GEOJSON_FE
8e30: 41 54 55 52 45 29 0a 09 09 20 20 7b 0a 09 09 20  ATURE)...  {... 
8e40: 20 20 20 20 20 69 66 20 28 70 66 20 21 3d 20 4e       if (pf != N
8e50: 55 4c 4c 29 0a 09 09 09 7b 0a 09 09 09 20 20 20  ULL)....{....   
8e60: 20 69 66 20 28 65 6e 74 72 79 2d 3e 74 79 70 65   if (entry->type
8e70: 20 3d 3d 20 47 45 4f 4a 53 4f 4e 5f 50 4f 49 4e   == GEOJSON_POIN
8e80: 54 20 7c 7c 0a 09 09 09 09 65 6e 74 72 79 2d 3e  T ||.....entry->
8e90: 74 79 70 65 20 3d 3d 20 47 45 4f 4a 53 4f 4e 5f  type == GEOJSON_
8ea0: 4c 49 4e 45 53 54 52 49 4e 47 20 7c 7c 0a 09 09  LINESTRING ||...
8eb0: 09 09 65 6e 74 72 79 2d 3e 74 79 70 65 20 3d 3d  ..entry->type ==
8ec0: 20 47 45 4f 4a 53 4f 4e 5f 50 4f 4c 59 47 4f 4e   GEOJSON_POLYGON
8ed0: 20 7c 7c 0a 09 09 09 09 65 6e 74 72 79 2d 3e 74   ||.....entry->t
8ee0: 79 70 65 20 3d 3d 20 47 45 4f 4a 53 4f 4e 5f 4d  ype == GEOJSON_M
8ef0: 55 4c 54 49 50 4f 49 4e 54 20 7c 7c 0a 09 09 09  ULTIPOINT ||....
8f00: 09 65 6e 74 72 79 2d 3e 74 79 70 65 20 3d 3d 20  .entry->type == 
8f10: 47 45 4f 4a 53 4f 4e 5f 4d 55 4c 54 49 4c 49 4e  GEOJSON_MULTILIN
8f20: 45 53 54 52 49 4e 47 20 7c 7c 0a 09 09 09 09 65  ESTRING ||.....e
8f30: 6e 74 72 79 2d 3e 74 79 70 65 20 3d 3d 20 47 45  ntry->type == GE
8f40: 4f 4a 53 4f 4e 5f 4d 55 4c 54 49 50 4f 4c 59 47  OJSON_MULTIPOLYG
8f50: 4f 4e 20 7c 7c 0a 09 09 09 09 65 6e 74 72 79 2d  ON ||.....entry-
8f60: 3e 74 79 70 65 20 3d 3d 20 47 45 4f 4a 53 4f 4e  >type == GEOJSON
8f70: 5f 47 45 4f 4d 43 4f 4c 4c 45 43 54 49 4f 4e 29  _GEOMCOLLECTION)
8f80: 0a 09 09 09 20 20 20 20 20 20 7b 0a 09 09 09 09  ....      {.....
8f90: 20 20 70 66 2d 3e 67 65 6f 6d 5f 6f 66 66 73 65    pf->geom_offse
8fa0: 74 5f 73 74 61 72 74 20 3d 20 65 6e 74 72 79 2d  t_start = entry-
8fb0: 3e 6f 66 66 73 65 74 5f 73 74 61 72 74 3b 0a 09  >offset_start;..
8fc0: 09 09 09 20 20 70 66 2d 3e 67 65 6f 6d 5f 6f 66  ...  pf->geom_of
8fd0: 66 73 65 74 5f 65 6e 64 20 3d 20 65 6e 74 72 79  fset_end = entry
8fe0: 2d 3e 6f 66 66 73 65 74 5f 65 6e 64 3b 0a 09 09  ->offset_end;...
8ff0: 09 20 20 20 20 20 20 7d 0a 09 09 09 20 20 20 20  .      }....    
9000: 69 66 20 28 65 6e 74 72 79 2d 3e 74 79 70 65 20  if (entry->type 
9010: 3d 3d 20 47 45 4f 4a 53 4f 4e 5f 50 52 4f 50 45  == GEOJSON_PROPE
9020: 52 54 49 45 53 29 0a 09 09 09 20 20 20 20 20 20  RTIES)....      
9030: 7b 0a 09 09 09 09 20 20 70 66 2d 3e 70 72 6f 70  {.....  pf->prop
9040: 5f 6f 66 66 73 65 74 5f 73 74 61 72 74 20 3d 20  _offset_start = 
9050: 65 6e 74 72 79 2d 3e 6f 66 66 73 65 74 5f 73 74  entry->offset_st
9060: 61 72 74 3b 0a 09 09 09 09 20 20 70 66 2d 3e 70  art;.....  pf->p
9070: 72 6f 70 5f 6f 66 66 73 65 74 5f 65 6e 64 20 3d  rop_offset_end =
9080: 20 65 6e 74 72 79 2d 3e 6f 66 66 73 65 74 5f 65   entry->offset_e
9090: 6e 64 3b 0a 09 09 09 20 20 20 20 20 20 7d 0a 09  nd;....      }..
90a0: 09 09 7d 0a 09 09 20 20 20 20 20 20 63 6f 6e 74  ..}...      cont
90b0: 69 6e 75 65 3b 0a 09 09 20 20 7d 0a 09 09 70 66  inue;...  }...pf
90c0: 20 3d 20 70 61 72 73 65 72 2d 3e 66 65 61 74 75   = parser->featu
90d0: 72 65 73 20 2b 20 63 6f 75 6e 74 3b 0a 09 09 63  res + count;...c
90e0: 6f 75 6e 74 20 2b 3d 20 31 3b 0a 09 20 20 20 20  ount += 1;..    
90f0: 7d 0a 09 20 20 70 62 20 3d 20 70 62 2d 3e 6e 65  }..  pb = pb->ne
9100: 78 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 2f 2a 20  xt;.      }../* 
9110: 64 65 73 74 72 6f 79 69 6e 67 20 74 68 65 20 50  destroying the P
9120: 61 73 73 20 49 20 64 69 63 74 69 6f 6e 61 72 79  ass I dictionary
9130: 20 2a 2f 0a 20 20 20 20 70 62 20 3d 20 70 61 72   */.    pb = par
9140: 73 65 72 2d 3e 66 69 72 73 74 3b 0a 20 20 20 20  ser->first;.    
9150: 77 68 69 6c 65 20 28 70 62 20 21 3d 20 4e 55 4c  while (pb != NUL
9160: 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 66 6f  L).      {..  fo
9170: 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 70 62  r (i = 0; i < pb
9180: 2d 3e 6e 65 78 74 5f 66 72 65 65 5f 65 6e 74 72  ->next_free_entr
9190: 79 3b 20 69 2b 2b 29 0a 09 20 20 20 20 7b 0a 09  y; i++)..    {..
91a0: 09 67 65 6f 6a 73 6f 6e 5f 65 6e 74 72 79 5f 70  .geojson_entry_p
91b0: 74 72 20 65 20 3d 20 70 62 2d 3e 65 6e 74 72 69  tr e = pb->entri
91c0: 65 73 20 2b 20 69 3b 0a 09 09 69 66 20 28 65 2d  es + i;...if (e-
91d0: 3e 70 61 72 65 6e 74 5f 6b 65 79 20 21 3d 20 4e  >parent_key != N
91e0: 55 4c 4c 29 0a 09 09 20 20 20 20 66 72 65 65 20  ULL)...    free 
91f0: 28 65 2d 3e 70 61 72 65 6e 74 5f 6b 65 79 29 3b  (e->parent_key);
9200: 0a 09 20 20 20 20 7d 0a 09 20 20 70 62 6e 20 3d  ..    }..  pbn =
9210: 20 70 62 2d 3e 6e 65 78 74 3b 0a 09 20 20 66 72   pb->next;..  fr
9220: 65 65 20 28 70 62 29 3b 0a 09 20 20 70 62 20 3d  ee (pb);..  pb =
9230: 20 70 62 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20   pbn;.      }.  
9240: 20 20 70 61 72 73 65 72 2d 3e 66 69 72 73 74 20    parser->first 
9250: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 70 61 72 73  = NULL;.    pars
9260: 65 72 2d 3e 6c 61 73 74 20 3d 20 4e 55 4c 4c 3b  er->last = NULL;
9270: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  .    return 1;.}
9280: 0a 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 0a  ..static char *.
9290: 67 65 6f 6a 73 6f 6e 5f 6e 6f 72 6d 61 6c 69 7a  geojson_normaliz
92a0: 65 5f 63 61 73 65 20 28 63 6f 6e 73 74 20 63 68  e_case (const ch
92b0: 61 72 20 2a 6e 61 6d 65 2c 20 69 6e 74 20 63 6f  ar *name, int co
92c0: 6c 6e 61 6d 65 5f 63 61 73 65 29 0a 7b 0a 2f 2a  lname_case).{./*
92d0: 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 61 20   transforming a 
92e0: 6e 61 6d 65 20 69 6e 20 66 75 6c 6c 20 6c 6f 77  name in full low
92f0: 65 72 2d 20 6f 72 20 75 70 70 65 72 2d 63 61 73  er- or upper-cas
9300: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 65 6e  e */.    int len
9310: 20 3d 20 73 74 72 6c 65 6e 20 28 6e 61 6d 65 29   = strlen (name)
9320: 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 6c 65 61  ;.    char *clea
9330: 6e 20 3d 20 6d 61 6c 6c 6f 63 20 28 6c 65 6e 20  n = malloc (len 
9340: 2b 20 31 29 3b 0a 20 20 20 20 63 68 61 72 20 2a  + 1);.    char *
9350: 70 20 3d 20 63 6c 65 61 6e 3b 0a 20 20 20 20 73  p = clean;.    s
9360: 74 72 63 70 79 20 28 63 6c 65 61 6e 2c 20 6e 61  trcpy (clean, na
9370: 6d 65 29 3b 0a 20 20 20 20 77 68 69 6c 65 20 28  me);.    while (
9380: 2a 70 20 21 3d 20 27 5c 30 27 29 0a 20 20 20 20  *p != '\0').    
9390: 20 20 7b 0a 09 20 20 69 66 20 28 63 6f 6c 6e 61    {..  if (colna
93a0: 6d 65 5f 63 61 73 65 20 3d 3d 20 47 41 49 41 5f  me_case == GAIA_
93b0: 44 42 46 5f 43 4f 4c 4e 41 4d 45 5f 4c 4f 57 45  DBF_COLNAME_LOWE
93c0: 52 43 41 53 45 29 0a 09 20 20 20 20 7b 0a 09 09  RCASE)..    {...
93d0: 69 66 20 28 2a 70 20 3e 3d 20 27 41 27 20 26 26  if (*p >= 'A' &&
93e0: 20 2a 70 20 3c 3d 20 27 5a 27 29 0a 09 09 20 20   *p <= 'Z')...  
93f0: 20 20 2a 70 20 3d 20 2a 70 20 2d 20 27 41 27 20    *p = *p - 'A' 
9400: 2b 20 27 61 27 3b 0a 09 20 20 20 20 7d 0a 09 20  + 'a';..    }.. 
9410: 20 69 66 20 28 63 6f 6c 6e 61 6d 65 5f 63 61 73   if (colname_cas
9420: 65 20 3d 3d 20 47 41 49 41 5f 44 42 46 5f 43 4f  e == GAIA_DBF_CO
9430: 4c 4e 41 4d 45 5f 55 50 50 45 52 43 41 53 45 29  LNAME_UPPERCASE)
9440: 0a 09 20 20 20 20 7b 0a 09 09 69 66 20 28 2a 70  ..    {...if (*p
9450: 20 3e 3d 20 27 61 27 20 26 26 20 2a 70 20 3c 3d   >= 'a' && *p <=
9460: 20 27 7a 27 29 0a 09 09 20 20 20 20 2a 70 20 3d   'z')...    *p =
9470: 20 2a 70 20 2d 20 27 61 27 20 2b 20 27 41 27 3b   *p - 'a' + 'A';
9480: 0a 09 20 20 20 20 7d 0a 09 20 20 70 2b 2b 3b 0a  ..    }..  p++;.
9490: 20 20 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75        }.    retu
94a0: 72 6e 20 63 6c 65 61 6e 3b 0a 7d 0a 0a 73 74 61  rn clean;.}..sta
94b0: 74 69 63 20 63 68 61 72 20 2a 0a 67 65 6f 6a 73  tic char *.geojs
94c0: 6f 6e 5f 75 6e 69 71 75 65 5f 70 6b 20 28 67 65  on_unique_pk (ge
94d0: 6f 6a 73 6f 6e 5f 70 61 72 73 65 72 5f 70 74 72  ojson_parser_ptr
94e0: 20 70 61 72 73 65 72 2c 20 63 6f 6e 73 74 20 63   parser, const c
94f0: 68 61 72 20 2a 70 6b 5f 62 61 73 65 5f 6e 61 6d  har *pk_base_nam
9500: 65 29 0a 7b 0a 2f 2a 20 77 69 6c 6c 20 72 65 74  e).{./* will ret
9510: 75 72 6e 20 61 20 73 75 72 65 6c 79 20 75 6e 69  urn a surely uni
9520: 71 75 65 20 50 4b 20 6e 61 6d 65 20 2a 2f 0a 20  que PK name */. 
9530: 20 20 20 69 6e 74 20 6f 6b 20 3d 20 30 3b 0a 20     int ok = 0;. 
9540: 20 20 20 69 6e 74 20 69 64 78 20 3d 20 30 3b 0a     int idx = 0;.
9550: 20 20 20 20 63 68 61 72 20 2a 70 6b 20 3d 20 73      char *pk = s
9560: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28  qlite3_mprintf (
9570: 22 25 73 22 2c 20 70 6b 5f 62 61 73 65 5f 6e 61  "%s", pk_base_na
9580: 6d 65 29 3b 0a 20 20 20 20 77 68 69 6c 65 20 28  me);.    while (
9590: 6f 6b 20 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b  ok == 0).      {
95a0: 0a 09 20 20 67 65 6f 6a 73 6f 6e 5f 63 6f 6c 75  ..  geojson_colu
95b0: 6d 6e 5f 70 74 72 20 63 6f 6c 20 3d 20 70 61 72  mn_ptr col = par
95c0: 73 65 72 2d 3e 66 69 72 73 74 5f 63 6f 6c 3b 0a  ser->first_col;.
95d0: 09 20 20 6f 6b 20 3d 20 31 3b 0a 09 20 20 77 68  .  ok = 1;..  wh
95e0: 69 6c 65 20 28 63 6f 6c 20 21 3d 20 4e 55 4c 4c  ile (col != NULL
95f0: 29 0a 09 20 20 20 20 7b 0a 09 09 69 66 20 28 73  )..    {...if (s
9600: 74 72 63 61 73 65 63 6d 70 20 28 70 6b 2c 20 63  trcasecmp (pk, c
9610: 6f 6c 2d 3e 6e 61 6d 65 29 20 3d 3d 20 30 29 0a  ol->name) == 0).
9620: 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20 73 71  ..  {...      sq
9630: 6c 69 74 65 33 5f 66 72 65 65 20 28 70 6b 29 3b  lite3_free (pk);
9640: 0a 09 09 20 20 20 20 20 20 70 6b 20 3d 20 73 71  ...      pk = sq
9650: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22  lite3_mprintf ("
9660: 25 73 5f 25 64 22 2c 20 70 6b 5f 62 61 73 65 5f  %s_%d", pk_base_
9670: 6e 61 6d 65 2c 20 69 64 78 2b 2b 29 3b 0a 09 09  name, idx++);...
9680: 20 20 20 20 20 20 6f 6b 20 3d 20 30 3b 0a 09 09        ok = 0;...
9690: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 09 09 20        break;... 
96a0: 20 7d 0a 09 09 63 6f 6c 20 3d 20 63 6f 6c 2d 3e   }...col = col->
96b0: 6e 65 78 74 3b 0a 09 20 20 20 20 7d 0a 20 20 20  next;..    }.   
96c0: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
96d0: 70 6b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 68  pk;.}..static ch
96e0: 61 72 20 2a 0a 67 65 6f 6a 73 6f 6e 5f 75 6e 69  ar *.geojson_uni
96f0: 71 75 65 5f 67 65 6f 6d 20 28 67 65 6f 6a 73 6f  que_geom (geojso
9700: 6e 5f 70 61 72 73 65 72 5f 70 74 72 20 70 61 72  n_parser_ptr par
9710: 73 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ser, const char 
9720: 2a 67 65 6f 6d 5f 62 61 73 65 5f 6e 61 6d 65 29  *geom_base_name)
9730: 0a 7b 0a 2f 2a 20 77 69 6c 6c 20 72 65 74 75 72  .{./* will retur
9740: 6e 20 61 20 73 75 72 65 6c 79 20 75 6e 69 71 75  n a surely uniqu
9750: 65 20 50 4b 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  e PK name */.   
9760: 20 69 6e 74 20 6f 6b 20 3d 20 30 3b 0a 20 20 20   int ok = 0;.   
9770: 20 69 6e 74 20 69 64 78 20 3d 20 30 3b 0a 20 20   int idx = 0;.  
9780: 20 20 63 68 61 72 20 2a 67 65 6f 6d 20 3d 20 73    char *geom = s
9790: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28  qlite3_mprintf (
97a0: 22 25 73 22 2c 20 67 65 6f 6d 5f 62 61 73 65 5f  "%s", geom_base_
97b0: 6e 61 6d 65 29 3b 0a 20 20 20 20 77 68 69 6c 65  name);.    while
97c0: 20 28 6f 6b 20 3d 3d 20 30 29 0a 20 20 20 20 20   (ok == 0).     
97d0: 20 7b 0a 09 20 20 67 65 6f 6a 73 6f 6e 5f 63 6f   {..  geojson_co
97e0: 6c 75 6d 6e 5f 70 74 72 20 63 6f 6c 20 3d 20 70  lumn_ptr col = p
97f0: 61 72 73 65 72 2d 3e 66 69 72 73 74 5f 63 6f 6c  arser->first_col
9800: 3b 0a 09 20 20 6f 6b 20 3d 20 31 3b 0a 09 20 20  ;..  ok = 1;..  
9810: 77 68 69 6c 65 20 28 63 6f 6c 20 21 3d 20 4e 55  while (col != NU
9820: 4c 4c 29 0a 09 20 20 20 20 7b 0a 09 09 69 66 20  LL)..    {...if 
9830: 28 73 74 72 63 61 73 65 63 6d 70 20 28 67 65 6f  (strcasecmp (geo
9840: 6d 2c 20 63 6f 6c 2d 3e 6e 61 6d 65 29 20 3d 3d  m, col->name) ==
9850: 20 30 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 20   0)...  {...    
9860: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28    sqlite3_free (
9870: 67 65 6f 6d 29 3b 0a 09 09 20 20 20 20 20 20 67  geom);...      g
9880: 65 6f 6d 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  eom = sqlite3_mp
9890: 72 69 6e 74 66 20 28 22 25 73 5f 25 64 22 2c 20  rintf ("%s_%d", 
98a0: 67 65 6f 6d 5f 62 61 73 65 5f 6e 61 6d 65 2c 20  geom_base_name, 
98b0: 69 64 78 2b 2b 29 3b 0a 09 09 20 20 20 20 20 20  idx++);...      
98c0: 6f 6b 20 3d 20 30 3b 0a 09 09 20 20 20 20 20 20  ok = 0;...      
98d0: 62 72 65 61 6b 3b 0a 09 09 20 20 7d 0a 09 09 63  break;...  }...c
98e0: 6f 6c 20 3d 20 63 6f 6c 2d 3e 6e 65 78 74 3b 0a  ol = col->next;.
98f0: 09 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20  .    }.      }. 
9900: 20 20 20 72 65 74 75 72 6e 20 67 65 6f 6d 3b 0a     return geom;.
9910: 7d 0a 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  }..static char *
9920: 0a 67 65 6f 6a 73 6f 6e 5f 73 71 6c 5f 63 72 65  .geojson_sql_cre
9930: 61 74 65 5f 76 69 72 74 75 61 6c 5f 74 61 62 6c  ate_virtual_tabl
9940: 65 20 28 67 65 6f 6a 73 6f 6e 5f 70 61 72 73 65  e (geojson_parse
9950: 72 5f 70 74 72 20 70 61 72 73 65 72 2c 20 63 6f  r_ptr parser, co
9960: 6e 73 74 20 63 68 61 72 20 2a 74 61 62 6c 65 2c  nst char *table,
9970: 0a 09 09 09 09 20 20 69 6e 74 20 63 6f 6c 6e 61  .....  int colna
9980: 6d 65 5f 63 61 73 65 29 0a 7b 0a 2f 2a 20 77 69  me_case).{./* wi
9990: 6c 6c 20 72 65 74 75 72 6e 20 74 68 65 20 53 51  ll return the SQ
99a0: 4c 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  L CREATE TABLE s
99b0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
99c0: 63 68 61 72 20 2a 73 71 6c 3b 0a 20 20 20 20 63  char *sql;.    c
99d0: 68 61 72 20 2a 70 72 65 76 3b 0a 20 20 20 20 63  har *prev;.    c
99e0: 68 61 72 20 2a 78 6e 61 6d 65 3b 0a 20 20 20 20  har *xname;.    
99f0: 63 68 61 72 20 2a 70 6b 5f 6e 61 6d 65 3b 0a 20  char *pk_name;. 
9a00: 20 20 20 63 68 61 72 20 2a 67 65 6f 6d 5f 6e 61     char *geom_na
9a10: 6d 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 78 70  me;.    char *xp
9a20: 6b 5f 6e 61 6d 65 3b 0a 20 20 20 20 63 68 61 72  k_name;.    char
9a30: 20 2a 78 67 65 6f 6d 5f 6e 61 6d 65 3b 0a 20 20   *xgeom_name;.  
9a40: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 74 79    const char *ty
9a50: 70 65 3b 0a 20 20 20 20 67 65 6f 6a 73 6f 6e 5f  pe;.    geojson_
9a60: 63 6f 6c 75 6d 6e 5f 70 74 72 20 63 6f 6c 3b 0a  column_ptr col;.
9a70: 20 20 20 20 69 66 20 28 74 61 62 6c 65 20 3d 3d      if (table ==
9a80: 20 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 20 4e   NULL)..return N
9a90: 55 4c 4c 3b 0a 0a 20 20 20 20 78 6e 61 6d 65 20  ULL;..    xname 
9aa0: 3d 20 67 61 69 61 44 6f 75 62 6c 65 51 75 6f 74  = gaiaDoubleQuot
9ab0: 65 64 53 71 6c 20 28 74 61 62 6c 65 29 3b 0a 20  edSql (table);. 
9ac0: 20 20 20 70 6b 5f 6e 61 6d 65 20 3d 20 67 65 6f     pk_name = geo
9ad0: 6a 73 6f 6e 5f 75 6e 69 71 75 65 5f 70 6b 20 28  json_unique_pk (
9ae0: 70 61 72 73 65 72 2c 20 22 66 69 64 22 29 3b 0a  parser, "fid");.
9af0: 20 20 20 20 78 70 6b 5f 6e 61 6d 65 20 3d 20 67      xpk_name = g
9b00: 65 6f 6a 73 6f 6e 5f 6e 6f 72 6d 61 6c 69 7a 65  eojson_normalize
9b10: 5f 63 61 73 65 20 28 70 6b 5f 6e 61 6d 65 2c 20  _case (pk_name, 
9b20: 63 6f 6c 6e 61 6d 65 5f 63 61 73 65 29 3b 0a 20  colname_case);. 
9b30: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 20     sqlite3_free 
9b40: 28 70 6b 5f 6e 61 6d 65 29 3b 0a 20 20 20 20 67  (pk_name);.    g
9b50: 65 6f 6d 5f 6e 61 6d 65 20 3d 20 67 65 6f 6a 73  eom_name = geojs
9b60: 6f 6e 5f 75 6e 69 71 75 65 5f 67 65 6f 6d 20 28  on_unique_geom (
9b70: 70 61 72 73 65 72 2c 20 22 67 65 6f 6d 65 74 72  parser, "geometr
9b80: 79 22 29 3b 0a 20 20 20 20 78 67 65 6f 6d 5f 6e  y");.    xgeom_n
9b90: 61 6d 65 20 3d 20 67 65 6f 6a 73 6f 6e 5f 6e 6f  ame = geojson_no
9ba0: 72 6d 61 6c 69 7a 65 5f 63 61 73 65 20 28 67 65  rmalize_case (ge
9bb0: 6f 6d 5f 6e 61 6d 65 2c 20 63 6f 6c 6e 61 6d 65  om_name, colname
9bc0: 5f 63 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69  _case);.    sqli
9bd0: 74 65 33 5f 66 72 65 65 20 28 67 65 6f 6d 5f 6e  te3_free (geom_n
9be0: 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 20 3d 0a  ame);.    sql =.
9bf0: 09 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66  .sqlite3_mprintf
9c00: 0a 09 28 22 43 52 45 41 54 45 20 54 41 42 4c 45  ..("CREATE TABLE
9c10: 20 5c 22 25 73 5c 22 20 28 5c 6e 5c 74 25 73 20   \"%s\" (\n\t%s 
9c20: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
9c30: 4b 45 59 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e  KEY AUTOINCREMEN
9c40: 54 2c 5c 6e 5c 74 25 73 20 42 4c 4f 42 22 2c 0a  T,\n\t%s BLOB",.
9c50: 09 20 78 6e 61 6d 65 2c 20 78 70 6b 5f 6e 61 6d  . xname, xpk_nam
9c60: 65 2c 20 78 67 65 6f 6d 5f 6e 61 6d 65 29 3b 0a  e, xgeom_name);.
9c70: 20 20 20 20 66 72 65 65 20 28 78 6e 61 6d 65 29      free (xname)
9c80: 3b 0a 20 20 20 20 66 72 65 65 20 28 78 70 6b 5f  ;.    free (xpk_
9c90: 6e 61 6d 65 29 3b 0a 20 20 20 20 66 72 65 65 20  name);.    free 
9ca0: 28 78 67 65 6f 6d 5f 6e 61 6d 65 29 3b 0a 20 20  (xgeom_name);.  
9cb0: 20 20 63 6f 6c 20 3d 20 70 61 72 73 65 72 2d 3e    col = parser->
9cc0: 66 69 72 73 74 5f 63 6f 6c 3b 0a 20 20 20 20 77  first_col;.    w
9cd0: 68 69 6c 65 20 28 63 6f 6c 20 21 3d 20 4e 55 4c  hile (col != NUL
9ce0: 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a  L).      {..  /*
9cf0: 20 61 64 64 69 6e 67 20 63 6f 6c 75 6d 6e 73 20   adding columns 
9d00: 2a 2f 0a 09 20 20 63 68 61 72 20 2a 78 63 6f 6c  */..  char *xcol
9d10: 20 3d 20 67 65 6f 6a 73 6f 6e 5f 6e 6f 72 6d 61   = geojson_norma
9d20: 6c 69 7a 65 5f 63 61 73 65 20 28 63 6f 6c 2d 3e  lize_case (col->
9d30: 6e 61 6d 65 2c 20 63 6f 6c 6e 61 6d 65 5f 63 61  name, colname_ca
9d40: 73 65 29 3b 0a 09 20 20 78 6e 61 6d 65 20 3d 20  se);..  xname = 
9d50: 67 61 69 61 44 6f 75 62 6c 65 51 75 6f 74 65 64  gaiaDoubleQuoted
9d60: 53 71 6c 20 28 78 63 6f 6c 29 3b 0a 09 20 20 66  Sql (xcol);..  f
9d70: 72 65 65 20 28 78 63 6f 6c 29 3b 0a 09 20 20 74  ree (xcol);..  t
9d80: 79 70 65 20 3d 20 22 54 45 58 54 22 3b 0a 09 20  ype = "TEXT";.. 
9d90: 20 69 66 20 28 63 6f 6c 2d 3e 6e 5f 74 65 78 74   if (col->n_text
9da0: 20 3e 20 30 20 26 26 20 63 6f 6c 2d 3e 6e 5f 69   > 0 && col->n_i
9db0: 6e 74 20 3d 3d 20 30 20 26 26 20 63 6f 6c 2d 3e  nt == 0 && col->
9dc0: 6e 5f 64 6f 75 62 6c 65 20 3d 3d 20 30 0a 09 20  n_double == 0.. 
9dd0: 20 20 20 20 20 26 26 20 63 6f 6c 2d 3e 6e 5f 62       && col->n_b
9de0: 6f 6f 6c 20 3d 3d 20 30 29 0a 09 20 20 20 20 20  ool == 0)..     
9df0: 20 74 79 70 65 20 3d 20 22 54 45 58 54 22 3b 0a   type = "TEXT";.
9e00: 09 20 20 69 66 20 28 63 6f 6c 2d 3e 6e 5f 74 65  .  if (col->n_te
9e10: 78 74 20 3d 3d 20 30 20 26 26 20 63 6f 6c 2d 3e  xt == 0 && col->
9e20: 6e 5f 69 6e 74 20 3e 20 30 20 26 26 20 63 6f 6c  n_int > 0 && col
9e30: 2d 3e 6e 5f 64 6f 75 62 6c 65 20 3d 3d 20 30 0a  ->n_double == 0.
9e40: 09 20 20 20 20 20 20 26 26 20 63 6f 6c 2d 3e 6e  .      && col->n
9e50: 5f 62 6f 6f 6c 20 3d 3d 20 30 29 0a 09 20 20 20  _bool == 0)..   
9e60: 20 20 20 74 79 70 65 20 3d 20 22 49 4e 54 45 47     type = "INTEG
9e70: 45 52 22 3b 0a 09 20 20 69 66 20 28 63 6f 6c 2d  ER";..  if (col-
9e80: 3e 6e 5f 74 65 78 74 20 3d 3d 20 30 20 26 26 20  >n_text == 0 && 
9e90: 28 63 6f 6c 2d 3e 6e 5f 69 6e 74 20 3e 20 30 20  (col->n_int > 0 
9ea0: 26 26 20 63 6f 6c 2d 3e 6e 5f 62 6f 6f 6c 20 3e  && col->n_bool >
9eb0: 20 30 29 0a 09 20 20 20 20 20 20 26 26 20 63 6f   0)..      && co
9ec0: 6c 2d 3e 6e 5f 64 6f 75 62 6c 65 20 3d 3d 20 30  l->n_double == 0
9ed0: 29 0a 09 20 20 20 20 20 20 74 79 70 65 20 3d 20  )..      type = 
9ee0: 22 49 4e 54 45 47 45 52 22 3b 0a 09 20 20 69 66  "INTEGER";..  if
9ef0: 20 28 63 6f 6c 2d 3e 6e 5f 74 65 78 74 20 3d 3d   (col->n_text ==
9f00: 20 30 20 26 26 20 63 6f 6c 2d 3e 6e 5f 69 6e 74   0 && col->n_int
9f10: 20 3d 3d 20 30 20 26 26 20 63 6f 6c 2d 3e 6e 5f   == 0 && col->n_
9f20: 64 6f 75 62 6c 65 20 3e 20 30 0a 09 20 20 20 20  double > 0..    
9f30: 20 20 26 26 20 63 6f 6c 2d 3e 6e 5f 62 6f 6f 6c    && col->n_bool
9f40: 20 3d 3d 20 30 29 0a 09 20 20 20 20 20 20 74 79   == 0)..      ty
9f50: 70 65 20 3d 20 22 44 4f 55 42 4c 45 22 3b 0a 09  pe = "DOUBLE";..
9f60: 20 20 69 66 20 28 63 6f 6c 2d 3e 6e 5f 74 65 78    if (col->n_tex
9f70: 74 20 3d 3d 20 30 20 26 26 20 63 6f 6c 2d 3e 6e  t == 0 && col->n
9f80: 5f 69 6e 74 20 3d 3d 20 30 20 26 26 20 63 6f 6c  _int == 0 && col
9f90: 2d 3e 6e 5f 64 6f 75 62 6c 65 20 3d 3d 20 30 0a  ->n_double == 0.
9fa0: 09 20 20 20 20 20 20 26 26 20 63 6f 6c 2d 3e 6e  .      && col->n
9fb0: 5f 62 6f 6f 6c 20 3e 20 30 29 0a 09 20 20 20 20  _bool > 0)..    
9fc0: 20 20 74 79 70 65 20 3d 20 22 42 4f 4f 4c 45 41    type = "BOOLEA
9fd0: 4e 22 3b 0a 09 20 20 70 72 65 76 20 3d 20 73 71  N";..  prev = sq
9fe0: 6c 3b 0a 09 20 20 73 71 6c 20 3d 20 73 71 6c 69  l;..  sql = sqli
9ff0: 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 25 73  te3_mprintf ("%s
a000: 2c 5c 6e 5c 74 5c 22 25 73 5c 22 20 25 73 22 2c  ,\n\t\"%s\" %s",
a010: 20 70 72 65 76 2c 20 78 6e 61 6d 65 2c 20 74 79   prev, xname, ty
a020: 70 65 29 3b 0a 09 20 20 66 72 65 65 20 28 78 6e  pe);..  free (xn
a030: 61 6d 65 29 3b 0a 09 20 20 73 71 6c 69 74 65 33  ame);..  sqlite3
a040: 5f 66 72 65 65 20 28 70 72 65 76 29 3b 0a 09 20  _free (prev);.. 
a050: 20 63 6f 6c 20 3d 20 63 6f 6c 2d 3e 6e 65 78 74   col = col->next
a060: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 70 72  ;.      }.    pr
a070: 65 76 20 3d 20 73 71 6c 3b 0a 20 20 20 20 73 71  ev = sql;.    sq
a080: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
a090: 6e 74 66 20 28 22 25 73 29 5c 6e 22 2c 20 70 72  ntf ("%s)\n", pr
a0a0: 65 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ev);.    sqlite3
a0b0: 5f 66 72 65 65 20 28 70 72 65 76 29 3b 0a 20 20  _free (prev);.  
a0c0: 20 20 72 65 74 75 72 6e 20 73 71 6c 3b 0a 7d 0a    return sql;.}.
a0d0: 0a 53 50 41 54 49 41 4c 49 54 45 5f 44 45 43 4c  .SPATIALITE_DECL
a0e0: 41 52 45 20 63 68 61 72 20 2a 0a 67 65 6f 6a 73  ARE char *.geojs
a0f0: 6f 6e 5f 73 71 6c 5f 63 72 65 61 74 65 5f 74 61  on_sql_create_ta
a100: 62 6c 65 20 28 67 65 6f 6a 73 6f 6e 5f 70 61 72  ble (geojson_par
a110: 73 65 72 5f 70 74 72 20 70 61 72 73 65 72 2c 20  ser_ptr parser, 
a120: 63 6f 6e 73 74 20 63 68 61 72 20 2a 74 61 62 6c  const char *tabl
a130: 65 2c 0a 09 09 09 20 20 69 6e 74 20 63 6f 6c 6e  e,....  int coln
a140: 61 6d 65 5f 63 61 73 65 29 0a 7b 0a 2f 2a 20 77  ame_case).{./* w
a150: 69 6c 6c 20 72 65 74 75 72 6e 20 74 68 65 20 53  ill return the S
a160: 51 4c 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  QL CREATE TABLE 
a170: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
a180: 20 63 68 61 72 20 2a 73 71 6c 3b 0a 20 20 20 20   char *sql;.    
a190: 63 68 61 72 20 2a 70 72 65 76 3b 0a 20 20 20 20  char *prev;.    
a1a0: 63 68 61 72 20 2a 78 6e 61 6d 65 3b 0a 20 20 20  char *xname;.   
a1b0: 20 63 68 61 72 20 2a 70 6b 5f 6e 61 6d 65 3b 0a   char *pk_name;.
a1c0: 20 20 20 20 63 68 61 72 20 2a 78 70 6b 5f 6e 61      char *xpk_na
a1d0: 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  me;.    const ch
a1e0: 61 72 20 2a 74 79 70 65 3b 0a 20 20 20 20 67 65  ar *type;.    ge
a1f0: 6f 6a 73 6f 6e 5f 63 6f 6c 75 6d 6e 5f 70 74 72  ojson_column_ptr
a200: 20 63 6f 6c 3b 0a 20 20 20 20 69 66 20 28 74 61   col;.    if (ta
a210: 62 6c 65 20 3d 3d 20 4e 55 4c 4c 29 0a 09 72 65  ble == NULL)..re
a220: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20  turn NULL;..    
a230: 78 6e 61 6d 65 20 3d 20 67 61 69 61 44 6f 75 62  xname = gaiaDoub
a240: 6c 65 51 75 6f 74 65 64 53 71 6c 20 28 74 61 62  leQuotedSql (tab
a250: 6c 65 29 3b 0a 20 20 20 20 70 6b 5f 6e 61 6d 65  le);.    pk_name
a260: 20 3d 20 67 65 6f 6a 73 6f 6e 5f 75 6e 69 71 75   = geojson_uniqu
a270: 65 5f 70 6b 20 28 70 61 72 73 65 72 2c 20 22 70  e_pk (parser, "p
a280: 6b 5f 75 69 64 22 29 3b 0a 20 20 20 20 78 70 6b  k_uid");.    xpk
a290: 5f 6e 61 6d 65 20 3d 20 67 65 6f 6a 73 6f 6e 5f  _name = geojson_
a2a0: 6e 6f 72 6d 61 6c 69 7a 65 5f 63 61 73 65 20 28  normalize_case (
a2b0: 70 6b 5f 6e 61 6d 65 2c 20 63 6f 6c 6e 61 6d 65  pk_name, colname
a2c0: 5f 63 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69  _case);.    sqli
a2d0: 74 65 33 5f 66 72 65 65 20 28 70 6b 5f 6e 61 6d  te3_free (pk_nam
a2e0: 65 29 3b 0a 20 20 20 20 73 71 6c 20 3d 0a 09 73  e);.    sql =..s
a2f0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 0a 09  qlite3_mprintf..
a300: 28 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 5c  ("CREATE TABLE \
a310: 22 25 73 5c 22 20 28 5c 6e 5c 74 25 73 20 49 4e  "%s\" (\n\t%s IN
a320: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
a330: 59 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 22  Y AUTOINCREMENT"
a340: 2c 20 78 6e 61 6d 65 2c 0a 09 20 78 70 6b 5f 6e  , xname,.. xpk_n
a350: 61 6d 65 29 3b 0a 20 20 20 20 66 72 65 65 20 28  ame);.    free (
a360: 78 6e 61 6d 65 29 3b 0a 20 20 20 20 66 72 65 65  xname);.    free
a370: 20 28 78 70 6b 5f 6e 61 6d 65 29 3b 0a 20 20 20   (xpk_name);.   
a380: 20 63 6f 6c 20 3d 20 70 61 72 73 65 72 2d 3e 66   col = parser->f
a390: 69 72 73 74 5f 63 6f 6c 3b 0a 20 20 20 20 77 68  irst_col;.    wh
a3a0: 69 6c 65 20 28 63 6f 6c 20 21 3d 20 4e 55 4c 4c  ile (col != NULL
a3b0: 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20  ).      {..  /* 
a3c0: 61 64 64 69 6e 67 20 63 6f 6c 75 6d 6e 73 20 2a  adding columns *
a3d0: 2f 0a 09 20 20 63 68 61 72 20 2a 78 63 6f 6c 20  /..  char *xcol 
a3e0: 3d 20 67 65 6f 6a 73 6f 6e 5f 6e 6f 72 6d 61 6c  = geojson_normal
a3f0: 69 7a 65 5f 63 61 73 65 20 28 63 6f 6c 2d 3e 6e  ize_case (col->n
a400: 61 6d 65 2c 20 63 6f 6c 6e 61 6d 65 5f 63 61 73  ame, colname_cas
a410: 65 29 3b 0a 09 20 20 78 6e 61 6d 65 20 3d 20 67  e);..  xname = g
a420: 61 69 61 44 6f 75 62 6c 65 51 75 6f 74 65 64 53  aiaDoubleQuotedS
a430: 71 6c 20 28 78 63 6f 6c 29 3b 0a 09 20 20 66 72  ql (xcol);..  fr
a440: 65 65 20 28 78 63 6f 6c 29 3b 0a 09 20 20 74 79  ee (xcol);..  ty
a450: 70 65 20 3d 20 22 54 45 58 54 22 3b 0a 09 20 20  pe = "TEXT";..  
a460: 69 66 20 28 63 6f 6c 2d 3e 6e 5f 74 65 78 74 20  if (col->n_text 
a470: 3e 20 30 20 26 26 20 63 6f 6c 2d 3e 6e 5f 69 6e  > 0 && col->n_in
a480: 74 20 3d 3d 20 30 20 26 26 20 63 6f 6c 2d 3e 6e  t == 0 && col->n
a490: 5f 64 6f 75 62 6c 65 20 3d 3d 20 30 0a 09 20 20  _double == 0..  
a4a0: 20 20 20 20 26 26 20 63 6f 6c 2d 3e 6e 5f 62 6f      && col->n_bo
a4b0: 6f 6c 20 3d 3d 20 30 29 0a 09 20 20 20 20 20 20  ol == 0)..      
a4c0: 74 79 70 65 20 3d 20 22 54 45 58 54 22 3b 0a 09  type = "TEXT";..
a4d0: 20 20 69 66 20 28 63 6f 6c 2d 3e 6e 5f 74 65 78    if (col->n_tex
a4e0: 74 20 3d 3d 20 30 20 26 26 20 63 6f 6c 2d 3e 6e  t == 0 && col->n
a4f0: 5f 69 6e 74 20 3e 20 30 20 26 26 20 63 6f 6c 2d  _int > 0 && col-
a500: 3e 6e 5f 64 6f 75 62 6c 65 20 3d 3d 20 30 0a 09  >n_double == 0..
a510: 20 20 20 20 20 20 26 26 20 63 6f 6c 2d 3e 6e 5f        && col->n_
a520: 62 6f 6f 6c 20 3d 3d 20 30 29 0a 09 20 20 20 20  bool == 0)..    
a530: 20 20 74 79 70 65 20 3d 20 22 49 4e 54 45 47 45    type = "INTEGE
a540: 52 22 3b 0a 09 20 20 69 66 20 28 63 6f 6c 2d 3e  R";..  if (col->
a550: 6e 5f 74 65 78 74 20 3d 3d 20 30 20 26 26 20 28  n_text == 0 && (
a560: 63 6f 6c 2d 3e 6e 5f 69 6e 74 20 3e 20 30 20 26  col->n_int > 0 &
a570: 26 20 63 6f 6c 2d 3e 6e 5f 62 6f 6f 6c 20 3e 20  & col->n_bool > 
a580: 30 29 0a 09 20 20 20 20 20 20 26 26 20 63 6f 6c  0)..      && col
a590: 2d 3e 6e 5f 64 6f 75 62 6c 65 20 3d 3d 20 30 29  ->n_double == 0)
a5a0: 0a 09 20 20 20 20 20 20 74 79 70 65 20 3d 20 22  ..      type = "
a5b0: 49 4e 54 45 47 45 52 22 3b 0a 09 20 20 69 66 20  INTEGER";..  if 
a5c0: 28 63 6f 6c 2d 3e 6e 5f 74 65 78 74 20 3d 3d 20  (col->n_text == 
a5d0: 30 20 26 26 20 63 6f 6c 2d 3e 6e 5f 69 6e 74 20  0 && col->n_int 
a5e0: 3d 3d 20 30 20 26 26 20 63 6f 6c 2d 3e 6e 5f 64  == 0 && col->n_d
a5f0: 6f 75 62 6c 65 20 3e 20 30 0a 09 20 20 20 20 20  ouble > 0..     
a600: 20 26 26 20 63 6f 6c 2d 3e 6e 5f 62 6f 6f 6c 20   && col->n_bool 
a610: 3d 3d 20 30 29 0a 09 20 20 20 20 20 20 74 79 70  == 0)..      typ
a620: 65 20 3d 20 22 44 4f 55 42 4c 45 22 3b 0a 09 20  e = "DOUBLE";.. 
a630: 20 69 66 20 28 63 6f 6c 2d 3e 6e 5f 74 65 78 74   if (col->n_text
a640: 20 3d 3d 20 30 20 26 26 20 63 6f 6c 2d 3e 6e 5f   == 0 && col->n_
a650: 69 6e 74 20 3d 3d 20 30 20 26 26 20 63 6f 6c 2d  int == 0 && col-
a660: 3e 6e 5f 64 6f 75 62 6c 65 20 3d 3d 20 30 0a 09  >n_double == 0..
a670: 20 20 20 20 20 20 26 26 20 63 6f 6c 2d 3e 6e 5f        && col->n_
a680: 62 6f 6f 6c 20 3e 20 30 29 0a 09 20 20 20 20 20  bool > 0)..     
a690: 20 74 79 70 65 20 3d 20 22 42 4f 4f 4c 45 41 4e   type = "BOOLEAN
a6a0: 22 3b 0a 09 20 20 70 72 65 76 20 3d 20 73 71 6c  ";..  prev = sql
a6b0: 3b 0a 09 20 20 73 71 6c 20 3d 20 73 71 6c 69 74  ;..  sql = sqlit
a6c0: 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 25 73 2c  e3_mprintf ("%s,
a6d0: 5c 6e 5c 74 5c 22 25 73 5c 22 20 25 73 22 2c 20  \n\t\"%s\" %s", 
a6e0: 70 72 65 76 2c 20 78 6e 61 6d 65 2c 20 74 79 70  prev, xname, typ
a6f0: 65 29 3b 0a 09 20 20 66 72 65 65 20 28 78 6e 61  e);..  free (xna
a700: 6d 65 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f  me);..  sqlite3_
a710: 66 72 65 65 20 28 70 72 65 76 29 3b 0a 09 20 20  free (prev);..  
a720: 63 6f 6c 20 3d 20 63 6f 6c 2d 3e 6e 65 78 74 3b  col = col->next;
a730: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 70 72 65  .      }.    pre
a740: 76 20 3d 20 73 71 6c 3b 0a 20 20 20 20 73 71 6c  v = sql;.    sql
a750: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
a760: 74 66 20 28 22 25 73 29 5c 6e 22 2c 20 70 72 65  tf ("%s)\n", pre
a770: 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  v);.    sqlite3_
a780: 66 72 65 65 20 28 70 72 65 76 29 3b 0a 20 20 20  free (prev);.   
a790: 20 72 65 74 75 72 6e 20 73 71 6c 3b 0a 7d 0a 0a   return sql;.}..
a7a0: 53 50 41 54 49 41 4c 49 54 45 5f 44 45 43 4c 41  SPATIALITE_DECLA
a7b0: 52 45 20 63 68 61 72 20 2a 0a 67 65 6f 6a 73 6f  RE char *.geojso
a7c0: 6e 5f 73 71 6c 5f 61 64 64 5f 67 65 6f 6d 65 74  n_sql_add_geomet
a7d0: 72 79 20 28 67 65 6f 6a 73 6f 6e 5f 70 61 72 73  ry (geojson_pars
a7e0: 65 72 5f 70 74 72 20 70 61 72 73 65 72 2c 20 63  er_ptr parser, c
a7f0: 6f 6e 73 74 20 63 68 61 72 20 2a 74 61 62 6c 65  onst char *table
a800: 2c 0a 09 09 09 20 20 63 6f 6e 73 74 20 63 68 61  ,....  const cha
a810: 72 20 2a 67 65 6f 6d 5f 63 6f 6c 2c 20 69 6e 74  r *geom_col, int
a820: 20 63 6f 6c 6e 61 6d 65 5f 63 61 73 65 2c 20 69   colname_case, i
a830: 6e 74 20 73 72 69 64 29 0a 7b 0a 2f 2a 20 77 69  nt srid).{./* wi
a840: 6c 6c 20 72 65 74 75 72 6e 20 74 68 65 20 53 51  ll return the SQ
a850: 4c 20 41 64 64 47 65 6f 6d 65 74 72 79 43 6f 6c  L AddGeometryCol
a860: 75 6d 6e 28 29 20 73 74 61 74 65 6d 65 6e 74 20  umn() statement 
a870: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 73 71 6c  */.    char *sql
a880: 3b 0a 20 20 20 20 63 68 61 72 20 2a 67 65 6f 6d  ;.    char *geom
a890: 5f 6e 61 6d 65 3b 0a 20 20 20 20 63 68 61 72 20  _name;.    char 
a8a0: 2a 78 67 65 6f 6d 5f 63 6f 6c 3b 0a 20 20 20 20  *xgeom_col;.    
a8b0: 63 68 61 72 20 2a 74 79 70 65 20 3d 20 22 47 45  char *type = "GE
a8c0: 4f 4d 45 54 52 59 22 3b 0a 20 20 20 20 63 68 61  OMETRY";.    cha
a8d0: 72 20 2a 64 69 6d 73 20 3d 20 22 58 59 22 3b 0a  r *dims = "XY";.
a8e0: 20 20 20 20 69 66 20 28 74 61 62 6c 65 20 3d 3d      if (table ==
a8f0: 20 4e 55 4c 4c 20 7c 7c 20 67 65 6f 6d 5f 63 6f   NULL || geom_co
a900: 6c 20 3d 3d 20 4e 55 4c 4c 29 0a 09 72 65 74 75  l == NULL)..retu
a910: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20  rn NULL;.    if 
a920: 28 70 61 72 73 65 72 2d 3e 6e 5f 70 6f 69 6e 74  (parser->n_point
a930: 73 20 3d 3d 20 30 20 26 26 20 70 61 72 73 65 72  s == 0 && parser
a940: 2d 3e 6e 5f 6c 69 6e 65 73 74 72 69 6e 67 73 20  ->n_linestrings 
a950: 3d 3d 20 30 0a 09 26 26 20 70 61 72 73 65 72 2d  == 0..&& parser-
a960: 3e 6e 5f 70 6f 6c 79 67 6f 6e 73 20 3d 3d 20 30  >n_polygons == 0
a970: 20 26 26 20 70 61 72 73 65 72 2d 3e 6e 5f 6d 70   && parser->n_mp
a980: 6f 69 6e 74 73 20 3d 3d 20 30 0a 09 26 26 20 70  oints == 0..&& p
a990: 61 72 73 65 72 2d 3e 6e 5f 6d 6c 69 6e 65 73 74  arser->n_mlinest
a9a0: 72 69 6e 67 73 20 3d 3d 20 30 20 26 26 20 70 61  rings == 0 && pa
a9b0: 72 73 65 72 2d 3e 6e 5f 6d 70 6f 6c 79 67 6f 6e  rser->n_mpolygon
a9c0: 73 20 3d 3d 20 30 0a 09 26 26 20 70 61 72 73 65  s == 0..&& parse
a9d0: 72 2d 3e 6e 5f 67 65 6f 6d 63 6f 6c 6c 73 20 3d  r->n_geomcolls =
a9e0: 3d 20 30 29 0a 09 72 65 74 75 72 6e 20 4e 55 4c  = 0)..return NUL
a9f0: 4c 3b 0a 20 20 20 20 69 66 20 28 70 61 72 73 65  L;.    if (parse
aa00: 72 2d 3e 6e 5f 67 65 6f 6d 5f 32 64 20 3d 3d 20  r->n_geom_2d == 
aa10: 30 20 26 26 20 70 61 72 73 65 72 2d 3e 6e 5f 67  0 && parser->n_g
aa20: 65 6f 6d 5f 33 64 20 3d 3d 20 30 0a 09 26 26 20  eom_3d == 0..&& 
aa30: 70 61 72 73 65 72 2d 3e 6e 5f 67 65 6f 6d 5f 34  parser->n_geom_4
aa40: 64 20 3d 3d 20 30 29 0a 09 72 65 74 75 72 6e 20  d == 0)..return 
aa50: 4e 55 4c 4c 3b 0a 0a 20 20 20 20 69 66 20 28 70  NULL;..    if (p
aa60: 61 72 73 65 72 2d 3e 6e 5f 70 6f 69 6e 74 73 20  arser->n_points 
aa70: 3e 20 30 20 26 26 20 70 61 72 73 65 72 2d 3e 6e  > 0 && parser->n
aa80: 5f 6c 69 6e 65 73 74 72 69 6e 67 73 20 3d 3d 20  _linestrings == 
aa90: 30 0a 09 26 26 20 70 61 72 73 65 72 2d 3e 6e 5f  0..&& parser->n_
aaa0: 70 6f 6c 79 67 6f 6e 73 20 3d 3d 20 30 20 26 26  polygons == 0 &&
aab0: 20 70 61 72 73 65 72 2d 3e 6e 5f 6d 70 6f 69 6e   parser->n_mpoin
aac0: 74 73 20 3d 3d 20 30 0a 09 26 26 20 70 61 72 73  ts == 0..&& pars
aad0: 65 72 2d 3e 6e 5f 6d 6c 69 6e 65 73 74 72 69 6e  er->n_mlinestrin
aae0: 67 73 20 3d 3d 20 30 20 26 26 20 70 61 72 73 65  gs == 0 && parse
aaf0: 72 2d 3e 6e 5f 6d 70 6f 6c 79 67 6f 6e 73 20 3d  r->n_mpolygons =
ab00: 3d 20 30 0a 09 26 26 20 70 61 72 73 65 72 2d 3e  = 0..&& parser->
ab10: 6e 5f 67 65 6f 6d 63 6f 6c 6c 73 20 3d 3d 20 30  n_geomcolls == 0
ab20: 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 74 79 70  ).      {..  typ
ab30: 65 20 3d 20 22 50 4f 49 4e 54 22 3b 0a 09 20 20  e = "POINT";..  
ab40: 73 74 72 63 70 79 20 28 70 61 72 73 65 72 2d 3e  strcpy (parser->
ab50: 63 61 73 74 5f 74 79 70 65 2c 20 22 43 61 73 74  cast_type, "Cast
ab60: 54 6f 50 6f 69 6e 74 22 29 3b 0a 20 20 20 20 20  ToPoint");.     
ab70: 20 7d 0a 20 20 20 20 69 66 20 28 70 61 72 73 65   }.    if (parse
ab80: 72 2d 3e 6e 5f 6d 70 6f 69 6e 74 73 20 3e 20 30  r->n_mpoints > 0
ab90: 20 26 26 20 70 61 72 73 65 72 2d 3e 6e 5f 6c 69   && parser->n_li
aba0: 6e 65 73 74 72 69 6e 67 73 20 3d 3d 20 30 0a 09  nestrings == 0..
abb0: 26 26 20 70 61 72 73 65 72 2d 3e 6e 5f 70 6f 6c  && parser->n_pol
abc0: 79 67 6f 6e 73 20 3d 3d 20 30 20 26 26 20 70 61  ygons == 0 && pa
abd0: 72 73 65 72 2d 3e 6e 5f 6d 6c 69 6e 65 73 74 72  rser->n_mlinestr
abe0: 69 6e 67 73 20 3d 3d 20 30 0a 09 26 26 20 70 61  ings == 0..&& pa
abf0: 72 73 65 72 2d 3e 6e 5f 6d 70 6f 6c 79 67 6f 6e  rser->n_mpolygon
ac00: 73 20 3d 3d 20 30 20 26 26 20 70 61 72 73 65 72  s == 0 && parser
ac10: 2d 3e 6e 5f 67 65 6f 6d 63 6f 6c 6c 73 20 3d 3d  ->n_geomcolls ==
ac20: 20 30 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 74   0).      {..  t
ac30: 79 70 65 20 3d 20 22 4d 55 4c 54 49 50 4f 49 4e  ype = "MULTIPOIN
ac40: 54 22 3b 0a 09 20 20 73 74 72 63 70 79 20 28 70  T";..  strcpy (p
ac50: 61 72 73 65 72 2d 3e 63 61 73 74 5f 74 79 70 65  arser->cast_type
ac60: 2c 20 22 43 61 73 74 54 6f 4d 75 6c 74 69 50 6f  , "CastToMultiPo
ac70: 69 6e 74 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  int");.      }. 
ac80: 20 20 20 69 66 20 28 70 61 72 73 65 72 2d 3e 6e     if (parser->n
ac90: 5f 70 6f 69 6e 74 73 20 3d 3d 20 30 20 26 26 20  _points == 0 && 
aca0: 70 61 72 73 65 72 2d 3e 6e 5f 6c 69 6e 65 73 74  parser->n_linest
acb0: 72 69 6e 67 73 20 3e 20 30 0a 09 26 26 20 70 61  rings > 0..&& pa
acc0: 72 73 65 72 2d 3e 6e 5f 70 6f 6c 79 67 6f 6e 73  rser->n_polygons
acd0: 20 3d 3d 20 30 20 26 26 20 70 61 72 73 65 72 2d   == 0 && parser-
ace0: 3e 6e 5f 6d 70 6f 69 6e 74 73 20 3d 3d 20 30 0a  >n_mpoints == 0.
acf0: 09 26 26 20 70 61 72 73 65 72 2d 3e 6e 5f 6d 6c  .&& parser->n_ml
ad00: 69 6e 65 73 74 72 69 6e 67 73 20 3d 3d 20 30 20  inestrings == 0 
ad10: 26 26 20 70 61 72 73 65 72 2d 3e 6e 5f 6d 70 6f  && parser->n_mpo
ad20: 6c 79 67 6f 6e 73 20 3d 3d 20 30 0a 09 26 26 20  lygons == 0..&& 
ad30: 70 61 72 73 65 72 2d 3e 6e 5f 67 65 6f 6d 63 6f  parser->n_geomco
ad40: 6c 6c 73 20 3d 3d 20 30 29 0a 20 20 20 20 20 20  lls == 0).      
ad50: 7b 0a 09 20 20 74 79 70 65 20 3d 20 22 4c 49 4e  {..  type = "LIN
ad60: 45 53 54 52 49 4e 47 22 3b 0a 09 20 20 73 74 72  ESTRING";..  str
ad70: 63 70 79 20 28 70 61 72 73 65 72 2d 3e 63 61 73  cpy (parser->cas
ad80: 74 5f 74 79 70 65 2c 20 22 43 61 73 74 54 6f 4c  t_type, "CastToL
ad90: 69 6e 65 73 74 72 69 6e 67 22 29 3b 0a 20 20 20  inestring");.   
ada0: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70 61 72     }.    if (par
adb0: 73 65 72 2d 3e 6e 5f 6d 6c 69 6e 65 73 74 72 69  ser->n_mlinestri
adc0: 6e 67 73 20 3e 20 30 20 26 26 20 70 61 72 73 65  ngs > 0 && parse
add0: 72 2d 3e 6e 5f 70 6f 69 6e 74 73 20 3d 3d 20 30  r->n_points == 0
ade0: 0a 09 26 26 20 70 61 72 73 65 72 2d 3e 6e 5f 70  ..&& parser->n_p
adf0: 6f 6c 79 67 6f 6e 73 20 3d 3d 20 30 20 26 26 20  olygons == 0 && 
ae00: 70 61 72 73 65 72 2d 3e 6e 5f 6d 70 6f 69 6e 74  parser->n_mpoint
ae10: 73 20 3d 3d 20 30 0a 09 26 26 20 70 61 72 73 65  s == 0..&& parse
ae20: 72 2d 3e 6e 5f 6d 70 6f 6c 79 67 6f 6e 73 20 3d  r->n_mpolygons =
ae30: 3d 20 30 20 26 26 20 70 61 72 73 65 72 2d 3e 6e  = 0 && parser->n
ae40: 5f 67 65 6f 6d 63 6f 6c 6c 73 20 3d 3d 20 30 29  _geomcolls == 0)
ae50: 0a 20 20 20 20 20 20 7b 0a 09 20 20 74 79 70 65  .      {..  type
ae60: 20 3d 20 22 4d 55 4c 54 49 4c 49 4e 45 53 54 52   = "MULTILINESTR
ae70: 49 4e 47 22 3b 0a 09 20 20 73 74 72 63 70 79 20  ING";..  strcpy 
ae80: 28 70 61 72 73 65 72 2d 3e 63 61 73 74 5f 74 79  (parser->cast_ty
ae90: 70 65 2c 20 22 43 61 73 74 54 6f 4d 75 6c 74 69  pe, "CastToMulti
aea0: 4c 69 6e 65 73 74 72 69 6e 67 22 29 3b 0a 20 20  Linestring");.  
aeb0: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70 61      }.    if (pa
aec0: 72 73 65 72 2d 3e 6e 5f 70 6f 69 6e 74 73 20 3d  rser->n_points =
aed0: 3d 20 30 20 26 26 20 70 61 72 73 65 72 2d 3e 6e  = 0 && parser->n
aee0: 5f 6c 69 6e 65 73 74 72 69 6e 67 73 20 3e 20 30  _linestrings > 0
aef0: 0a 09 26 26 20 70 61 72 73 65 72 2d 3e 6e 5f 70  ..&& parser->n_p
af00: 6f 6c 79 67 6f 6e 73 20 3e 20 30 20 26 26 20 70  olygons > 0 && p
af10: 61 72 73 65 72 2d 3e 6e 5f 6d 70 6f 69 6e 74 73  arser->n_mpoints
af20: 20 3d 3d 20 30 0a 09 26 26 20 70 61 72 73 65 72   == 0..&& parser
af30: 2d 3e 6e 5f 6d 6c 69 6e 65 73 74 72 69 6e 67 73  ->n_mlinestrings
af40: 20 3d 3d 20 30 20 26 26 20 70 61 72 73 65 72 2d   == 0 && parser-
af50: 3e 6e 5f 6d 70 6f 6c 79 67 6f 6e 73 20 3d 3d 20  >n_mpolygons == 
af60: 30 0a 09 26 26 20 70 61 72 73 65 72 2d 3e 6e 5f  0..&& parser->n_
af70: 67 65 6f 6d 63 6f 6c 6c 73 20 3d 3d 20 30 29 0a  geomcolls == 0).
af80: 20 20 20 20 20 20 7b 0a 09 20 20 74 79 70 65 20        {..  type 
af90: 3d 20 22 50 4f 4c 59 47 4f 4e 22 3b 0a 09 20 20  = "POLYGON";..  
afa0: 73 74 72 63 70 79 20 28 70 61 72 73 65 72 2d 3e  strcpy (parser->
afb0: 63 61 73 74 5f 74 79 70 65 2c 20 22 43 61 73 74  cast_type, "Cast
afc0: 54 6f 50 6f 6c 79 67 6f 6e 22 29 3b 0a 20 20 20  ToPolygon");.   
afd0: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70 61 72     }.    if (par
afe0: 73 65 72 2d 3e 6e 5f 6d 70 6f 6c 79 67 6f 6e 73  ser->n_mpolygons
aff0: 20 3e 20 30 20 26 26 20 70 61 72 73 65 72 2d 3e   > 0 && parser->
b000: 6e 5f 70 6f 69 6e 74 73 20 3d 3d 20 30 0a 09 26  n_points == 0..&
b010: 26 20 70 61 72 73 65 72 2d 3e 6e 5f 6c 69 6e 65  & parser->n_line
b020: 73 74 72 69 6e 67 73 20 3d 3d 20 30 20 26 26 20  strings == 0 && 
b030: 70 61 72 73 65 72 2d 3e 6e 5f 6d 70 6f 69 6e 74  parser->n_mpoint
b040: 73 20 3d 3d 20 30 0a 09 26 26 20 70 61 72 73 65  s == 0..&& parse
b050: 72 2d 3e 6e 5f 6d 6c 69 6e 65 73 74 72 69 6e 67  r->n_mlinestring
b060: 73 20 3d 3d 20 30 20 26 26 20 70 61 72 73 65 72  s == 0 && parser
b070: 2d 3e 6e 5f 67 65 6f 6d 63 6f 6c 6c 73 20 3d 3d  ->n_geomcolls ==
b080: 20 30 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 74   0).      {..  t
b090: 79 70 65 20 3d 20 22 4d 55 4c 54 49 50 4f 4c 59  ype = "MULTIPOLY
b0a0: 47 4f 4e 22 3b 0a 09 20 20 73 74 72 63 70 79 20  GON";..  strcpy 
b0b0: 28 70 61 72 73 65 72 2d 3e 63 61 73 74 5f 74 79  (parser->cast_ty
b0c0: 70 65 2c 20 22 43 61 73 74 54 6f 4d 75 6c 74 69  pe, "CastToMulti
b0d0: 50 6f 6c 79 67 6f 6e 22 29 3b 0a 20 20 20 20 20  Polygon");.     
b0e0: 20 7d 0a 20 20 20 20 69 66 20 28 28 70 61 72 73   }.    if ((pars
b0f0: 65 72 2d 3e 6e 5f 70 6f 69 6e 74 73 20 2b 20 70  er->n_points + p
b100: 61 72 73 65 72 2d 3e 6e 5f 6d 70 6f 69 6e 74 73  arser->n_mpoints
b110: 29 20 3e 20 30 0a 09 26 26 20 28 70 61 72 73 65  ) > 0..&& (parse
b120: 72 2d 3e 6e 5f 6c 69 6e 65 73 74 72 69 6e 67 73  r->n_linestrings
b130: 20 2b 20 70 61 72 73 65 72 2d 3e 6e 5f 6d 6c 69   + parser->n_mli
b140: 6e 65 73 74 72 69 6e 67 73 29 20 3e 20 30 29 0a  nestrings) > 0).
b150: 20 20 20 20 20 20 7b 0a 09 20 20 74 79 70 65 20        {..  type 
b160: 3d 20 22 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45  = "GEOMETRYCOLLE
b170: 43 54 49 4f 4e 22 3b 0a 09 20 20 73 74 72 63 70  CTION";..  strcp
b180: 79 20 28 70 61 72 73 65 72 2d 3e 63 61 73 74 5f  y (parser->cast_
b190: 74 79 70 65 2c 20 22 43 61 73 74 54 6f 47 65 6f  type, "CastToGeo
b1a0: 6d 65 74 72 79 43 6f 6c 6c 65 63 74 69 6f 6e 22  metryCollection"
b1b0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69  );.      }.    i
b1c0: 66 20 28 28 70 61 72 73 65 72 2d 3e 6e 5f 70 6f  f ((parser->n_po
b1d0: 69 6e 74 73 20 2b 20 70 61 72 73 65 72 2d 3e 6e  ints + parser->n
b1e0: 5f 6d 70 6f 69 6e 74 73 29 20 3e 20 30 0a 09 26  _mpoints) > 0..&
b1f0: 26 20 28 70 61 72 73 65 72 2d 3e 6e 5f 70 6f 6c  & (parser->n_pol
b200: 79 67 6f 6e 73 20 2b 20 70 61 72 73 65 72 2d 3e  ygons + parser->
b210: 6e 5f 6d 70 6f 6c 79 67 6f 6e 73 29 20 3e 20 30  n_mpolygons) > 0
b220: 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 74 79 70  ).      {..  typ
b230: 65 20 3d 20 22 47 45 4f 4d 45 54 52 59 43 4f 4c  e = "GEOMETRYCOL
b240: 4c 45 43 54 49 4f 4e 22 3b 0a 09 20 20 73 74 72  LECTION";..  str
b250: 63 70 79 20 28 70 61 72 73 65 72 2d 3e 63 61 73  cpy (parser->cas
b260: 74 5f 74 79 70 65 2c 20 22 43 61 73 74 54 6f 47  t_type, "CastToG
b270: 65 6f 6d 65 74 72 79 43 6f 6c 6c 65 63 74 69 6f  eometryCollectio
b280: 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n");.      }.   
b290: 20 69 66 20 28 28 70 61 72 73 65 72 2d 3e 6e 5f   if ((parser->n_
b2a0: 6c 69 6e 65 73 74 72 69 6e 67 73 20 2b 20 70 61  linestrings + pa
b2b0: 72 73 65 72 2d 3e 6e 5f 6d 6c 69 6e 65 73 74 72  rser->n_mlinestr
b2c0: 69 6e 67 73 29 20 3e 20 30 0a 09 26 26 20 28 70  ings) > 0..&& (p
b2d0: 61 72 73 65 72 2d 3e 6e 5f 70 6f 6c 79 67 6f 6e  arser->n_polygon
b2e0: 73 20 2b 20 70 61 72 73 65 72 2d 3e 6e 5f 6d 70  s + parser->n_mp
b2f0: 6f 6c 79 67 6f 6e 73 29 20 3e 20 30 29 0a 20 20  olygons) > 0).  
b300: 20 20 20 20 7b 0a 09 20 20 74 79 70 65 20 3d 20      {..  type = 
b310: 22 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54  "GEOMETRYCOLLECT
b320: 49 4f 4e 22 3b 0a 09 20 20 73 74 72 63 70 79 20  ION";..  strcpy 
b330: 28 70 61 72 73 65 72 2d 3e 63 61 73 74 5f 74 79  (parser->cast_ty
b340: 70 65 2c 20 22 43 61 73 74 54 6f 47 65 6f 6d 65  pe, "CastToGeome
b350: 74 72 79 43 6f 6c 6c 65 63 74 69 6f 6e 22 29 3b  tryCollection");
b360: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  .      }..    if
b370: 20 28 70 61 72 73 65 72 2d 3e 6e 5f 67 65 6f 6d   (parser->n_geom
b380: 5f 32 64 20 3e 20 30 20 26 26 20 70 61 72 73 65  _2d > 0 && parse
b390: 72 2d 3e 6e 5f 67 65 6f 6d 5f 33 64 20 3d 3d 20  r->n_geom_3d == 
b3a0: 30 0a 09 26 26 20 70 61 72 73 65 72 2d 3e 6e 5f  0..&& parser->n_
b3b0: 67 65 6f 6d 5f 34 64 20 3d 3d 20 30 29 0a 20 20  geom_4d == 0).  
b3c0: 20 20 20 20 7b 0a 09 20 20 64 69 6d 73 20 3d 20      {..  dims = 
b3d0: 22 58 59 22 3b 0a 09 20 20 73 74 72 63 70 79 20  "XY";..  strcpy 
b3e0: 28 70 61 72 73 65 72 2d 3e 63 61 73 74 5f 64 69  (parser->cast_di
b3f0: 6d 73 2c 20 22 43 61 73 74 54 6f 58 59 22 29 3b  ms, "CastToXY");
b400: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20  .      }.    if 
b410: 28 70 61 72 73 65 72 2d 3e 6e 5f 67 65 6f 6d 5f  (parser->n_geom_
b420: 33 64 20 3e 20 30 20 26 26 20 70 61 72 73 65 72  3d > 0 && parser
b430: 2d 3e 6e 5f 67 65 6f 6d 5f 34 64 20 3d 3d 20 30  ->n_geom_4d == 0
b440: 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 64 69 6d  ).      {..  dim
b450: 73 20 3d 20 22 58 59 5a 22 3b 0a 09 20 20 73 74  s = "XYZ";..  st
b460: 72 63 70 79 20 28 70 61 72 73 65 72 2d 3e 63 61  rcpy (parser->ca
b470: 73 74 5f 64 69 6d 73 2c 20 22 43 61 73 74 54 6f  st_dims, "CastTo
b480: 58 59 5a 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  XYZ");.      }. 
b490: 20 20 20 69 66 20 28 70 61 72 73 65 72 2d 3e 6e     if (parser->n
b4a0: 5f 67 65 6f 6d 5f 34 64 20 3e 20 30 29 0a 20 20  _geom_4d > 0).  
b4b0: 20 20 20 20 7b 0a 09 20 20 64 69 6d 73 20 3d 20      {..  dims = 
b4c0: 22 58 59 5a 4d 22 3b 0a 09 20 20 73 74 72 63 70  "XYZM";..  strcp
b4d0: 79 20 28 70 61 72 73 65 72 2d 3e 63 61 73 74 5f  y (parser->cast_
b4e0: 64 69 6d 73 2c 20 22 43 61 73 74 54 6f 58 59 5a  dims, "CastToXYZ
b4f0: 4d 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  M");.      }.   
b500: 20 67 65 6f 6d 5f 6e 61 6d 65 20 3d 20 67 65 6f   geom_name = geo
b510: 6a 73 6f 6e 5f 75 6e 69 71 75 65 5f 67 65 6f 6d  json_unique_geom
b520: 20 28 70 61 72 73 65 72 2c 20 67 65 6f 6d 5f 63   (parser, geom_c
b530: 6f 6c 29 3b 0a 20 20 20 20 78 67 65 6f 6d 5f 63  ol);.    xgeom_c
b540: 6f 6c 20 3d 20 67 65 6f 6a 73 6f 6e 5f 6e 6f 72  ol = geojson_nor
b550: 6d 61 6c 69 7a 65 5f 63 61 73 65 20 28 67 65 6f  malize_case (geo
b560: 6d 5f 6e 61 6d 65 2c 20 63 6f 6c 6e 61 6d 65 5f  m_name, colname_
b570: 63 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  case);.    sqlit
b580: 65 33 5f 66 72 65 65 20 28 67 65 6f 6d 5f 6e 61  e3_free (geom_na
b590: 6d 65 29 3b 0a 20 20 20 20 73 71 6c 20 3d 0a 09  me);.    sql =..
b5a0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20  sqlite3_mprintf 
b5b0: 28 22 53 45 4c 45 43 54 20 41 64 64 47 65 6f 6d  ("SELECT AddGeom
b5c0: 65 74 72 79 43 6f 6c 75 6d 6e 28 25 51 2c 20 25  etryColumn(%Q, %
b5d0: 51 2c 20 25 64 2c 20 25 51 2c 20 25 51 29 22 2c  Q, %d, %Q, %Q)",
b5e0: 20 74 61 62 6c 65 2c 0a 09 09 09 20 78 67 65 6f   table,.... xgeo
b5f0: 6d 5f 63 6f 6c 2c 20 73 72 69 64 2c 20 74 79 70  m_col, srid, typ
b600: 65 2c 20 64 69 6d 73 29 3b 0a 20 20 20 20 66 72  e, dims);.    fr
b610: 65 65 20 28 78 67 65 6f 6d 5f 63 6f 6c 29 3b 0a  ee (xgeom_col);.
b620: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 3b 0a      return sql;.
b630: 7d 0a 0a 53 50 41 54 49 41 4c 49 54 45 5f 44 45  }..SPATIALITE_DE
b640: 43 4c 41 52 45 20 63 68 61 72 20 2a 0a 67 65 6f  CLARE char *.geo
b650: 6a 73 6f 6e 5f 73 71 6c 5f 63 72 65 61 74 65 5f  json_sql_create_
b660: 72 74 72 65 65 20 28 63 6f 6e 73 74 20 63 68 61  rtree (const cha
b670: 72 20 2a 74 61 62 6c 65 2c 20 63 6f 6e 73 74 20  r *table, const 
b680: 63 68 61 72 20 2a 67 65 6f 6d 5f 63 6f 6c 2c 0a  char *geom_col,.
b690: 09 09 09 20 20 69 6e 74 20 63 6f 6c 6e 61 6d 65  ...  int colname
b6a0: 5f 63 61 73 65 29 0a 7b 0a 2f 2a 20 77 69 6c 6c  _case).{./* will
b6b0: 20 72 65 74 75 72 6e 20 74 68 65 20 53 51 4c 20   return the SQL 
b6c0: 43 72 65 61 74 65 53 70 61 74 69 61 6c 49 6e 64  CreateSpatialInd
b6d0: 65 78 28 29 20 73 74 61 74 65 6d 65 6e 74 20 2a  ex() statement *
b6e0: 2f 0a 20 20 20 20 63 68 61 72 20 2a 73 71 6c 3b  /.    char *sql;
b6f0: 0a 20 20 20 20 63 68 61 72 20 2a 78 67 65 6f 6d  .    char *xgeom
b700: 5f 63 6f 6c 3b 0a 20 20 20 20 69 66 20 28 74 61  _col;.    if (ta
b710: 62 6c 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 67  ble == NULL || g
b720: 65 6f 6d 5f 63 6f 6c 20 3d 3d 20 4e 55 4c 4c 29  eom_col == NULL)
b730: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20  ..return NULL;. 
b740: 20 20 20 78 67 65 6f 6d 5f 63 6f 6c 20 3d 20 67     xgeom_col = g
b750: 65 6f 6a 73 6f 6e 5f 6e 6f 72 6d 61 6c 69 7a 65  eojson_normalize
b760: 5f 63 61 73 65 20 28 67 65 6f 6d 5f 63 6f 6c 2c  _case (geom_col,
b770: 20 63 6f 6c 6e 61 6d 65 5f 63 61 73 65 29 3b 0a   colname_case);.
b780: 20 20 20 20 73 71 6c 20 3d 0a 09 73 71 6c 69 74      sql =..sqlit
b790: 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 53 45 4c  e3_mprintf ("SEL
b7a0: 45 43 54 20 43 72 65 61 74 65 53 70 61 74 69 61  ECT CreateSpatia
b7b0: 6c 49 6e 64 65 78 28 25 51 2c 20 25 51 29 22 2c  lIndex(%Q, %Q)",
b7c0: 20 74 61 62 6c 65 2c 20 78 67 65 6f 6d 5f 63 6f   table, xgeom_co
b7d0: 6c 29 3b 0a 20 20 20 20 66 72 65 65 20 28 78 67  l);.    free (xg
b7e0: 65 6f 6d 5f 63 6f 6c 29 3b 0a 20 20 20 20 72 65  eom_col);.    re
b7f0: 74 75 72 6e 20 73 71 6c 3b 0a 7d 0a 0a 53 50 41  turn sql;.}..SPA
b800: 54 49 41 4c 49 54 45 5f 44 45 43 4c 41 52 45 20  TIALITE_DECLARE 
b810: 63 68 61 72 20 2a 0a 67 65 6f 6a 73 6f 6e 5f 73  char *.geojson_s
b820: 71 6c 5f 69 6e 73 65 72 74 5f 69 6e 74 6f 20 28  ql_insert_into (
b830: 67 65 6f 6a 73 6f 6e 5f 70 61 72 73 65 72 5f 70  geojson_parser_p
b840: 74 72 20 70 61 72 73 65 72 2c 20 63 6f 6e 73 74  tr parser, const
b850: 20 63 68 61 72 20 2a 74 61 62 6c 65 29 0a 7b 0a   char *table).{.
b860: 2f 2a 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 74  /* will return t
b870: 68 65 20 53 51 4c 20 49 4e 53 45 52 54 20 49 4e  he SQL INSERT IN
b880: 54 4f 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  TO statement */.
b890: 20 20 20 20 63 68 61 72 20 2a 73 71 6c 3b 0a 20      char *sql;. 
b8a0: 20 20 20 63 68 61 72 20 2a 70 72 65 76 3b 0a 20     char *prev;. 
b8b0: 20 20 20 63 68 61 72 20 2a 78 6e 61 6d 65 3b 0a     char *xname;.
b8c0: 20 20 20 20 67 65 6f 6a 73 6f 6e 5f 63 6f 6c 75      geojson_colu
b8d0: 6d 6e 5f 70 74 72 20 63 6f 6c 3b 0a 20 20 20 20  mn_ptr col;.    
b8e0: 69 66 20 28 74 61 62 6c 65 20 3d 3d 20 4e 55 4c  if (table == NUL
b8f0: 4c 29 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  L)..return NULL;
b900: 0a 0a 20 20 20 20 78 6e 61 6d 65 20 3d 20 67 61  ..    xname = ga
b910: 69 61 44 6f 75 62 6c 65 51 75 6f 74 65 64 53 71  iaDoubleQuotedSq
b920: 6c 20 28 74 61 62 6c 65 29 3b 0a 20 20 20 20 73  l (table);.    s
b930: 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
b940: 69 6e 74 66 20 28 22 49 4e 53 45 52 54 20 49 4e  intf ("INSERT IN
b950: 54 4f 20 5c 22 25 73 5c 22 20 56 41 4c 55 45 53  TO \"%s\" VALUES
b960: 20 28 4e 55 4c 4c 22 2c 20 78 6e 61 6d 65 29 3b   (NULL", xname);
b970: 0a 20 20 20 20 66 72 65 65 20 28 78 6e 61 6d 65  .    free (xname
b980: 29 3b 0a 0a 20 20 20 20 63 6f 6c 20 3d 20 70 61  );..    col = pa
b990: 72 73 65 72 2d 3e 66 69 72 73 74 5f 63 6f 6c 3b  rser->first_col;
b9a0: 0a 20 20 20 20 77 68 69 6c 65 20 28 63 6f 6c 20  .    while (col 
b9b0: 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b  != NULL).      {
b9c0: 0a 09 20 20 70 72 65 76 20 3d 20 73 71 6c 3b 0a  ..  prev = sql;.
b9d0: 09 20 20 73 71 6c 20 3d 20 73 71 6c 69 74 65 33  .  sql = sqlite3
b9e0: 5f 6d 70 72 69 6e 74 66 20 28 22 25 73 2c 20 3f  _mprintf ("%s, ?
b9f0: 22 2c 20 70 72 65 76 29 3b 0a 09 20 20 73 71 6c  ", prev);..  sql
ba00: 69 74 65 33 5f 66 72 65 65 20 28 70 72 65 76 29  ite3_free (prev)
ba10: 3b 0a 09 20 20 63 6f 6c 20 3d 20 63 6f 6c 2d 3e  ;..  col = col->
ba20: 6e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  next;.      }.  
ba30: 20 20 70 72 65 76 20 3d 20 73 71 6c 3b 0a 2f 2a    prev = sql;./*
ba40: 20 47 65 6f 6d 65 74 72 79 20 69 73 20 61 6c 77   Geometry is alw
ba50: 61 79 73 20 74 68 65 20 6c 61 73 74 20 43 6f 6c  ays the last Col
ba60: 75 6d 6e 20 2a 2f 0a 20 20 20 20 73 71 6c 20 3d  umn */.    sql =
ba70: 0a 09 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  ..sqlite3_mprint
ba80: 66 20 28 22 25 73 2c 20 25 73 28 25 73 28 3f 29  f ("%s, %s(%s(?)
ba90: 29 29 22 2c 20 70 72 65 76 2c 20 70 61 72 73 65  ))", prev, parse
baa0: 72 2d 3e 63 61 73 74 5f 64 69 6d 73 2c 0a 09 09  r->cast_dims,...
bab0: 09 20 70 61 72 73 65 72 2d 3e 63 61 73 74 5f 74  . parser->cast_t
bac0: 79 70 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ype);.    sqlite
bad0: 33 5f 66 72 65 65 20 28 70 72 65 76 29 3b 0a 20  3_free (prev);. 
bae0: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 3b 0a 7d     return sql;.}
baf0: 0a 0a 53 50 41 54 49 41 4c 49 54 45 5f 44 45 43  ..SPATIALITE_DEC
bb00: 4c 41 52 45 20 69 6e 74 0a 67 65 6f 6a 73 6f 6e  LARE int.geojson
bb10: 5f 69 6e 69 74 5f 66 65 61 74 75 72 65 20 28 67  _init_feature (g
bb20: 65 6f 6a 73 6f 6e 5f 70 61 72 73 65 72 5f 70 74  eojson_parser_pt
bb30: 72 20 70 61 72 73 65 72 2c 20 67 65 6f 6a 73 6f  r parser, geojso
bb40: 6e 5f 66 65 61 74 75 72 65 5f 70 74 72 20 66 74  n_feature_ptr ft
bb50: 2c 0a 09 09 20 20 20 20 20 20 63 68 61 72 20 2a  ,...      char *
bb60: 2a 65 72 72 6f 72 5f 6d 65 73 73 61 67 65 29 0a  *error_message).
bb70: 7b 0a 2f 2a 20 61 74 74 65 6d 70 74 69 6e 67 20  {./* attempting 
bb80: 74 6f 20 66 75 6c 6c 79 20 69 6e 69 74 69 61 6c  to fully initial
bb90: 69 7a 65 20 61 20 47 65 6f 4a 53 4f 4e 20 46 65  ize a GeoJSON Fe
bba0: 61 74 75 72 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  ature object */.
bbb0: 20 20 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 20      int ret;.   
bbc0: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 63 68   int len;.    ch
bbd0: 61 72 20 2a 62 75 66 3b 0a 20 20 20 20 67 65 6f  ar *buf;.    geo
bbe0: 6a 73 6f 6e 5f 70 72 6f 70 65 72 74 79 5f 70 74  json_property_pt
bbf0: 72 20 70 72 6f 70 3b 0a 20 20 20 20 2a 65 72 72  r prop;.    *err
bc00: 6f 72 5f 6d 65 73 73 61 67 65 20 3d 20 4e 55 4c  or_message = NUL
bc10: 4c 3b 0a 0a 20 20 20 20 69 66 20 28 66 74 2d 3e  L;..    if (ft->
bc20: 70 72 6f 70 5f 6f 66 66 73 65 74 5f 73 74 61 72  prop_offset_star
bc30: 74 20 3c 20 30 20 7c 7c 20 66 74 2d 3e 70 72 6f  t < 0 || ft->pro
bc40: 70 5f 6f 66 66 73 65 74 5f 65 6e 64 20 3c 20 30  p_offset_end < 0
bc50: 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2a 65 72  ).      {..  *er
bc60: 72 6f 72 5f 6d 65 73 73 61 67 65 20 3d 0a 09 20  ror_message =.. 
bc70: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72       sqlite3_mpr
bc80: 69 6e 74 66 20 28 22 47 65 6f 4a 53 4f 4e 20 70  intf ("GeoJSON p
bc90: 61 72 73 65 72 3a 20 69 6e 76 61 6c 69 64 20 50  arser: invalid P
bca0: 72 6f 70 65 72 74 69 65 73 20 28 66 69 64 3d 25  roperties (fid=%
bcb0: 64 29 5c 6e 22 2c 0a 09 09 09 20 20 20 20 20 20  d)\n",....      
bcc0: 20 66 74 2d 3e 66 69 64 29 3b 0a 09 20 20 72 65   ft->fid);..  re
bcd0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
bce0: 20 20 20 20 69 66 20 28 66 74 2d 3e 70 72 6f 70      if (ft->prop
bcf0: 5f 6f 66 66 73 65 74 5f 65 6e 64 20 3c 3d 20 66  _offset_end <= f
bd00: 74 2d 3e 70 72 6f 70 5f 6f 66 66 73 65 74 5f 73  t->prop_offset_s
bd10: 74 61 72 74 29 0a 20 20 20 20 20 20 7b 0a 09 20  tart).      {.. 
bd20: 20 2a 65 72 72 6f 72 5f 6d 65 73 73 61 67 65 20   *error_message 
bd30: 3d 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65 33  =..      sqlite3
bd40: 5f 6d 70 72 69 6e 74 66 20 28 22 47 65 6f 4a 53  _mprintf ("GeoJS
bd50: 4f 4e 20 70 61 72 73 65 72 3a 20 69 6e 76 61 6c  ON parser: inval
bd60: 69 64 20 50 72 6f 70 65 72 74 69 65 73 20 28 66  id Properties (f
bd70: 69 64 3d 25 64 29 5c 6e 22 2c 0a 09 09 09 20 20  id=%d)\n",....  
bd80: 20 20 20 20 20 66 74 2d 3e 66 69 64 29 3b 0a 09       ft->fid);..
bd90: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
bda0: 20 20 7d 0a 20 20 20 20 72 65 74 20 3d 20 66 73    }.    ret = fs
bdb0: 65 65 6b 20 28 70 61 72 73 65 72 2d 3e 69 6e 2c  eek (parser->in,
bdc0: 20 66 74 2d 3e 70 72 6f 70 5f 6f 66 66 73 65 74   ft->prop_offset
bdd0: 5f 73 74 61 72 74 2c 20 53 45 45 4b 5f 53 45 54  _start, SEEK_SET
bde0: 29 3b 0a 20 20 20 20 69 66 20 28 72 65 74 20 21  );.    if (ret !
bdf0: 3d 20 30 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  = 0).      {..  
be00: 2a 65 72 72 6f 72 5f 6d 65 73 73 61 67 65 20 3d  *error_message =
be10: 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ..      sqlite3_
be20: 6d 70 72 69 6e 74 66 0a 09 20 20 20 20 20 20 28  mprintf..      (
be30: 22 47 65 6f 4a 53 4f 4e 20 70 61 72 73 65 72 3a  "GeoJSON parser:
be40: 20 50 72 6f 70 65 72 74 69 65 73 20 69 6e 76 61   Properties inva
be50: 6c 69 64 20 73 65 65 6b 20 28 66 69 64 3d 25 64  lid seek (fid=%d
be60: 29 5c 6e 22 2c 20 66 74 2d 3e 66 69 64 29 3b 0a  )\n", ft->fid);.
be70: 09 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20  .  return 0;.   
be80: 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 66     }.    len = f
be90: 74 2d 3e 70 72 6f 70 5f 6f 66 66 73 65 74 5f 65  t->prop_offset_e
bea0: 6e 64 20 2d 20 66 74 2d 3e 70 72 6f 70 5f 6f 66  nd - ft->prop_of
beb0: 66 73 65 74 5f 73 74 61 72 74 20 2d 20 31 3b 0a  fset_start - 1;.
bec0: 20 20 20 20 62 75 66 20 3d 20 6d 61 6c 6c 6f 63      buf = malloc
bed0: 20 28 6c 65 6e 20 2b 20 31 29 3b 0a 20 20 20 20   (len + 1);.    
bee0: 69 66 20 28 62 75 66 20 3d 3d 20 4e 55 4c 4c 29  if (buf == NULL)
bef0: 0a 20 20 20 20 20 20 7b 0a 09 20 20 2a 65 72 72  .      {..  *err
bf00: 6f 72 5f 6d 65 73 73 61 67 65 20 3d 0a 09 20 20  or_message =..  
bf10: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69      sqlite3_mpri
bf20: 6e 74 66 0a 09 20 20 20 20 20 20 28 22 47 65 6f  ntf..      ("Geo
bf30: 4a 53 4f 4e 20 70 61 72 73 65 72 3a 20 50 72 6f  JSON parser: Pro
bf40: 70 65 72 74 69 65 73 20 69 6e 73 75 66 66 69 63  perties insuffic
bf50: 69 65 6e 74 20 6d 65 6d 6f 72 79 20 28 66 69 64  ient memory (fid
bf60: 3d 25 64 29 5c 6e 22 2c 0a 09 20 20 20 20 20 20  =%d)\n",..      
bf70: 20 66 74 2d 3e 66 69 64 29 3b 0a 09 20 20 72 65   ft->fid);..  re
bf80: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
bf90: 20 20 20 20 72 65 74 20 3d 20 66 72 65 61 64 20      ret = fread 
bfa0: 28 62 75 66 2c 20 31 2c 20 6c 65 6e 2c 20 70 61  (buf, 1, len, pa
bfb0: 72 73 65 72 2d 3e 69 6e 29 3b 0a 20 20 20 20 69  rser->in);.    i
bfc0: 66 20 28 72 65 74 20 21 3d 20 6c 65 6e 29 0a 20  f (ret != len). 
bfd0: 20 20 20 20 20 7b 0a 09 20 20 2a 65 72 72 6f 72       {..  *error
bfe0: 5f 6d 65 73 73 61 67 65 20 3d 0a 09 20 20 20 20  _message =..    
bff0: 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74    sqlite3_mprint
c000: 66 0a 09 20 20 20 20 20 20 28 22 47 65 6f 4a 53  f..      ("GeoJS
c010: 4f 4e 20 70 61 72 73 65 72 3a 20 50 72 6f 70 65  ON parser: Prope
c020: 72 74 69 65 73 20 72 65 61 64 20 65 72 72 6f 72  rties read error
c030: 20 28 66 69 64 3d 25 64 29 5c 6e 22 2c 20 66 74   (fid=%d)\n", ft
c040: 2d 3e 66 69 64 29 3b 0a 09 20 20 66 72 65 65 20  ->fid);..  free 
c050: 28 62 75 66 29 3b 0a 09 20 20 72 65 74 75 72 6e  (buf);..  return
c060: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
c070: 2a 28 62 75 66 20 2b 20 6c 65 6e 29 20 3d 20 27  *(buf + len) = '
c080: 5c 30 27 3b 0a 20 20 20 20 67 65 6f 6a 73 6f 6e  \0';.    geojson
c090: 5f 70 61 72 73 65 5f 70 72 6f 70 65 72 74 69 65  _parse_propertie
c0a0: 73 20 28 66 74 2c 20 62 75 66 2c 20 65 72 72 6f  s (ft, buf, erro
c0b0: 72 5f 6d 65 73 73 61 67 65 29 3b 0a 20 20 20 20  r_message);.    
c0c0: 66 72 65 65 20 28 62 75 66 29 3b 0a 0a 2f 2a 20  free (buf);../* 
c0d0: 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 64 75 70  checking for dup
c0e0: 6c 69 63 61 74 65 20 44 72 6f 70 65 72 74 79 20  licate Droperty 
c0f0: 6e 61 6d 65 73 20 2a 2f 0a 20 20 20 20 70 72 6f  names */.    pro
c100: 70 20 3d 20 66 74 2d 3e 66 69 72 73 74 3b 0a 20  p = ft->first;. 
c110: 20 20 20 77 68 69 6c 65 20 28 70 72 6f 70 20 21     while (prop !
c120: 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a  = NULL).      {.
c130: 09 20 20 67 65 6f 6a 73 6f 6e 5f 70 72 6f 70 65  .  geojson_prope
c140: 72 74 79 5f 70 74 72 20 70 72 6f 70 32 20 3d 20  rty_ptr prop2 = 
c150: 70 72 6f 70 2d 3e 6e 65 78 74 3b 0a 09 20 20 77  prop->next;..  w
c160: 68 69 6c 65 20 28 70 72 6f 70 32 20 21 3d 20 4e  hile (prop2 != N
c170: 55 4c 4c 29 0a 09 20 20 20 20 7b 0a 09 09 69 66  ULL)..    {...if
c180: 20 28 73 74 72 63 61 73 65 63 6d 70 20 28 70 72   (strcasecmp (pr
c190: 6f 70 2d 3e 6e 61 6d 65 2c 20 70 72 6f 70 32 2d  op->name, prop2-
c1a0: 3e 6e 61 6d 65 29 20 3d 3d 20 30 29 0a 09 09 20  >name) == 0)... 
c1b0: 20 7b 0a 09 09 20 20 20 20 20 20 2a 65 72 72 6f   {...      *erro
c1c0: 72 5f 6d 65 73 73 61 67 65 20 3d 0a 09 09 09 20  r_message =.... 
c1d0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
c1e0: 0a 09 09 09 20 20 28 22 47 65 6f 4a 53 4f 4e 20  ....  ("GeoJSON 
c1f0: 70 61 72 73 65 72 3a 20 64 75 70 6c 69 63 61 74  parser: duplicat
c200: 65 20 70 72 6f 70 65 72 74 79 20 6e 61 6d 65 20  e property name 
c210: 5c 22 25 73 5c 22 20 28 66 69 64 3d 25 64 29 5c  \"%s\" (fid=%d)\
c220: 6e 22 2c 0a 09 09 09 20 20 20 70 72 6f 70 2d 3e  n",....   prop->
c230: 6e 61 6d 65 2c 20 66 74 2d 3e 66 69 64 29 3b 0a  name, ft->fid);.
c240: 09 09 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ..      return 0
c250: 3b 0a 09 09 20 20 7d 0a 09 09 70 72 6f 70 32 20  ;...  }...prop2 
c260: 3d 20 70 72 6f 70 32 2d 3e 6e 65 78 74 3b 0a 09  = prop2->next;..
c270: 20 20 20 20 7d 0a 09 20 20 70 72 6f 70 20 3d 20      }..  prop = 
c280: 70 72 6f 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20  prop->next;.    
c290: 20 20 7d 0a 0a 2f 2a 20 72 65 61 64 69 6e 67 20    }../* reading 
c2a0: 74 68 65 20 47 65 6f 4a 53 4f 4e 20 47 65 6f 6d  the GeoJSON Geom
c2b0: 65 74 72 79 20 2a 2f 0a 20 20 20 20 69 66 20 28  etry */.    if (
c2c0: 66 74 2d 3e 67 65 6f 6d 5f 6f 66 66 73 65 74 5f  ft->geom_offset_
c2d0: 73 74 61 72 74 20 3c 20 30 20 7c 7c 20 66 74 2d  start < 0 || ft-
c2e0: 3e 67 65 6f 6d 5f 6f 66 66 73 65 74 5f 65 6e 64  >geom_offset_end
c2f0: 20 3c 20 30 29 0a 20 20 20 20 20 20 7b 0a 09 20   < 0).      {.. 
c300: 20 2a 65 72 72 6f 72 5f 6d 65 73 73 61 67 65 20   *error_message 
c310: 3d 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65 33  =..      sqlite3
c320: 5f 6d 70 72 69 6e 74 66 20 28 22 47 65 6f 4a 53  _mprintf ("GeoJS
c330: 4f 4e 20 70 61 72 73 65 72 3a 20 69 6e 76 61 6c  ON parser: inval
c340: 69 64 20 47 65 6f 6d 65 74 72 79 20 28 66 69 64  id Geometry (fid
c350: 3d 25 64 29 5c 6e 22 2c 0a 09 09 09 20 20 20 20  =%d)\n",....    
c360: 20 20 20 66 74 2d 3e 66 69 64 29 3b 0a 09 20 20     ft->fid);..  
c370: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
c380: 7d 0a 20 20 20 20 69 66 20 28 66 74 2d 3e 67 65  }.    if (ft->ge
c390: 6f 6d 5f 6f 66 66 73 65 74 5f 65 6e 64 20 3c 3d  om_offset_end <=
c3a0: 20 66 74 2d 3e 67 65 6f 6d 5f 6f 66 66 73 65 74   ft->geom_offset
c3b0: 5f 73 74 61 72 74 29 0a 20 20 20 20 20 20 7b 0a  _start).      {.
c3c0: 09 20 20 2a 65 72 72 6f 72 5f 6d 65 73 73 61 67  .  *error_messag
c3d0: 65 20 3d 0a 09 20 20 20 20 20 20 73 71 6c 69 74  e =..      sqlit
c3e0: 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 47 65 6f  e3_mprintf ("Geo
c3f0: 4a 53 4f 4e 20 70 61 72 73 65 72 3a 20 69 6e 76  JSON parser: inv
c400: 61 6c 69 64 20 47 65 6f 6d 65 74 72 79 20 28 66  alid Geometry (f
c410: 69 64 3d 25 64 29 5c 6e 22 2c 0a 09 09 09 20 20  id=%d)\n",....  
c420: 20 20 20 20 20 66 74 2d 3e 66 69 64 29 3b 0a 09       ft->fid);..
c430: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
c440: 20 20 7d 0a 20 20 20 20 72 65 74 20 3d 20 66 73    }.    ret = fs
c450: 65 65 6b 20 28 70 61 72 73 65 72 2d 3e 69 6e 2c  eek (parser->in,
c460: 20 66 74 2d 3e 67 65 6f 6d 5f 6f 66 66 73 65 74   ft->geom_offset
c470: 5f 73 74 61 72 74 2c 20 53 45 45 4b 5f 53 45 54  _start, SEEK_SET
c480: 29 3b 0a 20 20 20 20 69 66 20 28 72 65 74 20 21  );.    if (ret !
c490: 3d 20 30 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  = 0).      {..  
c4a0: 2a 65 72 72 6f 72 5f 6d 65 73 73 61 67 65 20 3d  *error_message =
c4b0: 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ..      sqlite3_
c4c0: 6d 70 72 69 6e 74 66 0a 09 20 20 20 20 20 20 28  mprintf..      (
c4d0: 22 47 65 6f 4a 53 4f 4e 20 70 61 72 73 65 72 3a  "GeoJSON parser:
c4e0: 20 47 65 6f 6d 65 74 72 79 20 69 6e 76 61 6c 69   Geometry invali
c4f0: 64 20 73 65 65 6b 20 28 66 69 64 3d 25 64 29 5c  d seek (fid=%d)\
c500: 6e 22 2c 20 66 74 2d 3e 66 69 64 29 3b 0a 09 20  n", ft->fid);.. 
c510: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
c520: 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 66 74 2d   }.    len = ft-
c530: 3e 67 65 6f 6d 5f 6f 66 66 73 65 74 5f 65 6e 64  >geom_offset_end
c540: 20 2d 20 66 74 2d 3e 67 65 6f 6d 5f 6f 66 66 73   - ft->geom_offs
c550: 65 74 5f 73 74 61 72 74 3b 0a 20 20 20 20 69 66  et_start;.    if
c560: 20 28 6c 65 6e 20 3d 3d 20 30 29 0a 20 20 20 20   (len == 0).    
c570: 20 20 7b 0a 09 20 20 2f 2a 20 4e 55 4c 4c 20 47    {..  /* NULL G
c580: 65 6f 6d 65 74 72 79 20 2a 2f 0a 09 20 20 69 66  eometry */..  if
c590: 20 28 66 74 2d 3e 67 65 6f 6d 65 74 72 79 20 21   (ft->geometry !
c5a0: 3d 20 4e 55 4c 4c 29 0a 09 20 20 20 20 20 20 66  = NULL)..      f
c5b0: 72 65 65 20 28 66 74 2d 3e 67 65 6f 6d 65 74 72  ree (ft->geometr
c5c0: 79 29 3b 0a 09 20 20 66 74 2d 3e 67 65 6f 6d 65  y);..  ft->geome
c5d0: 74 72 79 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 72  try = NULL;..  r
c5e0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
c5f0: 0a 20 20 20 20 62 75 66 20 3d 20 6d 61 6c 6c 6f  .    buf = mallo
c600: 63 20 28 6c 65 6e 20 2b 20 32 29 3b 0a 20 20 20  c (len + 2);.   
c610: 20 69 66 20 28 62 75 66 20 3d 3d 20 4e 55 4c 4c   if (buf == NULL
c620: 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2a 65 72  ).      {..  *er
c630: 72 6f 72 5f 6d 65 73 73 61 67 65 20 3d 0a 09 20  ror_message =.. 
c640: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72       sqlite3_mpr
c650: 69 6e 74 66 0a 09 20 20 20 20 20 20 28 22 47 65  intf..      ("Ge
c660: 6f 4a 53 4f 4e 20 70 61 72 73 65 72 3a 20 47 65  oJSON parser: Ge
c670: 6f 6d 65 74 72 79 20 69 6e 73 75 66 66 69 63 69  ometry insuffici
c680: 65 6e 74 20 6d 65 6d 6f 72 79 20 28 66 69 64 3d  ent memory (fid=
c690: 25 64 29 5c 6e 22 2c 0a 09 20 20 20 20 20 20 20  %d)\n",..       
c6a0: 66 74 2d 3e 66 69 64 29 3b 0a 09 20 20 72 65 74  ft->fid);..  ret
c6b0: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
c6c0: 20 20 20 2a 62 75 66 20 3d 20 27 7b 27 3b 0a 20     *buf = '{';. 
c6d0: 20 20 20 72 65 74 20 3d 20 66 72 65 61 64 20 28     ret = fread (
c6e0: 62 75 66 20 2b 20 31 2c 20 31 2c 20 6c 65 6e 2c  buf + 1, 1, len,
c6f0: 20 70 61 72 73 65 72 2d 3e 69 6e 29 3b 0a 20 20   parser->in);.  
c700: 20 20 69 66 20 28 72 65 74 20 21 3d 20 6c 65 6e    if (ret != len
c710: 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2a 65 72  ).      {..  *er
c720: 72 6f 72 5f 6d 65 73 73 61 67 65 20 3d 0a 09 20  ror_message =.. 
c730: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72       sqlite3_mpr
c740: 69 6e 74 66 20 28 22 47 65 6f 4a 53 4f 4e 20 70  intf ("GeoJSON p
c750: 61 72 73 65 72 3a 20 47 65 6f 6d 65 74 72 79 20  arser: Geometry 
c760: 72 65 61 64 20 65 72 72 6f 72 20 28 66 69 64 3d  read error (fid=
c770: 25 64 29 5c 6e 22 2c 0a 09 09 09 20 20 20 20 20  %d)\n",....     
c780: 20 20 66 74 2d 3e 66 69 64 29 3b 0a 09 20 20 66    ft->fid);..  f
c790: 72 65 65 20 28 62 75 66 29 3b 0a 09 20 20 72 65  ree (buf);..  re
c7a0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
c7b0: 20 20 20 20 2a 28 62 75 66 20 2b 20 6c 65 6e 20      *(buf + len 
c7c0: 2b 20 31 29 20 3d 20 27 5c 30 27 3b 0a 20 20 20  + 1) = '\0';.   
c7d0: 20 69 66 20 28 66 74 2d 3e 67 65 6f 6d 65 74 72   if (ft->geometr
c7e0: 79 20 21 3d 20 4e 55 4c 4c 29 0a 09 66 72 65 65  y != NULL)..free
c7f0: 20 28 66 74 2d 3e 67 65 6f 6d 65 74 72 79 29 3b   (ft->geometry);
c800: 0a 20 20 20 20 66 74 2d 3e 67 65 6f 6d 65 74 72  .    ft->geometr
c810: 79 20 3d 20 62 75 66 3b 0a 20 20 20 20 72 65 74  y = buf;.    ret
c820: 75 72 6e 20 31 3b 0a 7d 0a 0a 53 50 41 54 49 41  urn 1;.}..SPATIA
c830: 4c 49 54 45 5f 44 45 43 4c 41 52 45 20 76 6f 69  LITE_DECLARE voi
c840: 64 0a 67 65 6f 6a 73 6f 6e 5f 72 65 73 65 74 5f  d.geojson_reset_
c850: 66 65 61 74 75 72 65 20 28 67 65 6f 6a 73 6f 6e  feature (geojson
c860: 5f 66 65 61 74 75 72 65 5f 70 74 72 20 66 74 29  _feature_ptr ft)
c870: 0a 7b 0a 2f 2a 20 6d 65 6d 6f 72 79 20 63 6c 65  .{./* memory cle
c880: 61 6e 75 70 20 2d 20 66 72 65 65 69 6e 67 20 61  anup - freeing a
c890: 20 46 65 61 74 75 72 65 20 2a 2f 0a 20 20 20 20   Feature */.    
c8a0: 67 65 6f 6a 73 6f 6e 5f 70 72 6f 70 65 72 74 79  geojson_property
c8b0: 5f 70 74 72 20 70 70 3b 0a 20 20 20 20 69 66 20  _ptr pp;.    if 
c8c0: 28 66 74 20 3d 3d 20 4e 55 4c 4c 29 0a 09 72 65  (ft == NULL)..re
c8d0: 74 75 72 6e 3b 0a 0a 20 20 20 20 69 66 20 28 66  turn;..    if (f
c8e0: 74 2d 3e 67 65 6f 6d 65 74 72 79 20 21 3d 20 4e  t->geometry != N
c8f0: 55 4c 4c 29 0a 09 66 72 65 65 20 28 66 74 2d 3e  ULL)..free (ft->
c900: 67 65 6f 6d 65 74 72 79 29 3b 0a 20 20 20 20 70  geometry);.    p
c910: 70 20 3d 20 66 74 2d 3e 66 69 72 73 74 3b 0a 20  p = ft->first;. 
c920: 20 20 20 77 68 69 6c 65 20 28 70 70 20 21 3d 20     while (pp != 
c930: 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20  NULL).      {.. 
c940: 20 67 65 6f 6a 73 6f 6e 5f 70 72 6f 70 65 72 74   geojson_propert
c950: 79 5f 70 74 72 20 70 70 6e 20 3d 20 70 70 2d 3e  y_ptr ppn = pp->
c960: 6e 65 78 74 3b 0a 09 20 20 69 66 20 28 70 70 2d  next;..  if (pp-
c970: 3e 6e 61 6d 65 20 21 3d 20 4e 55 4c 4c 29 0a 09  >name != NULL)..
c980: 20 20 20 20 20 20 66 72 65 65 20 28 70 70 2d 3e        free (pp->
c990: 6e 61 6d 65 29 3b 0a 09 20 20 69 66 20 28 70 70  name);..  if (pp
c9a0: 2d 3e 74 78 74 5f 76 61 6c 75 65 20 21 3d 20 4e  ->txt_value != N
c9b0: 55 4c 4c 29 0a 09 20 20 20 20 20 20 66 72 65 65  ULL)..      free
c9c0: 20 28 70 70 2d 3e 74 78 74 5f 76 61 6c 75 65 29   (pp->txt_value)
c9d0: 3b 0a 09 20 20 66 72 65 65 20 28 70 70 29 3b 0a  ;..  free (pp);.
c9e0: 09 20 20 70 70 20 3d 20 70 70 6e 3b 0a 20 20 20  .  pp = ppn;.   
c9f0: 20 20 20 7d 0a 20 20 20 20 66 74 2d 3e 67 65 6f     }.    ft->geo
ca00: 6d 65 74 72 79 20 3d 20 4e 55 4c 4c 3b 0a 20 20  metry = NULL;.  
ca10: 20 20 66 74 2d 3e 66 69 72 73 74 20 3d 20 4e 55    ft->first = NU
ca20: 4c 4c 3b 0a 20 20 20 20 66 74 2d 3e 6c 61 73 74  LL;.    ft->last
ca30: 20 3d 20 4e 55 4c 4c 3b 0a 7d 0a 0a 53 50 41 54   = NULL;.}..SPAT
ca40: 49 41 4c 49 54 45 5f 44 45 43 4c 41 52 45 20 67  IALITE_DECLARE g
ca50: 65 6f 6a 73 6f 6e 5f 70 72 6f 70 65 72 74 79 5f  eojson_property_
ca60: 70 74 72 0a 67 65 6f 6a 73 6f 6e 5f 67 65 74 5f  ptr.geojson_get_
ca70: 70 72 6f 70 65 72 74 79 5f 62 79 5f 6e 61 6d 65  property_by_name
ca80: 20 28 67 65 6f 6a 73 6f 6e 5f 66 65 61 74 75 72   (geojson_featur
ca90: 65 5f 70 74 72 20 66 74 2c 20 63 6f 6e 73 74 20  e_ptr ft, const 
caa0: 63 68 61 72 20 2a 6e 61 6d 65 29 0a 7b 0a 2f 2a  char *name).{./*
cab0: 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 74 68 65   will return the
cac0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 72   pointer to a Pr
cad0: 6f 70 65 72 74 79 20 69 6e 64 65 6e 74 69 66 69  operty indentifi
cae0: 65 64 20 62 79 20 69 74 73 20 6e 61 6d 65 20 2a  ed by its name *
caf0: 2f 0a 20 20 20 20 67 65 6f 6a 73 6f 6e 5f 70 72  /.    geojson_pr
cb00: 6f 70 65 72 74 79 5f 70 74 72 20 70 70 3b 0a 20  operty_ptr pp;. 
cb10: 20 20 20 69 66 20 28 66 74 20 3d 3d 20 4e 55 4c     if (ft == NUL
cb20: 4c 20 7c 7c 20 6e 61 6d 65 20 3d 3d 20 4e 55 4c  L || name == NUL
cb30: 4c 29 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  L)..return NULL;
cb40: 0a 0a 20 20 20 20 70 70 20 3d 20 66 74 2d 3e 66  ..    pp = ft->f
cb50: 69 72 73 74 3b 0a 20 20 20 20 77 68 69 6c 65 20  irst;.    while 
cb60: 28 70 70 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20  (pp != NULL).   
cb70: 20 20 20 7b 0a 09 20 20 69 66 20 28 73 74 72 63     {..  if (strc
cb80: 61 73 65 63 6d 70 20 28 70 70 2d 3e 6e 61 6d 65  asecmp (pp->name
cb90: 2c 20 6e 61 6d 65 29 20 3d 3d 20 30 29 0a 09 20  , name) == 0).. 
cba0: 20 20 20 20 20 72 65 74 75 72 6e 20 70 70 3b 0a       return pp;.
cbb0: 09 20 20 70 70 20 3d 20 70 70 2d 3e 6e 65 78 74  .  pp = pp->next
cbc0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 72 65  ;.      }.    re
cbd0: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 7d 0a 0a 73 74  turn NULL;.}..st
cbe0: 61 74 69 63 20 69 6e 74 0a 76 67 65 6f 6a 73 6f  atic int.vgeojso
cbf0: 6e 5f 68 61 73 5f 6d 65 74 61 64 61 74 61 20 28  n_has_metadata (
cc00: 73 71 6c 69 74 65 33 20 2a 20 64 62 2c 20 69 6e  sqlite3 * db, in
cc10: 74 20 2a 67 65 6f 74 79 70 65 29 0a 7b 0a 2f 2a  t *geotype).{./*
cc20: 20 74 65 73 74 69 6e 67 20 74 68 65 20 6c 61 79   testing the lay
cc30: 6f 75 74 20 6f 66 20 76 69 72 74 73 5f 67 65 6f  out of virts_geo
cc40: 6d 65 74 72 79 5f 63 6f 6c 75 6d 6e 73 20 74 61  metry_columns ta
cc50: 62 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  ble */.    char 
cc60: 2a 2a 72 65 73 75 6c 74 73 3b 0a 20 20 20 20 69  **results;.    i
cc70: 6e 74 20 72 65 74 3b 0a 20 20 20 20 69 6e 74 20  nt ret;.    int 
cc80: 72 6f 77 73 3b 0a 20 20 20 20 69 6e 74 20 63 6f  rows;.    int co
cc90: 6c 75 6d 6e 73 3b 0a 20 20 20 20 69 6e 74 20 69  lumns;.    int i
cca0: 3b 0a 20 20 20 20 69 6e 74 20 6f 6b 5f 76 69 72  ;.    int ok_vir
ccb0: 74 5f 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  t_name = 0;.    
ccc0: 69 6e 74 20 6f 6b 5f 76 69 72 74 5f 67 65 6f 6d  int ok_virt_geom
ccd0: 65 74 72 79 20 3d 20 30 3b 0a 20 20 20 20 69 6e  etry = 0;.    in
cce0: 74 20 6f 6b 5f 73 72 69 64 20 3d 20 30 3b 0a 20  t ok_srid = 0;. 
ccf0: 20 20 20 69 6e 74 20 6f 6b 5f 67 65 6f 6d 65 74     int ok_geomet
cd00: 72 79 5f 74 79 70 65 20 3d 20 30 3b 0a 20 20 20  ry_type = 0;.   
cd10: 20 69 6e 74 20 6f 6b 5f 74 79 70 65 20 3d 20 30   int ok_type = 0
cd20: 3b 0a 20 20 20 20 69 6e 74 20 6f 6b 5f 63 6f 6f  ;.    int ok_coo
cd30: 72 64 5f 64 69 6d 65 6e 73 69 6f 6e 20 3d 20 30  rd_dimension = 0
cd40: 3b 0a 0a 20 20 20 20 72 65 74 20 3d 0a 09 73 71  ;..    ret =..sq
cd50: 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 20  lite3_get_table 
cd60: 28 64 62 2c 20 22 50 52 41 47 4d 41 20 74 61 62  (db, "PRAGMA tab
cd70: 6c 65 5f 69 6e 66 6f 28 76 69 72 74 73 5f 67 65  le_info(virts_ge
cd80: 6f 6d 65 74 72 79 5f 63 6f 6c 75 6d 6e 73 29 22  ometry_columns)"
cd90: 2c 0a 09 09 09 20 20 20 26 72 65 73 75 6c 74 73  ,....   &results
cda0: 2c 20 26 72 6f 77 73 2c 20 26 63 6f 6c 75 6d 6e  , &rows, &column
cdb0: 73 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66  s, NULL);.    if
cdc0: 20 28 72 65 74 20 21 3d 20 53 51 4c 49 54 45 5f   (ret != SQLITE_
cdd0: 4f 4b 29 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20  OK)..return 0;. 
cde0: 20 20 20 66 6f 72 20 28 69 20 3d 20 31 3b 20 69     for (i = 1; i
cdf0: 20 3c 3d 20 72 6f 77 73 3b 20 69 2b 2b 29 0a 20   <= rows; i++). 
ce00: 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 73 74       {..  if (st
ce10: 72 63 61 73 65 63 6d 70 20 28 22 76 69 72 74 5f  rcasecmp ("virt_
ce20: 6e 61 6d 65 22 2c 20 72 65 73 75 6c 74 73 5b 28  name", results[(
ce30: 69 20 2a 20 63 6f 6c 75 6d 6e 73 29 20 2b 20 31  i * columns) + 1
ce40: 5d 29 20 3d 3d 20 30 29 0a 09 20 20 20 20 20 20  ]) == 0)..      
ce50: 6f 6b 5f 76 69 72 74 5f 6e 61 6d 65 20 3d 20 31  ok_virt_name = 1
ce60: 3b 0a 09 20 20 69 66 20 28 73 74 72 63 61 73 65  ;..  if (strcase
ce70: 63 6d 70 20 28 22 76 69 72 74 5f 67 65 6f 6d 65  cmp ("virt_geome
ce80: 74 72 79 22 2c 20 72 65 73 75 6c 74 73 5b 28 69  try", results[(i
ce90: 20 2a 20 63 6f 6c 75 6d 6e 73 29 20 2b 20 31 5d   * columns) + 1]
cea0: 29 20 3d 3d 20 30 29 0a 09 20 20 20 20 20 20 6f  ) == 0)..      o
ceb0: 6b 5f 76 69 72 74 5f 67 65 6f 6d 65 74 72 79 20  k_virt_geometry 
cec0: 3d 20 31 3b 0a 09 20 20 69 66 20 28 73 74 72 63  = 1;..  if (strc
ced0: 61 73 65 63 6d 70 20 28 22 73 72 69 64 22 2c 20  asecmp ("srid", 
cee0: 72 65 73 75 6c 74 73 5b 28 69 20 2a 20 63 6f 6c  results[(i * col
cef0: 75 6d 6e 73 29 20 2b 20 31 5d 29 20 3d 3d 20 30  umns) + 1]) == 0
cf00: 29 0a 09 20 20 20 20 20 20 6f 6b 5f 73 72 69 64  )..      ok_srid
cf10: 20 3d 20 31 3b 0a 09 20 20 69 66 20 28 73 74 72   = 1;..  if (str
cf20: 63 61 73 65 63 6d 70 20 28 22 67 65 6f 6d 65 74  casecmp ("geomet
cf30: 72 79 5f 74 79 70 65 22 2c 20 72 65 73 75 6c 74  ry_type", result
cf40: 73 5b 28 69 20 2a 20 63 6f 6c 75 6d 6e 73 29 20  s[(i * columns) 
cf50: 2b 20 31 5d 29 20 3d 3d 20 30 29 0a 09 20 20 20  + 1]) == 0)..   
cf60: 20 20 20 6f 6b 5f 67 65 6f 6d 65 74 72 79 5f 74     ok_geometry_t
cf70: 79 70 65 20 3d 20 31 3b 0a 09 20 20 69 66 20 28  ype = 1;..  if (
cf80: 73 74 72 63 61 73 65 63 6d 70 20 28 22 74 79 70  strcasecmp ("typ
cf90: 65 22 2c 20 72 65 73 75 6c 74 73 5b 28 69 20 2a  e", results[(i *
cfa0: 20 63 6f 6c 75 6d 6e 73 29 20 2b 20 31 5d 29 20   columns) + 1]) 
cfb0: 3d 3d 20 30 29 0a 09 20 20 20 20 20 20 6f 6b 5f  == 0)..      ok_
cfc0: 74 79 70 65 20 3d 20 31 3b 0a 09 20 20 69 66 20  type = 1;..  if 
cfd0: 28 73 74 72 63 61 73 65 63 6d 70 20 28 22 63 6f  (strcasecmp ("co
cfe0: 6f 72 64 5f 64 69 6d 65 6e 73 69 6f 6e 22 2c 20  ord_dimension", 
cff0: 72 65 73 75 6c 74 73 5b 28 69 20 2a 20 63 6f 6c  results[(i * col
d000: 75 6d 6e 73 29 20 2b 20 31 5d 29 20 3d 3d 20 30  umns) + 1]) == 0
d010: 29 0a 09 20 20 20 20 20 20 6f 6b 5f 63 6f 6f 72  )..      ok_coor
d020: 64 5f 64 69 6d 65 6e 73 69 6f 6e 20 3d 20 31 3b  d_dimension = 1;
d030: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  .      }.    sql
d040: 69 74 65 33 5f 66 72 65 65 5f 74 61 62 6c 65 20  ite3_free_table 
d050: 28 72 65 73 75 6c 74 73 29 3b 0a 0a 20 20 20 20  (results);..    
d060: 69 66 20 28 6f 6b 5f 76 69 72 74 5f 6e 61 6d 65  if (ok_virt_name
d070: 20 26 26 20 6f 6b 5f 76 69 72 74 5f 67 65 6f 6d   && ok_virt_geom
d080: 65 74 72 79 20 26 26 20 6f 6b 5f 73 72 69 64 20  etry && ok_srid 
d090: 26 26 20 6f 6b 5f 67 65 6f 6d 65 74 72 79 5f 74  && ok_geometry_t
d0a0: 79 70 65 0a 09 26 26 20 6f 6b 5f 63 6f 6f 72 64  ype..&& ok_coord
d0b0: 5f 64 69 6d 65 6e 73 69 6f 6e 29 0a 20 20 20 20  _dimension).    
d0c0: 20 20 7b 0a 09 20 20 2a 67 65 6f 74 79 70 65 20    {..  *geotype 
d0d0: 3d 20 31 3b 0a 09 20 20 72 65 74 75 72 6e 20 31  = 1;..  return 1
d0e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66  ;.      }.    if
d0f0: 20 28 6f 6b 5f 76 69 72 74 5f 6e 61 6d 65 20 26   (ok_virt_name &
d100: 26 20 6f 6b 5f 76 69 72 74 5f 67 65 6f 6d 65 74  & ok_virt_geomet
d110: 72 79 20 26 26 20 6f 6b 5f 73 72 69 64 20 26 26  ry && ok_srid &&
d120: 20 6f 6b 5f 74 79 70 65 29 0a 20 20 20 20 20 20   ok_type).      
d130: 7b 0a 09 20 20 2a 67 65 6f 74 79 70 65 20 3d 20  {..  *geotype = 
d140: 30 3b 0a 09 20 20 72 65 74 75 72 6e 20 31 3b 0a  0;..  return 1;.
d150: 20 20 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75        }.    retu
d160: 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  rn 0;.}..static 
d170: 67 65 6f 6a 73 6f 6e 5f 70 72 6f 70 65 72 74 79  geojson_property
d180: 5f 70 74 72 0a 76 67 65 6f 6a 73 6f 6e 5f 67 65  _ptr.vgeojson_ge
d190: 74 5f 70 72 6f 70 65 72 74 79 5f 62 79 5f 6e 61  t_property_by_na
d1a0: 6d 65 20 28 56 69 72 74 75 61 6c 47 65 6f 4a 73  me (VirtualGeoJs
d1b0: 6f 6e 43 75 72 73 6f 72 50 74 72 20 63 75 72 73  onCursorPtr curs
d1c0: 6f 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  or, const char *
d1d0: 6e 61 6d 65 29 0a 7b 0a 2f 2a 20 61 74 74 65 6d  name).{./* attem
d1e0: 70 74 69 6e 67 20 74 6f 20 72 65 74 72 69 65 76  pting to retriev
d1f0: 65 20 61 20 50 72 6f 70 65 72 74 79 20 66 72 6f  e a Property fro
d200: 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 46 65  m the current Fe
d210: 61 74 75 72 65 20 28 62 79 20 70 72 6f 70 65 72  ature (by proper
d220: 74 79 20 6e 61 6d 65 29 20 2a 2f 0a 20 20 20 20  ty name) */.    
d230: 67 65 6f 6a 73 6f 6e 5f 66 65 61 74 75 72 65 5f  geojson_feature_
d240: 70 74 72 20 66 74 20 3d 20 63 75 72 73 6f 72 2d  ptr ft = cursor-
d250: 3e 46 65 61 74 75 72 65 3b 0a 20 20 20 20 67 65  >Feature;.    ge
d260: 6f 6a 73 6f 6e 5f 70 72 6f 70 65 72 74 79 5f 70  ojson_property_p
d270: 74 72 20 70 72 6f 70 3b 0a 20 20 20 20 69 66 20  tr prop;.    if 
d280: 28 66 74 20 3d 3d 20 4e 55 4c 4c 29 0a 09 72 65  (ft == NULL)..re
d290: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 70  turn NULL;.    p
d2a0: 72 6f 70 20 3d 20 66 74 2d 3e 66 69 72 73 74 3b  rop = ft->first;
d2b0: 0a 20 20 20 20 77 68 69 6c 65 20 28 70 72 6f 70  .    while (prop
d2c0: 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20   != NULL).      
d2d0: 7b 0a 09 20 20 69 66 20 28 70 72 6f 70 2d 3e 6e  {..  if (prop->n
d2e0: 61 6d 65 20 21 3d 20 4e 55 4c 4c 29 0a 09 20 20  ame != NULL)..  
d2f0: 20 20 7b 0a 09 09 69 66 20 28 73 74 72 63 61 73    {...if (strcas
d300: 65 63 6d 70 20 28 70 72 6f 70 2d 3e 6e 61 6d 65  ecmp (prop->name
d310: 2c 20 6e 61 6d 65 29 20 3d 3d 20 30 29 0a 09 09  , name) == 0)...
d320: 20 20 20 20 72 65 74 75 72 6e 20 70 72 6f 70 3b      return prop;
d330: 0a 09 20 20 20 20 7d 0a 09 20 20 70 72 6f 70 20  ..    }..  prop 
d340: 3d 20 70 72 6f 70 2d 3e 6e 65 78 74 3b 0a 20 20  = prop->next;.  
d350: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
d360: 20 4e 55 4c 4c 3b 0a 7d 0a 0a 73 74 61 74 69 63   NULL;.}..static
d370: 20 67 65 6f 6a 73 6f 6e 5f 70 72 6f 70 65 72 74   geojson_propert
d380: 79 5f 70 74 72 0a 76 67 65 6f 6a 73 6f 6e 5f 67  y_ptr.vgeojson_g
d390: 65 74 5f 70 72 6f 70 65 72 74 79 5f 62 79 5f 63  et_property_by_c
d3a0: 6f 6c 20 28 56 69 72 74 75 61 6c 47 65 6f 4a 73  ol (VirtualGeoJs
d3b0: 6f 6e 43 75 72 73 6f 72 50 74 72 20 63 75 72 73  onCursorPtr curs
d3c0: 6f 72 2c 20 69 6e 74 20 63 6f 6c 75 6d 6e 29 0a  or, int column).
d3d0: 7b 0a 2f 2a 20 61 74 74 65 6d 70 74 69 6e 67 20  {./* attempting 
d3e0: 74 6f 20 72 65 74 72 69 65 76 65 20 61 20 50 72  to retrieve a Pr
d3f0: 6f 70 65 72 74 79 20 66 72 6f 6d 20 74 68 65 20  operty from the 
d400: 63 75 72 72 65 6e 74 20 46 65 61 74 75 72 65 20  current Feature 
d410: 28 62 79 20 63 6f 6c 75 6d 6e 20 69 6e 64 65 78  (by column index
d420: 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 63 6f  ) */.    int ico
d430: 6c 20 3d 20 30 3b 0a 20 20 20 20 67 65 6f 6a 73  l = 0;.    geojs
d440: 6f 6e 5f 63 6f 6c 75 6d 6e 5f 70 74 72 20 63 6f  on_column_ptr co
d450: 6c 3b 0a 20 20 20 20 67 65 6f 6a 73 6f 6e 5f 70  l;.    geojson_p
d460: 61 72 73 65 72 5f 70 74 72 20 70 61 72 73 65 72  arser_ptr parser
d470: 20 3d 20 63 75 72 73 6f 72 2d 3e 70 56 74 61 62   = cursor->pVtab
d480: 2d 3e 50 61 72 73 65 72 3b 0a 20 20 20 20 69 66  ->Parser;.    if
d490: 20 28 70 61 72 73 65 72 20 3d 3d 20 4e 55 4c 4c   (parser == NULL
d4a0: 29 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  )..return NULL;.
d4b0: 20 20 20 20 63 6f 6c 20 3d 20 70 61 72 73 65 72      col = parser
d4c0: 2d 3e 66 69 72 73 74 5f 63 6f 6c 3b 0a 20 20 20  ->first_col;.   
d4d0: 20 77 68 69 6c 65 20 28 63 6f 6c 20 21 3d 20 4e   while (col != N
d4e0: 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  ULL).      {..  
d4f0: 69 66 20 28 69 63 6f 6c 20 3d 3d 20 63 6f 6c 75  if (icol == colu
d500: 6d 6e 29 0a 09 20 20 20 20 20 20 72 65 74 75 72  mn)..      retur
d510: 6e 20 76 67 65 6f 6a 73 6f 6e 5f 67 65 74 5f 70  n vgeojson_get_p
d520: 72 6f 70 65 72 74 79 5f 62 79 5f 6e 61 6d 65 20  roperty_by_name 
d530: 28 63 75 72 73 6f 72 2c 20 63 6f 6c 2d 3e 6e 61  (cursor, col->na
d540: 6d 65 29 3b 0a 09 20 20 69 63 6f 6c 2b 2b 3b 0a  me);..  icol++;.
d550: 09 20 20 63 6f 6c 20 3d 20 63 6f 6c 2d 3e 6e 65  .  col = col->ne
d560: 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
d570: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 7d 0a 0a  return NULL;.}..
d580: 73 74 61 74 69 63 20 76 6f 69 64 0a 76 67 65 6f  static void.vgeo
d590: 6a 73 6f 6e 5f 67 65 74 5f 65 78 74 65 6e 74 20  json_get_extent 
d5a0: 28 56 69 72 74 75 61 6c 47 65 6f 4a 73 6f 6e 50  (VirtualGeoJsonP
d5b0: 74 72 20 70 5f 76 74 29 0a 7b 0a 2f 2a 20 64 65  tr p_vt).{./* de
d5c0: 74 65 72 6d 69 6e 69 6e 67 20 74 68 65 20 46 75  termining the Fu
d5d0: 6c 6c 20 45 78 74 65 6e 74 20 2a 2f 0a 20 20 20  ll Extent */.   
d5e0: 20 69 6e 74 20 66 69 64 3b 0a 20 20 20 20 67 65   int fid;.    ge
d5f0: 6f 6a 73 6f 6e 5f 66 65 61 74 75 72 65 5f 70 74  ojson_feature_pt
d600: 72 20 66 74 3b 0a 20 20 20 20 63 68 61 72 20 2a  r ft;.    char *
d610: 65 72 72 6f 72 5f 6d 65 73 73 61 67 65 3b 0a 20  error_message;. 
d620: 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50     gaiaGeomCollP
d630: 74 72 20 67 65 6f 6d 3b 0a 20 20 20 20 69 66 20  tr geom;.    if 
d640: 28 21 28 70 5f 76 74 2d 3e 56 61 6c 69 64 29 29  (!(p_vt->Valid))
d650: 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 66  ..return;..    f
d660: 6f 72 20 28 66 69 64 20 3d 20 30 3b 20 66 69 64  or (fid = 0; fid
d670: 20 3c 20 70 5f 76 74 2d 3e 50 61 72 73 65 72 2d   < p_vt->Parser-
d680: 3e 63 6f 75 6e 74 3b 20 66 69 64 2b 2b 29 0a 20  >count; fid++). 
d690: 20 20 20 20 20 7b 0a 09 20 20 66 74 20 3d 20 70       {..  ft = p
d6a0: 5f 76 74 2d 3e 50 61 72 73 65 72 2d 3e 66 65 61  _vt->Parser->fea
d6b0: 74 75 72 65 73 20 2b 20 66 69 64 3b 0a 09 20 20  tures + fid;..  
d6c0: 69 66 20 28 21 67 65 6f 6a 73 6f 6e 5f 69 6e 69  if (!geojson_ini
d6d0: 74 5f 66 65 61 74 75 72 65 20 28 70 5f 76 74 2d  t_feature (p_vt-
d6e0: 3e 50 61 72 73 65 72 2c 20 66 74 2c 20 26 65 72  >Parser, ft, &er
d6f0: 72 6f 72 5f 6d 65 73 73 61 67 65 29 29 0a 09 20  ror_message)).. 
d700: 20 20 20 7b 0a 09 09 2f 2a 20 61 6e 20 65 72 72     {.../* an err
d710: 6f 72 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a 09  or occurred */..
d720: 09 73 70 61 74 69 61 6c 69 74 65 5f 65 20 28 22  .spatialite_e ("
d730: 25 73 5c 6e 22 2c 20 65 72 72 6f 72 5f 6d 65 73  %s\n", error_mes
d740: 73 61 67 65 29 3b 0a 09 09 73 71 6c 69 74 65 33  sage);...sqlite3
d750: 5f 66 72 65 65 20 28 65 72 72 6f 72 5f 6d 65 73  _free (error_mes
d760: 73 61 67 65 29 3b 0a 09 09 70 5f 76 74 2d 3e 56  sage);...p_vt->V
d770: 61 6c 69 64 20 3d 20 30 3b 0a 09 09 72 65 74 75  alid = 0;...retu
d780: 72 6e 3b 0a 09 20 20 20 20 7d 0a 09 20 20 67 65  rn;..    }..  ge
d790: 6f 6d 20 3d 20 67 61 69 61 50 61 72 73 65 47 65  om = gaiaParseGe
d7a0: 6f 4a 53 4f 4e 20 28 28 63 6f 6e 73 74 20 75 6e  oJSON ((const un
d7b0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 28  signed char *) (
d7c0: 66 74 2d 3e 67 65 6f 6d 65 74 72 79 29 29 3b 0a  ft->geometry));.
d7d0: 09 20 20 69 66 20 28 67 65 6f 6d 20 21 3d 20 4e  .  if (geom != N
d7e0: 55 4c 4c 29 0a 09 20 20 20 20 7b 0a 09 09 69 66  ULL)..    {...if
d7f0: 20 28 67 65 6f 6d 2d 3e 4d 69 6e 58 20 3c 20 70   (geom->MinX < p
d800: 5f 76 74 2d 3e 4d 69 6e 58 29 0a 09 09 20 20 20  _vt->MinX)...   
d810: 20 70 5f 76 74 2d 3e 4d 69 6e 58 20 3d 20 67 65   p_vt->MinX = ge
d820: 6f 6d 2d 3e 4d 69 6e 58 3b 0a 09 09 69 66 20 28  om->MinX;...if (
d830: 67 65 6f 6d 2d 3e 4d 61 78 58 20 3e 20 70 5f 76  geom->MaxX > p_v
d840: 74 2d 3e 4d 61 78 58 29 0a 09 09 20 20 20 20 70  t->MaxX)...    p
d850: 5f 76 74 2d 3e 4d 61 78 58 20 3d 20 67 65 6f 6d  _vt->MaxX = geom
d860: 2d 3e 4d 61 78 58 3b 0a 09 09 69 66 20 28 67 65  ->MaxX;...if (ge
d870: 6f 6d 2d 3e 4d 69 6e 59 20 3c 20 70 5f 76 74 2d  om->MinY < p_vt-
d880: 3e 4d 69 6e 59 29 0a 09 09 20 20 20 20 70 5f 76  >MinY)...    p_v
d890: 74 2d 3e 4d 69 6e 59 20 3d 20 67 65 6f 6d 2d 3e  t->MinY = geom->
d8a0: 4d 69 6e 59 3b 0a 09 09 69 66 20 28 67 65 6f 6d  MinY;...if (geom
d8b0: 2d 3e 4d 61 78 59 20 3e 20 70 5f 76 74 2d 3e 4d  ->MaxY > p_vt->M
d8c0: 61 78 59 29 0a 09 09 20 20 20 20 70 5f 76 74 2d  axY)...    p_vt-
d8d0: 3e 4d 61 78 59 20 3d 20 67 65 6f 6d 2d 3e 4d 61  >MaxY = geom->Ma
d8e0: 78 59 3b 0a 09 09 67 61 69 61 46 72 65 65 47 65  xY;...gaiaFreeGe
d8f0: 6f 6d 43 6f 6c 6c 20 28 67 65 6f 6d 29 3b 0a 09  omColl (geom);..
d900: 20 20 20 20 7d 0a 09 20 20 67 65 6f 6a 73 6f 6e      }..  geojson
d910: 5f 72 65 73 65 74 5f 66 65 61 74 75 72 65 20 28  _reset_feature (
d920: 66 74 29 3b 0a 20 20 20 20 20 20 7d 0a 7d 0a 0a  ft);.      }.}..
d930: 73 74 61 74 69 63 20 69 6e 74 0a 76 67 65 6f 6a  static int.vgeoj
d940: 73 6f 6e 5f 63 72 65 61 74 65 20 28 73 71 6c 69  son_create (sqli
d950: 74 65 33 20 2a 20 64 62 2c 20 76 6f 69 64 20 2a  te3 * db, void *
d960: 70 41 75 78 2c 20 69 6e 74 20 61 72 67 63 2c 20  pAux, int argc, 
d970: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73  const char *cons
d980: 74 20 2a 61 72 67 76 2c 0a 09 09 20 73 71 6c 69  t *argv,... sqli
d990: 74 65 33 5f 76 74 61 62 20 2a 2a 20 70 70 56 54  te3_vtab ** ppVT
d9a0: 61 62 2c 20 63 68 61 72 20 2a 2a 70 7a 45 72 72  ab, char **pzErr
d9b0: 29 0a 7b 0a 2f 2a 20 63 72 65 61 74 65 73 20 74  ).{./* creates t
d9c0: 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
d9d0: 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 73 6f   connected to so
d9e0: 6d 65 20 47 65 6f 4a 53 4f 4e 20 66 69 6c 65 20  me GeoJSON file 
d9f0: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 73 71 6c  */.    char *sql
da00: 3b 0a 20 20 20 20 56 69 72 74 75 61 6c 47 65 6f  ;.    VirtualGeo
da10: 4a 73 6f 6e 50 74 72 20 70 5f 76 74 3b 0a 20 20  JsonPtr p_vt;.  
da20: 20 20 63 68 61 72 20 70 61 74 68 5b 32 30 34 38    char path[2048
da30: 5d 3b 0a 20 20 20 20 63 68 61 72 20 43 6f 6c 6e  ];.    char Coln
da40: 61 6d 65 43 61 73 65 5b 31 32 38 5d 3b 0a 20 20  ameCase[128];.  
da50: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 43    const char *pC
da60: 6f 6c 6e 61 6d 65 43 61 73 65 3b 0a 20 20 20 20  olnameCase;.    
da70: 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 63 6f 6e  int len;.    con
da80: 73 74 20 63 68 61 72 20 2a 70 50 61 74 68 20 3d  st char *pPath =
da90: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 73   NULL;.    int s
daa0: 72 69 64 20 3d 20 34 33 32 36 3b 0a 20 20 20 20  rid = 4326;.    
dab0: 69 6e 74 20 63 6f 6c 6e 61 6d 65 5f 63 61 73 65  int colname_case
dac0: 20 3d 20 47 41 49 41 5f 44 42 46 5f 43 4f 4c 4e   = GAIA_DBF_COLN
dad0: 41 4d 45 5f 4c 4f 57 45 52 43 41 53 45 3b 0a 20  AME_LOWERCASE;. 
dae0: 20 20 20 63 68 61 72 20 2a 78 6e 61 6d 65 3b 0a     char *xname;.
daf0: 20 20 20 20 69 6e 74 20 67 65 6f 74 79 70 65 3b      int geotype;
db00: 0a 20 20 20 20 69 6e 74 20 72 65 74 3b 0a 20 20  .    int ret;.  
db10: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
db20: 73 74 6d 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  stmt = NULL;.   
db30: 20 46 49 4c 45 20 2a 69 6e 3b 0a 20 20 20 20 63   FILE *in;.    c
db40: 68 61 72 20 2a 65 72 72 6f 72 5f 6d 65 73 73 61  har *error_messa
db50: 67 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67  ge = NULL;.    g
db60: 65 6f 6a 73 6f 6e 5f 70 61 72 73 65 72 5f 70 74  eojson_parser_pt
db70: 72 20 70 61 72 73 65 72 3b 0a 20 20 20 20 69 66  r parser;.    if
db80: 20 28 70 41 75 78 29 0a 09 70 41 75 78 20 3d 20   (pAux)..pAux = 
db90: 70 41 75 78 3b 09 09 2f 2a 20 75 6e 75 73 65 64  pAux;../* unused
dba0: 20 61 72 67 20 77 61 72 6e 69 6e 67 20 73 75 70   arg warning sup
dbb0: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 2f 2a 20 63  pression */./* c
dbc0: 68 65 63 6b 69 6e 67 20 66 6f 72 20 47 65 6f 4a  hecking for GeoJ
dbd0: 53 4f 4e 20 50 41 54 48 20 2a 2f 0a 20 20 20 20  SON PATH */.    
dbe0: 69 66 20 28 61 72 67 63 20 3d 3d 20 34 20 7c 7c  if (argc == 4 ||
dbf0: 20 61 72 67 63 20 3d 3d 20 35 20 7c 7c 20 61 72   argc == 5 || ar
dc00: 67 63 20 3d 3d 20 36 29 0a 20 20 20 20 20 20 7b  gc == 6).      {
dc10: 0a 09 20 20 70 50 61 74 68 20 3d 20 61 72 67 76  ..  pPath = argv
dc20: 5b 33 5d 3b 0a 09 20 20 6c 65 6e 20 3d 20 73 74  [3];..  len = st
dc30: 72 6c 65 6e 20 28 70 50 61 74 68 29 3b 0a 09 20  rlen (pPath);.. 
dc40: 20 69 66 20 28 28 2a 28 70 50 61 74 68 20 2b 20   if ((*(pPath + 
dc50: 30 29 20 3d 3d 20 27 5c 27 27 20 7c 7c 20 2a 28  0) == '\'' || *(
dc60: 70 50 61 74 68 20 2b 20 30 29 20 3d 3d 20 27 22  pPath + 0) == '"
dc70: 27 29 0a 09 20 20 20 20 20 20 26 26 20 28 2a 28  ')..      && (*(
dc80: 70 50 61 74 68 20 2b 20 6c 65 6e 20 2d 20 31 29  pPath + len - 1)
dc90: 20 3d 3d 20 27 5c 27 27 20 7c 7c 20 2a 28 70 50   == '\'' || *(pP
dca0: 61 74 68 20 2b 20 6c 65 6e 20 2d 20 31 29 20 3d  ath + len - 1) =
dcb0: 3d 20 27 22 27 29 29 0a 09 20 20 20 20 7b 0a 09  = '"'))..    {..
dcc0: 09 2f 2a 20 74 68 65 20 70 61 74 68 20 69 73 20  ./* the path is 
dcd0: 65 6e 63 6c 6f 73 65 64 20 62 65 74 77 65 65 6e  enclosed between
dce0: 20 71 75 6f 74 65 73 20 2d 20 77 65 20 6e 65 65   quotes - we nee
dcf0: 64 20 74 6f 20 64 65 71 75 6f 74 65 20 69 74 20  d to dequote it 
dd00: 2a 2f 0a 09 09 73 74 72 63 70 79 20 28 70 61 74  */...strcpy (pat
dd10: 68 2c 20 70 50 61 74 68 20 2b 20 31 29 3b 0a 09  h, pPath + 1);..
dd20: 09 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 20 28 70  .len = strlen (p
dd30: 61 74 68 29 3b 0a 09 09 2a 28 70 61 74 68 20 2b  ath);...*(path +
dd40: 20 6c 65 6e 20 2d 20 31 29 20 3d 20 27 5c 30 27   len - 1) = '\0'
dd50: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65  ;..    }..  else
dd60: 0a 09 20 20 20 20 20 20 73 74 72 63 70 79 20 28  ..      strcpy (
dd70: 70 61 74 68 2c 20 70 50 61 74 68 29 3b 0a 09 20  path, pPath);.. 
dd80: 20 69 66 20 28 61 72 67 63 20 3e 3d 20 35 29 0a   if (argc >= 5).
dd90: 09 20 20 20 20 7b 0a 09 09 73 72 69 64 20 3d 20  .    {...srid = 
dda0: 61 74 6f 69 20 28 61 72 67 76 5b 34 5d 29 3b 0a  atoi (argv[4]);.
ddb0: 09 09 69 66 20 28 73 72 69 64 20 3c 20 30 29 0a  ..if (srid < 0).
ddc0: 09 09 20 20 20 20 73 72 69 64 20 3d 20 2d 31 3b  ..    srid = -1;
ddd0: 0a 09 20 20 20 20 7d 0a 09 20 20 69 66 20 28 61  ..    }..  if (a
dde0: 72 67 63 20 3e 3d 20 36 29 0a 09 20 20 20 20 7b  rgc >= 6)..    {
ddf0: 0a 09 09 70 43 6f 6c 6e 61 6d 65 43 61 73 65 20  ...pColnameCase 
de00: 3d 20 61 72 67 76 5b 35 5d 3b 0a 09 09 6c 65 6e  = argv[5];...len
de10: 20 3d 20 73 74 72 6c 65 6e 20 28 70 43 6f 6c 6e   = strlen (pColn
de20: 61 6d 65 43 61 73 65 29 3b 0a 09 09 69 66 20 28  ameCase);...if (
de30: 28 2a 28 70 43 6f 6c 6e 61 6d 65 43 61 73 65 20  (*(pColnameCase 
de40: 2b 20 30 29 20 3d 3d 20 27 5c 27 27 20 7c 7c 20  + 0) == '\'' || 
de50: 2a 28 70 43 6f 6c 6e 61 6d 65 43 61 73 65 20 2b  *(pColnameCase +
de60: 20 30 29 20 3d 3d 20 27 22 27 29 0a 09 09 20 20   0) == '"')...  
de70: 20 20 26 26 20 28 2a 28 70 43 6f 6c 6e 61 6d 65    && (*(pColname
de80: 43 61 73 65 20 2b 20 6c 65 6e 20 2d 20 31 29 20  Case + len - 1) 
de90: 3d 3d 20 27 5c 27 27 0a 09 09 09 7c 7c 20 2a 28  == '\''....|| *(
dea0: 70 43 6f 6c 6e 61 6d 65 43 61 73 65 20 2b 20 6c  pColnameCase + l
deb0: 65 6e 20 2d 20 31 29 20 3d 3d 20 27 22 27 29 29  en - 1) == '"'))
dec0: 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20 2f  ...  {...      /
ded0: 2a 20 74 68 65 20 63 6f 6c 63 61 73 65 2d 6e 61  * the colcase-na
dee0: 6d 65 20 69 73 20 65 6e 63 6c 6f 73 65 64 20 62  me is enclosed b
def0: 65 74 77 65 65 6e 20 71 75 6f 74 65 73 20 2d 20  etween quotes - 
df00: 77 65 20 6e 65 65 64 20 74 6f 20 64 65 71 75 6f  we need to dequo
df10: 74 65 20 69 74 20 2a 2f 0a 09 09 20 20 20 20 20  te it */...     
df20: 20 73 74 72 63 70 79 20 28 43 6f 6c 6e 61 6d 65   strcpy (Colname
df30: 43 61 73 65 2c 20 70 43 6f 6c 6e 61 6d 65 43 61  Case, pColnameCa
df40: 73 65 20 2b 20 31 29 3b 0a 09 09 20 20 20 20 20  se + 1);...     
df50: 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 20 28 43   len = strlen (C
df60: 6f 6c 6e 61 6d 65 43 61 73 65 29 3b 0a 09 09 20  olnameCase);... 
df70: 20 20 20 20 20 2a 28 43 6f 6c 6e 61 6d 65 43 61       *(ColnameCa
df80: 73 65 20 2b 20 6c 65 6e 20 2d 20 31 29 20 3d 20  se + len - 1) = 
df90: 27 5c 30 27 3b 0a 09 09 20 20 7d 0a 09 09 65 6c  '\0';...  }...el
dfa0: 73 65 0a 09 09 20 20 20 20 73 74 72 63 70 79 20  se...    strcpy 
dfb0: 28 43 6f 6c 6e 61 6d 65 43 61 73 65 2c 20 70 43  (ColnameCase, pC
dfc0: 6f 6c 6e 61 6d 65 43 61 73 65 29 3b 0a 09 09 69  olnameCase);...i
dfd0: 66 20 28 73 74 72 63 61 73 65 63 6d 70 20 28 43  f (strcasecmp (C
dfe0: 6f 6c 6e 61 6d 65 43 61 73 65 2c 20 22 75 70 70  olnameCase, "upp
dff0: 65 72 63 61 73 65 22 29 20 3d 3d 20 30 0a 09 09  ercase") == 0...
e000: 20 20 20 20 7c 7c 20 73 74 72 63 61 73 65 63 6d      || strcasecm
e010: 70 20 28 43 6f 6c 6e 61 6d 65 43 61 73 65 2c 20  p (ColnameCase, 
e020: 22 75 70 70 65 72 22 29 20 3d 3d 20 30 29 0a 09  "upper") == 0)..
e030: 09 20 20 20 20 63 6f 6c 6e 61 6d 65 5f 63 61 73  .    colname_cas
e040: 65 20 3d 20 47 41 49 41 5f 44 42 46 5f 43 4f 4c  e = GAIA_DBF_COL
e050: 4e 41 4d 45 5f 55 50 50 45 52 43 41 53 45 3b 0a  NAME_UPPERCASE;.
e060: 09 09 65 6c 73 65 20 69 66 20 28 73 74 72 63 61  ..else if (strca
e070: 73 65 63 6d 70 20 28 43 6f 6c 6e 61 6d 65 43 61  secmp (ColnameCa
e080: 73 65 2c 20 22 73 61 6d 65 63 61 73 65 22 29 20  se, "samecase") 
e090: 3d 3d 20 30 0a 09 09 09 20 7c 7c 20 73 74 72 63  == 0.... || strc
e0a0: 61 73 65 63 6d 70 20 28 43 6f 6c 6e 61 6d 65 43  asecmp (ColnameC
e0b0: 61 73 65 2c 20 22 73 61 6d 65 22 29 20 3d 3d 20  ase, "same") == 
e0c0: 30 29 0a 09 09 20 20 20 20 63 6f 6c 6e 61 6d 65  0)...    colname
e0d0: 5f 63 61 73 65 20 3d 20 47 41 49 41 5f 44 42 46  _case = GAIA_DBF
e0e0: 5f 43 4f 4c 4e 41 4d 45 5f 43 41 53 45 5f 49 47  _COLNAME_CASE_IG
e0f0: 4e 4f 52 45 3b 0a 09 09 65 6c 73 65 0a 09 09 20  NORE;...else... 
e100: 20 20 20 63 6f 6c 6e 61 6d 65 5f 63 61 73 65 20     colname_case 
e110: 3d 20 47 41 49 41 5f 44 42 46 5f 43 4f 4c 4e 41  = GAIA_DBF_COLNA
e120: 4d 45 5f 4c 4f 57 45 52 43 41 53 45 3b 0a 09 20  ME_LOWERCASE;.. 
e130: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
e140: 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20   else.      {.. 
e150: 20 2a 70 7a 45 72 72 20 3d 0a 09 20 20 20 20 20   *pzErr =..     
e160: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
e170: 0a 09 20 20 20 20 20 20 28 22 5b 56 69 72 74 75  ..      ("[Virtu
e180: 61 6c 47 65 6f 4a 53 4f 4e 20 6d 6f 64 75 6c 65  alGeoJSON module
e190: 5d 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c  ] CREATE VIRTUAL
e1a0: 3a 20 69 6c 6c 65 67 61 6c 20 61 72 67 20 6c 69  : illegal arg li
e1b0: 73 74 20 7b 67 65 6f 6a 73 6f 6e 5f 70 61 74 68  st {geojson_path
e1c0: 20 5b 20 2c 20 73 72 69 64 20 5b 20 2c 20 63 6f   [ , srid [ , co
e1d0: 6c 6e 61 6d 65 5f 63 61 73 65 20 5d 5d 20 7d 22  lname_case ]] }"
e1e0: 29 3b 0a 09 20 20 72 65 74 75 72 6e 20 53 51 4c  );..  return SQL
e1f0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
e200: 20 7d 0a 20 20 20 20 70 5f 76 74 20 3d 20 28 56   }.    p_vt = (V
e210: 69 72 74 75 61 6c 47 65 6f 4a 73 6f 6e 50 74 72  irtualGeoJsonPtr
e220: 29 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  ) sqlite3_malloc
e230: 20 28 73 69 7a 65 6f 66 20 28 56 69 72 74 75 61   (sizeof (Virtua
e240: 6c 47 65 6f 4a 73 6f 6e 29 29 3b 0a 20 20 20 20  lGeoJson));.    
e250: 69 66 20 28 21 70 5f 76 74 29 0a 09 72 65 74 75  if (!p_vt)..retu
e260: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
e270: 0a 20 20 20 20 70 5f 76 74 2d 3e 70 4d 6f 64 75  .    p_vt->pModu
e280: 6c 65 20 3d 20 26 6d 79 5f 67 65 6f 6a 73 6f 6e  le = &my_geojson
e290: 5f 6d 6f 64 75 6c 65 3b 0a 20 20 20 20 70 5f 76  _module;.    p_v
e2a0: 74 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 20 20 20  t->nRef = 0;.   
e2b0: 20 70 5f 76 74 2d 3e 7a 45 72 72 4d 73 67 20 3d   p_vt->zErrMsg =
e2c0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 70 5f 76 74 2d   NULL;.    p_vt-
e2d0: 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 70 5f  >db = db;.    p_
e2e0: 76 74 2d 3e 53 72 69 64 20 3d 20 73 72 69 64 3b  vt->Srid = srid;
e2f0: 0a 20 20 20 20 70 5f 76 74 2d 3e 56 61 6c 69 64  .    p_vt->Valid
e300: 20 3d 20 30 3b 0a 20 20 20 20 70 5f 76 74 2d 3e   = 0;.    p_vt->
e310: 44 65 63 6c 61 72 65 64 54 79 70 65 20 3d 20 47  DeclaredType = G
e320: 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c  AIA_GEOMETRYCOLL
e330: 45 43 54 49 4f 4e 3b 0a 20 20 20 20 70 5f 76 74  ECTION;.    p_vt
e340: 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c  ->DimensionModel
e350: 20 3d 20 47 41 49 41 5f 58 59 3b 0a 20 20 20 20   = GAIA_XY;.    
e360: 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 20 28 61 72  len = strlen (ar
e370: 67 76 5b 32 5d 29 3b 0a 20 20 20 20 70 5f 76 74  gv[2]);.    p_vt
e380: 2d 3e 54 61 62 6c 65 4e 61 6d 65 20 3d 20 6d 61  ->TableName = ma
e390: 6c 6c 6f 63 20 28 6c 65 6e 20 2b 20 31 29 3b 0a  lloc (len + 1);.
e3a0: 20 20 20 20 73 74 72 63 70 79 20 28 70 5f 76 74      strcpy (p_vt
e3b0: 2d 3e 54 61 62 6c 65 4e 61 6d 65 2c 20 61 72 67  ->TableName, arg
e3c0: 76 5b 32 5d 29 3b 0a 20 20 20 20 70 5f 76 74 2d  v[2]);.    p_vt-
e3d0: 3e 4d 69 6e 58 20 3d 20 44 42 4c 5f 4d 41 58 3b  >MinX = DBL_MAX;
e3e0: 0a 20 20 20 20 70 5f 76 74 2d 3e 4d 69 6e 59 20  .    p_vt->MinY 
e3f0: 3d 20 44 42 4c 5f 4d 41 58 3b 0a 20 20 20 20 70  = DBL_MAX;.    p
e400: 5f 76 74 2d 3e 4d 61 78 58 20 3d 20 2d 44 42 4c  _vt->MaxX = -DBL
e410: 5f 4d 41 58 3b 0a 20 20 20 20 70 5f 76 74 2d 3e  _MAX;.    p_vt->
e420: 4d 61 78 59 20 3d 20 2d 44 42 4c 5f 4d 41 58 3b  MaxY = -DBL_MAX;
e430: 0a 0a 2f 2a 20 61 74 74 65 6d 70 74 69 6e 67 20  ../* attempting 
e440: 74 6f 20 6f 70 65 6e 20 74 68 65 20 47 65 6f 4a  to open the GeoJ
e450: 53 4f 4e 20 66 69 6c 65 20 66 6f 72 20 72 65 61  SON file for rea
e460: 64 69 6e 67 20 2a 2f 0a 23 69 66 64 65 66 20 5f  ding */.#ifdef _
e470: 57 49 4e 33 32 0a 20 20 20 20 69 6e 20 3d 20 67  WIN32.    in = g
e480: 61 69 61 5f 77 69 6e 5f 66 6f 70 65 6e 20 28 70  aia_win_fopen (p
e490: 61 74 68 2c 20 22 72 62 22 29 3b 0a 23 65 6c 73  ath, "rb");.#els
e4a0: 65 0a 20 20 20 20 69 6e 20 3d 20 66 6f 70 65 6e  e.    in = fopen
e4b0: 20 28 70 61 74 68 2c 20 22 72 62 22 29 3b 0a 23   (path, "rb");.#
e4c0: 65 6e 64 69 66 0a 20 20 20 20 69 66 20 28 69 6e  endif.    if (in
e4d0: 20 3d 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20   == NULL).      
e4e0: 7b 0a 09 20 20 65 72 72 6f 72 5f 6d 65 73 73 61  {..  error_messa
e4f0: 67 65 20 3d 0a 09 20 20 20 20 20 20 73 71 6c 69  ge =..      sqli
e500: 74 65 33 5f 6d 70 72 69 6e 74 66 0a 09 20 20 20  te3_mprintf..   
e510: 20 20 20 28 22 47 65 6f 4a 53 4f 4e 20 70 61 72     ("GeoJSON par
e520: 73 65 72 3a 20 75 6e 61 62 6c 65 20 74 6f 20 6f  ser: unable to o
e530: 70 65 6e 20 25 73 20 66 6f 72 20 72 65 61 64 69  pen %s for readi
e540: 6e 67 5c 6e 22 2c 20 70 61 74 68 29 3b 0a 09 20  ng\n", path);.. 
e550: 20 67 6f 74 6f 20 65 72 72 3b 0a 20 20 20 20 20   goto err;.     
e560: 20 7d 0a 2f 2a 20 63 72 65 61 74 69 6e 67 20 74   }./* creating t
e570: 68 65 20 47 65 6f 4a 53 4f 4e 20 70 61 72 73 65  he GeoJSON parse
e580: 72 20 2a 2f 0a 20 20 20 20 70 61 72 73 65 72 20  r */.    parser 
e590: 3d 20 67 65 6f 6a 73 6f 6e 5f 63 72 65 61 74 65  = geojson_create
e5a0: 5f 70 61 72 73 65 72 20 28 69 6e 29 3b 0a 20 20  _parser (in);.  
e5b0: 20 20 69 66 20 28 21 67 65 6f 6a 73 6f 6e 5f 70    if (!geojson_p
e5c0: 61 72 73 65 72 5f 69 6e 69 74 20 28 70 61 72 73  arser_init (pars
e5d0: 65 72 2c 20 26 65 72 72 6f 72 5f 6d 65 73 73 61  er, &error_messa
e5e0: 67 65 29 29 0a 09 67 6f 74 6f 20 65 72 72 3b 0a  ge))..goto err;.
e5f0: 20 20 20 20 69 66 20 28 21 67 65 6f 6a 73 6f 6e      if (!geojson
e600: 5f 63 72 65 61 74 65 5f 66 65 61 74 75 72 65 73  _create_features
e610: 5f 69 6e 64 65 78 20 28 70 61 72 73 65 72 2c 20  _index (parser, 
e620: 26 65 72 72 6f 72 5f 6d 65 73 73 61 67 65 29 29  &error_message))
e630: 0a 09 67 6f 74 6f 20 65 72 72 3b 0a 20 20 20 20  ..goto err;.    
e640: 69 66 20 28 21 67 65 6f 6a 73 6f 6e 5f 63 68 65  if (!geojson_che
e650: 63 6b 5f 66 65 61 74 75 72 65 73 20 28 70 61 72  ck_features (par
e660: 73 65 72 2c 20 26 65 72 72 6f 72 5f 6d 65 73 73  ser, &error_mess
e670: 61 67 65 29 29 0a 09 67 6f 74 6f 20 65 72 72 3b  age))..goto err;
e680: 0a 20 20 20 20 70 5f 76 74 2d 3e 56 61 6c 69 64  .    p_vt->Valid
e690: 20 3d 20 31 3b 0a 20 20 20 20 70 5f 76 74 2d 3e   = 1;.    p_vt->
e6a0: 50 61 72 73 65 72 20 3d 20 70 61 72 73 65 72 3b  Parser = parser;
e6b0: 0a 20 20 20 20 67 6f 74 6f 20 6f 6b 3b 0a 20 20  .    goto ok;.  
e6c0: 65 72 72 3a 0a 20 20 20 20 69 66 20 28 65 72 72  err:.    if (err
e6d0: 6f 72 5f 6d 65 73 73 61 67 65 20 21 3d 20 4e 55  or_message != NU
e6e0: 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73  LL).      {..  s
e6f0: 70 61 74 69 61 6c 69 74 65 5f 65 20 28 22 25 73  patialite_e ("%s
e700: 5c 6e 22 2c 20 65 72 72 6f 72 5f 6d 65 73 73 61  \n", error_messa
e710: 67 65 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f  ge);..  sqlite3_
e720: 66 72 65 65 20 28 65 72 72 6f 72 5f 6d 65 73 73  free (error_mess
e730: 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
e740: 6f 6b 3a 0a 20 20 20 20 76 67 65 6f 6a 73 6f 6e  ok:.    vgeojson
e750: 5f 67 65 74 5f 65 78 74 65 6e 74 20 28 70 5f 76  _get_extent (p_v
e760: 74 29 3b 0a 20 20 20 20 69 66 20 28 21 28 70 5f  t);.    if (!(p_
e770: 76 74 2d 3e 56 61 6c 69 64 29 29 0a 20 20 20 20  vt->Valid)).    
e780: 20 20 7b 0a 09 20 20 2f 2a 20 73 6f 6d 65 74 68    {..  /* someth
e790: 69 6e 67 20 69 73 20 67 6f 69 6e 67 20 74 68 65  ing is going the
e7a0: 20 77 72 6f 6e 67 20 77 61 79 3b 20 63 72 65 61   wrong way; crea
e7b0: 74 69 6e 67 20 61 20 73 74 75 70 69 64 20 64 65  ting a stupid de
e7c0: 66 61 75 6c 74 20 74 61 62 6c 65 20 2a 2f 0a 09  fault table */..
e7d0: 20 20 78 6e 61 6d 65 20 3d 20 67 61 69 61 44 6f    xname = gaiaDo
e7e0: 75 62 6c 65 51 75 6f 74 65 64 53 71 6c 20 28 28  ubleQuotedSql ((
e7f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 61 72  const char *) ar
e800: 67 76 5b 32 5d 29 3b 0a 09 20 20 73 71 6c 20 3d  gv[2]);..  sql =
e810: 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ..      sqlite3_
e820: 6d 70 72 69 6e 74 66 0a 09 20 20 20 20 20 20 28  mprintf..      (
e830: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 5c 22  "CREATE TABLE \"
e840: 25 73 5c 22 20 28 46 49 44 20 49 4e 54 45 47 45  %s\" (FID INTEGE
e850: 52 2c 20 47 65 6f 6d 65 74 72 79 20 42 4c 4f 42  R, Geometry BLOB
e860: 29 22 2c 20 78 6e 61 6d 65 29 3b 0a 09 20 20 66  )", xname);..  f
e870: 72 65 65 20 28 78 6e 61 6d 65 29 3b 0a 09 20 20  ree (xname);..  
e880: 69 66 20 28 73 71 6c 69 74 65 33 5f 64 65 63 6c  if (sqlite3_decl
e890: 61 72 65 5f 76 74 61 62 20 28 64 62 2c 20 73 71  are_vtab (db, sq
e8a0: 6c 29 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29  l) != SQLITE_OK)
e8b0: 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74 65  ..    {...sqlite
e8c0: 33 5f 66 72 65 65 20 28 73 71 6c 29 3b 0a 09 09  3_free (sql);...
e8d0: 2a 70 7a 45 72 72 20 3d 0a 09 09 20 20 20 20 73  *pzErr =...    s
e8e0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 0a 09  qlite3_mprintf..
e8f0: 09 20 20 20 20 28 22 5b 56 69 72 74 75 61 6c 47  .    ("[VirtualG
e900: 65 6f 4a 53 4f 4e 20 6d 6f 64 75 6c 65 5d 20 63  eoJSON module] c
e910: 61 6e 6e 6f 74 20 62 75 69 6c 64 20 61 20 74 61  annot build a ta
e920: 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 47 65 6f  ble from the Geo
e930: 4a 53 4f 4e 20 66 69 6c 65 5c 6e 22 29 3b 0a 09  JSON file\n");..
e940: 09 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45  .return SQLITE_E
e950: 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20  RROR;..    }..  
e960: 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28 73 71  sqlite3_free (sq
e970: 6c 29 3b 0a 09 20 20 2a 70 70 56 54 61 62 20 3d  l);..  *ppVTab =
e980: 20 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a   (sqlite3_vtab *
e990: 29 20 70 5f 76 74 3b 0a 09 20 20 72 65 74 75 72  ) p_vt;..  retur
e9a0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
e9b0: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70 61 72     }.    if (par
e9c0: 73 65 72 2d 3e 6e 5f 70 6f 69 6e 74 73 20 3e 20  ser->n_points > 
e9d0: 30 20 26 26 20 70 61 72 73 65 72 2d 3e 6e 5f 6c  0 && parser->n_l
e9e0: 69 6e 65 73 74 72 69 6e 67 73 20 3d 3d 20 30 0a  inestrings == 0.
e9f0: 09 26 26 20 70 61 72 73 65 72 2d 3e 6e 5f 70 6f  .&& parser->n_po
ea00: 6c 79 67 6f 6e 73 20 3d 3d 20 30 20 26 26 20 70  lygons == 0 && p
ea10: 61 72 73 65 72 2d 3e 6e 5f 6d 70 6f 69 6e 74 73  arser->n_mpoints
ea20: 20 3d 3d 20 30 0a 09 26 26 20 70 61 72 73 65 72   == 0..&& parser
ea30: 2d 3e 6e 5f 6d 6c 69 6e 65 73 74 72 69 6e 67 73  ->n_mlinestrings
ea40: 20 3d 3d 20 30 20 26 26 20 70 61 72 73 65 72 2d   == 0 && parser-
ea50: 3e 6e 5f 6d 70 6f 6c 79 67 6f 6e 73 20 3d 3d 20  >n_mpolygons == 
ea60: 30 0a 09 26 26 20 70 61 72 73 65 72 2d 3e 6e 5f  0..&& parser->n_
ea70: 67 65 6f 6d 63 6f 6c 6c 73 20 3d 3d 20 30 29 0a  geomcolls == 0).
ea80: 09 70 5f 76 74 2d 3e 44 65 63 6c 61 72 65 64 54  .p_vt->DeclaredT
ea90: 79 70 65 20 3d 20 47 41 49 41 5f 50 4f 49 4e 54  ype = GAIA_POINT
eaa0: 3b 0a 20 20 20 20 69 66 20 28 70 61 72 73 65 72  ;.    if (parser
eab0: 2d 3e 6e 5f 6d 70 6f 69 6e 74 73 20 3e 20 30 20  ->n_mpoints > 0 
eac0: 26 26 20 70 61 72 73 65 72 2d 3e 6e 5f 6c 69 6e  && parser->n_lin
ead0: 65 73 74 72 69 6e 67 73 20 3d 3d 20 30 0a 09 26  estrings == 0..&
eae0: 26 20 70 61 72 73 65 72 2d 3e 6e 5f 70 6f 6c 79  & parser->n_poly
eaf0: 67 6f 6e 73 20 3d 3d 20 30 20 26 26 20 70 61 72  gons == 0 && par
eb00: 73 65 72 2d 3e 6e 5f 6d 6c 69 6e 65 73 74 72 69  ser->n_mlinestri
eb10: 6e 67 73 20 3d 3d 20 30 0a 09 26 26 20 70 61 72  ngs == 0..&& par
eb20: 73 65 72 2d 3e 6e 5f 6d 70 6f 6c 79 67 6f 6e 73  ser->n_mpolygons
eb30: 20 3d 3d 20 30 20 26 26 20 70 61 72 73 65 72 2d   == 0 && parser-
eb40: 3e 6e 5f 67 65 6f 6d 63 6f 6c 6c 73 20 3d 3d 20  >n_geomcolls == 
eb50: 30 29 0a 09 70 5f 76 74 2d 3e 44 65 63 6c 61 72  0)..p_vt->Declar
eb60: 65 64 54 79 70 65 20 3d 20 47 41 49 41 5f 4d 55  edType = GAIA_MU
eb70: 4c 54 49 50 4f 49 4e 54 3b 0a 20 20 20 20 69 66  LTIPOINT;.    if
eb80: 20 28 70 61 72 73 65 72 2d 3e 6e 5f 70 6f 69 6e   (parser->n_poin
eb90: 74 73 20 3d 3d 20 30 20 26 26 20 70 61 72 73 65  ts == 0 && parse
eba0: 72 2d 3e 6e 5f 6c 69 6e 65 73 74 72 69 6e 67 73  r->n_linestrings
ebb0: 20 3e 20 30 0a 09 26 26 20 70 61 72 73 65 72 2d   > 0..&& parser-
ebc0: 3e 6e 5f 70 6f 6c 79 67 6f 6e 73 20 3d 3d 20 30  >n_polygons == 0
ebd0: 20 26 26 20 70 61 72 73 65 72 2d 3e 6e 5f 6d 70   && parser->n_mp
ebe0: 6f 69 6e 74 73 20 3d 3d 20 30 0a 09 26 26 20 70  oints == 0..&& p
ebf0: 61 72 73 65 72 2d 3e 6e 5f 6d 6c 69 6e 65 73 74  arser->n_mlinest
ec00: 72 69 6e 67 73 20 3d 3d 20 30 20 26 26 20 70 61  rings == 0 && pa
ec10: 72 73 65 72 2d 3e 6e 5f 6d 70 6f 6c 79 67 6f 6e  rser->n_mpolygon
ec20: 73 20 3d 3d 20 30 0a 09 26 26 20 70 61 72 73 65  s == 0..&& parse
ec30: 72 2d 3e 6e 5f 67 65 6f 6d 63 6f 6c 6c 73 20 3d  r->n_geomcolls =
ec40: 3d 20 30 29 0a 09 70 5f 76 74 2d 3e 44 65 63 6c  = 0)..p_vt->Decl
ec50: 61 72 65 64 54 79 70 65 20 3d 20 47 41 49 41 5f  aredType = GAIA_
ec60: 4c 49 4e 45 53 54 52 49 4e 47 3b 0a 20 20 20 20  LINESTRING;.    
ec70: 69 66 20 28 70 61 72 73 65 72 2d 3e 6e 5f 6d 6c  if (parser->n_ml
ec80: 69 6e 65 73 74 72 69 6e 67 73 20 3e 20 30 20 26  inestrings > 0 &
ec90: 26 20 70 61 72 73 65 72 2d 3e 6e 5f 70 6f 69 6e  & parser->n_poin
eca0: 74 73 20 3d 3d 20 30 0a 09 26 26 20 70 61 72 73  ts == 0..&& pars
ecb0: 65 72 2d 3e 6e 5f 70 6f 6c 79 67 6f 6e 73 20 3d  er->n_polygons =
ecc0: 3d 20 30 20 26 26 20 70 61 72 73 65 72 2d 3e 6e  = 0 && parser->n
ecd0: 5f 6d 70 6f 69 6e 74 73 20 3d 3d 20 30 0a 09 26  _mpoints == 0..&
ece0: 26 20 70 61 72 73 65 72 2d 3e 6e 5f 6d 70 6f 6c  & parser->n_mpol
ecf0: 79 67 6f 6e 73 20 3d 3d 20 30 20 26 26 20 70 61  ygons == 0 && pa
ed00: 72 73 65 72 2d 3e 6e 5f 67 65 6f 6d 63 6f 6c 6c  rser->n_geomcoll
ed10: 73 20 3d 3d 20 30 29 0a 09 70 5f 76 74 2d 3e 44  s == 0)..p_vt->D
ed20: 65 63 6c 61 72 65 64 54 79 70 65 20 3d 20 47 41  eclaredType = GA
ed30: 49 41 5f 4d 55 4c 54 49 4c 49 4e 45 53 54 52 49  IA_MULTILINESTRI
ed40: 4e 47 3b 0a 20 20 20 20 69 66 20 28 70 61 72 73  NG;.    if (pars
ed50: 65 72 2d 3e 6e 5f 70 6f 69 6e 74 73 20 3d 3d 20  er->n_points == 
ed60: 30 20 26 26 20 70 61 72 73 65 72 2d 3e 6e 5f 6c  0 && parser->n_l
ed70: 69 6e 65 73 74 72 69 6e 67 73 20 3e 20 30 0a 09  inestrings > 0..
ed80: 26 26 20 70 61 72 73 65 72 2d 3e 6e 5f 70 6f 6c  && parser->n_pol
ed90: 79 67 6f 6e 73 20 3e 20 30 20 26 26 20 70 61 72  ygons > 0 && par
eda0: 73 65 72 2d 3e 6e 5f 6d 70 6f 69 6e 74 73 20 3d  ser->n_mpoints =
edb0: 3d 20 30 0a 09 26 26 20 70 61 72 73 65 72 2d 3e  = 0..&& parser->
edc0: 6e 5f 6d 6c 69 6e 65 73 74 72 69 6e 67 73 20 3d  n_mlinestrings =
edd0: 3d 20 30 20 26 26 20 70 61 72 73 65 72 2d 3e 6e  = 0 && parser->n
ede0: 5f 6d 70 6f 6c 79 67 6f 6e 73 20 3d 3d 20 30 0a  _mpolygons == 0.
edf0: 09 26 26 20 70 61 72 73 65 72 2d 3e 6e 5f 67 65  .&& parser->n_ge
ee00: 6f 6d 63 6f 6c 6c 73 20 3d 3d 20 30 29 0a 09 70  omcolls == 0)..p
ee10: 5f 76 74 2d 3e 44 65 63 6c 61 72 65 64 54 79 70  _vt->DeclaredTyp
ee20: 65 20 3d 20 47 41 49 41 5f 50 4f 4c 59 47 4f 4e  e = GAIA_POLYGON
ee30: 3b 0a 20 20 20 20 69 66 20 28 70 61 72 73 65 72  ;.    if (parser
ee40: 2d 3e 6e 5f 6d 70 6f 6c 79 67 6f 6e 73 20 3e 20  ->n_mpolygons > 
ee50: 30 20 26 26 20 70 61 72 73 65 72 2d 3e 6e 5f 70  0 && parser->n_p
ee60: 6f 69 6e 74 73 20 3d 3d 20 30 0a 09 26 26 20 70  oints == 0..&& p
ee70: 61 72 73 65 72 2d 3e 6e 5f 6c 69 6e 65 73 74 72  arser->n_linestr
ee80: 69 6e 67 73 20 3d 3d 20 30 20 26 26 20 70 61 72  ings == 0 && par
ee90: 73 65 72 2d 3e 6e 5f 6d 70 6f 69 6e 74 73 20 3d  ser->n_mpoints =
eea0: 3d 20 30 0a 09 26 26 20 70 61 72 73 65 72 2d 3e  = 0..&& parser->
eeb0: 6e 5f 6d 6c 69 6e 65 73 74 72 69 6e 67 73 20 3d  n_mlinestrings =
eec0: 3d 20 30 20 26 26 20 70 61 72 73 65 72 2d 3e 6e  = 0 && parser->n
eed0: 5f 67 65 6f 6d 63 6f 6c 6c 73 20 3d 3d 20 30 29  _geomcolls == 0)
eee0: 0a 09 70 5f 76 74 2d 3e 44 65 63 6c 61 72 65 64  ..p_vt->Declared
eef0: 54 79 70 65 20 3d 20 47 41 49 41 5f 4d 55 4c 54  Type = GAIA_MULT
ef00: 49 50 4f 4c 59 47 4f 4e 3b 0a 20 20 20 20 69 66  IPOLYGON;.    if
ef10: 20 28 28 70 61 72 73 65 72 2d 3e 6e 5f 70 6f 69   ((parser->n_poi
ef20: 6e 74 73 20 2b 20 70 61 72 73 65 72 2d 3e 6e 5f  nts + parser->n_
ef30: 6d 70 6f 69 6e 74 73 29 20 3e 20 30 0a 09 26 26  mpoints) > 0..&&
ef40: 20 28 70 61 72 73 65 72 2d 3e 6e 5f 6c 69 6e 65   (parser->n_line
ef50: 73 74 72 69 6e 67 73 20 2b 20 70 61 72 73 65 72  strings + parser
ef60: 2d 3e 6e 5f 6d 6c 69 6e 65 73 74 72 69 6e 67 73  ->n_mlinestrings
ef70: 29 20 3e 20 30 29 0a 09 70 5f 76 74 2d 3e 44 65  ) > 0)..p_vt->De
ef80: 63 6c 61 72 65 64 54 79 70 65 20 3d 20 47 41 49  claredType = GAI
ef90: 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43  A_GEOMETRYCOLLEC
efa0: 54 49 4f 4e 3b 0a 20 20 20 20 69 66 20 28 28 70  TION;.    if ((p
efb0: 61 72 73 65 72 2d 3e 6e 5f 70 6f 69 6e 74 73 20  arser->n_points 
efc0: 2b 20 70 61 72 73 65 72 2d 3e 6e 5f 6d 70 6f 69  + parser->n_mpoi
efd0: 6e 74 73 29 20 3e 20 30 0a 09 26 26 20 28 70 61  nts) > 0..&& (pa
efe0: 72 73 65 72 2d 3e 6e 5f 70 6f 6c 79 67 6f 6e 73  rser->n_polygons
eff0: 20 2b 20 70 61 72 73 65 72 2d 3e 6e 5f 6d 70 6f   + parser->n_mpo
f000: 6c 79 67 6f 6e 73 29 20 3e 20 30 29 0a 09 70 5f  lygons) > 0)..p_
f010: 76 74 2d 3e 44 65 63 6c 61 72 65 64 54 79 70 65  vt->DeclaredType
f020: 20 3d 20 47 41 49 41 5f 47 45 4f 4d 45 54 52 59   = GAIA_GEOMETRY
f030: 43 4f 4c 4c 45 43 54 49 4f 4e 3b 0a 20 20 20 20  COLLECTION;.    
f040: 69 66 20 28 28 70 61 72 73 65 72 2d 3e 6e 5f 6c  if ((parser->n_l
f050: 69 6e 65 73 74 72 69 6e 67 73 20 2b 20 70 61 72  inestrings + par
f060: 73 65 72 2d 3e 6e 5f 6d 6c 69 6e 65 73 74 72 69  ser->n_mlinestri
f070: 6e 67 73 29 20 3e 20 30 0a 09 26 26 20 28 70 61  ngs) > 0..&& (pa
f080: 72 73 65 72 2d 3e 6e 5f 70 6f 6c 79 67 6f 6e 73  rser->n_polygons
f090: 20 2b 20 70 61 72 73 65 72 2d 3e 6e 5f 6d 70 6f   + parser->n_mpo
f0a0: 6c 79 67 6f 6e 73 29 20 3e 20 30 29 0a 09 70 5f  lygons) > 0)..p_
f0b0: 76 74 2d 3e 44 65 63 6c 61 72 65 64 54 79 70 65  vt->DeclaredType
f0c0: 20 3d 20 47 41 49 41 5f 47 45 4f 4d 45 54 52 59   = GAIA_GEOMETRY
f0d0: 43 4f 4c 4c 45 43 54 49 4f 4e 3b 0a 20 20 20 20  COLLECTION;.    
f0e0: 69 66 20 28 70 61 72 73 65 72 2d 3e 6e 5f 67 65  if (parser->n_ge
f0f0: 6f 6d 5f 32 64 20 3e 20 30 20 26 26 20 70 61 72  om_2d > 0 && par
f100: 73 65 72 2d 3e 6e 5f 67 65 6f 6d 5f 33 64 20 3d  ser->n_geom_3d =
f110: 3d 20 30 0a 09 26 26 20 70 61 72 73 65 72 2d 3e  = 0..&& parser->
f120: 6e 5f 67 65 6f 6d 5f 34 64 20 3d 3d 20 30 29 0a  n_geom_4d == 0).
f130: 09 70 5f 76 74 2d 3e 44 69 6d 65 6e 73 69 6f 6e  .p_vt->Dimension
f140: 4d 6f 64 65 6c 20 3d 20 47 41 49 41 5f 58 59 3b  Model = GAIA_XY;
f150: 0a 20 20 20 20 69 66 20 28 70 61 72 73 65 72 2d  .    if (parser-
f160: 3e 6e 5f 67 65 6f 6d 5f 33 64 20 3e 20 30 20 26  >n_geom_3d > 0 &
f170: 26 20 70 61 72 73 65 72 2d 3e 6e 5f 67 65 6f 6d  & parser->n_geom
f180: 5f 34 64 20 3d 3d 20 30 29 0a 09 70 5f 76 74 2d  _4d == 0)..p_vt-
f190: 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20  >DimensionModel 
f1a0: 3d 20 47 41 49 41 5f 58 59 5f 5a 3b 0a 20 20 20  = GAIA_XY_Z;.   
f1b0: 20 69 66 20 28 70 61 72 73 65 72 2d 3e 6e 5f 67   if (parser->n_g
f1c0: 65 6f 6d 5f 34 64 20 3e 20 30 29 0a 09 70 5f 76  eom_4d > 0)..p_v
f1d0: 74 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65  t->DimensionMode
f1e0: 6c 20 3d 20 47 41 49 41 5f 58 59 5f 5a 5f 4d 3b  l = GAIA_XY_Z_M;
f1f0: 0a 2f 2a 20 70 72 65 70 61 72 69 6e 67 20 74 68  ./* preparing th
f200: 65 20 43 4f 4c 55 4d 4e 73 20 66 6f 72 20 74 68  e COLUMNs for th
f210: 69 73 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  is VIRTUAL TABLE
f220: 20 2a 2f 0a 20 20 20 20 73 71 6c 20 3d 0a 09 67   */.    sql =..g
f230: 65 6f 6a 73 6f 6e 5f 73 71 6c 5f 63 72 65 61 74  eojson_sql_creat
f240: 65 5f 76 69 72 74 75 61 6c 5f 74 61 62 6c 65 20  e_virtual_table 
f250: 28 70 61 72 73 65 72 2c 20 28 63 6f 6e 73 74 20  (parser, (const 
f260: 63 68 61 72 20 2a 29 20 61 72 67 76 5b 32 5d 2c  char *) argv[2],
f270: 0a 09 09 09 09 09 20 20 63 6f 6c 6e 61 6d 65 5f  ......  colname_
f280: 63 61 73 65 29 3b 0a 20 20 20 20 72 65 74 20 3d  case);.    ret =
f290: 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65   sqlite3_declare
f2a0: 5f 76 74 61 62 20 28 64 62 2c 20 73 71 6c 29 3b  _vtab (db, sql);
f2b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
f2c0: 65 20 28 73 71 6c 29 3b 0a 20 20 20 20 69 66 20  e (sql);.    if 
f2d0: 28 72 65 74 20 21 3d 20 53 51 4c 49 54 45 5f 4f  (ret != SQLITE_O
f2e0: 4b 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2a 70  K).      {..  *p
f2f0: 7a 45 72 72 20 3d 0a 09 20 20 20 20 20 20 73 71  zErr =..      sq
f300: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 0a 09 20  lite3_mprintf.. 
f310: 20 20 20 20 20 28 22 5b 56 69 72 74 75 61 6c 47       ("[VirtualG
f320: 65 6f 4a 53 4f 4e 20 6d 6f 64 75 6c 65 5d 20 43  eoJSON module] C
f330: 52 45 41 54 45 20 56 49 52 54 55 41 4c 3a 20 69  REATE VIRTUAL: i
f340: 6e 76 61 6c 69 64 20 53 51 4c 20 73 74 61 74 65  nvalid SQL state
f350: 6d 65 6e 74 20 5c 22 25 73 5c 22 22 2c 0a 09 20  ment \"%s\"",.. 
f360: 20 20 20 20 20 20 73 71 6c 29 3b 0a 09 20 20 72        sql);..  r
f370: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
f380: 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
f390: 2a 70 70 56 54 61 62 20 3d 20 28 73 71 6c 69 74  *ppVTab = (sqlit
f3a0: 65 33 5f 76 74 61 62 20 2a 29 20 70 5f 76 74 3b  e3_vtab *) p_vt;
f3b0: 0a 0a 20 20 20 20 69 66 20 28 76 67 65 6f 6a 73  ..    if (vgeojs
f3c0: 6f 6e 5f 68 61 73 5f 6d 65 74 61 64 61 74 61 20  on_has_metadata 
f3d0: 28 64 62 2c 20 26 67 65 6f 74 79 70 65 29 29 0a  (db, &geotype)).
f3e0: 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 72 65        {..  /* re
f3f0: 67 69 73 74 65 72 69 6e 67 20 74 68 65 20 56 69  gistering the Vi
f400: 72 74 75 61 6c 20 47 65 6f 6d 65 74 72 79 20 2a  rtual Geometry *
f410: 2f 0a 09 20 20 69 66 20 28 67 65 6f 74 79 70 65  /..  if (geotype
f420: 29 0a 09 20 20 20 20 7b 0a 09 09 69 6e 74 20 78  )..    {...int x
f430: 74 79 70 65 20 3d 20 30 3b 0a 09 09 69 6e 74 20  type = 0;...int 
f440: 78 64 69 6d 73 20 3d 20 30 3b 0a 09 09 73 77 69  xdims = 0;...swi
f450: 74 63 68 20 28 70 5f 76 74 2d 3e 44 65 63 6c 61  tch (p_vt->Decla
f460: 72 65 64 54 79 70 65 29 0a 09 09 20 20 7b 0a 09  redType)...  {..
f470: 09 20 20 63 61 73 65 20 47 41 49 41 5f 50 4f 49  .  case GAIA_POI
f480: 4e 54 3a 0a 09 09 20 20 20 20 20 20 73 77 69 74  NT:...      swit
f490: 63 68 20 28 70 5f 76 74 2d 3e 44 69 6d 65 6e 73  ch (p_vt->Dimens
f4a0: 69 6f 6e 4d 6f 64 65 6c 29 0a 09 09 09 7b 0a 09  ionModel)....{..
f4b0: 09 09 63 61 73 65 20 47 41 49 41 5f 58 59 5f 5a  ..case GAIA_XY_Z
f4c0: 5f 4d 3a 0a 09 09 09 20 20 20 20 78 74 79 70 65  _M:....    xtype
f4d0: 20 3d 20 33 30 30 31 3b 0a 09 09 09 20 20 20 20   = 3001;....    
f4e0: 78 64 69 6d 73 20 3d 20 34 3b 0a 09 09 09 20 20  xdims = 4;....  
f4f0: 20 20 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65    break;....case
f500: 20 47 41 49 41 5f 58 59 5f 4d 3a 0a 09 09 09 20   GAIA_XY_M:.... 
f510: 20 20 20 78 74 79 70 65 20 3d 20 32 30 30 31 3b     xtype = 2001;
f520: 0a 09 09 09 20 20 20 20 78 64 69 6d 73 20 3d 20  ....    xdims = 
f530: 33 3b 0a 09 09 09 20 20 20 20 62 72 65 61 6b 3b  3;....    break;
f540: 0a 09 09 09 63 61 73 65 20 47 41 49 41 5f 58 59  ....case GAIA_XY
f550: 5f 5a 3a 0a 09 09 09 20 20 20 20 78 74 79 70 65  _Z:....    xtype
f560: 20 3d 20 31 30 30 31 3b 0a 09 09 09 20 20 20 20   = 1001;....    
f570: 78 64 69 6d 73 20 3d 20 33 3b 0a 09 09 09 20 20  xdims = 3;....  
f580: 20 20 62 72 65 61 6b 3b 0a 09 09 09 64 65 66 61    break;....defa
f590: 75 6c 74 3a 0a 09 09 09 20 20 20 20 78 74 79 70  ult:....    xtyp
f5a0: 65 20 3d 20 31 3b 0a 09 09 09 20 20 20 20 78 64  e = 1;....    xd
f5b0: 69 6d 73 20 3d 20 32 3b 0a 09 09 09 20 20 20 20  ims = 2;....    
f5c0: 62 72 65 61 6b 3b 0a 09 09 09 7d 3b 0a 09 09 20  break;....};... 
f5d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 09 09 20 20       break;...  
f5e0: 63 61 73 65 20 47 41 49 41 5f 4c 49 4e 45 53 54  case GAIA_LINEST
f5f0: 52 49 4e 47 3a 0a 09 09 20 20 20 20 20 20 73 77  RING:...      sw
f600: 69 74 63 68 20 28 70 5f 76 74 2d 3e 44 69 6d 65  itch (p_vt->Dime
f610: 6e 73 69 6f 6e 4d 6f 64 65 6c 29 0a 09 09 09 7b  nsionModel)....{
f620: 0a 09 09 09 63 61 73 65 20 47 41 49 41 5f 58 59  ....case GAIA_XY
f630: 5f 5a 5f 4d 3a 0a 09 09 09 20 20 20 20 78 74 79  _Z_M:....    xty
f640: 70 65 20 3d 20 33 30 30 32 3b 0a 09 09 09 20 20  pe = 3002;....  
f650: 20 20 78 64 69 6d 73 20 3d 20 34 3b 0a 09 09 09    xdims = 4;....
f660: 20 20 20 20 62 72 65 61 6b 3b 0a 09 09 09 63 61      break;....ca
f670: 73 65 20 47 41 49 41 5f 58 59 5f 4d 3a 0a 09 09  se GAIA_XY_M:...
f680: 09 20 20 20 20 78 74 79 70 65 20 3d 20 32 30 30  .    xtype = 200
f690: 32 3b 0a 09 09 09 20 20 20 20 78 64 69 6d 73 20  2;....    xdims 
f6a0: 3d 20 33 3b 0a 09 09 09 20 20 20 20 62 72 65 61  = 3;....    brea
f6b0: 6b 3b 0a 09 09 09 63 61 73 65 20 47 41 49 41 5f  k;....case GAIA_
f6c0: 58 59 5f 5a 3a 0a 09 09 09 20 20 20 20 78 74 79  XY_Z:....    xty
f6d0: 70 65 20 3d 20 31 30 30 32 3b 0a 09 09 09 20 20  pe = 1002;....  
f6e0: 20 20 78 64 69 6d 73 20 3d 20 33 3b 0a 09 09 09    xdims = 3;....
f6f0: 20 20 20 20 62 72 65 61 6b 3b 0a 09 09 09 64 65      break;....de
f700: 66 61 75 6c 74 3a 0a 09 09 09 20 20 20 20 78 74  fault:....    xt
f710: 79 70 65 20 3d 20 32 3b 0a 09 09 09 20 20 20 20  ype = 2;....    
f720: 78 64 69 6d 73 20 3d 20 32 3b 0a 09 09 09 20 20  xdims = 2;....  
f730: 20 20 62 72 65 61 6b 3b 0a 09 09 09 7d 3b 0a 09    break;....};..
f740: 09 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 09 09  .      break;...
f750: 20 20 63 61 73 65 20 47 41 49 41 5f 50 4f 4c 59    case GAIA_POLY
f760: 47 4f 4e 3a 0a 09 09 20 20 20 20 20 20 73 77 69  GON:...      swi
f770: 74 63 68 20 28 70 5f 76 74 2d 3e 44 69 6d 65 6e  tch (p_vt->Dimen
f780: 73 69 6f 6e 4d 6f 64 65 6c 29 0a 09 09 09 7b 0a  sionModel)....{.
f790: 09 09 09 63 61 73 65 20 47 41 49 41 5f 58 59 5f  ...case GAIA_XY_
f7a0: 5a 5f 4d 3a 0a 09 09 09 20 20 20 20 78 74 79 70  Z_M:....    xtyp
f7b0: 65 20 3d 20 33 30 30 33 3b 0a 09 09 09 20 20 20  e = 3003;....   
f7c0: 20 78 64 69 6d 73 20 3d 20 34 3b 0a 09 09 09 20   xdims = 4;.... 
f7d0: 20 20 20 62 72 65 61 6b 3b 0a 09 09 09 63 61 73     break;....cas
f7e0: 65 20 47 41 49 41 5f 58 59 5f 4d 3a 0a 09 09 09  e GAIA_XY_M:....
f7f0: 20 20 20 20 78 74 79 70 65 20 3d 20 32 30 30 33      xtype = 2003
f800: 3b 0a 09 09 09 20 20 20 20 78 64 69 6d 73 20 3d  ;....    xdims =
f810: 20 33 3b 0a 09 09 09 20 20 20 20 62 72 65 61 6b   3;....    break
f820: 3b 0a 09 09 09 63 61 73 65 20 47 41 49 41 5f 58  ;....case GAIA_X
f830: 59 5f 5a 3a 0a 09 09 09 20 20 20 20 78 74 79 70  Y_Z:....    xtyp
f840: 65 20 3d 20 31 30 30 33 3b 0a 09 09 09 20 20 20  e = 1003;....   
f850: 20 78 64 69 6d 73 20 3d 20 33 3b 0a 09 09 09 20   xdims = 3;.... 
f860: 20 20 20 62 72 65 61 6b 3b 0a 09 09 09 64 65 66     break;....def
f870: 61 75 6c 74 3a 0a 09 09 09 20 20 20 20 78 74 79  ault:....    xty
f880: 70 65 20 3d 20 33 3b 0a 09 09 09 20 20 20 20 78  pe = 3;....    x
f890: 64 69 6d 73 20 3d 20 32 3b 0a 09 09 09 20 20 20  dims = 2;....   
f8a0: 20 62 72 65 61 6b 3b 0a 09 09 09 7d 3b 0a 09 09   break;....};...
f8b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 09 09 20        break;... 
f8c0: 20 63 61 73 65 20 47 41 49 41 5f 4d 55 4c 54 49   case GAIA_MULTI
f8d0: 50 4f 49 4e 54 3a 0a 09 09 20 20 20 20 20 20 73  POINT:...      s
f8e0: 77 69 74 63 68 20 28 70 5f 76 74 2d 3e 44 69 6d  witch (p_vt->Dim
f8f0: 65 6e 73 69 6f 6e 4d 6f 64 65 6c 29 0a 09 09 09  ensionModel)....
f900: 7b 0a 09 09 09 63 61 73 65 20 47 41 49 41 5f 58  {....case GAIA_X
f910: 59 5f 5a 5f 4d 3a 0a 09 09 09 20 20 20 20 78 74  Y_Z_M:....    xt
f920: 79 70 65 20 3d 20 33 30 30 34 3b 0a 09 09 09 20  ype = 3004;.... 
f930: 20 20 20 78 64 69 6d 73 20 3d 20 34 3b 0a 09 09     xdims = 4;...
f940: 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 09 09 63  .    break;....c
f950: 61 73 65 20 47 41 49 41 5f 58 59 5f 4d 3a 0a 09  ase GAIA_XY_M:..
f960: 09 09 20 20 20 20 78 74 79 70 65 20 3d 20 32 30  ..    xtype = 20
f970: 30 34 3b 0a 09 09 09 20 20 20 20 78 64 69 6d 73  04;....    xdims
f980: 20 3d 20 33 3b 0a 09 09 09 20 20 20 20 62 72 65   = 3;....    bre
f990: 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 41 49 41  ak;....case GAIA
f9a0: 5f 58 59 5f 5a 3a 0a 09 09 09 20 20 20 20 78 74  _XY_Z:....    xt
f9b0: 79 70 65 20 3d 20 31 30 30 34 3b 0a 09 09 09 20  ype = 1004;.... 
f9c0: 20 20 20 78 64 69 6d 73 20 3d 20 33 3b 0a 09 09     xdims = 3;...
f9d0: 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 09 09 64  .    break;....d
f9e0: 65 66 61 75 6c 74 3a 0a 09 09 09 20 20 20 20 78  efault:....    x
f9f0: 74 79 70 65 20 3d 20 34 3b 0a 09 09 09 20 20 20  type = 4;....   
fa00: 20 78 64 69 6d 73 20 3d 20 32 3b 0a 09 09 09 20   xdims = 2;.... 
fa10: 20 20 20 62 72 65 61 6b 3b 0a 09 09 09 7d 3b 0a     break;....};.
fa20: 09 09 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 09  ..      break;..
fa30: 09 20 20 63 61 73 65 20 47 41 49 41 5f 4d 55 4c  .  case GAIA_MUL
fa40: 54 49 4c 49 4e 45 53 54 52 49 4e 47 3a 0a 09 09  TILINESTRING:...
fa50: 20 20 20 20 20 20 73 77 69 74 63 68 20 28 70 5f        switch (p_
fa60: 76 74 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64  vt->DimensionMod
fa70: 65 6c 29 0a 09 09 09 7b 0a 09 09 09 63 61 73 65  el)....{....case
fa80: 20 47 41 49 41 5f 58 59 5f 5a 5f 4d 3a 0a 09 09   GAIA_XY_Z_M:...
fa90: 09 20 20 20 20 78 74 79 70 65 20 3d 20 33 30 30  .    xtype = 300
faa0: 35 3b 0a 09 09 09 20 20 20 20 78 64 69 6d 73 20  5;....    xdims 
fab0: 3d 20 34 3b 0a 09 09 09 20 20 20 20 62 72 65 61  = 4;....    brea
fac0: 6b 3b 0a 09 09 09 63 61 73 65 20 47 41 49 41 5f  k;....case GAIA_
fad0: 58 59 5f 4d 3a 0a 09 09 09 20 20 20 20 78 74 79  XY_M:....    xty
fae0: 70 65 20 3d 20 32 30 30 35 3b 0a 09 09 09 20 20  pe = 2005;....  
faf0: 20 20 78 64 69 6d 73 20 3d 20 33 3b 0a 09 09 09    xdims = 3;....
fb00: 20 20 20 20 62 72 65 61 6b 3b 0a 09 09 09 63 61      break;....ca
fb10: 73 65 20 47 41 49 41 5f 58 59 5f 5a 3a 0a 09 09  se GAIA_XY_Z:...
fb20: 09 20 20 20 20 78 74 79 70 65 20 3d 20 31 30 30  .    xtype = 100
fb30: 35 3b 0a 09 09 09 20 20 20 20 78 64 69 6d 73 20  5;....    xdims 
fb40: 3d 20 33 3b 0a 09 09 09 20 20 20 20 62 72 65 61  = 3;....    brea
fb50: 6b 3b 0a 09 09 09 64 65 66 61 75 6c 74 3a 0a 09  k;....default:..
fb60: 09 09 20 20 20 20 78 74 79 70 65 20 3d 20 35 3b  ..    xtype = 5;
fb70: 0a 09 09 09 20 20 20 20 78 64 69 6d 73 20 3d 20  ....    xdims = 
fb80: 32 3b 0a 09 09 09 20 20 20 20 62 72 65 61 6b 3b  2;....    break;
fb90: 0a 09 09 09 7d 3b 0a 09 09 20 20 20 20 20 20 62  ....};...      b
fba0: 72 65 61 6b 3b 0a 09 09 20 20 63 61 73 65 20 47  reak;...  case G
fbb0: 41 49 41 5f 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e  AIA_MULTIPOLYGON
fbc0: 3a 0a 09 09 20 20 20 20 20 20 73 77 69 74 63 68  :...      switch
fbd0: 20 28 70 5f 76 74 2d 3e 44 69 6d 65 6e 73 69 6f   (p_vt->Dimensio
fbe0: 6e 4d 6f 64 65 6c 29 0a 09 09 09 7b 0a 09 09 09  nModel)....{....
fbf0: 63 61 73 65 20 47 41 49 41 5f 58 59 5f 5a 5f 4d  case GAIA_XY_Z_M
fc00: 3a 0a 09 09 09 20 20 20 20 78 74 79 70 65 20 3d  :....    xtype =
fc10: 20 33 30 30 36 3b 0a 09 09 09 20 20 20 20 78 64   3006;....    xd
fc20: 69 6d 73 20 3d 20 34 3b 0a 09 09 09 20 20 20 20  ims = 4;....    
fc30: 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 47  break;....case G
fc40: 41 49 41 5f 58 59 5f 4d 3a 0a 09 09 09 20 20 20  AIA_XY_M:....   
fc50: 20 78 74 79 70 65 20 3d 20 32 30 30 36 3b 0a 09   xtype = 2006;..
fc60: 09 09 20 20 20 20 78 64 69 6d 73 20 3d 20 33 3b  ..    xdims = 3;
fc70: 0a 09 09 09 20 20 20 20 62 72 65 61 6b 3b 0a 09  ....    break;..
fc80: 09 09 63 61 73 65 20 47 41 49 41 5f 58 59 5f 5a  ..case GAIA_XY_Z
fc90: 3a 0a 09 09 09 20 20 20 20 78 74 79 70 65 20 3d  :....    xtype =
fca0: 20 31 30 30 36 3b 0a 09 09 09 20 20 20 20 78 64   1006;....    xd
fcb0: 69 6d 73 20 3d 20 33 3b 0a 09 09 09 20 20 20 20  ims = 3;....    
fcc0: 62 72 65 61 6b 3b 0a 09 09 09 64 65 66 61 75 6c  break;....defaul
fcd0: 74 3a 0a 09 09 09 20 20 20 20 78 74 79 70 65 20  t:....    xtype 
fce0: 3d 20 36 3b 0a 09 09 09 20 20 20 20 78 64 69 6d  = 6;....    xdim
fcf0: 73 20 3d 20 32 3b 0a 09 09 09 20 20 20 20 62 72  s = 2;....    br
fd00: 65 61 6b 3b 0a 09 09 09 7d 3b 0a 09 09 20 20 20  eak;....};...   
fd10: 20 20 20 62 72 65 61 6b 3b 0a 09 09 20 20 63 61     break;...  ca
fd20: 73 65 20 47 41 49 41 5f 47 45 4f 4d 45 54 52 59  se GAIA_GEOMETRY
fd30: 43 4f 4c 4c 45 43 54 49 4f 4e 3a 0a 09 09 20 20  COLLECTION:...  
fd40: 20 20 20 20 73 77 69 74 63 68 20 28 70 5f 76 74      switch (p_vt
fd50: 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c  ->DimensionModel
fd60: 29 0a 09 09 09 7b 0a 09 09 09 63 61 73 65 20 47  )....{....case G
fd70: 41 49 41 5f 58 59 5f 5a 5f 4d 3a 0a 09 09 09 20  AIA_XY_Z_M:.... 
fd80: 20 20 20 78 74 79 70 65 20 3d 20 33 30 30 37 3b     xtype = 3007;
fd90: 0a 09 09 09 20 20 20 20 78 64 69 6d 73 20 3d 20  ....    xdims = 
fda0: 34 3b 0a 09 09 09 20 20 20 20 62 72 65 61 6b 3b  4;....    break;
fdb0: 0a 09 09 09 63 61 73 65 20 47 41 49 41 5f 58 59  ....case GAIA_XY
fdc0: 5f 4d 3a 0a 09 09 09 20 20 20 20 78 74 79 70 65  _M:....    xtype
fdd0: 20 3d 20 32 30 30 37 3b 0a 09 09 09 20 20 20 20   = 2007;....    
fde0: 78 64 69 6d 73 20 3d 20 33 3b 0a 09 09 09 20 20  xdims = 3;....  
fdf0: 20 20 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65    break;....case
fe00: 20 47 41 49 41 5f 58 59 5f 5a 3a 0a 09 09 09 20   GAIA_XY_Z:.... 
fe10: 20 20 20 78 74 79 70 65 20 3d 20 31 30 30 37 3b     xtype = 1007;
fe20: 0a 09 09 09 20 20 20 20 78 64 69 6d 73 20 3d 20  ....    xdims = 
fe30: 33 3b 0a 09 09 09 20 20 20 20 62 72 65 61 6b 3b  3;....    break;
fe40: 0a 09 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09  ....default:....
fe50: 20 20 20 20 78 74 79 70 65 20 3d 20 37 3b 0a 09      xtype = 7;..
fe60: 09 09 20 20 20 20 78 64 69 6d 73 20 3d 20 32 3b  ..    xdims = 2;
fe70: 0a 09 09 09 20 20 20 20 62 72 65 61 6b 3b 0a 09  ....    break;..
fe80: 09 09 7d 3b 0a 09 09 20 20 20 20 20 20 62 72 65  ..};...      bre
fe90: 61 6b 3b 0a 09 09 20 20 7d 3b 0a 09 09 73 71 6c  ak;...  };...sql
fea0: 20 3d 0a 09 09 20 20 20 20 73 71 6c 69 74 65 33   =...    sqlite3
feb0: 5f 6d 70 72 69 6e 74 66 0a 09 09 20 20 20 20 28  _mprintf...    (
fec0: 22 49 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f 52  "INSERT OR IGNOR
fed0: 45 20 49 4e 54 4f 20 76 69 72 74 73 5f 67 65 6f  E INTO virts_geo
fee0: 6d 65 74 72 79 5f 63 6f 6c 75 6d 6e 73 20 22 0a  metry_columns ".
fef0: 09 09 20 20 20 20 20 22 28 76 69 72 74 5f 6e 61  ..     "(virt_na
ff00: 6d 65 2c 20 76 69 72 74 5f 67 65 6f 6d 65 74 72  me, virt_geometr
ff10: 79 2c 20 67 65 6f 6d 65 74 72 79 5f 74 79 70 65  y, geometry_type
ff20: 2c 20 63 6f 6f 72 64 5f 64 69 6d 65 6e 73 69 6f  , coord_dimensio
ff30: 6e 2c 20 73 72 69 64 29 20 22 0a 09 09 20 20 20  n, srid) "...   
ff40: 20 20 22 56 41 4c 55 45 53 20 28 4c 6f 77 65 72    "VALUES (Lower
ff50: 28 25 51 29 2c 20 27 67 65 6f 6d 65 74 72 79 27  (%Q), 'geometry'
ff60: 2c 20 25 64 2c 20 25 64 2c 20 25 64 29 22 2c 20  , %d, %d, %d)", 
ff70: 61 72 67 76 5b 32 5d 2c 0a 09 09 20 20 20 20 20  argv[2],...     
ff80: 78 74 79 70 65 2c 20 78 64 69 6d 73 2c 20 70 5f  xtype, xdims, p_
ff90: 76 74 2d 3e 53 72 69 64 29 3b 0a 09 20 20 20 20  vt->Srid);..    
ffa0: 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 7b  }..  else..    {
ffb0: 0a 09 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 78  ...const char *x
ffc0: 67 74 79 70 65 20 3d 20 22 47 45 4f 4d 45 54 52  gtype = "GEOMETR
ffd0: 59 22 3b 0a 09 09 73 77 69 74 63 68 20 28 70 5f  Y";...switch (p_
ffe0: 76 74 2d 3e 44 65 63 6c 61 72 65 64 54 79 70 65  vt->DeclaredType
fff0: 29 0a 09 09 20 20 7b 0a 09 09 20 20 63 61 73 65  )...  {...  case
10000 20 47 41 49 41 5f 50 4f 49 4e 54 3a 0a 09 09 20   GAIA_POINT:... 
10010 20 20 20 20 20 78 67 74 79 70 65 20 3d 20 22 50       xgtype = "P
10020 4f 49 4e 54 22 3b 0a 09 09 20 20 20 20 20 20 62  OINT";...      b
10030 72 65 61 6b 3b 0a 09 09 20 20 63 61 73 65 20 47  reak;...  case G
10040 41 49 41 5f 4c 49 4e 45 53 54 52 49 4e 47 3a 0a  AIA_LINESTRING:.
10050 09 09 20 20 20 20 20 20 78 67 74 79 70 65 20 3d  ..      xgtype =
10060 20 22 4c 49 4e 45 53 54 52 49 4e 47 22 3b 0a 09   "LINESTRING";..
10070 09 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 09 09  .      break;...
10080 20 20 63 61 73 65 20 47 41 49 41 5f 50 4f 4c 59    case GAIA_POLY
10090 47 4f 4e 3a 0a 09 09 20 20 20 20 20 20 78 67 74  GON:...      xgt
100a0 79 70 65 20 3d 20 22 50 4f 4c 59 47 4f 4e 22 3b  ype = "POLYGON";
100b0 0a 09 09 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ...      break;.
100c0 09 09 20 20 63 61 73 65 20 47 41 49 41 5f 4d 55  ..  case GAIA_MU
100d0 4c 54 49 50 4f 49 4e 54 3a 0a 09 09 20 20 20 20  LTIPOINT:...    
100e0 20 20 78 67 74 79 70 65 20 3d 20 22 4d 55 4c 54    xgtype = "MULT
100f0 49 50 4f 49 4e 54 22 3b 0a 09 09 20 20 20 20 20  IPOINT";...     
10100 20 62 72 65 61 6b 3b 0a 09 09 20 20 63 61 73 65   break;...  case
10110 20 47 41 49 41 5f 4d 55 4c 54 49 4c 49 4e 45 53   GAIA_MULTILINES
10120 54 52 49 4e 47 3a 0a 09 09 20 20 20 20 20 20 78  TRING:...      x
10130 67 74 79 70 65 20 3d 20 22 4d 55 4c 54 49 4c 49  gtype = "MULTILI
10140 4e 45 53 54 52 49 4e 47 22 3b 0a 09 09 20 20 20  NESTRING";...   
10150 20 20 20 62 72 65 61 6b 3b 0a 09 09 20 20 63 61     break;...  ca
10160 73 65 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 4c  se GAIA_MULTIPOL
10170 59 47 4f 4e 3a 0a 09 09 20 20 20 20 20 20 78 67  YGON:...      xg
10180 74 79 70 65 20 3d 20 22 4d 55 4c 54 49 50 4f 4c  type = "MULTIPOL
10190 59 47 4f 4e 22 3b 0a 09 09 20 20 20 20 20 20 62  YGON";...      b
101a0 72 65 61 6b 3b 0a 09 09 20 20 63 61 73 65 20 47  reak;...  case G
101b0 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c  AIA_GEOMETRYCOLL
101c0 45 43 54 49 4f 4e 3a 0a 09 09 20 20 20 20 20 20  ECTION:...      
101d0 78 67 74 79 70 65 20 3d 20 22 47 45 4f 4d 45 54  xgtype = "GEOMET
101e0 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 22 3b 0a 09  RYCOLLECTION";..
101f0 09 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 09 09  .      break;...
10200 20 20 7d 3b 0a 09 09 73 71 6c 20 3d 0a 09 09 20    };...sql =... 
10210 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e     sqlite3_mprin
10220 74 66 0a 09 09 20 20 20 20 28 22 49 4e 53 45 52  tf...    ("INSER
10230 54 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f  T OR IGNORE INTO
10240 20 76 69 72 74 73 5f 67 65 6f 6d 65 74 72 79 5f   virts_geometry_
10250 63 6f 6c 75 6d 6e 73 20 22 0a 09 09 20 20 20 20  columns "...    
10260 20 22 28 76 69 72 74 5f 6e 61 6d 65 2c 20 76 69   "(virt_name, vi
10270 72 74 5f 67 65 6f 6d 65 74 72 79 2c 20 74 79 70  rt_geometry, typ
10280 65 2c 20 73 72 69 64 29 20 22 0a 09 09 20 20 20  e, srid) "...   
10290 20 20 22 56 41 4c 55 45 53 20 28 4c 6f 77 65 72    "VALUES (Lower
102a0 28 25 51 29 2c 20 27 67 65 6f 6d 65 74 72 79 27  (%Q), 'geometry'
102b0 2c 20 25 51 2c 20 25 64 29 22 2c 20 61 72 67 76  , %Q, %d)", argv
102c0 5b 32 5d 2c 20 78 67 74 79 70 65 2c 0a 09 09 20  [2], xgtype,... 
102d0 20 20 20 20 70 5f 76 74 2d 3e 53 72 69 64 29 3b      p_vt->Srid);
102e0 0a 09 20 20 20 20 7d 0a 09 20 20 73 71 6c 69 74  ..    }..  sqlit
102f0 65 33 5f 65 78 65 63 20 28 64 62 2c 20 73 71 6c  e3_exec (db, sql
10300 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55  , NULL, NULL, NU
10310 4c 4c 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f  LL);..  sqlite3_
10320 66 72 65 65 20 28 73 71 6c 29 3b 0a 20 20 20 20  free (sql);.    
10330 20 20 7d 0a 20 20 20 20 69 66 20 28 63 68 65 63    }.    if (chec
10340 6b 53 70 61 74 69 61 6c 4d 65 74 61 44 61 74 61  kSpatialMetaData
10350 20 28 64 62 29 20 3d 3d 20 33 29 0a 20 20 20 20   (db) == 3).    
10360 20 20 7b 0a 09 20 20 2f 2a 20 63 75 72 72 65 6e    {..  /* curren
10370 74 20 6d 65 74 61 64 61 74 61 20 73 74 79 6c 65  t metadata style
10380 20 3e 3d 20 76 2e 34 2e 30 2e 30 20 2a 2f 0a 0a   >= v.4.0.0 */..
10390 09 20 20 2f 2a 20 69 6e 73 65 72 74 69 6e 67 20  .  /* inserting 
103a0 61 20 72 6f 77 20 69 6e 74 6f 20 56 49 52 54 53  a row into VIRTS
103b0 5f 47 45 4f 4d 45 54 52 59 5f 43 4f 4c 55 4d 4e  _GEOMETRY_COLUMN
103c0 53 5f 41 55 54 48 20 2a 2f 0a 09 20 20 73 71 6c  S_AUTH */..  sql
103d0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
103e0 74 66 20 28 22 49 4e 53 45 52 54 20 4f 52 20 49  tf ("INSERT OR I
103f0 47 4e 4f 52 45 20 49 4e 54 4f 20 22 0a 09 09 09  GNORE INTO "....
10400 09 20 22 76 69 72 74 73 5f 67 65 6f 6d 65 74 72  . "virts_geometr
10410 79 5f 63 6f 6c 75 6d 6e 73 5f 61 75 74 68 20 28  y_columns_auth (
10420 76 69 72 74 5f 6e 61 6d 65 2c 20 76 69 72 74 5f  virt_name, virt_
10430 67 65 6f 6d 65 74 72 79 2c 20 68 69 64 64 65 6e  geometry, hidden
10440 29 20 22 0a 09 09 09 09 20 22 56 41 4c 55 45 53  ) "..... "VALUES
10450 20 28 4c 6f 77 65 72 28 25 51 29 2c 20 27 67 65   (Lower(%Q), 'ge
10460 6f 6d 65 74 72 79 27 2c 20 30 29 22 2c 20 61 72  ometry', 0)", ar
10470 67 76 5b 32 5d 29 3b 0a 09 20 20 73 71 6c 69 74  gv[2]);..  sqlit
10480 65 33 5f 65 78 65 63 20 28 64 62 2c 20 73 71 6c  e3_exec (db, sql
10490 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55  , NULL, NULL, NU
104a0 4c 4c 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f  LL);..  sqlite3_
104b0 66 72 65 65 20 28 73 71 6c 29 3b 0a 0a 09 20 20  free (sql);...  
104c0 2f 2a 20 69 6e 73 65 72 74 69 6e 67 20 61 20 72  /* inserting a r
104d0 6f 77 20 69 6e 74 6f 20 47 45 4f 4d 45 54 52 59  ow into GEOMETRY
104e0 5f 43 4f 4c 55 4d 4e 53 5f 53 54 41 54 49 53 54  _COLUMNS_STATIST
104f0 49 43 53 20 2a 2f 0a 09 20 20 73 71 6c 20 3d 20  ICS */..  sql = 
10500 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20  sqlite3_mprintf 
10510 28 22 49 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f  ("INSERT OR IGNO
10520 52 45 20 49 4e 54 4f 20 22 0a 09 09 09 09 20 22  RE INTO "..... "
10530 76 69 72 74 73 5f 67 65 6f 6d 65 74 72 79 5f 63  virts_geometry_c
10540 6f 6c 75 6d 6e 73 5f 73 74 61 74 69 73 74 69 63  olumns_statistic
10550 73 20 28 76 69 72 74 5f 6e 61 6d 65 2c 20 76 69  s (virt_name, vi
10560 72 74 5f 67 65 6f 6d 65 74 72 79 29 20 22 0a 09  rt_geometry) "..
10570 09 09 09 20 22 56 41 4c 55 45 53 20 28 4c 6f 77  ... "VALUES (Low
10580 65 72 28 25 51 29 2c 20 27 67 65 6f 6d 65 74 72  er(%Q), 'geometr
10590 79 27 29 22 2c 20 61 72 67 76 5b 32 5d 29 3b 0a  y')", argv[2]);.
105a0 09 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 20  .  sqlite3_exec 
105b0 28 64 62 2c 20 73 71 6c 2c 20 4e 55 4c 4c 2c 20  (db, sql, NULL, 
105c0 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20  NULL, NULL);..  
105d0 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28 73 71  sqlite3_free (sq
105e0 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 2f 2a 20  l);.      }../* 
105f0 69 6e 73 65 72 74 69 6e 67 20 69 6e 74 6f 20 74  inserting into t
10600 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 61  he connection ca
10610 63 68 65 3a 20 56 69 72 74 75 61 6c 20 45 78 74  che: Virtual Ext
10620 65 6e 74 20 2a 2f 0a 20 20 20 20 73 71 6c 20 3d  ent */.    sql =
10630 20 22 53 45 4c 45 43 54 20 5c 22 2a 41 64 64 2d   "SELECT \"*Add-
10640 56 69 72 74 75 61 6c 54 61 62 6c 65 2b 45 78 74  VirtualTable+Ext
10650 65 6e 74 5c 22 28 3f 2c 20 3f 2c 20 3f 2c 20 3f  ent\"(?, ?, ?, ?
10660 2c 20 3f 2c 20 3f 29 22 3b 0a 20 20 20 20 72 65  , ?, ?)";.    re
10670 74 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  t = sqlite3_prep
10680 61 72 65 5f 76 32 20 28 64 62 2c 20 73 71 6c 2c  are_v2 (db, sql,
10690 20 73 74 72 6c 65 6e 20 28 73 71 6c 29 2c 20 26   strlen (sql), &
106a0 73 74 6d 74 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  stmt, NULL);.   
106b0 20 69 66 20 28 72 65 74 20 3d 3d 20 53 51 4c 49   if (ret == SQLI
106c0 54 45 5f 4f 4b 29 0a 20 20 20 20 20 20 7b 0a 09  TE_OK).      {..
106d0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 20    sqlite3_reset 
106e0 28 73 74 6d 74 29 3b 0a 09 20 20 73 71 6c 69 74  (stmt);..  sqlit
106f0 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67  e3_clear_binding
10700 73 20 28 73 74 6d 74 29 3b 0a 09 20 20 73 71 6c  s (stmt);..  sql
10710 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 20 28  ite3_bind_text (
10720 73 74 6d 74 2c 20 31 2c 20 61 72 67 76 5b 32 5d  stmt, 1, argv[2]
10730 2c 20 73 74 72 6c 65 6e 20 28 61 72 67 76 5b 32  , strlen (argv[2
10740 5d 29 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  ]), SQLITE_STATI
10750 43 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 62  C);..  sqlite3_b
10760 69 6e 64 5f 64 6f 75 62 6c 65 20 28 73 74 6d 74  ind_double (stmt
10770 2c 20 32 2c 20 70 5f 76 74 2d 3e 4d 69 6e 58 29  , 2, p_vt->MinX)
10780 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  ;..  sqlite3_bin
10790 64 5f 64 6f 75 62 6c 65 20 28 73 74 6d 74 2c 20  d_double (stmt, 
107a0 33 2c 20 70 5f 76 74 2d 3e 4d 69 6e 59 29 3b 0a  3, p_vt->MinY);.
107b0 09 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  .  sqlite3_bind_
107c0 64 6f 75 62 6c 65 20 28 73 74 6d 74 2c 20 34 2c  double (stmt, 4,
107d0 20 70 5f 76 74 2d 3e 4d 61 78 58 29 3b 0a 09 20   p_vt->MaxX);.. 
107e0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f   sqlite3_bind_do
107f0 75 62 6c 65 20 28 73 74 6d 74 2c 20 35 2c 20 70  uble (stmt, 5, p
10800 5f 76 74 2d 3e 4d 61 78 59 29 3b 0a 09 20 20 73  _vt->MaxY);..  s
10810 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 20  qlite3_bind_int 
10820 28 73 74 6d 74 2c 20 36 2c 20 70 5f 76 74 2d 3e  (stmt, 6, p_vt->
10830 53 72 69 64 29 3b 0a 09 20 20 72 65 74 20 3d 20  Srid);..  ret = 
10840 73 71 6c 69 74 65 33 5f 73 74 65 70 20 28 73 74  sqlite3_step (st
10850 6d 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  mt);.      }.   
10860 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
10870 65 20 28 73 74 6d 74 29 3b 0a 20 20 20 20 72 65  e (stmt);.    re
10880 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10890 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 76 67  }..static int.vg
108a0 65 6f 6a 73 6f 6e 5f 63 6f 6e 6e 65 63 74 20 28  eojson_connect (
108b0 73 71 6c 69 74 65 33 20 2a 20 64 62 2c 20 76 6f  sqlite3 * db, vo
108c0 69 64 20 2a 70 41 75 78 2c 20 69 6e 74 20 61 72  id *pAux, int ar
108d0 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  gc, const char *
108e0 63 6f 6e 73 74 20 2a 61 72 67 76 2c 0a 09 09 20  const *argv,... 
108f0 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a   sqlite3_vtab **
10900 20 70 70 56 54 61 62 2c 20 63 68 61 72 20 2a 2a   ppVTab, char **
10910 70 7a 45 72 72 29 0a 7b 0a 2f 2a 20 63 6f 6e 6e  pzErr).{./* conn
10920 65 63 74 73 20 74 68 65 20 76 69 72 74 75 61 6c  ects the virtual
10930 20 74 61 62 6c 65 20 74 6f 20 73 6f 6d 65 20 47   table to some G
10940 65 6f 4a 53 4f 4e 20 66 69 6c 65 20 2d 20 73 69  eoJSON file - si
10950 6d 70 6c 79 20 61 6c 69 61 73 65 73 20 76 67 65  mply aliases vge
10960 6f 6a 73 6f 6e 5f 63 72 65 61 74 65 28 29 20 2a  ojson_create() *
10970 2f 0a 09 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  /..sqlite3_vtab_
10980 63 6f 6e 66 69 67 28 64 62 2c 20 53 51 4c 49 54  config(db, SQLIT
10990 45 5f 56 54 41 42 5f 49 4e 4e 4f 43 55 4f 55 53  E_VTAB_INNOCUOUS
109a0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 76 67  );.    return vg
109b0 65 6f 6a 73 6f 6e 5f 63 72 65 61 74 65 20 28 64  eojson_create (d
109c0 62 2c 20 70 41 75 78 2c 20 61 72 67 63 2c 20 61  b, pAux, argc, a
109d0 72 67 76 2c 20 70 70 56 54 61 62 2c 20 70 7a 45  rgv, ppVTab, pzE
109e0 72 72 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  rr);.}..static i
109f0 6e 74 0a 76 67 65 6f 6a 73 6f 6e 5f 62 65 73 74  nt.vgeojson_best
10a00 5f 69 6e 64 65 78 20 28 73 71 6c 69 74 65 33 5f  _index (sqlite3_
10a10 76 74 61 62 20 2a 20 70 56 54 61 62 2c 20 73 71  vtab * pVTab, sq
10a20 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
10a30 20 2a 20 70 49 6e 64 65 78 29 0a 7b 0a 2f 2a 20   * pIndex).{./* 
10a40 62 65 73 74 20 69 6e 64 65 78 20 73 65 6c 65 63  best index selec
10a50 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  tion */.    int 
10a60 69 3b 0a 20 20 20 20 69 6e 74 20 69 41 72 67 20  i;.    int iArg 
10a70 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 73 74  = 0;.    char st
10a80 72 5b 32 30 34 38 5d 3b 0a 20 20 20 20 63 68 61  r[2048];.    cha
10a90 72 20 62 75 66 5b 36 34 5d 3b 0a 0a 20 20 20 20  r buf[64];..    
10aa0 69 66 20 28 70 56 54 61 62 29 0a 09 70 56 54 61  if (pVTab)..pVTa
10ab0 62 20 3d 20 70 56 54 61 62 3b 09 09 2f 2a 20 75  b = pVTab;../* u
10ac0 6e 75 73 65 64 20 61 72 67 20 77 61 72 6e 69 6e  nused arg warnin
10ad0 67 20 73 75 70 70 72 65 73 73 69 6f 6e 20 2a 2f  g suppression */
10ae0 0a 0a 20 20 20 20 2a 73 74 72 20 3d 20 27 5c 30  ..    *str = '\0
10af0 27 3b 0a 20 20 20 20 66 6f 72 20 28 69 20 3d 20  ';.    for (i = 
10b00 30 3b 20 69 20 3c 20 70 49 6e 64 65 78 2d 3e 6e  0; i < pIndex->n
10b10 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29  Constraint; i++)
10b20 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28  .      {..  if (
10b30 70 49 6e 64 65 78 2d 3e 61 43 6f 6e 73 74 72 61  pIndex->aConstra
10b40 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 20 26 26  int[i].usable &&
10b50 0a 09 20 20 20 20 20 20 2f 2a 20 32 30 32 32 2d  ..      /* 2022-
10b60 30 32 2d 32 33 20 2d 20 70 61 74 63 68 20 66 6f  02-23 - patch fo
10b70 72 20 53 51 4c 69 74 65 20 33 2e 33 38 20 70 72  r SQLite 3.38 pr
10b80 6f 70 6f 73 65 64 20 62 79 20 45 76 65 6e 20 52  oposed by Even R
10b90 6f 75 61 75 6c 74 20 2a 2f 0a 09 20 20 20 20 20  ouault */..     
10ba0 20 28 70 49 6e 64 65 78 2d 3e 61 43 6f 6e 73 74   (pIndex->aConst
10bb0 72 61 69 6e 74 5b 69 5d 2e 6f 70 20 3d 3d 20 53  raint[i].op == S
10bc0 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
10bd0 54 52 41 49 4e 54 5f 45 51 20 7c 7c 0a 09 20 20  TRAINT_EQ ||..  
10be0 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 43 6f       pIndex->aCo
10bf0 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 6f 70 20 3d  nstraint[i].op =
10c00 3d 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  = SQLITE_INDEX_C
10c10 4f 4e 53 54 52 41 49 4e 54 5f 47 54 20 7c 7c 0a  ONSTRAINT_GT ||.
10c20 09 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  .       pIndex->
10c30 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 6f  aConstraint[i].o
10c40 70 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 44 45  p == SQLITE_INDE
10c50 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 45 20  X_CONSTRAINT_LE 
10c60 7c 7c 0a 09 20 20 20 20 20 20 20 70 49 6e 64 65  ||..       pInde
10c70 78 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  x->aConstraint[i
10c80 5d 2e 6f 70 20 3d 3d 20 53 51 4c 49 54 45 5f 49  ].op == SQLITE_I
10c90 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
10ca0 4c 54 20 7c 7c 0a 09 20 20 20 20 20 20 20 70 49  LT ||..       pI
10cb0 6e 64 65 78 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  ndex->aConstrain
10cc0 74 5b 69 5d 2e 6f 70 20 3d 3d 20 53 51 4c 49 54  t[i].op == SQLIT
10cd0 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
10ce0 4e 54 5f 47 45 20 7c 7c 0a 09 20 20 20 20 20 20  NT_GE ||..      
10cf0 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6e 73 74 72   pIndex->aConstr
10d00 61 69 6e 74 5b 69 5d 2e 6f 70 20 3d 3d 20 53 51  aint[i].op == SQ
10d10 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
10d20 52 41 49 4e 54 5f 4e 45 20 7c 7c 0a 09 20 20 20  RAINT_NE ||..   
10d30 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6e      pIndex->aCon
10d40 73 74 72 61 69 6e 74 5b 69 5d 2e 6f 70 20 3d 3d  straint[i].op ==
10d50 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f   SQLITE_INDEX_CO
10d60 4e 53 54 52 41 49 4e 54 5f 49 53 4e 4f 54 4e 55  NSTRAINT_ISNOTNU
10d70 4c 4c 20 7c 7c 0a 09 20 20 20 20 20 20 20 70 49  LL ||..       pI
10d80 6e 64 65 78 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  ndex->aConstrain
10d90 74 5b 69 5d 2e 6f 70 20 3d 3d 20 53 51 4c 49 54  t[i].op == SQLIT
10da0 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
10db0 4e 54 5f 49 53 4e 55 4c 4c 0a 23 69 66 64 65 66  NT_ISNULL.#ifdef
10dc0 20 48 41 56 45 5f 44 45 43 4c 5f 53 51 4c 49 54   HAVE_DECL_SQLIT
10dd0 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
10de0 4e 54 5f 4c 49 4b 45 0a 09 20 20 20 20 20 20 20  NT_LIKE..       
10df0 7c 7c 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6e 73  || pIndex->aCons
10e00 74 72 61 69 6e 74 5b 69 5d 2e 6f 70 20 3d 3d 20  traint[i].op == 
10e10 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
10e20 53 54 52 41 49 4e 54 5f 4c 49 4b 45 0a 23 65 6e  STRAINT_LIKE.#en
10e30 64 69 66 0a 09 20 20 20 20 20 20 29 29 0a 09 20  dif..      )).. 
10e40 20 20 20 20 20 2f 2a 20 32 30 32 32 2d 30 32 2d       /* 2022-02-
10e50 32 33 20 2d 20 65 6e 64 20 70 61 74 63 68 20 45  23 - end patch E
10e60 76 65 6e 20 52 6f 75 61 75 6c 74 20 2a 2f 0a 09  ven Rouault */..
10e70 20 20 20 20 7b 0a 09 09 69 41 72 67 2b 2b 3b 0a      {...iArg++;.
10e80 09 09 70 49 6e 64 65 78 2d 3e 61 43 6f 6e 73 74  ..pIndex->aConst
10e90 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72  raintUsage[i].ar
10ea0 67 76 49 6e 64 65 78 20 3d 20 69 41 72 67 3b 0a  gvIndex = iArg;.
10eb0 09 09 70 49 6e 64 65 78 2d 3e 61 43 6f 6e 73 74  ..pIndex->aConst
10ec0 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 6f 6d  raintUsage[i].om
10ed0 69 74 20 3d 20 31 3b 0a 09 09 73 70 72 69 6e 74  it = 1;...sprint
10ee0 66 20 28 62 75 66 2c 20 22 25 64 3a 25 64 2c 22  f (buf, "%d:%d,"
10ef0 2c 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6e 73 74  , pIndex->aConst
10f00 72 61 69 6e 74 5b 69 5d 2e 69 43 6f 6c 75 6d 6e  raint[i].iColumn
10f10 2c 0a 09 09 09 20 70 49 6e 64 65 78 2d 3e 61 43  ,.... pIndex->aC
10f20 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 6f 70 29  onstraint[i].op)
10f30 3b 0a 09 09 73 74 72 63 61 74 20 28 73 74 72 2c  ;...strcat (str,
10f40 20 62 75 66 29 3b 0a 09 20 20 20 20 7d 0a 20 20   buf);..    }.  
10f50 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 2a 73      }.    if (*s
10f60 74 72 20 21 3d 20 27 5c 30 27 29 0a 20 20 20 20  tr != '\0').    
10f70 20 20 7b 0a 09 20 20 70 49 6e 64 65 78 2d 3e 69    {..  pIndex->i
10f80 64 78 53 74 72 20 3d 20 73 71 6c 69 74 65 33 5f  dxStr = sqlite3_
10f90 6d 70 72 69 6e 74 66 20 28 22 25 73 22 2c 20 73  mprintf ("%s", s
10fa0 74 72 29 3b 0a 09 20 20 70 49 6e 64 65 78 2d 3e  tr);..  pIndex->
10fb0 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
10fc0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 0a 20   = 1;.      }.. 
10fd0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10fe0 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  _OK;.}..static i
10ff0 6e 74 0a 76 67 65 6f 6a 73 6f 6e 5f 64 69 73 63  nt.vgeojson_disc
11000 6f 6e 6e 65 63 74 20 28 73 71 6c 69 74 65 33 5f  onnect (sqlite3_
11010 76 74 61 62 20 2a 20 70 56 54 61 62 29 0a 7b 0a  vtab * pVTab).{.
11020 2f 2a 20 64 69 73 63 6f 6e 6e 65 63 74 73 20 74  /* disconnects t
11030 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
11040 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 74 3b   */.    int ret;
11050 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
11060 74 20 2a 73 74 6d 74 3b 0a 20 20 20 20 63 6f 6e  t *stmt;.    con
11070 73 74 20 63 68 61 72 20 2a 73 71 6c 3b 0a 20 20  st char *sql;.  
11080 20 20 56 69 72 74 75 61 6c 47 65 6f 4a 73 6f 6e    VirtualGeoJson
11090 50 74 72 20 70 5f 76 74 20 3d 20 28 56 69 72 74  Ptr p_vt = (Virt
110a0 75 61 6c 47 65 6f 4a 73 6f 6e 50 74 72 29 20 70  ualGeoJsonPtr) p
110b0 56 54 61 62 3b 0a 0a 2f 2a 20 72 65 6d 6f 76 69  VTab;../* removi
110c0 6e 67 20 66 72 6f 6d 20 74 68 65 20 63 6f 6e 6e  ng from the conn
110d0 65 63 74 69 6f 6e 20 63 61 63 68 65 3a 20 56 69  ection cache: Vi
110e0 72 74 75 61 6c 20 45 78 74 65 6e 74 20 2a 2f 0a  rtual Extent */.
110f0 20 20 20 20 73 71 6c 20 3d 20 22 53 45 4c 45 43      sql = "SELEC
11100 54 20 5c 22 2a 52 65 6d 6f 76 65 2d 56 69 72 74  T \"*Remove-Virt
11110 75 61 6c 54 61 62 6c 65 2b 45 78 74 65 6e 74 5c  ualTable+Extent\
11120 22 28 3f 29 22 3b 0a 20 20 20 20 72 65 74 20 3d  "(?)";.    ret =
11130 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
11140 5f 76 32 20 28 70 5f 76 74 2d 3e 64 62 2c 20 73  _v2 (p_vt->db, s
11150 71 6c 2c 20 73 74 72 6c 65 6e 20 28 73 71 6c 29  ql, strlen (sql)
11160 2c 20 26 73 74 6d 74 2c 20 4e 55 4c 4c 29 3b 0a  , &stmt, NULL);.
11170 20 20 20 20 69 66 20 28 72 65 74 20 3d 3d 20 53      if (ret == S
11180 51 4c 49 54 45 5f 4f 4b 29 0a 20 20 20 20 20 20  QLITE_OK).      
11190 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  {..  sqlite3_res
111a0 65 74 20 28 73 74 6d 74 29 3b 0a 09 20 20 73 71  et (stmt);..  sq
111b0 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64  lite3_clear_bind
111c0 69 6e 67 73 20 28 73 74 6d 74 29 3b 0a 09 20 20  ings (stmt);..  
111d0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
111e0 74 20 28 73 74 6d 74 2c 20 31 2c 20 70 5f 76 74  t (stmt, 1, p_vt
111f0 2d 3e 54 61 62 6c 65 4e 61 6d 65 2c 20 73 74 72  ->TableName, str
11200 6c 65 6e 20 28 70 5f 76 74 2d 3e 54 61 62 6c 65  len (p_vt->Table
11210 4e 61 6d 65 29 2c 0a 09 09 09 20 20 20 20 20 53  Name),....     S
11220 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 09  QLITE_STATIC);..
11230 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33 5f    ret = sqlite3_
11240 73 74 65 70 20 28 73 74 6d 74 29 3b 0a 20 20 20  step (stmt);.   
11250 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
11260 5f 66 69 6e 61 6c 69 7a 65 20 28 73 74 6d 74 29  _finalize (stmt)
11270 3b 0a 0a 20 20 20 20 69 66 20 28 70 5f 76 74 2d  ;..    if (p_vt-
11280 3e 54 61 62 6c 65 4e 61 6d 65 20 21 3d 20 4e 55  >TableName != NU
11290 4c 4c 29 0a 09 66 72 65 65 20 28 70 5f 76 74 2d  LL)..free (p_vt-
112a0 3e 54 61 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 20  >TableName);.   
112b0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28 70   sqlite3_free (p
112c0 5f 76 74 29 3b 0a 0a 20 20 20 20 72 65 74 75 72  _vt);..    retur
112d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
112e0 73 74 61 74 69 63 20 69 6e 74 0a 76 67 65 6f 6a  static int.vgeoj
112f0 73 6f 6e 5f 64 65 73 74 72 6f 79 20 28 73 71 6c  son_destroy (sql
11300 69 74 65 33 5f 76 74 61 62 20 2a 20 70 56 54 61  ite3_vtab * pVTa
11310 62 29 0a 7b 0a 2f 2a 20 64 65 73 74 72 6f 79 73  b).{./* destroys
11320 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
11330 6c 65 20 2d 20 73 69 6d 70 6c 79 20 61 6c 69 61  le - simply alia
11340 73 65 73 20 76 67 65 6f 6a 73 6f 6e 5f 64 69 73  ses vgeojson_dis
11350 63 6f 6e 6e 65 63 74 28 29 20 2a 2f 0a 20 20 20  connect() */.   
11360 20 72 65 74 75 72 6e 20 76 67 65 6f 6a 73 6f 6e   return vgeojson
11370 5f 64 69 73 63 6f 6e 6e 65 63 74 20 28 70 56 54  _disconnect (pVT
11380 61 62 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  ab);.}..static v
11390 6f 69 64 0a 76 67 65 6f 6a 73 6f 6e 5f 72 65 61  oid.vgeojson_rea
113a0 64 5f 72 6f 77 20 28 56 69 72 74 75 61 6c 47 65  d_row (VirtualGe
113b0 6f 4a 73 6f 6e 43 75 72 73 6f 72 50 74 72 20 63  oJsonCursorPtr c
113c0 75 72 73 6f 72 29 0a 7b 0a 2f 2a 20 74 72 79 69  ursor).{./* tryi
113d0 6e 67 20 74 6f 20 72 65 61 64 20 61 20 22 72 6f  ng to read a "ro
113e0 77 22 20 66 72 6f 6d 20 74 68 65 20 47 65 6f 4a  w" from the GeoJ
113f0 53 4f 4e 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  SON file */.    
11400 69 6e 74 20 66 69 64 3b 0a 20 20 20 20 67 65 6f  int fid;.    geo
11410 6a 73 6f 6e 5f 66 65 61 74 75 72 65 5f 70 74 72  json_feature_ptr
11420 20 66 74 3b 0a 20 20 20 20 63 68 61 72 20 2a 65   ft;.    char *e
11430 72 72 6f 72 5f 6d 65 73 73 61 67 65 3b 0a 20 20  rror_message;.  
11440 20 20 69 66 20 28 21 28 63 75 72 73 6f 72 2d 3e    if (!(cursor->
11450 70 56 74 61 62 2d 3e 56 61 6c 69 64 29 29 0a 20  pVtab->Valid)). 
11460 20 20 20 20 20 7b 0a 09 20 20 63 75 72 73 6f 72       {..  cursor
11470 2d 3e 65 6f 66 20 3d 20 31 3b 0a 09 20 20 72 65  ->eof = 1;..  re
11480 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
11490 20 20 69 66 20 28 63 75 72 73 6f 72 2d 3e 46 65    if (cursor->Fe
114a0 61 74 75 72 65 20 21 3d 20 4e 55 4c 4c 29 0a 09  ature != NULL)..
114b0 67 65 6f 6a 73 6f 6e 5f 72 65 73 65 74 5f 66 65  geojson_reset_fe
114c0 61 74 75 72 65 20 28 63 75 72 73 6f 72 2d 3e 46  ature (cursor->F
114d0 65 61 74 75 72 65 29 3b 0a 20 20 20 20 66 69 64  eature);.    fid
114e0 20 3d 20 63 75 72 73 6f 72 2d 3e 63 75 72 72 65   = cursor->curre
114f0 6e 74 5f 66 69 64 3b 0a 20 20 20 20 69 66 20 28  nt_fid;.    if (
11500 66 69 64 20 3c 20 30 20 7c 7c 20 66 69 64 20 3e  fid < 0 || fid >
11510 3d 20 63 75 72 73 6f 72 2d 3e 70 56 74 61 62 2d  = cursor->pVtab-
11520 3e 50 61 72 73 65 72 2d 3e 63 6f 75 6e 74 29 0a  >Parser->count).
11530 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 6e 6f        {..  /* no
11540 72 6d 61 6c 20 47 65 6f 4a 53 4f 4e 20 45 4f 46  rmal GeoJSON EOF
11550 20 2a 2f 0a 09 20 20 63 75 72 73 6f 72 2d 3e 65   */..  cursor->e
11560 6f 66 20 3d 20 31 3b 0a 09 20 20 72 65 74 75 72  of = 1;..  retur
11570 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 66  n;.      }.    f
11580 74 20 3d 20 63 75 72 73 6f 72 2d 3e 70 56 74 61  t = cursor->pVta
11590 62 2d 3e 50 61 72 73 65 72 2d 3e 66 65 61 74 75  b->Parser->featu
115a0 72 65 73 20 2b 20 66 69 64 3b 0a 20 20 20 20 69  res + fid;.    i
115b0 66 20 28 21 67 65 6f 6a 73 6f 6e 5f 69 6e 69 74  f (!geojson_init
115c0 5f 66 65 61 74 75 72 65 20 28 63 75 72 73 6f 72  _feature (cursor
115d0 2d 3e 70 56 74 61 62 2d 3e 50 61 72 73 65 72 2c  ->pVtab->Parser,
115e0 20 66 74 2c 20 26 65 72 72 6f 72 5f 6d 65 73 73   ft, &error_mess
115f0 61 67 65 29 29 0a 20 20 20 20 20 20 7b 0a 09 20  age)).      {.. 
11600 20 2f 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   /* an error occ
11610 75 72 72 65 64 20 2a 2f 0a 09 20 20 73 70 61 74  urred */..  spat
11620 69 61 6c 69 74 65 5f 65 20 28 22 25 73 5c 6e 22  ialite_e ("%s\n"
11630 2c 20 65 72 72 6f 72 5f 6d 65 73 73 61 67 65 29  , error_message)
11640 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 66 72 65  ;..  sqlite3_fre
11650 65 20 28 65 72 72 6f 72 5f 6d 65 73 73 61 67 65  e (error_message
11660 29 3b 0a 09 20 20 63 75 72 73 6f 72 2d 3e 65 6f  );..  cursor->eo
11670 66 20 3d 20 31 3b 0a 09 20 20 72 65 74 75 72 6e  f = 1;..  return
11680 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 63 75  ;.      }.    cu
11690 72 73 6f 72 2d 3e 46 65 61 74 75 72 65 20 3d 20  rsor->Feature = 
116a0 66 74 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  ft;.}..static in
116b0 74 0a 76 67 65 6f 6a 73 6f 6e 5f 6f 70 65 6e 20  t.vgeojson_open 
116c0 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 20  (sqlite3_vtab * 
116d0 70 56 54 61 62 2c 20 73 71 6c 69 74 65 33 5f 76  pVTab, sqlite3_v
116e0 74 61 62 5f 63 75 72 73 6f 72 20 2a 2a 20 70 70  tab_cursor ** pp
116f0 43 75 72 73 6f 72 29 0a 7b 0a 2f 2a 20 6f 70 65  Cursor).{./* ope
11700 6e 69 6e 67 20 61 20 6e 65 77 20 63 75 72 73 6f  ning a new curso
11710 72 20 2a 2f 0a 20 20 20 20 56 69 72 74 75 61 6c  r */.    Virtual
11720 47 65 6f 4a 73 6f 6e 43 75 72 73 6f 72 50 74 72  GeoJsonCursorPtr
11730 20 63 75 72 73 6f 72 20 3d 0a 09 28 56 69 72 74   cursor =..(Virt
11740 75 61 6c 47 65 6f 4a 73 6f 6e 43 75 72 73 6f 72  ualGeoJsonCursor
11750 50 74 72 29 0a 09 73 71 6c 69 74 65 33 5f 6d 61  Ptr)..sqlite3_ma
11760 6c 6c 6f 63 20 28 73 69 7a 65 6f 66 20 28 56 69  lloc (sizeof (Vi
11770 72 74 75 61 6c 47 65 6f 4a 73 6f 6e 43 75 72 73  rtualGeoJsonCurs
11780 6f 72 29 29 3b 0a 20 20 20 20 69 66 20 28 63 75  or));.    if (cu
11790 72 73 6f 72 20 3d 3d 20 4e 55 4c 4c 29 0a 09 72  rsor == NULL)..r
117a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
117b0 4f 52 3b 0a 20 20 20 20 63 75 72 73 6f 72 2d 3e  OR;.    cursor->
117c0 66 69 72 73 74 43 6f 6e 73 74 72 61 69 6e 74 20  firstConstraint 
117d0 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 75 72 73  = NULL;.    curs
117e0 6f 72 2d 3e 6c 61 73 74 43 6f 6e 73 74 72 61 69  or->lastConstrai
117f0 6e 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63  nt = NULL;.    c
11800 75 72 73 6f 72 2d 3e 70 56 74 61 62 20 3d 20 28  ursor->pVtab = (
11810 56 69 72 74 75 61 6c 47 65 6f 4a 73 6f 6e 50 74  VirtualGeoJsonPt
11820 72 29 20 70 56 54 61 62 3b 0a 20 20 20 20 63 75  r) pVTab;.    cu
11830 72 73 6f 72 2d 3e 63 75 72 72 65 6e 74 5f 66 69  rsor->current_fi
11840 64 20 3d 20 30 3b 0a 20 20 20 20 63 75 72 73 6f  d = 0;.    curso
11850 72 2d 3e 46 65 61 74 75 72 65 20 3d 20 4e 55 4c  r->Feature = NUL
11860 4c 3b 0a 20 20 20 20 63 75 72 73 6f 72 2d 3e 65  L;.    cursor->e
11870 6f 66 20 3d 20 30 3b 0a 20 20 20 20 2a 70 70 43  of = 0;.    *ppC
11880 75 72 73 6f 72 20 3d 20 28 73 71 6c 69 74 65 33  ursor = (sqlite3
11890 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 29 20  _vtab_cursor *) 
118a0 63 75 72 73 6f 72 3b 0a 20 20 20 20 76 67 65 6f  cursor;.    vgeo
118b0 6a 73 6f 6e 5f 72 65 61 64 5f 72 6f 77 20 28 63  json_read_row (c
118c0 75 72 73 6f 72 29 3b 0a 20 20 20 20 72 65 74 75  ursor);.    retu
118d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
118e0 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 76 67 65  .static void.vge
118f0 6f 6a 73 6f 6e 5f 66 72 65 65 5f 63 6f 6e 73 74  ojson_free_const
11900 72 61 69 6e 74 73 20 28 56 69 72 74 75 61 6c 47  raints (VirtualG
11910 65 6f 4a 73 6f 6e 43 75 72 73 6f 72 50 74 72 20  eoJsonCursorPtr 
11920 63 75 72 73 6f 72 29 0a 7b 0a 2f 2a 20 6d 65 6d  cursor).{./* mem
11930 6f 72 79 20 63 6c 65 61 6e 75 70 20 2d 20 63 75  ory cleanup - cu
11940 72 73 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73  rsor constraints
11950 20 2a 2f 0a 20 20 20 20 56 69 72 74 75 61 6c 47   */.    VirtualG
11960 65 6f 4a 73 6f 6e 43 6f 6e 73 74 72 61 69 6e 74  eoJsonConstraint
11970 50 74 72 20 70 43 3b 0a 20 20 20 20 56 69 72 74  Ptr pC;.    Virt
11980 75 61 6c 47 65 6f 4a 73 6f 6e 43 6f 6e 73 74 72  ualGeoJsonConstr
11990 61 69 6e 74 50 74 72 20 70 43 6e 3b 0a 20 20 20  aintPtr pCn;.   
119a0 20 70 43 20 3d 20 63 75 72 73 6f 72 2d 3e 66 69   pC = cursor->fi
119b0 72 73 74 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20  rstConstraint;. 
119c0 20 20 20 77 68 69 6c 65 20 28 70 43 29 0a 20 20     while (pC).  
119d0 20 20 20 20 7b 0a 09 20 20 70 43 6e 20 3d 20 70      {..  pCn = p
119e0 43 2d 3e 6e 65 78 74 3b 0a 09 20 20 69 66 20 28  C->next;..  if (
119f0 70 43 2d 3e 74 78 74 56 61 6c 75 65 29 0a 09 20  pC->txtValue).. 
11a00 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
11a10 65 20 28 70 43 2d 3e 74 78 74 56 61 6c 75 65 29  e (pC->txtValue)
11a20 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 66 72 65  ;..  sqlite3_fre
11a30 65 20 28 70 43 29 3b 0a 09 20 20 70 43 20 3d 20  e (pC);..  pC = 
11a40 70 43 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pCn;.      }.   
11a50 20 63 75 72 73 6f 72 2d 3e 66 69 72 73 74 43 6f   cursor->firstCo
11a60 6e 73 74 72 61 69 6e 74 20 3d 20 4e 55 4c 4c 3b  nstraint = NULL;
11a70 0a 20 20 20 20 63 75 72 73 6f 72 2d 3e 6c 61 73  .    cursor->las
11a80 74 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 4e 55  tConstraint = NU
11a90 4c 4c 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  LL;.}..static in
11aa0 74 0a 76 67 65 6f 6a 73 6f 6e 5f 63 6c 6f 73 65  t.vgeojson_close
11ab0 20 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63   (sqlite3_vtab_c
11ac0 75 72 73 6f 72 20 2a 20 70 43 75 72 73 6f 72 29  ursor * pCursor)
11ad0 0a 7b 0a 2f 2a 20 63 6c 6f 73 69 6e 67 20 74 68  .{./* closing th
11ae0 65 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 20 20  e cursor */.    
11af0 56 69 72 74 75 61 6c 47 65 6f 4a 73 6f 6e 43 75  VirtualGeoJsonCu
11b00 72 73 6f 72 50 74 72 20 63 75 72 73 6f 72 20 3d  rsorPtr cursor =
11b10 20 28 56 69 72 74 75 61 6c 47 65 6f 4a 73 6f 6e   (VirtualGeoJson
11b20 43 75 72 73 6f 72 50 74 72 29 20 70 43 75 72 73  CursorPtr) pCurs
11b30 6f 72 3b 0a 20 20 20 20 69 66 20 28 63 75 72 73  or;.    if (curs
11b40 6f 72 2d 3e 46 65 61 74 75 72 65 20 21 3d 20 4e  or->Feature != N
11b50 55 4c 4c 29 0a 09 67 65 6f 6a 73 6f 6e 5f 72 65  ULL)..geojson_re
11b60 73 65 74 5f 66 65 61 74 75 72 65 20 28 63 75 72  set_feature (cur
11b70 73 6f 72 2d 3e 46 65 61 74 75 72 65 29 3b 0a 20  sor->Feature);. 
11b80 20 20 20 76 67 65 6f 6a 73 6f 6e 5f 66 72 65 65     vgeojson_free
11b90 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 28 63 75  _constraints (cu
11ba0 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  rsor);.    sqlit
11bb0 65 33 5f 66 72 65 65 20 28 70 43 75 72 73 6f 72  e3_free (pCursor
11bc0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
11bd0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74  LITE_OK;.}..stat
11be0 69 63 20 69 6e 74 0a 76 67 65 6f 6a 73 6f 6e 5f  ic int.vgeojson_
11bf0 70 61 72 73 65 5f 63 6f 6e 73 74 72 61 69 6e 74  parse_constraint
11c00 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 74   (const char *st
11c10 72 2c 20 69 6e 74 20 69 6e 64 65 78 2c 20 69 6e  r, int index, in
11c20 74 20 2a 69 43 6f 6c 75 6d 6e 2c 20 69 6e 74 20  t *iColumn, int 
11c30 2a 6f 70 29 0a 7b 0a 2f 2a 20 70 61 72 73 69 6e  *op).{./* parsin
11c40 67 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 73  g a constraint s
11c50 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 63 68 61  tring */.    cha
11c60 72 20 62 75 66 5b 36 34 5d 3b 0a 20 20 20 20 63  r buf[64];.    c
11c70 6f 6e 73 74 20 63 68 61 72 20 2a 69 6e 20 3d 20  onst char *in = 
11c80 73 74 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 6f  str;.    char *o
11c90 75 74 20 3d 20 62 75 66 3b 0a 20 20 20 20 69 6e  ut = buf;.    in
11ca0 74 20 69 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  t i = 0;.    int
11cb0 20 66 6f 75 6e 64 20 3d 20 30 3b 0a 0a 20 20 20   found = 0;..   
11cc0 20 2a 6f 75 74 20 3d 20 27 5c 30 27 3b 0a 20 20   *out = '\0';.  
11cd0 20 20 77 68 69 6c 65 20 28 2a 69 6e 20 21 3d 20    while (*in != 
11ce0 27 5c 30 27 29 0a 20 20 20 20 20 20 7b 0a 09 20  '\0').      {.. 
11cf0 20 69 66 20 28 2a 69 6e 20 3d 3d 20 27 2c 27 29   if (*in == ',')
11d00 0a 09 20 20 20 20 7b 0a 09 09 69 66 20 28 69 6e  ..    {...if (in
11d10 64 65 78 20 3d 3d 20 69 29 0a 09 09 20 20 7b 0a  dex == i)...  {.
11d20 09 09 20 20 20 20 20 20 2a 6f 75 74 20 3d 20 27  ..      *out = '
11d30 5c 30 27 3b 0a 09 09 20 20 20 20 20 20 66 6f 75  \0';...      fou
11d40 6e 64 20 3d 20 31 3b 0a 09 09 20 20 20 20 20 20  nd = 1;...      
11d50 62 72 65 61 6b 3b 0a 09 09 20 20 7d 0a 09 09 69  break;...  }...i
11d60 2b 2b 3b 0a 09 09 69 6e 2b 2b 3b 0a 09 09 63 6f  ++;...in++;...co
11d70 6e 74 69 6e 75 65 3b 0a 09 20 20 20 20 7d 0a 09  ntinue;..    }..
11d80 20 20 69 66 20 28 69 6e 64 65 78 20 3d 3d 20 69    if (index == i
11d90 29 0a 09 20 20 20 20 20 20 2a 6f 75 74 2b 2b 20  )..      *out++ 
11da0 3d 20 2a 69 6e 3b 0a 09 20 20 69 6e 2b 2b 3b 0a  = *in;..  in++;.
11db0 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28        }.    if (
11dc0 21 66 6f 75 6e 64 29 0a 09 72 65 74 75 72 6e 20  !found)..return 
11dd0 30 3b 0a 20 20 20 20 69 6e 20 3d 20 62 75 66 3b  0;.    in = buf;
11de0 0a 20 20 20 20 66 6f 72 20 28 69 20 3d 20 30 3b  .    for (i = 0;
11df0 20 69 20 3c 20 28 69 6e 74 29 20 73 74 72 6c 65   i < (int) strle
11e00 6e 20 28 62 75 66 29 3b 20 69 2b 2b 29 0a 20 20  n (buf); i++).  
11e10 20 20 20 20 7b 0a 09 20 20 69 66 20 28 62 75 66      {..  if (buf
11e20 5b 69 5d 20 3d 3d 20 27 3a 27 29 0a 09 20 20 20  [i] == ':')..   
11e30 20 7b 0a 09 09 62 75 66 5b 69 5d 20 3d 20 27 5c   {...buf[i] = '\
11e40 30 27 3b 0a 09 09 2a 69 43 6f 6c 75 6d 6e 20 3d  0';...*iColumn =
11e50 20 61 74 6f 69 20 28 62 75 66 29 3b 0a 09 09 2a   atoi (buf);...*
11e60 6f 70 20 3d 20 61 74 6f 69 20 28 62 75 66 20 2b  op = atoi (buf +
11e70 20 69 20 2b 20 31 29 3b 0a 09 09 72 65 74 75 72   i + 1);...retur
11e80 6e 20 31 3b 0a 09 20 20 20 20 7d 0a 09 20 20 69  n 1;..    }..  i
11e90 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n++;.      }.   
11ea0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74   return 0;.}..st
11eb0 61 74 69 63 20 69 6e 74 0a 76 67 65 6f 6a 73 6f  atic int.vgeojso
11ec0 6e 5f 65 76 61 6c 5f 63 6f 6e 73 74 72 61 69 6e  n_eval_constrain
11ed0 74 73 20 28 56 69 72 74 75 61 6c 47 65 6f 4a 73  ts (VirtualGeoJs
11ee0 6f 6e 43 75 72 73 6f 72 50 74 72 20 63 75 72 73  onCursorPtr curs
11ef0 6f 72 29 0a 7b 0a 2f 2a 20 65 76 61 6c 75 61 74  or).{./* evaluat
11f00 69 6e 67 20 46 69 6c 74 65 72 20 63 6f 6e 73 74  ing Filter const
11f10 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 69 6e  raints */.    in
11f20 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 67 65 6f 6a  t nCol;.    geoj
11f30 73 6f 6e 5f 63 6f 6c 75 6d 6e 5f 70 74 72 20 63  son_column_ptr c
11f40 6f 6c 3b 0a 20 20 20 20 67 65 6f 6a 73 6f 6e 5f  ol;.    geojson_
11f50 70 72 6f 70 65 72 74 79 5f 70 74 72 20 70 72 6f  property_ptr pro
11f60 70 3b 0a 20 20 20 20 56 69 72 74 75 61 6c 47 65  p;.    VirtualGe
11f70 6f 4a 73 6f 6e 43 6f 6e 73 74 72 61 69 6e 74 50  oJsonConstraintP
11f80 74 72 20 70 43 20 3d 20 63 75 72 73 6f 72 2d 3e  tr pC = cursor->
11f90 66 69 72 73 74 43 6f 6e 73 74 72 61 69 6e 74 3b  firstConstraint;
11fa0 0a 20 20 20 20 69 66 20 28 70 43 20 3d 3d 20 4e  .    if (pC == N
11fb0 55 4c 4c 29 0a 09 72 65 74 75 72 6e 20 31 3b 0a  ULL)..return 1;.
11fc0 20 20 20 20 77 68 69 6c 65 20 28 70 43 29 0a 20      while (pC). 
11fd0 20 20 20 20 20 7b 0a 09 20 20 69 6e 74 20 6f 6b       {..  int ok
11fe0 20 3d 20 30 3b 0a 09 20 20 69 66 20 28 70 43 2d   = 0;..  if (pC-
11ff0 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 30 29 0a 09  >iColumn == 0)..
12000 20 20 20 20 7b 0a 09 09 2f 2a 20 74 68 65 20 50      {.../* the P
12010 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d  RIMARY KEY colum
12020 6e 20 2a 2f 0a 09 09 69 66 20 28 70 43 2d 3e 6f  n */...if (pC->o
12030 70 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 44 45  p == SQLITE_INDE
12040 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 49 53 4e  X_CONSTRAINT_ISN
12050 55 4c 4c 29 0a 09 09 20 20 7b 0a 09 09 20 20 20  ULL)...  {...   
12060 20 20 20 6f 6b 20 3d 20 30 3b 0a 09 09 20 20 20     ok = 0;...   
12070 20 20 20 67 6f 74 6f 20 64 6f 6e 65 3b 0a 09 09     goto done;...
12080 20 20 7d 0a 09 09 69 66 20 28 70 43 2d 3e 6f 70    }...if (pC->op
12090 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 44 45 58   == SQLITE_INDEX
120a0 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 49 53 4e 4f  _CONSTRAINT_ISNO
120b0 54 4e 55 4c 4c 29 0a 09 09 20 20 7b 0a 09 09 20  TNULL)...  {... 
120c0 20 20 20 20 20 6f 6b 20 3d 20 31 3b 0a 09 09 20       ok = 1;... 
120d0 20 20 20 20 20 67 6f 74 6f 20 64 6f 6e 65 3b 0a       goto done;.
120e0 09 09 20 20 7d 0a 09 09 69 66 20 28 70 43 2d 3e  ..  }...if (pC->
120f0 76 61 6c 75 65 54 79 70 65 20 3d 3d 20 27 49 27  valueType == 'I'
12100 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20  )...  {...      
12110 73 77 69 74 63 68 20 28 70 43 2d 3e 6f 70 29 0a  switch (pC->op).
12120 09 09 09 7b 0a 09 09 09 63 61 73 65 20 53 51 4c  ...{....case SQL
12130 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
12140 41 49 4e 54 5f 45 51 3a 0a 09 09 09 20 20 20 20  AINT_EQ:....    
12150 69 66 20 28 63 75 72 73 6f 72 2d 3e 63 75 72 72  if (cursor->curr
12160 65 6e 74 5f 66 69 64 20 3d 3d 20 70 43 2d 3e 69  ent_fid == pC->i
12170 6e 74 56 61 6c 75 65 29 0a 09 09 09 09 6f 6b 20  ntValue).....ok 
12180 3d 20 31 3b 0a 09 09 09 20 20 20 20 62 72 65 61  = 1;....    brea
12190 6b 3b 0a 09 09 09 63 61 73 65 20 53 51 4c 49 54  k;....case SQLIT
121a0 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
121b0 4e 54 5f 47 54 3a 0a 09 09 09 20 20 20 20 69 66  NT_GT:....    if
121c0 20 28 63 75 72 73 6f 72 2d 3e 63 75 72 72 65 6e   (cursor->curren
121d0 74 5f 66 69 64 20 3e 20 70 43 2d 3e 69 6e 74 56  t_fid > pC->intV
121e0 61 6c 75 65 29 0a 09 09 09 09 6f 6b 20 3d 20 31  alue).....ok = 1
121f0 3b 0a 09 09 09 20 20 20 20 62 72 65 61 6b 3b 0a  ;....    break;.
12200 09 09 09 63 61 73 65 20 53 51 4c 49 54 45 5f 49  ...case SQLITE_I
12210 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
12220 4c 45 3a 0a 09 09 09 20 20 20 20 69 66 20 28 63  LE:....    if (c
12230 75 72 73 6f 72 2d 3e 63 75 72 72 65 6e 74 5f 66  ursor->current_f
12240 69 64 20 3c 3d 20 70 43 2d 3e 69 6e 74 56 61 6c  id <= pC->intVal
12250 75 65 29 0a 09 09 09 09 6f 6b 20 3d 20 31 3b 0a  ue).....ok = 1;.
12260 09 09 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 09  ...    break;...
12270 09 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 44  .case SQLITE_IND
12280 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54  EX_CONSTRAINT_LT
12290 3a 0a 09 09 09 20 20 20 20 69 66 20 28 63 75 72  :....    if (cur
122a0 73 6f 72 2d 3e 63 75 72 72 65 6e 74 5f 66 69 64  sor->current_fid
122b0 20 3c 20 70 43 2d 3e 69 6e 74 56 61 6c 75 65 29   < pC->intValue)
122c0 0a 09 09 09 09 6f 6b 20 3d 20 31 3b 0a 09 09 09  .....ok = 1;....
122d0 20 20 20 20 62 72 65 61 6b 3b 0a 09 09 09 63 61      break;....ca
122e0 73 65 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  se SQLITE_INDEX_
122f0 43 4f 4e 53 54 52 41 49 4e 54 5f 47 45 3a 0a 09  CONSTRAINT_GE:..
12300 09 09 20 20 20 20 69 66 20 28 63 75 72 73 6f 72  ..    if (cursor
12310 2d 3e 63 75 72 72 65 6e 74 5f 66 69 64 20 3e 3d  ->current_fid >=
12320 20 70 43 2d 3e 69 6e 74 56 61 6c 75 65 29 0a 09   pC->intValue)..
12330 09 09 09 6f 6b 20 3d 20 31 3b 0a 09 09 09 20 20  ...ok = 1;....  
12340 20 20 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65    break;....case
12350 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f   SQLITE_INDEX_CO
12360 4e 53 54 52 41 49 4e 54 5f 4e 45 3a 0a 09 09 09  NSTRAINT_NE:....
12370 20 20 20 20 69 66 20 28 63 75 72 73 6f 72 2d 3e      if (cursor->
12380 63 75 72 72 65 6e 74 5f 66 69 64 20 21 3d 20 70  current_fid != p
12390 43 2d 3e 69 6e 74 56 61 6c 75 65 29 0a 09 09 09  C->intValue)....
123a0 09 6f 6b 20 3d 20 31 3b 0a 09 09 09 20 20 20 20  .ok = 1;....    
123b0 62 72 65 61 6b 3b 0a 09 09 09 7d 3b 0a 09 09 20  break;....};... 
123c0 20 7d 0a 09 09 67 6f 74 6f 20 64 6f 6e 65 3b 0a   }...goto done;.
123d0 09 20 20 20 20 7d 0a 09 20 20 69 66 20 28 70 43  .    }..  if (pC
123e0 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 31 29 0a  ->iColumn == 1).
123f0 09 20 20 20 20 7b 0a 09 09 2f 2a 20 74 68 65 20  .    {.../* the 
12400 47 65 6f 6d 65 74 72 79 20 63 6f 6c 75 6d 6e 20  Geometry column 
12410 2a 2f 0a 09 09 69 66 20 28 63 75 72 73 6f 72 2d  */...if (cursor-
12420 3e 46 65 61 74 75 72 65 20 21 3d 20 4e 55 4c 4c  >Feature != NULL
12430 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20  )...  {...      
12440 73 77 69 74 63 68 20 28 70 43 2d 3e 6f 70 29 0a  switch (pC->op).
12450 09 09 09 7b 0a 09 09 09 63 61 73 65 20 53 51 4c  ...{....case SQL
12460 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
12470 41 49 4e 54 5f 49 53 4e 55 4c 4c 3a 0a 09 09 09  AINT_ISNULL:....
12480 20 20 20 20 69 66 20 28 63 75 72 73 6f 72 2d 3e      if (cursor->
12490 46 65 61 74 75 72 65 2d 3e 67 65 6f 6d 65 74 72  Feature->geometr
124a0 79 20 3d 3d 20 4e 55 4c 4c 29 0a 09 09 09 09 6f  y == NULL).....o
124b0 6b 20 3d 20 31 3b 0a 09 09 09 20 20 20 20 62 72  k = 1;....    br
124c0 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 53 51 4c  eak;....case SQL
124d0 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
124e0 41 49 4e 54 5f 49 53 4e 4f 54 4e 55 4c 4c 3a 0a  AINT_ISNOTNULL:.
124f0 09 09 09 20 20 20 20 69 66 20 28 63 75 72 73 6f  ...    if (curso
12500 72 2d 3e 46 65 61 74 75 72 65 2d 3e 67 65 6f 6d  r->Feature->geom
12510 65 74 72 79 20 21 3d 20 4e 55 4c 4c 29 0a 09 09  etry != NULL)...
12520 09 09 6f 6b 20 3d 20 31 3b 0a 09 09 09 20 20 20  ..ok = 1;....   
12530 20 62 72 65 61 6b 3b 0a 09 09 09 7d 3b 0a 0a 09   break;....};...
12540 09 20 20 7d 0a 09 09 65 6c 73 65 0a 09 09 20 20  .  }...else...  
12550 7b 0a 09 09 20 20 20 20 20 20 69 66 20 28 70 43  {...      if (pC
12560 2d 3e 6f 70 20 3d 3d 20 53 51 4c 49 54 45 5f 49  ->op == SQLITE_I
12570 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
12580 49 53 4e 55 4c 4c 29 0a 09 09 09 20 20 6f 6b 20  ISNULL)....  ok 
12590 3d 20 31 3b 0a 09 09 20 20 7d 0a 09 09 67 6f 74  = 1;...  }...got
125a0 6f 20 64 6f 6e 65 3b 0a 09 20 20 20 20 7d 0a 09  o done;..    }..
125b0 20 20 2f 2a 20 61 6e 79 20 6f 74 68 65 72 20 6f    /* any other o
125c0 72 64 69 6e 61 72 79 20 63 6f 6c 75 6d 6e 20 2a  rdinary column *
125d0 2f 0a 09 20 20 6e 43 6f 6c 20 3d 20 32 3b 0a 09  /..  nCol = 2;..
125e0 20 20 63 6f 6c 20 3d 20 63 75 72 73 6f 72 2d 3e    col = cursor->
125f0 70 56 74 61 62 2d 3e 50 61 72 73 65 72 2d 3e 66  pVtab->Parser->f
12600 69 72 73 74 5f 63 6f 6c 3b 0a 09 20 20 77 68 69  irst_col;..  whi
12610 6c 65 20 28 63 6f 6c 29 0a 09 20 20 20 20 7b 0a  le (col)..    {.
12620 09 09 69 66 20 28 6e 43 6f 6c 20 21 3d 20 70 43  ..if (nCol != pC
12630 2d 3e 69 43 6f 6c 75 6d 6e 29 0a 09 09 20 20 7b  ->iColumn)...  {
12640 0a 09 09 20 20 20 20 20 20 6e 43 6f 6c 2b 2b 3b  ...      nCol++;
12650 0a 09 09 20 20 20 20 20 20 63 6f 6c 20 3d 20 63  ...      col = c
12660 6f 6c 2d 3e 6e 65 78 74 3b 0a 09 09 20 20 20 20  ol->next;...    
12670 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 20 20    continue;...  
12680 7d 0a 09 09 69 66 20 28 63 6f 6c 2d 3e 6e 61 6d  }...if (col->nam
12690 65 20 3d 3d 20 4e 55 4c 4c 29 0a 09 09 20 20 7b  e == NULL)...  {
126a0 0a 09 09 20 20 20 20 20 20 6f 6b 20 3d 20 31 3b  ...      ok = 1;
126b0 0a 09 09 20 20 20 20 20 20 67 6f 74 6f 20 64 6f  ...      goto do
126c0 6e 65 3b 0a 09 09 20 20 7d 0a 09 09 70 72 6f 70  ne;...  }...prop
126d0 20 3d 20 76 67 65 6f 6a 73 6f 6e 5f 67 65 74 5f   = vgeojson_get_
126e0 70 72 6f 70 65 72 74 79 5f 62 79 5f 6e 61 6d 65  property_by_name
126f0 20 28 63 75 72 73 6f 72 2c 20 63 6f 6c 2d 3e 6e   (cursor, col->n
12700 61 6d 65 29 3b 0a 09 09 69 66 20 28 70 72 6f 70  ame);...if (prop
12710 20 3d 3d 20 4e 55 4c 4c 29 0a 09 09 20 20 7b 0a   == NULL)...  {.
12720 09 09 20 20 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a  ..      nCol++;.
12730 09 09 20 20 20 20 20 20 63 6f 6c 20 3d 20 63 6f  ..      col = co
12740 6c 2d 3e 6e 65 78 74 3b 0a 09 09 20 20 20 20 20  l->next;...     
12750 20 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 20 20 7d   continue;...  }
12760 0a 09 09 73 77 69 74 63 68 20 28 70 43 2d 3e 6f  ...switch (pC->o
12770 70 29 0a 09 09 20 20 7b 0a 09 09 20 20 63 61 73  p)...  {...  cas
12780 65 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  e SQLITE_INDEX_C
12790 4f 4e 53 54 52 41 49 4e 54 5f 49 53 4e 55 4c 4c  ONSTRAINT_ISNULL
127a0 3a 0a 09 09 20 20 20 20 20 20 69 66 20 28 70 72  :...      if (pr
127b0 6f 70 2d 3e 74 79 70 65 20 3d 3d 20 47 45 4f 4a  op->type == GEOJ
127c0 53 4f 4e 5f 4e 55 4c 4c 29 0a 09 09 09 20 20 6f  SON_NULL)....  o
127d0 6b 20 3d 20 31 3b 0a 09 09 20 20 20 20 20 20 62  k = 1;...      b
127e0 72 65 61 6b 3b 0a 09 09 20 20 63 61 73 65 20 53  reak;...  case S
127f0 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
12800 54 52 41 49 4e 54 5f 49 53 4e 4f 54 4e 55 4c 4c  TRAINT_ISNOTNULL
12810 3a 0a 09 09 20 20 20 20 20 20 69 66 20 28 70 72  :...      if (pr
12820 6f 70 2d 3e 74 79 70 65 20 21 3d 20 47 45 4f 4a  op->type != GEOJ
12830 53 4f 4e 5f 4e 55 4c 4c 29 0a 09 09 09 20 20 6f  SON_NULL)....  o
12840 6b 20 3d 20 31 3b 0a 09 09 20 20 20 20 20 20 62  k = 1;...      b
12850 72 65 61 6b 3b 0a 09 09 20 20 7d 3b 0a 09 09 69  reak;...  };...i
12860 66 20 28 6f 6b 29 0a 09 09 20 20 20 20 62 72 65  f (ok)...    bre
12870 61 6b 3b 0a 09 09 73 77 69 74 63 68 20 28 70 72  ak;...switch (pr
12880 6f 70 2d 3e 74 79 70 65 29 0a 09 09 20 20 7b 0a  op->type)...  {.
12890 09 09 20 20 63 61 73 65 20 47 45 4f 4a 53 4f 4e  ..  case GEOJSON
128a0 5f 49 4e 54 45 47 45 52 3a 0a 09 09 20 20 20 20  _INTEGER:...    
128b0 20 20 69 66 20 28 70 43 2d 3e 76 61 6c 75 65 54    if (pC->valueT
128c0 79 70 65 20 3d 3d 20 27 49 27 29 0a 09 09 09 7b  ype == 'I')....{
128d0 0a 09 09 09 20 20 20 20 73 77 69 74 63 68 20 28  ....    switch (
128e0 70 43 2d 3e 6f 70 29 0a 09 09 09 20 20 20 20 20  pC->op)....     
128f0 20 7b 0a 09 09 09 20 20 20 20 20 20 63 61 73 65   {....      case
12900 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f   SQLITE_INDEX_CO
12910 4e 53 54 52 41 49 4e 54 5f 45 51 3a 0a 09 09 09  NSTRAINT_EQ:....
12920 09 20 20 69 66 20 28 70 72 6f 70 2d 3e 69 6e 74  .  if (prop->int
12930 5f 76 61 6c 75 65 20 3d 3d 20 70 43 2d 3e 69 6e  _value == pC->in
12940 74 56 61 6c 75 65 29 0a 09 09 09 09 20 20 20 20  tValue).....    
12950 20 20 6f 6b 20 3d 20 31 3b 0a 09 09 09 09 20 20    ok = 1;.....  
12960 62 72 65 61 6b 3b 0a 09 09 09 20 20 20 20 20 20  break;....      
12970 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 44 45  case SQLITE_INDE
12980 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 54 3a  X_CONSTRAINT_GT:
12990 0a 09 09 09 09 20 20 69 66 20 28 70 72 6f 70 2d  .....  if (prop-
129a0 3e 69 6e 74 5f 76 61 6c 75 65 20 3e 20 70 43 2d  >int_value > pC-
129b0 3e 69 6e 74 56 61 6c 75 65 29 0a 09 09 09 09 20  >intValue)..... 
129c0 20 20 20 20 20 6f 6b 20 3d 20 31 3b 0a 09 09 09       ok = 1;....
129d0 09 20 20 62 72 65 61 6b 3b 0a 09 09 09 20 20 20  .  break;....   
129e0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
129f0 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
12a00 4c 45 3a 0a 09 09 09 09 20 20 69 66 20 28 70 72  LE:.....  if (pr
12a10 6f 70 2d 3e 69 6e 74 5f 76 61 6c 75 65 20 3c 3d  op->int_value <=
12a20 20 70 43 2d 3e 69 6e 74 56 61 6c 75 65 29 0a 09   pC->intValue)..
12a30 09 09 09 20 20 20 20 20 20 6f 6b 20 3d 20 31 3b  ...      ok = 1;
12a40 0a 09 09 09 09 20 20 62 72 65 61 6b 3b 0a 09 09  .....  break;...
12a50 09 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
12a60 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
12a70 49 4e 54 5f 4c 54 3a 0a 09 09 09 09 20 20 69 66  INT_LT:.....  if
12a80 20 28 70 72 6f 70 2d 3e 69 6e 74 5f 76 61 6c 75   (prop->int_valu
12a90 65 20 3c 20 70 43 2d 3e 69 6e 74 56 61 6c 75 65  e < pC->intValue
12aa0 29 0a 09 09 09 09 20 20 20 20 20 20 6f 6b 20 3d  ).....      ok =
12ab0 20 31 3b 0a 09 09 09 09 20 20 62 72 65 61 6b 3b   1;.....  break;
12ac0 0a 09 09 09 20 20 20 20 20 20 63 61 73 65 20 53  ....      case S
12ad0 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
12ae0 54 52 41 49 4e 54 5f 47 45 3a 0a 09 09 09 09 20  TRAINT_GE:..... 
12af0 20 69 66 20 28 70 72 6f 70 2d 3e 69 6e 74 5f 76   if (prop->int_v
12b00 61 6c 75 65 20 3e 3d 20 70 43 2d 3e 69 6e 74 56  alue >= pC->intV
12b10 61 6c 75 65 29 0a 09 09 09 09 20 20 20 20 20 20  alue).....      
12b20 6f 6b 20 3d 20 31 3b 0a 09 09 09 09 20 20 62 72  ok = 1;.....  br
12b30 65 61 6b 3b 0a 09 09 09 20 20 20 20 20 20 63 61  eak;....      ca
12b40 73 65 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  se SQLITE_INDEX_
12b50 43 4f 4e 53 54 52 41 49 4e 54 5f 4e 45 3a 0a 09  CONSTRAINT_NE:..
12b60 09 09 09 20 20 69 66 20 28 70 72 6f 70 2d 3e 69  ...  if (prop->i
12b70 6e 74 5f 76 61 6c 75 65 20 21 3d 20 70 43 2d 3e  nt_value != pC->
12b80 69 6e 74 56 61 6c 75 65 29 0a 09 09 09 09 20 20  intValue).....  
12b90 20 20 20 20 6f 6b 20 3d 20 31 3b 0a 09 09 09 09      ok = 1;.....
12ba0 20 20 62 72 65 61 6b 3b 0a 09 09 09 20 20 20 20    break;....    
12bb0 20 20 7d 3b 0a 09 09 09 7d 0a 09 09 20 20 20 20    };....}...    
12bc0 20 20 62 72 65 61 6b 3b 0a 09 09 20 20 63 61 73    break;...  cas
12bd0 65 20 47 45 4f 4a 53 4f 4e 5f 44 4f 55 42 4c 45  e GEOJSON_DOUBLE
12be0 3a 0a 09 09 20 20 20 20 20 20 69 66 20 28 70 43  :...      if (pC
12bf0 2d 3e 76 61 6c 75 65 54 79 70 65 20 3d 3d 20 27  ->valueType == '
12c00 49 27 29 0a 09 09 09 7b 0a 09 09 09 20 20 20 20  I')....{....    
12c10 73 77 69 74 63 68 20 28 70 43 2d 3e 6f 70 29 0a  switch (pC->op).
12c20 09 09 09 20 20 20 20 20 20 7b 0a 09 09 09 20 20  ...      {....  
12c30 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
12c40 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
12c50 5f 45 51 3a 0a 09 09 09 09 20 20 69 66 20 28 70  _EQ:.....  if (p
12c60 72 6f 70 2d 3e 64 62 6c 5f 76 61 6c 75 65 20 3d  rop->dbl_value =
12c70 3d 20 70 43 2d 3e 69 6e 74 56 61 6c 75 65 29 0a  = pC->intValue).
12c80 09 09 09 09 20 20 20 20 20 20 6f 6b 20 3d 20 31  ....      ok = 1
12c90 3b 0a 09 09 09 09 20 20 62 72 65 61 6b 3b 0a 09  ;.....  break;..
12ca0 09 09 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ..      case SQL
12cb0 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
12cc0 41 49 4e 54 5f 47 54 3a 0a 09 09 09 09 20 20 69  AINT_GT:.....  i
12cd0 66 20 28 70 72 6f 70 2d 3e 64 62 6c 5f 76 61 6c  f (prop->dbl_val
12ce0 75 65 20 3e 20 70 43 2d 3e 69 6e 74 56 61 6c 75  ue > pC->intValu
12cf0 65 29 0a 09 09 09 09 20 20 20 20 20 20 6f 6b 20  e).....      ok 
12d00 3d 20 31 3b 0a 09 09 09 09 20 20 62 72 65 61 6b  = 1;.....  break
12d10 3b 0a 09 09 09 20 20 20 20 20 20 63 61 73 65 20  ;....      case 
12d20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
12d30 53 54 52 41 49 4e 54 5f 4c 45 3a 0a 09 09 09 09  STRAINT_LE:.....
12d40 20 20 69 66 20 28 70 72 6f 70 2d 3e 64 62 6c 5f    if (prop->dbl_
12d50 76 61 6c 75 65 20 3c 3d 20 70 43 2d 3e 69 6e 74  value <= pC->int
12d60 56 61 6c 75 65 29 0a 09 09 09 09 20 20 20 20 20  Value).....     
12d70 20 6f 6b 20 3d 20 31 3b 0a 09 09 09 09 20 20 62   ok = 1;.....  b
12d80 72 65 61 6b 3b 0a 09 09 09 20 20 20 20 20 20 63  reak;....      c
12d90 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 44 45 58  ase SQLITE_INDEX
12da0 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54 3a 0a  _CONSTRAINT_LT:.
12db0 09 09 09 09 20 20 69 66 20 28 70 72 6f 70 2d 3e  ....  if (prop->
12dc0 64 62 6c 5f 76 61 6c 75 65 20 3c 20 70 43 2d 3e  dbl_value < pC->
12dd0 69 6e 74 56 61 6c 75 65 29 0a 09 09 09 09 20 20  intValue).....  
12de0 20 20 20 20 6f 6b 20 3d 20 31 3b 0a 09 09 09 09      ok = 1;.....
12df0 20 20 62 72 65 61 6b 3b 0a 09 09 09 20 20 20 20    break;....    
12e00 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e    case SQLITE_IN
12e10 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47  DEX_CONSTRAINT_G
12e20 45 3a 0a 09 09 09 09 20 20 69 66 20 28 70 72 6f  E:.....  if (pro
12e30 70 2d 3e 64 62 6c 5f 76 61 6c 75 65 20 3e 3d 20  p->dbl_value >= 
12e40 70 43 2d 3e 69 6e 74 56 61 6c 75 65 29 0a 09 09  pC->intValue)...
12e50 09 09 20 20 20 20 20 20 6f 6b 20 3d 20 31 3b 0a  ..      ok = 1;.
12e60 09 09 09 09 20 20 62 72 65 61 6b 3b 0a 09 09 09  ....  break;....
12e70 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
12e80 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
12e90 4e 54 5f 4e 45 3a 0a 09 09 09 09 20 20 69 66 20  NT_NE:.....  if 
12ea0 28 70 72 6f 70 2d 3e 64 62 6c 5f 76 61 6c 75 65  (prop->dbl_value
12eb0 20 21 3d 20 70 43 2d 3e 69 6e 74 56 61 6c 75 65   != pC->intValue
12ec0 29 0a 09 09 09 09 20 20 20 20 20 20 6f 6b 20 3d  ).....      ok =
12ed0 20 31 3b 0a 09 09 09 09 20 20 62 72 65 61 6b 3b   1;.....  break;
12ee0 0a 09 09 09 20 20 20 20 20 20 7d 3b 0a 09 09 09  ....      };....
12ef0 7d 0a 09 09 20 20 20 20 20 20 69 66 20 28 70 43  }...      if (pC
12f00 2d 3e 76 61 6c 75 65 54 79 70 65 20 3d 3d 20 27  ->valueType == '
12f10 44 27 29 0a 09 09 09 7b 0a 09 09 09 20 20 20 20  D')....{....    
12f20 73 77 69 74 63 68 20 28 70 43 2d 3e 6f 70 29 0a  switch (pC->op).
12f30 09 09 09 20 20 20 20 20 20 7b 0a 09 09 09 20 20  ...      {....  
12f40 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
12f50 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
12f60 5f 45 51 3a 0a 09 09 09 09 20 20 69 66 20 28 70  _EQ:.....  if (p
12f70 72 6f 70 2d 3e 64 62 6c 5f 76 61 6c 75 65 20 3d  rop->dbl_value =
12f80 3d 20 70 43 2d 3e 64 62 6c 56 61 6c 75 65 29 0a  = pC->dblValue).
12f90 09 09 09 09 20 20 20 20 20 20 6f 6b 20 3d 20 31  ....      ok = 1
12fa0 3b 0a 09 09 09 09 20 20 62 72 65 61 6b 3b 0a 09  ;.....  break;..
12fb0 09 09 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ..      case SQL
12fc0 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
12fd0 41 49 4e 54 5f 47 54 3a 0a 09 09 09 09 20 20 69  AINT_GT:.....  i
12fe0 66 20 28 70 72 6f 70 2d 3e 64 62 6c 5f 76 61 6c  f (prop->dbl_val
12ff0 75 65 20 3e 20 70 43 2d 3e 64 62 6c 56 61 6c 75  ue > pC->dblValu
13000 65 29 0a 09 09 09 09 20 20 20 20 20 20 6f 6b 20  e).....      ok 
13010 3d 20 31 3b 0a 09 09 09 09 20 20 62 72 65 61 6b  = 1;.....  break
13020 3b 0a 09 09 09 20 20 20 20 20 20 63 61 73 65 20  ;....      case 
13030 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
13040 53 54 52 41 49 4e 54 5f 4c 45 3a 0a 09 09 09 09  STRAINT_LE:.....
13050 20 20 69 66 20 28 70 72 6f 70 2d 3e 64 62 6c 5f    if (prop->dbl_
13060 76 61 6c 75 65 20 3c 3d 20 70 43 2d 3e 64 62 6c  value <= pC->dbl
13070 56 61 6c 75 65 29 0a 09 09 09 09 20 20 20 20 20  Value).....     
13080 20 6f 6b 20 3d 20 31 3b 0a 09 09 09 09 20 20 62   ok = 1;.....  b
13090 72 65 61 6b 3b 0a 09 09 09 20 20 20 20 20 20 63  reak;....      c
130a0 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 44 45 58  ase SQLITE_INDEX
130b0 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54 3a 0a  _CONSTRAINT_LT:.
130c0 09 09 09 09 20 20 69 66 20 28 70 72 6f 70 2d 3e  ....  if (prop->
130d0 64 62 6c 5f 76 61 6c 75 65 20 3c 20 70 43 2d 3e  dbl_value < pC->
130e0 64 62 6c 56 61 6c 75 65 29 0a 09 09 09 09 20 20  dblValue).....  
130f0 20 20 20 20 6f 6b 20 3d 20 31 3b 0a 09 09 09 09      ok = 1;.....
13100 20 20 62 72 65 61 6b 3b 0a 09 09 09 20 20 20 20    break;....    
13110 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e    case SQLITE_IN
13120 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47  DEX_CONSTRAINT_G
13130 45 3a 0a 09 09 09 09 20 20 69 66 20 28 70 72 6f  E:.....  if (pro
13140 70 2d 3e 64 62 6c 5f 76 61 6c 75 65 20 3e 3d 20  p->dbl_value >= 
13150 70 43 2d 3e 64 62 6c 56 61 6c 75 65 29 0a 09 09  pC->dblValue)...
13160 09 09 20 20 20 20 20 20 6f 6b 20 3d 20 31 3b 0a  ..      ok = 1;.
13170 09 09 09 09 20 20 62 72 65 61 6b 3b 0a 09 09 09  ....  break;....
13180 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
13190 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
131a0 4e 54 5f 4e 45 3a 0a 09 09 09 09 20 20 69 66 20  NT_NE:.....  if 
131b0 28 70 72 6f 70 2d 3e 64 62 6c 5f 76 61 6c 75 65  (prop->dbl_value
131c0 20 21 3d 20 70 43 2d 3e 64 62 6c 56 61 6c 75 65   != pC->dblValue
131d0 29 0a 09 09 09 09 20 20 20 20 20 20 6f 6b 20 3d  ).....      ok =
131e0 20 31 3b 0a 09 09 09 09 20 20 62 72 65 61 6b 3b   1;.....  break;
131f0 0a 09 09 09 20 20 20 20 20 20 7d 0a 09 09 09 7d  ....      }....}
13200 0a 09 09 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ...      break;.
13210 09 09 20 20 63 61 73 65 20 47 45 4f 4a 53 4f 4e  ..  case GEOJSON
13220 5f 54 45 58 54 3a 0a 09 09 20 20 20 20 20 20 69  _TEXT:...      i
13230 66 20 28 70 43 2d 3e 76 61 6c 75 65 54 79 70 65  f (pC->valueType
13240 20 3d 3d 20 27 54 27 20 26 26 20 70 43 2d 3e 74   == 'T' && pC->t
13250 78 74 56 61 6c 75 65 29 0a 09 09 09 7b 0a 09 09  xtValue)....{...
13260 09 20 20 20 20 69 6e 74 20 72 65 74 3b 0a 09 09  .    int ret;...
13270 09 20 20 20 20 72 65 74 20 3d 20 73 74 72 63 6d  .    ret = strcm
13280 70 20 28 70 72 6f 70 2d 3e 74 78 74 5f 76 61 6c  p (prop->txt_val
13290 75 65 2c 20 70 43 2d 3e 74 78 74 56 61 6c 75 65  ue, pC->txtValue
132a0 29 3b 0a 09 09 09 20 20 20 20 73 77 69 74 63 68  );....    switch
132b0 20 28 70 43 2d 3e 6f 70 29 0a 09 09 09 20 20 20   (pC->op)....   
132c0 20 20 20 7b 0a 09 09 09 20 20 20 20 20 20 63 61     {....      ca
132d0 73 65 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  se SQLITE_INDEX_
132e0 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 3a 0a 09  CONSTRAINT_EQ:..
132f0 09 09 09 20 20 69 66 20 28 72 65 74 20 3d 3d 20  ...  if (ret == 
13300 30 29 0a 09 09 09 09 20 20 20 20 20 20 6f 6b 20  0).....      ok 
13310 3d 20 31 3b 0a 09 09 09 09 20 20 62 72 65 61 6b  = 1;.....  break
13320 3b 0a 09 09 09 20 20 20 20 20 20 63 61 73 65 20  ;....      case 
13330 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
13340 53 54 52 41 49 4e 54 5f 47 54 3a 0a 09 09 09 09  STRAINT_GT:.....
13350 20 20 69 66 20 28 72 65 74 20 3e 20 30 29 0a 09    if (ret > 0)..
13360 09 09 09 20 20 20 20 20 20 6f 6b 20 3d 20 31 3b  ...      ok = 1;
13370 0a 09 09 09 09 20 20 62 72 65 61 6b 3b 0a 09 09  .....  break;...
13380 09 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
13390 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
133a0 49 4e 54 5f 4c 45 3a 0a 09 09 09 09 20 20 69 66  INT_LE:.....  if
133b0 20 28 72 65 74 20 3c 3d 20 30 29 0a 09 09 09 09   (ret <= 0).....
133c0 20 20 20 20 20 20 6f 6b 20 3d 20 31 3b 0a 09 09        ok = 1;...
133d0 09 09 20 20 62 72 65 61 6b 3b 0a 09 09 09 20 20  ..  break;....  
133e0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
133f0 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
13400 5f 4c 54 3a 0a 09 09 09 09 20 20 69 66 20 28 72  _LT:.....  if (r
13410 65 74 20 3c 20 30 29 0a 09 09 09 09 20 20 20 20  et < 0).....    
13420 20 20 6f 6b 20 3d 20 31 3b 0a 09 09 09 09 20 20    ok = 1;.....  
13430 62 72 65 61 6b 3b 0a 09 09 09 20 20 20 20 20 20  break;....      
13440 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 44 45  case SQLITE_INDE
13450 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 45 3a  X_CONSTRAINT_GE:
13460 0a 09 09 09 09 20 20 69 66 20 28 72 65 74 20 3e  .....  if (ret >
13470 3d 20 30 29 0a 09 09 09 09 20 20 20 20 20 20 6f  = 0).....      o
13480 6b 20 3d 20 31 3b 0a 09 09 09 09 20 20 62 72 65  k = 1;.....  bre
13490 61 6b 3b 0a 09 09 09 20 20 20 20 20 20 63 61 73  ak;....      cas
134a0 65 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  e SQLITE_INDEX_C
134b0 4f 4e 53 54 52 41 49 4e 54 5f 4e 45 3a 0a 09 09  ONSTRAINT_NE:...
134c0 09 09 20 20 69 66 20 28 72 65 74 20 21 3d 20 30  ..  if (ret != 0
134d0 29 0a 09 09 09 09 20 20 20 20 20 20 6f 6b 20 3d  ).....      ok =
134e0 20 31 3b 0a 09 09 09 09 20 20 62 72 65 61 6b 3b   1;.....  break;
134f0 0a 23 69 66 64 65 66 20 48 41 56 45 5f 44 45 43  .#ifdef HAVE_DEC
13500 4c 5f 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  L_SQLITE_INDEX_C
13510 4f 4e 53 54 52 41 49 4e 54 5f 4c 49 4b 45 0a 09  ONSTRAINT_LIKE..
13520 09 09 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ..      case SQL
13530 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
13540 41 49 4e 54 5f 4c 49 4b 45 3a 0a 09 09 09 09 20  AINT_LIKE:..... 
13550 20 72 65 74 20 3d 0a 09 09 09 09 20 20 20 20 20   ret =.....     
13560 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65   sqlite3_strlike
13570 20 28 70 43 2d 3e 74 78 74 56 61 6c 75 65 2c 0a   (pC->txtValue,.
13580 09 09 09 09 09 09 20 20 20 20 20 20 20 70 72 6f  ......       pro
13590 70 2d 3e 74 78 74 5f 76 61 6c 75 65 2c 20 30 29  p->txt_value, 0)
135a0 3b 0a 09 09 09 09 20 20 69 66 20 28 72 65 74 20  ;.....  if (ret 
135b0 3d 3d 20 30 29 0a 09 09 09 09 20 20 20 20 20 20  == 0).....      
135c0 6f 6b 20 3d 20 31 3b 0a 09 09 09 09 20 20 62 72  ok = 1;.....  br
135d0 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 09 09 20  eak;.#endif.... 
135e0 20 20 20 20 20 7d 3b 0a 09 09 09 7d 0a 09 09 20       };....}... 
135f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 09 09 20 20       break;...  
13600 7d 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20  };...break;..   
13610 20 7d 0a 09 64 6f 6e 65 3a 0a 09 20 20 69 66 20   }..done:..  if 
13620 28 21 6f 6b 29 0a 09 20 20 20 20 20 20 72 65 74  (!ok)..      ret
13630 75 72 6e 20 30 3b 0a 09 20 20 70 43 20 3d 20 70  urn 0;..  pC = p
13640 43 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 20 20 7d  C->next;.      }
13650 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  .    return 1;.}
13660 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 76 67 65  ..static int.vge
13670 6f 6a 73 6f 6e 5f 66 69 6c 74 65 72 20 28 73 71  ojson_filter (sq
13680 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
13690 72 20 2a 20 70 43 75 72 73 6f 72 2c 20 69 6e 74  r * pCursor, int
136a0 20 69 64 78 4e 75 6d 2c 20 63 6f 6e 73 74 20 63   idxNum, const c
136b0 68 61 72 20 2a 69 64 78 53 74 72 2c 0a 09 09 20  har *idxStr,... 
136c0 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
136d0 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29  3_value ** argv)
136e0 0a 7b 0a 2f 2a 20 73 65 74 74 69 6e 67 20 75 70  .{./* setting up
136f0 20 61 20 63 75 72 73 6f 72 20 66 69 6c 74 65 72   a cursor filter
13700 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   */.    int i;. 
13710 20 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 0a     int iColumn;.
13720 20 20 20 20 69 6e 74 20 6f 70 3b 0a 20 20 20 20      int op;.    
13730 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 56 69 72  int len;.    Vir
13740 74 75 61 6c 47 65 6f 4a 73 6f 6e 43 6f 6e 73 74  tualGeoJsonConst
13750 72 61 69 6e 74 50 74 72 20 70 43 3b 0a 20 20 20  raintPtr pC;.   
13760 20 56 69 72 74 75 61 6c 47 65 6f 4a 73 6f 6e 43   VirtualGeoJsonC
13770 75 72 73 6f 72 50 74 72 20 63 75 72 73 6f 72 20  ursorPtr cursor 
13780 3d 20 28 56 69 72 74 75 61 6c 47 65 6f 4a 73 6f  = (VirtualGeoJso
13790 6e 43 75 72 73 6f 72 50 74 72 29 20 70 43 75 72  nCursorPtr) pCur
137a0 73 6f 72 3b 0a 20 20 20 20 69 66 20 28 69 64 78  sor;.    if (idx
137b0 4e 75 6d 29 0a 09 69 64 78 4e 75 6d 20 3d 20 69  Num)..idxNum = i
137c0 64 78 4e 75 6d 3b 09 2f 2a 20 75 6e 75 73 65 64  dxNum;./* unused
137d0 20 61 72 67 20 77 61 72 6e 69 6e 67 20 73 75 70   arg warning sup
137e0 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 0a 2f 2a 20  pression */../* 
137f0 72 65 73 65 74 74 69 6e 67 20 61 6e 79 20 70 72  resetting any pr
13800 65 76 69 6f 75 73 6c 79 20 73 65 74 20 66 69 6c  eviously set fil
13810 74 65 72 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  ter constraint *
13820 2f 0a 20 20 20 20 76 67 65 6f 6a 73 6f 6e 5f 66  /.    vgeojson_f
13830 72 65 65 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  ree_constraints 
13840 28 63 75 72 73 6f 72 29 3b 0a 0a 20 20 20 20 66  (cursor);..    f
13850 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 61  or (i = 0; i < a
13860 72 67 63 3b 20 69 2b 2b 29 0a 20 20 20 20 20 20  rgc; i++).      
13870 7b 0a 09 20 20 69 66 20 28 21 76 67 65 6f 6a 73  {..  if (!vgeojs
13880 6f 6e 5f 70 61 72 73 65 5f 63 6f 6e 73 74 72 61  on_parse_constra
13890 69 6e 74 20 28 69 64 78 53 74 72 2c 20 69 2c 20  int (idxStr, i, 
138a0 26 69 43 6f 6c 75 6d 6e 2c 20 26 6f 70 29 29 0a  &iColumn, &op)).
138b0 09 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
138c0 0a 09 20 20 70 43 20 3d 20 73 71 6c 69 74 65 33  ..  pC = sqlite3
138d0 5f 6d 61 6c 6c 6f 63 20 28 73 69 7a 65 6f 66 20  _malloc (sizeof 
138e0 28 56 69 72 74 75 61 6c 47 65 6f 4a 73 6f 6e 43  (VirtualGeoJsonC
138f0 6f 6e 73 74 72 61 69 6e 74 29 29 3b 0a 09 20 20  onstraint));..  
13900 69 66 20 28 21 70 43 29 0a 09 20 20 20 20 20 20  if (!pC)..      
13910 63 6f 6e 74 69 6e 75 65 3b 0a 09 20 20 70 43 2d  continue;..  pC-
13920 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 75  >iColumn = iColu
13930 6d 6e 3b 0a 09 20 20 70 43 2d 3e 6f 70 20 3d 20  mn;..  pC->op = 
13940 6f 70 3b 0a 09 20 20 70 43 2d 3e 76 61 6c 75 65  op;..  pC->value
13950 54 79 70 65 20 3d 20 27 5c 30 27 3b 0a 09 20 20  Type = '\0';..  
13960 70 43 2d 3e 74 78 74 56 61 6c 75 65 20 3d 20 4e  pC->txtValue = N
13970 55 4c 4c 3b 0a 09 20 20 70 43 2d 3e 6e 65 78 74  ULL;..  pC->next
13980 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 20 20 69 66 20   = NULL;...  if 
13990 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
139a0 79 70 65 20 28 61 72 67 76 5b 69 5d 29 20 3d 3d  ype (argv[i]) ==
139b0 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29   SQLITE_INTEGER)
139c0 0a 09 20 20 20 20 7b 0a 09 09 70 43 2d 3e 76 61  ..    {...pC->va
139d0 6c 75 65 54 79 70 65 20 3d 20 27 49 27 3b 0a 09  lueType = 'I';..
139e0 09 70 43 2d 3e 69 6e 74 56 61 6c 75 65 20 3d 20  .pC->intValue = 
139f0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
13a00 74 36 34 20 28 61 72 67 76 5b 69 5d 29 3b 0a 09  t64 (argv[i]);..
13a10 20 20 20 20 7d 0a 09 20 20 69 66 20 28 73 71 6c      }..  if (sql
13a20 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
13a30 28 61 72 67 76 5b 69 5d 29 20 3d 3d 20 53 51 4c  (argv[i]) == SQL
13a40 49 54 45 5f 46 4c 4f 41 54 29 0a 09 20 20 20 20  ITE_FLOAT)..    
13a50 7b 0a 09 09 70 43 2d 3e 76 61 6c 75 65 54 79 70  {...pC->valueTyp
13a60 65 20 3d 20 27 44 27 3b 0a 09 09 70 43 2d 3e 64  e = 'D';...pC->d
13a70 62 6c 56 61 6c 75 65 20 3d 20 73 71 6c 69 74 65  blValue = sqlite
13a80 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 20 28  3_value_double (
13a90 61 72 67 76 5b 69 5d 29 3b 0a 09 20 20 20 20 7d  argv[i]);..    }
13aa0 0a 09 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f  ..  if (sqlite3_
13ab0 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
13ac0 5b 69 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 54  [i]) == SQLITE_T
13ad0 45 58 54 29 0a 09 20 20 20 20 7b 0a 09 09 70 43  EXT)..    {...pC
13ae0 2d 3e 76 61 6c 75 65 54 79 70 65 20 3d 20 27 54  ->valueType = 'T
13af0 27 3b 0a 09 09 6c 65 6e 20 3d 20 73 71 6c 69 74  ';...len = sqlit
13b00 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28  e3_value_bytes (
13b10 61 72 67 76 5b 69 5d 29 20 2b 20 31 3b 0a 09 09  argv[i]) + 1;...
13b20 70 43 2d 3e 74 78 74 56 61 6c 75 65 20 3d 20 28  pC->txtValue = (
13b30 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f  char *) sqlite3_
13b40 6d 61 6c 6c 6f 63 20 28 6c 65 6e 29 3b 0a 09 09  malloc (len);...
13b50 69 66 20 28 70 43 2d 3e 74 78 74 56 61 6c 75 65  if (pC->txtValue
13b60 29 0a 09 09 20 20 20 20 73 74 72 63 70 79 20 28  )...    strcpy (
13b70 70 43 2d 3e 74 78 74 56 61 6c 75 65 2c 0a 09 09  pC->txtValue,...
13b80 09 20 20 20 20 28 63 68 61 72 20 2a 29 20 73 71  .    (char *) sq
13b90 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
13ba0 20 28 61 72 67 76 5b 69 5d 29 29 3b 0a 09 20 20   (argv[i]));..  
13bb0 20 20 7d 0a 09 20 20 69 66 20 28 63 75 72 73 6f    }..  if (curso
13bc0 72 2d 3e 66 69 72 73 74 43 6f 6e 73 74 72 61 69  r->firstConstrai
13bd0 6e 74 20 3d 3d 20 4e 55 4c 4c 29 0a 09 20 20 20  nt == NULL)..   
13be0 20 20 20 63 75 72 73 6f 72 2d 3e 66 69 72 73 74     cursor->first
13bf0 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 43 3b  Constraint = pC;
13c00 0a 09 20 20 69 66 20 28 63 75 72 73 6f 72 2d 3e  ..  if (cursor->
13c10 6c 61 73 74 43 6f 6e 73 74 72 61 69 6e 74 20 21  lastConstraint !
13c20 3d 20 4e 55 4c 4c 29 0a 09 20 20 20 20 20 20 63  = NULL)..      c
13c30 75 72 73 6f 72 2d 3e 6c 61 73 74 43 6f 6e 73 74  ursor->lastConst
13c40 72 61 69 6e 74 2d 3e 6e 65 78 74 20 3d 20 70 43  raint->next = pC
13c50 3b 0a 09 20 20 63 75 72 73 6f 72 2d 3e 6c 61 73  ;..  cursor->las
13c60 74 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 43  tConstraint = pC
13c70 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 63  ;.      }..    c
13c80 75 72 73 6f 72 2d 3e 63 75 72 72 65 6e 74 5f 66  ursor->current_f
13c90 69 64 20 3d 20 30 3b 0a 20 20 20 20 63 75 72 73  id = 0;.    curs
13ca0 6f 72 2d 3e 65 6f 66 20 3d 20 30 3b 0a 20 20 20  or->eof = 0;.   
13cb0 20 77 68 69 6c 65 20 28 31 29 0a 20 20 20 20 20   while (1).     
13cc0 20 7b 0a 09 20 20 76 67 65 6f 6a 73 6f 6e 5f 72   {..  vgeojson_r
13cd0 65 61 64 5f 72 6f 77 20 28 63 75 72 73 6f 72 29  ead_row (cursor)
13ce0 3b 0a 09 20 20 69 66 20 28 63 75 72 73 6f 72 2d  ;..  if (cursor-
13cf0 3e 65 6f 66 29 0a 09 20 20 20 20 20 20 62 72 65  >eof)..      bre
13d00 61 6b 3b 0a 09 20 20 69 66 20 28 76 67 65 6f 6a  ak;..  if (vgeoj
13d10 73 6f 6e 5f 65 76 61 6c 5f 63 6f 6e 73 74 72 61  son_eval_constra
13d20 69 6e 74 73 20 28 63 75 72 73 6f 72 29 29 0a 09  ints (cursor))..
13d30 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 09 20 20        break;..  
13d40 63 75 72 73 6f 72 2d 3e 63 75 72 72 65 6e 74 5f  cursor->current_
13d50 66 69 64 20 2b 3d 20 31 3b 0a 20 20 20 20 20 20  fid += 1;.      
13d60 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  }.    return SQL
13d70 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69  ITE_OK;.}..stati
13d80 63 20 69 6e 74 0a 76 67 65 6f 6a 73 6f 6e 5f 6e  c int.vgeojson_n
13d90 65 78 74 20 28 73 71 6c 69 74 65 33 5f 76 74 61  ext (sqlite3_vta
13da0 62 5f 63 75 72 73 6f 72 20 2a 20 70 43 75 72 73  b_cursor * pCurs
13db0 6f 72 29 0a 7b 0a 2f 2a 20 66 65 74 63 68 69 6e  or).{./* fetchin
13dc0 67 20 61 20 6e 65 78 74 20 72 6f 77 20 66 72 6f  g a next row fro
13dd0 6d 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 20 20  m cursor */.    
13de0 56 69 72 74 75 61 6c 47 65 6f 4a 73 6f 6e 43 75  VirtualGeoJsonCu
13df0 72 73 6f 72 50 74 72 20 63 75 72 73 6f 72 20 3d  rsorPtr cursor =
13e00 20 28 56 69 72 74 75 61 6c 47 65 6f 4a 73 6f 6e   (VirtualGeoJson
13e10 43 75 72 73 6f 72 50 74 72 29 20 70 43 75 72 73  CursorPtr) pCurs
13e20 6f 72 3b 0a 20 20 20 20 63 75 72 73 6f 72 2d 3e  or;.    cursor->
13e30 63 75 72 72 65 6e 74 5f 66 69 64 20 2b 3d 20 31  current_fid += 1
13e40 3b 0a 20 20 20 20 77 68 69 6c 65 20 28 31 29 0a  ;.    while (1).
13e50 20 20 20 20 20 20 7b 0a 09 20 20 76 67 65 6f 6a        {..  vgeoj
13e60 73 6f 6e 5f 72 65 61 64 5f 72 6f 77 20 28 63 75  son_read_row (cu
13e70 72 73 6f 72 29 3b 0a 09 20 20 69 66 20 28 63 75  rsor);..  if (cu
13e80 72 73 6f 72 2d 3e 65 6f 66 29 0a 09 20 20 20 20  rsor->eof)..    
13e90 20 20 62 72 65 61 6b 3b 0a 09 20 20 69 66 20 28    break;..  if (
13ea0 76 67 65 6f 6a 73 6f 6e 5f 65 76 61 6c 5f 63 6f  vgeojson_eval_co
13eb0 6e 73 74 72 61 69 6e 74 73 20 28 63 75 72 73 6f  nstraints (curso
13ec0 72 29 29 0a 09 20 20 20 20 20 20 62 72 65 61 6b  r))..      break
13ed0 3b 0a 09 20 20 63 75 72 73 6f 72 2d 3e 63 75 72  ;..  cursor->cur
13ee0 72 65 6e 74 5f 66 69 64 20 2b 3d 20 31 3b 0a 20  rent_fid += 1;. 
13ef0 20 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72       }.    retur
13f00 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
13f10 73 74 61 74 69 63 20 69 6e 74 0a 76 67 65 6f 6a  static int.vgeoj
13f20 73 6f 6e 5f 65 6f 66 20 28 73 71 6c 69 74 65 33  son_eof (sqlite3
13f30 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 20 70  _vtab_cursor * p
13f40 43 75 72 73 6f 72 29 0a 7b 0a 2f 2a 20 63 75 72  Cursor).{./* cur
13f50 73 6f 72 20 45 4f 46 20 2a 2f 0a 20 20 20 20 56  sor EOF */.    V
13f60 69 72 74 75 61 6c 47 65 6f 4a 73 6f 6e 43 75 72  irtualGeoJsonCur
13f70 73 6f 72 50 74 72 20 63 75 72 73 6f 72 20 3d 20  sorPtr cursor = 
13f80 28 56 69 72 74 75 61 6c 47 65 6f 4a 73 6f 6e 43  (VirtualGeoJsonC
13f90 75 72 73 6f 72 50 74 72 29 20 70 43 75 72 73 6f  ursorPtr) pCurso
13fa0 72 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 63 75  r;.    return cu
13fb0 72 73 6f 72 2d 3e 65 6f 66 3b 0a 7d 0a 0a 73 74  rsor->eof;.}..st
13fc0 61 74 69 63 20 67 61 69 61 47 65 6f 6d 43 6f 6c  atic gaiaGeomCol
13fd0 6c 50 74 72 0a 76 67 65 6f 6a 73 6f 6e 5f 67 65  lPtr.vgeojson_ge
13fe0 74 5f 67 65 6f 6d 65 74 72 79 20 28 56 69 72 74  t_geometry (Virt
13ff0 75 61 6c 47 65 6f 4a 73 6f 6e 43 75 72 73 6f 72  ualGeoJsonCursor
14000 50 74 72 20 63 75 72 73 6f 72 29 0a 7b 0a 2f 2a  Ptr cursor).{./*
14010 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72   attempting to r
14020 65 74 75 72 6e 20 61 20 6e 6f 72 6d 61 6c 69 7a  eturn a normaliz
14030 65 64 20 47 65 6f 4a 53 4f 4e 20 67 65 6f 6d 65  ed GeoJSON geome
14040 74 72 79 20 2a 2f 0a 20 20 20 20 67 61 69 61 47  try */.    gaiaG
14050 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 6d 3b  eomCollPtr geom;
14060 0a 20 20 20 20 69 66 20 28 63 75 72 73 6f 72 20  .    if (cursor 
14070 3d 3d 20 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e  == NULL)..return
14080 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63   NULL;.    if (c
14090 75 72 73 6f 72 2d 3e 46 65 61 74 75 72 65 20 3d  ursor->Feature =
140a0 3d 20 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 20  = NULL)..return 
140b0 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 75  NULL;.    if (cu
140c0 72 73 6f 72 2d 3e 46 65 61 74 75 72 65 2d 3e 67  rsor->Feature->g
140d0 65 6f 6d 65 74 72 79 20 3d 3d 20 4e 55 4c 4c 29  eometry == NULL)
140e0 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 0a  ..return NULL;..
140f0 20 20 20 20 67 65 6f 6d 20 3d 0a 09 67 61 69 61      geom =..gaia
14100 50 61 72 73 65 47 65 6f 4a 53 4f 4e 20 28 28 63  ParseGeoJSON ((c
14110 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
14120 61 72 20 2a 29 20 28 63 75 72 73 6f 72 2d 3e 46  ar *) (cursor->F
14130 65 61 74 75 72 65 2d 3e 67 65 6f 6d 65 74 72 79  eature->geometry
14140 29 29 3b 0a 20 20 20 20 69 66 20 28 67 65 6f 6d  ));.    if (geom
14150 20 3d 3d 20 4e 55 4c 4c 29 0a 09 72 65 74 75 72   == NULL)..retur
14160 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 65 6f 6d  n NULL;.    geom
14170 2d 3e 53 72 69 64 20 3d 20 63 75 72 73 6f 72 2d  ->Srid = cursor-
14180 3e 70 56 74 61 62 2d 3e 53 72 69 64 3b 0a 20 20  >pVtab->Srid;.  
14190 20 20 67 65 6f 6d 2d 3e 44 65 63 6c 61 72 65 64    geom->Declared
141a0 54 79 70 65 20 3d 20 63 75 72 73 6f 72 2d 3e 70  Type = cursor->p
141b0 56 74 61 62 2d 3e 44 65 63 6c 61 72 65 64 54 79  Vtab->DeclaredTy
141c0 70 65 3b 0a 20 20 20 20 69 66 20 28 63 75 72 73  pe;.    if (curs
141d0 6f 72 2d 3e 70 56 74 61 62 2d 3e 44 69 6d 65 6e  or->pVtab->Dimen
141e0 73 69 6f 6e 4d 6f 64 65 6c 20 21 3d 20 67 65 6f  sionModel != geo
141f0 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65  m->DimensionMode
14200 6c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a  l).      {..  /*
14210 20 6e 6f 72 6d 61 6c 69 7a 69 6e 67 20 44 69 6d   normalizing Dim
14220 65 6e 73 69 6f 6e 73 20 2a 2f 0a 09 20 20 67 61  ensions */..  ga
14230 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 32  iaGeomCollPtr g2
14240 3b 0a 09 20 20 73 77 69 74 63 68 20 28 63 75 72  ;..  switch (cur
14250 73 6f 72 2d 3e 70 56 74 61 62 2d 3e 44 69 6d 65  sor->pVtab->Dime
14260 6e 73 69 6f 6e 4d 6f 64 65 6c 29 0a 09 20 20 20  nsionModel)..   
14270 20 7b 0a 09 20 20 20 20 63 61 73 65 20 47 41 49   {..    case GAI
14280 41 5f 58 59 5f 5a 5f 4d 3a 0a 09 09 67 32 20 3d  A_XY_Z_M:...g2 =
14290 20 67 61 69 61 43 61 73 74 47 65 6f 6d 43 6f 6c   gaiaCastGeomCol
142a0 6c 54 6f 58 59 5a 4d 20 28 67 65 6f 6d 29 3b 0a  lToXYZM (geom);.
142b0 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61  ..break;..    ca
142c0 73 65 20 47 41 49 41 5f 58 59 5f 5a 3a 0a 09 09  se GAIA_XY_Z:...
142d0 67 32 20 3d 20 67 61 69 61 43 61 73 74 47 65 6f  g2 = gaiaCastGeo
142e0 6d 43 6f 6c 6c 54 6f 58 59 5a 20 28 67 65 6f 6d  mCollToXYZ (geom
142f0 29 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20  );...break;..   
14300 20 63 61 73 65 20 47 41 49 41 5f 58 59 5f 4d 3a   case GAIA_XY_M:
14310 0a 09 09 67 32 20 3d 20 67 61 69 61 43 61 73 74  ...g2 = gaiaCast
14320 47 65 6f 6d 43 6f 6c 6c 54 6f 58 59 4d 20 28 67  GeomCollToXYM (g
14330 65 6f 6d 29 3b 0a 09 09 62 72 65 61 6b 3b 0a 09  eom);...break;..
14340 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 58 59      case GAIA_XY
14350 3a 0a 09 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  :..    default:.
14360 09 09 67 32 20 3d 20 67 61 69 61 43 61 73 74 47  ..g2 = gaiaCastG
14370 65 6f 6d 43 6f 6c 6c 54 6f 58 59 20 28 67 65 6f  eomCollToXY (geo
14380 6d 29 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20  m);...break;..  
14390 20 20 7d 3b 0a 09 20 20 67 61 69 61 46 72 65 65    };..  gaiaFree
143a0 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 6d 29 3b  GeomColl (geom);
143b0 0a 09 20 20 67 65 6f 6d 20 3d 20 67 32 3b 0a 20  ..  geom = g2;. 
143c0 20 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72       }.    retur
143d0 6e 20 67 65 6f 6d 3b 0a 7d 0a 0a 73 74 61 74 69  n geom;.}..stati
143e0 63 20 69 6e 74 0a 76 67 65 6f 6a 73 6f 6e 5f 63  c int.vgeojson_c
143f0 6f 6c 75 6d 6e 20 28 73 71 6c 69 74 65 33 5f 76  olumn (sqlite3_v
14400 74 61 62 5f 63 75 72 73 6f 72 20 2a 20 70 43 75  tab_cursor * pCu
14410 72 73 6f 72 2c 20 73 71 6c 69 74 65 33 5f 63 6f  rsor, sqlite3_co
14420 6e 74 65 78 74 20 2a 20 70 43 6f 6e 74 65 78 74  ntext * pContext
14430 2c 0a 09 09 20 69 6e 74 20 63 6f 6c 75 6d 6e 29  ,... int column)
14440 0a 7b 0a 2f 2a 20 66 65 74 63 68 69 6e 67 20 76  .{./* fetching v
14450 61 6c 75 65 20 66 6f 72 20 74 68 65 20 4e 74 68  alue for the Nth
14460 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 20 20 67   column */.    g
14470 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67  aiaGeomCollPtr g
14480 65 6f 6d 3b 0a 20 20 20 20 67 65 6f 6a 73 6f 6e  eom;.    geojson
14490 5f 70 72 6f 70 65 72 74 79 5f 70 74 72 20 70 72  _property_ptr pr
144a0 6f 70 3b 0a 20 20 20 20 56 69 72 74 75 61 6c 47  op;.    VirtualG
144b0 65 6f 4a 73 6f 6e 43 75 72 73 6f 72 50 74 72 20  eoJsonCursorPtr 
144c0 63 75 72 73 6f 72 20 3d 20 28 56 69 72 74 75 61  cursor = (Virtua
144d0 6c 47 65 6f 4a 73 6f 6e 43 75 72 73 6f 72 50 74  lGeoJsonCursorPt
144e0 72 29 20 70 43 75 72 73 6f 72 3b 0a 20 20 20 20  r) pCursor;.    
144f0 69 66 20 28 63 6f 6c 75 6d 6e 20 3d 3d 20 30 29  if (column == 0)
14500 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 74  .      {..  /* t
14510 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  he PRIMARY KEY c
14520 6f 6c 75 6d 6e 20 2a 2f 0a 09 20 20 73 71 6c 69  olumn */..  sqli
14530 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28  te3_result_int (
14540 70 43 6f 6e 74 65 78 74 2c 20 63 75 72 73 6f 72  pContext, cursor
14550 2d 3e 63 75 72 72 65 6e 74 5f 66 69 64 29 3b 0a  ->current_fid);.
14560 09 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
14570 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
14580 20 69 66 20 28 63 6f 6c 75 6d 6e 20 3d 3d 20 31   if (column == 1
14590 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20  ).      {..  /* 
145a0 74 68 65 20 47 45 4f 4d 45 54 52 59 20 63 6f 6c  the GEOMETRY col
145b0 75 6d 6e 20 2a 2f 0a 09 20 20 67 65 6f 6d 20 3d  umn */..  geom =
145c0 20 76 67 65 6f 6a 73 6f 6e 5f 67 65 74 5f 67 65   vgeojson_get_ge
145d0 6f 6d 65 74 72 79 20 28 63 75 72 73 6f 72 29 3b  ometry (cursor);
145e0 0a 09 20 20 69 66 20 28 67 65 6f 6d 29 0a 09 20  ..  if (geom).. 
145f0 20 20 20 7b 0a 09 09 75 6e 73 69 67 6e 65 64 20     {...unsigned 
14600 63 68 61 72 20 2a 62 6c 6f 62 3b 0a 09 09 69 6e  char *blob;...in
14610 74 20 62 6c 6f 62 53 69 7a 65 3b 0a 09 09 67 61  t blobSize;...ga
14620 69 61 54 6f 53 70 61 74 69 61 4c 69 74 65 42 6c  iaToSpatiaLiteBl
14630 6f 62 57 6b 62 20 28 67 65 6f 6d 2c 20 26 62 6c  obWkb (geom, &bl
14640 6f 62 2c 20 26 62 6c 6f 62 53 69 7a 65 29 3b 0a  ob, &blobSize);.
14650 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
14660 5f 62 6c 6f 62 20 28 70 43 6f 6e 74 65 78 74 2c  _blob (pContext,
14670 20 62 6c 6f 62 2c 20 62 6c 6f 62 53 69 7a 65 2c   blob, blobSize,
14680 20 66 72 65 65 29 3b 0a 09 09 67 61 69 61 46 72   free);...gaiaFr
14690 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 6d  eeGeomColl (geom
146a0 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73  );..    }..  els
146b0 65 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65 33  e..      sqlite3
146c0 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 70 43  _result_null (pC
146d0 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75  ontext);..  retu
146e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
146f0 20 20 20 20 7d 0a 20 20 20 20 70 72 6f 70 20 3d      }.    prop =
14700 20 76 67 65 6f 6a 73 6f 6e 5f 67 65 74 5f 70 72   vgeojson_get_pr
14710 6f 70 65 72 74 79 5f 62 79 5f 63 6f 6c 20 28 63  operty_by_col (c
14720 75 72 73 6f 72 2c 20 63 6f 6c 75 6d 6e 20 2d 20  ursor, column - 
14730 32 29 3b 0a 20 20 20 20 69 66 20 28 70 72 6f 70  2);.    if (prop
14740 20 3d 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20   == NULL).      
14750 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  {..  sqlite3_res
14760 75 6c 74 5f 6e 75 6c 6c 20 28 70 43 6f 6e 74 65  ult_null (pConte
14770 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 20 53  xt);..  return S
14780 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
14790 7d 0a 20 20 20 20 73 77 69 74 63 68 20 28 70 72  }.    switch (pr
147a0 6f 70 2d 3e 74 79 70 65 29 0a 20 20 20 20 20 20  op->type).      
147b0 7b 0a 20 20 20 20 20 20 63 61 73 65 20 47 45 4f  {.      case GEO
147c0 4a 53 4f 4e 5f 54 52 55 45 3a 0a 09 20 20 73 71  JSON_TRUE:..  sq
147d0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
147e0 20 28 70 43 6f 6e 74 65 78 74 2c 20 31 29 3b 0a   (pContext, 1);.
147f0 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  .  break;.      
14800 63 61 73 65 20 47 45 4f 4a 53 4f 4e 5f 46 41 4c  case GEOJSON_FAL
14810 53 45 3a 0a 09 20 20 73 71 6c 69 74 65 33 5f 72  SE:..  sqlite3_r
14820 65 73 75 6c 74 5f 69 6e 74 20 28 70 43 6f 6e 74  esult_int (pCont
14830 65 78 74 2c 20 30 29 3b 0a 09 20 20 62 72 65 61  ext, 0);..  brea
14840 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 47 45  k;.      case GE
14850 4f 4a 53 4f 4e 5f 49 4e 54 45 47 45 52 3a 0a 09  OJSON_INTEGER:..
14860 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
14870 5f 69 6e 74 36 34 20 28 70 43 6f 6e 74 65 78 74  _int64 (pContext
14880 2c 20 70 72 6f 70 2d 3e 69 6e 74 5f 76 61 6c 75  , prop->int_valu
14890 65 29 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20  e);..  break;.  
148a0 20 20 20 20 63 61 73 65 20 47 45 4f 4a 53 4f 4e      case GEOJSON
148b0 5f 44 4f 55 42 4c 45 3a 0a 09 20 20 73 71 6c 69  _DOUBLE:..  sqli
148c0 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c  te3_result_doubl
148d0 65 20 28 70 43 6f 6e 74 65 78 74 2c 20 70 72 6f  e (pContext, pro
148e0 70 2d 3e 64 62 6c 5f 76 61 6c 75 65 29 3b 0a 09  p->dbl_value);..
148f0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
14900 61 73 65 20 47 45 4f 4a 53 4f 4e 5f 54 45 58 54  ase GEOJSON_TEXT
14910 3a 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  :..  sqlite3_res
14920 75 6c 74 5f 74 65 78 74 20 28 70 43 6f 6e 74 65  ult_text (pConte
14930 78 74 2c 20 70 72 6f 70 2d 3e 74 78 74 5f 76 61  xt, prop->txt_va
14940 6c 75 65 2c 0a 09 09 09 20 20 20 20 20 20 20 73  lue,....       s
14950 74 72 6c 65 6e 20 28 70 72 6f 70 2d 3e 74 78 74  trlen (prop->txt
14960 5f 76 61 6c 75 65 29 2c 20 53 51 4c 49 54 45 5f  _value), SQLITE_
14970 53 54 41 54 49 43 29 3b 0a 09 20 20 62 72 65 61  STATIC);..  brea
14980 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 47 45  k;.      case GE
14990 4f 4a 53 4f 4e 5f 4e 55 4c 4c 3a 0a 20 20 20 20  OJSON_NULL:.    
149a0 20 20 64 65 66 61 75 6c 74 3a 0a 09 20 20 73 71    default:..  sq
149b0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
149c0 6c 20 28 70 43 6f 6e 74 65 78 74 29 3b 0a 09 20  l (pContext);.. 
149d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 3b   break;.      };
149e0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
149f0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63  TE_OK;.}..static
14a00 20 69 6e 74 0a 76 67 65 6f 6a 73 6f 6e 5f 72 6f   int.vgeojson_ro
14a10 77 69 64 20 28 73 71 6c 69 74 65 33 5f 76 74 61  wid (sqlite3_vta
14a20 62 5f 63 75 72 73 6f 72 20 2a 20 70 43 75 72 73  b_cursor * pCurs
14a30 6f 72 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36 34  or, sqlite_int64
14a40 20 2a 20 70 52 6f 77 69 64 29 0a 7b 0a 2f 2a 20   * pRowid).{./* 
14a50 66 65 74 63 68 69 6e 67 20 74 68 65 20 52 4f 57  fetching the ROW
14a60 49 44 20 2a 2f 0a 20 20 20 20 56 69 72 74 75 61  ID */.    Virtua
14a70 6c 47 65 6f 4a 73 6f 6e 43 75 72 73 6f 72 50 74  lGeoJsonCursorPt
14a80 72 20 63 75 72 73 6f 72 20 3d 20 28 56 69 72 74  r cursor = (Virt
14a90 75 61 6c 47 65 6f 4a 73 6f 6e 43 75 72 73 6f 72  ualGeoJsonCursor
14aa0 50 74 72 29 20 70 43 75 72 73 6f 72 3b 0a 20 20  Ptr) pCursor;.  
14ab0 20 20 2a 70 52 6f 77 69 64 20 3d 20 63 75 72 73    *pRowid = curs
14ac0 6f 72 2d 3e 63 75 72 72 65 6e 74 5f 66 69 64 3b  or->current_fid;
14ad0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14ae0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63  TE_OK;.}..static
14af0 20 69 6e 74 0a 76 67 65 6f 6a 73 6f 6e 5f 75 70   int.vgeojson_up
14b00 64 61 74 65 20 28 73 71 6c 69 74 65 33 5f 76 74  date (sqlite3_vt
14b10 61 62 20 2a 20 70 56 54 61 62 2c 20 69 6e 74 20  ab * pVTab, int 
14b20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
14b30 6c 75 65 20 2a 2a 20 61 72 67 76 2c 0a 09 09 20  lue ** argv,... 
14b40 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 20 70  sqlite_int64 * p
14b50 52 6f 77 69 64 29 0a 7b 0a 2f 2a 20 67 65 6e 65  Rowid).{./* gene
14b60 72 69 63 20 75 70 64 61 74 65 20 5b 49 4e 53 45  ric update [INSE
14b70 52 54 20 2f 20 55 50 44 41 54 45 20 2f 20 44 45  RT / UPDATE / DE
14b80 4c 45 54 45 20 2a 2f 0a 20 20 20 20 69 66 20 28  LETE */.    if (
14b90 70 56 54 61 62 20 7c 7c 20 61 72 67 63 20 7c 7c  pVTab || argc ||
14ba0 20 61 72 67 76 20 7c 7c 20 70 52 6f 77 69 64 29   argv || pRowid)
14bb0 0a 09 70 56 54 61 62 20 3d 20 70 56 54 61 62 3b  ..pVTab = pVTab;
14bc0 09 09 2f 2a 20 75 6e 75 73 65 64 20 61 72 67 20  ../* unused arg 
14bd0 77 61 72 6e 69 6e 67 20 73 75 70 70 72 65 73 73  warning suppress
14be0 69 6f 6e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ion */.    retur
14bf0 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
14c00 59 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  Y;.}..static int
14c10 0a 76 67 65 6f 6a 73 6f 6e 5f 62 65 67 69 6e 20  .vgeojson_begin 
14c20 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 20  (sqlite3_vtab * 
14c30 70 56 54 61 62 29 0a 7b 0a 2f 2a 20 42 45 47 49  pVTab).{./* BEGI
14c40 4e 20 54 52 41 4e 53 41 43 54 49 4f 4e 20 2a 2f  N TRANSACTION */
14c50 0a 20 20 20 20 69 66 20 28 70 56 54 61 62 29 0a  .    if (pVTab).
14c60 09 70 56 54 61 62 20 3d 20 70 56 54 61 62 3b 09  .pVTab = pVTab;.
14c70 09 2f 2a 20 75 6e 75 73 65 64 20 61 72 67 20 77  ./* unused arg w
14c80 61 72 6e 69 6e 67 20 73 75 70 70 72 65 73 73 69  arning suppressi
14c90 6f 6e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  on */.    return
14ca0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73   SQLITE_OK;.}..s
14cb0 74 61 74 69 63 20 69 6e 74 0a 76 67 65 6f 6a 73  tatic int.vgeojs
14cc0 6f 6e 5f 73 79 6e 63 20 28 73 71 6c 69 74 65 33  on_sync (sqlite3
14cd0 5f 76 74 61 62 20 2a 20 70 56 54 61 62 29 0a 7b  _vtab * pVTab).{
14ce0 0a 2f 2a 20 42 45 47 49 4e 20 54 52 41 4e 53 41  ./* BEGIN TRANSA
14cf0 43 54 49 4f 4e 20 2a 2f 0a 20 20 20 20 69 66 20  CTION */.    if 
14d00 28 70 56 54 61 62 29 0a 09 70 56 54 61 62 20 3d  (pVTab)..pVTab =
14d10 20 70 56 54 61 62 3b 09 09 2f 2a 20 75 6e 75 73   pVTab;../* unus
14d20 65 64 20 61 72 67 20 77 61 72 6e 69 6e 67 20 73  ed arg warning s
14d30 75 70 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  uppression */.  
14d40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14d50 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  OK;.}..static in
14d60 74 0a 76 67 65 6f 6a 73 6f 6e 5f 63 6f 6d 6d 69  t.vgeojson_commi
14d70 74 20 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20  t (sqlite3_vtab 
14d80 2a 20 70 56 54 61 62 29 0a 7b 0a 2f 2a 20 42 45  * pVTab).{./* BE
14d90 47 49 4e 20 54 52 41 4e 53 41 43 54 49 4f 4e 20  GIN TRANSACTION 
14da0 2a 2f 0a 20 20 20 20 69 66 20 28 70 56 54 61 62  */.    if (pVTab
14db0 29 0a 09 70 56 54 61 62 20 3d 20 70 56 54 61 62  )..pVTab = pVTab
14dc0 3b 09 09 2f 2a 20 75 6e 75 73 65 64 20 61 72 67  ;../* unused arg
14dd0 20 77 61 72 6e 69 6e 67 20 73 75 70 70 72 65 73   warning suppres
14de0 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 72 65 74 75  sion */.    retu
14df0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
14e00 0a 73 74 61 74 69 63 20 69 6e 74 0a 76 67 65 6f  .static int.vgeo
14e10 6a 73 6f 6e 5f 72 6f 6c 6c 62 61 63 6b 20 28 73  json_rollback (s
14e20 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 20 70 56  qlite3_vtab * pV
14e30 54 61 62 29 0a 7b 0a 2f 2a 20 42 45 47 49 4e 20  Tab).{./* BEGIN 
14e40 54 52 41 4e 53 41 43 54 49 4f 4e 20 2a 2f 0a 20  TRANSACTION */. 
14e50 20 20 20 69 66 20 28 70 56 54 61 62 29 0a 09 70     if (pVTab)..p
14e60 56 54 61 62 20 3d 20 70 56 54 61 62 3b 09 09 2f  VTab = pVTab;../
14e70 2a 20 75 6e 75 73 65 64 20 61 72 67 20 77 61 72  * unused arg war
14e80 6e 69 6e 67 20 73 75 70 70 72 65 73 73 69 6f 6e  ning suppression
14e90 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
14ea0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61  QLITE_OK;.}..sta
14eb0 74 69 63 20 69 6e 74 0a 76 67 65 6f 6a 73 6f 6e  tic int.vgeojson
14ec0 5f 72 65 6e 61 6d 65 20 28 73 71 6c 69 74 65 33  _rename (sqlite3
14ed0 5f 76 74 61 62 20 2a 20 70 56 54 61 62 2c 20 63  _vtab * pVTab, c
14ee0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 65 77 29  onst char *zNew)
14ef0 0a 7b 0a 2f 2a 20 42 45 47 49 4e 20 54 52 41 4e  .{./* BEGIN TRAN
14f00 53 41 43 54 49 4f 4e 20 2a 2f 0a 20 20 20 20 69  SACTION */.    i
14f10 66 20 28 70 56 54 61 62 29 0a 09 70 56 54 61 62  f (pVTab)..pVTab
14f20 20 3d 20 70 56 54 61 62 3b 09 09 2f 2a 20 75 6e   = pVTab;../* un
14f30 75 73 65 64 20 61 72 67 20 77 61 72 6e 69 6e 67  used arg warning
14f40 20 73 75 70 70 72 65 73 73 69 6f 6e 20 2a 2f 0a   suppression */.
14f50 20 20 20 20 69 66 20 28 7a 4e 65 77 29 0a 09 7a      if (zNew)..z
14f60 4e 65 77 20 3d 20 7a 4e 65 77 3b 09 09 2f 2a 20  New = zNew;../* 
14f70 75 6e 75 73 65 64 20 61 72 67 20 77 61 72 6e 69  unused arg warni
14f80 6e 67 20 73 75 70 70 72 65 73 73 69 6f 6e 20 2a  ng suppression *
14f90 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
14fa0 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 73 74  ITE_ERROR;.}..st
14fb0 61 74 69 63 20 69 6e 74 0a 73 70 6c 69 74 65 56  atic int.spliteV
14fc0 69 72 74 75 61 6c 47 65 6f 4a 73 6f 6e 49 6e 69  irtualGeoJsonIni
14fd0 74 20 28 73 71 6c 69 74 65 33 20 2a 20 64 62 29  t (sqlite3 * db)
14fe0 0a 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  .{.    int rc = 
14ff0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 6d  SQLITE_OK;.    m
15000 79 5f 67 65 6f 6a 73 6f 6e 5f 6d 6f 64 75 6c 65  y_geojson_module
15010 2e 69 56 65 72 73 69 6f 6e 20 3d 20 31 3b 0a 20  .iVersion = 1;. 
15020 20 20 20 6d 79 5f 67 65 6f 6a 73 6f 6e 5f 6d 6f     my_geojson_mo
15030 64 75 6c 65 2e 78 43 72 65 61 74 65 20 3d 20 26  dule.xCreate = &
15040 76 67 65 6f 6a 73 6f 6e 5f 63 72 65 61 74 65 3b  vgeojson_create;
15050 0a 20 20 20 20 6d 79 5f 67 65 6f 6a 73 6f 6e 5f  .    my_geojson_
15060 6d 6f 64 75 6c 65 2e 78 43 6f 6e 6e 65 63 74 20  module.xConnect 
15070 3d 20 26 76 67 65 6f 6a 73 6f 6e 5f 63 6f 6e 6e  = &vgeojson_conn
15080 65 63 74 3b 0a 20 20 20 20 6d 79 5f 67 65 6f 6a  ect;.    my_geoj
15090 73 6f 6e 5f 6d 6f 64 75 6c 65 2e 78 42 65 73 74  son_module.xBest
150a0 49 6e 64 65 78 20 3d 20 26 76 67 65 6f 6a 73 6f  Index = &vgeojso
150b0 6e 5f 62 65 73 74 5f 69 6e 64 65 78 3b 0a 20 20  n_best_index;.  
150c0 20 20 6d 79 5f 67 65 6f 6a 73 6f 6e 5f 6d 6f 64    my_geojson_mod
150d0 75 6c 65 2e 78 44 69 73 63 6f 6e 6e 65 63 74 20  ule.xDisconnect 
150e0 3d 20 26 76 67 65 6f 6a 73 6f 6e 5f 64 69 73 63  = &vgeojson_disc
150f0 6f 6e 6e 65 63 74 3b 0a 20 20 20 20 6d 79 5f 67  onnect;.    my_g
15100 65 6f 6a 73 6f 6e 5f 6d 6f 64 75 6c 65 2e 78 44  eojson_module.xD
15110 65 73 74 72 6f 79 20 3d 20 26 76 67 65 6f 6a 73  estroy = &vgeojs
15120 6f 6e 5f 64 65 73 74 72 6f 79 3b 0a 20 20 20 20  on_destroy;.    
15130 6d 79 5f 67 65 6f 6a 73 6f 6e 5f 6d 6f 64 75 6c  my_geojson_modul
15140 65 2e 78 4f 70 65 6e 20 3d 20 26 76 67 65 6f 6a  e.xOpen = &vgeoj
15150 73 6f 6e 5f 6f 70 65 6e 3b 0a 20 20 20 20 6d 79  son_open;.    my
15160 5f 67 65 6f 6a 73 6f 6e 5f 6d 6f 64 75 6c 65 2e  _geojson_module.
15170 78 43 6c 6f 73 65 20 3d 20 26 76 67 65 6f 6a 73  xClose = &vgeojs
15180 6f 6e 5f 63 6c 6f 73 65 3b 0a 20 20 20 20 6d 79  on_close;.    my
15190 5f 67 65 6f 6a 73 6f 6e 5f 6d 6f 64 75 6c 65 2e  _geojson_module.
151a0 78 46 69 6c 74 65 72 20 3d 20 26 76 67 65 6f 6a  xFilter = &vgeoj
151b0 73 6f 6e 5f 66 69 6c 74 65 72 3b 0a 20 20 20 20  son_filter;.    
151c0 6d 79 5f 67 65 6f 6a 73 6f 6e 5f 6d 6f 64 75 6c  my_geojson_modul
151d0 65 2e 78 4e 65 78 74 20 3d 20 26 76 67 65 6f 6a  e.xNext = &vgeoj
151e0 73 6f 6e 5f 6e 65 78 74 3b 0a 20 20 20 20 6d 79  son_next;.    my
151f0 5f 67 65 6f 6a 73 6f 6e 5f 6d 6f 64 75 6c 65 2e  _geojson_module.
15200 78 45 6f 66 20 3d 20 26 76 67 65 6f 6a 73 6f 6e  xEof = &vgeojson
15210 5f 65 6f 66 3b 0a 20 20 20 20 6d 79 5f 67 65 6f  _eof;.    my_geo
15220 6a 73 6f 6e 5f 6d 6f 64 75 6c 65 2e 78 43 6f 6c  json_module.xCol
15230 75 6d 6e 20 3d 20 26 76 67 65 6f 6a 73 6f 6e 5f  umn = &vgeojson_
15240 63 6f 6c 75 6d 6e 3b 0a 20 20 20 20 6d 79 5f 67  column;.    my_g
15250 65 6f 6a 73 6f 6e 5f 6d 6f 64 75 6c 65 2e 78 52  eojson_module.xR
15260 6f 77 69 64 20 3d 20 26 76 67 65 6f 6a 73 6f 6e  owid = &vgeojson
15270 5f 72 6f 77 69 64 3b 0a 20 20 20 20 6d 79 5f 67  _rowid;.    my_g
15280 65 6f 6a 73 6f 6e 5f 6d 6f 64 75 6c 65 2e 78 55  eojson_module.xU
15290 70 64 61 74 65 20 3d 20 26 76 67 65 6f 6a 73 6f  pdate = &vgeojso
152a0 6e 5f 75 70 64 61 74 65 3b 0a 20 20 20 20 6d 79  n_update;.    my
152b0 5f 67 65 6f 6a 73 6f 6e 5f 6d 6f 64 75 6c 65 2e  _geojson_module.
152c0 78 42 65 67 69 6e 20 3d 20 26 76 67 65 6f 6a 73  xBegin = &vgeojs
152d0 6f 6e 5f 62 65 67 69 6e 3b 0a 20 20 20 20 6d 79  on_begin;.    my
152e0 5f 67 65 6f 6a 73 6f 6e 5f 6d 6f 64 75 6c 65 2e  _geojson_module.
152f0 78 53 79 6e 63 20 3d 20 26 76 67 65 6f 6a 73 6f  xSync = &vgeojso
15300 6e 5f 73 79 6e 63 3b 0a 20 20 20 20 6d 79 5f 67  n_sync;.    my_g
15310 65 6f 6a 73 6f 6e 5f 6d 6f 64 75 6c 65 2e 78 43  eojson_module.xC
15320 6f 6d 6d 69 74 20 3d 20 26 76 67 65 6f 6a 73 6f  ommit = &vgeojso
15330 6e 5f 63 6f 6d 6d 69 74 3b 0a 20 20 20 20 6d 79  n_commit;.    my
15340 5f 67 65 6f 6a 73 6f 6e 5f 6d 6f 64 75 6c 65 2e  _geojson_module.
15350 78 52 6f 6c 6c 62 61 63 6b 20 3d 20 26 76 67 65  xRollback = &vge
15360 6f 6a 73 6f 6e 5f 72 6f 6c 6c 62 61 63 6b 3b 0a  ojson_rollback;.
15370 20 20 20 20 6d 79 5f 67 65 6f 6a 73 6f 6e 5f 6d      my_geojson_m
15380 6f 64 75 6c 65 2e 78 46 69 6e 64 46 75 6e 63 74  odule.xFindFunct
15390 69 6f 6e 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ion = NULL;.    
153a0 6d 79 5f 67 65 6f 6a 73 6f 6e 5f 6d 6f 64 75 6c  my_geojson_modul
153b0 65 2e 78 52 65 6e 61 6d 65 20 3d 20 26 76 67 65  e.xRename = &vge
153c0 6f 6a 73 6f 6e 5f 72 65 6e 61 6d 65 3b 0a 20 20  ojson_rename;.  
153d0 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
153e0 5f 6d 6f 64 75 6c 65 5f 76 32 20 28 64 62 2c 20  _module_v2 (db, 
153f0 22 56 69 72 74 75 61 6c 47 65 6f 4a 53 4f 4e 22  "VirtualGeoJSON"
15400 2c 20 26 6d 79 5f 67 65 6f 6a 73 6f 6e 5f 6d 6f  , &my_geojson_mo
15410 64 75 6c 65 2c 20 4e 55 4c 4c 2c 0a 09 09 09 20  dule, NULL,.... 
15420 20 20 20 20 20 30 29 3b 0a 20 20 20 20 72 65 74       0);.    ret
15430 75 72 6e 20 72 63 3b 0a 7d 0a 0a 53 50 41 54 49  urn rc;.}..SPATI
15440 41 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e  ALITE_PRIVATE in
15450 74 0a 76 69 72 74 75 61 6c 67 65 6f 6a 73 6f 6e  t.virtualgeojson
15460 5f 65 78 74 65 6e 73 69 6f 6e 5f 69 6e 69 74 20  _extension_init 
15470 28 76 6f 69 64 20 2a 78 64 62 29 0a 7b 0a 20 20  (void *xdb).{.  
15480 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
15490 28 73 71 6c 69 74 65 33 20 2a 29 20 78 64 62 3b  (sqlite3 *) xdb;
154a0 0a 20 20 20 20 72 65 74 75 72 6e 20 73 70 6c 69  .    return spli
154b0 74 65 56 69 72 74 75 61 6c 47 65 6f 4a 73 6f 6e  teVirtualGeoJson
154c0 49 6e 69 74 20 28 64 62 29 3b 0a 7d 0a           Init (db);.}.