v33-json_table.nocfbot

application/octet-stream

Filename: v33-json_table.nocfbot
Type: application/octet-stream
Part: 0
Message: Re: remaining sql/json patches
diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c
index e474e064..09962210 100644
--- a/src/backend/parser/parse_expr.c
+++ b/src/backend/parser/parse_expr.c
@@ -4219,7 +4219,7 @@ transformJsonSerializeExpr(ParseState *pstate, JsonSerializeExpr *expr)
 }
 
 /*
- * Transform JSON_VALUE, JSON_QUERY, JSON_EXISTS functions into a JsonExpr node.
+ * Transform JSON_VALUE, JSON_QUERY, JSON_EXISTS, JSON_TABLE functions into a JsonExpr node.
  */
 static Node *
 transformJsonFuncExpr(ParseState *pstate, JsonFuncExpr *func)
@@ -4372,13 +4372,11 @@ transformJsonFuncExpr(ParseState *pstate, JsonFuncExpr *func)
 			break;
 
 		case JSON_TABLE_OP:
-			func_name = "JSON_TABLE";
-
-			jsexpr = transformJsonExprCommon(pstate, func, func_name);
-			jsexpr->returning = makeNode(JsonReturning);
-			jsexpr->returning->format = makeJsonFormat(JS_FORMAT_DEFAULT, JS_ENC_DEFAULT, -1);
-			jsexpr->returning->typid = exprType(jsexpr->formatted_expr);
-			jsexpr->returning->typmod = -1;
+			if (!OidIsValid(jsexpr->returning->typid))
+			{
+				jsexpr->returning->typid = exprType(jsexpr->formatted_expr);
+				jsexpr->returning->typmod = -1;
+			}
 			jsexpr->on_error = transformJsonBehavior(pstate, func->on_error,
 													 JSON_BEHAVIOR_EMPTY,
 													 jsexpr->returning);
diff --git a/src/backend/parser/parse_jsontable.c b/src/backend/parser/parse_jsontable.c
index ee9123c3..a47f1ce3 100644
--- a/src/backend/parser/parse_jsontable.c
+++ b/src/backend/parser/parse_jsontable.c
@@ -71,14 +71,13 @@ transformJsonTableColumn(JsonTableColumn *jtc, Node *contextItemExpr,
 						 List *passingArgs, bool errorOnError)
 {
 	JsonFuncExpr *jfexpr = makeNode(JsonFuncExpr);
-	JsonOutput *output = makeNode(JsonOutput);
 	char	   *pathspec;
 	JsonFormat *default_format;
 
 	jfexpr->op =
 		jtc->coltype == JTC_REGULAR ? JSON_VALUE_OP :
 		jtc->coltype == JTC_EXISTS ? JSON_EXISTS_OP : JSON_QUERY_OP;
-	jfexpr->output = output;
+	jfexpr->output = makeNode(JsonOutput);
 	jfexpr->on_empty = jtc->on_empty;
 	jfexpr->on_error = jtc->on_error;
 	if (jfexpr->on_error == NULL && errorOnError)
@@ -88,9 +87,9 @@ transformJsonTableColumn(JsonTableColumn *jtc, Node *contextItemExpr,
 	jfexpr->wrapper = jtc->wrapper;
 	jfexpr->location = jtc->location;
 
-	output->typeName = jtc->typeName;
-	output->returning = makeNode(JsonReturning);
-	output->returning->format = jtc->format;
+	jfexpr->output->typeName = jtc->typeName;
+	jfexpr->output->returning = makeNode(JsonReturning);
+	jfexpr->output->returning->format = jtc->format;
 
 	default_format = makeJsonFormat(JS_FORMAT_DEFAULT, JS_ENC_DEFAULT, -1);
 
@@ -493,7 +492,7 @@ appendJsonTableColumns(JsonTableParseContext * cxt, List *columns)
 									" without also specifying FORMAT clause"),
 							 parser_errposition(pstate, rawc->location)));
 
-				/* FALLTHROUGH */
+				/* FALL THROUGH */
 			case JTC_EXISTS:
 			case JTC_FORMATTED:
 				{
@@ -735,7 +734,7 @@ transformJsonTable(ParseState *pstate, JsonTable *jt)
 		castNode(A_Const, jt->pathspec)->val.node.type != T_String)
 		ereport(ERROR,
 				(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
-				 errmsg("only string constants supported in JSON_TABLE path specification"),
+				 errmsg("only string are constants supported in the JSON_TABLE path specification"),
 				 parser_errposition(pstate,
 									exprLocation(jt->pathspec))));
 
diff --git a/src/backend/utils/adt/jsonpath_exec.c b/src/backend/utils/adt/jsonpath_exec.c
index 49be9c0e..d820d457 100644
--- a/src/backend/utils/adt/jsonpath_exec.c
+++ b/src/backend/utils/adt/jsonpath_exec.c
@@ -3521,6 +3521,7 @@ static bool
 JsonTablePlanNextRow(JsonTablePlanState * state)
 {
 	JsonTableJoinState *join;
+	bool		left;
 
 	if (state->type == JSON_TABLE_SCAN_STATE)
 		return JsonTableScanNextRow((JsonTableScanState *) state);
@@ -3542,7 +3543,7 @@ JsonTablePlanNextRow(JsonTablePlanState * state)
 	while (!join->advanceRight)
 	{
 		/* fetch next outer row */
-		bool		left = JsonTablePlanNextRow(join->left);
+		left = JsonTablePlanNextRow(join->left);
 
 		if (join->cross)
 		{
diff --git a/src/test/regress/expected/jsonb_sqljson.out b/src/test/regress/expected/jsonb_sqljson.out
index ef52e4ce..1b7d55b7 100644
--- a/src/test/regress/expected/jsonb_sqljson.out
+++ b/src/test/regress/expected/jsonb_sqljson.out
@@ -2203,6 +2203,6 @@ SELECT JSON_QUERY(jsonb '{"a": 123}', 'error' || ' ' || 'error');
 ERROR:  syntax error at or near " " of jsonpath input
 -- Should fail (not supported)
 SELECT * FROM JSON_TABLE(jsonb '{"a": 123}', '$' || '.' || 'a' COLUMNS (foo int));
-ERROR:  only string constants supported in JSON_TABLE path specification
+ERROR:  only string are constants supported in the JSON_TABLE path specification
 LINE 1: SELECT * FROM JSON_TABLE(jsonb '{"a": 123}', '$' || '.' || '...
                                                      ^