aboutsummaryrefslogtreecommitdiff
path: root/contrib/cube/cube.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2021-03-06 12:04:00 -0500
committerTom Lane <tgl@sss.pgh.pa.us>2021-03-06 12:04:05 -0500
commit1265a9c8f871cfa5aea4d607b1ab72b45b96dbb7 (patch)
treeb89d042f122d5bfb160adf8e0c16e3afae105576 /contrib/cube/cube.c
parente045565dae4b2368ba812d60ef0fb7f927fe2646 (diff)
downloadpostgresql-1265a9c8f871cfa5aea4d607b1ab72b45b96dbb7.tar.gz
postgresql-1265a9c8f871cfa5aea4d607b1ab72b45b96dbb7.zip
Add binary I/O capability for cube datatype.
We can adjust the not-yet-released cube--1.4--1.5.sql upgrade rather than making a whole new version. KaiGai Kohei Discussion: https://postgr.es/m/CAOP8fzZO4y60QPTK=RGDXeVeVHV9tLHKOsh7voUOoUouVCPV8A@mail.gmail.com
Diffstat (limited to 'contrib/cube/cube.c')
-rw-r--r--contrib/cube/cube.c56
1 files changed, 56 insertions, 0 deletions
diff --git a/contrib/cube/cube.c b/contrib/cube/cube.c
index 6f810b26c5d..a5d1ba67335 100644
--- a/contrib/cube/cube.c
+++ b/contrib/cube/cube.c
@@ -13,6 +13,7 @@
#include "access/gist.h"
#include "access/stratnum.h"
#include "cubedata.h"
+#include "libpq/pqformat.h"
#include "utils/array.h"
#include "utils/float.h"
@@ -31,6 +32,8 @@ PG_FUNCTION_INFO_V1(cube_in);
PG_FUNCTION_INFO_V1(cube_a_f8_f8);
PG_FUNCTION_INFO_V1(cube_a_f8);
PG_FUNCTION_INFO_V1(cube_out);
+PG_FUNCTION_INFO_V1(cube_send);
+PG_FUNCTION_INFO_V1(cube_recv);
PG_FUNCTION_INFO_V1(cube_f8);
PG_FUNCTION_INFO_V1(cube_f8_f8);
PG_FUNCTION_INFO_V1(cube_c_f8);
@@ -319,6 +322,59 @@ cube_out(PG_FUNCTION_ARGS)
PG_RETURN_CSTRING(buf.data);
}
+/*
+ * cube_send - a binary output handler for cube type
+ */
+Datum
+cube_send(PG_FUNCTION_ARGS)
+{
+ NDBOX *cube = PG_GETARG_NDBOX_P(0);
+ StringInfoData buf;
+ int32 i,
+ nitems = DIM(cube);
+
+ pq_begintypsend(&buf);
+ pq_sendint32(&buf, cube->header);
+ if (!IS_POINT(cube))
+ nitems += nitems;
+ /* for symmetry with cube_recv, we don't use LL_COORD/UR_COORD here */
+ for (i = 0; i < nitems; i++)
+ pq_sendfloat8(&buf, cube->x[i]);
+
+ PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
+}
+
+/*
+ * cube_recv - a binary input handler for cube type
+ */
+Datum
+cube_recv(PG_FUNCTION_ARGS)
+{
+ StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
+ int32 header;
+ int32 i,
+ nitems;
+ NDBOX *cube;
+
+ header = pq_getmsgint(buf, sizeof(int32));
+ nitems = (header & DIM_MASK);
+ if (nitems > CUBE_MAX_DIM)
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("cube dimension is too large"),
+ errdetail("A cube cannot have more than %d dimensions.",
+ CUBE_MAX_DIM)));
+ if ((header & POINT_BIT) == 0)
+ nitems += nitems;
+ cube = palloc(offsetof(NDBOX, x) + sizeof(double) * nitems);
+ SET_VARSIZE(cube, offsetof(NDBOX, x) + sizeof(double) * nitems);
+ cube->header = header;
+ for (i = 0; i < nitems; i++)
+ cube->x[i] = pq_getmsgfloat8(buf);
+
+ PG_RETURN_NDBOX_P(cube);
+}
+
/*****************************************************************************
* GiST functions