powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / кажись, баг в postgresql json?
7 сообщений из 7, страница 1 из 1
кажись, баг в postgresql json?
    #38638113
Weed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте!

Суть такая:

Есть вьюха, в ней есть столбец данных в JSON:
Код: sql
1.
2.
3.
4.
5.
6.
7.
otc24=# select *
otc24-# from заявки.доли_года_json d
otc24-# where id_пункта = 103;
 id_пункта |                                                                      доли_года                                                                       
-----------+------------------------------------------------------------------------------------------------------------------------------------------------------
       103 | [{"доля_года":1,"value":1,"cost":10}, {"доля_года":2,"value":1,"cost":10}, {"доля_года":3,"value":2,"cost":20}, {"доля_года":4,"value":3,"cost":30}]
(1 строка)



Также есть простая вьюха (см. ниже), которая использует столбец "доли_года" из предыдущей вьюхи с помощью простого джойна:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
СREATE OR REPLACE VIEW "заявки"."пункты_list" AS 
 SELECT p."заявка",
    j."id_пункта",
    true AS editable,
    p."КЭКР",
    p."классификация_ТРУ",
    p."ТРУ",
    p."размерность_кратко",
    p.price,
    p."разбивка",
    "year_costs_пункты".year_cost,
    p."периодичность_поставки",
    j."доли_года"
   FROM "заявки"."пункты" p
   JOIN "заявки"."year_costs_пункты" USING (id)
   JOIN "заявки"."доли_года_json" j ON p.id = j."id_пункта";



Суть проблемы: для одной (как минимум) строки postgres зачем-то добавляет ещё одну закрывающую квадратную скобку в поле "доли_года":

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
otc24=# select доли_года
otc24-# from заявки.пункты_list l
otc24-# where заявка = 73;
                                                                          доли_года                                                                           
--------------------------------------------------------------------------------------------------------------------------------------------------------------
 [{"доля_года":1,"value":10,"cost":100}, {"доля_года":2,"value":11,"cost":110}, {"доля_года":3,"value":12,"cost":120}, {"доля_года":4,"value":13,"cost":130}]
 [{"доля_года":1,"value":1,"cost":10}, {"доля_года":2,"value":1,"cost":10}, {"доля_года":3,"value":2,"cost":20}, {"доля_года":4,"value":3,"cost":30}]] -- вот она, тут в конце
(2 строки)



В оригинальной вьюхе и при просмотре содержимого вьюх через SELECT * никакой лишней скобки не наблюдается, она появляется только при запросе с WHERE.

wtf?

Код: sql
1.
2.
3.
4.
5.
otc24=# select version();
                                            version                                            
-----------------------------------------------------------------------------------------------
 PostgreSQL 9.3.4 on x86_64-unknown-linux-gnu, compiled by gcc (Debian 4.8.2-16) 4.8.2, 64-bit
(1 строка)
...
Рейтинг: 0 / 0
кажись, баг в postgresql json?
    #38638121
Weed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Воспроизвести пока не получается. Похоже, что-то с какой-то стандартной аггрегатной функцией.
...
Рейтинг: 0 / 0
кажись, баг в postgresql json?
    #38638129
Weed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
код аггрегирующей поле с json вьюхи:

Код: sql
1.
2.
3.
4.
5.
6.
CREATE OR REPLACE VIEW "заявки"."доли_года_json" AS 
 SELECT b."id_пункта",
    json_agg(row_to_json(ROW(b."доля_года", b.value, b.value * p.price)::"заявки".year_piece)) AS "доли_года"
   FROM "заявки"."разбивки" b
   JOIN "заявки"."пункты" p ON b."id_пункта" = p.id
  GROUP BY b."id_пункта";
...
Рейтинг: 0 / 0
кажись, баг в postgresql json?
    #38638429
Weed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
из вьюхи с аггрегатом убрал создание строки json, оставил аггрегирование одного значения:

Код: sql
1.
2.
3.
4.
5.
6.
CREATE OR REPLACE VIEW "заявки"."доли_года_json_" AS 
 SELECT b."id_пункта",
    json_agg(p.price) AS "доли_года"
   FROM "заявки"."разбивки" b
   JOIN "заявки"."пункты" p ON b."id_пункта" = p.id
  GROUP BY b."id_пункта";



теперь строки ответа во вьюхе "заявки"."пункты_list" (см. выше) выглядят так:

"[10, 10, 10, 10]"
"[10, 10, 10, 10]]" -- всё равно лишняя скобка добавляется :(

При замене исходной вьюхи на таблицу с жёстко захардкоженными данными эффект не наблюдается.
...
Рейтинг: 0 / 0
кажись, баг в postgresql json?
    #38638478
Weed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну и ещё вывод explain:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
EXPLAIN VERBOSE select доли_года

from заявки.пункты_list l
where заявка = 73


"QUERY PLAN"
"Nested Loop  (cost=7.27..8.74 rows=1 width=32)"
"  Output: (json_agg(p_2.price))"
"  Join Filter: (p.id = b.""id_пункта"")"
"  ->  Nested Loop  (cost=3.69..4.91 rows=1 width=8)"
"        Output: p.id, p_1.id"
"        Join Filter: (p.id = p_1.id)"
"        ->  Seq Scan on ""заявки"".""пункты"" p  (cost=0.00..1.06 rows=1 width=4)"
"              Output: p.id"
"              Filter: (p.""заявка"" = 73)"
"        ->  HashAggregate  (cost=3.69..3.74 rows=5 width=40)"
"              Output: p_1.id, sum((r.value * p_1.price))"
"              ->  Hash Join  (cost=1.11..3.37 rows=43 width=40)"
"                    Output: p_1.id, p_1.price, r.value"
"                    Hash Cond: (r.""id_пункта"" = p_1.id)"
"                    ->  Seq Scan on ""заявки"".""разбивки"" r  (cost=0.00..1.60 rows=60 width=8)"
"                          Output: r.value, r.""id_пункта"""
"                    ->  Hash  (cost=1.05..1.05 rows=5 width=36)"
"                          Output: p_1.id, p_1.price"
"                          ->  Seq Scan on ""заявки"".""пункты"" p_1  (cost=0.00..1.05 rows=5 width=36)"
"                                Output: p_1.id, p_1.price"
"  ->  HashAggregate  (cost=3.58..3.67 rows=7 width=36)"
"        Output: b.""id_пункта"", json_agg(p_2.price)"
"        ->  Hash Join  (cost=1.11..3.37 rows=43 width=36)"
"              Output: b.""id_пункта"", p_2.price"
"              Hash Cond: (b.""id_пункта"" = p_2.id)"
"              ->  Seq Scan on ""заявки"".""разбивки"" b  (cost=0.00..1.60 rows=60 width=4)"
"                    Output: b.""id_пункта"""
"              ->  Hash  (cost=1.05..1.05 rows=5 width=36)"
"                    Output: p_2.price, p_2.id"
"                    ->  Seq Scan on ""заявки"".""пункты"" p_2  (cost=0.00..1.05 rows=5 width=36)"
"                          Output: p_2.price, p_2.id"
...
Рейтинг: 0 / 0
кажись, баг в postgresql json?
    #38638517
Weed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
воспроизвести в куске кода пока что не удаётся, к сожалению.

если есть желание заглянуть в живую БД - пишите на 4den.i.zzz@gmail.com
...
Рейтинг: 0 / 0
кажись, баг в postgresql json?
    #38638822
Weed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проблему решила замена агрегатов:

Код: sql
1.
2.
3.
4.
5.
-- было:
json_agg(row_to_json(ROW(b."доля_года", b.value, b.value * p.price)::"заявки".year_piece)) AS "доли_года"

-- стало:
array_to_json(array_agg(ROW(b."доля_года", b.value, b.value * p.price)::"заявки".year_piece)) AS "доли_года"



но бага осталась, как воспроизвести не знаем. дождёмся 9.4, может там оно будет пофикшено...
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / кажись, баг в postgresql json?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]