Files
openGauss-server/src/include/parser/parse_coerce.h
2022-03-04 23:22:16 +08:00

74 lines
3.5 KiB
C

/* -------------------------------------------------------------------------
*
* parse_coerce.h
* Routines for type coercion.
*
*
* Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
* Portions Copyright (c) 2021, openGauss Contributors
*
* src/include/parser/parse_coerce.h
*
* -------------------------------------------------------------------------
*/
#ifndef PARSE_COERCE_H
#define PARSE_COERCE_H
#include "parser/parse_node.h"
/* Setup error traceback support for ereport() */
#define ELOG_FIELD_NAME_START(fieldname) \
ErrorContextCallback errcontext; \
errcontext.callback = expression_error_callback; \
errcontext.arg = (void*)(fieldname); \
errcontext.previous = t_thrd.log_cxt.error_context_stack; \
t_thrd.log_cxt.error_context_stack = &errcontext;
#define ELOG_FIELD_NAME_END t_thrd.log_cxt.error_context_stack = errcontext.previous;
/* Type categories (see TYPCATEGORY_xxx symbols in catalog/pg_type.h) */
typedef char TYPCATEGORY;
/* Result codes for find_coercion_pathway */
typedef enum CoercionPathType {
COERCION_PATH_NONE, /* failed to find any coercion pathway */
COERCION_PATH_FUNC, /* apply the specified coercion function */
COERCION_PATH_RELABELTYPE, /* binary-compatible cast, no function */
COERCION_PATH_ARRAYCOERCE, /* need an ArrayCoerceExpr node */
COERCION_PATH_COERCEVIAIO /* need a CoerceViaIO node */
} CoercionPathType;
extern bool IsBinaryCoercible(Oid srctype, Oid targettype);
extern bool IsPreferredType(TYPCATEGORY category, Oid type);
extern TYPCATEGORY TypeCategory(Oid type);
extern Node* coerce_to_target_type(ParseState* pstate, Node* expr, Oid exprtype, Oid targettype, int32 targettypmod,
CoercionContext ccontext, CoercionForm cformat, int location);
extern bool can_coerce_type(int nargs, Oid* input_typeids, Oid* target_typeids, CoercionContext ccontext);
extern Node* coerce_type(ParseState* pstate, Node* node, Oid inputTypeId, Oid targetTypeId, int32 targetTypeMod,
CoercionContext ccontext, CoercionForm cformat, int location);
extern Node* coerce_to_domain(Node* arg, Oid baseTypeId, int32 baseTypeMod, Oid typeId, CoercionForm cformat,
int location, bool hideInputCoercion, bool lengthCoercionDone);
extern Node* coerce_to_boolean(ParseState* pstate, Node* node, const char* constructName);
extern Node* coerce_to_specific_type(ParseState* pstate, Node* node, Oid targetTypeId, const char* constructName);
extern int parser_coercion_errposition(ParseState* pstate, int coerce_location, Node* input_expr);
extern Oid select_common_type(ParseState* pstate, List* exprs, const char* context, Node** which_expr);
extern Node* coerce_to_common_type(ParseState* pstate, Node* node, Oid targetTypeId, const char* context);
extern bool check_generic_type_consistency(Oid* actual_arg_types, Oid* declared_arg_types, int nargs);
extern Oid enforce_generic_type_consistency(
Oid* actual_arg_types, Oid* declared_arg_types, int nargs, Oid rettype, bool allow_poly);
extern Oid resolve_generic_type(Oid declared_type, Oid context_actual_type, Oid context_declared_type);
extern CoercionPathType find_coercion_pathway(
Oid targetTypeId, Oid sourceTypeId, CoercionContext ccontext, Oid* funcid);
extern CoercionPathType find_typmod_coercion_function(Oid typeId, Oid* funcid);
extern void expression_error_callback(void* arg);
#endif /* PARSE_COERCE_H */