44#include "catalog/pg_type.h"
55#include "utils/builtins.h"
66#include "utils/fmgroids.h"
7- #include "utils/fmgrtab.h"
87#include "utils/lsyscache.h"
98#include "utils/memutils.h"
109
@@ -35,39 +34,39 @@ typedef struct FunctionByOid
3534
3635static const FunctionByName g_allowed_builtins [] = {
3736 /* rounding casts */
38- ( FunctionByName ) {.name = "ftoi2" , .primary_arg = 0 },
39- ( FunctionByName ) {.name = "ftoi4" , .primary_arg = 0 },
40- ( FunctionByName ) {.name = "ftoi8" , .primary_arg = 0 },
41- ( FunctionByName ) {.name = "dtoi2" , .primary_arg = 0 },
42- ( FunctionByName ) {.name = "dtoi4" , .primary_arg = 0 },
43- ( FunctionByName ) {.name = "dtoi8" , .primary_arg = 0 },
44- ( FunctionByName ) {.name = "numeric_int2" , .primary_arg = 0 },
45- ( FunctionByName ) {.name = "numeric_int4" , .primary_arg = 0 },
46- ( FunctionByName ) {.name = "numeric_int8" , .primary_arg = 0 },
37+ {.name = "ftoi2" , .primary_arg = 0 },
38+ {.name = "ftoi4" , .primary_arg = 0 },
39+ {.name = "ftoi8" , .primary_arg = 0 },
40+ {.name = "dtoi2" , .primary_arg = 0 },
41+ {.name = "dtoi4" , .primary_arg = 0 },
42+ {.name = "dtoi8" , .primary_arg = 0 },
43+ {.name = "numeric_int2" , .primary_arg = 0 },
44+ {.name = "numeric_int4" , .primary_arg = 0 },
45+ {.name = "numeric_int8" , .primary_arg = 0 },
4746 /* substring */
48- ( FunctionByName ) {.name = "text_substr" , .primary_arg = 0 },
49- ( FunctionByName ) {.name = "text_substr_no_len" , .primary_arg = 0 },
50- ( FunctionByName ) {.name = "bytea_substr" , .primary_arg = 0 },
51- ( FunctionByName ) {.name = "bytea_substr_no_len" , .primary_arg = 0 },
47+ {.name = "text_substr" , .primary_arg = 0 },
48+ {.name = "text_substr_no_len" , .primary_arg = 0 },
49+ {.name = "bytea_substr" , .primary_arg = 0 },
50+ {.name = "bytea_substr_no_len" , .primary_arg = 0 },
5251 /* numeric generalization */
53- ( FunctionByName ) {.name = "dround" , .primary_arg = 0 },
54- ( FunctionByName ) {.name = "numeric_round" , .primary_arg = 0 },
55- ( FunctionByName ) {.name = "dceil" , .primary_arg = 0 },
56- ( FunctionByName ) {.name = "numeric_ceil" , .primary_arg = 0 },
57- ( FunctionByName ) {.name = "dfloor" , .primary_arg = 0 },
58- ( FunctionByName ) {.name = "numeric_floor" , .primary_arg = 0 },
52+ {.name = "dround" , .primary_arg = 0 },
53+ {.name = "numeric_round" , .primary_arg = 0 },
54+ {.name = "dceil" , .primary_arg = 0 },
55+ {.name = "numeric_ceil" , .primary_arg = 0 },
56+ {.name = "dfloor" , .primary_arg = 0 },
57+ {.name = "numeric_floor" , .primary_arg = 0 },
5958 /* width_bucket */
60- ( FunctionByName ) {.name = "width_bucket_float8" , .primary_arg = 0 },
61- ( FunctionByName ) {.name = "width_bucket_numeric" , .primary_arg = 0 },
59+ {.name = "width_bucket_float8" , .primary_arg = 0 },
60+ {.name = "width_bucket_numeric" , .primary_arg = 0 },
6261 /* date_trunc */
63- ( FunctionByName ) {.name = "timestamptz_trunc" , .primary_arg = 1 },
64- ( FunctionByName ) {.name = "timestamp_trunc" , .primary_arg = 1 },
62+ {.name = "timestamptz_trunc" , .primary_arg = 1 },
63+ {.name = "timestamp_trunc" , .primary_arg = 1 },
6564 /* extract & date_part*/
66- ( FunctionByName ) {.name = "extract_date" , .primary_arg = 1 },
67- ( FunctionByName ) {.name = "extract_timestamp" , .primary_arg = 1 },
68- ( FunctionByName ) {.name = "extract_timestamptz" , .primary_arg = 1 },
69- ( FunctionByName ) {.name = "timestamp_part" , .primary_arg = 1 },
70- ( FunctionByName ) {.name = "timestamptz_part" , .primary_arg = 1 },
65+ {.name = "extract_date" , .primary_arg = 1 },
66+ {.name = "extract_timestamp" , .primary_arg = 1 },
67+ {.name = "extract_timestamptz" , .primary_arg = 1 },
68+ {.name = "timestamp_part" , .primary_arg = 1 },
69+ {.name = "timestamptz_part" , .primary_arg = 1 },
7170 /**/
7271};
7372
@@ -93,8 +92,8 @@ static const char *const g_implicit_range_builtins_untrusted[] = {
9392#endif
9493
9594static const FunctionByOid g_allowed_builtins_extra [] = {
96- ( FunctionByOid ) {.funcid = F_NUMERIC_ROUND_INT , .primary_arg = 0 },
97- ( FunctionByOid ) {.funcid = F_DATE_PART_TEXT_DATE , .primary_arg = 1 },
95+ {.funcid = F_NUMERIC_ROUND_INT , .primary_arg = 0 },
96+ {.funcid = F_DATE_PART_TEXT_DATE , .primary_arg = 1 },
9897 /**/
9998};
10099
@@ -167,6 +166,35 @@ static const Oid *const g_implicit_range_udfs_untrusted[] = {
167166 & g_oid_cache .floor_by_dd ,
168167};
169168
169+ /* Taken from fmgrtab.h. */
170+ typedef struct
171+ {
172+ Oid foid ; /* OID of the function */
173+ short nargs ; /* 0..FUNC_MAX_ARGS, or -1 if variable count */
174+ bool strict ; /* T if function is "strict" */
175+ bool retset ; /* T if function returns a set */
176+ const char * funcName ; /* C name of the function */
177+ PGFunction func ; /* pointer to compiled function */
178+ } FmgrBuiltin ;
179+
180+ #define InvalidOidBuiltinMapping PG_UINT16_MAX
181+
182+ #ifdef WIN32
183+ /* On Windows, FMGR exports have to be linked dynamically. */
184+ #define FMGRIMPORTTYPE PGDLLIMPORT
185+ #else
186+ #define FMGRIMPORTTYPE
187+ #endif
188+
189+ /*
190+ * This table stores info about all the built-in functions (ie, functions
191+ * that are compiled into the Postgres executable).
192+ */
193+ extern FMGRIMPORTTYPE const FmgrBuiltin fmgr_builtins [];
194+ extern FMGRIMPORTTYPE const int fmgr_nbuiltins ;
195+ extern FMGRIMPORTTYPE const Oid fmgr_last_builtin_oid ;
196+ extern FMGRIMPORTTYPE const uint16 fmgr_builtin_oid_index [];
197+
170198/* Taken from fmgr.c. */
171199static const FmgrBuiltin * fmgr_isbuiltin (Oid id )
172200{
0 commit comments