From 6b820bbec62d863d95cd9ab7378d9024a2665c19 Mon Sep 17 00:00:00 2001 From: Alexander Korotkov 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)