vit_r: default (vit_r)
[personal profile] vit_r
Всё больше и больше уважаю PostgreSQL. Там много весёлого, зато отсутствует игра в чистую математику. В отличие от Крутой База Данных одной Большой Фирмы.

В пятницу коллега показал очередной шедевр.

Есть условие, скажем,
WHERE
A * 100000 + B = C

Оно точно-точно выполняется с математической точки зрения, но SELECT выдаёт пустую таблицу. То есть, A,B и C - правильные, а на выходе ничего.

Что надо сделать, чтобы исправить ситуацию?


Правильно. Нужно просто добавить пустоты.
WHERE
A * 100000 + B + 0 = C

прекрасно работает и выдаёт всё, что нужно.


Какие, нафиг, монады-шмонады. Чистый дзен.

Date: 2014-12-22 12:59 pm (UTC)
From: [identity profile] cross-join.livejournal.com
Не воспроизводится на PostgreSQL 9.3
CREATE TABLE t1
(
  id integer NOT NULL,
  a integer,
  b integer,
  c integer,
  a1 double precision,
  b1 double precision,
  c1 double precision,
  CONSTRAINT pk_t1 PRIMARY KEY (id)
);
INSERT INTO t1
VALUES(1, 2, 3, 200003, 2.0, 3.0, 200003.0),
(2, 5, 5, 500005, 5.0, 5.0, 500005.0);

SELECT * FROM t1 WHERE a * 100000 + b = c;
SELECT * FROM t1 WHERE a1 * 100000 + b1 = c1;

DROP TABLE t1;

Date: 2014-12-22 01:13 pm (UTC)
From: [identity profile] vit-r.livejournal.com
Естественно, не воспроизводится. Это не PostgreSQL, а Крутая База Данных одной Большой Фирмы. И условия там похитрее.

Date: 2014-12-22 01:16 pm (UTC)
From: [identity profile] cross-join.livejournal.com
Оракляндия?
Там до сих пор нет типов "целое", "вещественное".

Date: 2014-12-22 01:51 pm (UTC)
From: [identity profile] vit-r.livejournal.com
Нет. Другая фирма. Отгадка не тривиальная, но я пока называть в любом случае не буду.

Date: 2014-12-22 01:54 pm (UTC)
From: [identity profile] cross-join.livejournal.com
Ну, все что не "биг-3" - не крутая фирма :)

Date: 2014-12-22 01:57 pm (UTC)
From: [identity profile] vit-r.livejournal.com
Пожалуйста, без наводящих вопросов.

Date: 2014-12-22 02:15 pm (UTC)
From: [identity profile] swamp-agr.livejournal.com
В Oracle не используют ФП целиком как есть.
Вместо этого там пилят C++/Java с использованием элементов ФП.
Это как ехать в трамвае и утверждать о том, что автобусы-то на самом деле плохие, никуда на них не уедешь.

Date: 2014-12-22 02:29 pm (UTC)
From: [identity profile] vit-r.livejournal.com
То, что везде вылезает слово "Оракл" показывает только зашоренность мышления.

Date: 2014-12-22 02:38 pm (UTC)
From: [identity profile] swamp-agr.livejournal.com
Ага, вот она связь.
Ну, честно говоря, PostgreSQL смотрит на неё и вбирает в себя передовые фичи Оракла.. Взять те же материализованные представления, которые впервые появились у задающих тренд..
Однако там появляются, помимо прочего, очень интересные фичи, которых у монстра нет.
Взять ту же работу с JSON против работы с избыточным транскорпоративным недолиспом под названием XML.

Upd. И потом: Oracle - в офисе, PostgreSQL - дома.
Edited Date: 2014-12-22 02:38 pm (UTC)

Date: 2014-12-22 02:45 pm (UTC)
From: [identity profile] vit-r.livejournal.com
У нас кластер, базирующийся на PostgreSQL.

Date: 2014-12-22 07:53 pm (UTC)
From: [identity profile] swamp-agr.livejournal.com
Молодцы! :-) Ещё много неизведанного таят базы, раз до них дотянулись интересные разработчики, которых следовало бы пороть.

Date: 2014-12-22 08:07 pm (UTC)
From: [identity profile] vit-r.livejournal.com
Таких шуток, как приведена выше, в кластере не замечено. А остальное - болезни роста.

Date: 2014-12-22 01:32 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
А чего шмонады? Когда подобная хня случается в джаваскрипте и подобных, всем понятно, что дело в отсутствии строгой типизации. А тут, если оно в базе, можно подумать, что-то другое вдруг?

Date: 2014-12-22 01:53 pm (UTC)
From: [identity profile] vit-r.livejournal.com
Дело, естественно, не в отсутствии строгой типизации, а в отсутствии кое чего другого кое-у кого между ушами.

Потому что при одном наборе A,B,C всё работает, а при другом - прекращает.

Date: 2014-12-22 06:21 pm (UTC)
From: [identity profile] sab123.livejournal.com
Плаваюшие числа вообще нельзя сравнивать на равенство. Вместо него надо делать плюс-минус сигма.

Date: 2014-12-22 06:28 pm (UTC)
From: [identity profile] vit-r.livejournal.com
Первым делом, на одной и той же машине равные числа должны быть равными.

Вторым, там ничего после запятой нет. Правда, если добавить в число с нулями десятичный нуль, тоже всё начинает работать.

Короче, совсем наоборот к той идее, которая приходит в голову.

Date: 2014-12-22 08:01 pm (UTC)
From: [identity profile] sab123.livejournal.com
Если печатается одинаковое десятичное представление (которое всегда делается с округлением), это не значит, что настоящие двоичные значения равны. Добавление 0, похоже, вызывает округление, которое уравнивает двоичные значения.

Разрядная сетка мантиссы-то не переполняется?

Но в-общем - неча пенять на СУБД коли нет понимания работы с плавающими числами.

Date: 2014-12-22 08:11 pm (UTC)
From: [identity profile] vit-r.livejournal.com
Если печатается одинаковое десятичное представление (которое всегда делается с округлением), это не значит, что настоящие двоичные значения равны.

Ну что за люди. Почему предполагается, что я в чём-то не разбираюсь? Если сказано баг, значит все возможные варианты проверили.

Разрядная сетка мантиссы-то не переполняется?

Она не может переполняться. Тем более, там всё целочисленное. Но даже для вещественного не могла бы при таких значениях.

Date: 2014-12-22 01:56 pm (UTC)
From: [identity profile] cross-join.livejournal.com
Таки в СУБД строгая типизация.

Date: 2014-12-22 01:58 pm (UTC)
From: [identity profile] vit-r.livejournal.com
Угу. Если int в varchar не засовывать.

Date: 2014-12-22 02:01 pm (UTC)
From: [identity profile] cross-join.livejournal.com
Если что угодно в void* не засовывать.

Date: 2014-12-22 02:03 pm (UTC)
From: [identity profile] vit-r.livejournal.com
Ну да. Явное преобразование типов исправляет любые попытки типизации.

Date: 2014-12-22 02:05 pm (UTC)
From: [identity profile] cross-join.livejournal.com
Тем не менее, деление сред на сильно и слаботипизированные позволяет отнести СУБД к первым, а не ко вторым.

Date: 2014-12-22 02:58 pm (UTC)
From: [identity profile] -oxpa-.livejournal.com
mssql? db2? firebird?
Но вообще, конечно, прекрасно.

Date: 2014-12-22 03:29 pm (UTC)
From: [identity profile] vit-r.livejournal.com
Не-а. Но, если даже кто-то назовёт, я подтверждать не буду.

Это большая серьёзная база данных. На ней Big Data бегает.

Date: 2014-12-22 03:31 pm (UTC)
From: [identity profile] -oxpa-.livejournal.com
ну теперь-то я точно знаю: http://www.mysql.com/why-mysql/bigdata/ ;)

Date: 2014-12-22 03:33 pm (UTC)
From: [identity profile] vit-r.livejournal.com
Нет, это не MySQL. Я ещё не видел камикадзе, ставящих на MySQL серьёзные финансовые задачи.

Date: 2014-12-22 03:34 pm (UTC)
From: [identity profile] -oxpa-.livejournal.com
ладно, хорошо, буду считать шутку про bigdata на mysql слишком тонкой...

Date: 2014-12-22 03:36 pm (UTC)
From: [identity profile] vit-r.livejournal.com
Я просто про то, что было бы это в MySQL, было бы не интересно.

Date: 2014-12-22 05:02 pm (UTC)
From: [identity profile] bofhland.livejournal.com
Teradata, небось!

Date: 2014-12-22 03:11 pm (UTC)
From: [identity profile] esc.livejournal.com
Я попытался представить, как оно может быть. Если поле B, допустим, строковое, и база вместо сложения начинает делать конкатенацию. Но в таком случае это не математика виновата, а плохое проектирование базы. Да и писатель запроса должен по-хорошему знать, откуда он тягает и включить явное преобразование типа вместо волшебного нуля. И всё равно не объясняет, почему дополнительный ноль помогает.

Что ещё может быть? Вылезание за границы типа. Слева int, справа bigint. Опять же теоретизирую. И снова неясно, почему помогает ноль. И снова разработчику желательно знать типы своих данных.

Короче, я как СУБД-шник заинтригован предельно.

Date: 2014-12-22 03:27 pm (UTC)
From: [identity profile] vit-r.livejournal.com
Что ещё может быть?

Баг, естественно. При одних значениях A, B и C всё нормально, при специфических - фиг.

А ноль - это такое заклинание, которое практически всегда помогает.

Date: 2014-12-22 03:40 pm (UTC)
From: [identity profile] esc.livejournal.com
Баг в математике? Настоящий? У солидной известной фирмы? На который до сих пор не напоролись тысячи разъяренных пользователей? Что-то с трудом верится.

Date: 2014-12-22 03:52 pm (UTC)
From: [identity profile] vit-r.livejournal.com
Сказал же, условия специфические. Но не такие интересные как с 0/null (http://vit-r.livejournal.com/776364.html)

Date: 2014-12-22 04:11 pm (UTC)
From: [identity profile] esc.livejournal.com
Ну! Я ж говорил, что числа в строках. :) С таким подходом немудрено наловить полный карман блох.

Видимо речь не о СУБД как таковой, а о неком продукте, который ставится надстройкой на настоящую СУБД. Типа как SAP. (Не о них ли речь, кстати?) Поэтому всё что можно и нельзя хранится в строчках. Вот например мы из SAP ECC сосём данные. У них все ID - числа, хранимые в строках varchar(10). Поэтому их добивают слева нулями для правильной сортировки. Но отображают на экране без нулей. Мы долго втыкали, что это и зачем оно так.

Судя по операции в примере, речь в нём тоже идёт о каком-то составном айдишнике. Зачем ещё может быть нужна такая специфическая математика. :)

Date: 2014-12-22 04:30 pm (UTC)
From: [identity profile] vit-r.livejournal.com
Я ж говорил, что числа в строках

Это в тот раз. В этот раз типы для чисел нормальные.

Видимо речь не о СУБД как таковой,

Отнюдь. А надстройка - это как раз то, что мигрирует. К SAP интерфейс, кстати, тоже есть. Со всеми радостями, оттуда приходящими.

Date: 2014-12-23 05:34 am (UTC)
From: [identity profile] norguhtar.livejournal.com
Кстати говоря в PostgreSQL некоторое время не было строгой типизации и он пытался угадывать как преобразовать типы. До 8 версии если мне память не изменяет. Далее сказали хватит разврата и заставили всех указывать явное преобразование типов.

Date: 2014-12-23 09:10 am (UTC)
From: [identity profile] vit-r.livejournal.com
Так я уважаю актуальную версию (-_^)

Date: 2014-12-24 01:41 pm (UTC)
From: [identity profile] anonim-legion.livejournal.com
Извиняюсь, а про COALESCE вы уже знаете, да?

Date: 2014-12-24 01:49 pm (UTC)
From: [identity profile] anonim-legion.livejournal.com
И, вы могли бы сделать нечто вроде

select a, b,c , ( A * 100000 + B + 0) as test

?

Чтобы было ясно, о чем речь.

Date: 2014-12-24 02:33 pm (UTC)
From: [identity profile] vit-r.livejournal.com
Всё, что надо, уже сделано. Но это информация не публичная.

Date: 2014-12-24 02:16 pm (UTC)
From: [identity profile] vit-r.livejournal.com
По-моему, даже с "извиняюсь" это хамство.

Если бы там было неравенство всегда, можно было бы о чём-то говорить. Но феномен возникает только при специфичных значениях для A, B и С.
(deleted comment)

Date: 2014-12-24 08:32 pm (UTC)
From: [identity profile] vit-r.livejournal.com
Вы общаетесь с профессионалами. Там баг на определённых значениях.
Edited Date: 2014-12-24 08:32 pm (UTC)

Date: 2014-12-24 08:39 pm (UTC)
From: [identity profile] bganiev.livejournal.com
хамство тут только с вашей стороны!
вы удаляете неугодные вам камменты!

Date: 2014-12-24 09:03 pm (UTC)
From: [identity profile] vit-r.livejournal.com
Конечно. Я не собираюсь выслушивать всякую ерунду о своих умственных способностях. Чтобы объяснять, какой я дурак, у меня жена есть.

Date: 2014-12-24 09:23 pm (UTC)
From: [identity profile] bganiev.livejournal.com
еще раз.
=, *=, =*
что скажете?

Date: 2014-12-24 09:42 pm (UTC)
From: [identity profile] vit-r.livejournal.com
Зачем мне что-то говорить?

Я знаю о чём я пишу, знаю в чём ошибка. То, что информация не полная, так остальное ДСП.

А кто хочет викторин, может устраивать в другом месте.
(deleted comment)

Date: 2014-12-24 10:08 pm (UTC)
From: [identity profile] vit-r.livejournal.com
Бан.

И, если такое добро сюда полезло, пора закрывать лавочку.

Profile

vit_r: default (Default)
vit_r

January 2026

S M T W T F S
    12 3
456 78910
11121314151617
18192021222324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 7th, 2026 11:35 am
Powered by Dreamwidth Studios