@@ -270,7 +270,8 @@ create_partitions_for_value(Oid relid, Datum value, Oid value_type)
270
270
elog (DEBUG2 ,"create_partitions(): chose backend [%u]" ,MyProcPid );
271
271
last_partition = create_partitions_for_value_internal (relid ,
272
272
value ,
273
- value_type );
273
+ value_type ,
274
+ false);/* backend */
274
275
}
275
276
}
276
277
else
@@ -299,7 +300,8 @@ create_partitions_for_value(Oid relid, Datum value, Oid value_type)
299
300
* use create_partitions_for_value() instead.
300
301
*/
301
302
Oid
302
- create_partitions_for_value_internal (Oid relid ,Datum value ,Oid value_type )
303
+ create_partitions_for_value_internal (Oid relid ,Datum value ,Oid value_type ,
304
+ bool is_background_worker )
303
305
{
304
306
MemoryContext old_mcxt = CurrentMemoryContext ;
305
307
Oid partid = InvalidOid ;/* last created partition (or InvalidOid) */
@@ -405,7 +407,7 @@ create_partitions_for_value_internal(Oid relid, Datum value, Oid value_type)
405
407
ErrorData * edata ;
406
408
407
409
/* Simply rethrow ERROR if we're in backend */
408
- if (!IsBackgroundWorker )
410
+ if (!is_background_worker )
409
411
PG_RE_THROW ();
410
412
411
413
/* Switch to the original context & copy edata */
@@ -1422,15 +1424,18 @@ invoke_init_callback_internal(init_callback_params *cb_params)
1422
1424
{
1423
1425
#define JSB_INIT_VAL (value ,val_type ,val_cstring ) \
1424
1426
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;\
1427
+ if ((val_cstring) != NULL) \
1428
+ { \
1429
+ (value)->type = jbvString; \
1430
+ (value)->val.string.len = strlen(val_cstring); \
1431
+ (value)->val.string.val = val_cstring; \
1432
+ } \
1433
+ else \
1434
+ { \
1435
+ (value)->type = jbvNull; \
1436
+ Assert((val_type) != WJB_KEY); \
1437
+ } \
1438
+ \
1434
1439
pushJsonbValue(&jsonb_state, val_type, (value)); \
1435
1440
} while (0)
1436
1441
@@ -1445,6 +1450,12 @@ invoke_init_callback_internal(init_callback_params *cb_params)
1445
1450
key ,
1446
1451
val ;
1447
1452
1453
+ char * parent_name ,
1454
+ * parent_namespace ,
1455
+ * partition_name ,
1456
+ * partition_namespace ;
1457
+
1458
+
1448
1459
/* Fetch & cache callback's Oid if needed */
1449
1460
if (!cb_params -> callback_is_cached )
1450
1461
{
@@ -1472,8 +1483,10 @@ invoke_init_callback_internal(init_callback_params *cb_params)
1472
1483
errmsg ("callback function \"%s\" does not exist" ,
1473
1484
TextDatumGetCString (init_cb_datum ))));
1474
1485
}
1475
- else
1476
- cb_params -> callback = InvalidOid ;
1486
+ /* There's no callback */
1487
+ else cb_params -> callback = InvalidOid ;
1488
+
1489
+ /* We've made a lookup */
1477
1490
cb_params -> callback_is_cached = true;
1478
1491
}
1479
1492
}
@@ -1485,6 +1498,12 @@ invoke_init_callback_internal(init_callback_params *cb_params)
1485
1498
/* Validate the callback's signature */
1486
1499
validate_part_callback (cb_params -> callback , true);
1487
1500
1501
+ parent_name = get_rel_name (parent_oid );
1502
+ parent_namespace = get_namespace_name (get_rel_namespace (parent_oid ));
1503
+
1504
+ partition_name = get_rel_name (partition_oid );
1505
+ partition_namespace = get_namespace_name (get_rel_namespace (partition_oid ));
1506
+
1488
1507
/* Generate JSONB we're going to pass to callback */
1489
1508
switch (cb_params -> parttype )
1490
1509
{
@@ -1493,13 +1512,13 @@ invoke_init_callback_internal(init_callback_params *cb_params)
1493
1512
pushJsonbValue (& jsonb_state ,WJB_BEGIN_OBJECT ,NULL );
1494
1513
1495
1514
JSB_INIT_VAL (& key ,WJB_KEY ,"parent" );
1496
- JSB_INIT_VAL (& val ,WJB_VALUE ,get_rel_name_or_relid ( parent_oid ) );
1515
+ JSB_INIT_VAL (& val ,WJB_VALUE ,parent_name );
1497
1516
JSB_INIT_VAL (& key ,WJB_KEY ,"parent_schema" );
1498
- JSB_INIT_VAL (& val ,WJB_VALUE ,get_namespace_name ( get_rel_namespace ( parent_oid )) );
1517
+ JSB_INIT_VAL (& val ,WJB_VALUE ,parent_namespace );
1499
1518
JSB_INIT_VAL (& key ,WJB_KEY ,"partition" );
1500
- JSB_INIT_VAL (& val ,WJB_VALUE ,get_rel_name_or_relid ( partition_oid ) );
1519
+ JSB_INIT_VAL (& val ,WJB_VALUE ,partition_name );
1501
1520
JSB_INIT_VAL (& key ,WJB_KEY ,"partition_schema" );
1502
- JSB_INIT_VAL (& val ,WJB_VALUE ,get_namespace_name ( get_rel_namespace ( partition_oid )) );
1521
+ JSB_INIT_VAL (& val ,WJB_VALUE ,partition_namespace );
1503
1522
JSB_INIT_VAL (& key ,WJB_KEY ,"parttype" );
1504
1523
JSB_INIT_VAL (& val ,WJB_VALUE ,PartTypeToCString (PT_HASH ));
1505
1524
@@ -1509,46 +1528,40 @@ invoke_init_callback_internal(init_callback_params *cb_params)
1509
1528
1510
1529
case PT_RANGE :
1511
1530
{
1512
- char * start_value ,
1513
- * end_value ;
1531
+ char * start_value = NULL ,
1532
+ * end_value = NULL ;
1514
1533
Bound sv_datum = cb_params -> params .range_params .start_value ,
1515
1534
ev_datum = cb_params -> params .range_params .end_value ;
1516
1535
Oid type = cb_params -> params .range_params .value_type ;
1517
1536
1537
+ /* Convert min to CSTRING */
1538
+ if (!IsInfinite (& sv_datum ))
1539
+ start_value = datum_to_cstring (BoundGetValue (& sv_datum ),type );
1540
+
1541
+ /* Convert max to CSTRING */
1542
+ if (!IsInfinite (& ev_datum ))
1543
+ end_value = datum_to_cstring (BoundGetValue (& ev_datum ),type );
1544
+
1518
1545
pushJsonbValue (& jsonb_state ,WJB_BEGIN_OBJECT ,NULL );
1519
1546
1520
1547
JSB_INIT_VAL (& key ,WJB_KEY ,"parent" );
1521
- JSB_INIT_VAL (& val ,WJB_VALUE ,get_rel_name_or_relid ( parent_oid ) );
1548
+ JSB_INIT_VAL (& val ,WJB_VALUE ,parent_name );
1522
1549
JSB_INIT_VAL (& key ,WJB_KEY ,"parent_schema" );
1523
- JSB_INIT_VAL (& val ,WJB_VALUE ,get_namespace_name ( get_rel_namespace ( parent_oid )) );
1550
+ JSB_INIT_VAL (& val ,WJB_VALUE ,parent_namespace );
1524
1551
JSB_INIT_VAL (& key ,WJB_KEY ,"partition" );
1525
- JSB_INIT_VAL (& val ,WJB_VALUE ,get_rel_name_or_relid ( partition_oid ) );
1552
+ JSB_INIT_VAL (& val ,WJB_VALUE ,partition_name );
1526
1553
JSB_INIT_VAL (& key ,WJB_KEY ,"partition_schema" );
1527
- JSB_INIT_VAL (& val ,WJB_VALUE ,get_namespace_name ( get_rel_namespace ( partition_oid )) );
1554
+ JSB_INIT_VAL (& val ,WJB_VALUE ,partition_namespace );
1528
1555
JSB_INIT_VAL (& key ,WJB_KEY ,"parttype" );
1529
1556
JSB_INIT_VAL (& val ,WJB_VALUE ,PartTypeToCString (PT_RANGE ));
1530
1557
1531
1558
/* Lower bound */
1532
1559
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 );
1560
+ JSB_INIT_VAL (& val ,WJB_VALUE ,start_value );
1541
1561
1542
1562
/* Upper bound */
1543
1563
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 );
1564
+ JSB_INIT_VAL (& val ,WJB_VALUE ,end_value );
1552
1565
1553
1566
result = pushJsonbValue (& jsonb_state ,WJB_END_OBJECT ,NULL );
1554
1567
}