From: | Josh Berkus <josh(at)agliodbs(dot)com> |
---|---|
To: | Alexander Korotkov <aekorotkov(at)gmail(dot)com>, pgsql-hackers <pgsql-hackers(at)postgresql(dot)org> |
Subject: | Re: jsonb contains behaviour weirdness |
Date: | 2014-09-12 18:21:41 |
Message-ID: | 541339B5.5030000@agliodbs.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
On 09/12/2014 06:40 AM, Alexander Korotkov wrote:
> Hi!
>
> Let's consider some examples.
>
> # select '[1,2]'::jsonb @> '[1,2,2]'::jsonb;
> ?column?
> ----------
> f
> (1 row)
>
> One may think it's because second jsonb array contain two "2". So,
> contains takes care about count of equal elements.
JSONB arrays are allowed to have repleating elements. It's keys which
are not allowed to repeat.
>
> # select '[1,1,2]'::jsonb @> '[1,2,2]'::jsonb;
> ?column?
> ----------
> t
> (1 row)
>
> But, it's not. Jsonb contains takes care only about length of array.
OK, now, that's messed up.
>
> # select '[[1,2]]'::jsonb @> '[[1,2,2]]'::jsonb;
> ?column?
> ----------
> t
> (1 row)
>
> Even more weird :)
> The reason why jsonb contains behaves so is check in the beginning
> of jsonb_contains. It makes fast check of jsonb type and elements count
> before calling JsonbDeepContains.
>
> if (JB_ROOT_COUNT(val) < JB_ROOT_COUNT(tmpl) ||
> JB_ROOT_IS_OBJECT(val) != JB_ROOT_IS_OBJECT(tmpl))
> PG_RETURN_BOOL(false);
>
> It's likely that "JB_ROOT_COUNT(val) < JB_ROOT_COUNT(tmpl)" should be
> checked only for objects, not arrays.
Yeah, agreed.
--
Josh Berkus
PostgreSQL Experts Inc.
http://pgexperts.com
From | Date | Subject | |
---|---|---|---|
Next Message | Abhijit Menon-Sen | 2014-09-12 18:22:24 | Re: pgcrypto: PGP signatures |
Previous Message | Peter Geoghegan | 2014-09-12 18:14:22 | Re: jsonb contains behaviour weirdness |