1 /*-------------------------------------------------------------------------
2  *
3  * parse_coerce.h
4  *	Routines for type coercion.
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_coerce.h
11  *
12  *-------------------------------------------------------------------------
13  */
14 #ifndef PARSE_COERCE_H
15 #define PARSE_COERCE_H
16 
17 #include "parser/parse_node.h"
18 
19 
20 /* Type categories (see TYPCATEGORY_xxx symbols in catalog/pg_type.h) */
21 typedef char TYPCATEGORY;
22 
23 /* Result codes for find_coercion_pathway */
24 typedef enum CoercionPathType
25 {
26 	COERCION_PATH_NONE,			/* failed to find any coercion pathway */
27 	COERCION_PATH_FUNC,			/* apply the specified coercion function */
28 	COERCION_PATH_RELABELTYPE,	/* binary-compatible cast, no function */
29 	COERCION_PATH_ARRAYCOERCE,	/* need an ArrayCoerceExpr node */
30 	COERCION_PATH_COERCEVIAIO	/* need a CoerceViaIO node */
31 } CoercionPathType;
32 
33 
34 extern bool IsBinaryCoercible(Oid srctype, Oid targettype);
35 extern bool IsPreferredType(TYPCATEGORY category, Oid type);
36 extern TYPCATEGORY TypeCategory(Oid type);
37 
38 extern Node *coerce_to_target_type(ParseState *pstate,
39 								   Node *expr, Oid exprtype,
40 								   Oid targettype, int32 targettypmod,
41 								   CoercionContext ccontext,
42 								   CoercionForm cformat,
43 								   int location);
44 extern bool can_coerce_type(int nargs, const Oid *input_typeids, const Oid *target_typeids,
45 							CoercionContext ccontext);
46 extern Node *coerce_type(ParseState *pstate, Node *node,
47 						 Oid inputTypeId, Oid targetTypeId, int32 targetTypeMod,
48 						 CoercionContext ccontext, CoercionForm cformat, int location);
49 extern Node *coerce_to_domain(Node *arg, Oid baseTypeId, int32 baseTypeMod,
50 							  Oid typeId,
51 							  CoercionContext ccontext, CoercionForm cformat, int location,
52 							  bool hideInputCoercion);
53 
54 extern Node *coerce_to_boolean(ParseState *pstate, Node *node,
55 							   const char *constructName);
56 extern Node *coerce_to_specific_type(ParseState *pstate, Node *node,
57 									 Oid targetTypeId,
58 									 const char *constructName);
59 
60 extern Node *coerce_to_specific_type_typmod(ParseState *pstate, Node *node,
61 											Oid targetTypeId, int32 targetTypmod,
62 											const char *constructName);
63 
64 extern int	parser_coercion_errposition(ParseState *pstate,
65 										int coerce_location,
66 										Node *input_expr);
67 
68 extern Oid	select_common_type(ParseState *pstate, List *exprs,
69 							   const char *context, Node **which_expr);
70 extern Node *coerce_to_common_type(ParseState *pstate, Node *node,
71 								   Oid targetTypeId,
72 								   const char *context);
73 
74 extern bool check_generic_type_consistency(const Oid *actual_arg_types,
75 										   const Oid *declared_arg_types,
76 										   int nargs);
77 extern Oid	enforce_generic_type_consistency(const Oid *actual_arg_types,
78 											 Oid *declared_arg_types,
79 											 int nargs,
80 											 Oid rettype,
81 											 bool allow_poly);
82 
83 extern char *check_valid_polymorphic_signature(Oid ret_type,
84 											   const Oid *declared_arg_types,
85 											   int nargs);
86 extern char *check_valid_internal_signature(Oid ret_type,
87 											const Oid *declared_arg_types,
88 											int nargs);
89 
90 extern CoercionPathType find_coercion_pathway(Oid targetTypeId,
91 											  Oid sourceTypeId,
92 											  CoercionContext ccontext,
93 											  Oid *funcid);
94 extern CoercionPathType find_typmod_coercion_function(Oid typeId,
95 													  Oid *funcid);
96 
97 #endif							/* PARSE_COERCE_H */
98