From: Björn Harrtell Date: Sun, 26 Feb 2017 16:23:00 +0000 (+0000) Subject: Better numeric/string value handling for ST_AsMVT X-Git-Tag: 2.4.0alpha~168 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8b9c4a6de8cd6374b6e24c01075621a314620b00;p=postgis Better numeric/string value handling for ST_AsMVT Closes #3710 git-svn-id: http://svn.osgeo.org/postgis/trunk@15315 b70326c6-7e19-0410-871a-916f4a2858ee --- diff --git a/postgis/mvt.c b/postgis/mvt.c index 37f5e57d1..08beb0d52 100644 --- a/postgis/mvt.c +++ b/postgis/mvt.c @@ -434,6 +434,25 @@ static void encode_values(struct mvt_agg_context *ctx) tags[c*2+1] = kv->id; \ } +static void parse_value_as_string(struct mvt_agg_context *ctx, Oid typoid, + Datum datum, uint32_t *tags, uint32_t c, uint32_t k) { + struct mvt_kv_string_value *kv; + Oid foutoid; + bool typisvarlena; + getTypeOutputInfo(typoid, &foutoid, &typisvarlena); + char *value = OidOutputFunctionCall(foutoid, datum); + size_t size = strlen(value); + HASH_FIND(hh, ctx->string_values_hash, &value, size, kv); + if (!kv) { + kv = palloc(sizeof(*kv)); + kv->id = ctx->values_hash_i++; + kv->string_value = value; + HASH_ADD(hh, ctx->string_values_hash, string_value, size, kv); + } + tags[c*2] = k - 1; + tags[c*2+1] = kv->id; +} + static void parse_values(struct mvt_agg_context *ctx) { uint32_t n_keys = ctx->layer->n_keys; @@ -482,19 +501,14 @@ static void parse_values(struct mvt_agg_context *ctx) double_values_hash, double_value, DatumGetFloat8, sizeof(double)); break; - case NUMERICOID: - lwerror("parse_values: numeric type not supported"); - break; - case VARCHAROID: - case CHAROID: - case BPCHAROID: case TEXTOID: MVT_PARSE_VALUE(char *, mvt_kv_string_value, string_values_hash, string_value, TextDatumGetCString, strlen(value)); break; default: - continue; + parse_value_as_string(ctx, typoid, datum, tags, c, k); + break; } c++; }