v2-0001-Adds-check-of-index-key-size-for-ltree-gist-opera.patch
text/x-patch
Filename: v2-0001-Adds-check-of-index-key-size-for-ltree-gist-opera.patch
Type: text/x-patch
Part: 0
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: format-patch
Series: patch v2-0001
Subject: Adds check of index key size for ltree gist operator class
| File | + | − |
|---|---|---|
| contrib/ltree/ltree_gist.c | 13 | 0 |
From cd7001e9bc8b46710c948f4d9a31e173b6b2da53 Mon Sep 17 00:00:00 2001
From: Arseniy Mukhin <arseniy.mukhin.dev@gmail.com>
Date: Sat, 16 Aug 2025 14:46:54 +0300
Subject: [PATCH v2] Adds check of index key size for ltree gist operator class
---
contrib/ltree/ltree_gist.c | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/contrib/ltree/ltree_gist.c b/contrib/ltree/ltree_gist.c
index 932f69bff2d..81e1e7ee5da 100644
--- a/contrib/ltree/ltree_gist.c
+++ b/contrib/ltree/ltree_gist.c
@@ -11,6 +11,7 @@
#include "crc32.h"
#include "ltree.h"
#include "utils/array.h"
+#include "utils/rel.h"
#define NEXTVAL(x) ( (lquery*)( (char*)(x) + INTALIGN( VARSIZE(x) ) ) )
#define ISEQ(a,b) ( (a)->numlevel == (b)->numlevel && ltree_compare(a,b)==0 )
@@ -100,6 +101,18 @@ ltree_compress(PG_FUNCTION_ARGS)
{ /* ltree */
ltree *val = DatumGetLtreeP(entry->key);
ltree_gist *key = ltree_gist_alloc(false, NULL, 0, val, 0);
+ int siglen = LTREE_GET_SIGLEN();
+
+ if (siglen + VARSIZE(val) * 2 > GISTMaxIndexKeySize)
+ {
+ Size max_size = (GISTMaxIndexKeySize - siglen) / 2;
+
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("index key size %zu exceeds maximum %zu for index \"%s\"",
+ VARSIZE(val), max_size,
+ RelationGetRelationName(entry->rel))));
+ }
retval = (GISTENTRY *) palloc(sizeof(GISTENTRY));
gistentryinit(*retval, PointerGetDatum(key),
--
2.43.0