Improve BRIN infra, minmax opclass and regression test
Alvaro Herrera <alvherre@alvh.no-ip.org>
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.
Files
| Path | Change | +/− |
|---|---|---|
| contrib/pageinspect/brinfuncs.c | modified | +1 −1 |
| doc/src/sgml/brin.sgml | modified | +2 −2 |
| src/backend/access/brin/brin_minmax.c | modified | +89 −65 |
| src/backend/access/brin/brin_tuple.c | modified | +3 −3 |
| src/include/access/brin_internal.h | modified | +4 −3 |
| src/include/catalog/catversion.h | modified | +1 −1 |
| src/include/catalog/pg_amproc.h | modified | +0 −164 |
| src/include/catalog/pg_opclass.h | modified | +27 −27 |
| src/test/regress/expected/brin.out | modified | +120 −68 |
| src/test/regress/sql/brin.sql | modified | +122 −70 |