|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
*
|
|
|
|
|
* parse_coerce.h
|
|
|
|
|
* Routines for type coercion.
|
|
|
|
|
*
|
Extend pg_cast castimplicit column to a three-way value; this allows us
to be flexible about assignment casts without introducing ambiguity in
operator/function resolution. Introduce a well-defined promotion hierarchy
for numeric datatypes (int2->int4->int8->numeric->float4->float8).
Change make_const to initially label numeric literals as int4, int8, or
numeric (never float8 anymore).
Explicitly mark Func and RelabelType nodes to indicate whether they came
from a function call, explicit cast, or implicit cast; use this to do
reverse-listing more accurately and without so many heuristics.
Explicit casts to char, varchar, bit, varbit will truncate or pad without
raising an error (the pre-7.2 behavior), while assigning to a column without
any explicit cast will still raise an error for wrong-length data like 7.3.
This more nearly follows the SQL spec than 7.2 behavior (we should be
reporting a 'completion condition' in the explicit-cast cases, but we have
no mechanism for that, so just do silent truncation).
Fix some problems with enforcement of typmod for array elements;
it didn't work at all in 'UPDATE ... SET array[n] = foo', for example.
Provide a generalized array_length_coerce() function to replace the
specialized per-array-type functions that used to be needed (and were
missing for NUMERIC as well as all the datetime types).
Add missing conversions int8<->float4, text<->numeric, oid<->int8.
initdb forced.
24 years ago
|
|
|
*
|
|
|
|
|
* Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
|
|
|
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
|
|
|
*
|
|
|
|
|
* src/include/parser/parse_coerce.h
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
#ifndef PARSE_COERCE_H
|
|
|
|
|
#define PARSE_COERCE_H
|
|
|
|
|
|
|
|
|
|
#include "parser/parse_node.h"
|
|
|
|
|
|
|
|
|
|
|
Replace the hard-wired type knowledge in TypeCategory() and IsPreferredType()
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.
18 years ago
|
|
|
/* 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;
|
|
|
|
|
|
|
|
|
|
|
Extend pg_cast castimplicit column to a three-way value; this allows us
to be flexible about assignment casts without introducing ambiguity in
operator/function resolution. Introduce a well-defined promotion hierarchy
for numeric datatypes (int2->int4->int8->numeric->float4->float8).
Change make_const to initially label numeric literals as int4, int8, or
numeric (never float8 anymore).
Explicitly mark Func and RelabelType nodes to indicate whether they came
from a function call, explicit cast, or implicit cast; use this to do
reverse-listing more accurately and without so many heuristics.
Explicit casts to char, varchar, bit, varbit will truncate or pad without
raising an error (the pre-7.2 behavior), while assigning to a column without
any explicit cast will still raise an error for wrong-length data like 7.3.
This more nearly follows the SQL spec than 7.2 behavior (we should be
reporting a 'completion condition' in the explicit-cast cases, but we have
no mechanism for that, so just do silent truncation).
Fix some problems with enforcement of typmod for array elements;
it didn't work at all in 'UPDATE ... SET array[n] = foo', for example.
Provide a generalized array_length_coerce() function to replace the
specialized per-array-type functions that used to be needed (and were
missing for NUMERIC as well as all the datetime types).
Add missing conversions int8<->float4, text<->numeric, oid<->int8.
initdb forced.
24 years ago
|
|
|
extern bool IsBinaryCoercible(Oid srctype, Oid targettype);
|
Replace the hard-wired type knowledge in TypeCategory() and IsPreferredType()
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.
18 years ago
|
|
|
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);
|
Extend pg_cast castimplicit column to a three-way value; this allows us
to be flexible about assignment casts without introducing ambiguity in
operator/function resolution. Introduce a well-defined promotion hierarchy
for numeric datatypes (int2->int4->int8->numeric->float4->float8).
Change make_const to initially label numeric literals as int4, int8, or
numeric (never float8 anymore).
Explicitly mark Func and RelabelType nodes to indicate whether they came
from a function call, explicit cast, or implicit cast; use this to do
reverse-listing more accurately and without so many heuristics.
Explicit casts to char, varchar, bit, varbit will truncate or pad without
raising an error (the pre-7.2 behavior), while assigning to a column without
any explicit cast will still raise an error for wrong-length data like 7.3.
This more nearly follows the SQL spec than 7.2 behavior (we should be
reporting a 'completion condition' in the explicit-cast cases, but we have
no mechanism for that, so just do silent truncation).
Fix some problems with enforcement of typmod for array elements;
it didn't work at all in 'UPDATE ... SET array[n] = foo', for example.
Provide a generalized array_length_coerce() function to replace the
specialized per-array-type functions that used to be needed (and were
missing for NUMERIC as well as all the datetime types).
Add missing conversions int8<->float4, text<->numeric, oid<->int8.
initdb forced.
24 years ago
|
|
|
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);
|
Extend pg_cast castimplicit column to a three-way value; this allows us
to be flexible about assignment casts without introducing ambiguity in
operator/function resolution. Introduce a well-defined promotion hierarchy
for numeric datatypes (int2->int4->int8->numeric->float4->float8).
Change make_const to initially label numeric literals as int4, int8, or
numeric (never float8 anymore).
Explicitly mark Func and RelabelType nodes to indicate whether they came
from a function call, explicit cast, or implicit cast; use this to do
reverse-listing more accurately and without so many heuristics.
Explicit casts to char, varchar, bit, varbit will truncate or pad without
raising an error (the pre-7.2 behavior), while assigning to a column without
any explicit cast will still raise an error for wrong-length data like 7.3.
This more nearly follows the SQL spec than 7.2 behavior (we should be
reporting a 'completion condition' in the explicit-cast cases, but we have
no mechanism for that, so just do silent truncation).
Fix some problems with enforcement of typmod for array elements;
it didn't work at all in 'UPDATE ... SET array[n] = foo', for example.
Provide a generalized array_length_coerce() function to replace the
specialized per-array-type functions that used to be needed (and were
missing for NUMERIC as well as all the datetime types).
Add missing conversions int8<->float4, text<->numeric, oid<->int8.
initdb forced.
24 years ago
|
|
|
|
|
|
|
|
#endif /* PARSE_COERCE_H */
|