From: | Tomas Vondra <tomas(dot)vondra(at)enterprisedb(dot)com> |
---|---|
To: | Heikki Linnakangas <hlinnaka(at)iki(dot)fi>, PostgreSQL Hackers <pgsql-hackers(at)lists(dot)postgresql(dot)org> |
Subject: | Re: BRIN indexes vs. SK_SEARCHARRAY (and preprocessing scan keys) |
Date: | 2023-07-02 16:09:12 |
Message-ID: | 856edf2c-8e95-0a8f-5a37-c8564a770a82@enterprisedb.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
Here's an updated version of the patch series.
I've polished and pushed the first three patches with cleanup, tests to
improve test coverage and so on. I chose not to backpatch those - I
planned to do that to make future backpatches simpler, but the changes
ended up less disruptive than expected.
The remaining patches are just about adding SK_SEARCHARRAY to BRIN.
0001 - adds the optional preprocess procedure, calls it from brinrescan
0002 to 0005 - adds the support to the existing BRIN opclasses
The main open question I have is what exactly does it mean that the
procedure is optional. In particular, should it be supported to have a
BRIN opclass without the "preprocess" procedure but using the other
built-in support procedures?
For example, imagine you have a custom BRIN opclass in an extension (for
a custom data type or something). This does not need to implement any
procedures, it can just call the existing built-in ones. Of course, this
won't get the "preprocess" procedure automatically.
Should we support such opclasses or should we force the extension to be
updated by adding a preprocess procedure? I'd say "optional" means we
should support (otherwise it'd not really optional).
The reason why this matters is that "amsearcharray" is AM-level flag,
but the support procedure is defined by the opclass. So the consistent
function needs to handle SK_SEARCHARRAY keys both with and without
preprocessing.
That's mostly what I did for all existing BRIN opclasses (it's a bit
confusing that opclass may refer to both the "generic" minmax or the
opclass defined for a particular data type). All the opclasses now
handle three cases:
1) scalar keys (just like before, with amsearcharray=fase)
2) array keys with preprocessing (sorted array, array of hashes, ...)
3) array keys without preprocessing (for compatibility with old
opclasses missing the optional preprocess procedure)
The current code is a bit ugly, because it duplicates a bunch of code,
because the option (3) mostly does (1) in a loop. I'm confident this can
be reduced by refactoring and reusing some of the "shared" code.
The question is if my interpretation of what "optional" procedure means
is reasonable. Thoughts?
The other thing is how to test this "compatibility" code. I assume we
want to have the procedure for all built-in opclasses, so that won't
exercise it. I did test it by temporarily removing the procedure from a
couple pg_amproc.dat entries. I guess creating a custom opclass in the
regression test is the right solution.
regards
--
Tomas Vondra
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company
Attachment | Content-Type | Size |
---|---|---|
0001-Introduce-BRIN_PROCNUM_PREPROCESS-procedure-20230702.patch | text/x-patch | 8.5 KB |
0002-Support-SK_SEARCHARRAY-in-BRIN-minmax-20230702.patch | text/x-patch | 75.2 KB |
0003-Support-SK_SEARCHARRAY-in-BRIN-minmax-multi-20230702.patch | text/x-patch | 84.3 KB |
0004-Support-SK_SEARCHARRAY-in-BRIN-inclusion-20230702.patch | text/x-patch | 25.1 KB |
0005-Support-SK_SEARCHARRAY-in-BRIN-bloom-20230702.patch | text/x-patch | 44.0 KB |
From | Date | Subject | |
---|---|---|---|
Next Message | Andres Freund | 2023-07-02 16:56:15 | 010_database.pl fails on openbsd w/ LC_ALL=LANG=C |
Previous Message | vignesh C | 2023-07-02 15:12:06 | Improve tab completion for ALTER DEFAULT PRIVILEGE and ALTER TABLE |