1 /*-------------------------------------------------------------------------
2  *
3  * parse_func.h
4  *
5  *
6  *
7  * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
8  * Portions Copyright (c) 1994, Regents of the University of California
9  *
10  * src/include/parser/parse_func.h
11  *
12  *-------------------------------------------------------------------------
13  */
14 #ifndef PARSE_FUNC_H
15 #define PARSE_FUNC_H
16 
17 #include "catalog/namespace.h"
18 #include "parser/parse_node.h"
19 
20 
21 /* Result codes for func_get_detail */
22 typedef enum
23 {
24 	FUNCDETAIL_NOTFOUND,		/* no matching function */
25 	FUNCDETAIL_MULTIPLE,		/* too many matching functions */
26 	FUNCDETAIL_NORMAL,			/* found a matching regular function */
27 	FUNCDETAIL_PROCEDURE,		/* found a matching procedure */
28 	FUNCDETAIL_AGGREGATE,		/* found a matching aggregate function */
29 	FUNCDETAIL_WINDOWFUNC,		/* found a matching window function */
30 	FUNCDETAIL_COERCION			/* it's a type coercion request */
31 } FuncDetailCode;
32 
33 
34 extern Node *ParseFuncOrColumn(ParseState *pstate, List *funcname, List *fargs,
35 							   Node *last_srf, FuncCall *fn, bool proc_call,
36 							   int location);
37 
38 extern FuncDetailCode func_get_detail(List *funcname,
39 									  List *fargs, List *fargnames,
40 									  int nargs, Oid *argtypes,
41 									  bool expand_variadic, bool expand_defaults,
42 									  Oid *funcid, Oid *rettype,
43 									  bool *retset, int *nvargs, Oid *vatype,
44 									  Oid **true_typeids, List **argdefaults);
45 
46 extern int	func_match_argtypes(int nargs,
47 								Oid *input_typeids,
48 								FuncCandidateList raw_candidates,
49 								FuncCandidateList *candidates);
50 
51 extern FuncCandidateList func_select_candidate(int nargs,
52 											   Oid *input_typeids,
53 											   FuncCandidateList candidates);
54 
55 extern void make_fn_arguments(ParseState *pstate,
56 							  List *fargs,
57 							  Oid *actual_arg_types,
58 							  Oid *declared_arg_types);
59 
60 extern const char *funcname_signature_string(const char *funcname, int nargs,
61 											 List *argnames, const Oid *argtypes);
62 extern const char *func_signature_string(List *funcname, int nargs,
63 										 List *argnames, const Oid *argtypes);
64 
65 extern Oid	LookupFuncName(List *funcname, int nargs, const Oid *argtypes,
66 						   bool missing_ok);
67 extern Oid	LookupFuncWithArgs(ObjectType objtype, ObjectWithArgs *func,
68 							   bool missing_ok);
69 
70 extern void check_srf_call_placement(ParseState *pstate, Node *last_srf,
71 									 int location);
72 
73 #endif							/* PARSE_FUNC_H */
74