mirror of
https://github.com/postgres/postgres.git
synced 2025-11-16 15:02:33 +03:00
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.
This commit is contained in:
@@ -10,7 +10,7 @@
|
||||
* Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $Id: primnodes.h,v 1.67 2002/09/04 20:31:44 momjian Exp $
|
||||
* $Id: primnodes.h,v 1.68 2002/09/18 21:35:24 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -139,6 +139,30 @@ typedef struct RangeVar
|
||||
* ----------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/*
|
||||
* CoercionContext - distinguishes the allowed set of type casts
|
||||
*
|
||||
* NB: ordering of the alternatives is significant; later (larger) values
|
||||
* allow more casts than earlier ones.
|
||||
*/
|
||||
typedef enum CoercionContext
|
||||
{
|
||||
COERCION_IMPLICIT, /* coercion in context of expression */
|
||||
COERCION_ASSIGNMENT, /* coercion in context of assignment */
|
||||
COERCION_EXPLICIT /* explicit cast operation */
|
||||
} CoercionContext;
|
||||
|
||||
/*
|
||||
* CoercionForm - information showing how to display a function-call node
|
||||
*/
|
||||
typedef enum CoercionForm
|
||||
{
|
||||
COERCE_EXPLICIT_CALL, /* display as a function call */
|
||||
COERCE_EXPLICIT_CAST, /* display as an explicit cast */
|
||||
COERCE_IMPLICIT_CAST, /* implicit cast, so hide it */
|
||||
COERCE_DONTCARE /* special case for pathkeys */
|
||||
} CoercionForm;
|
||||
|
||||
/*
|
||||
* Expr
|
||||
*/
|
||||
@@ -194,6 +218,7 @@ typedef struct Func
|
||||
Oid funcid; /* PG_PROC OID of the function */
|
||||
Oid funcresulttype; /* PG_TYPE OID of result value */
|
||||
bool funcretset; /* true if function returns set */
|
||||
CoercionForm funcformat; /* how to display this function call */
|
||||
FunctionCachePtr func_fcache; /* runtime state, or NULL */
|
||||
} Func;
|
||||
|
||||
@@ -460,6 +485,7 @@ typedef struct RelabelType
|
||||
Node *arg; /* input expression */
|
||||
Oid resulttype; /* output type of coercion expression */
|
||||
int32 resulttypmod; /* output typmod (usually -1) */
|
||||
CoercionForm relabelformat; /* how to display this node */
|
||||
} RelabelType;
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user