Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitb361af6

Browse files
committed
improve init callback subsystem, tests
1 parent15e574e commitb361af6

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) ISNULL;
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+
CREATEFUNCTIONcalamity.dummy_cb(arg jsonb) RETURNS voidAS $$
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+
DROPFUNCTIONcalamity.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
#defineJSB_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-
#defineJSB_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+
elsecb_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
casePT_RANGE:
15111528
{
1512-
char*start_value,
1513-
*end_value;
1529+
char*start_value=NULL,
1530+
*end_value=NULL;
15141531
Boundsv_datum=cb_params->params.range_params.start_value,
15151532
ev_datum=cb_params->params.range_params.end_value;
15161533
Oidtype=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
Oidvalue_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)

[8]ページ先頭

©2009-2025 Movatter.jp