Skip to content

Commit a9002db

Browse files
committed
Allow custom names for User-Defined Actions
This commit allows custom names for Used-Defined Actions. add_job() and alter_job() accept an additional "job_name" argument to modify the name of User-Defined Action. If "job_name" is not specified, it is names as default.
1 parent 0768b33 commit a9002db

File tree

9 files changed

+173
-9
lines changed

9 files changed

+173
-9
lines changed

.unreleased/pr_7958

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Implements: #7958 Allow custom names for User-Defined Actions

sql/job_api.sql

+5-3
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ CREATE OR REPLACE FUNCTION @[email protected]_job(
1010
scheduled BOOL DEFAULT true,
1111
check_config REGPROC DEFAULT NULL,
1212
fixed_schedule BOOL DEFAULT TRUE,
13-
timezone TEXT DEFAULT NULL
13+
timezone TEXT DEFAULT NULL,
14+
job_name name DEFAULT NULL
1415
) RETURNS INTEGER AS '@MODULE_PATHNAME@', 'ts_job_add' LANGUAGE C VOLATILE;
1516

1617
CREATE OR REPLACE FUNCTION @[email protected]_job(job_id INTEGER) RETURNS VOID AS '@MODULE_PATHNAME@', 'ts_job_delete' LANGUAGE C VOLATILE STRICT;
@@ -30,10 +31,11 @@ CREATE OR REPLACE FUNCTION @[email protected]_job(
3031
check_config REGPROC = NULL,
3132
fixed_schedule BOOL = NULL,
3233
initial_start TIMESTAMPTZ = NULL,
33-
timezone TEXT DEFAULT NULL
34+
timezone TEXT DEFAULT NULL,
35+
job_name name DEFAULT NULL
3436
)
3537
RETURNS TABLE (job_id INTEGER, schedule_interval INTERVAL, max_runtime INTERVAL, max_retries INTEGER, retry_period INTERVAL, scheduled BOOL, config JSONB,
36-
next_start TIMESTAMPTZ, check_config TEXT, fixed_schedule BOOL, initial_start TIMESTAMPTZ, timezone TEXT)
38+
next_start TIMESTAMPTZ, check_config TEXT, fixed_schedule BOOL, initial_start TIMESTAMPTZ, timezone TEXT, job_name name)
3739
AS '@MODULE_PATHNAME@', 'ts_job_alter'
3840
LANGUAGE C VOLATILE;
3941

sql/updates/latest-dev.sql

+62
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,65 @@ LANGUAGE C VOLATILE;
3434

3535
UPDATE _timescaledb_catalog.hypertable SET chunk_sizing_func_schema = '_timescaledb_functions' WHERE chunk_sizing_func_schema = '_timescaledb_internal' AND chunk_sizing_func_name = 'calculate_chunk_interval';
3636

37+
DROP FUNCTION IF EXISTS @[email protected]_job(
38+
proc REGPROC,
39+
schedule_interval INTERVAL,
40+
config JSONB,
41+
initial_start TIMESTAMPTZ,
42+
scheduled BOOL,
43+
check_config REGPROC,
44+
fixed_schedule BOOL,
45+
timezone TEXT
46+
);
47+
48+
CREATE FUNCTION @[email protected]_job(
49+
proc REGPROC,
50+
schedule_interval INTERVAL,
51+
config JSONB DEFAULT NULL,
52+
initial_start TIMESTAMPTZ DEFAULT NULL,
53+
scheduled BOOL DEFAULT true,
54+
check_config REGPROC DEFAULT NULL,
55+
fixed_schedule BOOL DEFAULT TRUE,
56+
timezone TEXT DEFAULT NULL,
57+
job_name name DEFAULT NULL
58+
)
59+
RETURNS INTEGER
60+
AS '@MODULE_PATHNAME@', 'ts_update_placeholder'
61+
LANGUAGE C VOLATILE;
62+
63+
DROP FUNCTION IF EXISTS @[email protected]_job(
64+
job_id INTEGER,
65+
schedule_interval INTERVAL,
66+
max_runtime INTERVAL,
67+
max_retries INTEGER,
68+
retry_period INTERVAL,
69+
scheduled BOOL,
70+
config JSONB,
71+
next_start TIMESTAMPTZ,
72+
if_exists BOOL,
73+
check_config REGPROC,
74+
fixed_schedule BOOL,
75+
initial_start TIMESTAMPTZ,
76+
timezone TEXT
77+
);
78+
79+
CREATE FUNCTION @[email protected]_job(
80+
job_id INTEGER,
81+
schedule_interval INTERVAL = NULL,
82+
max_runtime INTERVAL = NULL,
83+
max_retries INTEGER = NULL,
84+
retry_period INTERVAL = NULL,
85+
scheduled BOOL = NULL,
86+
config JSONB = NULL,
87+
next_start TIMESTAMPTZ = NULL,
88+
if_exists BOOL = FALSE,
89+
check_config REGPROC = NULL,
90+
fixed_schedule BOOL = NULL,
91+
initial_start TIMESTAMPTZ = NULL,
92+
timezone TEXT DEFAULT NULL,
93+
job_name name DEFAULT NULL
94+
)
95+
RETURNS TABLE (job_id INTEGER, schedule_interval INTERVAL, max_runtime INTERVAL, max_retries INTEGER, retry_period INTERVAL, scheduled BOOL, config JSONB,
96+
next_start TIMESTAMPTZ, check_config TEXT, fixed_schedule BOOL, initial_start TIMESTAMPTZ, timezone TEXT, job_name name)
97+
AS '@MODULE_PATHNAME@', 'ts_update_placeholder'
98+
LANGUAGE C VOLATILE;

sql/updates/reverse-dev.sql

+63
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,66 @@ CREATE FUNCTION @[email protected]_continuous_aggregate_policy(
3131
RETURNS INTEGER
3232
AS '@MODULE_PATHNAME@', 'ts_update_placeholder'
3333
LANGUAGE C VOLATILE;
34+
35+
DROP FUNCTION IF EXISTS @[email protected]_job(
36+
proc REGPROC,
37+
schedule_interval INTERVAL,
38+
config JSONB,
39+
initial_start TIMESTAMPTZ,
40+
scheduled BOOL,
41+
check_config REGPROC,
42+
fixed_schedule BOOL,
43+
timezone TEXT,
44+
job_name name
45+
);
46+
47+
CREATE FUNCTION @[email protected]_job(
48+
proc REGPROC,
49+
schedule_interval INTERVAL,
50+
config JSONB DEFAULT NULL,
51+
initial_start TIMESTAMPTZ DEFAULT NULL,
52+
scheduled BOOL DEFAULT true,
53+
check_config REGPROC DEFAULT NULL,
54+
fixed_schedule BOOL DEFAULT TRUE,
55+
timezone TEXT DEFAULT NULL
56+
)
57+
RETURNS INTEGER
58+
AS '@MODULE_PATHNAME@', 'ts_update_placeholder'
59+
LANGUAGE C VOLATILE;
60+
61+
DROP FUNCTION IF EXISTS @[email protected]_job(
62+
job_id INTEGER,
63+
schedule_interval INTERVAL,
64+
max_runtime INTERVAL,
65+
max_retries INTEGER,
66+
retry_period INTERVAL,
67+
scheduled BOOL,
68+
config JSONB,
69+
next_start TIMESTAMPTZ,
70+
if_exists BOOL,
71+
check_config REGPROC,
72+
fixed_schedule BOOL,
73+
initial_start TIMESTAMPTZ,
74+
timezone TEXT,
75+
job_name name
76+
);
77+
78+
CREATE FUNCTION @[email protected]_job(
79+
job_id INTEGER,
80+
schedule_interval INTERVAL = NULL,
81+
max_runtime INTERVAL = NULL,
82+
max_retries INTEGER = NULL,
83+
retry_period INTERVAL = NULL,
84+
scheduled BOOL = NULL,
85+
config JSONB = NULL,
86+
next_start TIMESTAMPTZ = NULL,
87+
if_exists BOOL = FALSE,
88+
check_config REGPROC = NULL,
89+
fixed_schedule BOOL = NULL,
90+
initial_start TIMESTAMPTZ = NULL,
91+
timezone TEXT DEFAULT NULL
92+
)
93+
RETURNS TABLE (job_id INTEGER, schedule_interval INTERVAL, max_runtime INTERVAL, max_retries INTEGER, retry_period INTERVAL, scheduled BOOL, config JSONB,
94+
next_start TIMESTAMPTZ, check_config TEXT, fixed_schedule BOOL, initial_start TIMESTAMPTZ, timezone TEXT)
95+
AS '@MODULE_PATHNAME@', 'ts_update_placeholder'
96+
LANGUAGE C VOLATILE;

src/bgw/job.c

+4
Original file line numberDiff line numberDiff line change
@@ -786,6 +786,10 @@ bgw_job_tuple_update_by_id(TupleInfo *ti, void *const data)
786786
bool isnull[Natts_bgw_job] = { 0 };
787787
bool doReplace[Natts_bgw_job] = { 0 };
788788

789+
values[AttrNumberGetAttrOffset(Anum_bgw_job_application_name)] =
790+
NameGetDatum(&updated_job->fd.application_name);
791+
doReplace[AttrNumberGetAttrOffset(Anum_bgw_job_application_name)] = true;
792+
789793
Datum old_schedule_interval =
790794
slot_getattr(ti->slot, Anum_bgw_job_schedule_interval, &isnull[0]);
791795
Assert(!isnull[0]);

tsl/src/bgw_policy/job_api.c

+17-1
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ validate_check_signature(Oid check)
7070
* 5 check_config REGPROC DEFAULT NULL
7171
* 6 fixed_schedule BOOL DEFAULT TRUE
7272
* 7 timezone TEXT DEFAULT NULL
73+
* 8 job_name name DEFAULT NULL
7374
* ) RETURNS INTEGER
7475
*/
7576
Datum
@@ -99,6 +100,7 @@ job_add(PG_FUNCTION_ARGS)
99100
/* verify it's a valid timezone */
100101
if (timezone != NULL)
101102
valid_timezone = ts_bgw_job_validate_timezone(PG_GETARG_DATUM(7));
103+
char *job_name_str = PG_ARGISNULL(8) ? NULL : NameStr(*PG_GETARG_NAME(8));
102104

103105
TS_PREVENT_FUNC_IF_READ_ONLY();
104106

@@ -161,7 +163,10 @@ job_add(PG_FUNCTION_ARGS)
161163
ts_bgw_job_validate_job_owner(owner);
162164

163165
/* Next, insert a new job into jobs table */
164-
namestrcpy(&application_name, "User-Defined Action");
166+
if (job_name_str)
167+
namestrcpy(&application_name, job_name_str);
168+
else
169+
namestrcpy(&application_name, "User-Defined Action");
165170
namestrcpy(&proc_schema, get_namespace_name(get_func_namespace(proc)));
166171
namestrcpy(&proc_name, func_name);
167172

@@ -283,6 +288,7 @@ job_run(PG_FUNCTION_ARGS)
283288
* 10 fixed_schedule BOOL = NULL,
284289
* 11 initial_start TIMESTAMPTZ = NULL
285290
* 12 timezone TEXT = NULL
291+
* 13 job_name name = NULL
286292
* ) RETURNS TABLE (
287293
* job_id INTEGER,
288294
* schedule_interval INTERVAL,
@@ -296,6 +302,7 @@ job_run(PG_FUNCTION_ARGS)
296302
* fixed_schedule BOOL
297303
* initial_start TIMESTAMPTZ
298304
* timezone TEXT
305+
* job_name name
299306
* )
300307
*/
301308
Datum
@@ -436,6 +443,13 @@ job_alter(PG_FUNCTION_ARGS)
436443
job->fd.initial_start = initial_start;
437444
}
438445

446+
if (!PG_ARGISNULL(13))
447+
{
448+
char app_name[NAMEDATALEN];
449+
snprintf(app_name, NAMEDATALEN, "%s [%d]", NameStr(*PG_GETARG_NAME(13)), job_id);
450+
namestrcpy(&job->fd.application_name, app_name);
451+
}
452+
439453
if (valid_timezone != NULL)
440454
job->fd.timezone = cstring_to_text(valid_timezone);
441455
else
@@ -525,6 +539,8 @@ job_alter(PG_FUNCTION_ARGS)
525539
else
526540
nulls[11] = true;
527541

542+
values[12] = NameGetDatum(&job->fd.application_name);
543+
528544
tuple = heap_form_tuple(tupdesc, values, nulls);
529545
return HeapTupleGetDatum(tuple);
530546
}

tsl/test/expected/bgw_custom.out

+14-2
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ SELECT add_job('custom_func', '1h', config:='{"type":"function"}'::jsonb, initia
6868
1003
6969
(1 row)
7070

71-
SELECT add_job('custom_func_definer', '1h', config:='{"type":"function"}'::jsonb, initial_start => :'time_zero'::TIMESTAMPTZ);
71+
SELECT add_job('custom_func_definer', '1h', config:='{"type":"function"}'::jsonb, initial_start => :'time_zero'::TIMESTAMPTZ, job_name := 'custom_job_name');
7272
add_job
7373
---------
7474
1004
@@ -82,7 +82,7 @@ SELECT * FROM timescaledb_information.jobs WHERE job_id >= 1000 ORDER BY 1;
8282
1001 | User-Defined Action [1001] | @ 1 hour | @ 0 | -1 | @ 5 mins | public | custom_proc | default_perm_user | t | t | {"type": "procedure"} | Fri Dec 31 16:00:00 1999 PST | Fri Dec 31 16:00:00 1999 PST | | | |
8383
1002 | User-Defined Action [1002] | @ 1 hour | @ 0 | -1 | @ 5 mins | public | custom_proc2 | default_perm_user | t | t | {"type": "procedure"} | Fri Dec 31 16:00:00 1999 PST | Fri Dec 31 16:00:00 1999 PST | | | |
8484
1003 | User-Defined Action [1003] | @ 1 hour | @ 0 | -1 | @ 5 mins | public | custom_func | default_perm_user | t | t | {"type": "function"} | Fri Dec 31 16:00:00 1999 PST | Fri Dec 31 16:00:00 1999 PST | | | |
85-
1004 | User-Defined Action [1004] | @ 1 hour | @ 0 | -1 | @ 5 mins | public | custom_func_definer | default_perm_user | t | t | {"type": "function"} | Fri Dec 31 16:00:00 1999 PST | Fri Dec 31 16:00:00 1999 PST | | | |
85+
1004 | custom_job_name [1004] | @ 1 hour | @ 0 | -1 | @ 5 mins | public | custom_func_definer | default_perm_user | t | t | {"type": "function"} | Fri Dec 31 16:00:00 1999 PST | Fri Dec 31 16:00:00 1999 PST | | | |
8686
(5 rows)
8787

8888
SELECT count(*) FROM _timescaledb_config.bgw_job WHERE config->>'type' IN ('procedure', 'function');
@@ -187,6 +187,18 @@ SELECT job_id FROM alter_job(1000,scheduled:=false);
187187
1000
188188
(1 row)
189189

190+
-- test updating the job name
191+
SELECT job_id, job_name FROM alter_job(1000,job_name:='custom_name_2');
192+
job_id | job_name
193+
--------+----------------------
194+
1000 | custom_name_2 [1000]
195+
(1 row)
196+
SELECT application_name FROM timescaledb_information.jobs WHERE job_id = 1000;
197+
application_name
198+
----------------------
199+
custom_name_2 [1000]
200+
(1 row)
201+
190202
SELECT scheduled, config FROM timescaledb_information.jobs WHERE job_id = 1000;
191203
scheduled | config
192204
-----------+----------------------

tsl/test/shared/expected/extension.out

+2-2
Original file line numberDiff line numberDiff line change
@@ -215,10 +215,10 @@ ORDER BY pronamespace::regnamespace::text COLLATE "C", p.oid::regprocedure::text
215215
add_continuous_aggregate_policy(regclass,"any","any",interval,boolean,timestamp with time zone,text,boolean,integer,integer,boolean)
216216
add_dimension(regclass,_timescaledb_internal.dimension_info,boolean)
217217
add_dimension(regclass,name,integer,anyelement,regproc,boolean)
218-
add_job(regproc,interval,jsonb,timestamp with time zone,boolean,regproc,boolean,text)
218+
add_job(regproc,interval,jsonb,timestamp with time zone,boolean,regproc,boolean,text,name)
219219
add_reorder_policy(regclass,name,boolean,timestamp with time zone,text)
220220
add_retention_policy(regclass,"any",boolean,interval,timestamp with time zone,text,interval)
221-
alter_job(integer,interval,interval,integer,interval,boolean,jsonb,timestamp with time zone,boolean,regproc,boolean,timestamp with time zone,text)
221+
alter_job(integer,interval,interval,integer,interval,boolean,jsonb,timestamp with time zone,boolean,regproc,boolean,timestamp with time zone,text,name)
222222
approximate_row_count(regclass)
223223
attach_tablespace(name,regclass,boolean)
224224
by_hash(name,integer,regproc)

tsl/test/sql/bgw_custom.sql

+5-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ SELECT add_job('custom_proc','1h', config:='{"type":"procedure"}'::jsonb, initia
5151
SELECT add_job('custom_proc2','1h', config:= '{"type":"procedure"}'::jsonb, initial_start => :'time_zero'::TIMESTAMPTZ);
5252

5353
SELECT add_job('custom_func', '1h', config:='{"type":"function"}'::jsonb, initial_start => :'time_zero'::TIMESTAMPTZ);
54-
SELECT add_job('custom_func_definer', '1h', config:='{"type":"function"}'::jsonb, initial_start => :'time_zero'::TIMESTAMPTZ);
54+
SELECT add_job('custom_func_definer', '1h', config:='{"type":"function"}'::jsonb, initial_start => :'time_zero'::TIMESTAMPTZ, job_name := 'custom_job_name');
5555

5656
-- exclude internal jobs
5757
SELECT * FROM timescaledb_information.jobs WHERE job_id >= 1000 ORDER BY 1;
@@ -110,6 +110,10 @@ SELECT scheduled, config FROM timescaledb_information.jobs WHERE job_id = 1000;
110110
SELECT job_id FROM alter_job(1000,scheduled:=false);
111111
SELECT scheduled, config FROM timescaledb_information.jobs WHERE job_id = 1000;
112112

113+
-- test updating the job name
114+
SELECT job_id, job_name FROM alter_job(1000,job_name:=='custom_name_2');
115+
SELECT application_name FROM timescaledb_information.jobs WHERE job_id = 1000;
116+
113117
-- Done with job 1000 now, so remove it.
114118
SELECT delete_job(1000);
115119

0 commit comments

Comments
 (0)