diff options
Diffstat (limited to 'src/include/nodes')
-rw-r--r-- | src/include/nodes/execnodes.h | 73 | ||||
-rw-r--r-- | src/include/nodes/makefuncs.h | 2 | ||||
-rw-r--r-- | src/include/nodes/parsenodes.h | 42 | ||||
-rw-r--r-- | src/include/nodes/primnodes.h | 122 |
4 files changed, 239 insertions, 0 deletions
diff --git a/src/include/nodes/execnodes.h b/src/include/nodes/execnodes.h index 92593526725..1774c56ae31 100644 --- a/src/include/nodes/execnodes.h +++ b/src/include/nodes/execnodes.h @@ -1008,6 +1008,79 @@ typedef struct DomainConstraintState ExprState *check_exprstate; /* check_expr's eval state, or NULL */ } DomainConstraintState; +/* + * State for JsonExpr evaluation, too big to inline. + * + * This contains the information going into and coming out of the + * EEOP_JSONEXPR_PATH eval step. + */ +typedef struct JsonExprState +{ + /* original expression node */ + JsonExpr *jsexpr; + + /* value/isnull for formatted_expr */ + NullableDatum formatted_expr; + + /* value/isnull for pathspec */ + NullableDatum pathspec; + + /* JsonPathVariable entries for passing_values */ + List *args; + + /* + * Output variables that drive the EEOP_JUMP_IF_NOT_TRUE steps that are + * added for ON ERROR and ON EMPTY expressions, if any. + * + * Reset for each evaluation of EEOP_JSONEXPR_PATH. + */ + + /* Set to true if jsonpath evaluation cause an error. */ + NullableDatum error; + + /* Set to true if the jsonpath evaluation returned 0 items. */ + NullableDatum empty; + + /* + * Addresses of steps that implement the non-ERROR variant of ON EMPTY and + * ON ERROR behaviors, respectively. + */ + int jump_empty; + int jump_error; + + /* + * Address of the step to coerce the result value of jsonpath evaluation + * to the RETURNING type using JsonExpr.coercion_expr. -1 if no coercion + * is necessary or if either JsonExpr.use_io_coercion or + * JsonExpr.use_json_coercion is true. + */ + int jump_eval_coercion; + + /* + * Address to jump to when skipping all the steps after performing + * ExecEvalJsonExprPath() so as to return whatever the JsonPath* function + * returned as is, that is, in the cases where there's no error and no + * coercion is necessary. + */ + int jump_end; + + /* + * RETURNING type input function invocation info when + * JsonExpr.use_io_coercion is true. + */ + FmgrInfo *input_finfo; + FunctionCallInfo input_fcinfo; + + /* + * For error-safe evaluation of coercions. When the ON ERROR behavior is + * not ERROR, a pointer to this is passed to ExecInitExprRec() when + * initializing the coercion expressions or to ExecInitJsonCoercion(). + * + * Reset for each evaluation of EEOP_JSONEXPR_PATH. + */ + ErrorSaveContext escontext; +} JsonExprState; + /* ---------------------------------------------------------------- * Executor State Trees diff --git a/src/include/nodes/makefuncs.h b/src/include/nodes/makefuncs.h index 2dc79648d2b..fdc78270e5b 100644 --- a/src/include/nodes/makefuncs.h +++ b/src/include/nodes/makefuncs.h @@ -116,5 +116,7 @@ extern Node *makeJsonKeyValue(Node *key, Node *value); extern Node *makeJsonIsPredicate(Node *expr, JsonFormat *format, JsonValueType item_type, bool unique_keys, int location); +extern JsonBehavior *makeJsonBehavior(JsonBehaviorType btype, Node *expr, + int location); #endif /* MAKEFUNC_H */ diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 1e2e898851f..9b709f03908 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -1716,6 +1716,48 @@ typedef struct JsonOutput } JsonOutput; /* + * JsonArgument - + * representation of argument from JSON PASSING clause + */ +typedef struct JsonArgument +{ + NodeTag type; + JsonValueExpr *val; /* argument value expression */ + char *name; /* argument name */ +} JsonArgument; + +/* + * JsonQuotes - + * representation of [KEEP|OMIT] QUOTES clause for JSON_QUERY() + */ +typedef enum JsonQuotes +{ + JS_QUOTES_UNSPEC, /* unspecified */ + JS_QUOTES_KEEP, /* KEEP QUOTES */ + JS_QUOTES_OMIT, /* OMIT QUOTES */ +} JsonQuotes; + +/* + * JsonFuncExpr - + * untransformed representation of function expressions for + * SQL/JSON query functions + */ +typedef struct JsonFuncExpr +{ + NodeTag type; + JsonExprOp op; /* expression type */ + JsonValueExpr *context_item; /* context item expression */ + Node *pathspec; /* JSON path specification expression */ + List *passing; /* list of PASSING clause arguments, if any */ + JsonOutput *output; /* output clause, if specified */ + JsonBehavior *on_empty; /* ON EMPTY behavior */ + JsonBehavior *on_error; /* ON ERROR behavior */ + JsonWrapper wrapper; /* array wrapper behavior (JSON_QUERY only) */ + JsonQuotes quotes; /* omit or keep quotes? (JSON_QUERY only) */ + int location; /* token location, or -1 if unknown */ +} JsonFuncExpr; + +/* * JsonKeyValue - * untransformed representation of JSON object key-value pair for * JSON_OBJECT() and JSON_OBJECTAGG() diff --git a/src/include/nodes/primnodes.h b/src/include/nodes/primnodes.h index e57d69f72e2..376f67e6a5f 100644 --- a/src/include/nodes/primnodes.h +++ b/src/include/nodes/primnodes.h @@ -1691,6 +1691,128 @@ typedef struct JsonIsPredicate ParseLoc location; /* token location, or -1 if unknown */ } JsonIsPredicate; +/* Nodes used in SQL/JSON query functions */ + +/* + * JsonWrapper - + * representation of WRAPPER clause for JSON_QUERY() + */ +typedef enum JsonWrapper +{ + JSW_UNSPEC, + JSW_NONE, + JSW_CONDITIONAL, + JSW_UNCONDITIONAL, +} JsonWrapper; + +/* + * JsonBehaviorType - + * enumeration of behavior types used in SQL/JSON ON ERROR/EMPTY clauses + * + * If enum members are reordered, get_json_behavior() from ruleutils.c + * must be updated accordingly. + */ +typedef enum JsonBehaviorType +{ + JSON_BEHAVIOR_NULL = 0, + JSON_BEHAVIOR_ERROR, + JSON_BEHAVIOR_EMPTY, + JSON_BEHAVIOR_TRUE, + JSON_BEHAVIOR_FALSE, + JSON_BEHAVIOR_UNKNOWN, + JSON_BEHAVIOR_EMPTY_ARRAY, + JSON_BEHAVIOR_EMPTY_OBJECT, + JSON_BEHAVIOR_DEFAULT, +} JsonBehaviorType; + +/* + * JsonBehavior + * Specifications for ON ERROR / ON EMPTY behaviors of SQL/JSON + * query functions specified by a JsonExpr + * + * 'expr' is the expression to emit when a given behavior (EMPTY or ERROR) + * occurs on evaluating the SQL/JSON query function. 'coerce' is set to true + * if 'expr' isn't already of the expected target type given by + * JsonExpr.returning. + */ +typedef struct JsonBehavior +{ + NodeTag type; + + JsonBehaviorType btype; + Node *expr; + bool coerce; + int location; /* token location, or -1 if unknown */ +} JsonBehavior; + +/* + * JsonExprOp - + * enumeration of SQL/JSON query function types + */ +typedef enum JsonExprOp +{ + JSON_EXISTS_OP, /* JSON_EXISTS() */ + JSON_QUERY_OP, /* JSON_QUERY() */ + JSON_VALUE_OP, /* JSON_VALUE() */ +} JsonExprOp; + +/* + * JsonExpr - + * Transformed representation of JSON_VALUE(), JSON_QUERY(), and + * JSON_EXISTS() + */ +typedef struct JsonExpr +{ + Expr xpr; + + JsonExprOp op; + + /* jsonb-valued expression to query */ + Node *formatted_expr; + + /* Format of the above expression needed by ruleutils.c */ + JsonFormat *format; + + /* jsopath-valued expression containing the query pattern */ + Node *path_spec; + + /* Expected type/format of the output. */ + JsonReturning *returning; + + /* Information about the PASSING argument expressions */ + List *passing_names; + List *passing_values; + + /* User-specified or default ON EMPTY and ON ERROR behaviors */ + JsonBehavior *on_empty; + JsonBehavior *on_error; + + /* + * Information about converting the result of jsonpath functions + * JsonPathQuery() and JsonPathValue() to the RETURNING type. + * + * coercion_expr is a cast expression if the parser can find it for the + * source and the target type. If not, either use_io_coercion or + * use_json_coercion is set to determine the coercion method to use at + * runtime; see coerceJsonExprOutput() and ExecInitJsonExpr(). + */ + Node *coercion_expr; + bool use_io_coercion; + bool use_json_coercion; + + /* WRAPPER specification for JSON_QUERY */ + JsonWrapper wrapper; + + /* KEEP or OMIT QUOTES for singleton scalars returned by JSON_QUERY() */ + bool omit_quotes; + + /* JsonExpr's collation, if coercion_expr is NULL. */ + Oid collation; + + /* Original JsonFuncExpr's location */ + int location; +} JsonExpr; + /* ---------------- * NullTest * |