Главная » Хабрахабр » Что нового в PostgreSQL 11: улучшения в кастинге

Что нового в PostgreSQL 11: улучшения в кастинге

Изменение это касается кастинга одних типов в другие. Продолжая тему новый возможностей грядущего релиза PostgreSQL 11 (предыдущие посты: раз, два, три), я хотел бы рассказать об одном небольшом, но важном изменении. И, конечно же, оно касается JSONB, потому что в PostgresPro мы его очень любим!

Речь идет о патче c0cbe00f:

commit c0cbe00fee6d0a5e0ec72c6d68a035e674edc4cc
Author: Teodor Sigaev <teodor@sigaev.ru>
Date: Thu Mar 29 16:33:56 2018 +0300

Add casts from jsonb

It would be
better to have cast from scalar jsonb to text too but there is already a cast
from jsonb to text as just text representation of json. Add explicit cast from scalar jsonb to all numeric and bool types. There is no way to have
two different casts for the same type's pair.

Bump catalog version

Author: Anastasia Lubennikova with editorization by Nikita Glukhov and me
Review by: Aleksander Alekseev, Nikita Glukhov, Darafei Praliaskouski
Discussion: https://www.postgresql.org/message-id/flat/0154d35a-24ae-f063-5273-9ffcdf1c7f2e@postgrespro.ru

Если вы возьмете PostgreSQL 10, то обнаружите следующее поведение: Суть проблемы заключается вот в чем.

=# select 'true' :: jsonb :: bool;
ERROR: cannot cast type jsonb to boolean
LINE 1: select 'true' :: jsonb :: bool;

=# select '12345' :: jsonb :: int4;
ERROR: cannot cast type jsonb to integer
LINE 1: select '12345' :: jsonb :: int4;

67' :: jsonb :: float8;
ERROR: cannot cast type jsonb to double precision
LINE 1: select '12345. =# select '12345. 67' :: jsonb :: float8;

Конечно, не то чтобы это было прямо очень большой проблемой. То есть, JSONB не приводится к числовым типам и boolean. В конце концов, всегда можно кастонуть через text:

67' :: jsonb :: text :: float8;
float8
----------
12345. =# select '12345. 67

Тем не менее, такое решение выглядит как-то костыльно, да и по поводу его производительности есть вопросы.

Теперь взглянем на поведение ветки master:

=# select 'true' :: jsonb :: bool;
bool
------
t

=# select '12345' :: jsonb :: int4;
int4
-------
12345

67' :: jsonb :: float8;
float8
----------
12345. =# select '12345. 67

Ура! Как видите, теперь можно кастовать JSONB в boolean и числовые типы.

Характерно, что кастинг в обратную сторону пока что возможен только через промежуточный кастинг в text:

67 :: jsonb;
ERROR: cannot cast type numeric to jsonb
LINE 1: select 12345. =# select 12345. 67 :: jsonb;

67 :: text :: jsonb;
jsonb
----------
12345. =# select 12345. 67
(1 row)

Думаю, просто еще ни у кого не дошли руки его дописать. Вы спросите, а почему нет прямого кастинга? 😉 Звучит, как возможность для самореализации, не находите?


Оставить комментарий

Ваш email нигде не будет показан
Обязательные для заполнения поля помечены *

*

x

Ещё Hi-Tech Интересное!

На все компьютеры в России хотят предустанавливать российские антивирусы

В правительство РФ внесён национальный проект «Цифровая экономика», в паспорте которого указано интересное предложение от Министерство цифрового развития, связи и массовых коммуникаций России: законодательно обеспечить предустановку отечественных антивирусных программ на все персональные компьютеры, ввозимые и создаваемые на территории РФ, начиная ...

Когда нужны скорость и масштабирование: сервер распределенных iOS-устройств

В Badoo прогоняется более 1400 end-to-end тестов для iOS-приложений на каждый запуск регрессии. Многим разработчикам UI-тестов под iOS наверняка знакома проблема времени тестового прогона. Это более 40 машинных часов тестов, которые проходят за 30 реальных минут. Николай Абалов из Badoo ...