mirror of
https://github.com/postgres/postgres.git
synced 2025-06-13 07:41:39 +03:00
Add support for <-> (box, point) operator to GiST box_ops
Index-based calculation of this operator is exact. So, signature of gist_bbox_distance() function is changes so that caller is responsible for setting *recheck flag. Discussion: https://postgr.es/m/f71ba19d-d989-63b6-f04a-abf02ad9345d%40postgrespro.ru Author: Nikita Glukhov Reviewed-by: Tom Lane, Alexander Korotkov
This commit is contained in:
@ -1464,26 +1464,12 @@ gist_point_distance(PG_FUNCTION_ARGS)
|
||||
PG_RETURN_FLOAT8(distance);
|
||||
}
|
||||
|
||||
/*
|
||||
* The inexact GiST distance method for geometric types that store bounding
|
||||
* boxes.
|
||||
*
|
||||
* Compute lossy distance from point to index entries. The result is inexact
|
||||
* because index entries are bounding boxes, not the exact shapes of the
|
||||
* indexed geometric types. We use distance from point to MBR of index entry.
|
||||
* This is a lower bound estimate of distance from point to indexed geometric
|
||||
* type.
|
||||
*/
|
||||
static float8
|
||||
gist_bbox_distance(GISTENTRY *entry, Datum query,
|
||||
StrategyNumber strategy, bool *recheck)
|
||||
gist_bbox_distance(GISTENTRY *entry, Datum query, StrategyNumber strategy)
|
||||
{
|
||||
float8 distance;
|
||||
StrategyNumber strategyGroup = strategy / GeoStrategyNumberOffset;
|
||||
|
||||
/* Bounding box distance is always inexact. */
|
||||
*recheck = true;
|
||||
|
||||
switch (strategyGroup)
|
||||
{
|
||||
case PointStrategyNumberGroup:
|
||||
@ -1499,6 +1485,32 @@ gist_bbox_distance(GISTENTRY *entry, Datum query,
|
||||
return distance;
|
||||
}
|
||||
|
||||
Datum
|
||||
gist_box_distance(PG_FUNCTION_ARGS)
|
||||
{
|
||||
GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
|
||||
Datum query = PG_GETARG_DATUM(1);
|
||||
StrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2);
|
||||
|
||||
/* Oid subtype = PG_GETARG_OID(3); */
|
||||
/* bool *recheck = (bool *) PG_GETARG_POINTER(4); */
|
||||
float8 distance;
|
||||
|
||||
distance = gist_bbox_distance(entry, query, strategy);
|
||||
|
||||
PG_RETURN_FLOAT8(distance);
|
||||
}
|
||||
|
||||
/*
|
||||
* The inexact GiST distance methods for geometric types that store bounding
|
||||
* boxes.
|
||||
*
|
||||
* Compute lossy distance from point to index entries. The result is inexact
|
||||
* because index entries are bounding boxes, not the exact shapes of the
|
||||
* indexed geometric types. We use distance from point to MBR of index entry.
|
||||
* This is a lower bound estimate of distance from point to indexed geometric
|
||||
* type.
|
||||
*/
|
||||
Datum
|
||||
gist_circle_distance(PG_FUNCTION_ARGS)
|
||||
{
|
||||
@ -1510,7 +1522,8 @@ gist_circle_distance(PG_FUNCTION_ARGS)
|
||||
bool *recheck = (bool *) PG_GETARG_POINTER(4);
|
||||
float8 distance;
|
||||
|
||||
distance = gist_bbox_distance(entry, query, strategy, recheck);
|
||||
distance = gist_bbox_distance(entry, query, strategy);
|
||||
*recheck = true;
|
||||
|
||||
PG_RETURN_FLOAT8(distance);
|
||||
}
|
||||
@ -1526,7 +1539,8 @@ gist_poly_distance(PG_FUNCTION_ARGS)
|
||||
bool *recheck = (bool *) PG_GETARG_POINTER(4);
|
||||
float8 distance;
|
||||
|
||||
distance = gist_bbox_distance(entry, query, strategy, recheck);
|
||||
distance = gist_bbox_distance(entry, query, strategy);
|
||||
*recheck = true;
|
||||
|
||||
PG_RETURN_FLOAT8(distance);
|
||||
}
|
||||
|
Reference in New Issue
Block a user