Re: remaining sql/json patches
От | jian he |
---|---|
Тема | Re: remaining sql/json patches |
Дата | |
Msg-id | CACJufxG5vymBu=4J0yzMQCtcj51j6FEo=CGQF9Pnp3tzQPp+nw@mail.gmail.com обсуждение исходный текст |
Ответ на | Re: remaining sql/json patches (Amit Langote <amitlangote09@gmail.com>) |
Ответы |
Re: remaining sql/json patches
Re: remaining sql/json patches |
Список | pgsql-hackers |
On Thu, Jan 25, 2024 at 7:54 PM Amit Langote <amitlangote09@gmail.com> wrote: > > > > > The problem with returning comp_domain_with_typmod from json_value() > > seems to be that it's using a text-to-record CoerceViaIO expression > > picked from JsonExpr.item_coercions, which behaves differently than > > the expression tree that the following uses: > > > > select ('abcd', 42)::comp_domain_with_typmod; > > row > > ---------- > > (abc,42) > > (1 row) > > Oh, it hadn't occurred to me to check what trying to coerce a "string" > containing the record literal would do: > > select '(''abcd'', 42)'::comp_domain_with_typmod; > ERROR: value too long for type character(3) > LINE 1: select '(''abcd'', 42)'::comp_domain_with_typmod; > > which is the same thing as what the JSON_QUERY() and JSON_VALUE() are > running into. So, it might be fair to think that the error is not a > limitation of the SQL/JSON patch but an underlying behavior that it > has to accept as is. > Hi, I reconciled with these cases. What bugs me now is the first query of the following 4 cases (for comparison). SELECT JSON_QUERY(jsonb '[1,2]', '$' RETURNING char(3) omit quotes); SELECT JSON_QUERY(jsonb '[1,2]', '$' RETURNING char(3) keep quotes); SELECT JSON_QUERY(jsonb '[1,2]', '$' RETURNING text omit quotes); SELECT JSON_QUERY(jsonb '[1,2]', '$' RETURNING text keep quotes); I did some minor refactoring on the function coerceJsonFuncExprOutput. it will make the following queries return null instead of error. NULL is the return of json_value. SELECT JSON_QUERY(jsonb '"123"', '$' RETURNING int2); SELECT JSON_QUERY(jsonb '"123"', '$' RETURNING int4); SELECT JSON_QUERY(jsonb '"123"', '$' RETURNING int8); SELECT JSON_QUERY(jsonb '"123"', '$' RETURNING bool); SELECT JSON_QUERY(jsonb '"123"', '$' RETURNING numeric); SELECT JSON_QUERY(jsonb '"123"', '$' RETURNING real); SELECT JSON_QUERY(jsonb '"123"', '$' RETURNING float8);
Вложения
В списке pgsql-hackers по дате отправления: