From b199dd4e899b920591b9948323523f282c7dced6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Esteban=20Zim=C3=A1nyi?= Date: Fri, 28 Aug 2026 01:26:36 +0200 Subject: [PATCH] Answer the MobilityDB operators soundly from a multi-entry key A key of a multi-entry index covers one entry of the indexed value, while the consistent methods of MobilityDB answer for a key that covers the whole value. The operator classes for the temporal, the temporal number and the temporal point types read those methods, and two of their answers do not hold for an entry: contains and same ask the key to hold the query, which no single entry need do even when the value holds it, and the position strategies are exact for a key covering the whole value, so MobilityDB reports that they need no recheck. The multi-entry methods state both corrections, answering contains and same with overlaps and rechecking every strategy, and delegate the rest to MobilityDB, which keeps one implementation of the box semantics. The topological and the position operators of MobilityDB answer on the bounding box of a value. The entries of a value cover the value but not its bounding box, so a query that meets the box where no entry lies had no entry that could find it: tbl_tgeompoint rows 33 and 31 overlap as boxes while no entry of one meets the box of the other, and the index read 151 rows against 152 sequential. The bounding box is itself a key of the value, which gives every strategy that reads it an entry that answers it. The whole contrib suite, 28 tests, agrees with the sequential scan. --- contrib/mobilitydb/consistent_mest.c | 328 ++++++++++++++++++ .../05_tnumber_posops_equisplit.test.out | 4 +- .../05_tnumber_posops_segsplit.test.out | 4 +- .../05_tnumber_topops_equisplit.test.out | 4 +- .../05_tnumber_topops_segsplit.test.out | 4 +- .../05_tnumber_topops_tilesplit.test.out | 4 +- .../06_tpoint_topops_equisplit.test.out | 4 +- .../06_tpoint_topops_segsplit.test.out | 4 +- contrib/mobilitydb/mobilitydb_mest--1.0.sql | 281 +++++++++------ contrib/mobilitydb/temporal_mest.c | 34 +- contrib/mobilitydb/tnumber_mest.c | 39 ++- contrib/mobilitydb/tpoint_mest.c | 46 ++- 12 files changed, 594 insertions(+), 162 deletions(-) create mode 100644 contrib/mobilitydb/consistent_mest.c diff --git a/contrib/mobilitydb/consistent_mest.c b/contrib/mobilitydb/consistent_mest.c new file mode 100644 index 0000000..cef37ff --- /dev/null +++ b/contrib/mobilitydb/consistent_mest.c @@ -0,0 +1,328 @@ +/* + * consistent_mest.c + * + * Multi-Entry consistent methods for the MobilityDB temporal types + * + * A key of a multi-entry index covers ONE entry of the indexed value, while + * the consistent methods of MobilityDB answer for a key that covers the WHOLE + * value. Two of their answers are therefore wrong on a multi-entry key: + * + * - `contains` and `same` ask the key to hold the query, which no single entry + * of a value need do even when the value holds the query. The question an + * entry answers is `overlaps`, which admits every value the strategy selects + * and leaves the rest to the recheck. + * - the position strategies are exact for a key covering the whole value, so + * MobilityDB reports that they need no recheck. An entry covers a part of + * the value, so it answers those strategies for that part and the heap tuple + * settles them. + * + * A method below states both corrections and delegates the rest of the work to + * MobilityDB, which keeps one implementation of the box semantics. + * + * Author: Maxime Schoemans + */ + +#include "postgres.h" +#include "common/pg_prng.h" +#include "fmgr.h" +#include "access/gist.h" +#include "access/spgist.h" +#include "access/stratnum.h" +#include "utils/array.h" +#include "utils/date.h" +#include "utils/timestamp.h" + +#include +#include +#include +#include "mobilitydb_mest.h" + +/***************************************************************************** + * Consistent methods of MobilityDB + *****************************************************************************/ + +extern Datum Span_gist_consistent(PG_FUNCTION_ARGS); +extern Datum Span_quadtree_inner_consistent(PG_FUNCTION_ARGS); +extern Datum Span_kdtree_inner_consistent(PG_FUNCTION_ARGS); +extern Datum Span_spgist_leaf_consistent(PG_FUNCTION_ARGS); + +extern Datum Tnumber_gist_consistent(PG_FUNCTION_ARGS); +extern Datum Tbox_quadtree_inner_consistent(PG_FUNCTION_ARGS); +extern Datum Tbox_kdtree_inner_consistent(PG_FUNCTION_ARGS); +extern Datum Tbox_spgist_leaf_consistent(PG_FUNCTION_ARGS); + +extern Datum Stbox_gist_consistent(PG_FUNCTION_ARGS); +extern Datum Stbox_quadtree_inner_consistent(PG_FUNCTION_ARGS); +extern Datum Stbox_kdtree_inner_consistent(PG_FUNCTION_ARGS); +extern Datum Stbox_spgist_leaf_consistent(PG_FUNCTION_ARGS); + +/***************************************************************************** + * Generic Multi-Entry consistent methods + *****************************************************************************/ + +/** + * @brief Return the strategy that an entry of a multi-entry key answers for a + * given strategy + */ +static StrategyNumber +mest_strategy(StrategyNumber strategy) +{ + switch (strategy) + { + case RTContainsStrategyNumber: + case RTSameStrategyNumber: + return RTOverlapStrategyNumber; + default: + return strategy; + } +} + +/** + * @brief Return a copy of an array of scan keys in which every strategy is the + * one that an entry of a multi-entry key answers + */ +static ScanKey +mest_scankeys(ScanKey scankeys, int nkeys) +{ + ScanKey result = palloc(sizeof(ScanKeyData) * nkeys); + memcpy(result, scankeys, sizeof(ScanKeyData) * nkeys); + for (int i = 0; i < nkeys; i++) + result[i].sk_strategy = mest_strategy(result[i].sk_strategy); + return result; +} + +/** + * @brief Multi-Entry GiST consistent method for the consistent method of + * MobilityDB given in the first argument + */ +static Datum +mest_gist_consistent(PGFunction func, FunctionCallInfo fcinfo) +{ + StrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2); + bool *recheck = (bool *) PG_GETARG_POINTER(4); + Datum result; + bool answer; + + LOCAL_FCINFO(fcinfo1, 5); + InitFunctionCallInfoData(*fcinfo1, fcinfo->flinfo, 5, PG_GET_COLLATION(), + fcinfo->context, fcinfo->resultinfo); + for (int i = 0; i < 5; i++) + { + fcinfo1->args[i].value = fcinfo->args[i].value; + fcinfo1->args[i].isnull = fcinfo->args[i].isnull; + } + fcinfo1->args[2].value = UInt16GetDatum(mest_strategy(strategy)); + result = (*func) (fcinfo1); + answer = fcinfo1->isnull ? false : DatumGetBool(result); + + /* An entry covers a part of the value, so the heap tuple settles every + * strategy */ + *recheck = true; + PG_RETURN_BOOL(answer); +} + +/** + * @brief Multi-Entry SP-GiST inner consistent method for the inner consistent + * method of MobilityDB given in the first argument + */ +static Datum +mest_spgist_inner_consistent(PGFunction func, FunctionCallInfo fcinfo) +{ + spgInnerConsistentIn *in = (spgInnerConsistentIn *) PG_GETARG_POINTER(0); + spgInnerConsistentIn in1 = *in; + Datum result; + LOCAL_FCINFO(fcinfo1, 2); + + in1.scankeys = mest_scankeys(in->scankeys, in->nkeys); + InitFunctionCallInfoData(*fcinfo1, fcinfo->flinfo, 2, PG_GET_COLLATION(), + fcinfo->context, fcinfo->resultinfo); + fcinfo1->args[0].value = PointerGetDatum(&in1); + fcinfo1->args[0].isnull = false; + fcinfo1->args[1].value = fcinfo->args[1].value; + fcinfo1->args[1].isnull = fcinfo->args[1].isnull; + result = (*func) (fcinfo1); + + pfree(in1.scankeys); + return result; +} + +/** + * @brief Multi-Entry SP-GiST leaf consistent method for the leaf consistent + * method of MobilityDB given in the first argument + */ +static Datum +mest_spgist_leaf_consistent(PGFunction func, FunctionCallInfo fcinfo) +{ + spgLeafConsistentIn *in = (spgLeafConsistentIn *) PG_GETARG_POINTER(0); + spgLeafConsistentOut *out = (spgLeafConsistentOut *) PG_GETARG_POINTER(1); + spgLeafConsistentIn in1 = *in; + Datum result; + LOCAL_FCINFO(fcinfo1, 2); + + in1.scankeys = mest_scankeys(in->scankeys, in->nkeys); + InitFunctionCallInfoData(*fcinfo1, fcinfo->flinfo, 2, PG_GET_COLLATION(), + fcinfo->context, fcinfo->resultinfo); + fcinfo1->args[0].value = PointerGetDatum(&in1); + fcinfo1->args[0].isnull = false; + fcinfo1->args[1].value = PointerGetDatum(out); + fcinfo1->args[1].isnull = false; + result = (*func) (fcinfo1); + + pfree(in1.scankeys); + /* An entry covers a part of the value, so the heap tuple settles every + * strategy */ + out->recheck = true; + return result; +} + +/***************************************************************************** + * Multi-Entry consistent methods for temporal types + *****************************************************************************/ + +PGDLLEXPORT Datum Temporal_mgist_consistent(PG_FUNCTION_ARGS); +PG_FUNCTION_INFO_V1(Temporal_mgist_consistent); +/** + * @brief Multi-Entry GiST consistent method for temporal types + */ +Datum +Temporal_mgist_consistent(PG_FUNCTION_ARGS) +{ + return mest_gist_consistent(&Span_gist_consistent, fcinfo); +} + +PGDLLEXPORT Datum Span_mquadtree_inner_consistent(PG_FUNCTION_ARGS); +PG_FUNCTION_INFO_V1(Span_mquadtree_inner_consistent); +/** + * @brief Multi-Entry SP-GiST quadtree inner consistent method for span keys + */ +Datum +Span_mquadtree_inner_consistent(PG_FUNCTION_ARGS) +{ + return mest_spgist_inner_consistent(&Span_quadtree_inner_consistent, fcinfo); +} + +PGDLLEXPORT Datum Span_mkdtree_inner_consistent(PG_FUNCTION_ARGS); +PG_FUNCTION_INFO_V1(Span_mkdtree_inner_consistent); +/** + * @brief Multi-Entry SP-GiST k-d tree inner consistent method for span keys + */ +Datum +Span_mkdtree_inner_consistent(PG_FUNCTION_ARGS) +{ + return mest_spgist_inner_consistent(&Span_kdtree_inner_consistent, fcinfo); +} + +PGDLLEXPORT Datum Span_mspgist_leaf_consistent(PG_FUNCTION_ARGS); +PG_FUNCTION_INFO_V1(Span_mspgist_leaf_consistent); +/** + * @brief Multi-Entry SP-GiST leaf consistent method for span keys + */ +Datum +Span_mspgist_leaf_consistent(PG_FUNCTION_ARGS) +{ + return mest_spgist_leaf_consistent(&Span_spgist_leaf_consistent, fcinfo); +} + +/***************************************************************************** + * Multi-Entry consistent methods for temporal number types + *****************************************************************************/ + +PGDLLEXPORT Datum Tnumber_mgist_consistent(PG_FUNCTION_ARGS); +PG_FUNCTION_INFO_V1(Tnumber_mgist_consistent); +/** + * @brief Multi-Entry GiST consistent method for temporal number types + */ +Datum +Tnumber_mgist_consistent(PG_FUNCTION_ARGS) +{ + return mest_gist_consistent(&Tnumber_gist_consistent, fcinfo); +} + +PGDLLEXPORT Datum Tbox_mquadtree_inner_consistent(PG_FUNCTION_ARGS); +PG_FUNCTION_INFO_V1(Tbox_mquadtree_inner_consistent); +/** + * @brief Multi-Entry SP-GiST quadtree inner consistent method for temporal box + * keys + */ +Datum +Tbox_mquadtree_inner_consistent(PG_FUNCTION_ARGS) +{ + return mest_spgist_inner_consistent(&Tbox_quadtree_inner_consistent, fcinfo); +} + +PGDLLEXPORT Datum Tbox_mkdtree_inner_consistent(PG_FUNCTION_ARGS); +PG_FUNCTION_INFO_V1(Tbox_mkdtree_inner_consistent); +/** + * @brief Multi-Entry SP-GiST k-d tree inner consistent method for temporal box + * keys + */ +Datum +Tbox_mkdtree_inner_consistent(PG_FUNCTION_ARGS) +{ + return mest_spgist_inner_consistent(&Tbox_kdtree_inner_consistent, fcinfo); +} + +PGDLLEXPORT Datum Tbox_mspgist_leaf_consistent(PG_FUNCTION_ARGS); +PG_FUNCTION_INFO_V1(Tbox_mspgist_leaf_consistent); +/** + * @brief Multi-Entry SP-GiST leaf consistent method for temporal box keys + */ +Datum +Tbox_mspgist_leaf_consistent(PG_FUNCTION_ARGS) +{ + return mest_spgist_leaf_consistent(&Tbox_spgist_leaf_consistent, fcinfo); +} + +/***************************************************************************** + * Multi-Entry consistent methods for temporal point types + *****************************************************************************/ + +PGDLLEXPORT Datum Tpoint_mgist_consistent(PG_FUNCTION_ARGS); +PG_FUNCTION_INFO_V1(Tpoint_mgist_consistent); +/** + * @brief Multi-Entry GiST consistent method for temporal point types + */ +Datum +Tpoint_mgist_consistent(PG_FUNCTION_ARGS) +{ + return mest_gist_consistent(&Stbox_gist_consistent, fcinfo); +} + +PGDLLEXPORT Datum Stbox_mquadtree_inner_consistent(PG_FUNCTION_ARGS); +PG_FUNCTION_INFO_V1(Stbox_mquadtree_inner_consistent); +/** + * @brief Multi-Entry SP-GiST quadtree inner consistent method for + * spatiotemporal box keys + */ +Datum +Stbox_mquadtree_inner_consistent(PG_FUNCTION_ARGS) +{ + return mest_spgist_inner_consistent(&Stbox_quadtree_inner_consistent, + fcinfo); +} + +PGDLLEXPORT Datum Stbox_mkdtree_inner_consistent(PG_FUNCTION_ARGS); +PG_FUNCTION_INFO_V1(Stbox_mkdtree_inner_consistent); +/** + * @brief Multi-Entry SP-GiST k-d tree inner consistent method for + * spatiotemporal box keys + */ +Datum +Stbox_mkdtree_inner_consistent(PG_FUNCTION_ARGS) +{ + return mest_spgist_inner_consistent(&Stbox_kdtree_inner_consistent, fcinfo); +} + +PGDLLEXPORT Datum Stbox_mspgist_leaf_consistent(PG_FUNCTION_ARGS); +PG_FUNCTION_INFO_V1(Stbox_mspgist_leaf_consistent); +/** + * @brief Multi-Entry SP-GiST leaf consistent method for spatiotemporal box + * keys + */ +Datum +Stbox_mspgist_leaf_consistent(PG_FUNCTION_ARGS) +{ + return mest_spgist_leaf_consistent(&Stbox_spgist_leaf_consistent, fcinfo); +} + +/*****************************************************************************/ diff --git a/contrib/mobilitydb/expected/05_tnumber_posops_equisplit.test.out b/contrib/mobilitydb/expected/05_tnumber_posops_equisplit.test.out index db75449..00872cd 100644 --- a/contrib/mobilitydb/expected/05_tnumber_posops_equisplit.test.out +++ b/contrib/mobilitydb/expected/05_tnumber_posops_equisplit.test.out @@ -624,8 +624,8 @@ SELECT * FROM test_posops WHERE no_idx <> mrtree_idx OR no_idx <> mquadtree_idx OR no_idx <> mkdtree_idx OR no_idx IS NULL OR mrtree_idx IS NULL OR mquadtree_idx IS NULL OR mkdtree_idx IS NULL ORDER BY op, leftarg, rightarg; - op | leftarg | rightarg | no_idx | mrtree_idx | mquadtree_idx | mkdtree_idx ------+---------+----------+--------+------------+---------------+------------- + op | leftarg | rightarg | no_idx | mrtree_idx | mquadtree_idx | mkdtree_idx +----+---------+----------+--------+------------+---------------+------------- (0 rows) DROP TABLE test_posops; diff --git a/contrib/mobilitydb/expected/05_tnumber_posops_segsplit.test.out b/contrib/mobilitydb/expected/05_tnumber_posops_segsplit.test.out index d77f40a..c769ef3 100644 --- a/contrib/mobilitydb/expected/05_tnumber_posops_segsplit.test.out +++ b/contrib/mobilitydb/expected/05_tnumber_posops_segsplit.test.out @@ -624,8 +624,8 @@ SELECT * FROM test_posops WHERE no_idx <> mrtree_idx OR no_idx <> mquadtree_idx OR no_idx <> mkdtree_idx OR no_idx IS NULL OR mrtree_idx IS NULL OR mquadtree_idx IS NULL OR mkdtree_idx IS NULL ORDER BY op, leftarg, rightarg; - op | leftarg | rightarg | no_idx | mrtree_idx | mquadtree_idx | mkdtree_idx ------+---------+----------+--------+------------+---------------+------------- + op | leftarg | rightarg | no_idx | mrtree_idx | mquadtree_idx | mkdtree_idx +----+---------+----------+--------+------------+---------------+------------- (0 rows) DROP TABLE test_posops; diff --git a/contrib/mobilitydb/expected/05_tnumber_topops_equisplit.test.out b/contrib/mobilitydb/expected/05_tnumber_topops_equisplit.test.out index 38df0ef..be0e6aa 100644 --- a/contrib/mobilitydb/expected/05_tnumber_topops_equisplit.test.out +++ b/contrib/mobilitydb/expected/05_tnumber_topops_equisplit.test.out @@ -485,8 +485,8 @@ SELECT * FROM test_topops WHERE no_idx <> mrtree_idx OR no_idx <> mquadtree_idx OR no_idx <> mkdtree_idx OR no_idx IS NULL OR mrtree_idx IS NULL OR mquadtree_idx IS NULL OR mkdtree_idx IS NULL ORDER BY op, leftarg, rightarg; - op | leftarg | rightarg | no_idx | mrtree_idx | mquadtree_idx | mkdtree_idx ------+---------+----------+--------+------------+---------------+------------- + op | leftarg | rightarg | no_idx | mrtree_idx | mquadtree_idx | mkdtree_idx +----+---------+----------+--------+------------+---------------+------------- (0 rows) DROP TABLE test_topops; diff --git a/contrib/mobilitydb/expected/05_tnumber_topops_segsplit.test.out b/contrib/mobilitydb/expected/05_tnumber_topops_segsplit.test.out index ebcefa3..83bb86e 100644 --- a/contrib/mobilitydb/expected/05_tnumber_topops_segsplit.test.out +++ b/contrib/mobilitydb/expected/05_tnumber_topops_segsplit.test.out @@ -483,8 +483,8 @@ SELECT * FROM test_topops WHERE no_idx <> mrtree_idx OR no_idx <> mquadtree_idx OR no_idx <> mkdtree_idx OR no_idx IS NULL OR mrtree_idx IS NULL OR mquadtree_idx IS NULL OR mkdtree_idx IS NULL ORDER BY op, leftarg, rightarg; - op | leftarg | rightarg | no_idx | mrtree_idx | mquadtree_idx | mkdtree_idx ------+---------+----------+--------+------------+---------------+------------- + op | leftarg | rightarg | no_idx | mrtree_idx | mquadtree_idx | mkdtree_idx +----+---------+----------+--------+------------+---------------+------------- (0 rows) DROP TABLE test_topops; diff --git a/contrib/mobilitydb/expected/05_tnumber_topops_tilesplit.test.out b/contrib/mobilitydb/expected/05_tnumber_topops_tilesplit.test.out index dc35fbf..0f72faf 100644 --- a/contrib/mobilitydb/expected/05_tnumber_topops_tilesplit.test.out +++ b/contrib/mobilitydb/expected/05_tnumber_topops_tilesplit.test.out @@ -483,8 +483,8 @@ SELECT * FROM test_topops WHERE no_idx <> mrtree_idx OR no_idx <> mquadtree_idx OR no_idx <> mkdtree_idx OR no_idx IS NULL OR mrtree_idx IS NULL OR mquadtree_idx IS NULL OR mkdtree_idx IS NULL ORDER BY op, leftarg, rightarg; - op | leftarg | rightarg | no_idx | mrtree_idx | mquadtree_idx | mkdtree_idx ------+---------+----------+--------+------------+---------------+------------- + op | leftarg | rightarg | no_idx | mrtree_idx | mquadtree_idx | mkdtree_idx +----+---------+----------+--------+------------+---------------+------------- (0 rows) DROP TABLE test_topops; diff --git a/contrib/mobilitydb/expected/06_tpoint_topops_equisplit.test.out b/contrib/mobilitydb/expected/06_tpoint_topops_equisplit.test.out index 45c780d..e34641a 100644 --- a/contrib/mobilitydb/expected/06_tpoint_topops_equisplit.test.out +++ b/contrib/mobilitydb/expected/06_tpoint_topops_equisplit.test.out @@ -472,8 +472,8 @@ SELECT * FROM test_topops WHERE no_idx <> mrtree_idx OR no_idx <> mquadtree_idx OR no_idx <> mkdtree_idx OR no_idx IS NULL OR mrtree_idx IS NULL OR mquadtree_idx IS NULL OR mkdtree_idx IS NULL ORDER BY op, leftarg, rightarg; - op | leftarg | rightarg | no_idx | mrtree_idx | mquadtree_idx | mkdtree_idx ------+---------+----------+--------+------------+---------------+------------- + op | leftarg | rightarg | no_idx | mrtree_idx | mquadtree_idx | mkdtree_idx +----+---------+----------+--------+------------+---------------+------------- (0 rows) DROP TABLE test_topops; diff --git a/contrib/mobilitydb/expected/06_tpoint_topops_segsplit.test.out b/contrib/mobilitydb/expected/06_tpoint_topops_segsplit.test.out index ce0b3b8..7a45931 100644 --- a/contrib/mobilitydb/expected/06_tpoint_topops_segsplit.test.out +++ b/contrib/mobilitydb/expected/06_tpoint_topops_segsplit.test.out @@ -472,8 +472,8 @@ SELECT * FROM test_topops WHERE no_idx <> mrtree_idx OR no_idx <> mquadtree_idx OR no_idx <> mkdtree_idx OR no_idx IS NULL OR mrtree_idx IS NULL OR mquadtree_idx IS NULL OR mkdtree_idx IS NULL ORDER BY op, leftarg, rightarg; - op | leftarg | rightarg | no_idx | mrtree_idx | mquadtree_idx | mkdtree_idx ------+----------+----------+--------+------------+---------------+------------- + op | leftarg | rightarg | no_idx | mrtree_idx | mquadtree_idx | mkdtree_idx +----+---------+----------+--------+------------+---------------+------------- (0 rows) DROP TABLE test_topops; diff --git a/contrib/mobilitydb/mobilitydb_mest--1.0.sql b/contrib/mobilitydb/mobilitydb_mest--1.0.sql index 0a06751..6c66e65 100755 --- a/contrib/mobilitydb/mobilitydb_mest--1.0.sql +++ b/contrib/mobilitydb/mobilitydb_mest--1.0.sql @@ -10,6 +10,77 @@ CREATE FUNCTION stbox_collect(stbox[]) AS $$ SELECT ST_Collect(b::geometry) FROM unnest($1) AS b $$ LANGUAGE SQL; +/****************************************************************************** + * Multi-Entry consistent methods + * + * A key covers one entry of the indexed value, so a strategy that asks the key + * to hold the query is answered with overlaps and every strategy is rechecked + ******************************************************************************/ + +CREATE FUNCTION tbool_mgist_consistent(internal, tbool, smallint, oid, internal) + RETURNS boolean + AS 'MODULE_PATHNAME', 'Temporal_mgist_consistent' + LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; +CREATE FUNCTION ttext_mgist_consistent(internal, ttext, smallint, oid, internal) + RETURNS boolean + AS 'MODULE_PATHNAME', 'Temporal_mgist_consistent' + LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; +CREATE FUNCTION tint_mgist_consistent(internal, tint, smallint, oid, internal) + RETURNS boolean + AS 'MODULE_PATHNAME', 'Tnumber_mgist_consistent' + LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; +CREATE FUNCTION tfloat_mgist_consistent(internal, tfloat, smallint, oid, internal) + RETURNS boolean + AS 'MODULE_PATHNAME', 'Tnumber_mgist_consistent' + LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; +CREATE FUNCTION tgeompoint_mgist_consistent(internal, tgeompoint, smallint, oid, internal) + RETURNS boolean + AS 'MODULE_PATHNAME', 'Tpoint_mgist_consistent' + LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; +CREATE FUNCTION tgeogpoint_mgist_consistent(internal, tgeogpoint, smallint, oid, internal) + RETURNS boolean + AS 'MODULE_PATHNAME', 'Tpoint_mgist_consistent' + LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; + +CREATE FUNCTION span_mquadtree_inner_consistent(internal, internal) + RETURNS void + AS 'MODULE_PATHNAME', 'Span_mquadtree_inner_consistent' + LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; +CREATE FUNCTION span_mkdtree_inner_consistent(internal, internal) + RETURNS void + AS 'MODULE_PATHNAME', 'Span_mkdtree_inner_consistent' + LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; +CREATE FUNCTION span_mspgist_leaf_consistent(internal, internal) + RETURNS bool + AS 'MODULE_PATHNAME', 'Span_mspgist_leaf_consistent' + LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; + +CREATE FUNCTION tbox_mquadtree_inner_consistent(internal, internal) + RETURNS void + AS 'MODULE_PATHNAME', 'Tbox_mquadtree_inner_consistent' + LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; +CREATE FUNCTION tbox_mkdtree_inner_consistent(internal, internal) + RETURNS void + AS 'MODULE_PATHNAME', 'Tbox_mkdtree_inner_consistent' + LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; +CREATE FUNCTION tbox_mspgist_leaf_consistent(internal, internal) + RETURNS bool + AS 'MODULE_PATHNAME', 'Tbox_mspgist_leaf_consistent' + LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; + +CREATE FUNCTION stbox_mquadtree_inner_consistent(internal, internal) + RETURNS void + AS 'MODULE_PATHNAME', 'Stbox_mquadtree_inner_consistent' + LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; +CREATE FUNCTION stbox_mkdtree_inner_consistent(internal, internal) + RETURNS void + AS 'MODULE_PATHNAME', 'Stbox_mkdtree_inner_consistent' + LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; +CREATE FUNCTION stbox_mspgist_leaf_consistent(internal, internal) + RETURNS bool + AS 'MODULE_PATHNAME', 'Stbox_mspgist_leaf_consistent' + LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; + /****************************************************************************** * Multi-Entry Search Trees common methods for spanset types ******************************************************************************/ @@ -2455,7 +2526,7 @@ CREATE OPERATOR CLASS tbool_mrtree_equisplit_ops OPERATOR 31 #&> (tbool, tstzspan), OPERATOR 31 #&> (tbool, tbool), -- functions - FUNCTION 1 tbool_gist_consistent(internal, tbool, smallint, oid, internal), + FUNCTION 1 tbool_mgist_consistent(internal, tbool, smallint, oid, internal), FUNCTION 2 span_gist_union(internal, internal), FUNCTION 3 temporal_mgist_compress(internal), FUNCTION 5 span_gist_penalty(internal, internal, internal), @@ -2493,8 +2564,8 @@ CREATE OPERATOR CLASS tbool_mquadtree_equisplit_ops FUNCTION 1 tstzspan_spgist_config(internal, internal), FUNCTION 2 span_quadtree_choose(internal, internal), FUNCTION 3 span_quadtree_picksplit(internal, internal), - FUNCTION 4 span_quadtree_inner_consistent(internal, internal), - FUNCTION 5 span_spgist_leaf_consistent(internal, internal), + FUNCTION 4 span_mquadtree_inner_consistent(internal, internal), + FUNCTION 5 span_mspgist_leaf_consistent(internal, internal), FUNCTION 6 temporal_mspgist_compress(internal), FUNCTION 7 temporal_mest_span_options(internal), FUNCTION 8 temporal_mest_equisplit(internal, internal, internal); @@ -2527,8 +2598,8 @@ CREATE OPERATOR CLASS tbool_mkdtree_equisplit_ops FUNCTION 1 tstzspan_spgist_config(internal, internal), FUNCTION 2 span_kdtree_choose(internal, internal), FUNCTION 3 span_kdtree_picksplit(internal, internal), - FUNCTION 4 span_kdtree_inner_consistent(internal, internal), - FUNCTION 5 span_spgist_leaf_consistent(internal, internal), + FUNCTION 4 span_mkdtree_inner_consistent(internal, internal), + FUNCTION 5 span_mspgist_leaf_consistent(internal, internal), FUNCTION 6 temporal_mspgist_compress(internal), FUNCTION 7 temporal_mest_span_options(internal), FUNCTION 8 temporal_mest_equisplit(internal, internal, internal); @@ -2560,7 +2631,7 @@ CREATE OPERATOR CLASS ttext_mrtree_equisplit_ops OPERATOR 31 #&> (ttext, tstzspan), OPERATOR 31 #&> (ttext, ttext), -- functions - FUNCTION 1 ttext_gist_consistent(internal, ttext, smallint, oid, internal), + FUNCTION 1 ttext_mgist_consistent(internal, ttext, smallint, oid, internal), FUNCTION 2 span_gist_union(internal, internal), FUNCTION 3 temporal_mgist_compress(internal), FUNCTION 5 span_gist_penalty(internal, internal, internal), @@ -2598,8 +2669,8 @@ CREATE OPERATOR CLASS ttext_mquadtree_equisplit_ops FUNCTION 1 tstzspan_spgist_config(internal, internal), FUNCTION 2 span_quadtree_choose(internal, internal), FUNCTION 3 span_quadtree_picksplit(internal, internal), - FUNCTION 4 span_quadtree_inner_consistent(internal, internal), - FUNCTION 5 span_spgist_leaf_consistent(internal, internal), + FUNCTION 4 span_mquadtree_inner_consistent(internal, internal), + FUNCTION 5 span_mspgist_leaf_consistent(internal, internal), FUNCTION 6 temporal_mspgist_compress(internal), FUNCTION 7 temporal_mest_span_options(internal), FUNCTION 8 temporal_mest_equisplit(internal, internal, internal); @@ -2632,8 +2703,8 @@ CREATE OPERATOR CLASS ttext_mkdtree_equisplit_ops FUNCTION 1 tstzspan_spgist_config(internal, internal), FUNCTION 2 span_kdtree_choose(internal, internal), FUNCTION 3 span_kdtree_picksplit(internal, internal), - FUNCTION 4 span_kdtree_inner_consistent(internal, internal), - FUNCTION 5 span_spgist_leaf_consistent(internal, internal), + FUNCTION 4 span_mkdtree_inner_consistent(internal, internal), + FUNCTION 5 span_mspgist_leaf_consistent(internal, internal), FUNCTION 6 temporal_mspgist_compress(internal), FUNCTION 7 temporal_mest_span_options(internal), FUNCTION 8 temporal_mest_equisplit(internal, internal, internal); @@ -2672,7 +2743,7 @@ CREATE OPERATOR CLASS tbool_mrtree_segsplit_ops OPERATOR 31 #&> (tbool, tstzspan), OPERATOR 31 #&> (tbool, tbool), -- functions - FUNCTION 1 tbool_gist_consistent(internal, tbool, smallint, oid, internal), + FUNCTION 1 tbool_mgist_consistent(internal, tbool, smallint, oid, internal), FUNCTION 2 span_gist_union(internal, internal), FUNCTION 3 temporal_mgist_compress(internal), FUNCTION 5 span_gist_penalty(internal, internal, internal), @@ -2710,8 +2781,8 @@ CREATE OPERATOR CLASS tbool_mquadtree_segsplit_ops FUNCTION 1 tstzspan_spgist_config(internal, internal), FUNCTION 2 span_quadtree_choose(internal, internal), FUNCTION 3 span_quadtree_picksplit(internal, internal), - FUNCTION 4 span_quadtree_inner_consistent(internal, internal), - FUNCTION 5 span_spgist_leaf_consistent(internal, internal), + FUNCTION 4 span_mquadtree_inner_consistent(internal, internal), + FUNCTION 5 span_mspgist_leaf_consistent(internal, internal), FUNCTION 6 temporal_mspgist_compress(internal), FUNCTION 7 temporal_mest_seg_options(internal), FUNCTION 8 temporal_mest_segsplit(internal, internal, internal); @@ -2744,8 +2815,8 @@ CREATE OPERATOR CLASS tbool_mkdtree_segsplit_ops FUNCTION 1 tstzspan_spgist_config(internal, internal), FUNCTION 2 span_kdtree_choose(internal, internal), FUNCTION 3 span_kdtree_picksplit(internal, internal), - FUNCTION 4 span_kdtree_inner_consistent(internal, internal), - FUNCTION 5 span_spgist_leaf_consistent(internal, internal), + FUNCTION 4 span_mkdtree_inner_consistent(internal, internal), + FUNCTION 5 span_mspgist_leaf_consistent(internal, internal), FUNCTION 6 temporal_mspgist_compress(internal), FUNCTION 7 temporal_mest_seg_options(internal), FUNCTION 8 temporal_mest_segsplit(internal, internal, internal); @@ -2777,7 +2848,7 @@ CREATE OPERATOR CLASS ttext_mrtree_segsplit_ops OPERATOR 31 #&> (ttext, tstzspan), OPERATOR 31 #&> (ttext, ttext), -- functions - FUNCTION 1 ttext_gist_consistent(internal, ttext, smallint, oid, internal), + FUNCTION 1 ttext_mgist_consistent(internal, ttext, smallint, oid, internal), FUNCTION 2 span_gist_union(internal, internal), FUNCTION 3 temporal_mgist_compress(internal), FUNCTION 5 span_gist_penalty(internal, internal, internal), @@ -2815,8 +2886,8 @@ CREATE OPERATOR CLASS ttext_mquadtree_segsplit_ops FUNCTION 1 tstzspan_spgist_config(internal, internal), FUNCTION 2 span_quadtree_choose(internal, internal), FUNCTION 3 span_quadtree_picksplit(internal, internal), - FUNCTION 4 span_quadtree_inner_consistent(internal, internal), - FUNCTION 5 span_spgist_leaf_consistent(internal, internal), + FUNCTION 4 span_mquadtree_inner_consistent(internal, internal), + FUNCTION 5 span_mspgist_leaf_consistent(internal, internal), FUNCTION 6 temporal_mspgist_compress(internal), FUNCTION 7 temporal_mest_seg_options(internal), FUNCTION 8 temporal_mest_segsplit(internal, internal, internal); @@ -2849,8 +2920,8 @@ CREATE OPERATOR CLASS ttext_mkdtree_segsplit_ops FUNCTION 1 tstzspan_spgist_config(internal, internal), FUNCTION 2 span_kdtree_choose(internal, internal), FUNCTION 3 span_kdtree_picksplit(internal, internal), - FUNCTION 4 span_kdtree_inner_consistent(internal, internal), - FUNCTION 5 span_spgist_leaf_consistent(internal, internal), + FUNCTION 4 span_mkdtree_inner_consistent(internal, internal), + FUNCTION 5 span_mspgist_leaf_consistent(internal, internal), FUNCTION 6 temporal_mspgist_compress(internal), FUNCTION 7 temporal_mest_seg_options(internal), FUNCTION 8 temporal_mest_segsplit(internal, internal, internal); @@ -2889,7 +2960,7 @@ CREATE OPERATOR CLASS tbool_mrtree_binsplit_ops OPERATOR 31 #&> (tbool, tstzspan), OPERATOR 31 #&> (tbool, tbool), -- functions - FUNCTION 1 tbool_gist_consistent(internal, tbool, smallint, oid, internal), + FUNCTION 1 tbool_mgist_consistent(internal, tbool, smallint, oid, internal), FUNCTION 2 span_gist_union(internal, internal), FUNCTION 3 temporal_mgist_compress(internal), FUNCTION 5 span_gist_penalty(internal, internal, internal), @@ -2927,8 +2998,8 @@ CREATE OPERATOR CLASS tbool_mquadtree_binsplit_ops FUNCTION 1 tstzspan_spgist_config(internal, internal), FUNCTION 2 span_quadtree_choose(internal, internal), FUNCTION 3 span_quadtree_picksplit(internal, internal), - FUNCTION 4 span_quadtree_inner_consistent(internal, internal), - FUNCTION 5 span_spgist_leaf_consistent(internal, internal), + FUNCTION 4 span_mquadtree_inner_consistent(internal, internal), + FUNCTION 5 span_mspgist_leaf_consistent(internal, internal), FUNCTION 6 temporal_mspgist_compress(internal), FUNCTION 7 temporal_mest_bin_options(internal), FUNCTION 8 temporal_mest_binsplit(internal, internal, internal); @@ -2961,8 +3032,8 @@ CREATE OPERATOR CLASS tbool_mkdtree_binsplit_ops FUNCTION 1 tstzspan_spgist_config(internal, internal), FUNCTION 2 span_kdtree_choose(internal, internal), FUNCTION 3 span_kdtree_picksplit(internal, internal), - FUNCTION 4 span_kdtree_inner_consistent(internal, internal), - FUNCTION 5 span_spgist_leaf_consistent(internal, internal), + FUNCTION 4 span_mkdtree_inner_consistent(internal, internal), + FUNCTION 5 span_mspgist_leaf_consistent(internal, internal), FUNCTION 6 temporal_mspgist_compress(internal), FUNCTION 7 temporal_mest_bin_options(internal), FUNCTION 8 temporal_mest_binsplit(internal, internal, internal); @@ -2994,7 +3065,7 @@ CREATE OPERATOR CLASS ttext_mrtree_binsplit_ops OPERATOR 31 #&> (ttext, tstzspan), OPERATOR 31 #&> (ttext, ttext), -- functions - FUNCTION 1 ttext_gist_consistent(internal, ttext, smallint, oid, internal), + FUNCTION 1 ttext_mgist_consistent(internal, ttext, smallint, oid, internal), FUNCTION 2 span_gist_union(internal, internal), FUNCTION 3 temporal_mgist_compress(internal), FUNCTION 5 span_gist_penalty(internal, internal, internal), @@ -3032,8 +3103,8 @@ CREATE OPERATOR CLASS ttext_mquadtree_binsplit_ops FUNCTION 1 tstzspan_spgist_config(internal, internal), FUNCTION 2 span_quadtree_choose(internal, internal), FUNCTION 3 span_quadtree_picksplit(internal, internal), - FUNCTION 4 span_quadtree_inner_consistent(internal, internal), - FUNCTION 5 span_spgist_leaf_consistent(internal, internal), + FUNCTION 4 span_mquadtree_inner_consistent(internal, internal), + FUNCTION 5 span_mspgist_leaf_consistent(internal, internal), FUNCTION 6 temporal_mspgist_compress(internal), FUNCTION 7 temporal_mest_bin_options(internal), FUNCTION 8 temporal_mest_binsplit(internal, internal, internal); @@ -3072,8 +3143,8 @@ CREATE OPERATOR CLASS ttext_mkdtree_binsplit_ops FUNCTION 1 tstzspan_spgist_config(internal, internal), FUNCTION 2 span_kdtree_choose(internal, internal), FUNCTION 3 span_kdtree_picksplit(internal, internal), - FUNCTION 4 span_kdtree_inner_consistent(internal, internal), - FUNCTION 5 span_spgist_leaf_consistent(internal, internal), + FUNCTION 4 span_mkdtree_inner_consistent(internal, internal), + FUNCTION 5 span_mspgist_leaf_consistent(internal, internal), FUNCTION 6 temporal_mspgist_compress(internal), FUNCTION 7 temporal_mest_bin_options(internal), FUNCTION 8 temporal_mest_binsplit(internal, internal, internal); @@ -3156,7 +3227,7 @@ CREATE OPERATOR CLASS tint_mrtree_equisplit_ops OPERATOR 31 #&> (tint, tbox), OPERATOR 31 #&> (tint, tint), -- functions - FUNCTION 1 tint_gist_consistent(internal, tint, smallint, oid, internal), + FUNCTION 1 tint_mgist_consistent(internal, tint, smallint, oid, internal), FUNCTION 2 tbox_gist_union(internal, internal), FUNCTION 3 tnumber_mgist_compress(internal), FUNCTION 5 tbox_gist_penalty(internal, internal, internal), @@ -3204,8 +3275,8 @@ CREATE OPERATOR CLASS tint_mquadtree_equisplit_ops FUNCTION 1 tbox_spgist_config(internal, internal), FUNCTION 2 tbox_quadtree_choose(internal, internal), FUNCTION 3 tbox_quadtree_picksplit(internal, internal), - FUNCTION 4 tbox_quadtree_inner_consistent(internal, internal), - FUNCTION 5 tbox_spgist_leaf_consistent(internal, internal), + FUNCTION 4 tbox_mquadtree_inner_consistent(internal, internal), + FUNCTION 5 tbox_mspgist_leaf_consistent(internal, internal), FUNCTION 6 tnumber_mspgist_compress(internal), FUNCTION 7 tnumber_mest_box_options(internal), FUNCTION 8 tnumber_mest_equisplit(internal, internal, internal); @@ -3248,8 +3319,8 @@ CREATE OPERATOR CLASS tint_mkdtree_equisplit_ops FUNCTION 1 tbox_spgist_config(internal, internal), FUNCTION 2 tbox_kdtree_choose(internal, internal), FUNCTION 3 tbox_kdtree_picksplit(internal, internal), - FUNCTION 4 tbox_kdtree_inner_consistent(internal, internal), - FUNCTION 5 tbox_spgist_leaf_consistent(internal, internal), + FUNCTION 4 tbox_mkdtree_inner_consistent(internal, internal), + FUNCTION 5 tbox_mspgist_leaf_consistent(internal, internal), FUNCTION 6 tnumber_mspgist_compress(internal), FUNCTION 7 tnumber_mest_box_options(internal), FUNCTION 8 tnumber_mest_equisplit(internal, internal, internal); @@ -3291,7 +3362,7 @@ CREATE OPERATOR CLASS tfloat_mrtree_equisplit_ops OPERATOR 31 #&> (tfloat, tbox), OPERATOR 31 #&> (tfloat, tfloat), -- functions - FUNCTION 1 tfloat_gist_consistent(internal, tfloat, smallint, oid, internal), + FUNCTION 1 tfloat_mgist_consistent(internal, tfloat, smallint, oid, internal), FUNCTION 2 tbox_gist_union(internal, internal), FUNCTION 3 tnumber_mgist_compress(internal), FUNCTION 5 tbox_gist_penalty(internal, internal, internal), @@ -3339,8 +3410,8 @@ CREATE OPERATOR CLASS tfloat_mquadtree_equisplit_ops FUNCTION 1 tbox_spgist_config(internal, internal), FUNCTION 2 tbox_quadtree_choose(internal, internal), FUNCTION 3 tbox_quadtree_picksplit(internal, internal), - FUNCTION 4 tbox_quadtree_inner_consistent(internal, internal), - FUNCTION 5 tbox_spgist_leaf_consistent(internal, internal), + FUNCTION 4 tbox_mquadtree_inner_consistent(internal, internal), + FUNCTION 5 tbox_mspgist_leaf_consistent(internal, internal), FUNCTION 6 tnumber_mspgist_compress(internal), FUNCTION 7 tnumber_mest_box_options(internal), FUNCTION 8 tnumber_mest_equisplit(internal, internal, internal); @@ -3383,8 +3454,8 @@ CREATE OPERATOR CLASS tfloat_mkdtree_equisplit_ops FUNCTION 1 tbox_spgist_config(internal, internal), FUNCTION 2 tbox_kdtree_choose(internal, internal), FUNCTION 3 tbox_kdtree_picksplit(internal, internal), - FUNCTION 4 tbox_kdtree_inner_consistent(internal, internal), - FUNCTION 5 tbox_spgist_leaf_consistent(internal, internal), + FUNCTION 4 tbox_mkdtree_inner_consistent(internal, internal), + FUNCTION 5 tbox_mspgist_leaf_consistent(internal, internal), FUNCTION 6 tnumber_mspgist_compress(internal), FUNCTION 7 tnumber_mest_box_options(internal), FUNCTION 8 tnumber_mest_equisplit(internal, internal, internal); @@ -3433,7 +3504,7 @@ CREATE OPERATOR CLASS tint_mrtree_segsplit_ops OPERATOR 31 #&> (tint, tbox), OPERATOR 31 #&> (tint, tint), -- functions - FUNCTION 1 tint_gist_consistent(internal, tint, smallint, oid, internal), + FUNCTION 1 tint_mgist_consistent(internal, tint, smallint, oid, internal), FUNCTION 2 tbox_gist_union(internal, internal), FUNCTION 3 tnumber_mgist_compress(internal), FUNCTION 5 tbox_gist_penalty(internal, internal, internal), @@ -3481,8 +3552,8 @@ CREATE OPERATOR CLASS tint_mquadtree_segsplit_ops FUNCTION 1 tbox_spgist_config(internal, internal), FUNCTION 2 tbox_quadtree_choose(internal, internal), FUNCTION 3 tbox_quadtree_picksplit(internal, internal), - FUNCTION 4 tbox_quadtree_inner_consistent(internal, internal), - FUNCTION 5 tbox_spgist_leaf_consistent(internal, internal), + FUNCTION 4 tbox_mquadtree_inner_consistent(internal, internal), + FUNCTION 5 tbox_mspgist_leaf_consistent(internal, internal), FUNCTION 6 tnumber_mspgist_compress(internal), FUNCTION 7 tnumber_mest_seg_options(internal), FUNCTION 8 tnumber_mest_segsplit(internal, internal, internal); @@ -3525,8 +3596,8 @@ CREATE OPERATOR CLASS tint_mkdtree_segsplit_ops FUNCTION 1 tbox_spgist_config(internal, internal), FUNCTION 2 tbox_kdtree_choose(internal, internal), FUNCTION 3 tbox_kdtree_picksplit(internal, internal), - FUNCTION 4 tbox_kdtree_inner_consistent(internal, internal), - FUNCTION 5 tbox_spgist_leaf_consistent(internal, internal), + FUNCTION 4 tbox_mkdtree_inner_consistent(internal, internal), + FUNCTION 5 tbox_mspgist_leaf_consistent(internal, internal), FUNCTION 6 tnumber_mspgist_compress(internal), FUNCTION 7 tnumber_mest_seg_options(internal), FUNCTION 8 tnumber_mest_segsplit(internal, internal, internal); @@ -3568,7 +3639,7 @@ CREATE OPERATOR CLASS tfloat_mrtree_segsplit_ops OPERATOR 31 #&> (tfloat, tbox), OPERATOR 31 #&> (tfloat, tfloat), -- functions - FUNCTION 1 tfloat_gist_consistent(internal, tfloat, smallint, oid, internal), + FUNCTION 1 tfloat_mgist_consistent(internal, tfloat, smallint, oid, internal), FUNCTION 2 tbox_gist_union(internal, internal), FUNCTION 3 tnumber_mgist_compress(internal), FUNCTION 5 tbox_gist_penalty(internal, internal, internal), @@ -3616,8 +3687,8 @@ CREATE OPERATOR CLASS tfloat_mquadtree_segsplit_ops FUNCTION 1 tbox_spgist_config(internal, internal), FUNCTION 2 tbox_quadtree_choose(internal, internal), FUNCTION 3 tbox_quadtree_picksplit(internal, internal), - FUNCTION 4 tbox_quadtree_inner_consistent(internal, internal), - FUNCTION 5 tbox_spgist_leaf_consistent(internal, internal), + FUNCTION 4 tbox_mquadtree_inner_consistent(internal, internal), + FUNCTION 5 tbox_mspgist_leaf_consistent(internal, internal), FUNCTION 6 tnumber_mspgist_compress(internal), FUNCTION 7 tnumber_mest_seg_options(internal), FUNCTION 8 tnumber_mest_segsplit(internal, internal, internal); @@ -3660,8 +3731,8 @@ CREATE OPERATOR CLASS tfloat_mkdtree_segsplit_ops FUNCTION 1 tbox_spgist_config(internal, internal), FUNCTION 2 tbox_kdtree_choose(internal, internal), FUNCTION 3 tbox_kdtree_picksplit(internal, internal), - FUNCTION 4 tbox_kdtree_inner_consistent(internal, internal), - FUNCTION 5 tbox_spgist_leaf_consistent(internal, internal), + FUNCTION 4 tbox_mkdtree_inner_consistent(internal, internal), + FUNCTION 5 tbox_mspgist_leaf_consistent(internal, internal), FUNCTION 6 tnumber_mspgist_compress(internal), FUNCTION 7 tnumber_mest_seg_options(internal), FUNCTION 8 tnumber_mest_segsplit(internal, internal, internal); @@ -3717,7 +3788,7 @@ CREATE OPERATOR CLASS tint_mrtree_tilesplit_ops OPERATOR 31 #&> (tint, tbox), OPERATOR 31 #&> (tint, tint), -- functions - FUNCTION 1 tint_gist_consistent(internal, tint, smallint, oid, internal), + FUNCTION 1 tint_mgist_consistent(internal, tint, smallint, oid, internal), FUNCTION 2 tbox_gist_union(internal, internal), FUNCTION 3 tnumber_mgist_compress(internal), FUNCTION 5 tbox_gist_penalty(internal, internal, internal), @@ -3765,8 +3836,8 @@ CREATE OPERATOR CLASS tint_mquadtree_tilesplit_ops FUNCTION 1 tbox_spgist_config(internal, internal), FUNCTION 2 tbox_quadtree_choose(internal, internal), FUNCTION 3 tbox_quadtree_picksplit(internal, internal), - FUNCTION 4 tbox_quadtree_inner_consistent(internal, internal), - FUNCTION 5 tbox_spgist_leaf_consistent(internal, internal), + FUNCTION 4 tbox_mquadtree_inner_consistent(internal, internal), + FUNCTION 5 tbox_mspgist_leaf_consistent(internal, internal), FUNCTION 6 tnumber_mspgist_compress(internal), FUNCTION 7 tint_mest_tile_options(internal), FUNCTION 8 tint_mest_tilesplit(internal, internal, internal); @@ -3809,8 +3880,8 @@ CREATE OPERATOR CLASS tint_mkdtree_tilesplit_ops FUNCTION 1 tbox_spgist_config(internal, internal), FUNCTION 2 tbox_kdtree_choose(internal, internal), FUNCTION 3 tbox_kdtree_picksplit(internal, internal), - FUNCTION 4 tbox_kdtree_inner_consistent(internal, internal), - FUNCTION 5 tbox_spgist_leaf_consistent(internal, internal), + FUNCTION 4 tbox_mkdtree_inner_consistent(internal, internal), + FUNCTION 5 tbox_mspgist_leaf_consistent(internal, internal), FUNCTION 6 tnumber_mspgist_compress(internal), FUNCTION 7 tint_mest_tile_options(internal), FUNCTION 8 tint_mest_tilesplit(internal, internal, internal); @@ -3854,7 +3925,7 @@ CREATE OPERATOR CLASS tfloat_mrtree_tilesplit_ops OPERATOR 31 #&> (tfloat, tbox), OPERATOR 31 #&> (tfloat, tfloat), -- functions - FUNCTION 1 tfloat_gist_consistent(internal, tfloat, smallint, oid, internal), + FUNCTION 1 tfloat_mgist_consistent(internal, tfloat, smallint, oid, internal), FUNCTION 2 tbox_gist_union(internal, internal), FUNCTION 3 tnumber_mgist_compress(internal), FUNCTION 5 tbox_gist_penalty(internal, internal, internal), @@ -3902,8 +3973,8 @@ CREATE OPERATOR CLASS tfloat_mquadtree_tilesplit_ops FUNCTION 1 tbox_spgist_config(internal, internal), FUNCTION 2 tbox_quadtree_choose(internal, internal), FUNCTION 3 tbox_quadtree_picksplit(internal, internal), - FUNCTION 4 tbox_quadtree_inner_consistent(internal, internal), - FUNCTION 5 tbox_spgist_leaf_consistent(internal, internal), + FUNCTION 4 tbox_mquadtree_inner_consistent(internal, internal), + FUNCTION 5 tbox_mspgist_leaf_consistent(internal, internal), FUNCTION 6 tnumber_mspgist_compress(internal), FUNCTION 7 tfloat_mest_tile_options(internal), FUNCTION 8 tfloat_mest_tilesplit(internal, internal, internal); @@ -3946,8 +4017,8 @@ CREATE OPERATOR CLASS tfloat_mkdtree_tilesplit_ops FUNCTION 1 tbox_spgist_config(internal, internal), FUNCTION 2 tbox_kdtree_choose(internal, internal), FUNCTION 3 tbox_kdtree_picksplit(internal, internal), - FUNCTION 4 tbox_kdtree_inner_consistent(internal, internal), - FUNCTION 5 tbox_spgist_leaf_consistent(internal, internal), + FUNCTION 4 tbox_mkdtree_inner_consistent(internal, internal), + FUNCTION 5 tbox_mspgist_leaf_consistent(internal, internal), FUNCTION 6 tnumber_mspgist_compress(internal), FUNCTION 7 tfloat_mest_tile_options(internal), FUNCTION 8 tfloat_mest_tilesplit(internal, internal, internal); @@ -4027,7 +4098,7 @@ CREATE OPERATOR CLASS tgeompoint_mrtree_equisplit_ops OPERATOR 31 #&> (tgeompoint, stbox), OPERATOR 31 #&> (tgeompoint, tgeompoint), -- functions - FUNCTION 1 tgeompoint_gist_consistent(internal, tgeompoint, smallint, oid, internal), + FUNCTION 1 tgeompoint_mgist_consistent(internal, tgeompoint, smallint, oid, internal), FUNCTION 2 stbox_gist_union(internal, internal), FUNCTION 3 tpoint_mgist_compress(internal), FUNCTION 5 stbox_gist_penalty(internal, internal, internal), @@ -4075,8 +4146,8 @@ CREATE OPERATOR CLASS tgeompoint_mquadtree_equisplit_ops FUNCTION 1 stbox_spgist_config(internal, internal), FUNCTION 2 stbox_quadtree_choose(internal, internal), FUNCTION 3 stbox_quadtree_picksplit(internal, internal), - FUNCTION 4 stbox_quadtree_inner_consistent(internal, internal), - FUNCTION 5 stbox_spgist_leaf_consistent(internal, internal), + FUNCTION 4 stbox_mquadtree_inner_consistent(internal, internal), + FUNCTION 5 stbox_mspgist_leaf_consistent(internal, internal), FUNCTION 6 tpoint_mspgist_compress(internal), FUNCTION 7 tpoint_mest_box_options(internal), FUNCTION 8 tpoint_mest_equisplit(internal, internal, internal); @@ -4119,8 +4190,8 @@ CREATE OPERATOR CLASS tgeompoint_mkdtree_equisplit_ops FUNCTION 1 stbox_spgist_config(internal, internal), FUNCTION 2 stbox_kdtree_choose(internal, internal), FUNCTION 3 stbox_kdtree_picksplit(internal, internal), - FUNCTION 4 stbox_kdtree_inner_consistent(internal, internal), - FUNCTION 5 stbox_spgist_leaf_consistent(internal, internal), + FUNCTION 4 stbox_mkdtree_inner_consistent(internal, internal), + FUNCTION 5 stbox_mspgist_leaf_consistent(internal, internal), FUNCTION 6 tpoint_mspgist_compress(internal), FUNCTION 7 tpoint_mest_box_options(internal), FUNCTION 8 tpoint_mest_equisplit(internal, internal, internal); @@ -4166,7 +4237,7 @@ CREATE OPERATOR CLASS tgeogpoint_mrtree_equisplit_ops OPERATOR 31 #&> (tgeogpoint, stbox), OPERATOR 31 #&> (tgeogpoint, tgeogpoint), -- functions - FUNCTION 1 tgeogpoint_gist_consistent(internal, tgeogpoint, smallint, oid, internal), + FUNCTION 1 tgeogpoint_mgist_consistent(internal, tgeogpoint, smallint, oid, internal), FUNCTION 2 stbox_gist_union(internal, internal), FUNCTION 3 tpoint_mgist_compress(internal), FUNCTION 5 stbox_gist_penalty(internal, internal, internal), @@ -4222,8 +4293,8 @@ CREATE OPERATOR CLASS tgeogpoint_mquadtree_equisplit_ops FUNCTION 1 stbox_spgist_config(internal, internal), FUNCTION 2 stbox_quadtree_choose(internal, internal), FUNCTION 3 stbox_quadtree_picksplit(internal, internal), - FUNCTION 4 stbox_quadtree_inner_consistent(internal, internal), - FUNCTION 5 stbox_spgist_leaf_consistent(internal, internal), + FUNCTION 4 stbox_mquadtree_inner_consistent(internal, internal), + FUNCTION 5 stbox_mspgist_leaf_consistent(internal, internal), FUNCTION 6 tpoint_mspgist_compress(internal), FUNCTION 7 tpoint_mest_box_options(internal), FUNCTION 8 tpoint_mest_equisplit(internal, internal, internal); @@ -4274,8 +4345,8 @@ CREATE OPERATOR CLASS tgeogpoint_mkdtree_equisplit_ops FUNCTION 1 stbox_spgist_config(internal, internal), FUNCTION 2 stbox_kdtree_choose(internal, internal), FUNCTION 3 stbox_kdtree_picksplit(internal, internal), - FUNCTION 4 stbox_kdtree_inner_consistent(internal, internal), - FUNCTION 5 stbox_spgist_leaf_consistent(internal, internal), + FUNCTION 4 stbox_mkdtree_inner_consistent(internal, internal), + FUNCTION 5 stbox_mspgist_leaf_consistent(internal, internal), FUNCTION 6 tpoint_mspgist_compress(internal), FUNCTION 7 tpoint_mest_box_options(internal), FUNCTION 8 tpoint_mest_equisplit(internal, internal, internal); @@ -4324,7 +4395,7 @@ CREATE OPERATOR CLASS tgeompoint_mrtree_segsplit_ops OPERATOR 31 #&> (tgeompoint, stbox), OPERATOR 31 #&> (tgeompoint, tgeompoint), -- functions - FUNCTION 1 tgeompoint_gist_consistent(internal, tgeompoint, smallint, oid, internal), + FUNCTION 1 tgeompoint_mgist_consistent(internal, tgeompoint, smallint, oid, internal), FUNCTION 2 stbox_gist_union(internal, internal), FUNCTION 3 tpoint_mgist_compress(internal), FUNCTION 5 stbox_gist_penalty(internal, internal, internal), @@ -4375,8 +4446,8 @@ CREATE OPERATOR CLASS tgeompoint_mquadtree_segsplit_ops FUNCTION 1 stbox_spgist_config(internal, internal), FUNCTION 2 stbox_quadtree_choose(internal, internal), FUNCTION 3 stbox_quadtree_picksplit(internal, internal), - FUNCTION 4 stbox_quadtree_inner_consistent(internal, internal), - FUNCTION 5 stbox_spgist_leaf_consistent(internal, internal), + FUNCTION 4 stbox_mquadtree_inner_consistent(internal, internal), + FUNCTION 5 stbox_mspgist_leaf_consistent(internal, internal), FUNCTION 6 tpoint_mspgist_compress(internal), FUNCTION 7 tpoint_mest_seg_options(internal), FUNCTION 8 tpoint_mest_segsplit(internal, internal, internal); @@ -4419,8 +4490,8 @@ CREATE OPERATOR CLASS tgeompoint_mkdtree_segsplit_ops FUNCTION 1 stbox_spgist_config(internal, internal), FUNCTION 2 stbox_kdtree_choose(internal, internal), FUNCTION 3 stbox_kdtree_picksplit(internal, internal), - FUNCTION 4 stbox_kdtree_inner_consistent(internal, internal), - FUNCTION 5 stbox_spgist_leaf_consistent(internal, internal), + FUNCTION 4 stbox_mkdtree_inner_consistent(internal, internal), + FUNCTION 5 stbox_mspgist_leaf_consistent(internal, internal), FUNCTION 6 tpoint_mspgist_compress(internal), FUNCTION 7 tpoint_mest_seg_options(internal), FUNCTION 8 tpoint_mest_segsplit(internal, internal, internal); @@ -4470,7 +4541,7 @@ CREATE OPERATOR CLASS tgeogpoint_mrtree_segsplit_ops OPERATOR 31 #&> (tgeogpoint, stbox), OPERATOR 31 #&> (tgeogpoint, tgeogpoint), -- functions - FUNCTION 1 tgeogpoint_gist_consistent(internal, tgeogpoint, smallint, oid, internal), + FUNCTION 1 tgeogpoint_mgist_consistent(internal, tgeogpoint, smallint, oid, internal), FUNCTION 2 stbox_gist_union(internal, internal), FUNCTION 3 tpoint_mgist_compress(internal), FUNCTION 5 stbox_gist_penalty(internal, internal, internal), @@ -4526,8 +4597,8 @@ CREATE OPERATOR CLASS tgeogpoint_mquadtree_segsplit_ops FUNCTION 1 stbox_spgist_config(internal, internal), FUNCTION 2 stbox_quadtree_choose(internal, internal), FUNCTION 3 stbox_quadtree_picksplit(internal, internal), - FUNCTION 4 stbox_quadtree_inner_consistent(internal, internal), - FUNCTION 5 stbox_spgist_leaf_consistent(internal, internal), + FUNCTION 4 stbox_mquadtree_inner_consistent(internal, internal), + FUNCTION 5 stbox_mspgist_leaf_consistent(internal, internal), FUNCTION 6 tpoint_mspgist_compress(internal), FUNCTION 7 tpoint_mest_seg_options(internal), FUNCTION 8 tpoint_mest_segsplit(internal, internal, internal); @@ -4578,8 +4649,8 @@ CREATE OPERATOR CLASS tgeogpoint_mkdtree_segsplit_ops FUNCTION 1 stbox_spgist_config(internal, internal), FUNCTION 2 stbox_kdtree_choose(internal, internal), FUNCTION 3 stbox_kdtree_picksplit(internal, internal), - FUNCTION 4 stbox_kdtree_inner_consistent(internal, internal), - FUNCTION 5 stbox_spgist_leaf_consistent(internal, internal), + FUNCTION 4 stbox_mkdtree_inner_consistent(internal, internal), + FUNCTION 5 stbox_mspgist_leaf_consistent(internal, internal), FUNCTION 6 tpoint_mspgist_compress(internal), FUNCTION 7 tpoint_mest_seg_options(internal), FUNCTION 8 tpoint_mest_segsplit(internal, internal, internal); @@ -4630,7 +4701,7 @@ CREATE OPERATOR CLASS tgeompoint_mrtree_tilesplit_ops OPERATOR 31 #&> (tgeompoint, stbox), OPERATOR 31 #&> (tgeompoint, tgeompoint), -- functions - FUNCTION 1 tgeompoint_gist_consistent(internal, tgeompoint, smallint, oid, internal), + FUNCTION 1 tgeompoint_mgist_consistent(internal, tgeompoint, smallint, oid, internal), FUNCTION 2 stbox_gist_union(internal, internal), FUNCTION 3 tpoint_mgist_compress(internal), FUNCTION 5 stbox_gist_penalty(internal, internal, internal), @@ -4678,8 +4749,8 @@ CREATE OPERATOR CLASS tgeompoint_mquadtree_tilesplit_ops FUNCTION 1 stbox_spgist_config(internal, internal), FUNCTION 2 stbox_quadtree_choose(internal, internal), FUNCTION 3 stbox_quadtree_picksplit(internal, internal), - FUNCTION 4 stbox_quadtree_inner_consistent(internal, internal), - FUNCTION 5 stbox_spgist_leaf_consistent(internal, internal), + FUNCTION 4 stbox_mquadtree_inner_consistent(internal, internal), + FUNCTION 5 stbox_mspgist_leaf_consistent(internal, internal), FUNCTION 6 tpoint_mspgist_compress(internal), FUNCTION 7 tpoint_mest_tile_options(internal), FUNCTION 8 tpoint_mest_tilesplit(internal, internal, internal); @@ -4722,8 +4793,8 @@ CREATE OPERATOR CLASS tgeompoint_mkdtree_tilesplit_ops FUNCTION 1 stbox_spgist_config(internal, internal), FUNCTION 2 stbox_kdtree_choose(internal, internal), FUNCTION 3 stbox_kdtree_picksplit(internal, internal), - FUNCTION 4 stbox_kdtree_inner_consistent(internal, internal), - FUNCTION 5 stbox_spgist_leaf_consistent(internal, internal), + FUNCTION 4 stbox_mkdtree_inner_consistent(internal, internal), + FUNCTION 5 stbox_mspgist_leaf_consistent(internal, internal), FUNCTION 6 tpoint_mspgist_compress(internal), FUNCTION 7 tpoint_mest_tile_options(internal), FUNCTION 8 tpoint_mest_tilesplit(internal, internal, internal); @@ -4775,7 +4846,7 @@ CREATE OPERATOR CLASS tgeogpoint_mrtree_tilesplit_ops OPERATOR 31 #&> (tgeogpoint, stbox), OPERATOR 31 #&> (tgeogpoint, tgeogpoint), -- functions - FUNCTION 1 tgeogpoint_gist_consistent(internal, tgeogpoint, smallint, oid, internal), + FUNCTION 1 tgeogpoint_mgist_consistent(internal, tgeogpoint, smallint, oid, internal), FUNCTION 2 stbox_gist_union(internal, internal), FUNCTION 3 tpoint_mgist_compress(internal), FUNCTION 5 stbox_gist_penalty(internal, internal, internal), @@ -4831,8 +4902,8 @@ CREATE OPERATOR CLASS tgeogpoint_mquadtree_tilesplit_ops FUNCTION 1 stbox_spgist_config(internal, internal), FUNCTION 2 stbox_quadtree_choose(internal, internal), FUNCTION 3 stbox_quadtree_picksplit(internal, internal), - FUNCTION 4 stbox_quadtree_inner_consistent(internal, internal), - FUNCTION 5 stbox_spgist_leaf_consistent(internal, internal), + FUNCTION 4 stbox_mquadtree_inner_consistent(internal, internal), + FUNCTION 5 stbox_mspgist_leaf_consistent(internal, internal), FUNCTION 6 tpoint_mspgist_compress(internal), FUNCTION 7 tpoint_mest_tile_options(internal), FUNCTION 8 tpoint_mest_tilesplit(internal, internal, internal); @@ -4883,8 +4954,8 @@ CREATE OPERATOR CLASS tgeogpoint_mkdtree_tilesplit_ops FUNCTION 1 stbox_spgist_config(internal, internal), FUNCTION 2 stbox_kdtree_choose(internal, internal), FUNCTION 3 stbox_kdtree_picksplit(internal, internal), - FUNCTION 4 stbox_kdtree_inner_consistent(internal, internal), - FUNCTION 5 stbox_spgist_leaf_consistent(internal, internal), + FUNCTION 4 stbox_mkdtree_inner_consistent(internal, internal), + FUNCTION 5 stbox_mspgist_leaf_consistent(internal, internal), FUNCTION 6 tpoint_mspgist_compress(internal), FUNCTION 7 tpoint_mest_tile_options(internal), FUNCTION 8 tpoint_mest_tilesplit(internal, internal, internal); @@ -4956,7 +5027,7 @@ CREATE OPERATOR CLASS tgeompoint_mgist_mergesplit_ops OPERATOR 31 #&> (tgeompoint, stbox), OPERATOR 31 #&> (tgeompoint, tgeompoint), -- functions - FUNCTION 1 tgeompoint_gist_consistent(internal, tgeompoint, smallint, oid, internal), + FUNCTION 1 tgeompoint_mgist_consistent(internal, tgeompoint, smallint, oid, internal), FUNCTION 2 stbox_gist_union(internal, internal), FUNCTION 3 tpoint_mgist_compress(internal), FUNCTION 5 stbox_gist_penalty(internal, internal, internal), @@ -5004,8 +5075,8 @@ CREATE OPERATOR CLASS tgeompoint_mquadtree_mergesplit_ops FUNCTION 1 stbox_spgist_config(internal, internal), FUNCTION 2 stbox_quadtree_choose(internal, internal), FUNCTION 3 stbox_quadtree_picksplit(internal, internal), - FUNCTION 4 stbox_quadtree_inner_consistent(internal, internal), - FUNCTION 5 stbox_spgist_leaf_consistent(internal, internal), + FUNCTION 4 stbox_mquadtree_inner_consistent(internal, internal), + FUNCTION 5 stbox_mspgist_leaf_consistent(internal, internal), FUNCTION 6 tpoint_mspgist_compress(internal), FUNCTION 7 tpoint_mest_box_options(internal), FUNCTION 8 tpoint_mest_mergesplit(internal, internal, internal); @@ -5048,8 +5119,8 @@ CREATE OPERATOR CLASS tgeompoint_mkdtree_mergesplit_ops FUNCTION 1 stbox_spgist_config(internal, internal), FUNCTION 2 stbox_kdtree_choose(internal, internal), FUNCTION 3 stbox_kdtree_picksplit(internal, internal), - FUNCTION 4 stbox_kdtree_inner_consistent(internal, internal), - FUNCTION 5 stbox_spgist_leaf_consistent(internal, internal), + FUNCTION 4 stbox_mkdtree_inner_consistent(internal, internal), + FUNCTION 5 stbox_mspgist_leaf_consistent(internal, internal), FUNCTION 6 tpoint_mspgist_compress(internal), FUNCTION 7 tpoint_mest_box_options(internal), FUNCTION 8 tpoint_mest_mergesplit(internal, internal, internal); @@ -5109,7 +5180,7 @@ CREATE OPERATOR CLASS tgeompoint_mrtree_linearsplit_ops OPERATOR 31 #&> (tgeompoint, stbox), OPERATOR 31 #&> (tgeompoint, tgeompoint), -- functions - FUNCTION 1 tgeompoint_gist_consistent(internal, tgeompoint, smallint, oid, internal), + FUNCTION 1 tgeompoint_mgist_consistent(internal, tgeompoint, smallint, oid, internal), FUNCTION 2 stbox_gist_union(internal, internal), FUNCTION 3 tpoint_mgist_compress(internal), FUNCTION 5 stbox_gist_penalty(internal, internal, internal), @@ -5157,8 +5228,8 @@ CREATE OPERATOR CLASS tgeompoint_mquadtree_linearsplit_ops FUNCTION 1 stbox_spgist_config(internal, internal), FUNCTION 2 stbox_quadtree_choose(internal, internal), FUNCTION 3 stbox_quadtree_picksplit(internal, internal), - FUNCTION 4 stbox_quadtree_inner_consistent(internal, internal), - FUNCTION 5 stbox_spgist_leaf_consistent(internal, internal), + FUNCTION 4 stbox_mquadtree_inner_consistent(internal, internal), + FUNCTION 5 stbox_mspgist_leaf_consistent(internal, internal), FUNCTION 6 tpoint_mspgist_compress(internal), FUNCTION 7 tpoint_mest_query_options(internal), FUNCTION 8 tpoint_mest_linearsplit(internal, internal, internal); @@ -5201,8 +5272,8 @@ CREATE OPERATOR CLASS tgeompoint_mkdtree_linearsplit_ops FUNCTION 1 stbox_spgist_config(internal, internal), FUNCTION 2 stbox_kdtree_choose(internal, internal), FUNCTION 3 stbox_kdtree_picksplit(internal, internal), - FUNCTION 4 stbox_kdtree_inner_consistent(internal, internal), - FUNCTION 5 stbox_spgist_leaf_consistent(internal, internal), + FUNCTION 4 stbox_mkdtree_inner_consistent(internal, internal), + FUNCTION 5 stbox_mspgist_leaf_consistent(internal, internal), FUNCTION 6 tpoint_mspgist_compress(internal), FUNCTION 7 tpoint_mest_query_options(internal), FUNCTION 8 tpoint_mest_linearsplit(internal, internal, internal); @@ -5262,7 +5333,7 @@ CREATE OPERATOR CLASS tgeompoint_mrtree_adaptsplit_ops OPERATOR 31 #&> (tgeompoint, stbox), OPERATOR 31 #&> (tgeompoint, tgeompoint), -- functions - FUNCTION 1 tgeompoint_gist_consistent(internal, tgeompoint, smallint, oid, internal), + FUNCTION 1 tgeompoint_mgist_consistent(internal, tgeompoint, smallint, oid, internal), FUNCTION 2 stbox_gist_union(internal, internal), FUNCTION 3 tpoint_mgist_compress(internal), FUNCTION 5 stbox_gist_penalty(internal, internal, internal), @@ -5310,8 +5381,8 @@ CREATE OPERATOR CLASS tgeompoint_mquadtree_adaptsplit_ops FUNCTION 1 stbox_spgist_config(internal, internal), FUNCTION 2 stbox_quadtree_choose(internal, internal), FUNCTION 3 stbox_quadtree_picksplit(internal, internal), - FUNCTION 4 stbox_quadtree_inner_consistent(internal, internal), - FUNCTION 5 stbox_spgist_leaf_consistent(internal, internal), + FUNCTION 4 stbox_mquadtree_inner_consistent(internal, internal), + FUNCTION 5 stbox_mspgist_leaf_consistent(internal, internal), FUNCTION 6 tpoint_mspgist_compress(internal), FUNCTION 7 tpoint_mest_box_options(internal), FUNCTION 8 tpoint_mest_adaptsplit(internal, internal, internal); @@ -5354,8 +5425,8 @@ CREATE OPERATOR CLASS tgeompoint_mkdtree_adaptsplit_ops FUNCTION 1 stbox_spgist_config(internal, internal), FUNCTION 2 stbox_kdtree_choose(internal, internal), FUNCTION 3 stbox_kdtree_picksplit(internal, internal), - FUNCTION 4 stbox_kdtree_inner_consistent(internal, internal), - FUNCTION 5 stbox_spgist_leaf_consistent(internal, internal), + FUNCTION 4 stbox_mkdtree_inner_consistent(internal, internal), + FUNCTION 5 stbox_mspgist_leaf_consistent(internal, internal), FUNCTION 6 tpoint_mspgist_compress(internal), FUNCTION 7 tpoint_mest_box_options(internal), FUNCTION 8 tpoint_mest_adaptsplit(internal, internal, internal); diff --git a/contrib/mobilitydb/temporal_mest.c b/contrib/mobilitydb/temporal_mest.c index 28a63d1..2e34044 100644 --- a/contrib/mobilitydb/temporal_mest.c +++ b/contrib/mobilitydb/temporal_mest.c @@ -69,6 +69,27 @@ typedef struct represented as a string */ } TemporalBinOptions; +/** + * @brief Return the keys of a multi-entry index for the entries given in the + * second argument together with the bounding box of the value + * @note The topological and the position operators of MobilityDB answer on the + * bounding box of a temporal value. The entries of a value cover the value but + * not its bounding box, so a query that meets the box where no entry lies has + * no entry that can find it and the box is itself a key of the value + */ +static Datum * +mest_span_keys(const Temporal *temp, Span *spans, int32 *nkeys) +{ + Datum *result = palloc(sizeof(Datum) * (*nkeys + 1)); + Span *box = palloc(sizeof(Span)); + temporal_set_tstzspan(temp, box); + result[0] = PointerGetDatum(box); + for (int i = 0; i < *nkeys; ++i) + result[i + 1] = PointerGetDatum(&spans[i]); + (*nkeys)++; + return result; +} + /***************************************************************************** * Multi-Entry GiST and SP-GiST compress methods for temporal types *****************************************************************************/ @@ -183,9 +204,7 @@ Temporal_mest_equisplit(PG_FUNCTION_ARGS) // bool **nullFlags = (bool **) PG_GETARG_POINTER(2); int32 num_spans = MEST_TEMPORAL_GET_SPANS(); Span *spans = temporal_split_n_spans(temp, num_spans, nkeys); - Datum *keys = palloc(sizeof(Datum) * (*nkeys)); - for (int i = 0; i < *nkeys; ++i) - keys[i] = PointerGetDatum(&spans[i]); + Datum *keys = mest_span_keys(temp, spans, nkeys); PG_FREE_IF_COPY(temp, 0); PG_RETURN_POINTER(keys); } @@ -202,9 +221,7 @@ Temporal_mest_segsplit(PG_FUNCTION_ARGS) // bool **nullFlags = (bool **) PG_GETARG_POINTER(2); int segs_per_span = MEST_TEMPORAL_GET_SEGS(); Span *spans = temporal_split_each_n_spans(temp, segs_per_span, nkeys); - Datum *keys = palloc(sizeof(Datum) * (*nkeys)); - for (int i = 0; i < *nkeys; ++i) - keys[i] = PointerGetDatum(&spans[i]); + Datum *keys = mest_span_keys(temp, spans, nkeys); /* We cannot pfree spans */ PG_FREE_IF_COPY(temp, 0); PG_RETURN_POINTER(keys); @@ -250,11 +267,8 @@ Temporal_mest_binsplit(PG_FUNCTION_ARGS) /* Get the spans */ spans = temporal_time_bins(temp, interv, torigin, &count); - keys = palloc(sizeof(Datum) * count); - assert(temp); - for (int i = 0; i < count; ++i) - keys[i] = PointerGetDatum(&spans[i]); *nkeys = count; + keys = mest_span_keys(temp, spans, nkeys); PG_FREE_IF_COPY(temp, 0); PG_RETURN_POINTER(keys); } diff --git a/contrib/mobilitydb/tnumber_mest.c b/contrib/mobilitydb/tnumber_mest.c index 2ba50a4..eaa7dcc 100644 --- a/contrib/mobilitydb/tnumber_mest.c +++ b/contrib/mobilitydb/tnumber_mest.c @@ -95,6 +95,27 @@ typedef struct represented as a string */ } TFloatTileOptions; +/** + * @brief Return the keys of a multi-entry index for the entries given in the + * second argument together with the bounding box of the value + * @note The topological and the position operators of MobilityDB answer on the + * bounding box of a temporal value. The entries of a value cover the value but + * not its bounding box, so a query that meets the box where no entry lies has + * no entry that can find it and the box is itself a key of the value + */ +static Datum * +mest_tbox_keys(const Temporal *temp, TBox *boxes, int32 *nkeys) +{ + Datum *result = palloc(sizeof(Datum) * (*nkeys + 1)); + TBox *box = palloc(sizeof(TBox)); + tnumber_set_tbox(temp, box); + result[0] = PointerGetDatum(box); + for (int i = 0; i < *nkeys; ++i) + result[i + 1] = PointerGetDatum(&boxes[i]); + (*nkeys)++; + return result; +} + /***************************************************************************** * Multi-Entry GiST and SP-GiST compress methods for temporal numbers *****************************************************************************/ @@ -237,9 +258,7 @@ Tnumber_mest_equisplit(PG_FUNCTION_ARGS) // bool **nullFlags = (bool **) PG_GETARG_POINTER(2); int32 num_boxes = MEST_TNUMBER_GET_BOXES(); TBox *boxes = tnumber_split_n_tboxes(temp, num_boxes, nkeys); - Datum *keys = palloc(sizeof(Datum) * (*nkeys)); - for (int i = 0; i < *nkeys; ++i) - keys[i] = PointerGetDatum(&boxes[i]); + Datum *keys = mest_tbox_keys(temp, boxes, nkeys); PG_FREE_IF_COPY(temp, 0); PG_RETURN_POINTER(keys); } @@ -255,9 +274,7 @@ Tnumber_mest_segsplit(PG_FUNCTION_ARGS) int32 *nkeys = (int32 *) PG_GETARG_POINTER(1); int segs_per_box = MEST_TNUMBER_GET_SEGS(); TBox *boxes = tnumber_split_each_n_tboxes(temp, segs_per_box, nkeys); - Datum *keys = palloc(sizeof(Datum) * (*nkeys)); - for (int i = 0; i < *nkeys; ++i) - keys[i] = PointerGetDatum(&boxes[i]); + Datum *keys = mest_tbox_keys(temp, boxes, nkeys); /* We cannot pfree boxes */ PG_FREE_IF_COPY(temp, 0); PG_RETURN_POINTER(keys); @@ -305,11 +322,8 @@ Tint_mest_tilesplit(PG_FUNCTION_ARGS) /* Get the tiles */ boxes = tnumber_value_time_boxes(temp, Int32GetDatum(vsize), interv, Int32GetDatum(vorigin), torigin, &count); - keys = palloc(sizeof(Datum) * count); - assert(temp); - for (int i = 0; i < count; ++i) - keys[i] = PointerGetDatum(&boxes[i]); *nkeys = count; + keys = mest_tbox_keys(temp, boxes, nkeys); PG_FREE_IF_COPY(temp, 0); PG_RETURN_POINTER(keys); } @@ -354,11 +368,8 @@ Tfloat_mest_tilesplit(PG_FUNCTION_ARGS) /* Get the tiles */ boxes = tnumber_value_time_boxes(temp, Float8GetDatum(vsize), interv, Float8GetDatum(vorigin), torigin, &count); - keys = palloc(sizeof(Datum) * count); - assert(temp); - for (int i = 0; i < count; ++i) - keys[i] = PointerGetDatum(&boxes[i]); *nkeys = count; + keys = mest_tbox_keys(temp, boxes, nkeys); PG_FREE_IF_COPY(temp, 0); PG_RETURN_POINTER(keys); } diff --git a/contrib/mobilitydb/tpoint_mest.c b/contrib/mobilitydb/tpoint_mest.c index bd935c2..a200f0a 100644 --- a/contrib/mobilitydb/tpoint_mest.c +++ b/contrib/mobilitydb/tpoint_mest.c @@ -92,6 +92,27 @@ typedef struct represented as a string */ } TPointTileOptions; +/** + * @brief Return the keys of a multi-entry index for the entries given in the + * second argument together with the bounding box of the value + * @note The topological and the position operators of MobilityDB answer on the + * bounding box of a temporal value. The entries of a value cover the value but + * not its bounding box, so a query that meets the box where no entry lies has + * no entry that can find it and the box is itself a key of the value + */ +static Datum * +mest_stbox_keys(const Temporal *temp, STBox *boxes, int32 *nkeys) +{ + Datum *result = palloc(sizeof(Datum) * (*nkeys + 1)); + STBox *box = palloc(sizeof(STBox)); + tspatial_set_stbox(temp, box); + result[0] = PointerGetDatum(box); + for (int i = 0; i < *nkeys; ++i) + result[i + 1] = PointerGetDatum(&boxes[i]); + (*nkeys)++; + return result; +} + /***************************************************************************** * Multi-Entry GiST and SP-GiST compress methods for temporal points *****************************************************************************/ @@ -217,9 +238,7 @@ Tpoint_mest_equisplit(PG_FUNCTION_ARGS) int32 *nkeys = (int32 *) PG_GETARG_POINTER(1); int32 num_boxes = MEST_TPOINT_GET_BOXES(); STBox *boxes = tgeo_split_n_stboxes(temp, num_boxes, nkeys); - Datum *keys = palloc(sizeof(Datum) * (*nkeys)); - for (int i = 0; i < *nkeys; ++i) - keys[i] = PointerGetDatum(&boxes[i]); + Datum *keys = mest_stbox_keys(temp, boxes, nkeys); PG_FREE_IF_COPY(temp, 0); PG_RETURN_POINTER(keys); } @@ -235,9 +254,7 @@ Tpoint_mest_segsplit(PG_FUNCTION_ARGS) int32 *nkeys = (int32 *) PG_GETARG_POINTER(1); int segs_per_box = MEST_TPOINT_GET_SEGS(); STBox *boxes = tgeo_split_each_n_stboxes(temp, segs_per_box, nkeys); - Datum *keys = palloc(sizeof(Datum) * (*nkeys)); - for (int i = 0; i < *nkeys; ++i) - keys[i] = PointerGetDatum(&boxes[i]); + Datum *keys = mest_stbox_keys(temp, boxes, nkeys); /* We cannot pfree boxes */ PG_FREE_IF_COPY(temp, 0); PG_RETURN_POINTER(keys); @@ -292,11 +309,8 @@ Tpoint_mest_tilesplit(PG_FUNCTION_ARGS) /* Get the tiles */ boxes = tgeo_space_time_boxes(temp, xsize, ysize, zsize, interv, sorigin, torigin, true, true, &count); - keys = palloc(sizeof(Datum) * count); - assert(temp); - for (int i = 0; i < count; ++i) - keys[i] = PointerGetDatum(&boxes[i]); *nkeys = count; + keys = mest_stbox_keys(temp, boxes, nkeys); PG_FREE_IF_COPY(temp, 0); PG_RETURN_POINTER(keys); } @@ -686,10 +700,8 @@ Tpoint_mest_mergesplit(PG_FUNCTION_ARGS) boxes = tspatial_to_stbox(temp); *nkeys = 1; } - keys = palloc(sizeof(Datum) * (*nkeys)); assert(temp); - for (int i = 0; i < *nkeys; ++i) - keys[i] = PointerGetDatum(&boxes[i]); + keys = mest_stbox_keys(temp, boxes, nkeys); PG_FREE_IF_COPY(temp, 0); PG_RETURN_POINTER(keys); } @@ -927,10 +939,8 @@ Tpoint_mest_linearsplit(PG_FUNCTION_ARGS) boxes = tspatial_to_stbox(temp); *nkeys = 1; } - keys = palloc(sizeof(Datum) * (*nkeys)); assert(temp); - for (int i = 0; i < *nkeys; ++i) - keys[i] = PointerGetDatum(&boxes[i]); + keys = mest_stbox_keys(temp, boxes, nkeys); PG_FREE_IF_COPY(temp, 0); PG_RETURN_POINTER(keys); } @@ -1093,10 +1103,8 @@ Tpoint_mest_adaptsplit(PG_FUNCTION_ARGS) boxes = tspatial_to_stbox(temp); *nkeys = 1; } - keys = palloc(sizeof(Datum) * (*nkeys)); assert(temp); - for (int i = 0; i < *nkeys; ++i) - keys[i] = PointerGetDatum(&boxes[i]); + keys = mest_stbox_keys(temp, boxes, nkeys); PG_FREE_IF_COPY(temp, 0); PG_RETURN_POINTER(keys); }