@@ -250,6 +250,13 @@ exprType(const Node *expr)
250
250
case T_PlaceHolderVar :
251
251
type = exprType ((Node * ) ((const PlaceHolderVar * ) expr )-> phexpr );
252
252
break ;
253
+ case T_JsonValueExpr :
254
+ {
255
+ const JsonValueExpr * jve = (const JsonValueExpr * ) expr ;
256
+
257
+ type = exprType ((Node * ) (jve -> formatted_expr ? jve -> formatted_expr : jve -> raw_expr ));
258
+ }
259
+ break ;
253
260
default :
254
261
elog (ERROR , "unrecognized node type: %d" , (int ) nodeTag (expr ));
255
262
type = InvalidOid ; /* keep compiler quiet */
@@ -482,6 +489,8 @@ exprTypmod(const Node *expr)
482
489
return ((const SetToDefault * ) expr )-> typeMod ;
483
490
case T_PlaceHolderVar :
484
491
return exprTypmod ((Node * ) ((const PlaceHolderVar * ) expr )-> phexpr );
492
+ case T_JsonValueExpr :
493
+ return exprTypmod ((Node * ) ((const JsonValueExpr * ) expr )-> formatted_expr );
485
494
default :
486
495
break ;
487
496
}
@@ -958,6 +967,9 @@ exprCollation(const Node *expr)
958
967
case T_PlaceHolderVar :
959
968
coll = exprCollation ((Node * ) ((const PlaceHolderVar * ) expr )-> phexpr );
960
969
break ;
970
+ case T_JsonValueExpr :
971
+ coll = exprCollation ((Node * ) ((const JsonValueExpr * ) expr )-> formatted_expr );
972
+ break ;
961
973
default :
962
974
elog (ERROR , "unrecognized node type: %d" , (int ) nodeTag (expr ));
963
975
coll = InvalidOid ; /* keep compiler quiet */
@@ -1170,6 +1182,10 @@ exprSetCollation(Node *expr, Oid collation)
1170
1182
/* NextValueExpr's result is an integer type ... */
1171
1183
Assert (!OidIsValid (collation )); /* ... so never set a collation */
1172
1184
break ;
1185
+ case T_JsonValueExpr :
1186
+ exprSetCollation ((Node * ) ((JsonValueExpr * ) expr )-> formatted_expr ,
1187
+ collation );
1188
+ break ;
1173
1189
default :
1174
1190
elog (ERROR , "unrecognized node type: %d" , (int ) nodeTag (expr ));
1175
1191
break ;
@@ -1616,6 +1632,9 @@ exprLocation(const Node *expr)
1616
1632
case T_PartitionRangeDatum :
1617
1633
loc = ((const PartitionRangeDatum * ) expr )-> location ;
1618
1634
break ;
1635
+ case T_JsonValueExpr :
1636
+ loc = exprLocation ((Node * ) ((const JsonValueExpr * ) expr )-> raw_expr );
1637
+ break ;
1619
1638
default :
1620
1639
/* for any other node type it's just unknown... */
1621
1640
loc = -1 ;
@@ -2350,6 +2369,16 @@ expression_tree_walker(Node *node,
2350
2369
return true;
2351
2370
}
2352
2371
break ;
2372
+ case T_JsonValueExpr :
2373
+ {
2374
+ JsonValueExpr * jve = (JsonValueExpr * ) node ;
2375
+
2376
+ if (walker (jve -> raw_expr , context ))
2377
+ return true;
2378
+ if (walker (jve -> formatted_expr , context ))
2379
+ return true;
2380
+ }
2381
+ break ;
2353
2382
default :
2354
2383
elog (ERROR , "unrecognized node type: %d" ,
2355
2384
(int ) nodeTag (node ));
@@ -2680,6 +2709,7 @@ expression_tree_mutator(Node *node,
2680
2709
case T_RangeTblRef :
2681
2710
case T_SortGroupClause :
2682
2711
case T_CTESearchClause :
2712
+ case T_JsonFormat :
2683
2713
return (Node * ) copyObject (node );
2684
2714
case T_WithCheckOption :
2685
2715
{
@@ -3311,6 +3341,28 @@ expression_tree_mutator(Node *node,
3311
3341
return (Node * ) newnode ;
3312
3342
}
3313
3343
break ;
3344
+ case T_JsonReturning :
3345
+ {
3346
+ JsonReturning * jr = (JsonReturning * ) node ;
3347
+ JsonReturning * newnode ;
3348
+
3349
+ FLATCOPY (newnode , jr , JsonReturning );
3350
+ MUTATE (newnode -> format , jr -> format , JsonFormat * );
3351
+
3352
+ return (Node * ) newnode ;
3353
+ }
3354
+ case T_JsonValueExpr :
3355
+ {
3356
+ JsonValueExpr * jve = (JsonValueExpr * ) node ;
3357
+ JsonValueExpr * newnode ;
3358
+
3359
+ FLATCOPY (newnode , jve , JsonValueExpr );
3360
+ MUTATE (newnode -> raw_expr , jve -> raw_expr , Expr * );
3361
+ MUTATE (newnode -> formatted_expr , jve -> formatted_expr , Expr * );
3362
+ MUTATE (newnode -> format , jve -> format , JsonFormat * );
3363
+
3364
+ return (Node * ) newnode ;
3365
+ }
3314
3366
default :
3315
3367
elog (ERROR , "unrecognized node type: %d" ,
3316
3368
(int ) nodeTag (node ));
@@ -4019,6 +4071,20 @@ raw_expression_tree_walker(Node *node,
4019
4071
case T_CommonTableExpr :
4020
4072
/* search_clause and cycle_clause are not interesting here */
4021
4073
return walker (((CommonTableExpr * ) node )-> ctequery , context );
4074
+ case T_JsonReturning :
4075
+ return walker (((JsonReturning * ) node )-> format , context );
4076
+ case T_JsonValueExpr :
4077
+ {
4078
+ JsonValueExpr * jve = (JsonValueExpr * ) node ;
4079
+
4080
+ if (walker (jve -> raw_expr , context ))
4081
+ return true;
4082
+ if (walker (jve -> formatted_expr , context ))
4083
+ return true;
4084
+ if (walker (jve -> format , context ))
4085
+ return true;
4086
+ }
4087
+ break ;
4022
4088
default :
4023
4089
elog (ERROR , "unrecognized node type: %d" ,
4024
4090
(int ) nodeTag (node ));
0 commit comments