@@ -1422,15 +1422,18 @@ invoke_init_callback_internal(init_callback_params *cb_params)
14221422{
14231423#define JSB_INIT_VAL (value ,val_type ,val_cstring ) \
14241424do { \
1425- (value)->type = jbvString; \
1426- (value)->val.string.len = strlen(val_cstring); \
1427- (value)->val.string.val = val_cstring; \
1428- pushJsonbValue(&jsonb_state, val_type, (value)); \
1429- } while (0)
1430-
1431- #define JSB_INIT_NULL_VAL (value ,val_type )\
1432- do {\
1433- (value)->type = jbvNull;\
1425+ if ((val_cstring) != NULL) \
1426+ { \
1427+ (value)->type = jbvString; \
1428+ (value)->val.string.len = strlen(val_cstring); \
1429+ (value)->val.string.val = val_cstring; \
1430+ } \
1431+ else \
1432+ { \
1433+ (value)->type = jbvNull; \
1434+ Assert((val_type) != WJB_KEY); \
1435+ } \
1436+ \
14341437pushJsonbValue(&jsonb_state, val_type, (value)); \
14351438} while (0)
14361439
@@ -1445,6 +1448,12 @@ invoke_init_callback_internal(init_callback_params *cb_params)
14451448key ,
14461449val ;
14471450
1451+ char * parent_name ,
1452+ * parent_namespace ,
1453+ * partition_name ,
1454+ * partition_namespace ;
1455+
1456+
14481457/* Fetch & cache callback's Oid if needed */
14491458if (!cb_params -> callback_is_cached )
14501459{
@@ -1472,8 +1481,10 @@ invoke_init_callback_internal(init_callback_params *cb_params)
14721481errmsg ("callback function \"%s\" does not exist" ,
14731482TextDatumGetCString (init_cb_datum ))));
14741483}
1475- else
1476- cb_params -> callback = InvalidOid ;
1484+ /* There's no callback */
1485+ else cb_params -> callback = InvalidOid ;
1486+
1487+ /* We've made a lookup */
14771488cb_params -> callback_is_cached = true;
14781489}
14791490}
@@ -1485,6 +1496,12 @@ invoke_init_callback_internal(init_callback_params *cb_params)
14851496/* Validate the callback's signature */
14861497validate_part_callback (cb_params -> callback , true);
14871498
1499+ parent_name = get_rel_name (parent_oid );
1500+ parent_namespace = get_namespace_name (get_rel_namespace (parent_oid ));
1501+
1502+ partition_name = get_rel_name (partition_oid );
1503+ partition_namespace = get_namespace_name (get_rel_namespace (partition_oid ));
1504+
14881505/* Generate JSONB we're going to pass to callback */
14891506switch (cb_params -> parttype )
14901507{
@@ -1493,13 +1510,13 @@ invoke_init_callback_internal(init_callback_params *cb_params)
14931510pushJsonbValue (& jsonb_state ,WJB_BEGIN_OBJECT ,NULL );
14941511
14951512JSB_INIT_VAL (& key ,WJB_KEY ,"parent" );
1496- JSB_INIT_VAL (& val ,WJB_VALUE ,get_rel_name_or_relid ( parent_oid ) );
1513+ JSB_INIT_VAL (& val ,WJB_VALUE ,parent_name );
14971514JSB_INIT_VAL (& key ,WJB_KEY ,"parent_schema" );
1498- JSB_INIT_VAL (& val ,WJB_VALUE ,get_namespace_name ( get_rel_namespace ( parent_oid )) );
1515+ JSB_INIT_VAL (& val ,WJB_VALUE ,parent_namespace );
14991516JSB_INIT_VAL (& key ,WJB_KEY ,"partition" );
1500- JSB_INIT_VAL (& val ,WJB_VALUE ,get_rel_name_or_relid ( partition_oid ) );
1517+ JSB_INIT_VAL (& val ,WJB_VALUE ,partition_name );
15011518JSB_INIT_VAL (& key ,WJB_KEY ,"partition_schema" );
1502- JSB_INIT_VAL (& val ,WJB_VALUE ,get_namespace_name ( get_rel_namespace ( partition_oid )) );
1519+ JSB_INIT_VAL (& val ,WJB_VALUE ,partition_namespace );
15031520JSB_INIT_VAL (& key ,WJB_KEY ,"parttype" );
15041521JSB_INIT_VAL (& val ,WJB_VALUE ,PartTypeToCString (PT_HASH ));
15051522
@@ -1509,46 +1526,40 @@ invoke_init_callback_internal(init_callback_params *cb_params)
15091526
15101527case PT_RANGE :
15111528{
1512- char * start_value ,
1513- * end_value ;
1529+ char * start_value = NULL ,
1530+ * end_value = NULL ;
15141531Bound sv_datum = cb_params -> params .range_params .start_value ,
15151532ev_datum = cb_params -> params .range_params .end_value ;
15161533Oid type = cb_params -> params .range_params .value_type ;
15171534
1535+ /* Convert min to CSTRING */
1536+ if (!IsInfinite (& sv_datum ))
1537+ start_value = datum_to_cstring (BoundGetValue (& sv_datum ),type );
1538+
1539+ /* Convert max to CSTRING */
1540+ if (!IsInfinite (& ev_datum ))
1541+ end_value = datum_to_cstring (BoundGetValue (& ev_datum ),type );
1542+
15181543pushJsonbValue (& jsonb_state ,WJB_BEGIN_OBJECT ,NULL );
15191544
15201545JSB_INIT_VAL (& key ,WJB_KEY ,"parent" );
1521- JSB_INIT_VAL (& val ,WJB_VALUE ,get_rel_name_or_relid ( parent_oid ) );
1546+ JSB_INIT_VAL (& val ,WJB_VALUE ,parent_name );
15221547JSB_INIT_VAL (& key ,WJB_KEY ,"parent_schema" );
1523- JSB_INIT_VAL (& val ,WJB_VALUE ,get_namespace_name ( get_rel_namespace ( parent_oid )) );
1548+ JSB_INIT_VAL (& val ,WJB_VALUE ,parent_namespace );
15241549JSB_INIT_VAL (& key ,WJB_KEY ,"partition" );
1525- JSB_INIT_VAL (& val ,WJB_VALUE ,get_rel_name_or_relid ( partition_oid ) );
1550+ JSB_INIT_VAL (& val ,WJB_VALUE ,partition_name );
15261551JSB_INIT_VAL (& key ,WJB_KEY ,"partition_schema" );
1527- JSB_INIT_VAL (& val ,WJB_VALUE ,get_namespace_name ( get_rel_namespace ( partition_oid )) );
1552+ JSB_INIT_VAL (& val ,WJB_VALUE ,partition_namespace );
15281553JSB_INIT_VAL (& key ,WJB_KEY ,"parttype" );
15291554JSB_INIT_VAL (& val ,WJB_VALUE ,PartTypeToCString (PT_RANGE ));
15301555
15311556/* Lower bound */
15321557JSB_INIT_VAL (& key ,WJB_KEY ,"range_min" );
1533- if (!IsInfinite (& sv_datum ))
1534- {
1535- /* Convert min to CSTRING */
1536- start_value = datum_to_cstring (BoundGetValue (& sv_datum ),type );
1537- JSB_INIT_VAL (& val ,WJB_VALUE ,start_value );
1538- }
1539- else
1540- JSB_INIT_NULL_VAL (& val ,WJB_VALUE );
1558+ JSB_INIT_VAL (& val ,WJB_VALUE ,start_value );
15411559
15421560/* Upper bound */
15431561JSB_INIT_VAL (& key ,WJB_KEY ,"range_max" );
1544- if (!IsInfinite (& ev_datum ))
1545- {
1546- /* Convert max to CSTRING */
1547- end_value = datum_to_cstring (BoundGetValue (& ev_datum ),type );
1548- JSB_INIT_VAL (& val ,WJB_VALUE ,end_value );
1549- }
1550- else
1551- JSB_INIT_NULL_VAL (& val ,WJB_VALUE );
1562+ JSB_INIT_VAL (& val ,WJB_VALUE ,end_value );
15521563
15531564result = pushJsonbValue (& jsonb_state ,WJB_END_OBJECT ,NULL );
15541565}