
Mars
19.10.2016
10:05:21

Сергей
19.10.2016
10:08:59
можно использовать триггеры на таблицах - как вариант cascade

Mars
19.10.2016
10:22:08

Sergey
19.10.2016
10:32:17
Привет! Есть вопрос про \u0000, который тут недавно обсуждали.
Почему не работает
select ('{"a": "\u0000"}'::JSONB);
- понятно.
Но не понятно другое: почему
select ('{"a": "\u0000"}'::JSON)
валидно, а
select ('{"a": "\u0000"}'::JSON)->>'a';
кидает ошибку?
Т.е. записать ключ в базу можно с \u0000, а выбрать – нельзя?

Google

Anton
19.10.2016
10:42:52

Nikki
19.10.2016
10:43:52

Andrey
19.10.2016
10:57:32
Кто-нибудь знает какой-нибудь нормальный linter для SQL?

Darafei
19.10.2016
10:58:32
нормальный - не знаю
если "лучше, чем ничего" - то в DataGrip есть

Sergey
19.10.2016
11:12:39
Подскажите, а как можно записать запрос вида:
`
AVG(CASE
WHEN CAST(metrics-»'currentAverageTemperature' AS double precision)=-16384 THEN 0
WHEN CAST(metrics-»'currentAverageTemperature' AS double precision)=-32768 THEN 0
ELSE CAST(metrics-»'currentAverageTemperature' AS double precision) END
) as avg_temper,
`
Без тройного дублирования
metrics->>'currentAverageTemperature'
?

Darafei
19.10.2016
11:17:29
возможно, вам на самом деле нужно:
select avg(nullif(nullif(metrics-»'currentAverageTemperature'::float,-16384), 32768))
case обычно пишут люди, не перестроившиеся с императивного программирования

Sergey
19.10.2016
11:21:08
@Komzpa кстати да... Тоже думал на nullif. Сейчас потестирую. Спасибо за наводку :)

Айтуар
19.10.2016
11:21:12

Anatoliy
19.10.2016
11:21:16
Case обычно пишут люди, когда несколько условий when и дефолт в виде else, никак с императивным программированием не связанным.

Darafei
19.10.2016
11:21:46
case в принципе очень редко нужен, обычно coalesce/nullif всё решает

Айтуар
19.10.2016
11:22:18

Google

Darafei
19.10.2016
11:22:45
они читабельнее

Айтуар
19.10.2016
11:23:50
Ну не знаю, для меня выше пример с case читабельней

Darafei
19.10.2016
11:24:18
он как минимум ведёт себя странно, смещая среднее в 0 при nodata-значениях
а это уже часто баг сам по себе

Айтуар
19.10.2016
11:25:21
А ну просто вместо 0 писать null в том же case.

Darafei
19.10.2016
11:33:18
ну, если тебе начхать на красоту, то да, nullif быстрее: https://gist.github.com/Komzpa/a4f659743eb309fdab74bbdde2b18ded

Sergey
19.10.2016
11:37:52
Ребят, вы крутые )

Айтуар
19.10.2016
11:39:44

Sergey
19.10.2016
11:54:32
А как можно победить value out of range: overflow при выборке из jsonb?

Darafei
19.10.2016
11:55:05
overflow?
при выборке, или при avg?
а полайкайте баг, а? :)
https://youtrack.jetbrains.com/issue/DBE-3297

Sergey
19.10.2016
11:55:40
при выборке

Darafei
19.10.2016
11:56:07
покажи пример
вообще, только вчера underflow обсуждали
overflow всё-таки падать должен :)

Sergey
19.10.2016
11:57:02
сейчас точно скажу :)
Да, ты прав.
select
avg(nullif(nullif(cast(metrics-»'currentExternalTemperature' as float),-16384), 32768)),
to_char(timestamp, 'YYYY-MM-DD HH:MM:SS' ) as t
from metrics
group by t;
—-
ERROR: value out of range: overflow
********** Ошибка **********
ERROR: value out of range: overflow
SQL-состояние: 22003
На 141 строке значение.

Darafei
19.10.2016
12:01:56
температура - цельсий?

Google

Sergey
19.10.2016
12:02:11
Да

Евгений
19.10.2016
12:12:30

Dmitry
19.10.2016
12:13:13
https://www.postgresql.org/message-id/24554.1476849661@sss.pgh.pa.us
> e.g. pg_upgrade's corruption of visibility maps
уже все в курсах?

Michael
19.10.2016
12:51:07

Dmitry
19.10.2016
12:52:03
после апгрейда могут в тихоря сломаться результаты запросов

Yury
19.10.2016
13:07:19
вот по этому я и использую pg_dump ;)

Michael
19.10.2016
13:09:32

Yury
19.10.2016
13:11:50
и прочий блоатинг
а с 9.5 на 9.6 можно логически реплецироваться?

Darafei
19.10.2016
13:41:06
Да
select
avg(temperature),
to_char(timestamp, 'YYYY-MM-DD HH:MM:SS') as t
from (select
*,
(metrics -» 'currentExternalTemperature') :: float as temperature
from metrics
) z
where temperature between -100 and 100
group by t;
когда в данные прокрадывается чернь, изгоняйте её физическими ограничениями
внезапно :)
зачем?
по IEEE 754, у него нет дефолтной обработки ошибок, в отличие от underflow

James
19.10.2016
13:56:10
ребзя подскажите а реплика с 9.4 на 9.5 будет работать?
ну типа я хочу в мастер 9.4 вогнать слейв 9.5

Евгений
19.10.2016
13:56:27
т.к. даже не всегда это можно считать ошибкой.
В данном случае можно считать "очень маленьким числом, неотличимым от 0".
Является ли это ошибкой по смыслу? В переполнением - точно ошибка. А тут?

James
19.10.2016
13:56:32
тобишь скопировать папочку

Евгений
19.10.2016
13:56:34

Google

James
19.10.2016
13:56:37
дата
шо значит слонами
я не понимать
будет пахать или нет

Darafei
19.10.2016
13:57:09

Yegor
19.10.2016
13:57:22

James
19.10.2016
13:58:35
оговорюсь что постгрес 9.4 уже в репилке
тобишь хочу добавить ещё 1 слейв

Admin
ERROR: S client not available

Евгений
19.10.2016
13:58:50
нативная репликация - нет, там нужно совпадение версий, а вот сторонними инструментами (напримерб slony) можно.
Кстати, таким же образом можно обновлять базу на ходу без выключения надолго.

Darafei
19.10.2016
13:59:01
знаете ли вы, что:
https://github.com/postgrespro/postgrespro/blob/ac92c4a9a53c88843533154d2224323509134323/src/backend/utils/adt/float.c#L1805
постгрес на avg считает ещё и сумму квадратов, а потом её выбрасывает

James
19.10.2016
13:59:23
спасибо почитаю про слони

Евгений
19.10.2016
13:59:52

Darafei
19.10.2016
14:00:09
ну да
так и оказывается - в одном месте чек в умножении просто так воткнули, на сумме всех значений добавили возведение в квадрат - ну, никто ж не заметит
а потом у людей забрать из базы и посчитать агрегат в коде быстрее получается :(

Dmitry
19.10.2016
16:10:46

Dmitrii
19.10.2016
17:06:36
Хммм... А если моя функция возвращает тип table_name то как потом обращаться в полям этой строки, если вызов функции был в сабзапросе?
Все. Нужно просто больше скобочек ?

Yury
20.10.2016
09:28:24

Google

Darafei
20.10.2016
09:28:38

Yury
20.10.2016
09:28:56
они всегда есть, другой разговор насколько они очевидны или правильные

Darafei
20.10.2016
09:29:56
я понимаю, что avg() и var_pop() в одном запросе так одной функцией считаться будут

Yury
20.10.2016
09:36:39

Darafei
20.10.2016
09:37:40
в смысле?
это finalfn от агрегата

Yury
20.10.2016
09:38:00
будет разными функциями
счас разберусь что куда

Darafei
20.10.2016
09:38:18
а transfn, который зовётся на каждую строчку, у них общий
https://github.com/postgrespro/postgrespro/blob/ac92c4a9a53c88843533154d2224323509134323/src/backend/utils/adt/float.c#L1805

Yury
20.10.2016
09:41:50
не вижу что то.
Вижу только что тип они один и тот же используют:
The transition datatype for all these aggregates is a 3-element array of float8, holding the values N, sum(X), sum(X*X) in that order.
собственно легко проверить
ааа всё понял
так пошёл за кофе, иначе тупым себя чувствую

Darafei
20.10.2016
09:46:06
https://github.com/postgrespro/postgrespro/blob/ac92c4a9a53c88843533154d2224323509134323/src/backend/utils/adt/float.c#L1875
не на хранение, а на +1 умножение и +1 overflow check

Yury
20.10.2016
09:46:41
дадад я увидел
понял... он потом в avg тупо делает sum/N
комуто стало лень писать код... я сейчас раскапываю это

Darafei
20.10.2016
09:47:35
и никак не пытается защищать от ошибок округлений

Yury
20.10.2016
09:50:41
https://github.com/postgrespro/postgrespro/commit/bec98a31c55a4f799b398d01541e68d7c086bb81#diff-7068290137a01263be83308699042f1f — вот когда и как это было введено и почти не поменялось за последние 16 лет.