@ -218,6 +218,21 @@ exprType(const Node *expr)
else
type = XMLOID ;
break ;
case T_JsonValueExpr :
{
const JsonValueExpr * jve = ( const JsonValueExpr * ) expr ;
type = exprType ( ( Node * )
( jve - > formatted_expr ? jve - > formatted_expr :
jve - > raw_expr ) ) ;
}
break ;
case T_JsonConstructorExpr :
type = ( ( const JsonConstructorExpr * ) expr ) - > returning - > typid ;
break ;
case T_JsonIsPredicate :
type = BOOLOID ;
break ;
case T_NullTest :
type = BOOLOID ;
break ;
@ -249,21 +264,6 @@ exprType(const Node *expr)
case T_PlaceHolderVar :
type = exprType ( ( Node * ) ( ( const PlaceHolderVar * ) expr ) - > phexpr ) ;
break ;
case T_JsonValueExpr :
{
const JsonValueExpr * jve = ( const JsonValueExpr * ) expr ;
type = exprType ( ( Node * )
( jve - > formatted_expr ? jve - > formatted_expr :
jve - > raw_expr ) ) ;
}
break ;
case T_JsonConstructorExpr :
type = ( ( const JsonConstructorExpr * ) expr ) - > returning - > typid ;
break ;
case T_JsonIsPredicate :
type = BOOLOID ;
break ;
default :
elog ( ERROR , " unrecognized node type: %d " , ( int ) nodeTag ( expr ) ) ;
type = InvalidOid ; /* keep compiler quiet */
@ -486,6 +486,10 @@ exprTypmod(const Node *expr)
return typmod ;
}
break ;
case T_JsonValueExpr :
return exprTypmod ( ( Node * ) ( ( const JsonValueExpr * ) expr ) - > formatted_expr ) ;
case T_JsonConstructorExpr :
return ( ( const JsonConstructorExpr * ) expr ) - > returning - > typmod ;
case T_CoerceToDomain :
return ( ( const CoerceToDomain * ) expr ) - > resulttypmod ;
case T_CoerceToDomainValue :
@ -494,10 +498,6 @@ exprTypmod(const Node *expr)
return ( ( const SetToDefault * ) expr ) - > typeMod ;
case T_PlaceHolderVar :
return exprTypmod ( ( Node * ) ( ( const PlaceHolderVar * ) expr ) - > phexpr ) ;
case T_JsonValueExpr :
return exprTypmod ( ( Node * ) ( ( const JsonValueExpr * ) expr ) - > formatted_expr ) ;
case T_JsonConstructorExpr :
return - 1 ; /* XXX maybe expr->returning->typmod? */
default :
break ;
}
@ -942,6 +942,23 @@ exprCollation(const Node *expr)
else
coll = InvalidOid ;
break ;
case T_JsonValueExpr :
coll = exprCollation ( ( Node * ) ( ( const JsonValueExpr * ) expr ) - > formatted_expr ) ;
break ;
case T_JsonConstructorExpr :
{
const JsonConstructorExpr * ctor = ( const JsonConstructorExpr * ) expr ;
if ( ctor - > coercion )
coll = exprCollation ( ( Node * ) ctor - > coercion ) ;
else
coll = InvalidOid ;
}
break ;
case T_JsonIsPredicate :
/* IS JSON's result is boolean ... */
coll = InvalidOid ; /* ... so it has no collation */
break ;
case T_NullTest :
/* NullTest's result is boolean ... */
coll = InvalidOid ; /* ... so it has no collation */
@ -973,22 +990,6 @@ exprCollation(const Node *expr)
case T_PlaceHolderVar :
coll = exprCollation ( ( Node * ) ( ( const PlaceHolderVar * ) expr ) - > phexpr ) ;
break ;
case T_JsonValueExpr :
coll = exprCollation ( ( Node * ) ( ( const JsonValueExpr * ) expr ) - > formatted_expr ) ;
break ;
case T_JsonConstructorExpr :
{
const JsonConstructorExpr * ctor = ( const JsonConstructorExpr * ) expr ;
if ( ctor - > coercion )
coll = exprCollation ( ( Node * ) ctor - > coercion ) ;
else
coll = InvalidOid ;
}
break ;
case T_JsonIsPredicate :
coll = InvalidOid ; /* result is always an boolean type */
break ;
default :
elog ( ERROR , " unrecognized node type: %d " , ( int ) nodeTag ( expr ) ) ;
coll = InvalidOid ; /* keep compiler quiet */
@ -1171,6 +1172,24 @@ exprSetCollation(Node *expr, Oid collation)
( collation = = DEFAULT_COLLATION_OID ) :
( collation = = InvalidOid ) ) ;
break ;
case T_JsonValueExpr :
exprSetCollation ( ( Node * ) ( ( JsonValueExpr * ) expr ) - > formatted_expr ,
collation ) ;
break ;
case T_JsonConstructorExpr :
{
JsonConstructorExpr * ctor = ( JsonConstructorExpr * ) expr ;
if ( ctor - > coercion )
exprSetCollation ( ( Node * ) ctor - > coercion , collation ) ;
else
Assert ( ! OidIsValid ( collation ) ) ; /* result is always a
* json [ b ] type */
}
break ;
case T_JsonIsPredicate :
Assert ( ! OidIsValid ( collation ) ) ; /* result is always boolean */
break ;
case T_NullTest :
/* NullTest's result is boolean ... */
Assert ( ! OidIsValid ( collation ) ) ; /* ... so never set a collation */
@ -1196,24 +1215,6 @@ exprSetCollation(Node *expr, Oid collation)
/* NextValueExpr's result is an integer type ... */
Assert ( ! OidIsValid ( collation ) ) ; /* ... so never set a collation */
break ;
case T_JsonValueExpr :
exprSetCollation ( ( Node * ) ( ( JsonValueExpr * ) expr ) - > formatted_expr ,
collation ) ;
break ;
case T_JsonConstructorExpr :
{
JsonConstructorExpr * ctor = ( JsonConstructorExpr * ) expr ;
if ( ctor - > coercion )
exprSetCollation ( ( Node * ) ctor - > coercion , collation ) ;
else
Assert ( ! OidIsValid ( collation ) ) ; /* result is always a
* json [ b ] type */
}
break ;
case T_JsonIsPredicate :
Assert ( ! OidIsValid ( collation ) ) ; /* result is always boolean */
break ;
default :
elog ( ERROR , " unrecognized node type: %d " , ( int ) nodeTag ( expr ) ) ;
break ;
@ -1476,6 +1477,18 @@ exprLocation(const Node *expr)
exprLocation ( ( Node * ) xexpr - > args ) ) ;
}
break ;
case T_JsonFormat :
loc = ( ( const JsonFormat * ) expr ) - > location ;
break ;
case T_JsonValueExpr :
loc = exprLocation ( ( Node * ) ( ( const JsonValueExpr * ) expr ) - > raw_expr ) ;
break ;
case T_JsonConstructorExpr :
loc = ( ( const JsonConstructorExpr * ) expr ) - > location ;
break ;
case T_JsonIsPredicate :
loc = ( ( const JsonIsPredicate * ) expr ) - > location ;
break ;
case T_NullTest :
{
const NullTest * nexpr = ( const NullTest * ) expr ;
@ -1636,6 +1649,28 @@ exprLocation(const Node *expr)
case T_CommonTableExpr :
loc = ( ( const CommonTableExpr * ) expr ) - > location ;
break ;
case T_JsonKeyValue :
/* just use the key's location */
loc = exprLocation ( ( Node * ) ( ( const JsonKeyValue * ) expr ) - > key ) ;
break ;
case T_JsonObjectConstructor :
loc = ( ( const JsonObjectConstructor * ) expr ) - > location ;
break ;
case T_JsonArrayConstructor :
loc = ( ( const JsonArrayConstructor * ) expr ) - > location ;
break ;
case T_JsonArrayQueryConstructor :
loc = ( ( const JsonArrayQueryConstructor * ) expr ) - > location ;
break ;
case T_JsonAggConstructor :
loc = ( ( const JsonAggConstructor * ) expr ) - > location ;
break ;
case T_JsonObjectAgg :
loc = exprLocation ( ( Node * ) ( ( const JsonObjectAgg * ) expr ) - > constructor ) ;
break ;
case T_JsonArrayAgg :
loc = exprLocation ( ( Node * ) ( ( const JsonArrayAgg * ) expr ) - > constructor ) ;
break ;
case T_PlaceHolderVar :
/* just use argument's location */
loc = exprLocation ( ( Node * ) ( ( const PlaceHolderVar * ) expr ) - > phexpr ) ;
@ -1656,15 +1691,6 @@ exprLocation(const Node *expr)
case T_PartitionRangeDatum :
loc = ( ( const PartitionRangeDatum * ) expr ) - > location ;
break ;
case T_JsonValueExpr :
loc = exprLocation ( ( Node * ) ( ( const JsonValueExpr * ) expr ) - > raw_expr ) ;
break ;
case T_JsonConstructorExpr :
loc = ( ( const JsonConstructorExpr * ) expr ) - > location ;
break ;
case T_JsonIsPredicate :
loc = ( ( const JsonIsPredicate * ) expr ) - > location ;
break ;
default :
/* for any other node type it's just unknown... */
loc = - 1 ;
@ -2190,6 +2216,30 @@ expression_tree_walker_impl(Node *node,
return true ;
}
break ;
case T_JsonValueExpr :
{
JsonValueExpr * jve = ( JsonValueExpr * ) node ;
if ( WALK ( jve - > raw_expr ) )
return true ;
if ( WALK ( jve - > formatted_expr ) )
return true ;
}
break ;
case T_JsonConstructorExpr :
{
JsonConstructorExpr * ctor = ( JsonConstructorExpr * ) node ;
if ( WALK ( ctor - > args ) )
return true ;
if ( WALK ( ctor - > func ) )
return true ;
if ( WALK ( ctor - > coercion ) )
return true ;
}
break ;
case T_JsonIsPredicate :
return WALK ( ( ( JsonIsPredicate * ) node ) - > expr ) ;
case T_NullTest :
return WALK ( ( ( NullTest * ) node ) - > arg ) ;
case T_BooleanTest :
@ -2242,6 +2292,73 @@ expression_tree_walker_impl(Node *node,
return true ;
}
break ;
case T_JsonKeyValue :
{
JsonKeyValue * kv = ( JsonKeyValue * ) node ;
if ( WALK ( kv - > key ) )
return true ;
if ( WALK ( kv - > value ) )
return true ;
}
break ;
case T_JsonObjectConstructor :
{
JsonObjectConstructor * ctor = ( JsonObjectConstructor * ) node ;
if ( LIST_WALK ( ctor - > exprs ) )
return true ;
}
break ;
case T_JsonArrayConstructor :
{
JsonArrayConstructor * ctor = ( JsonArrayConstructor * ) node ;
if ( LIST_WALK ( ctor - > exprs ) )
return true ;
}
break ;
case T_JsonArrayQueryConstructor :
{
JsonArrayQueryConstructor * ctor = ( JsonArrayQueryConstructor * ) node ;
if ( WALK ( ctor - > query ) )
return true ;
}
break ;
case T_JsonAggConstructor :
{
JsonAggConstructor * ctor = ( JsonAggConstructor * ) node ;
if ( WALK ( ctor - > agg_filter ) )
return true ;
if ( WALK ( ctor - > agg_order ) )
return true ;
if ( WALK ( ctor - > over ) )
return true ;
}
break ;
case T_JsonObjectAgg :
{
JsonObjectAgg * ctor = ( JsonObjectAgg * ) node ;
if ( WALK ( ctor - > constructor ) )
return true ;
if ( WALK ( ctor - > arg ) )
return true ;
}
break ;
case T_JsonArrayAgg :
{
JsonArrayAgg * ctor = ( JsonArrayAgg * ) node ;
if ( WALK ( ctor - > constructor ) )
return true ;
if ( WALK ( ctor - > arg ) )
return true ;
}
break ;
case T_PartitionBoundSpec :
{
PartitionBoundSpec * pbs = ( PartitionBoundSpec * ) node ;
@ -2396,30 +2513,6 @@ expression_tree_walker_impl(Node *node,
return true ;
}
break ;
case T_JsonValueExpr :
{
JsonValueExpr * jve = ( JsonValueExpr * ) node ;
if ( WALK ( jve - > raw_expr ) )
return true ;
if ( WALK ( jve - > formatted_expr ) )
return true ;
}
break ;
case T_JsonConstructorExpr :
{
JsonConstructorExpr * ctor = ( JsonConstructorExpr * ) node ;
if ( WALK ( ctor - > args ) )
return true ;
if ( WALK ( ctor - > func ) )
return true ;
if ( WALK ( ctor - > coercion ) )
return true ;
}
break ;
case T_JsonIsPredicate :
return walker ( ( ( JsonIsPredicate * ) node ) - > expr , context ) ;
default :
elog ( ERROR , " unrecognized node type: %d " ,
( int ) nodeTag ( node ) ) ;
@ -2743,6 +2836,7 @@ expression_tree_mutator_impl(Node *node,
break ;
case T_Param :
case T_CaseTestExpr :
case T_JsonFormat :
case T_CoerceToDomainValue :
case T_SetToDefault :
case T_CurrentOfExpr :
@ -2750,7 +2844,6 @@ expression_tree_mutator_impl(Node *node,
case T_RangeTblRef :
case T_SortGroupClause :
case T_CTESearchClause :
case T_JsonFormat :
return ( Node * ) copyObject ( node ) ;
case T_WithCheckOption :
{
@ -3099,6 +3192,52 @@ expression_tree_mutator_impl(Node *node,
return ( Node * ) newnode ;
}
break ;
case T_JsonReturning :
{
JsonReturning * jr = ( JsonReturning * ) node ;
JsonReturning * newnode ;
FLATCOPY ( newnode , jr , JsonReturning ) ;
MUTATE ( newnode - > format , jr - > format , JsonFormat * ) ;
return ( Node * ) newnode ;
}
case T_JsonValueExpr :
{
JsonValueExpr * jve = ( JsonValueExpr * ) node ;
JsonValueExpr * newnode ;
FLATCOPY ( newnode , jve , JsonValueExpr ) ;
MUTATE ( newnode - > raw_expr , jve - > raw_expr , Expr * ) ;
MUTATE ( newnode - > formatted_expr , jve - > formatted_expr , Expr * ) ;
MUTATE ( newnode - > format , jve - > format , JsonFormat * ) ;
return ( Node * ) newnode ;
}
case T_JsonConstructorExpr :
{
JsonConstructorExpr * jce = ( JsonConstructorExpr * ) node ;
JsonConstructorExpr * newnode ;
FLATCOPY ( newnode , jce , JsonConstructorExpr ) ;
MUTATE ( newnode - > args , jce - > args , List * ) ;
MUTATE ( newnode - > func , jce - > func , Expr * ) ;
MUTATE ( newnode - > coercion , jce - > coercion , Expr * ) ;
MUTATE ( newnode - > returning , jce - > returning , JsonReturning * ) ;
return ( Node * ) newnode ;
}
case T_JsonIsPredicate :
{
JsonIsPredicate * pred = ( JsonIsPredicate * ) node ;
JsonIsPredicate * newnode ;
FLATCOPY ( newnode , pred , JsonIsPredicate ) ;
MUTATE ( newnode - > expr , pred - > expr , Node * ) ;
MUTATE ( newnode - > format , pred - > format , JsonFormat * ) ;
return ( Node * ) newnode ;
}
case T_NullTest :
{
NullTest * ntest = ( NullTest * ) node ;
@ -3394,51 +3533,6 @@ expression_tree_mutator_impl(Node *node,
return ( Node * ) newnode ;
}
break ;
case T_JsonReturning :
{
JsonReturning * jr = ( JsonReturning * ) node ;
JsonReturning * newnode ;
FLATCOPY ( newnode , jr , JsonReturning ) ;
MUTATE ( newnode - > format , jr - > format , JsonFormat * ) ;
return ( Node * ) newnode ;
}
case T_JsonValueExpr :
{
JsonValueExpr * jve = ( JsonValueExpr * ) node ;
JsonValueExpr * newnode ;
FLATCOPY ( newnode , jve , JsonValueExpr ) ;
MUTATE ( newnode - > raw_expr , jve - > raw_expr , Expr * ) ;
MUTATE ( newnode - > formatted_expr , jve - > formatted_expr , Expr * ) ;
MUTATE ( newnode - > format , jve - > format , JsonFormat * ) ;
return ( Node * ) newnode ;
}
case T_JsonConstructorExpr :
{
JsonConstructorExpr * jve = ( JsonConstructorExpr * ) node ;
JsonConstructorExpr * newnode ;
FLATCOPY ( newnode , jve , JsonConstructorExpr ) ;
MUTATE ( newnode - > args , jve - > args , List * ) ;
MUTATE ( newnode - > func , jve - > func , Expr * ) ;
MUTATE ( newnode - > coercion , jve - > coercion , Expr * ) ;
MUTATE ( newnode - > returning , jve - > returning , JsonReturning * ) ;
return ( Node * ) newnode ;
}
case T_JsonIsPredicate :
{
JsonIsPredicate * pred = ( JsonIsPredicate * ) node ;
JsonIsPredicate * newnode ;
FLATCOPY ( newnode , pred , JsonIsPredicate ) ;
MUTATE ( newnode - > expr , pred - > expr , Node * ) ;
return ( Node * ) newnode ;
}
default :
elog ( ERROR , " unrecognized node type: %d " ,
( int ) nodeTag ( node ) ) ;
@ -3700,6 +3794,7 @@ raw_expression_tree_walker_impl(Node *node,
switch ( nodeTag ( node ) )
{
case T_JsonFormat :
case T_SetToDefault :
case T_CurrentOfExpr :
case T_Integer :
@ -3710,7 +3805,6 @@ raw_expression_tree_walker_impl(Node *node,
case T_ParamRef :
case T_A_Const :
case T_A_Star :
case T_JsonFormat :
/* primitive node types with no subnodes */
break ;
case T_Alias :
@ -3769,6 +3863,36 @@ raw_expression_tree_walker_impl(Node *node,
return true ;
}
break ;
case T_JsonReturning :
return WALK ( ( ( JsonReturning * ) node ) - > format ) ;
case T_JsonValueExpr :
{
JsonValueExpr * jve = ( JsonValueExpr * ) node ;
if ( WALK ( jve - > raw_expr ) )
return true ;
if ( WALK ( jve - > formatted_expr ) )
return true ;
if ( WALK ( jve - > format ) )
return true ;
}
break ;
case T_JsonConstructorExpr :
{
JsonConstructorExpr * ctor = ( JsonConstructorExpr * ) node ;
if ( WALK ( ctor - > args ) )
return true ;
if ( WALK ( ctor - > func ) )
return true ;
if ( WALK ( ctor - > coercion ) )
return true ;
if ( WALK ( ctor - > returning ) )
return true ;
}
break ;
case T_JsonIsPredicate :
return WALK ( ( ( JsonIsPredicate * ) node ) - > expr ) ;
case T_NullTest :
return WALK ( ( ( NullTest * ) node ) - > arg ) ;
case T_BooleanTest :
@ -4173,34 +4297,6 @@ raw_expression_tree_walker_impl(Node *node,
case T_CommonTableExpr :
/* search_clause and cycle_clause are not interesting here */
return WALK ( ( ( CommonTableExpr * ) node ) - > ctequery ) ;
case T_JsonReturning :
return WALK ( ( ( JsonReturning * ) node ) - > format ) ;
case T_JsonValueExpr :
{
JsonValueExpr * jve = ( JsonValueExpr * ) node ;
if ( WALK ( jve - > raw_expr ) )
return true ;
if ( WALK ( jve - > formatted_expr ) )
return true ;
if ( WALK ( jve - > format ) )
return true ;
}
break ;
case T_JsonConstructorExpr :
{
JsonConstructorExpr * ctor = ( JsonConstructorExpr * ) node ;
if ( WALK ( ctor - > args ) )
return true ;
if ( WALK ( ctor - > func ) )
return true ;
if ( WALK ( ctor - > coercion ) )
return true ;
if ( WALK ( ctor - > returning ) )
return true ;
}
break ;
case T_JsonOutput :
{
JsonOutput * out = ( JsonOutput * ) node ;
@ -4285,8 +4381,6 @@ raw_expression_tree_walker_impl(Node *node,
return true ;
}
break ;
case T_JsonIsPredicate :
return walker ( ( ( JsonIsPredicate * ) node ) - > expr , context ) ;
default :
elog ( ERROR , " unrecognized node type: %d " ,
( int ) nodeTag ( node ) ) ;