Improve key representation for GIN jsonb_ops, and fix existence-search bug.
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 9 May 2014 12:41:26 +0000 (08:41 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 9 May 2014 12:41:26 +0000 (08:41 -0400)
commit46dddf7673c5820be7c78a8b0e098fdbc65d003d
tree09aa3be1a6c1d6a762a44d92cb5bc3b8441edaa6
parentff7bbb0176a667aeb0577e4d48d651ffdb6afd50
Improve key representation for GIN jsonb_ops, and fix existence-search bug.

Change the key representation so that values that would exceed 127 bytes
are hashed into short strings, and so that the original JSON datatype of
each value is recorded in the index.  The hashing rule eliminates the major
objection to having this opclass be the default for jsonb, namely that it
could fail for plausible input data (due to GIN's restrictions on maximum
key length).  Preserving datatype information doesn't really buy us much
right now, but it requires no extra space compared to the previous way,
and it might be useful later.

Also, change the consistency-checking functions to request recheck for
exists (jsonb ? text) and related operators.  The original analysis that
this is an exactly checkable query was incorrect, since the index does
not preserve information about whether a key appears at top level in
the indexed JSON object.  Add a test case demonstrating the problem.

Make some other, mostly cosmetic improvements to the code in jsonb_gin.c
as well.

catversion bump due to on-disk data format change in jsonb_ops indexes.
src/backend/utils/adt/jsonb_gin.c
src/include/catalog/catversion.h
src/include/utils/jsonb.h
src/test/regress/data/jsonb.data
src/test/regress/expected/jsonb.out
src/test/regress/expected/jsonb_1.out
src/test/regress/sql/jsonb.sql