]> granicus.if.org Git - postgis/commitdiff
ST_AsMVT JSONB support and regression tests conditional on PG >= 94
authorBjörn Harrtell <bjorn@wololo.org>
Thu, 4 May 2017 17:15:16 +0000 (17:15 +0000)
committerBjörn Harrtell <bjorn@wololo.org>
Thu, 4 May 2017 17:15:16 +0000 (17:15 +0000)
Fixes #3749

git-svn-id: http://svn.osgeo.org/postgis/trunk@15387 b70326c6-7e19-0410-871a-916f4a2858ee

postgis/mvt.c
postgis/mvt.h
regress/Makefile.in
regress/mvt.sql
regress/mvt_expected
regress/mvt_jsonb.sql [new file with mode: 0644]
regress/mvt_jsonb_expected [new file with mode: 0644]

index 1b9b53c237070d370d09d8f0a9160ee777d5b84d..8495174e400396292c32f10480523fa38ed6b209 100644 (file)
 
 #ifdef HAVE_LIBPROTOBUF
 
+#if POSTGIS_PGSQL_VERSION >= 94
+#include "utils/jsonb.h"
+#endif
+
 #include "uthash.h"
 
 #define FEATURES_CAPACITY_INITIAL 50
@@ -301,8 +305,10 @@ static void parse_column_keys(struct mvt_agg_context *ctx)
        bool geom_name_found = false;
        for (i = 0; i < natts; i++) {
                Oid typoid = getBaseType(tupdesc->attrs[i]->atttypid);
+#if POSTGIS_PGSQL_VERSION >= 94
                if (typoid == JSONBOID)
                        continue;
+#endif
                char *tkey = tupdesc->attrs[i]->attname.data;
                char *key = palloc(strlen(tkey) + 1);
                strcpy(key, tkey);
@@ -462,6 +468,7 @@ static void parse_datum_as_string(struct mvt_agg_context *ctx, Oid typoid,
        add_value_as_string(ctx, value, tags, k);
 }
 
+#if POSTGIS_PGSQL_VERSION >= 94
 static uint32_t *parse_jsonb(struct mvt_agg_context *ctx, Jsonb *jb,
        uint32_t *tags)
 {
@@ -524,6 +531,7 @@ static uint32_t *parse_jsonb(struct mvt_agg_context *ctx, Jsonb *jb,
 
        return tags;
 }
+#endif
 
 static void parse_values(struct mvt_agg_context *ctx)
 {
@@ -546,17 +554,23 @@ static void parse_values(struct mvt_agg_context *ctx)
                Datum datum = GetAttributeByNum(ctx->row, i+1, &isnull);
                Oid typoid = getBaseType(tupdesc->attrs[i]->atttypid);
                k = get_key_index(ctx, key);
-               if (k == -1 && typoid != JSONBOID)
-                       lwerror("parse_values: unexpectedly could not find parsed key name",
-                               key);
                if (isnull) {
                        POSTGIS_DEBUG(3, "parse_values isnull detected");
                        continue;
                }
+#if POSTGIS_PGSQL_VERSION >= 94
+               if (k == -1 && typoid != JSONBOID)
+#else
+               if (k == -1)
+#endif
+                       lwerror("parse_values: unexpectedly could not find parsed key name",
+                               key);
+#if POSTGIS_PGSQL_VERSION >= 94
                if (typoid == JSONBOID) {
                        tags = parse_jsonb(ctx, DatumGetJsonb(datum), tags);
                        continue;
                }
+#endif
                switch (typoid) {
                case BOOLOID:
                        MVT_PARSE_DATUM(protobuf_c_boolean, mvt_kv_bool_value,
index 54ccab0ecf474d1619b836db29bedff14fd5aaed..29156dbf1020316786e2c20e76485e7485b2afcb 100644 (file)
@@ -31,7 +31,6 @@
 #include "utils/array.h"
 #include "utils/typcache.h"
 #include "utils/lsyscache.h"
-#include "utils/jsonb.h"
 #include "catalog/pg_type.h"
 #include "executor/executor.h"
 #include "access/htup_details.h"
@@ -65,7 +64,7 @@ struct mvt_agg_context {
        uint32_t values_hash_i;
        uint32_t keys_hash_i;
        uint32_t c;
-} ;
+};
 
 LWGEOM *mvt_geom(LWGEOM *geom, GBOX *bounds, uint32_t extent, uint32_t buffer,
        bool clip_geom);
index 3301d4e2df98fee1cd6bd5dab32e9cf021392822..5ef768f0094d234b6c71bbd026bc117fcc3ebabe 100644 (file)
@@ -247,6 +247,10 @@ ifeq ($(HAVE_PROTOBUF),yes)
        TESTS += \
                mvt \
                geobuf
+ifeq ($(shell expr $(POSTGIS_PGSQL_VERSION) ">=" 94),1)
+       TESTS += \
+               mvt_jsonb
+endif
 endif
 
 ifeq ($(HAVE_SFCGAL),yes)
index c39378de015fc2b85f74c26c5d58a34c76ee3fd0..4dc84fa87e4b3e95b1a475b561451dba498a2ae4 100644 (file)
@@ -109,12 +109,6 @@ SELECT 'TA8', encode(ST_AsMVT('test', 4096, 'geom', q), 'base64') FROM (
     UNION
     SELECT 2::int AS c1, ST_AsMVTGeom(ST_GeomFromText('POINT(26 18)'),
     ST_MakeBox2D(ST_Point(0, 0), ST_Point(4096, 4096)), 4096, 0, false) AS geom) AS q;
-SELECT 'TA9', encode(ST_AsMVT('test', 4096, 'geom', q), 'base64') FROM (SELECT '{"c1":1,"c2":"abcd"}'::jsonb,
-    ST_AsMVTGeom(ST_GeomFromText('POINT(25 17)'),
-    ST_MakeBox2D(ST_Point(0, 0), ST_Point(4096, 4096)), 4096, 0, false) AS geom) AS q;
-SELECT 'TA10', encode(ST_AsMVT('test', 4096, 'geom', q), 'base64') FROM (SELECT '{"c1":"abcd", "c2":"abcd"}'::jsonb,
-    ST_AsMVTGeom(ST_GeomFromText('POINT(25 17)'),
-    ST_MakeBox2D(ST_Point(0, 0), ST_Point(4096, 4096)), 4096, 0, false) AS geom) AS q;
 
 -- unsupported input
 SELECT 'TU2';
index ee20dc69d1f3fd1a450671fce4fa6008ff2ecda0..b78f18d6e84ae231f8000d548b1d6135575e1919 100644 (file)
@@ -28,8 +28,6 @@ TA7|Gk4KBHRlc3QSDBICAAAYASIECTTcPxIMEgIAARgBIgQJMt4/EgwSAgABGAEiBAk03D8aAmMxIgsK
 CW90aGVydGVzdCIGCgR0ZXN0KIAgeAI=
 TA8|GkEKBHRlc3QSDBICAAAYASIECTLePxIMEgIAABgBIgQJNNw/EgwSAgABGAEiBAk03D8aAmMxIgIo
 ASICKAIogCB4Ag==
-TA9|Gi8KBHRlc3QSDhIEAAABARgBIgQJMt4/GgJjMRoCYzIiAigBIgYKBGFiY2QogCB4Ag==
-TA10|GisKBHRlc3QSDhIEAAABABgBIgQJMt4/GgJjMRoCYzIiBgoEYWJjZCiAIHgC
 TU2
 ERROR:  pgis_asmvt_transfn: parameter row cannot be other than a rowtype
 TU3
diff --git a/regress/mvt_jsonb.sql b/regress/mvt_jsonb.sql
new file mode 100644 (file)
index 0000000..9715e4d
--- /dev/null
@@ -0,0 +1,6 @@
+SELECT 'TA9', encode(ST_AsMVT('test', 4096, 'geom', q), 'base64') FROM (SELECT '{"c1":1,"c2":"abcd"}'::jsonb,
+    ST_AsMVTGeom(ST_GeomFromText('POINT(25 17)'),
+    ST_MakeBox2D(ST_Point(0, 0), ST_Point(4096, 4096)), 4096, 0, false) AS geom) AS q;
+SELECT 'TA10', encode(ST_AsMVT('test', 4096, 'geom', q), 'base64') FROM (SELECT '{"c1":"abcd", "c2":"abcd"}'::jsonb,
+    ST_AsMVTGeom(ST_GeomFromText('POINT(25 17)'),
+    ST_MakeBox2D(ST_Point(0, 0), ST_Point(4096, 4096)), 4096, 0, false) AS geom) AS q;
diff --git a/regress/mvt_jsonb_expected b/regress/mvt_jsonb_expected
new file mode 100644 (file)
index 0000000..af9d5f2
--- /dev/null
@@ -0,0 +1,2 @@
+TA9|Gi8KBHRlc3QSDhIEAAABARgBIgQJMt4/GgJjMRoCYzIiAigBIgYKBGFiY2QogCB4Ag==
+TA10|GisKBHRlc3QSDhIEAAABABgBIgQJMt4/GgJjMRoCYzIiBgoEYWJjZCiAIHgC