Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Firebird, InterBase Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3 4   вперед  Ctrl      все
 Re: Сто тысяч "Почему так реализовано?"  [new]
rdb_dev
Member

Откуда: с болот
Сообщений: 3059
Симонов Денис
а как раз ограничения от доменов в PSQL часто мешают. Особенно какой-нибудь NOT NULL
Никогда не ставлю доменам NOT NULL. Вот уж действительно - бесполезная глупость.
23 сен 19, 15:12    [21976975]     Ответить | Цитировать Сообщить модератору
 Re: Сто тысяч "Почему так реализовано?"  [new]
pastor
Member

Откуда: Калуга
Сообщений: 1049
Симонов Денис
rdb_dev,

и кстати домен это не тип данных!!! Это просто тиражируемое ограничение на столбец, чтобы многократно можно было использовать в нескольких таблицах. По доброте душевной их дали использовать в PSQL, хотя самое правильное делать TYPE OF DOMAIN или TYPE OF COLUMN, а как раз ограничения от доменов в PSQL часто мешают. Особенно какой-нибудь NOT NULL

kdv
p.s. нунах...


+100500


сейчас и пишем TYPE OF DOM$BOOLEAN

ограничение для микросправочника TYPE OF CHECK(value in (0,1)) не помешало бы.

с другой стороны, тип данных переменной определяется на этапе компиляции процедуры, а вот условия - на момент выполнения. да еще на каждый чих.
23 сен 19, 15:17    [21976983]     Ответить | Цитировать Сообщить модератору
 Re: Сто тысяч "Почему так реализовано?"  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 10095
pastor
с другой стороны, тип данных переменной определяется на этапе компиляции процедуры, а вот условия - на момент выполнения. да еще на каждый чих.


вот именно. Потом какой-нибудь одарённый разработчик воткнёт в CHECK запрос и начнёт спрашивать, а почему всё так тормозит.
23 сен 19, 15:25    [21976993]     Ответить | Цитировать Сообщить модератору
 Re: Сто тысяч "Почему так реализовано?"  [new]
rdb_dev
Member

Откуда: с болот
Сообщений: 3059
Симонов Денис, так ведь втыкают и тормозит, если рукожопы... Разве нет?
23 сен 19, 15:28    [21976998]     Ответить | Цитировать Сообщить модератору
 Re: Сто тысяч "Почему так реализовано?"  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 30600

не сорите идеями.
заинтересуйте материально.

Posted via ActualForum NNTP Server 1.5

23 сен 19, 15:32    [21977003]     Ответить | Цитировать Сообщить модератору
 Re: Сто тысяч "Почему так реализовано?"  [new]
rdb_dev
Member

Откуда: с болот
Сообщений: 3059
pastor, до появления BOOLEAN примерно так и делал:
CREATE DOMAIN BOOL AS CHAR(1) CHARACTER SET ASCII
  DEFAULT 'N' CHECK (VALUE = 'N' OR VALUE = 'Y');

CREATE TABLE "my_table"
(
    "id"      ID NOT NULL,
    "flag_1"  BOOL NOT NULL,
    "flag_2"  BOOL NOT NULL,
  CONSTRAINT "my_table__pk" PRIMARY KEY ("id")
);
23 сен 19, 15:34    [21977006]     Ответить | Цитировать Сообщить модератору
 Re: Сто тысяч "Почему так реализовано?"  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 48625

rdb_dev
а как CHECK выглядит для домена, который, к примеру, используется только в DECLARE VARIABLE?

Никак. Он тупо игнорируется как в MySQL.

Posted via ActualForum NNTP Server 1.5

23 сен 19, 15:57    [21977037]     Ответить | Цитировать Сообщить модератору
 Re: Сто тысяч "Почему так реализовано?"  [new]
pastor
Member

Откуда: Калуга
Сообщений: 1049
rdb_dev
pastor, до появления BOOLEAN примерно так и делал:
CREATE DOMAIN BOOL AS CHAR(1) CHARACTER SET ASCII
  DEFAULT 'N' CHECK (VALUE = 'N' OR VALUE = 'Y');

CREATE TABLE "my_table"
(
    "id"      ID NOT NULL,
    "flag_1"  BOOL NOT NULL,
    "flag_2"  BOOL NOT NULL,
  CONSTRAINT "my_table__pk" PRIMARY KEY ("id")
);


домен DMN_BOOLEAN начали использовать еще до появления дурацких кавычек. живем как-то.
только хватило ума не делать его строковым.
и не смешивать DEFAULT с NULLABLE.

там где он может быть NULL, там будет другой домен, без додуманного бабским ИИ значением по умолчанию.

и не писать для каждого столбца not null. память слаба, да и пальцы нефиг бить.
23 сен 19, 15:59    [21977042]     Ответить | Цитировать Сообщить модератору
 Re: Сто тысяч "Почему так реализовано?"  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 10095
Dimitry Sibiryakov,

у них уже домены появились? Насколько я понимаю они и CHECK то совсем недавно прикрутили
23 сен 19, 16:03    [21977049]     Ответить | Цитировать Сообщить модератору
 Re: Сто тысяч "Почему так реализовано?"  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 48625

Симонов Денис
Насколько я понимаю они и CHECK то совсем недавно прикрутили

Насколько я в курсе - таки не прикрутили. Синтаксис есть, а не работает.

Posted via ActualForum NNTP Server 1.5

23 сен 19, 16:06    [21977052]     Ответить | Цитировать Сообщить модератору
 Re: Сто тысяч "Почему так реализовано?"  [new]
rdb_dev
Member

Откуда: с болот
Сообщений: 3059
Dimitry Sibiryakov, нет, он не игнорируется, а работает как должен.

CREATE DOMAIN UINT8 AS SMALLINT CHECK(VALUE BETWEEN 0 AND 255);

SET TERM ^;
CREATE FUNCTION test
  (
    par SMALLINT DEFAULT NULL
  )
  RETURNS BOOLEAN
AS
  DECLARE VARIABLE tmp UINT8;
BEGIN
  IF (:par IS NULL) THEN RETURN NULL;
  tmp = par;
  RETURN TRUE;
END^
SET TERM ;^

SELECT test(256) FROM oneRow;
Результат:
The insert failed because a column definition includes validation constraints.
validation error for variable TMP, value "256".
At function 'TEST', line: 9, col: 3.
23 сен 19, 16:06    [21977053]     Ответить | Цитировать Сообщить модератору
 Re: Сто тысяч "Почему так реализовано?"  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 10095
rdb_dev,

ну и используй себе домены. Зачем тебе CHECK по месту определять?
23 сен 19, 16:21    [21977066]     Ответить | Цитировать Сообщить модератору
 Re: Сто тысяч "Почему так реализовано?"  [new]
rdb_dev
Member

Откуда: с болот
Сообщений: 3059
Симонов Денис, есть ещё один очень интересный момент:
CREATE DOMAIN UINT8 AS SMALLINT CHECK(VALUE BETWEEN 0 AND 255);

CREATE TABLE test
(
    "id"      ID NOT NULL,

    /* следующее объявление работает */
    "field_1" COMPUTED BY (Cast(Bin_AND(Bin_SHR("id", 24), 0x0ff) AS UINT8)),

    /* следующее объявление НЕ работает */
--  "field_2" SMALLINT COMPUTED BY (Bin_AND(Bin_SHR("id", 24), 0x0ff))
--    CHECK("field_2" BETWEEN 0 AND 255),

    /* следующее объявление тоже НЕ работает */
--  "field_3" UINT8 COMPUTED BY (Bin_AND(Bin_SHR("id", 24), 0x0ff)),

    /* следующее объявление работает */
    "field_4" SMALLINT COMPUTED BY (Bin_AND(Bin_SHR("id", 24), 0x0ff))
  CONSTRAINT test__chk CHECK("field_4" BETWEEN 0 AND 255)
);
23 сен 19, 16:42    [21977079]     Ответить | Цитировать Сообщить модератору
 Re: Сто тысяч "Почему так реализовано?"  [new]
rdb_dev
Member

Откуда: с болот
Сообщений: 3059
Симонов Денис
rdb_dev, ну и используй себе домены. Зачем тебе CHECK по месту определять?
В переводе это означает - "определяй домен на каждый чих" или "определяй свой EXCEPTION для каждого чиха и собирай для этого EXCEPTION описательное сообщение". Супер!
23 сен 19, 16:47    [21977083]     Ответить | Цитировать Сообщить модератору
 Re: Сто тысяч "Почему так реализовано?"  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 10095
rdb_dev,

потому что ты пытаешься сделать фигню.
Вот объясни зачем тебе на вычисляемое поле нужен CHECK? Геморроя заработать?
23 сен 19, 16:47    [21977084]     Ответить | Цитировать Сообщить модератору
 Re: Сто тысяч "Почему так реализовано?"  [new]
rdb_dev
Member

Откуда: с болот
Сообщений: 3059
Симонов Денис
rdb_dev, потому что ты пытаешься сделать фигню.
Вот объясни зачем тебе на вычисляемое поле нужен CHECK? Геморроя заработать?
Это был пример не столько про сам CHECK, сколько про реализованный синтаксис. У тебя не возник когнитивный диссонанс при просмотре примера и сравнения работающих и неработающих объявлений?
23 сен 19, 16:50    [21977088]     Ответить | Цитировать Сообщить модератору
 Re: Сто тысяч "Почему так реализовано?"  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 10095
rdb_dev,

какая разница где ты проверку сделаешь в DECLARE или в IF? Экономия на спичках?
И да своё сообщение лучше. Был даже тикет чтобы к чекам определённое пользователем сообщение делать, но не сделали.
23 сен 19, 16:52    [21977090]     Ответить | Цитировать Сообщить модератору
 Re: Сто тысяч "Почему так реализовано?"  [new]
Ivan_Pisarevsky
Member

Откуда: НН
Сообщений: 8400
rdb_dev
В переводе это означает - "определяй домен на каждый чих"
Сервер и так это делает на каждый чих, достаточно посмотреть список доменов включая системные. Ну будет там чуть больше пользовательских и чуть меньше системных, в результате серверу пофиг.
23 сен 19, 16:57    [21977099]     Ответить | Цитировать Сообщить модератору
 Re: Сто тысяч "Почему так реализовано?"  [new]
rdb_dev
Member

Откуда: с болот
Сообщений: 3059
Симонов Денис
rdb_dev,

какая разница где ты проверку сделаешь в DECLARE или в IF? Экономия на спичках?
И да своё сообщение лучше. Был даже тикет чтобы к чекам определённое пользователем сообщение делать, но не сделали.
Меня вполне устраивает стандартное сообщение об ошибке вида:
The insert failed because a column definition includes validation constraints.
validation error for variable TMP, value "256".
At function 'TEST', line: 9, col: 3.
И в данном случае, велосипед с EXCEPTION я изобретать не хочу.
23 сен 19, 19:34    [21977232]     Ответить | Цитировать Сообщить модератору
 Re: Сто тысяч "Почему так реализовано?"  [new]
rdb_dev
Member

Откуда: с болот
Сообщений: 3059
Ivan_Pisarevsky, понятно! Как обычно, предлагается топтать батоны для описания доменов на каждый чих, пока не з...
23 сен 19, 19:35    [21977233]     Ответить | Цитировать Сообщить модератору
 Re: Сто тысяч "Почему так реализовано?"  [new]
rdb_dev
Member

Откуда: с болот
Сообщений: 3059
Симонов Денис
И да своё сообщение лучше. Был даже тикет чтобы к чекам определённое пользователем сообщение делать, но не сделали.
Вы же сами много раз убеждали, что прежде, чем писать тикет в трэкер, лучше, для начала, обсудить здесь. У вас семь пятниц на неделе!
23 сен 19, 19:36    [21977234]     Ответить | Цитировать Сообщить модератору
 Re: Сто тысяч "Почему так реализовано?"  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 10095
rdb_dev,

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

И да моё мнение предлагаемая фича (DECLARE ... CHECK), может и не навредит, но никому на фиг не упала.
Что-то не увидел здесь никого кто бы тебя поддержал.
23 сен 19, 19:51    [21977251]     Ответить | Цитировать Сообщить модератору
 Re: Сто тысяч "Почему так реализовано?"  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 28296
rdb_dev,

МЛЯ (не знаю, как еще привлечь внимание, кроме как большими буквами).

Вот вы чего хотите получить этим check для declare variable?
Например, если в переменную засовывать входной параметр процедуры, то есть шанс, что во входной параметр
засунется что-то неприличное для variable?
Или, у столбца, куда будет пихаться variable нет такого ограничения?

Я пытаюсь понять, откуда ноги у этого бреда растут. Я еще раз повторю, что у переменных компилируемых ЯП, да и интерпретируемых тоже, нет никаких check constraints. Check constraints - для столбцов таблиц. Здесь аналогия - экземпляр класса с методами, ограничивающими значения переменных класса методами set/get. Check в данном случае как "метод класса", то есть триггер на таблице.

Какой такой великий смысл должен иметь check у variable процедуры или триггера? Проверка на недопустимость передаваемых в процедуру значений? Проверка на недопустимость читаемых из таблицы значений? Проверка на недопустимость записываемых в таблицу значений?

Откуда вообще вот эти программерские закидоны?

p.s. да, я минималист и ортодокс.
23 сен 19, 21:42    [21977309]     Ответить | Цитировать Сообщить модератору
 Re: Сто тысяч "Почему так реализовано?"  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 10095
kdv,

он их ещё и к вычисляемым столбцам прикрутить пытается. Сего замысла я понять не могу
23 сен 19, 22:04    [21977328]     Ответить | Цитировать Сообщить модератору
 Re: Сто тысяч "Почему так реализовано?"  [new]
Старый плюшевый мишка
Member

Откуда:
Сообщений: 647
kdv
Вот вы чего хотите получить этим check для declare variable?


Я так думаю - он боится забыть переменную инициализировать. И хочет чтобы при первом же использовании в выражениях оно матюкнулось мнэээ... выразилось.
23 сен 19, 22:41    [21977365]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3 4   вперед  Ctrl      все
Все форумы / Firebird, InterBase Ответить