On 2017-02-28 20:08, Oleg Bartunov wrote: > Attached patch is an implementation of SQL/JSON data model from SQL-2016 > standard (ISO/IEC 9075-2:2016(E))
I've faintly started looking into this. > We created repository for reviewing (ask for write access) - > https://github.com/postgrespro/sqljson/tree/sqljson > Examples of usage can be found in src/test/regress/sql/sql_json.sql > The whole documentation about json support should be reorganized and added, > and we plan to do this before release. We need help of community here. > The standard describes SQL/JSON path language, which used by SQL/JSON query > operators to query JSON. It defines path language as string literal. We > implemented the path language as JSONPATH data type, since other > approaches are not friendly to planner and executor. I was a bit sad to discover that I can't PREPARE jsq AS SELECT JSON_QUERY('{}', $1); I assume because of this part of the updated grammar: json_path_specification: Sconst { $$ = $1; } ; Would it make sense, fundamentally, to allow variables there? After Andrew Gierth's analysis of this grammar problem, I understand that it's not reasonable to expect JSON_TABLE() to support variable jsonpaths, but maybe it would be feasible for everything else? From Andrew's changes to the new grammar (see attached) it seems to me that at least that part is possible. Or should I forget about trying to implement the other part?
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index adfe9b1..f459996 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -624,6 +624,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); json_table_plan_cross json_table_plan_primary json_table_default_plan + json_path_specification %type <list> json_arguments json_passing_clause_opt @@ -635,8 +636,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); %type <typnam> json_returning_clause_opt -%type <str> json_path_specification - json_table_column_path_specification_clause_opt +%type <str> json_table_column_path_specification_clause_opt json_table_path_name json_as_path_name_clause_opt @@ -845,6 +845,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); */ %nonassoc UNBOUNDED /* ideally should have same precedence as IDENT */ %nonassoc ERROR_P EMPTY_P DEFAULT ABSENT /* JSON error/empty behavior */ +%nonassoc COLUMNS FALSE_P KEEP OMIT PASSING TRUE_P UNKNOWN %nonassoc IDENT GENERATED NULL_P PARTITION RANGE ROWS PRECEDING FOLLOWING CUBE ROLLUP %left Op OPERATOR /* multi-character ops and user-defined operators */ %left '+' '-' @@ -14472,7 +14473,7 @@ json_context_item: ; json_path_specification: - Sconst { $$ = $1; } + a_expr { $$ = $1; } ; json_as_path_name_clause_opt: @@ -14802,7 +14803,7 @@ json_table_formatted_column_definition: ; json_table_nested_columns: - NESTED path_opt json_path_specification + NESTED path_opt Sconst json_as_path_name_clause_opt json_table_columns_clause {
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers