mirror of
https://git.postgresql.org/git/postgresql.git
synced 2026-02-08 14:37:35 +08:00
with system catalog lookups, as was foreseen to be necessary almost since their creation. Instead put the information into two new pg_type columns, typcategory and typispreferred. Add support for setting these when creating a user-defined base type. The category column is just a "char" (i.e. a poor man's enum), allowing a crude form of user extensibility of the category list: just use an otherwise-unused character. This seems sufficient for foreseen uses, but we could upgrade to having an actual category catalog someday, if there proves to be a huge demand for custom type categories. In this patch I have attempted to hew exactly to the behavior of the previous hardwired logic, except for introducing new type categories for arrays, composites, and enums. In particular the default preferred state for user-defined types remains TRUE. That seems worth revisiting, but it should be done as a separate patch from introducing the infrastructure. Likewise, any adjustment of the standard set of categories should be done separately.
84 lines
2.9 KiB
C
84 lines
2.9 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* parse_coerce.h
|
|
* Routines for type coercion.
|
|
*
|
|
*
|
|
* Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
*
|
|
* $PostgreSQL: pgsql/src/include/parser/parse_coerce.h,v 1.76 2008/07/30 17:05:05 tgl Exp $
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
#ifndef PARSE_COERCE_H
|
|
#define PARSE_COERCE_H
|
|
|
|
#include "parser/parse_node.h"
|
|
|
|
|
|
/* 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);
|
|
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);
|
|
extern Node *coerce_to_domain(Node *arg, Oid baseTypeId, int32 baseTypeMod,
|
|
Oid typeId,
|
|
CoercionForm cformat, 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 Oid select_common_type(List *typeids, const char *context);
|
|
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);
|
|
|
|
#endif /* PARSE_COERCE_H */
|