172 похожих чатов

Вопрос по DEFAULT: CREATE TABLE products (

product_no integer DEFAULT nextval('products_product_no_seq'),
...
);

Почему аргумент для nextval выглядит именно так и оно работает: 'tablename_colname_?'
Что здесь означает seq?
Какие ещё есть типичные случаи для default, когда вместо скалярного значения у нас функция?

47 ответов

27 просмотров

Это то, во что postgres автоматически преобразует create table ( product_no serial )

Artemiy-Apostatov Автор вопроса
Ilya Anfimov
Это то, во что postgres автоматически преобразует ...

Нет, то что именно это в serial преобразуется - это я знаю. Мне важнее понять скорее какие-то околоподкапотные вещи. Вот что дока пишет: "Последовательность, к которой будет обращаться одна из этих функций, определяется аргументом regclass, задающим просто OID последовательности в системном каталоге pg_class". Мне важнее понять, откуда берётся products_product_no_seq - если мы его руками не объявляли и как он разрешается.

Artemiy Apostatov
Нет, то что именно это в serial преобразуется - эт...

>products_product_no_seq Создаётся при создании колонки типа serial. > и как он разрешается. Не очень понял -- в какой момент. Но в общем -- хранится оно в виде pg_node_tree в таблицэ pg_attrdef. \d+ показывает это в человеческом виде. В том числе печатает константу вида regclass как relname из pg_class. Планнер берёт NodeTree, если можэт -- несколько преобразовывает, затем выполняет. Реально внутри pg_node_tree эта константа хранится в виде восьми байт oid. Посмотреть чуть менее человеческий вид pg_node_tree можно выборкой из pg_attrdef (но это тожэ не тот бинарник, который там лежыт). То есть глубоко распарзенная структура pg_node_tree/NodeTree.

Ilya Anfimov
>products_product_no_seq Создаётся при создании к...

Я, кстати, ошыбся. pg_node_tree внутри базы -- это именно тот текст, который показывается по SELECT adbin FROM pg_attrdef; Удивлён.

Artemiy-Apostatov Автор вопроса
Ilya Anfimov
>products_product_no_seq Создаётся при создании к...

Спасибо за ответ. Прихожу к выводу, что Постгрес это Вселенная ) А есть какие-то мысли по поводу какие-то примеров изощрённых юзкейсов с DEFAULT, когда там какое-то сложное выражение или ещё что-то?

Artemiy-Apostatov Автор вопроса
Ilya Anfimov
Да так-то дофига, а вам зачем?

Партия сказала дописывать один DSL для Postgres. Вот этот: https://pgconf.ru/2021/287996

Artemiy Apostatov
Спасибо за ответ. Прихожу к выводу, что Постгрес э...

То есть нередко вычислимые колонки записывают как default, и там могут быть хоть джойны с агрегатами из других таблиц.

Artemiy-Apostatov Автор вопроса
Artemiy Apostatov
Партия сказала дописывать один DSL для Postgres. ...

Соответственно, базовая часть написана - мне надо копать вширь и вглубь, чтобы дополнить уже сделанное. Сейчас я стал разбираться с CREATE TABLE, там достаточно много опций, для некоторых из которых - у меня просто недостаточно "кругозора", чтобы представить какие-то более сложные юзкейсы.

Ilya Anfimov
То есть нередко вычислимые колонки записывают как ...

Вообще-то нет, не могут (что в generated, что в default).

Artemiy-Apostatov Автор вопроса
Yaroslav Schekin
Вообще-то нет, не могут (что в generated, что в de...

Тогда Ваша версия какая?) Т.е. в default у нас приходит либо относительно примитивное значение (составные типы и иже с ними считаем примитивами в этом контексте), либо результат каких-то вычислений, НО объявленный как функция. Так вот мой вопрос именно в этом - какие это могут быть функции. Можно просто ткнуть меня в доку, статью или ещё какой-то материал.

Artemiy Apostatov
Тогда Ваша версия какая?) Т.е. в default у нас при...

Ещё выражэния (т.е. применение операторов к каким-то константам и функцыям). Но вопрос "какие" не понят. Объявленные в pg_proc, очевидно.

Artemiy-Apostatov Автор вопроса
Ilya Anfimov
Ещё выражэния (т.е. применение операторов к каким-...

Но запросы в рамках default выполнять мы не можем?

Artemiy Apostatov
Но запросы в рамках default выполнять мы не можем?

Я -- могу. Обернуть в функцыю и выполнять. Всё работает.

Artemiy Apostatov
Но запросы в рамках default выполнять мы не можем?

Я, кстати, дажэ не помню -- почему там какие-то проблемы с запросами. Вроде так-то в NodeTree запрос можэт быть записан.

Ilya Anfimov
Я, кстати, дажэ не помню -- почему там какие-то пр...

Потому что их нельзя оптимизировать. На пакетную вставку 1000 строк будет дополнительно 1000 запросов, которые при ином подходе можно было бы собрать в один. Не надо туда впихивать запросы, это импакт производительности колоссальный.

Andrei Ilinskii
Потому что их нельзя оптимизировать. На пакетную ...

(Пожав плечами) мало ли что у нас нельзя оптимизировать. Триггеры вон те жэ -- тожэ. Ну, не то чтобы нельзя -- пока не оптимизируются. И вообще -- а если меня не беспокоит пакетная вставка тысячи строк по каким-то причинам? (Например, вставка будет происходить раз в день и по одной строке?)

Ilya Anfimov
(Пожав плечами) мало ли что у нас нельзя оптимизир...

Тогда обернуть в функцию и всё сработает. Ограничение чисто синтаксическое. Но сам подход не очень. Это как специально раскладывать грабли, чтобы в нужный момент сходу по всем пробежаться ))

Andrei Ilinskii
Тогда обернуть в функцию и всё сработает. Ограниче...

Я как-то как раз не вижу граблей. Код как код. Только почему-то запрещённый.

Ilya Anfimov
Я как-то как раз не вижу граблей. Код как код. Тол...

Верно, чтобы на грабли наступить - нужно чтобы их не было видно. Если бы грабли было сразу видно - никто бы на них не наступал 😉

Andrei Ilinskii
Тогда обернуть в функцию и всё сработает. Ограниче...

Ничего подобного! Это прямо запрещено документацией. Точнее, там написано, что если будете делать такие вещи, а потом Ваша база "сломается" — к примеру, перестанет dump-иться/загружаться из дампа (тут такое, показывали, кстати) или начнёт выдавать не те результаты запросов) — это только Ваши проблемы, не нужно потом ныть писать в -bugs по этому поводу. ;)

Ilya Anfimov
Я как-то как раз не вижу граблей. Код как код. Тол...

Потому что требование ко всем этим штукам — must be immutable. "Обманываете" сервер? Получите "сюрприз". ;)

Yaroslav Schekin
Ничего подобного! Это прямо запрещено документацие...

Где? "DEFAULT default_expr The DEFAULT clause assigns a default data value for the column whose column definition it appears within. The value is any variable-free expression (subqueries and cross-references to other columns in the current table are not allowed). The data type of the default expression must match the data type of the column. The default expression will be used in any insert operation that does not specify a value for the column. If there is no default for a column, then the default is null." Ты точно с CHECK не путаешь?

Ilya Anfimov
Где? "DEFAULT default_expr The DEFAULT clause ass...

Частично путаю (вот что значит писать "урывками"), а как же. ;) https://dbfiddle.uk/?rdbms=postgres_13&fiddle=594d837bb8b1bad74be84b1a7338b2d7

Yaroslav Schekin
Частично путаю (вот что значит писать "урывками"),...

А, про этих. Да, понял мысль и откуда взялось. Любопытно, но это другое.

Ilya Anfimov
nextval?

nextval VOLATILE конечно. Я половину вопроса прочёл )

Yaroslav Schekin
Частично путаю (вот что значит писать "урывками"),...

Кстати, разница в подходах к AS IDENTITY и вот этой просто функцыей -- показывает, что этот подход GENERATED хорошо бы ещё обдумывать и обдумывать.

Ilya Anfimov
Кстати, разница в подходах к AS IDENTITY и вот это...

Я сходу не помню, но мне кажется, что таковы требования ISO SQL (чтобы работало не только в случае STORED). Если так, то обдумывать тут нечего. ;)

Artemiy Apostatov
Тогда Ваша версия какая?) Т.е. в default у нас при...

Хмм... а какой вопрос-то, конкретно? ;) > Так вот мой вопрос именно в этом - какие это могут быть функции. Практически любое выражение там может быть, если речь именно про column default.

Yaroslav Schekin
Я сходу не помню, но мне кажется, что таковы требо...

Вот уж кто точно не стена -- подвинется! Что-то, а невыдавать ошыбки там, где ISO SQL говорит что можно выдавать -- это совсем стандартная практика.

Ilya Anfimov
Вот уж кто точно не стена -- подвинется! Что-то, а...

Не в PostgreSQL. В общем-то, фактическое отношение разработчиков к такому — "Мы тут молимся на следуем стандарту. Не нравится? Так поищите другую СУБД, никто не заставляет пользоваться." ;)

Yaroslav Schekin
Не в PostgreSQL. В общем-то, фактическое отношени...

Это Том Лейн или Брюс Момхан так говорил?

Ilya Anfimov
Это Том Лейн или Брюс Момхан так говорил?

А никто это явно именно так [грубо] не говорил — они люди вежливые, в основном. Я же пишу о фактическом отношении, понимаете? ;)

Yaroslav Schekin
А никто это явно именно так [грубо] не говорил — о...

Я такого банально не встречал. Против люди бывают -- когда появляется что-то, ломающее какую-то допустимую стандартом практику. А наоборот...

Artemiy-Apostatov Автор вопроса
Yaroslav Schekin
Хмм... а какой вопрос-то, конкретно? ;) > Так вот...

Пришли к тому, что не любые, а только ноль-арные и те, которые не выполняют запросы/подзапросы (технически - оно может заработать, но в целом это антипаттерн). Это и есть ответ на мой вопрос )

Ilya Anfimov
Я такого банально не встречал. Против люди бывают ...

Да ладно? Тогда почему, например: 1. В PostgreSQL тщательно (но криво, хе-хе) вписаны все ограничения из ISO SQL на допустимые в рекурсивных CTE конструкции, хотя в самой реализации таких тупо нет (т.е. он мощнее, чем требуется стандартом, и искусственно ограничивается). 2. На все вопросы о том, почему это у нас изменение типов полей практически невозможно, если они используются во view, всех банально посылают почитать стандарт (хотя могли бы реализовать почти наверняка!), где это запрещается? 3. Любые попытки расширения стандарта принимаются "в штыки" (я помню, как мучительно протаскивали [NOT] MATERIALIZED в CTE, например)? Ну и т.д. и т.п., сходу не вспоминается.

Artemiy Apostatov
Пришли к тому, что не любые, а только ноль-арные и...

Подождите... откуда Вы это взяли? Запросы / подзапросы в функциях DEFAULT не запрещаются, они вообще могут быть любыми. Ограничение на запросы именно в выражении default — только синтаксическое (т.е. в этом месте синтаксисом требуется именно выражение, и всё).

Yaroslav Schekin
Да ладно? Тогда почему, например: 1. В PostgreSQL ...

2. Так и правда морока ведь менять rule, этот всё дерево Node вообще практически write-once для разработчиков.

Ilya Anfimov
2. Так и правда морока ведь менять rule, этот всё ...

Но ALTER VIEW меняет почему-то. И все зависимости уже есть в системе. Т.е. ответ даётся не в стиле "это трудно реализовать", а в стиле "стандарт это запрещает, см. рис. 1". ;)

Artemiy-Apostatov Автор вопроса
Artemiy Apostatov
https://t.me/pgsql/334088 https://t.me/pgsql/33409...

Я же потом написал, что ошибся. Это относится только к CHECK и GENERATED, но не относится к DEFAULT.

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
5
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Ребят в СИ можно реализовать ООП?
Николай
33
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Карта сайта