Главная » Хабрахабр » Что нового в 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 Интересное!

[recovery mode] .NET гуру Дино Эспозито: «Не будь пассажиром поезда, идущего под откос»

Дино приезжал в Минск лишь однажды, и нам удалось пообщаться с ним между лекциями, которые он давал для .Net-чиков. Мы решили не быть банальными и поговорили с Дино не только о работе, но и о книгах, о будущем и о ...

Рассылай и властвуй: инструменты для создания и тестирования рассылки

Верстать и тестировать адаптивные письма с интерактивом (например, с формами и слайдерами) — боль в квадрате. Верстать электронные письма — это боль. В статье расскажу об email-фреймворках — MJML и Foundation for Emails — и моих любимых ресурсах для тестирования ...