Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit6fd1dbd

Browse files
committed
Dissociate btequalimage() from interval_ops, ending its deduplication.
Under interval_ops, some equal values are distinguishable. One suchpair is '24:00:00' and '1 day'. With that being so, btequalimage()breaches the documented contract for the "equalimage" btree supportfunction. This can cause incorrect results from index-only scans.Users should REINDEX any btree indexes having interval-type columns.After updating, pg_amcheck will report an error for almost all suchindexes. This fix makes interval_ops simply omit the support function,like numeric_ops does. Back-pack to v13, where btequalimage() firstappeared. In back branches, for the benefit of old catalog content,btequalimage() code will return false for type "interval". Goingforward, back-branch initdb will include the catalog change.Reviewed by Peter Geoghegan.Discussion:https://postgr.es/m/20231011013317.22.nmisch@google.com
1 parent3895e91 commit6fd1dbd

File tree

5 files changed

+21
-13
lines changed

5 files changed

+21
-13
lines changed

‎contrib/amcheck/verify_nbtree.c

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
#include"access/xact.h"
3232
#include"catalog/index.h"
3333
#include"catalog/pg_am.h"
34+
#include"catalog/pg_opfamily_d.h"
3435
#include"commands/tablecmds.h"
3536
#include"lib/bloomfilter.h"
3637
#include"miscadmin.h"
@@ -333,10 +334,20 @@ bt_index_check_internal(Oid indrelid, bool parentcheck, bool heapallindexed,
333334
errmsg("index \"%s\" metapage has equalimage field set on unsupported nbtree version",
334335
RelationGetRelationName(indrel))));
335336
if (allequalimage&& !_bt_allequalimage(indrel, false))
337+
{
338+
boolhas_interval_ops= false;
339+
340+
for (inti=0;i<IndexRelationGetNumberOfKeyAttributes(indrel);i++)
341+
if (indrel->rd_opfamily[i]==INTERVAL_BTREE_FAM_OID)
342+
has_interval_ops= true;
336343
ereport(ERROR,
337344
(errcode(ERRCODE_INDEX_CORRUPTED),
338345
errmsg("index \"%s\" metapage incorrectly indicates that deduplication is safe",
339-
RelationGetRelationName(indrel))));
346+
RelationGetRelationName(indrel)),
347+
has_interval_ops
348+
?errhint("This is known of \"interval\" indexes last built on a version predating 2023-11.")
349+
:0));
350+
}
340351

341352
/* Check index, possibly against table it is an index on */
342353
bt_check_every_level(indrel,heaprel,heapkeyspace,parentcheck,

‎src/backend/utils/adt/datum.c

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
#include"postgres.h"
4444

4545
#include"access/detoast.h"
46+
#include"catalog/pg_type_d.h"
4647
#include"fmgr.h"
4748
#include"utils/builtins.h"
4849
#include"utils/datum.h"
@@ -333,20 +334,17 @@ datum_image_eq(Datum value1, Datum value2, bool typByVal, int typLen)
333334
* datum_image_eq() in all cases can use this as their "equalimage" support
334335
* function.
335336
*
336-
* Currently, we unconditionally assume that any B-Tree operator class that
337-
* registers btequalimage as its support function 4 must be able to safely use
338-
* optimizations like deduplication (i.e. we return true unconditionally). If
339-
* it ever proved necessary to rescind support for an operator class, we could
340-
* do that in a targeted fashion by doing something with the opcintype
341-
* argument.
337+
* Earlier minor releases erroneously associated this function with
338+
* interval_ops. Detect that case to rescind deduplication support, without
339+
* requiring initdb.
342340
*-------------------------------------------------------------------------
343341
*/
344342
Datum
345343
btequalimage(PG_FUNCTION_ARGS)
346344
{
347-
/*Oidopcintype = PG_GETARG_OID(0); */
345+
Oidopcintype=PG_GETARG_OID(0);
348346

349-
PG_RETURN_BOOL(true);
347+
PG_RETURN_BOOL(opcintype!=INTERVALOID);
350348
}
351349

352350
/*-------------------------------------------------------------------------

‎src/include/catalog/pg_amproc.dat

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -172,8 +172,6 @@
172172
{ amprocfamily => 'btree/interval_ops', amproclefttype => 'interval',
173173
amprocrighttype => 'interval', amprocnum => '3',
174174
amproc => 'in_range(interval,interval,interval,bool,bool)' },
175-
{ amprocfamily => 'btree/interval_ops', amproclefttype => 'interval',
176-
amprocrighttype => 'interval', amprocnum => '4', amproc => 'btequalimage' },
177175
{ amprocfamily => 'btree/macaddr_ops', amproclefttype => 'macaddr',
178176
amprocrighttype => 'macaddr', amprocnum => '1', amproc => 'macaddr_cmp' },
179177
{ amprocfamily => 'btree/macaddr_ops', amproclefttype => 'macaddr',

‎src/include/catalog/pg_opfamily.dat

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050
opfmethod => 'btree', opfname => 'integer_ops' },
5151
{ oid => '1977',
5252
opfmethod => 'hash', opfname => 'integer_ops' },
53-
{ oid => '1982',
53+
{ oid => '1982', oid_symbol => 'INTERVAL_BTREE_FAM_OID',
5454
opfmethod => 'btree', opfname => 'interval_ops' },
5555
{ oid => '1983',
5656
opfmethod => 'hash', opfname => 'interval_ops' },

‎src/test/regress/expected/opr_sanity.out

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2192,14 +2192,15 @@ ORDER BY 1, 2, 3;
21922192
| array_ops | array_ops | anyarray
21932193
| float_ops | float4_ops | real
21942194
| float_ops | float8_ops | double precision
2195+
| interval_ops | interval_ops | interval
21952196
| jsonb_ops | jsonb_ops | jsonb
21962197
| numeric_ops | numeric_ops | numeric
21972198
| range_ops | range_ops | anyrange
21982199
| record_image_ops | record_image_ops | record
21992200
| record_ops | record_ops | record
22002201
| tsquery_ops | tsquery_ops | tsquery
22012202
| tsvector_ops | tsvector_ops | tsvector
2202-
(14 rows)
2203+
(15 rows)
22032204

22042205
-- **************** pg_index ****************
22052206
-- Look for illegal values in pg_index fields.

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp