From: Peter Geoghegan Date: Fri, 14 Mar 2014 06:34:31 +0000 (-0700) Subject: Remarks on GIN numeric textual storage X-Git-Url: http://git.postgresql.org/gitweb/static/gitweb.js?a=commitdiff_plain;h=e678abfd6bb6540fb721a76844bfee0fc05deb98;p=users%2Fandresfreund%2Fpostgres.git Remarks on GIN numeric textual storage --- diff --git a/src/backend/utils/adt/jsonb_gin.c b/src/backend/utils/adt/jsonb_gin.c index bac94739a1..8fddd581c9 100644 --- a/src/backend/utils/adt/jsonb_gin.c +++ b/src/backend/utils/adt/jsonb_gin.c @@ -425,6 +425,11 @@ make_scalar_text_key(const JsonbValue * v, char flag) /* * A normalized textual representation, free of trailing zeroes is * is required. + * + * It isn't ideal that numerics are stored in a relatively bulky + * textual format. However, it's a notationally convenient way of + * storing a "union" type in the GIN B-Tree, and indexing Jsonb + * strings take precedence. */ cstr = numeric_normalize(v->numeric); item = make_text_key(cstr, strlen(cstr), flag); diff --git a/src/backend/utils/adt/numeric.c b/src/backend/utils/adt/numeric.c index 92e3528c8f..a4d5b0369f 100644 --- a/src/backend/utils/adt/numeric.c +++ b/src/backend/utils/adt/numeric.c @@ -652,14 +652,14 @@ numeric_normalize(Numeric num) for (;;) { - if (str[last] != '0') + if (last == 0 || str[last] != '0') break; str[last] = '\0'; last--; } - if (str[last] == '.') + if (last != 0 && str[last] == '.') str[last] = '\0'; return str;