1 | /*------------------------------------------------------------------------- |
2 | * |
3 | * parse_coerce.h |
4 | * Routines for type coercion. |
5 | * |
6 | * |
7 | * Portions Copyright (c) 1996-2019, 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 | extern Oid resolve_generic_type(Oid declared_type, |
83 | Oid context_actual_type, |
84 | Oid context_declared_type); |
85 | |
86 | extern CoercionPathType find_coercion_pathway(Oid targetTypeId, |
87 | Oid sourceTypeId, |
88 | CoercionContext ccontext, |
89 | Oid *funcid); |
90 | extern CoercionPathType find_typmod_coercion_function(Oid typeId, |
91 | Oid *funcid); |
92 | |
93 | #endif /* PARSE_COERCE_H */ |
94 | |