PostgreSQL Source Code  git master
funcs.c
Go to the documentation of this file.
1 /* src/tutorial/funcs.c */
2 
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.
6 
7  The calling format for these functions is defined by the CREATE FUNCTION
8  SQL statement that binds them to the backend.
9 *****************************************************************************/
10 
11 #include "postgres.h" /* general Postgres declarations */
12 
13 #include "executor/executor.h" /* for GetAttributeByName() */
14 #include "utils/geo_decls.h" /* for point type */
15 
17 
18 
19 /* By Value */
20 
22 
23 Datum
25 {
27 
28  PG_RETURN_INT32(arg + 1);
29 }
30 
31 /* By Reference, Fixed Length */
32 
34 
35 Datum
37 {
38  /* The macros for FLOAT8 hide its pass-by-reference nature */
40 
41  PG_RETURN_FLOAT8(arg + 1.0);
42 }
43 
45 
46 Datum
48 {
49  Point *pointx = PG_GETARG_POINT_P(0);
50  Point *pointy = PG_GETARG_POINT_P(1);
51  Point *new_point = (Point *) palloc(sizeof(Point));
52 
53  new_point->x = pointx->x;
54  new_point->y = pointy->y;
55 
56  PG_RETURN_POINT_P(new_point);
57 }
58 
59 /* By Reference, Variable Length */
60 
62 
63 Datum
65 {
66  text *t = PG_GETARG_TEXT_PP(0);
67 
68  /*
69  * VARSIZE_ANY_EXHDR is the size of the struct in bytes, minus the
70  * VARHDRSZ or VARHDRSZ_SHORT of its header. Construct the copy with a
71  * full-length header.
72  */
73  text *new_t = (text *) palloc(VARSIZE_ANY_EXHDR(t) + VARHDRSZ);
74 
76 
77  /*
78  * VARDATA is a pointer to the data region of the new struct. The source
79  * could be a short datum, so retrieve its data through VARDATA_ANY.
80  */
81  memcpy(VARDATA(new_t), /* destination */
82  VARDATA_ANY(t), /* source */
83  VARSIZE_ANY_EXHDR(t)); /* how many bytes */
84  PG_RETURN_TEXT_P(new_t);
85 }
86 
88 
89 Datum
91 {
92  text *arg1 = PG_GETARG_TEXT_PP(0);
93  text *arg2 = PG_GETARG_TEXT_PP(1);
94  int32 arg1_size = VARSIZE_ANY_EXHDR(arg1);
95  int32 arg2_size = VARSIZE_ANY_EXHDR(arg2);
96  int32 new_text_size = arg1_size + arg2_size + VARHDRSZ;
97  text *new_text = (text *) palloc(new_text_size);
98 
99  SET_VARSIZE(new_text, new_text_size);
100  memcpy(VARDATA(new_text), VARDATA_ANY(arg1), arg1_size);
101  memcpy(VARDATA(new_text) + arg1_size, VARDATA_ANY(arg2), arg2_size);
102  PG_RETURN_TEXT_P(new_text);
103 }
104 
105 /* Composite types */
106 
108 
109 Datum
111 {
113  int32 limit = PG_GETARG_INT32(1);
114  bool isnull;
115  int32 salary;
116 
117  salary = DatumGetInt32(GetAttributeByName(t, "salary", &isnull));
118  if (isnull)
119  PG_RETURN_BOOL(false);
120 
121  /*
122  * Alternatively, we might prefer to do PG_RETURN_NULL() for null salary
123  */
124 
125  PG_RETURN_BOOL(salary > limit);
126 }
signed int int32
Definition: c.h:481
#define VARHDRSZ
Definition: c.h:679
double float8
Definition: c.h:617
Datum GetAttributeByName(HeapTupleHeader tuple, const char *attname, bool *isNull)
Definition: execUtils.c:995
#define PG_GETARG_TEXT_PP(n)
Definition: fmgr.h:309
#define PG_GETARG_FLOAT8(n)
Definition: fmgr.h:282
#define PG_RETURN_FLOAT8(x)
Definition: fmgr.h:367
#define PG_GETARG_HEAPTUPLEHEADER(n)
Definition: fmgr.h:312
#define PG_RETURN_TEXT_P(x)
Definition: fmgr.h:372
#define PG_RETURN_INT32(x)
Definition: fmgr.h:354
#define PG_GETARG_INT32(n)
Definition: fmgr.h:269
#define PG_FUNCTION_ARGS
Definition: fmgr.h:193
#define PG_RETURN_BOOL(x)
Definition: fmgr.h:359
Datum add_one(PG_FUNCTION_ARGS)
Definition: funcs.c:24
PG_FUNCTION_INFO_V1(add_one)
PG_MODULE_MAGIC
Definition: funcs.c:16
Datum makepoint(PG_FUNCTION_ARGS)
Definition: funcs.c:47
Datum copytext(PG_FUNCTION_ARGS)
Definition: funcs.c:64
Datum add_one_float8(PG_FUNCTION_ARGS)
Definition: funcs.c:36
Datum concat_text(PG_FUNCTION_ARGS)
Definition: funcs.c:90
Datum c_overpaid(PG_FUNCTION_ARGS)
Definition: funcs.c:110
#define PG_GETARG_POINT_P(n)
Definition: geo_decls.h:185
#define PG_RETURN_POINT_P(x)
Definition: geo_decls.h:186
void * palloc(Size size)
Definition: mcxt.c:1304
void * arg
uintptr_t Datum
Definition: postgres.h:64
static int32 DatumGetInt32(Datum X)
Definition: postgres.h:202
float8 y
Definition: geo_decls.h:99
float8 x
Definition: geo_decls.h:98
Definition: c.h:674
#define VARDATA(PTR)
Definition: varatt.h:278
#define VARDATA_ANY(PTR)
Definition: varatt.h:324
#define SET_VARSIZE(PTR, len)
Definition: varatt.h:305
#define VARSIZE_ANY_EXHDR(PTR)
Definition: varatt.h:317