On Wed, Aug 24, 2022 at 11:55 AM Amit Langote <amitlangot...@gmail.com> wrote: > On Wed, Aug 24, 2022 at 6:29 AM Nikita Glukhov <n.glu...@postgrespro.ru> > wrote: > > Here is my plan: > > > > 0. Take my last v7-0001 patch as a base. It already contains refactoring > > of JsonCoercion code. (Fix 0002 is not needed anymore, because it is for > > json[b] domains, which simply will not be supported.) > > > > 1. Replace JSON_COERCION_VIA_EXPR in JsonCoercion with new > > JsonCoercionType(s) for hardcoded coercions. > > > > 2. Disable all non-JSON-compatible output types in coerceJsonFuncExpr(). > > > > 3. Add missing safe type input functions for integers, numerics, and > > maybe others. > > > > 4. Implement hardcoded coercions using these functions in > > ExecEvalJsonExprCoercion(). > > > > 5. Try to allow only constants (and also maybe column/parameter > > references) in JSON_VALUE's DEFAULT expressions. This should be enough > > for the most of practical cases. JSON_QUERY even does not have DEFAULT > > expressions -- it has only EMPTY ARRAY and EMPTY OBJECT, which can be > > treated as simple JSON constants. > > > > But it is possible to allow all other expressions in ERROR ON ERROR > > case, and I don't know if it will be consistent enough to allow some > > expressions in one case and deny in other. > > > > And there is another problem: expressions can be only checked for > > Const-ness only after expression simplification. AFAIU, at the > > parsing stage they look like 'string'::type. So, it's unclear if it > > is correct to check expressions in ExecInitExpr(). > > IIUC, the idea is to remove the support for `DEFAULT expression` in > the following, no? > > json_value ( context_item, path_expression > ... > [ { ERROR | NULL | DEFAULT expression } ON EMPTY ] > [ { ERROR | NULL | DEFAULT expression } ON ERROR ]) > > json_query ( context_item, path_expression > ... > [ { ERROR | NULL | EMPTY { [ ARRAY ] | OBJECT } | DEFAULT expression } > ON EMPTY ] > [ { ERROR | NULL | EMPTY { [ ARRAY ] | OBJECT } | DEFAULT expression } > ON ERROR ])
Or is the idea rather to restrict the set of data types we allow in `[ RETURNING data_type ]`? -- Thanks, Amit Langote EDB: http://www.enterprisedb.com