Re: remaining sql/json patches
От | jian he |
---|---|
Тема | Re: remaining sql/json patches |
Дата | |
Msg-id | CACJufxFSPropdCGkWwwD24kzMYVdwrdJueyfpMPtpCLj-7FwJQ@mail.gmail.com обсуждение исходный текст |
Ответ на | Re: remaining sql/json patches (jian he <jian.universality@gmail.com>) |
Ответы |
Re: remaining sql/json patches
(jian he <jian.universality@gmail.com>)
Re: remaining sql/json patches (jian he <jian.universality@gmail.com>) |
Список | pgsql-hackers |
+/* + * Evaluate or return the step address to evaluate a coercion of a JSON item + * to the target type. The former if the coercion must be done right away by + * calling the target type's input function, and for some types, by calling + * json_populate_type(). + * + * Returns the step address to be performed next. + */ +void +ExecEvalJsonCoercionViaPopulateOrIO(ExprState *state, ExprEvalStep *op, + ExprContext *econtext) the comment seems not right? it does return anything. it did the evaluation. some logic in ExecEvalJsonCoercionViaPopulateOrIO, like if (SOFT_ERROR_OCCURRED(escontext_p)) and if (!InputFunctionCallSafe){...}, seems validated twice, ExecEvalJsonCoercionFinish also did it. I uncommented the following part, and still passed the test. /src/backend/executor/execExprInterp.c 4452: // if (SOFT_ERROR_OCCURRED(escontext_p)) 4453: // { 4454: // post_eval->error.value = BoolGetDatum(true); 4455: // *op->resvalue = (Datum) 0; 4456: // *op->resnull = true; 4457: // } 4470: // post_eval->error.value = BoolGetDatum(true); 4471: // *op->resnull = true; 4472: // *op->resvalue = (Datum) 0; 4473: return; Correct me if I'm wrong. like in "empty array on empty empty object on error", the "empty array" refers to constant literal '[]' the assumed data type is jsonb, the "empty object" refers to const literal '{}', the assumed data type is jsonb. --these two queries will fail very early, before ExecEvalJsonExprPath. SELECT JSON_QUERY(jsonb '{"a":[3,4]}', '$.a' RETURNING int4range default '[1.1,2]' on error); SELECT JSON_QUERY(jsonb '{"a":[3,4]}', '$.a' RETURNING int4range default '[1.1,2]' on empty); -----these four will fail later, and will call ExecEvalJsonCoercionViaPopulateOrIO twice. SELECT JSON_QUERY(jsonb '{"a":[3,4]}', '$.z' RETURNING int4range empty object on empty empty object on error); SELECT JSON_QUERY(jsonb '{"a":[3,4]}', '$.z' RETURNING int4range empty array on empty empty array on error); SELECT JSON_QUERY(jsonb '{"a":[3,4]}', '$.z' RETURNING int4range empty array on empty empty object on error); SELECT JSON_QUERY(jsonb '{"a":[3,4]}', '$.z' RETURNING int4range empty object on empty empty array on error); -----however these four will not fail. SELECT JSON_QUERY(jsonb '{"a":[3,4]}', '$.z' RETURNING int4range empty object on error); SELECT JSON_QUERY(jsonb '{"a":[3,4]}', '$.z' RETURNING int4range empty array on error); SELECT JSON_QUERY(jsonb '{"a":[3,4]}', '$.z' RETURNING int4range empty array on empty); SELECT JSON_QUERY(jsonb '{"a":[3,4]}', '$.z' RETURNING int4range empty object on empty); should the last four query fail or just return null?
В списке pgsql-hackers по дате отправления: