aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/geo_ops.c
diff options
context:
space:
mode:
authorAlvaro Herrera <alvherre@alvh.no-ip.org>2015-05-05 15:22:24 -0300
committerAlvaro Herrera <alvherre@alvh.no-ip.org>2015-05-05 15:22:24 -0300
commit3b6db1f445e14bd189ebc99ce1e5535a1c624613 (patch)
tree0b2f037f21af6ed3ae5334c29491bc9ebe5f8e3f /src/backend/utils/adt/geo_ops.c
parent456ff0863851d70dce679ca3f631392589e31a33 (diff)
downloadpostgresql-3b6db1f445e14bd189ebc99ce1e5535a1c624613.tar.gz
postgresql-3b6db1f445e14bd189ebc99ce1e5535a1c624613.zip
Add geometry/range functions to support BRIN inclusion
This commit adds the following functions: box(point) -> box bound_box(box, box) -> box inet_same_family(inet, inet) -> bool inet_merge(inet, inet) -> cidr range_merge(anyrange, anyrange) -> anyrange The first of these is also used to implement a new assignment cast from point to box. These functions are the first part of a base to implement an "inclusion" operator class for BRIN, for multidimensional data types. Author: Emre Hasegeli Reviewed by: Andreas Karlsson
Diffstat (limited to 'src/backend/utils/adt/geo_ops.c')
-rw-r--r--src/backend/utils/adt/geo_ops.c39
1 files changed, 39 insertions, 0 deletions
diff --git a/src/backend/utils/adt/geo_ops.c b/src/backend/utils/adt/geo_ops.c
index 6cb6be5c5fd..39a78552410 100644
--- a/src/backend/utils/adt/geo_ops.c
+++ b/src/backend/utils/adt/geo_ops.c
@@ -4227,6 +4227,45 @@ box_div(PG_FUNCTION_ARGS)
PG_RETURN_BOX_P(result);
}
+/*
+ * Convert point to empty box
+ */
+Datum
+point_box(PG_FUNCTION_ARGS)
+{
+ Point *pt = PG_GETARG_POINT_P(0);
+ BOX *box;
+
+ box = (BOX *) palloc(sizeof(BOX));
+
+ box->high.x = pt->x;
+ box->low.x = pt->x;
+ box->high.y = pt->y;
+ box->low.y = pt->y;
+
+ PG_RETURN_BOX_P(box);
+}
+
+/*
+ * Smallest bounding box that includes both of the given boxes
+ */
+Datum
+boxes_bound_box(PG_FUNCTION_ARGS)
+{
+ BOX *box1 = PG_GETARG_BOX_P(0),
+ *box2 = PG_GETARG_BOX_P(1),
+ *container;
+
+ container = (BOX *) palloc(sizeof(BOX));
+
+ container->high.x = Max(box1->high.x, box2->high.x);
+ container->low.x = Min(box1->low.x, box2->low.x);
+ container->high.y = Max(box1->high.y, box2->high.y);
+ container->low.y = Min(box1->low.y, box2->low.y);
+
+ PG_RETURN_BOX_P(container);
+}
+
/***********************************************************************
**