BUG #17440: not expected result from jsonb_path_query

Started by PG Bug reporting formabout 4 years ago2 messagesbugs
Jump to latest
#1PG Bug reporting form
noreply@postgresql.org

The following bug has been logged on the website:

Bug reference: 17440
Logged by: Edouard HIBON
Email address: edouard.hibon@free.fr
PostgreSQL version: 14.0
Operating system: windows 10
Description:

Query 1 : SELECT jsonb_path_query('[1,2,3]' :: jsonb, '$') results in 1
value '[1,2,3]' :: jsonb as expected
Query 2 : SELECT jsonb_path_query('[1,2,3]' :: jsonb, '$[*]') results in a
set of 3 values '1', '2', '3' as expected
Query 3 : SELECT jsonb_path_query('[1,2,3]' :: jsonb, '$[*] ? (@ <> null)')
results in a set of 3 values '1', '2', '3' as expected
Query 4 : SELECT jsonb_path_query('[1,2,3]' :: jsonb, '$ ? (@ <> null)')
results in a set of 3 values '1', '2', '3' as for the queries 2 & 3 whereas
I would expect only one value '[1,2,3]' as for the query 1 because there is
no member accessor nor array element accessor in this jsonpath, and @ should
represent the initial jsonb value being queried $

demo :
https://dbfiddle.uk/?rdbms=postgres_14&amp;fiddle=f09164502df5ee1bb620057689e6f810

#2Alexander Korotkov
aekorotkov@gmail.com
In reply to: PG Bug reporting form (#1)
Re: BUG #17440: not expected result from jsonb_path_query

Hi!

On Tue, Mar 15, 2022 at 8:34 PM PG Bug reporting form
<noreply@postgresql.org> wrote:

The following bug has been logged on the website:

Bug reference: 17440
Logged by: Edouard HIBON
Email address: edouard.hibon@free.fr
PostgreSQL version: 14.0
Operating system: windows 10
Description:

Query 1 : SELECT jsonb_path_query('[1,2,3]' :: jsonb, '$') results in 1
value '[1,2,3]' :: jsonb as expected
Query 2 : SELECT jsonb_path_query('[1,2,3]' :: jsonb, '$[*]') results in a
set of 3 values '1', '2', '3' as expected
Query 3 : SELECT jsonb_path_query('[1,2,3]' :: jsonb, '$[*] ? (@ <> null)')
results in a set of 3 values '1', '2', '3' as expected
Query 4 : SELECT jsonb_path_query('[1,2,3]' :: jsonb, '$ ? (@ <> null)')
results in a set of 3 values '1', '2', '3' as for the queries 2 & 3 whereas
I would expect only one value '[1,2,3]' as for the query 1 because there is
no member accessor nor array element accessor in this jsonpath, and @ should
represent the initial jsonb value being queried $

demo :
https://dbfiddle.uk/?rdbms=postgres_14&amp;fiddle=f09164502df5ee1bb620057689e6f810

The default jsonpath mode is lax. Lax mode automatically unwraps
arrays. Unwrapping array in filter affects the result value as well.
Strict mode works as you expected.

SELECT jsonb_path_query('[1,2,3]' :: jsonb, 'strict $ ? (@ <> null)')
[1, 2, 3]

My personal opinion is that lax mode is generally prone to
javascript-style weirdness, and one should always use strict.

------
Regards,
Alexander Korotkov