On Sat, Apr 6, 2024 at 12:31 PM jian he <jian.universal...@gmail.com> wrote: > On Fri, Apr 5, 2024 at 8:35 PM Amit Langote <amitlangot...@gmail.com> wrote: > > Here's one. Main changes: > > > > * Fixed a bug in get_table_json_columns() which caused nested columns > > to be deparsed incorrectly, something Jian reported upthread. > > * Simplified the algorithm in JsonTablePlanNextRow() > > > > I'll post another revision or two maybe tomorrow, but posting what I > > have now in case Jian wants to do more testing. > > i am using the upthread view validation function. > by comparing `execute the view definition` and `select * from the_view`, > I did find 2 issues. > > * problem in transformJsonBehavior, JSON_BEHAVIOR_DEFAULT branch. > I think we can fix this problem later, since sql/json query function > already committed? > > CREATE DOMAIN jsonb_test_domain AS text CHECK (value <> 'foo'); > normally, we do: > SELECT JSON_VALUE(jsonb '{"d1": "H"}', '$.a2' returning > jsonb_test_domain DEFAULT 'foo' ON ERROR); > > but parsing back view def, we do: > SELECT JSON_VALUE(jsonb '{"d1": "H"}', '$.a2' returning > jsonb_test_domain DEFAULT 'foo'::text::jsonb_test_domain ON ERROR); > > then I found the following two queries should not be error out. > SELECT JSON_VALUE(jsonb '{"d1": "H"}', '$.a2' returning > jsonb_test_domain DEFAULT 'foo1'::text::jsonb_test_domain ON ERROR); > SELECT JSON_VALUE(jsonb '{"d1": "H"}', '$.a2' returning > jsonb_test_domain DEFAULT 'foo1'::jsonb_test_domain ON ERROR);
Yeah, added an open item for this: https://wiki.postgresql.org/wiki/PostgreSQL_17_Open_Items#Open_Issues > -------------------------------------------------------------------------------------------------------------------- > > * problem with type "char". the view def output is not the same as > the select * from v1. > > create or replace view v1 as > SELECT col FROM s, > JSON_TABLE(jsonb '{"d": ["hello", "hello1"]}', '$' as c1 > COLUMNS(col "char" path '$.d' without wrapper keep quotes))sub; > > \sv v1 > CREATE OR REPLACE VIEW public.v1 AS > SELECT sub.col > FROM s, > JSON_TABLE( > '{"d": ["hello", "hello1"]}'::jsonb, '$' AS c1 > COLUMNS ( > col "char" PATH '$."d"' > ) > ) sub > one under the hood called JSON_QUERY_OP, another called JSON_VALUE_OP. Hmm, I don't see a problem as long as both are equivalent or produce the same result. Though, perhaps we could make get_json_expr_options() also deparse JSW_NONE explicitly into "WITHOUT WRAPPER" instead of a blank. But that's existing code, so will take care of it as part of the above open item. > I will do extensive checking for other types later, so far, other than > these two issues, > get_json_table_columns is pretty solid, I've tried nested columns with > nested columns, it just works. Thanks for checking. -- Thanks, Amit Langote