1
/* src/tutorial/funcs.c */
3
/******************************************************************************
4
These are user-defined functions that can be bound to a Postgres backend
5
and called by Postgres to execute SQL functions of the same name.
7
The calling format for these functions is defined by the CREATE FUNCTION
8
SQL statement that binds them to the backend.
10
NOTE: this file shows examples of "old style" function call conventions.
11
See funcs_new.c for examples of "new style".
12
*****************************************************************************/
14
#include "postgres.h" /* general Postgres declarations */
16
#include "executor/executor.h" /* for GetAttributeByName() */
17
#include "utils/geo_decls.h" /* for point type */
22
/* These prototypes just prevent possible warnings from gcc. */
25
float8 *add_one_float8(float8 *arg);
26
Point *makepoint(Point *pointx, Point *pointy);
27
text *copytext(text *t);
28
text *concat_text(text *arg1, text *arg2);
29
bool c_overpaid(HeapTupleHeader t, /* the current instance of EMP */
41
/* By Reference, Fixed Length */
44
add_one_float8(float8 *arg)
46
float8 *result = (float8 *) palloc(sizeof(float8));
54
makepoint(Point *pointx, Point *pointy)
56
Point *new_point = (Point *) palloc(sizeof(Point));
58
new_point->x = pointx->x;
59
new_point->y = pointy->y;
64
/* By Reference, Variable Length */
70
* VARSIZE is the total size of the struct in bytes.
72
text *new_t = (text *) palloc(VARSIZE(t));
74
SET_VARSIZE(new_t, VARSIZE(t));
77
* VARDATA is a pointer to the data region of the struct.
79
memcpy((void *) VARDATA(new_t), /* destination */
80
(void *) VARDATA(t), /* source */
81
VARSIZE(t) - VARHDRSZ); /* how many bytes */
86
concat_text(text *arg1, text *arg2)
88
int32 arg1_size = VARSIZE(arg1) - VARHDRSZ;
89
int32 arg2_size = VARSIZE(arg2) - VARHDRSZ;
90
int32 new_text_size = arg1_size + arg2_size + VARHDRSZ;
91
text *new_text = (text *) palloc(new_text_size);
93
SET_VARSIZE(new_text, new_text_size);
94
memcpy(VARDATA(new_text), VARDATA(arg1), arg1_size);
95
memcpy(VARDATA(new_text) + arg1_size, VARDATA(arg2), arg2_size);
102
c_overpaid(HeapTupleHeader t, /* the current instance of EMP */
108
salary = DatumGetInt32(GetAttributeByName(t, "salary", &isnull));
111
return salary > limit;