@@ -125,6 +125,8 @@ static Node *transformTypeCast(ParseState *pstate, TypeCast *tc);
125
125
static Node * transformCollateClause (ParseState * pstate , CollateClause * c );
126
126
static Node * transformJsonObjectCtor (ParseState * pstate , JsonObjectCtor * ctor );
127
127
static Node * transformJsonArrayCtor (ParseState * pstate , JsonArrayCtor * ctor );
128
+ static Node * transformJsonArrayQueryCtor (ParseState * pstate ,
129
+ JsonArrayQueryCtor * ctor );
128
130
static Node * transformJsonObjectAgg (ParseState * pstate , JsonObjectAgg * agg );
129
131
static Node * transformJsonArrayAgg (ParseState * pstate , JsonArrayAgg * agg );
130
132
static Node * make_row_comparison_op (ParseState * pstate , List * opname ,
@@ -383,6 +385,10 @@ transformExprRecurse(ParseState *pstate, Node *expr)
383
385
result = transformJsonArrayCtor (pstate , (JsonArrayCtor * ) expr );
384
386
break ;
385
387
388
+ case T_JsonArrayQueryCtor :
389
+ result = transformJsonArrayQueryCtor (pstate , (JsonArrayQueryCtor * ) expr );
390
+ break ;
391
+
386
392
case T_JsonObjectAgg :
387
393
result = transformJsonObjectAgg (pstate , (JsonObjectAgg * ) expr );
388
394
break ;
@@ -4012,6 +4018,71 @@ transformJsonObjectCtor(ParseState *pstate, JsonObjectCtor *ctor)
4012
4018
return coerceJsonFuncExpr (pstate , (Node * ) jsctor , jsctor -> returning , true);
4013
4019
}
4014
4020
4021
+ /*
4022
+ * Transform JSON_ARRAY(query [FORMAT] [RETURNING] [ON NULL]) into
4023
+ * (SELECT JSON_ARRAYAGG(a [FORMAT] [RETURNING] [ON NULL]) FROM (query) q(a))
4024
+ */
4025
+ static Node *
4026
+ transformJsonArrayQueryCtor (ParseState * pstate , JsonArrayQueryCtor * ctor )
4027
+ {
4028
+ SubLink * sublink = makeNode (SubLink );
4029
+ SelectStmt * select = makeNode (SelectStmt );
4030
+ RangeSubselect * range = makeNode (RangeSubselect );
4031
+ Alias * alias = makeNode (Alias );
4032
+ ResTarget * target = makeNode (ResTarget );
4033
+ JsonArrayAgg * agg = makeNode (JsonArrayAgg );
4034
+ ColumnRef * colref = makeNode (ColumnRef );
4035
+ Query * query ;
4036
+ ParseState * qpstate ;
4037
+
4038
+ /* Transform query only for counting target list entries. */
4039
+ qpstate = make_parsestate (pstate );
4040
+
4041
+ query = transformStmt (qpstate , ctor -> query );
4042
+
4043
+ if (count_nonjunk_tlist_entries (query -> targetList ) != 1 )
4044
+ ereport (ERROR ,
4045
+ (errcode (ERRCODE_SYNTAX_ERROR ),
4046
+ errmsg ("subquery must return only one column" ),
4047
+ parser_errposition (pstate , ctor -> location )));
4048
+
4049
+ free_parsestate (qpstate );
4050
+
4051
+ colref -> fields = list_make2 (makeString (pstrdup ("q" )),
4052
+ makeString (pstrdup ("a" )));
4053
+ colref -> location = ctor -> location ;
4054
+
4055
+ agg -> arg = makeJsonValueExpr ((Expr * ) colref , ctor -> format );
4056
+ agg -> ctor .agg_order = NIL ;
4057
+ agg -> ctor .output = ctor -> output ;
4058
+ agg -> absent_on_null = ctor -> absent_on_null ;
4059
+ agg -> ctor .location = ctor -> location ;
4060
+
4061
+ target -> name = NULL ;
4062
+ target -> indirection = NIL ;
4063
+ target -> val = (Node * ) agg ;
4064
+ target -> location = ctor -> location ;
4065
+
4066
+ alias -> aliasname = pstrdup ("q" );
4067
+ alias -> colnames = list_make1 (makeString (pstrdup ("a" )));
4068
+
4069
+ range -> lateral = false;
4070
+ range -> subquery = ctor -> query ;
4071
+ range -> alias = alias ;
4072
+
4073
+ select -> targetList = list_make1 (target );
4074
+ select -> fromClause = list_make1 (range );
4075
+
4076
+ sublink -> subLinkType = EXPR_SUBLINK ;
4077
+ sublink -> subLinkId = 0 ;
4078
+ sublink -> testexpr = NULL ;
4079
+ sublink -> operName = NIL ;
4080
+ sublink -> subselect = (Node * ) select ;
4081
+ sublink -> location = ctor -> location ;
4082
+
4083
+ return transformExprRecurse (pstate , (Node * ) sublink );
4084
+ }
4085
+
4015
4086
/*
4016
4087
* Common code for JSON_OBJECTAGG and JSON_ARRAYAGG transformation.
4017
4088
*/
0 commit comments