@@ -1422,15 +1422,18 @@ invoke_init_callback_internal(init_callback_params *cb_params)
1422
1422
{
1423
1423
#define JSB_INIT_VAL (value , val_type , val_cstring ) \
1424
1424
do { \
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
+ \
1434
1437
pushJsonbValue(&jsonb_state, val_type, (value)); \
1435
1438
} while (0)
1436
1439
@@ -1445,6 +1448,12 @@ invoke_init_callback_internal(init_callback_params *cb_params)
1445
1448
key ,
1446
1449
val ;
1447
1450
1451
+ char * parent_name ,
1452
+ * parent_namespace ,
1453
+ * partition_name ,
1454
+ * partition_namespace ;
1455
+
1456
+
1448
1457
/* Fetch & cache callback's Oid if needed */
1449
1458
if (!cb_params -> callback_is_cached )
1450
1459
{
@@ -1472,8 +1481,10 @@ invoke_init_callback_internal(init_callback_params *cb_params)
1472
1481
errmsg ("callback function \"%s\" does not exist" ,
1473
1482
TextDatumGetCString (init_cb_datum ))));
1474
1483
}
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 */
1477
1488
cb_params -> callback_is_cached = true;
1478
1489
}
1479
1490
}
@@ -1485,6 +1496,12 @@ invoke_init_callback_internal(init_callback_params *cb_params)
1485
1496
/* Validate the callback's signature */
1486
1497
validate_part_callback (cb_params -> callback , true);
1487
1498
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
+
1488
1505
/* Generate JSONB we're going to pass to callback */
1489
1506
switch (cb_params -> parttype )
1490
1507
{
@@ -1493,13 +1510,13 @@ invoke_init_callback_internal(init_callback_params *cb_params)
1493
1510
pushJsonbValue (& jsonb_state , WJB_BEGIN_OBJECT , NULL );
1494
1511
1495
1512
JSB_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 );
1497
1514
JSB_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 );
1499
1516
JSB_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 );
1501
1518
JSB_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 );
1503
1520
JSB_INIT_VAL (& key , WJB_KEY , "parttype" );
1504
1521
JSB_INIT_VAL (& val , WJB_VALUE , PartTypeToCString (PT_HASH ));
1505
1522
@@ -1509,46 +1526,40 @@ invoke_init_callback_internal(init_callback_params *cb_params)
1509
1526
1510
1527
case PT_RANGE :
1511
1528
{
1512
- char * start_value ,
1513
- * end_value ;
1529
+ char * start_value = NULL ,
1530
+ * end_value = NULL ;
1514
1531
Bound sv_datum = cb_params -> params .range_params .start_value ,
1515
1532
ev_datum = cb_params -> params .range_params .end_value ;
1516
1533
Oid type = cb_params -> params .range_params .value_type ;
1517
1534
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
+
1518
1543
pushJsonbValue (& jsonb_state , WJB_BEGIN_OBJECT , NULL );
1519
1544
1520
1545
JSB_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 );
1522
1547
JSB_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 );
1524
1549
JSB_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 );
1526
1551
JSB_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 );
1528
1553
JSB_INIT_VAL (& key , WJB_KEY , "parttype" );
1529
1554
JSB_INIT_VAL (& val , WJB_VALUE , PartTypeToCString (PT_RANGE ));
1530
1555
1531
1556
/* Lower bound */
1532
1557
JSB_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 );
1541
1559
1542
1560
/* Upper bound */
1543
1561
JSB_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 );
1552
1563
1553
1564
result = pushJsonbValue (& jsonb_state , WJB_END_OBJECT , NULL );
1554
1565
}
0 commit comments