From: Björn Harrtell Date: Fri, 21 Apr 2017 16:58:56 +0000 (+0000) Subject: Fix ST_AsMVT string value encoding redundancy X-Git-Tag: 2.4.0alpha~130 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0c2f4742c0e5e1047c5f58fe7ff26a47c0976049;p=postgis Fix ST_AsMVT string value encoding redundancy References #3741 git-svn-id: http://svn.osgeo.org/postgis/trunk@15358 b70326c6-7e19-0410-871a-916f4a2858ee --- diff --git a/postgis/mvt.c b/postgis/mvt.c index 35ed11ed3..e8f722aa0 100644 --- a/postgis/mvt.c +++ b/postgis/mvt.c @@ -43,7 +43,7 @@ enum mvt_type { }; struct mvt_kv_string_value { - char *string_value; + const char *string_value; uint32_t id; UT_hash_handle hh; }; @@ -389,14 +389,14 @@ static void parse_value_as_string(struct mvt_agg_context *ctx, Oid typoid, char *value = OidOutputFunctionCall(foutoid, datum); POSTGIS_DEBUGF(4, "parse_value_as_string value: %s", value); size_t size = strlen(value); - HASH_FIND(hh, ctx->string_values_hash, &value, size, kv); + HASH_FIND(hh, ctx->string_values_hash, value, size, kv); if (!kv) { POSTGIS_DEBUG(4, "parse_value_as_string value not found"); kv = palloc(sizeof(*kv)); POSTGIS_DEBUGF(4, "parse_value_as_string new hash key: %d", ctx->values_hash_i); kv->id = ctx->values_hash_i++; kv->string_value = value; - HASH_ADD(hh, ctx->string_values_hash, string_value, size, kv); + HASH_ADD_KEYPTR(hh, ctx->string_values_hash, kv->string_value, size, kv); } tags[c*2] = k - 1; tags[c*2+1] = kv->id; @@ -449,11 +449,6 @@ static void parse_values(struct mvt_agg_context *ctx) double_values_hash, double_value, DatumGetFloat8, sizeof(double)); break; - case TEXTOID: - MVT_PARSE_DATUM(char *, mvt_kv_string_value, - string_values_hash, string_value, - TextDatumGetCString, strlen(value)); - break; default: parse_value_as_string(ctx, typoid, datum, tags, c, k); break; diff --git a/regress/mvt.sql b/regress/mvt.sql index 42fe8657d..84a887f21 100644 --- a/regress/mvt.sql +++ b/regress/mvt.sql @@ -81,16 +81,22 @@ SELECT 'TA4', encode(ST_AsMVT('test', 4096, 'geom', q), 'base64') FROM ( UNION SELECT 2 AS c1, 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 'TA5', encode(ST_AsMVT('test', 4096, 'geom', q), 'base64') FROM (SELECT +SELECT 'TA5', encode(ST_AsMVT('test', 4096, 'geom', q), 'base64') FROM (SELECT ST_AsMVTGeom(ST_GeomFromText('POINT(25 17)'), ST_MakeBox2D(ST_Point(0, 0), ST_Point(4096, 4096)), 4096, 0, false) AS geom, 1 AS c1, 'abcd'::text AS c2) AS q; SELECT 'TA6', encode(ST_AsMVT('test', 4096, 'geom', q), 'base64') FROM (SELECT 1 AS c1, -1 AS c2, 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 'TA7', encode(ST_AsMVT('test', 4096, 'geom', q), 'base64') FROM ( + SELECT 'test' AS c1, ST_AsMVTGeom(ST_GeomFromText('POINT(25 17)'), + ST_MakeBox2D(ST_Point(0, 0), ST_Point(4096, 4096)), 4096, 0, false) AS geom + UNION + SELECT 'test' 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; -- unsupported input SELECT 'TU2'; SELECT encode(ST_AsMVT('test', 4096, 'geom', 1), 'base64'); SELECT 'TU3'; SELECT encode(ST_AsMVT('test', 4096, 'geom', q), 'base64') - FROM (SELECT NULL::integer AS c1, NULL AS geom) AS q; \ No newline at end of file + FROM (SELECT NULL::integer AS c1, NULL AS geom) AS q; diff --git a/regress/mvt_expected b/regress/mvt_expected index 5922be654..49695e78b 100644 --- a/regress/mvt_expected +++ b/regress/mvt_expected @@ -23,6 +23,7 @@ TA3|GhkKBHRlc3QSCBgBIgQJMt4/GgJjMSiAIHgC TA4|GjMKBHRlc3QSDBICAAAYASIECTLePxIMEgIAARgBIgQJMt4/GgJjMSICKAEiAigCKIAgeAI= TA5|Gi8KBHRlc3QSDhIEAAABARgBIgQJMt4/GgJjMRoCYzIiAigBIgYKBGFiY2QogCB4Ag== TA6|GisKBHRlc3QSDhIEAAABARgBIgQJMt4/GgJjMRoCYzIiAigBIgIwASiAIHgC +TA7|GjMKBHRlc3QSDBICAAAYASIECTLePxIMEgIAABgBIgQJNNw/GgJjMSIGCgR0ZXN0KIAgeAI= TU2 ERROR: pgis_asmvt_transfn: parameter row cannot be other than a rowtype TU3