]> granicus.if.org Git - postgis/commitdiff
Better numeric/string value handling for ST_AsMVT
authorBjörn Harrtell <bjorn@wololo.org>
Sun, 26 Feb 2017 16:23:00 +0000 (16:23 +0000)
committerBjörn Harrtell <bjorn@wololo.org>
Sun, 26 Feb 2017 16:23:00 +0000 (16:23 +0000)
Closes #3710

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

postgis/mvt.c

index 37f5e57d14110a6085c6f939762b9bdb40a73c4d..08beb0d52098923872375226b6b0b2e5dfd1022a 100644 (file)
@@ -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++;
        }