From db5f98ab4fa44bc563ec62d7b1aada4fc276d9b2 Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Thu, 7 May 2015 13:02:22 -0300 Subject: Improve BRIN infra, minmax opclass and regression test MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- doc/src/sgml/brin.sgml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'doc/src') diff --git a/doc/src/sgml/brin.sgml b/doc/src/sgml/brin.sgml index 1ac282c57a6..92dac7c60b5 100644 --- a/doc/src/sgml/brin.sgml +++ b/doc/src/sgml/brin.sgml @@ -428,8 +428,8 @@ 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; BrinOpcInfo.oi_opaque can be used by the -- cgit v1.2.3