diff options
| author | Alvaro Herrera | 2015-05-07 16:02:22 +0000 |
|---|---|---|
| committer | Alvaro Herrera | 2015-05-07 16:02:22 +0000 |
| commit | db5f98ab4fa44bc563ec62d7b1aada4fc276d9b2 (patch) | |
| tree | 0b05cf901eed7ffab21935a5f6491e8215bbe670 /src/include/access | |
| parent | 7be47c56af3d3013955c91c2877c08f2a0e3e6a2 (diff) | |
Improve BRIN infra, minmax opclass and regression test
The minmax opclass was using the wrong support functions when
cross-datatypes queries were run. Instead of trying to fix the
pg_amproc definitions (which apparently is not possible), use the
already correct pg_amop entries instead. This requires jumping through
more hoops (read: extra syscache lookups) to obtain the underlying
functions to execute, but it is necessary for correctness.
Author: Emre Hasegeli, tweaked by Álvaro
Review: Andreas Karlsson
Also change BrinOpcInfo to record each stored type's typecache entry
instead of just the OID. Turns out that the full type cache is
necessary in brin_deform_tuple: the original code used the indexed
type's byval and typlen properties to extract the stored tuple, which is
correct in Minmax; but in other implementations that want to store
something different, that's wrong. The realization that this is a bug
comes from Emre also, but I did not use his patch.
I also adopted Emre's regression test code (with smallish changes),
which is more complete.
Diffstat (limited to 'src/include/access')
| -rw-r--r-- | src/include/access/brin_internal.h | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/src/include/access/brin_internal.h b/src/include/access/brin_internal.h index 84eed6127dd..1486d046935 100644 --- a/src/include/access/brin_internal.h +++ b/src/include/access/brin_internal.h @@ -16,6 +16,7 @@ #include "storage/bufpage.h" #include "storage/off.h" #include "utils/relcache.h" +#include "utils/typcache.h" /* @@ -32,13 +33,13 @@ typedef struct BrinOpcInfo /* Opaque pointer for the opclass' private use */ void *oi_opaque; - /* Type IDs of the stored columns */ - Oid oi_typids[FLEXIBLE_ARRAY_MEMBER]; + /* Type cache entries of the stored columns */ + TypeCacheEntry *oi_typcache[FLEXIBLE_ARRAY_MEMBER]; } BrinOpcInfo; /* the size of a BrinOpcInfo for the given number of columns */ #define SizeofBrinOpcInfo(ncols) \ - (offsetof(BrinOpcInfo, oi_typids) + sizeof(Oid) * ncols) + (offsetof(BrinOpcInfo, oi_typcache) + sizeof(TypeCacheEntry *) * ncols) typedef struct BrinDesc { |
