Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/include/nodes')
-rw-r--r--src/include/nodes/execnodes.h73
-rw-r--r--src/include/nodes/makefuncs.h2
-rw-r--r--src/include/nodes/parsenodes.h42
-rw-r--r--src/include/nodes/primnodes.h122
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
*