@@ -266,7 +266,7 @@ exprType(const Node *expr)
266
266
}
267
267
break ;
268
268
case T_JsonCtorExpr :
269
- type = exprType (( Node * ) (( const JsonCtorExpr * )expr )-> func ) ;
269
+ type = (( const JsonCtorExpr * )expr )-> returning -> format -> format == JS_FORMAT_JSONB ? JSONBOID : JSONOID ;
270
270
break ;
271
271
default :
272
272
elog (ERROR ,"unrecognized node type: %d" , (int )nodeTag (expr ));
@@ -504,7 +504,7 @@ exprTypmod(const Node *expr)
504
504
case T_JsonValueExpr :
505
505
return exprTypmod ((Node * ) ((const JsonValueExpr * )expr )-> formatted_expr );
506
506
case T_JsonCtorExpr :
507
- return exprTypmod (( Node * ) ((const JsonCtorExpr * )expr )-> func );
507
+ return -1 ; /* ((const JsonCtorExpr *) expr)->returning->typmod; */
508
508
default :
509
509
break ;
510
510
}
@@ -924,7 +924,8 @@ exprCollation(const Node *expr)
924
924
coll = exprCollation ((Node * ) ((const JsonValueExpr * )expr )-> formatted_expr );
925
925
break ;
926
926
case T_JsonCtorExpr :
927
- coll = exprCollation ((Node * ) ((const JsonCtorExpr * )expr )-> func );
927
+ /* coll = exprCollation((Node *) ((const JsonCtorExpr *) expr)->func); */
928
+ coll = InvalidOid ;/* keep compiler quiet */
928
929
break ;
929
930
default :
930
931
elog (ERROR ,"unrecognized node type: %d" , (int )nodeTag (expr ));
@@ -1134,8 +1135,8 @@ exprSetCollation(Node *expr, Oid collation)
1134
1135
collation );
1135
1136
break ;
1136
1137
case T_JsonCtorExpr :
1137
- exprSetCollation ((Node * ) ((const JsonCtorExpr * )expr )-> func ,
1138
- collation );
1138
+ /* exprSetCollation((Node *) ((const JsonCtorExpr *) expr)->func, collation); */
1139
+ Assert (! OidIsValid ( collation )); /* result is always an json[b] type */
1139
1140
break ;
1140
1141
default :
1141
1142
elog (ERROR ,"unrecognized node type: %d" , (int )nodeTag (expr ));
@@ -1581,7 +1582,7 @@ exprLocation(const Node *expr)
1581
1582
loc = exprLocation ((Node * ) ((const JsonValueExpr * )expr )-> raw_expr );
1582
1583
break ;
1583
1584
case T_JsonCtorExpr :
1584
- loc = exprLocation (( Node * ) (( const JsonCtorExpr * )expr )-> func ) ;
1585
+ loc = (( const JsonCtorExpr * )expr )-> location ;
1585
1586
break ;
1586
1587
default :
1587
1588
/* for any other node type it's just unknown... */
@@ -2293,7 +2294,9 @@ expression_tree_walker(Node *node,
2293
2294
case T_JsonCtorExpr :
2294
2295
{
2295
2296
JsonCtorExpr * ctor = (JsonCtorExpr * )node ;
2296
-
2297
+
2298
+ if (walker (ctor -> args ,context ))
2299
+ return true;
2297
2300
if (walker (ctor -> func ,context ))
2298
2301
return true;
2299
2302
}
@@ -3250,6 +3253,7 @@ expression_tree_mutator(Node *node,
3250
3253
JsonCtorExpr * newnode ;
3251
3254
3252
3255
FLATCOPY (newnode ,jve ,JsonCtorExpr );
3256
+ MUTATE (newnode -> args ,jve -> args ,List * );
3253
3257
MUTATE (newnode -> func ,jve -> func ,FuncExpr * );
3254
3258
MUTATE (newnode -> returning ,jve -> returning ,JsonReturning * );
3255
3259
@@ -3968,6 +3972,8 @@ raw_expression_tree_walker(Node *node,
3968
3972
{
3969
3973
JsonCtorExpr * ctor = (JsonCtorExpr * )node ;
3970
3974
3975
+ if (walker (ctor -> args ,context ))
3976
+ return true;
3971
3977
if (walker (ctor -> func ,context ))
3972
3978
return true;
3973
3979
if (walker (ctor -> returning ,context ))