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

