mirror of
https://github.com/postgres/postgres.git
synced 2025-11-10 17:42:29 +03:00
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.
This commit is contained in:
@@ -68,7 +68,7 @@ brtuple_disk_tupdesc(BrinDesc *brdesc)
|
||||
{
|
||||
for (j = 0; j < brdesc->bd_info[i]->oi_nstored; j++)
|
||||
TupleDescInitEntry(tupdesc, attno++, NULL,
|
||||
brdesc->bd_info[i]->oi_typids[j],
|
||||
brdesc->bd_info[i]->oi_typcache[j]->type_id,
|
||||
-1, 0);
|
||||
}
|
||||
|
||||
@@ -444,8 +444,8 @@ brin_deform_tuple(BrinDesc *brdesc, BrinTuple *tuple)
|
||||
for (i = 0; i < brdesc->bd_info[keyno]->oi_nstored; i++)
|
||||
dtup->bt_columns[keyno].bv_values[i] =
|
||||
datumCopy(values[valueno++],
|
||||
brdesc->bd_tupdesc->attrs[keyno]->attbyval,
|
||||
brdesc->bd_tupdesc->attrs[keyno]->attlen);
|
||||
brdesc->bd_info[keyno]->oi_typcache[i]->typbyval,
|
||||
brdesc->bd_info[keyno]->oi_typcache[i]->typlen);
|
||||
|
||||
dtup->bt_columns[keyno].bv_hasnulls = hasnulls[keyno];
|
||||
dtup->bt_columns[keyno].bv_allnulls = false;
|
||||
|
||||
Reference in New Issue
Block a user