При использовании CREATE TABLE
можно объявить типы данных varchar(12)
, varchar(34)
или varchar
, и они будут другими ...
Но при объявлении функции "подтип" игнорируется ... Нет предупреждения (!) ...
Я вижу, что игнорировать - это хорошо, сигнатура функции необходимо управлять перегрузкой функций , и «подписи подтипов» будут чем-то хаотичным в управлении ... Но я не вижу в Руководстве (также ничего в typeconv-func ), нет Предупреждение гида об этом, без объяснений.
Итак, в наши дни 2018 год, после всех улучшений PostgreSQL v10 + ... Можно ли настроить PostgreSQL для приема перегрузки функций с подтипами?
Конкретный пример
CREATE TABLE foo ( x varchar(12), y varchar(34), z varchar );
\d foo
-- not ignored, as expected
CREATE OR REPLACE FUNCTION foo( p_x varchar ) RETURNS text AS
$f$ SELECT 'hello1' $f$ LANGUAGE SQL IMMUTABLE;
CREATE OR REPLACE FUNCTION foo( p_x varchar(12) ) RETURNS text AS
$f$ SELECT 'hello10' $f$ LANGUAGE SQL IMMUTABLE;
\df foo
List of functions
Schema | Name | Result data type | Argument data types | Type
--------+------+------------------+-----------------------+--------
public | foo | text | p_x character varying | normal
(1 row)
Так что невозможно объявить foo(x)
, что не делают того же самого foo(z)
...
SELECT pg_typeof(x),pg_typeof(y),pg_typeof(z) FROM foo;
-- returns "character varying" for all
Конечно, иногда мы можем использовать pg_typeof()
:
- С VARCHAR (s) невозможно проверить
s
.
- С PostGIS можно
geometry
проверить подтип (например, подтип POINT). Это перегрузка обходной путь, но не "реальная перегрузка ".
ПРИМЕЧАНИЕ : ошибка синтаксического анализа с комментарием foo('abc')
будет устранена с помощью соответствующего ортогонального набора функций перегрузки ". В примере с
CREATE FUNCTION foo( p_x text ) RETURNS text AS $f$ SELECT 'hello-text'
$f$ LANGUAGE SQL IMMUTABLE;
"автоматическое приведение abc
к тексту" решает проблему select foo('abc')
работает.