summaryrefslogtreecommitdiff
path: root/src/include/access
diff options
context:
space:
mode:
authorAlvaro Herrera2015-05-07 16:02:22 +0000
committerAlvaro Herrera2015-05-07 16:02:22 +0000
commitdb5f98ab4fa44bc563ec62d7b1aada4fc276d9b2 (patch)
tree0b05cf901eed7ffab21935a5f6491e8215bbe670 /src/include/access
parent7be47c56af3d3013955c91c2877c08f2a0e3e6a2 (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.h7
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
{