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); }