ReleaseSysCache(ns_tup);
}
-
/*
* Parse source.
*
fn_parse(ProxyFunction *func, HeapTuple proc_tuple)
{
bool isnull;
- Datum source;
+ Datum src_raw, src_detoast;
+ char *data;
+ int size;
- source = SysCacheGetAttr(PROCOID, proc_tuple, Anum_pg_proc_prosrc, &isnull);
+ src_raw = SysCacheGetAttr(PROCOID, proc_tuple, Anum_pg_proc_prosrc, &isnull);
if (isnull)
plproxy_error(func, "procedure source datum is null");
- plproxy_run_parser(func, VARDATA(source), VARSIZE(source) - VARHDRSZ);
+ src_detoast = PointerGetDatum(PG_DETOAST_DATUM_PACKED(src_raw));
+ data = VARDATA_ANY(src_detoast);
+ size = VARSIZE_ANY_EXHDR(src_detoast);
+
+ plproxy_run_parser(func, data, size);
+
+ if (src_raw != src_detoast)
+ pfree(DatumGetPointer(src_detoast));
}
/*
#include <postgres.h>
#include <funcapi.h>
+#include <fmgr.h>
#include <executor/spi.h>
#include <access/tupdesc.h>
#include <libpq-fe.h>
+/*
+ * backwards compat with 8.2
+ */
+#ifndef VARDATA_ANY
+#define VARDATA_ANY(x) VARDATA(x)
+#endif
+#ifndef VARSIZE_ANY_EXHDR
+#define VARSIZE_ANY_EXHDR(x) (VARSIZE(x) - VARHDRSZ)
+#endif
+#ifndef PG_DETOAST_DATUM_PACKED
+#define PG_DETOAST_DATUM_PACKED(x) PG_DETOAST_DATUM(x)
+#endif
+
/*
* Maintenece period in seconds. Connnections will be freed