@@ -265,6 +265,9 @@ exprType(const Node *expr)
265265 type = exprType ((Node * ) (jve -> formatted_expr ? jve -> formatted_expr : jve -> raw_expr ));
266266 }
267267 break ;
268+ case T_JsonCtorExpr :
269+ type = exprType ((Node * ) ((const JsonCtorExpr * ) expr )-> func );
270+ break ;
268271 default :
269272 elog (ERROR , "unrecognized node type: %d" , (int ) nodeTag (expr ));
270273 type = InvalidOid ; /* keep compiler quiet */
@@ -500,6 +503,8 @@ exprTypmod(const Node *expr)
500503 return exprTypmod ((Node * ) ((const PlaceHolderVar * ) expr )-> phexpr );
501504 case T_JsonValueExpr :
502505 return exprTypmod ((Node * ) ((const JsonValueExpr * ) expr )-> formatted_expr );
506+ case T_JsonCtorExpr :
507+ return exprTypmod ((Node * ) ((const JsonCtorExpr * ) expr )-> func );
503508 default :
504509 break ;
505510 }
@@ -918,6 +923,9 @@ exprCollation(const Node *expr)
918923 case T_JsonValueExpr :
919924 coll = exprCollation ((Node * ) ((const JsonValueExpr * ) expr )-> formatted_expr );
920925 break ;
926+ case T_JsonCtorExpr :
927+ coll = exprCollation ((Node * ) ((const JsonCtorExpr * ) expr )-> func );
928+ break ;
921929 default :
922930 elog (ERROR , "unrecognized node type: %d" , (int ) nodeTag (expr ));
923931 coll = InvalidOid ; /* keep compiler quiet */
@@ -1125,6 +1133,10 @@ exprSetCollation(Node *expr, Oid collation)
11251133 exprSetCollation ((Node * ) ((JsonValueExpr * ) expr )-> formatted_expr ,
11261134 collation );
11271135 break ;
1136+ case T_JsonCtorExpr :
1137+ exprSetCollation ((Node * ) ((const JsonCtorExpr * ) expr )-> func ,
1138+ collation );
1139+ break ;
11281140 default :
11291141 elog (ERROR , "unrecognized node type: %d" , (int ) nodeTag (expr ));
11301142 break ;
@@ -1568,6 +1580,9 @@ exprLocation(const Node *expr)
15681580 case T_JsonValueExpr :
15691581 loc = exprLocation ((Node * ) ((const JsonValueExpr * ) expr )-> raw_expr );
15701582 break ;
1583+ case T_JsonCtorExpr :
1584+ loc = exprLocation ((Node * ) ((const JsonCtorExpr * ) expr )-> func );
1585+ break ;
15711586 default :
15721587 /* for any other node type it's just unknown... */
15731588 loc = -1 ;
@@ -2275,6 +2290,8 @@ expression_tree_walker(Node *node,
22752290 return true;
22762291 }
22772292 break ;
2293+ case T_JsonCtorExpr :
2294+ return walker (((JsonCtorExpr * ) node )-> func , context );
22782295 default :
22792296 elog (ERROR , "unrecognized node type: %d" ,
22802297 (int ) nodeTag (node ));
@@ -3219,6 +3236,16 @@ expression_tree_mutator(Node *node,
32193236 MUTATE (newnode -> formatted_expr , jve -> formatted_expr , Expr * );
32203237 MUTATE (newnode -> format , jve -> format , JsonFormat * );
32213238
3239+ return (Node * ) newnode ;
3240+ }
3241+ case T_JsonCtorExpr :
3242+ {
3243+ JsonCtorExpr * jve = (JsonCtorExpr * ) node ;
3244+ JsonCtorExpr * newnode ;
3245+
3246+ FLATCOPY (newnode , jve , JsonCtorExpr );
3247+ MUTATE (newnode -> func , jve -> func , FuncExpr * );
3248+
32223249 return (Node * ) newnode ;
32233250 }
32243251 default :
@@ -3930,6 +3957,30 @@ raw_expression_tree_walker(Node *node,
39303957 return true;
39313958 }
39323959 break ;
3960+ case T_JsonCtorExpr :
3961+ return walker (((JsonCtorExpr * ) node )-> func , context );
3962+ case T_JsonOutput :
3963+ return walker (((JsonOutput * ) node )-> typeName , context );
3964+ case T_JsonKeyValue :
3965+ {
3966+ JsonKeyValue * jkv = (JsonKeyValue * ) node ;
3967+
3968+ if (walker (jkv -> key , context ))
3969+ return true;
3970+ if (walker (jkv -> value , context ))
3971+ return true;
3972+ }
3973+ break ;
3974+ case T_JsonObjectCtor :
3975+ {
3976+ JsonObjectCtor * joc = (JsonObjectCtor * ) node ;
3977+
3978+ if (walker (joc -> output , context ))
3979+ return true;
3980+ if (walker (joc -> exprs , context ))
3981+ return true;
3982+ }
3983+ break ;
39333984 default :
39343985 elog (ERROR , "unrecognized node type: %d" ,
39353986 (int ) nodeTag (node ));
0 commit comments