Extend pg_cast castimplicit column to a three-way value; this allows us

Tom Lane <tgl@sss.pgh.pa.us>

Commit: b26dfb95222fddd25322bdddf3a5a58d3392d8b1
Author: Tom Lane <tgl@sss.pgh.pa.us>
Date: 2002-09-18T21:35:25Z
Releases: 7.3.1
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.

Files

PathChange+/−
doc/src/sgml/catalogs.sgml modified +17 −10
doc/src/sgml/datatype.sgml modified +49 −19
doc/src/sgml/ref/create_cast.sgml modified +56 −19
doc/src/sgml/release.sgml modified +3 −1
doc/src/sgml/typeconv.sgml modified +19 −31
src/backend/catalog/heap.c modified +11 −13
src/backend/catalog/pg_aggregate.c modified +2 −2
src/backend/catalog/pg_proc.c modified +4 −4
src/backend/commands/functioncmds.c modified +49 −24
src/backend/commands/indexcmds.c modified +5 −5
src/backend/executor/nodeAgg.c modified +2 −2
src/backend/nodes/copyfuncs.c modified +4 −2
src/backend/nodes/equalfuncs.c modified +19 −2
src/backend/nodes/makefuncs.c modified +3 −2
src/backend/nodes/outfuncs.c modified +9 −6
src/backend/nodes/readfuncs.c modified +9 −1
src/backend/optimizer/path/indxpath.c modified +5 −95
src/backend/optimizer/path/pathkeys.c modified +2 −1
src/backend/optimizer/plan/createplan.c modified +3 −14
src/backend/optimizer/prep/preptlist.c modified +4 −3
src/backend/optimizer/prep/prepunion.c modified +2 −3
src/backend/parser/analyze.c modified +13 −17
src/backend/parser/gram.y modified +12 −10
src/backend/parser/keywords.c modified +2 −1
src/backend/parser/parse_clause.c modified +11 −7
src/backend/parser/parse_coerce.c modified +306 −107
src/backend/parser/parse_expr.c modified +36 −155
src/backend/parser/parse_func.c modified +17 −22
src/backend/parser/parse_node.c modified +37 −89
src/backend/parser/parse_oper.c modified +5 −5
src/backend/parser/parse_target.c modified +14 −62
src/backend/rewrite/rewriteHandler.c modified +14 −23
src/backend/utils/adt/arrayfuncs.c modified +68 −1
src/backend/utils/adt/int8.c modified +115 −22
src/backend/utils/adt/numeric.c modified +45 −1
src/backend/utils/adt/regproc.c modified +13 −55
src/backend/utils/adt/ruleutils.c modified +82 −120
src/backend/utils/adt/varbit.c modified +56 −65
src/backend/utils/adt/varchar.c modified +42 −88
src/backend/utils/cache/lsyscache.c modified +1 −46
src/bin/initdb/initdb.sh modified +3 −3
src/bin/pg_dump/pg_dump.c modified +6 −4
src/include/catalog/catversion.h modified +2 −2
src/include/catalog/pg_cast.h modified +231 −191
src/include/catalog/pg_operator.h modified +8 −16
src/include/catalog/pg_proc.h modified +37 −32
src/include/nodes/makefuncs.h modified +4 −2
src/include/nodes/parsenodes.h modified +2 −2
src/include/nodes/primnodes.h modified +27 −1
src/include/parser/parse_coerce.h modified +17 −15
src/include/parser/parse_node.h modified +2 −1
src/include/parser/parse_target.h modified +3 −5
src/include/utils/array.h modified +2 −1
src/include/utils/builtins.h modified +3 −3
src/include/utils/int8.h modified +9 −1
src/include/utils/lsyscache.h modified +1 −2
src/include/utils/varbit.h modified +1 −3
src/test/regress/expected/domain.out modified +8 −4
src/test/regress/expected/horology-no-DST-before-1970.out modified +12 −8
src/test/regress/expected/horology.out modified +12 −8
src/test/regress/expected/horology-solaris-1947.out modified +12 −8
src/test/regress/expected/opr_sanity.out modified +30 −30
src/test/regress/expected/prepare.out modified +1 −1
src/test/regress/expected/rules.out modified +4 −4
src/test/regress/expected/strings.out modified +9 −2
src/test/regress/expected/union.out modified +1 −1
src/test/regress/sql/domain.sql modified +3 −3
src/test/regress/sql/horology.sql modified +2 −2
src/test/regress/sql/opr_sanity.sql modified +20 −16
src/test/regress/sql/strings.sql modified +3 −1