aboutsummaryrefslogtreecommitdiff
path: root/src/include/parser/parse_func.h
blob: de8fc66d848fa51d8379b5126898b9bcca1734d9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
/*-------------------------------------------------------------------------
 *
 * catalog_utils.h--
 *
 *
 *
 * Copyright (c) 1994, Regents of the University of California
 *
 * $Id: parse_func.h,v 1.1 1997/11/25 22:06:56 momjian Exp $
 *
 *-------------------------------------------------------------------------
 */
#ifndef PARSER_FUNC_H
#define PARSER_FUNC_H

#include <nodes/nodes.h>
#include <nodes/pg_list.h>
#include <nodes/parsenodes.h>
#include <nodes/primnodes.h>
#include <parser/parse_func.h>
#include <parser/parse_node.h>

/*
 *	This structure is used to explore the inheritance hierarchy above
 *	nodes in the type tree in order to disambiguate among polymorphic
 *	functions.
 */
typedef struct _InhPaths
{
	int			nsupers;		/* number of superclasses */
	Oid			self;			/* this class */
	Oid		   *supervec;		/* vector of superclasses */
} InhPaths;

/*
 *	This structure holds a list of possible functions or operators that
 *	agree with the known name and argument types of the function/operator.
 */
typedef struct _CandidateList
{
	Oid		   *args;
	struct _CandidateList *next;
}		   *CandidateList;

Node *ParseFunc(ParseState *pstate, char *funcname, List *fargs,
	int *curr_resno);

Oid funcid_get_rettype(Oid funcid);

CandidateList func_get_candidates(char *funcname, int nargs);

bool can_coerce(int nargs, Oid *input_typeids, Oid *func_typeids);

int match_argtypes(int nargs,
				   Oid *input_typeids,
				   CandidateList function_typeids,
				   CandidateList *candidates);

Oid * func_select_candidate(int nargs,
						  Oid *input_typeids,
						  CandidateList candidates);

bool func_get_detail(char *funcname,
					int nargs,
					Oid *oid_array,
					Oid *funcid,	/* return value */
					Oid *rettype,	/* return value */
					bool *retset,	/* return value */
					Oid **true_typeids);

Oid ** argtype_inherit(int nargs, Oid *oid_array);

int findsupers(Oid relid, Oid **supervec);

Oid **genxprod(InhPaths *arginh, int nargs);

void make_arguments(int nargs,
				   List *fargs,
				   Oid *input_typeids,
				   Oid *function_typeids);

List *setup_tlist(char *attname, Oid relid);

List *setup_base_tlist(Oid typeid);

Node *ParseComplexProjection(ParseState *pstate,
						   char *funcname,
						   Node *first_arg,
						   bool *attisset);
	
void func_error(char *caller, char *funcname, int nargs, Oid *argtypes);

				   


#endif							/* PARSE_FUNC_H */