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
;