pgsql: Introduce "anycompatible" family of polymorphic types.

Поиск
Список
Период
Сортировка
От Tom Lane
Тема pgsql: Introduce "anycompatible" family of polymorphic types.
Дата
Msg-id E1jExKL-0008Sv-LI@gemulon.postgresql.org
обсуждение исходный текст
Список pgsql-committers
Introduce "anycompatible" family of polymorphic types.

This patch adds the pseudo-types anycompatible, anycompatiblearray,
anycompatiblenonarray, and anycompatiblerange.  They work much like
anyelement, anyarray, anynonarray, and anyrange respectively, except
that the actual input values need not match precisely in type.
Instead, if we can find a common supertype (using the same rules
as for UNION/CASE type resolution), then the parser automatically
promotes the input values to that type.  For example,
"myfunc(anycompatible, anycompatible)" can match a call with one
integer and one bigint argument, with the integer automatically
promoted to bigint.  With anyelement in the definition, the user
would have had to cast the integer explicitly.

The new types also provide a second, independent set of type variables
for function matching; thus with "myfunc(anyelement, anyelement,
anycompatible) returns anycompatible" the first two arguments are
constrained to be the same type, but the third can be some other
type, and the result has the type of the third argument.  The need
for more than one set of type variables was foreseen back when we
first invented the polymorphic types, but we never did anything
about it.

Pavel Stehule, revised a bit by me

Discussion: https://postgr.es/m/CAFj8pRDna7VqNi8gR+Tt2Ktmz0cq5G93guc3Sbn_NVPLdXAkqA@mail.gmail.com

Branch
------
master

Details
-------
https://git.postgresql.org/pg/commitdiff/24e2885ee304cb6a94fdfc25a1a108344ed9f4f7

Modified Files
--------------
doc/src/sgml/datatype.sgml                     |  63 ++-
doc/src/sgml/extend.sgml                       | 183 ++++++++-
doc/src/sgml/plpgsql.sgml                      |  50 ++-
doc/src/sgml/xfunc.sgml                        |  57 ++-
src/backend/catalog/index.c                    |   8 +-
src/backend/catalog/pg_proc.c                  |   3 +
src/backend/commands/functioncmds.c            |   1 +
src/backend/parser/parse_coerce.c              | 527 +++++++++++++++++++++++--
src/backend/utils/adt/json.c                   |   2 +-
src/backend/utils/adt/jsonb.c                  |   2 +-
src/backend/utils/adt/pseudotypes.c            |  35 ++
src/backend/utils/fmgr/funcapi.c               | 196 ++++++++-
src/include/catalog/catversion.h               |   2 +-
src/include/catalog/pg_proc.dat                |  45 ++-
src/include/catalog/pg_type.dat                |  30 +-
src/include/catalog/pg_type.h                  |  11 +
src/pl/plpgsql/src/pl_comp.c                   |  12 +-
src/test/regress/expected/aggregates.out       |  24 ++
src/test/regress/expected/create_aggregate.out |  28 +-
src/test/regress/expected/opr_sanity.out       |  52 ++-
src/test/regress/expected/plpgsql.out          | 101 +++++
src/test/regress/expected/polymorphism.out     | 311 +++++++++++++++
src/test/regress/expected/rangefuncs.out       |  53 +++
src/test/regress/expected/rangetypes.out       |  26 ++
src/test/regress/expected/type_sanity.out      |  10 +-
src/test/regress/sql/aggregates.sql            |   4 +
src/test/regress/sql/create_aggregate.sql      |  34 +-
src/test/regress/sql/opr_sanity.sql            |  33 +-
src/test/regress/sql/plpgsql.sql               |  68 ++++
src/test/regress/sql/polymorphism.sql          | 159 ++++++++
src/test/regress/sql/rangefuncs.sql            |  21 +
src/test/regress/sql/rangetypes.sql            |  16 +
src/test/regress/sql/type_sanity.sql           |  10 +-
33 files changed, 2046 insertions(+), 131 deletions(-)


В списке pgsql-committers по дате отправления:

Предыдущее
От: Fujii Masao
Дата:
Сообщение: pgsql: Make pg_basebackup ask the server to estimate the total backup s
Следующее
От: Noah Misch
Дата:
Сообщение: pgsql: Back-patch src/test/recovery and PostgresNode from 9.6 to 9.5.