Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit b361af6

Browse files
committed
improve init callback subsystem, tests
1 parent 15e574e commit b361af6

File tree

4 files changed

+130
-60
lines changed

4 files changed

+130
-60
lines changed

expected/pathman_calamity.out

Lines changed: 58 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,12 @@ SELECT debug_capture();
99

1010
(1 row)
1111

12+
SELECT get_pathman_lib_version();
13+
get_pathman_lib_version
14+
-------------------------
15+
10300
16+
(1 row)
17+
1218
set client_min_messages = NOTICE;
1319
/* create table to be partitioned */
1420
CREATE TABLE calamity.part_test(val serial);
@@ -396,30 +402,69 @@ SELECT drop_range_partition_expand_next(NULL) IS NULL;
396402
t
397403
(1 row)
398404

399-
/* check invoke_on_partition_created_callback() for RANGE */
400-
SELECT invoke_on_partition_created_callback('calamity.part_test', 'calamity.part_test', 1, NULL, NULL::int);
401-
ERROR: both bounds must be provided for RANGE partition
402-
SELECT invoke_on_partition_created_callback('calamity.part_test', 'calamity.part_test', 1, 1, NULL);
403-
ERROR: both bounds must be provided for RANGE partition
404-
SELECT invoke_on_partition_created_callback('calamity.part_test', 'calamity.part_test', 1, NULL, 1);
405-
ERROR: both bounds must be provided for RANGE partition
406-
/* check invoke_on_partition_created_callback() for HASH */
405+
/* check invoke_on_partition_created_callback() */
406+
CREATE FUNCTION calamity.dummy_cb(arg jsonb) RETURNS void AS $$
407+
begin
408+
raise warning 'arg: %', arg::text;
409+
end
410+
$$ LANGUAGE plpgsql;
411+
/* Invalid args */
412+
SELECT invoke_on_partition_created_callback(NULL, 'calamity.part_test', 1);
413+
ERROR: 'parent_relid' should not be NULL
414+
SELECT invoke_on_partition_created_callback('calamity.part_test', NULL, 1);
415+
ERROR: 'partition' should not be NULL
416+
SELECT invoke_on_partition_created_callback('calamity.part_test', 'calamity.part_test', 0);
417+
invoke_on_partition_created_callback
418+
--------------------------------------
419+
420+
(1 row)
421+
422+
SELECT invoke_on_partition_created_callback('calamity.part_test', 'calamity.part_test', 1);
423+
ERROR: callback function 1 does not exist
407424
SELECT invoke_on_partition_created_callback('calamity.part_test', 'calamity.part_test', NULL);
408425
invoke_on_partition_created_callback
409426
--------------------------------------
410427

411428
(1 row)
412429

413-
SELECT invoke_on_partition_created_callback('calamity.part_test', 'calamity.part_test', 0);
430+
/* HASH */
431+
SELECT invoke_on_partition_created_callback(0::regclass, 1::regclass, 'calamity.dummy_cb(jsonb)'::regprocedure);
432+
WARNING: arg: {"parent": null, "parttype": "1", "partition": null, "parent_schema": null, "partition_schema": null}
414433
invoke_on_partition_created_callback
415434
--------------------------------------
416435

417436
(1 row)
418437

419-
SELECT invoke_on_partition_created_callback(NULL, 'calamity.part_test', 1);
420-
ERROR: 'parent_relid' should not be NULL
421-
SELECT invoke_on_partition_created_callback('calamity.part_test', NULL, 1);
422-
ERROR: 'partition' should not be NULL
438+
/* RANGE */
439+
SELECT invoke_on_partition_created_callback('calamity.part_test'::regclass, 'pg_class'::regclass, 'calamity.dummy_cb(jsonb)'::regprocedure, NULL::int, NULL);
440+
WARNING: arg: {"parent": "part_test", "parttype": "2", "partition": "pg_class", "range_max": null, "range_min": null, "parent_schema": "calamity", "partition_schema": "pg_catalog"}
441+
invoke_on_partition_created_callback
442+
--------------------------------------
443+
444+
(1 row)
445+
446+
SELECT invoke_on_partition_created_callback(0::regclass, 1::regclass, 'calamity.dummy_cb(jsonb)'::regprocedure, NULL::int, NULL);
447+
WARNING: arg: {"parent": null, "parttype": "2", "partition": null, "range_max": null, "range_min": null, "parent_schema": null, "partition_schema": null}
448+
invoke_on_partition_created_callback
449+
--------------------------------------
450+
451+
(1 row)
452+
453+
SELECT invoke_on_partition_created_callback(0::regclass, 1::regclass, 'calamity.dummy_cb(jsonb)'::regprocedure, 1, NULL);
454+
WARNING: arg: {"parent": null, "parttype": "2", "partition": null, "range_max": null, "range_min": "1", "parent_schema": null, "partition_schema": null}
455+
invoke_on_partition_created_callback
456+
--------------------------------------
457+
458+
(1 row)
459+
460+
SELECT invoke_on_partition_created_callback(0::regclass, 1::regclass, 'calamity.dummy_cb(jsonb)'::regprocedure, NULL, 1);
461+
WARNING: arg: {"parent": null, "parttype": "2", "partition": null, "range_max": "1", "range_min": null, "parent_schema": null, "partition_schema": null}
462+
invoke_on_partition_created_callback
463+
--------------------------------------
464+
465+
(1 row)
466+
467+
DROP FUNCTION calamity.dummy_cb(arg jsonb);
423468
/* check function add_to_pathman_config() -- PHASE #1 */
424469
SELECT add_to_pathman_config(NULL, 'val'); /* no table */
425470
ERROR: 'parent_relid' should not be NULL

sql/pathman_calamity.sql

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ CREATE SCHEMA calamity;
77
/* call for coverage test */
88
set client_min_messages = ERROR;
99
SELECT debug_capture();
10+
SELECT get_pathman_lib_version();
1011
set client_min_messages = NOTICE;
1112

1213

@@ -153,16 +154,32 @@ SELECT stop_concurrent_part_task(1::regclass);
153154
SELECT drop_range_partition_expand_next('pg_class');
154155
SELECT drop_range_partition_expand_next(NULL) IS NULL;
155156

156-
/* check invoke_on_partition_created_callback() for RANGE */
157-
SELECT invoke_on_partition_created_callback('calamity.part_test', 'calamity.part_test', 1, NULL, NULL::int);
158-
SELECT invoke_on_partition_created_callback('calamity.part_test', 'calamity.part_test', 1, 1, NULL);
159-
SELECT invoke_on_partition_created_callback('calamity.part_test', 'calamity.part_test', 1, NULL, 1);
160157

161-
/* check invoke_on_partition_created_callback() for HASH */
162-
SELECT invoke_on_partition_created_callback('calamity.part_test', 'calamity.part_test', NULL);
163-
SELECT invoke_on_partition_created_callback('calamity.part_test', 'calamity.part_test', 0);
158+
/* check invoke_on_partition_created_callback() */
159+
CREATE FUNCTION calamity.dummy_cb(arg jsonb) RETURNS void AS $$
160+
begin
161+
raise warning 'arg: %', arg::text;
162+
end
163+
$$ LANGUAGE plpgsql;
164+
165+
/* Invalid args */
164166
SELECT invoke_on_partition_created_callback(NULL, 'calamity.part_test', 1);
165167
SELECT invoke_on_partition_created_callback('calamity.part_test', NULL, 1);
168+
SELECT invoke_on_partition_created_callback('calamity.part_test', 'calamity.part_test', 0);
169+
SELECT invoke_on_partition_created_callback('calamity.part_test', 'calamity.part_test', 1);
170+
SELECT invoke_on_partition_created_callback('calamity.part_test', 'calamity.part_test', NULL);
171+
172+
/* HASH */
173+
SELECT invoke_on_partition_created_callback(0::regclass, 1::regclass, 'calamity.dummy_cb(jsonb)'::regprocedure);
174+
175+
/* RANGE */
176+
SELECT invoke_on_partition_created_callback('calamity.part_test'::regclass, 'pg_class'::regclass, 'calamity.dummy_cb(jsonb)'::regprocedure, NULL::int, NULL);
177+
SELECT invoke_on_partition_created_callback(0::regclass, 1::regclass, 'calamity.dummy_cb(jsonb)'::regprocedure, NULL::int, NULL);
178+
SELECT invoke_on_partition_created_callback(0::regclass, 1::regclass, 'calamity.dummy_cb(jsonb)'::regprocedure, 1, NULL);
179+
SELECT invoke_on_partition_created_callback(0::regclass, 1::regclass, 'calamity.dummy_cb(jsonb)'::regprocedure, NULL, 1);
180+
181+
DROP FUNCTION calamity.dummy_cb(arg jsonb);
182+
166183

167184
/* check function add_to_pathman_config() -- PHASE #1 */
168185
SELECT add_to_pathman_config(NULL, 'val'); /* no table */

src/partition_creation.c

Lines changed: 48 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1422,15 +1422,18 @@ invoke_init_callback_internal(init_callback_params *cb_params)
14221422
{
14231423
#define JSB_INIT_VAL(value, val_type, val_cstring) \
14241424
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+
\
14341437
pushJsonbValue(&jsonb_state, val_type, (value)); \
14351438
} while (0)
14361439

@@ -1445,6 +1448,12 @@ invoke_init_callback_internal(init_callback_params *cb_params)
14451448
key,
14461449
val;
14471450

1451+
char *parent_name,
1452+
*parent_namespace,
1453+
*partition_name,
1454+
*partition_namespace;
1455+
1456+
14481457
/* Fetch & cache callback's Oid if needed */
14491458
if (!cb_params->callback_is_cached)
14501459
{
@@ -1472,8 +1481,10 @@ invoke_init_callback_internal(init_callback_params *cb_params)
14721481
errmsg("callback function \"%s\" does not exist",
14731482
TextDatumGetCString(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 */
14771488
cb_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 */
14861497
validate_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 */
14891506
switch (cb_params->parttype)
14901507
{
@@ -1493,13 +1510,13 @@ invoke_init_callback_internal(init_callback_params *cb_params)
14931510
pushJsonbValue(&jsonb_state, WJB_BEGIN_OBJECT, NULL);
14941511

14951512
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);
14971514
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);
14991516
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);
15011518
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);
15031520
JSB_INIT_VAL(&key, WJB_KEY, "parttype");
15041521
JSB_INIT_VAL(&val, WJB_VALUE, PartTypeToCString(PT_HASH));
15051522

@@ -1509,46 +1526,40 @@ invoke_init_callback_internal(init_callback_params *cb_params)
15091526

15101527
case PT_RANGE:
15111528
{
1512-
char *start_value,
1513-
*end_value;
1529+
char *start_value = NULL,
1530+
*end_value = NULL;
15141531
Bound sv_datum = cb_params->params.range_params.start_value,
15151532
ev_datum = cb_params->params.range_params.end_value;
15161533
Oid 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+
15181543
pushJsonbValue(&jsonb_state, WJB_BEGIN_OBJECT, NULL);
15191544

15201545
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);
15221547
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);
15241549
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);
15261551
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);
15281553
JSB_INIT_VAL(&key, WJB_KEY, "parttype");
15291554
JSB_INIT_VAL(&val, WJB_VALUE, PartTypeToCString(PT_RANGE));
15301555

15311556
/* Lower bound */
15321557
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);
15411559

15421560
/* Upper bound */
15431561
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);
15521563

15531564
result = pushJsonbValue(&jsonb_state, WJB_END_OBJECT, NULL);
15541565
}

src/pl_funcs.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -841,9 +841,6 @@ invoke_on_partition_created_callback(PG_FUNCTION_ARGS)
841841
end;
842842
Oid value_type;
843843

844-
if (PG_ARGISNULL(ARG_RANGE_START) || PG_ARGISNULL(ARG_RANGE_END))
845-
elog(ERROR, "both bounds must be provided for RANGE partition");
846-
847844
/* Fetch start & end values for RANGE + their type */
848845
start = PG_ARGISNULL(ARG_RANGE_START) ?
849846
MakeBoundInf(MINUS_INFINITY) :

0 commit comments

Comments
 (0)