@pgsql

Страница 125 из 1062
Darafei
17.10.2016
14:41:19
с рекордом работать могут только c-функции

Dmitrii
17.10.2016
14:41:33
Так мне в функцию и надо его потом запихать

Функция то у меня будет

А, С-функции

Google
Dmitrii
17.10.2016
14:41:52
Понял

Darafei
17.10.2016
14:42:03
скастуй свой row в jsonb и работай с ним

Alex
17.10.2016
14:42:16
костыль на костыле

Dmitrii
17.10.2016
14:42:33
костыль на костыле
Так будто есть другие варианты?)

Alex
17.10.2016
14:42:54
не зная предметной области сложно судить

Dmitrii
17.10.2016
14:47:33
Вся эта хрень нужна, чтобы из одной огромной базы можно было "вырезать" кусок данных с другой схемой и магическим образом получить консистентную базу для другого проекта на момент времени t.

Проблема в том, что сама база основного проекта не выглядит как база для домашнего веб-сайта из 3х таблиц :)

Alex
17.10.2016
14:49:23
а если взять какой нить londiste3 и написать скриптов по обработке данных ? и непрерывно вытягивать ?

Dmitrii
17.10.2016
14:50:43
Так дело в том, что непрерывно не требуется.

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

Типа убиваешь просто базу там, и льешь вот этим инструментом новую

Как бы получается, что база кастомера это такой ооогоомный кэш, который живет своей жизнью и является базой pg.

В общем, обычным CAST 'ом нельзя превратить ROW в JSON. Для этого понадобится функция row_to_json()

Google
Dmitrii
17.10.2016
15:00:34
Спасибо за идею с JSON ?

CREATE OR REPLACE FUNCTION inheritance_get(bar __foo.bar) RETURNS text AS $$ BEGIN RETURN bar.name; END; $$ LANGUAGE plpgsql; SELECT inheritance_get(c) FROM __foo.bar c;

Внезапно. Так работает.

Alexander "PekopT"
18.10.2016
09:45:09
Всем здравствуйте =)

у меня тут тупая наверное проблемка... есть запись c text=Чердак и name=Чердак SELECT * FROM projects_project p where p."text" ILIKE '%чердак%' OR p."name" ILIKE '%чердак%' ; 0 found в чем дело?

Konstantin
18.10.2016
09:49:05
SELECT * FROM public.journals WHERE CAST(created_on as TEXT) like '2015-12-18 09:17%'; сравни

Darafei
18.10.2016
09:51:13
CAST(created_on as TEXT) like '2015-12-18 09:17%'; *facepalm*

Alexander "PekopT"
18.10.2016
09:52:22
Sergey
18.10.2016
09:56:47
Это encoding, это не locale

Konstantin
18.10.2016
09:57:38
CAST(created_on as TEXT) like '2015-12-18 09:17%'; *facepalm*
Зато работает. Можешь хоть до красноты себя ладошкой по лицу бить.

Andrey
18.10.2016
09:59:58
CAST(created_on as TEXT) like '2015-12-18 09:17%'; Жесть ))

Pavel
18.10.2016
10:05:17
Насколько я понимаю, говорят жесть потому что это можно оптимизировать - можно экстрактить дату за исключением секунд и уже ее сравнивать. А можно еще наложить функциональный индекси и тогда это будет работать очень быстро.

Sergey
18.10.2016
10:05:32
Пример с явным указанием locale

Konstantin
18.10.2016
10:08:11
Да это ручной запрос - я его раз в пол года запускаю, чтобы по временной метки найти информацию. На скорость плювать)

В общем записал первое, что сработало как надо

Anton
18.10.2016
10:13:37
вопрос про локаль это к этому http://blog.cleverelephant.ca/2016/08/pgsql-text-pattern-ops.html ?

Konstantin
18.10.2016
10:14:06
Нет там столько)

Айтуар
18.10.2016
10:15:56
Google
Andrey
18.10.2016
10:40:55
Жесть, потому что CASE для даты зависит от локали, а date_trunc() нет.

Anton
18.10.2016
11:00:03
Коллеги, подскажите, а можно ли search_path настроить так, чтобы все схемы просматривались ?

чтобы при добавлении новой не надо было менять настройку

Alex
18.10.2016
11:24:24
динамически сгенерить выражение для set search_path на основе списка всех схем %)

Darafei
18.10.2016
12:01:59
господа, вопрос

Pavel
18.10.2016
12:02:22
Коллеги, подскажите, а можно ли search_path настроить так, чтобы все схемы просматривались ?
можно альтерить search_path на уровне роли или сервера, и тогда настройку надо будет менять реже

Darafei
18.10.2016
12:02:27
как перемножить в постгресе два числа и не упасть?

select 1e-190::float * 1e-190::float;

Darafei
18.10.2016
12:03:23
со стула? :)
открой консоль и попробуй сделать вышенаписанное :)

Евгений
18.10.2016
12:03:40
лучше на бою от пользователя postgres? :)

Pavel
18.10.2016
12:04:02
=> select 1e-190::float * 1e-190::float; ОШИБКА: значение вне диапазона: антипереполнение

Pavel
18.10.2016
12:04:11
антипереполнение!

Евгений
18.10.2016
12:04:39
недополнение? :)

Darafei
18.10.2016
12:05:20
всё так

но надо, чтобы работало :(

Евгений
18.10.2016
12:07:58
у меня вот так: # select 1e-190::float * 1e-190::float; ERROR: value out of range: underflow

все работает :)

Аггей
18.10.2016
12:08:15
Интересно, где на практике встречаются такие цифры?

Darafei
18.10.2016
12:08:33
ST_Distance от двух производных друг от друга геометрий

Google
Евгений
18.10.2016
12:10:00
а точно нужен такой диапазон? может его можно "сдвинуть"? что-то прибавить или умножить?

Darafei
18.10.2016
12:10:16
меня устроит 0 в результате

просто никто, кроме постгреса, не выделывается с underflow

вот @slysha предлагает мне писать функцию на pl/python, чтобы у меня умножение работало

Alex
18.10.2016
12:15:36
или округлять до нуля те значения которые меньше чем sqrt(1e-308)

Евгений
18.10.2016
12:15:45
ну или свой постгрес собирать :) /* 51 : : * check to see if a float4/8 val has underflowed or overflowed 52 : : */ 53 : : #define CHECKFLOATVAL(val, inf_is_valid, zero_is_valid) \ 54 : : do { \ 55 : : if (isinf(val) && !(inf_is_valid)) \ 56 : : ereport(ERROR, \ 57 : : (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), \ 58 : : errmsg("value out of range: overflow"))); \ 59 : : \ 60 : : if ((val) == 0.0 && !(zero_is_valid)) \ 61 : : ereport(ERROR, \ 62 : : (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), \ 63 : : errmsg("value out of range: underflow"))); \ 64 : : } while(0) 65 : :

Admin
ERROR: S client not available

Евгений
18.10.2016
12:16:11
http://pgci.eisentraut.org/jenkins/job/postgresql_master_coverage/Coverage/src/backend/utils/adt/float.c.gcov.html

Darafei
18.10.2016
12:17:10
а это вариант

Евгений
18.10.2016
12:21:08
либо юзать numeric

# select 1e-190::numeric(100, 100) ^ 2; ?column? -------------------------------------------------------------------------------------------------------- 0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 (1 строка)

Darafei
18.10.2016
12:23:12
numeric дальше падает по update, это ж ещё в колонку положить [local] gis@gis=# select (1e-190::numeric * 1e-190::numeric)::float; ERROR: 22003: "0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001" is out of range for type double precision LOCATION: float8in_internal, float.c:538 Time: 0,251 ms

Alex
18.10.2016
12:23:19
test=> create table test(val float); CREATE TABLE test=> insert into test values(1e-190),(1e-100); INSERT 0 2 test=> select case when val<sqrt(1e-308) then 0 else val*val end from test; case —------ 0 1e-200

Darafei
18.10.2016
12:23:55
test=> create table test(val float); CREATE TABLE test=> insert into test values(1e-190),(1e-100); INSERT 0 2 test=> select case when val<sqrt(1e-308) then 0 else val*val end from test; case —------ 0 1e-200
я умею писать костыли для тьюринг-полных систем. хочется добра и человечности же!

Alex
18.10.2016
12:24:25
хочется

но когда не можется надо брать в руки костыли и идти вперед %)

Евгений
18.10.2016
12:25:20
а если раньше округлить все, что меньше 1e-189?

Darafei
18.10.2016
12:25:49
а если раньше округлить все, что меньше 1e-189?
а если по факту там три экрана SQL, мне в каждом умножении об этом думать? :)

мой любимый IEEE 754 говорит, что падать на underflow без особых просьб не стоит (пп. 7.5, 7.1) http://ieeexplore.ieee.org.sci-hub.cc/document/4610935/

Евгений
18.10.2016
12:34:23
Да.там в сорцах это явно запрашивается

Google
Евгений
18.10.2016
12:34:42
#ifdef UNSAFE_FLOATS return; #else if (fabs(val) > FLOAT4_MAX) ereport(ERROR, (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), errmsg("type \"real\" value out of range: overflow"))); if (val != 0.0 && fabs(val) < FLOAT4_MIN) ereport(ERROR, (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), errmsg("type \"real\" value out of range: underflow"))); return; #endif /* UNSAFE_FLOATS */

Alex
18.10.2016
12:36:02
можно еще так

select round(val::numeric*val::numeric,308)::float from test;

Евгений
18.10.2016
12:37:00
тут один фиг надо 3 страницы SQL-я лопатить, хоть в хранимку, хоть в проверку значений, хоть округление....

норм решение - найти галочку, которая отключает такое поведение - чтобы zero_is_valid было true

Alex
18.10.2016
12:38:13
кстати

test=> select sqrt(1e-323)::float*sqrt(1e-323)::float; ?column? —--------------------- 9.88131291682493e-324 (1 row)

какбэ норм по стандарту

эксепции нет

и уж когда совсем разрядов не хватает то

test=> select sqrt(1e-324)::float*sqrt(1e-324)::float; ERROR: value out of range: underflow

а минимальная экспонента -308

15 разрядов точности как раз вот они

tufedtm
18.10.2016
13:01:00
есть вопрос есть у меня селект, который грузит одно ядро на 95-100% и дает результат через секунд 45-50 а если 4 селекта параллельно запустить, то все 4 ядра на 95-100% и результат за 150-160 секунд postgre еще файл темповый создает на каждый запрос так вот если мне нужно работать в 50 потоков (т.е. 50 селектов одновременно), то мне нужно 51+ ядер выходит (по ядру на запрос)? или можно как-то иначе?

tufedtm
18.10.2016
13:06:35
там большой селект на 50кк записей в среднем (может и 100кк будет) замеры времени делались на локальной машине (i5-6400) наисправлял, раньше результат куда дольше получал если опустить момент с исправление селекта (типа уже некуда), то как поступить? я правильно мыслю по поводу ядер?

Айтуар
18.10.2016
13:08:12
у тебя в диск может упереться, особенно если временные файлы есть

tufedtm
18.10.2016
13:09:16
и то верно тогда нужно много озу

Страница 125 из 1062