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

[Перевод] Андрей Гейм: Бойтесь технологического кризиса

«Социальные сети не спасут нас от астероида, который мчится к Земле»— Андрей Гейм (профессор Манчестерского университета, в 2010 году получил Нобелевскую премию по физике за работу над графеном) Реакция была содержательной: будто бы он встретил сезонного рабочего на нашем месте ...

1С и Яндекс.Облако Compute Cloud. Вдоль и поперек

Бороться и искать. Найти и перепрятать Достаточно популярная поговорка во времена Союза. Вот и сейчас, те у кого сервер 1С в локальной сети мечтают вынести его в облако, а те у кого в облаке прикупить свой в локальную сеть. AlexandrSurkov ...