Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / CREATE TYPE: примеры из справки, которые не работают / 13 сообщений из 13, страница 1 из 1
06.10.2020, 22:58
    #40005971
Cyrax_02
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CREATE TYPE: примеры из справки, которые не работают
https://www.postgresql.org/docs/13/sql-createtype.html The input_function converts the type's external textual representation to the internal representation used by the operators and functions defined for the type. output_function performs the reverse transformation. The input function can be declared as taking one argument of type cstring, or as taking three arguments of types cstring, oid, integer. The first argument is the input text as a C string https://www.postgresql.org/docs/13/sql-createtype.html This example creates the base data type box and then uses the type in a table definition:
CREATE TYPE box;

CREATE FUNCTION my_box_in_function(cstring) RETURNS box AS ... ;
CREATE FUNCTION my_box_out_function(box) RETURNS cstring AS ... ;

CREATE TYPE box (
INTERNALLENGTH = 16,
INPUT = my_box_in_function,
OUTPUT = my_box_out_function
);

CREATE TABLE myboxes (
id integer,
description box
);
Проверяем работоспособность приведённого примера:
Код: sql
1.
2.
3.
4.
5.
6.
CREATE TYPE test_type;
CREATE OR REPLACE FUNCTION test_input(cstring) RETURNS test_type AS $$ SELECT 1 $$ LANGUAGE SQL;
Ошибка: SQL-функции не могут иметь аргументы типа cstring

CREATE OR REPLACE FUNCTION test_input(int4) RETURNS test_type AS $$ SELECT 1; $$ LANGUAGE SQL;
Ошибка: SQL-функция не может возвращать тип-пустышку test_type


Таким образом, имеем 2 противоречия справки фактическому поведению.
И как так можно работать, когда ничего не работает ???
...
Рейтинг: 0 / 0
06.10.2020, 23:04
    #40005974
Cyrax_02
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CREATE TYPE: примеры из справки, которые не работают
Код: sql
1.
2.
CREATE OR REPLACE FUNCTION test_input(int4) RETURNS test_type AS $$ SELECT 1; $$ LANGUAGE PLPGSQL;
ОШИБКА: функции PL/pgSQL не могут возвращать тип test_type
...
Рейтинг: 0 / 0
06.10.2020, 23:11
    #40005977
Cyrax_02
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CREATE TYPE: примеры из справки, которые не работают
Код: sql
1.
2.
CREATE OR REPLACE FUNCTION test_input(cstring) RETURNS test_type as $$ BEGIN RETURN 1; END; $$ LANGUAGE PLPGSQL;
ОШИБКА: функции PL/pgSQL не могут возвращать тип test_type


Т.е. PLPGSQL в отличие от SQL, может принимать cstring , но типы-пустышки по-прежнему возвращать не может.

Вопросы :
1 ) Тогда как объявить функции INPUT и OUTPUT для нового типа ?
2 ) Как заставить SQL принимать строки cstring ? Т.к. SQL, судя по всему, работает быстрее PLPGSQL
...
Рейтинг: 0 / 0
06.10.2020, 23:19
    #40005979
Cyrax_02
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CREATE TYPE: примеры из справки, которые не работают
Код: sql
1.
2.
3.
create type test_type (LIKE = int4, INPUT = oidin, OUTPUT = oidout);
ОШИБКА:  тип "test_type" не существует
ПОДСКАЗКА:  Создайте тип в виде оболочки, затем определите для него функции ввода-вывода и в завершение выполните полноценную команду CREATE TYPE.
...
Рейтинг: 0 / 0
06.10.2020, 23:35
    #40005984
Cyrax_02
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CREATE TYPE: примеры из справки, которые не работают
" Тип-пустышку " функция возвращать не может. Значит, нужно каким-то волшебным способом создать " тип в виде оболочки ". К сожалению, ни в справке, ни в интернете нет информации о том, какую форму должна иметь эта оболочка - форму домика с крышей, форму пузырька или форму плюшки. LANGUAGE SQL наверняка скушал бы " тип в форме плюшки ", но он не принимает строки cstring . LANGUAGE PLPGSQL не сможет обеспечить сохранность " типа в форме пузырька ", т.к. принимает строки cstring . Остаётся только домик с крышей . Но построить такую сложную конструкцию на SQL ещё никому не удавалось...
...
Рейтинг: 0 / 0
07.10.2020, 11:00
    #40006052
Павел Лузанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CREATE TYPE: примеры из справки, которые не работают
Cyrax_02,

Текст ошибки "SQL-функции не могут иметь аргументы типа cstring" говорит о том, что такую функцию нельзя писать на SQL. На той же странице документации можно найти и как нужно: "a shell type will only be made this way when the input function is written in C".

Создание по-настоящему нового типа, с описанием входных/выходных функций это весьма не тривиальная задача. Такое стоит делать только на C. А в большинстве случаев достаточно уже имеющихся встроенных типов.
...
Рейтинг: 0 / 0
07.10.2020, 13:11
    #40006108
Cyrax_02
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CREATE TYPE: примеры из справки, которые не работают
Павел ЛузановТекст ошибки "SQL-функции не могут иметь аргументы типа cstring" говорит о том, что такую функцию нельзя писать на SQL.И на PGPLSQL тоже: " функции PL/pgSQL не могут возвращать тип ... ".

авторBefore PostgreSQL version 8.2, the shell-type creation syntax CREATE TYPE name did not exist...
Also, to avoid accidentally cluttering the catalogs with shell types as a result of simple typos in function definitions, a shell type will only be made this way when the input function is written in C.Значит, при выполнении " CREATE TYPE name; " создаётся всего-лишь тип-пустышка (empty type) , который нельзя использовать при определении функций с реализацией на SQL или PGPLSQL . И только при определении функций с реализацией на уровне C такой тип интерпретируется как тип в виде оболочки (shell-type) . До версии 8.2 такой тип всегда интерпретировался как " shell-type ".

Предложение " Before PostgreSQL version 8.2, the shell-type creation syntax CREATE TYPE name did not exist " в справке частично противоречит фактическому поведению, поскольку " CREATE TYPE name; " - это синтаксис "shell-type" только в определённой локальной ситуации, а в общем понимании (применительно ко всем случаям) - это синтаксис создания empty type .

авторСоздание по-настоящему нового типа, с описанием входных/выходных функций это весьма не тривиальная задача. Такое стоит делать только на C.Так в текущих версиях PostgreSQL сделать это не на C стало уже невозможно...

авторА в большинстве случаев достаточно уже имеющихся встроенных типов. Странно, что такая гибкая и функциональная СУБД (PostgreSQL) из коробки не имеет беззнаковых целочисленных типов и 4-байтового unix timestamp (всё это есть в MySQL).
...
Рейтинг: 0 / 0
07.10.2020, 13:20
    #40006119
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CREATE TYPE: примеры из справки, которые не работают
Cyrax_02
Странно, что такая гибкая и функциональная СУБД (PostgreSQL) из коробки не имеет беззнаковых целочисленных типов и 4-байтового unix timestamp (всё это есть в MySQL).


ANSI SQL стандарт не предусматривает беззнаковых целых smallint/int/bigint равно как и 4х байтового unix timestamp.
http://jakewheat.github.io/sql-overview/sql-2011-foundation-grammar.html#predefined-type


--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
07.10.2020, 13:52
    #40006144
Melkij
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CREATE TYPE: примеры из справки, которые не работают
Cyrax_02
авторА в большинстве случаев достаточно уже имеющихся встроенных типов.
Странно, что такая гибкая и функциональная СУБД (PostgreSQL) из коробки не имеет беззнаковых целочисленных типов
А вот тут как раз именно потому что гибкая.
Peter Eisentraut, core teamSupport for unsigned integer types and smaller integer types has been one of the more common outstanding feature request for PostgreSQL. Inclusion of additional integer types into the core is typically rejected with the argument that it would make the type system too complicated and fragile. The experience from writing this module suggests: That is not wrong. Another argument, either explicit or implicit, is that it is a lot of work. Again: true.
...
Рейтинг: 0 / 0
07.10.2020, 14:04
    #40006153
Cyrax_02
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CREATE TYPE: примеры из справки, которые не работают
MelkijА вот тут как раз именно потому что гибкая.Я знаю про это расширение. Поэтому, и написал "из коробки".
Любое стороннее расширение (пусть даже и за авторством одного из разработчиков PostgreSQL), может не завестись на очередном выпуске новой версии PostgreSQL. А если на базе этих типов построены другие функции и типы, то вся база капитально "ляжет".

P.S . Не понятно, сколько ещё будет упираться команда PostgreSQL от включения этих типов в базовую сборку.
Дополнительно ещё и utimestamp / utimestamptz нужно добавить. Незачем расходовать больше памяти, чем для этого требуется (речь о распухании БД и индексов от 8-байтовых полей).
...
Рейтинг: 0 / 0
07.10.2020, 14:32
    #40006173
Melkij
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CREATE TYPE: примеры из справки, которые не работают
Cyrax_02,

блин. Да прочитайте объяснение Peter'а, а не посмотрите только на ссылку.
...
Рейтинг: 0 / 0
07.10.2020, 14:52
    #40006187
Cyrax_02
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CREATE TYPE: примеры из справки, которые не работают
Melkij
блин. Да прочитайте объяснение Peter'а, а не посмотрите только на ссылку.

Читал я это объяснение:
1 ) Аргументы "против" там приводятся в отношении расширения, а не нативной реализации.
2 ) Что касается нативной реализации, то " This module solves that problem by generating most of the code automatically " - применимо как в отношении расширения, так и в отношении нативной реализации.

Таким образом, доводы против нативной реализации в этих объяснениях отсутствуют.
...
Рейтинг: 0 / 0
07.10.2020, 19:13
    #40006371
vyegorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CREATE TYPE: примеры из справки, которые не работают
Cyrax_02,

Это не просто разработчик PostgreSQL, и даже не просто commiter. Это член Core Team проекта, поэтому

> Аргументы "против" там приводятся в отношении расширения, а не нативной реализации.

Ему всё равно, кодить расширение или базу. Из его уст эти аргументы 100% ложатся на PostgreSQL в плане нативной реализации.


И это… PostgreSQL это open source. Хотите фичу (тем более что есть код уже) — пришлите патч, делов-то!
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / CREATE TYPE: примеры из справки, которые не работают / 13 сообщений из 13, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]