On Fri, Jun 21, 2024 at 10:48 PM Amit Langote <amitlangot...@gmail.com> wrote: > On Fri, Jun 21, 2024 at 4:05 PM jian he <jian.universal...@gmail.com> wrote: > > hi. > > i am a little confused. > > > > here[1] tom says: > > > Yeah, I too think this is a cast, and truncation is the spec-defined > > > behavior for casting to varchar with a specific length limit. I see > > > little reason that this should work differently from > > > > > > select json_serialize('{"a":1, "a":2}' returning text)::varchar(5); > > > json_serialize > > > ---------------- > > > {"a": > > > (1 row) > > > > if i understand it correctly, and my english interpretation is fine. > > i think tom means something like: > > > > select json_serialize('{"a":1, "a":2}' returning text)::varchar(5) = > > json_serialize('{"a":1, "a":2}' returning varchar(5)); > > > > should return true. > > the master will return true, but apply your patch, the above query > > will yield an error. > > The RETURNING variant giving an error is what the standard asks us to > do apparently. I read Tom's last message on this thread as agreeing > to that, even though hesitantly. He can correct me if I got that > wrong. > > > your patch will make domain and char(n) behavior inconsistent. > > create domain char2 as char(2); > > SELECT JSON_VALUE(jsonb '"aaa"', '$' RETURNING char2 ERROR ON ERROR); > > SELECT JSON_VALUE(jsonb '"aaa"', '$' RETURNING char(2) ERROR ON ERROR); > > > > > > another example: > > SELECT JSON_query(jsonb '"aaa"', '$' RETURNING char(2) keep quotes > > default '"aaa"'::jsonb ON ERROR); > > same value (jsonb "aaa") error on error will yield error, > > but `default expression on error` can coerce the value to char(2), > > which looks a little bit inconsistent, I think. > > Interesting examples, thanks for sharing. > > Attached updated version should take into account that typmod may be > hiding under domains. Please test.
I'd like to push this one tomorrow, barring objections. I could use some advice on backpatching. As I mentioned upthread, this changes the behavior for JSON_OBJECT(), JSON_ARRAY(), JSON_ARRAYAGG(), JSON_OBJECTAGG() too, which were added in v16. Should this change be backpatched? In general, what's our stance on changes that cater to improving standard compliance, but are not necessarily bugs. -- Thanks, Amit Langote