0001-Validate-ltree-siglen-v1.patch
application/octet-stream
Filename: 0001-Validate-ltree-siglen-v1.patch
Type: application/octet-stream
Part: 0
Patch
Format: format-patch
Series: patch v1-0001
Subject: Validate ltree siglen
| File | + | − |
|---|---|---|
| contrib/ltree/expected/ltree.out | 3 | 1 |
| contrib/ltree/ltree_gist.c | 13 | 0 |
| contrib/ltree/sql/ltree.sql | 1 | 0 |
From 6b820bbec62d863d95cd9ab7378d9024a2665c19 Mon Sep 17 00:00:00 2001
From: Alexander Korotkov <akorotkov@postgresql.org>
Date: Sun, 19 Mar 2023 19:58:27 +0300
Subject: [PATCH] Validate ltree siglen
---
contrib/ltree/expected/ltree.out | 4 +++-
contrib/ltree/ltree_gist.c | 13 +++++++++++++
contrib/ltree/sql/ltree.sql | 1 +
3 files changed, 17 insertions(+), 1 deletion(-)
diff --git a/contrib/ltree/expected/ltree.out b/contrib/ltree/expected/ltree.out
index 27122153c71..f2e30caadd9 100644
--- a/contrib/ltree/expected/ltree.out
+++ b/contrib/ltree/expected/ltree.out
@@ -7837,7 +7837,9 @@ create index tstidx on ltreetest using gist (t gist_ltree_ops(siglen=0));
ERROR: value 0 out of bounds for option "siglen"
DETAIL: Valid values are between "1" and "2024".
create index tstidx on ltreetest using gist (t gist_ltree_ops(siglen=2025));
-ERROR: value 2025 out of bounds for option "siglen"
+ERROR: siglen value must be integer-alignment
+create index tstidx on ltreetest using gist (t gist_ltree_ops(siglen=2028));
+ERROR: value 2028 out of bounds for option "siglen"
DETAIL: Valid values are between "1" and "2024".
create index tstidx on ltreetest using gist (t gist_ltree_ops(siglen=2024));
SELECT count(*) FROM ltreetest WHERE t < '12.3';
diff --git a/contrib/ltree/ltree_gist.c b/contrib/ltree/ltree_gist.c
index 3cba2269d86..1fc9e9fcf5d 100644
--- a/contrib/ltree/ltree_gist.c
+++ b/contrib/ltree/ltree_gist.c
@@ -719,6 +719,18 @@ ltree_consistent(PG_FUNCTION_ARGS)
PG_RETURN_BOOL(res);
}
+static void
+ltree_gist_relopts_validator(void *parsed_options, relopt_value *vals,
+ int nvals)
+{
+ LtreeGistOptions *options = (LtreeGistOptions *) parsed_options;
+
+ if (options->siglen != INTALIGN(options->siglen))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("siglen value must be integer-alignment")));
+}
+
Datum
ltree_gist_options(PG_FUNCTION_ARGS)
{
@@ -729,6 +741,7 @@ ltree_gist_options(PG_FUNCTION_ARGS)
"signature length in bytes",
LTREE_SIGLEN_DEFAULT, 1, LTREE_SIGLEN_MAX,
offsetof(LtreeGistOptions, siglen));
+ register_reloptions_validator(relopts, ltree_gist_relopts_validator);
PG_RETURN_VOID();
}
diff --git a/contrib/ltree/sql/ltree.sql b/contrib/ltree/sql/ltree.sql
index 4623b57f7b5..57f9559b4ac 100644
--- a/contrib/ltree/sql/ltree.sql
+++ b/contrib/ltree/sql/ltree.sql
@@ -331,6 +331,7 @@ SELECT * FROM ltreetest WHERE t ? '{23.*.1,23.*.2}' order by t asc;
drop index tstidx;
create index tstidx on ltreetest using gist (t gist_ltree_ops(siglen=0));
create index tstidx on ltreetest using gist (t gist_ltree_ops(siglen=2025));
+create index tstidx on ltreetest using gist (t gist_ltree_ops(siglen=2028));
create index tstidx on ltreetest using gist (t gist_ltree_ops(siglen=2024));
SELECT count(*) FROM ltreetest WHERE t < '12.3';
--
2.37.1 (Apple Git-137.1)