1 /*------------------------------------------------------------------------- 2 * 3 * parse_coerce.h 4 * Routines for type coercion. 5 * 6 * 7 * Portions Copyright (c) 1996-2021, 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 int32 select_common_typmod(ParseState *pstate, List *exprs, Oid common_type); 75 76 extern bool check_generic_type_consistency(const Oid *actual_arg_types, 77 const Oid *declared_arg_types, 78 int nargs); 79 extern Oid enforce_generic_type_consistency(const Oid *actual_arg_types, 80 Oid *declared_arg_types, 81 int nargs, 82 Oid rettype, 83 bool allow_poly); 84 85 extern char *check_valid_polymorphic_signature(Oid ret_type, 86 const Oid *declared_arg_types, 87 int nargs); 88 extern char *check_valid_internal_signature(Oid ret_type, 89 const Oid *declared_arg_types, 90 int nargs); 91 92 extern CoercionPathType find_coercion_pathway(Oid targetTypeId, 93 Oid sourceTypeId, 94 CoercionContext ccontext, 95 Oid *funcid); 96 extern CoercionPathType find_typmod_coercion_function(Oid typeId, 97 Oid *funcid); 98 99 #endif /* PARSE_COERCE_H */ 100