From cc316739baa0b45322bc28be58085a76f0d7c57d Mon Sep 17 00:00:00 2001 From: nancy_w <1527108510@qq.com> Date: Sat, 27 May 2023 16:54:28 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1=E5=85=BC?= =?UTF-8?q?=E5=AE=B9M*=E6=97=B6=E9=97=B4=E5=8D=95=E4=BD=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/src/sgml/ref/create_event.sgmlin | 2 +- src/common/backend/parser/gram.y | 68 ++++++++++++++++--- .../interfaces/libpq/frontend_parser/gram.y | 17 +++-- src/include/parser/kwlist.h | 7 ++ src/test/regress/expected/event.out | 61 ++++++++++++++++- src/test/regress/sql/event.sql | 23 +++++++ 6 files changed, 163 insertions(+), 15 deletions(-) diff --git a/doc/src/sgml/ref/create_event.sgmlin b/doc/src/sgml/ref/create_event.sgmlin index 22892fb5b..8ee801903 100644 --- a/doc/src/sgml/ref/create_event.sgmlin +++ b/doc/src/sgml/ref/create_event.sgmlin @@ -28,7 +28,7 @@ schedule_expr: { interval_expr: quantity {YEAR | MONTH | DAY | HOUR | MINUTE | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE | - DAY TO SECOND | HOUR TO MINUTE | HOUR TO SECOND | MINUTE TO SECOND} + DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND} \ No newline at end of file diff --git a/src/common/backend/parser/gram.y b/src/common/backend/parser/gram.y index 5000ecedf..25d5679de 100644 --- a/src/common/backend/parser/gram.y +++ b/src/common/backend/parser/gram.y @@ -570,7 +570,7 @@ static void setDelimiterName(core_yyscan_t yyscanner, char*input, VariableSetStm %type extract_list timestamp_arg_list overlay_list position_list %type substr_list trim_list -%type opt_interval interval_second +%type opt_interval interval_second event_interval_unit opt_evtime_unit %type overlay_placing substr_from substr_for %type opt_instead opt_incremental @@ -864,7 +864,7 @@ static void setDelimiterName(core_yyscan_t yyscanner, char*input, VariableSetStm CURRENT_TIME CURRENT_TIMESTAMP CURRENT_USER CURSOR CYCLE SHRINK USE_P - DATA_P DATABASE DATAFILE DATANODE DATANODES DATATYPE_CL DATE_P DATE_FORMAT_P DAY_P DBCOMPATIBILITY_P DEALLOCATE DEC DECIMAL_P DECLARE DECODE DEFAULT DEFAULTS + DATA_P DATABASE DATAFILE DATANODE DATANODES DATATYPE_CL DATE_P DATE_FORMAT_P DAY_P DAY_HOUR_P DAY_MINUTE_P DAY_SECOND_P DBCOMPATIBILITY_P DEALLOCATE DEC DECIMAL_P DECLARE DECODE DEFAULT DEFAULTS DEFERRABLE DEFERRED DEFINER DELETE_P DELIMITER DELIMITERS DELTA DELTAMERGE DESC DETERMINISTIC /* PGXC_BEGIN */ DICTIONARY DIRECT DIRECTORY DISABLE_P DISCARD DISTINCT DISTRIBUTE DISTRIBUTION DO DOCUMENT_P DOMAIN_P DOUBLE_P @@ -881,7 +881,7 @@ static void setDelimiterName(core_yyscan_t yyscanner, char*input, VariableSetStm GENERATED GLOBAL GRANT GRANTED GREATEST GROUP_P GROUPING_P GROUPPARENT - HANDLER HAVING HDFSDIRECTORY HEADER_P HOLD HOUR_P + HANDLER HAVING HDFSDIRECTORY HEADER_P HOLD HOUR_P HOUR_MINUTE_P HOUR_SECOND_P IDENTIFIED IDENTITY_P IF_P IGNORE IGNORE_EXTRA_DATA ILIKE IMMEDIATE IMMUTABLE IMPLICIT_P IN_P INCLUDE INCLUDING INCREMENT INCREMENTAL INDEX INDEXES INFILE INHERIT INHERITS INITIAL_P INITIALLY INITRANS INLINE_P @@ -896,7 +896,7 @@ static void setDelimiterName(core_yyscan_t yyscanner, char*input, VariableSetStm LABEL LANGUAGE LARGE_P LAST_P LC_COLLATE_P LC_CTYPE_P LEADING LEAKPROOF LINES LEAST LESS LEFT LEVEL LIKE LIMIT LIST LISTEN LOAD LOCAL LOCALTIME LOCALTIMESTAMP LOCATION LOCK_P LOCKED LOG_P LOGGING LOGIN_ANY LOGIN_FAILURE LOGIN_SUCCESS LOGOUT LOOP - MAPPING MASKING MASTER MATCH MATERIALIZED MATCHED MAXEXTENTS MAXSIZE MAXTRANS MAXVALUE MERGE MINUS_P MINUTE_P MINVALUE MINEXTENTS MODE MODIFY_P MONTH_P MOVE MOVEMENT + MAPPING MASKING MASTER MATCH MATERIALIZED MATCHED MAXEXTENTS MAXSIZE MAXTRANS MAXVALUE MERGE MINUS_P MINUTE_P MINUTE_SECOND_P MINVALUE MINEXTENTS MODE MODIFY_P MONTH_P MOVE MOVEMENT MODEL // DB4AI NAME_P NAMES NATIONAL NATURAL NCHAR NEXT NO NOCOMPRESS NOCYCLE NODE NOLOGGING NOMAXVALUE NOMINVALUE NONE NOT NOTHING NOTIFY NOTNULL NOWAIT NULL_P NULLCOLS NULLIF NULLS_P NUMBER_P NUMERIC NUMSTR NVARCHAR NVARCHAR2 NVL @@ -942,7 +942,7 @@ static void setDelimiterName(core_yyscan_t yyscanner, char*input, VariableSetStm XML_P XMLATTRIBUTES XMLCONCAT XMLELEMENT XMLEXISTS XMLFOREST XMLPARSE XMLPI XMLROOT XMLSERIALIZE - YEAR_P YES_P + YEAR_P YEAR_MONTH_P YES_P ZONE @@ -15086,8 +15086,12 @@ user: ColId { $$ = $1; } ; +event_interval_unit: opt_interval {$$ = $1;} + | opt_evtime_unit {$$ = $1;} + ; + every_interval: - Iconst opt_interval + Iconst event_interval_unit { TypeName *t; t = SystemTypeName("interval"); @@ -15095,7 +15099,7 @@ every_interval: Node *num = makeIntConst($1, @1); $$ = makeTypeCast(num, t, -1); } - | Sconst opt_interval + | Sconst event_interval_unit { TypeName *t; t = SystemTypeName("interval"); @@ -15103,7 +15107,7 @@ every_interval: Node *num = makeStringConst($1, @1); $$ = makeTypeCast(num, t, -1); } - | FCONST opt_interval + | FCONST event_interval_unit { TypeName *t; t = SystemTypeName("interval"); @@ -25211,6 +25215,47 @@ opt_timezone: | /*EMPTY*/ { $$ = FALSE; } ; +opt_evtime_unit: + DAY_HOUR_P + { + $$ = list_make1(makeIntConst(INTERVAL_MASK(DAY) | + INTERVAL_MASK(HOUR), @1)); + } + | DAY_MINUTE_P + { + $$ = list_make1(makeIntConst(INTERVAL_MASK(DAY) | + INTERVAL_MASK(HOUR) | + INTERVAL_MASK(MINUTE), @1)); + } + | DAY_SECOND_P + { + $$ = list_make1(makeIntConst(INTERVAL_MASK(DAY) | + INTERVAL_MASK(HOUR) | + INTERVAL_MASK(MINUTE) | + INTERVAL_MASK(SECOND), @1)); + } + | HOUR_MINUTE_P + { + $$ = list_make1(makeIntConst(INTERVAL_MASK(HOUR) | + INTERVAL_MASK(MINUTE), @1)); + } + | HOUR_SECOND_P + { + $$ = list_make1(makeIntConst(INTERVAL_MASK(HOUR) | + INTERVAL_MASK(MINUTE) | + INTERVAL_MASK(SECOND), @1)); + } + | MINUTE_SECOND_P + { + $$ = list_make1(makeIntConst(INTERVAL_MASK(MINUTE) | + INTERVAL_MASK(SECOND), @1)); + } + | YEAR_MONTH_P + { + $$ = list_make1(makeIntConst(INTERVAL_MASK(YEAR) | + INTERVAL_MASK(MONTH), @1)); + } + opt_interval: YEAR_P { $$ = list_make1(makeIntConst(INTERVAL_MASK(YEAR), @1)); } @@ -28540,7 +28585,10 @@ unreserved_keyword: | DATANODES | DATATYPE_CL | DATE_FORMAT_P + | DAY_HOUR_P + | DAY_MINUTE_P | DAY_P + | DAY_SECOND_P | DBCOMPATIBILITY_P | DEALLOCATE | DECLARE @@ -28621,7 +28669,9 @@ unreserved_keyword: | HANDLER | HEADER_P | HOLD + | HOUR_MINUTE_P | HOUR_P + | HOUR_SECOND_P | IDENTIFIED | IDENTITY_P | IF_P @@ -28691,6 +28741,7 @@ unreserved_keyword: | MERGE | MINEXTENTS | MINUTE_P + | MINUTE_SECOND_P | MINVALUE | MODE | MODEL // DB4AI @@ -28918,6 +28969,7 @@ unreserved_keyword: | WRAPPER | WRITE | XML_P + | YEAR_MONTH_P | YEAR_P | YES_P | ZONE diff --git a/src/common/interfaces/libpq/frontend_parser/gram.y b/src/common/interfaces/libpq/frontend_parser/gram.y index aa4f447e5..5ef0dfa29 100755 --- a/src/common/interfaces/libpq/frontend_parser/gram.y +++ b/src/common/interfaces/libpq/frontend_parser/gram.y @@ -525,7 +525,7 @@ extern THR_LOCAL bool stmt_contains_operator_plus; CURRENT_TIME CURRENT_TIMESTAMP CURRENT_USER CURSOR CYCLE SHRINK USE_P - DATA_P DATABASE DATAFILE DATANODE DATANODES DATATYPE_CL DATE_P DATE_FORMAT_P DAY_P DBCOMPATIBILITY_P DEALLOCATE DEC DECIMAL_P DECLARE DECODE DEFAULT DEFAULTS + DATA_P DATABASE DATAFILE DATANODE DATANODES DATATYPE_CL DATE_P DATE_FORMAT_P DAY_P DAY_HOUR_P DAY_MINUTE_P DAY_SECOND_P DBCOMPATIBILITY_P DEALLOCATE DEC DECIMAL_P DECLARE DECODE DEFAULT DEFAULTS DEFERRABLE DEFERRED DEFINER DELETE_P DELIMITER DELIMITERS DELTA DELTAMERGE DESC DETERMINISTIC /* PGXC_BEGIN */ DICTIONARY DIRECT DIRECTORY DISABLE_P DISCARD DISTINCT DISTRIBUTE DISTRIBUTION DO DOCUMENT_P DOMAIN_P DOUBLE_P @@ -543,7 +543,7 @@ extern THR_LOCAL bool stmt_contains_operator_plus; GENERATED GLOBAL GRANT GRANTED GREATEST GROUP_P GROUPING_P GROUPPARENT - HANDLER HAVING HDFSDIRECTORY HEADER_P HOLD HOUR_P + HANDLER HAVING HDFSDIRECTORY HEADER_P HOLD HOUR_P HOUR_MINUTE_P HOUR_SECOND_P IDENTIFIED IDENTITY_P IF_P IGNORE IGNORE_EXTRA_DATA ILIKE IMMEDIATE IMMUTABLE IMPLICIT_P IN_P INCLUDE INCLUDING INCREMENT INCREMENTAL INDEX INDEXES INFILE INHERIT INHERITS INITIAL_P INITIALLY INITRANS INLINE_P @@ -557,7 +557,7 @@ extern THR_LOCAL bool stmt_contains_operator_plus; LABEL LANGUAGE LARGE_P LAST_P LC_COLLATE_P LC_CTYPE_P LEADING LEAKPROOF LINES LEAST LESS LEFT LEVEL LIST LIKE LIMIT LISTEN LOAD LOCAL LOCALTIME LOCALTIMESTAMP LOCATION LOCK_P LOCKED LOG_P LOGGING LOGIN_ANY LOGIN_SUCCESS LOGIN_FAILURE LOGOUT LOOP - MAPPING MASKING MASTER MASTR MATCH MATERIALIZED MATCHED MAXEXTENTS MAXSIZE MAXTRANS MAXVALUE MERGE MINUS_P MINUTE_P MINVALUE MINEXTENTS MODE MODIFY_P MONTH_P MOVE MOVEMENT + MAPPING MASKING MASTER MASTR MATCH MATERIALIZED MATCHED MAXEXTENTS MAXSIZE MAXTRANS MAXVALUE MERGE MINUS_P MINUTE_P MINUTE_SECOND_P MINVALUE MINEXTENTS MODE MODIFY_P MONTH_P MOVE MOVEMENT MODEL // DB4AI NAME_P NAMES NATIONAL NATURAL NCHAR NEXT NLSSORT NO NOCOMPRESS NOCYCLE NODE NOLOGGING NOMAXVALUE NOMINVALUE NONE NOT NOTHING NOTIFY NOTNULL NOWAIT NULL_P NULLCOLS NULLIF NULLS_P NUMBER_P NUMERIC NUMSTR NVARCHAR NVARCHAR2 NVL @@ -603,7 +603,7 @@ extern THR_LOCAL bool stmt_contains_operator_plus; XML_P XMLATTRIBUTES XMLCONCAT XMLELEMENT XMLEXISTS XMLFOREST XMLPARSE XMLPI XMLROOT XMLSERIALIZE - YEAR_P YES_P + YEAR_P YEAR_MONTH_P YES_P ZONE @@ -11687,8 +11687,11 @@ unreserved_keyword: | DATANODE | DATANODES | DATATYPE_CL - | DAY_P | DATE_FORMAT_P + | DAY_HOUR_P + | DAY_MINUTE_P + | DAY_P + | DAY_SECOND_P | DBCOMPATIBILITY_P | DEALLOCATE | DECLARE @@ -11761,7 +11764,9 @@ unreserved_keyword: | HANDLER | HEADER_P | HOLD + | HOUR_MINUTE_P | HOUR_P + | HOUR_SECOND_P | IDENTIFIED | IDENTITY_P | IF_P @@ -11830,6 +11835,7 @@ unreserved_keyword: | MERGE | MINEXTENTS | MINUTE_P + | MINUTE_SECOND_P | MINVALUE | MODE | MODEL // DB4AI @@ -12039,6 +12045,7 @@ unreserved_keyword: | WRAPPER | WRITE | XML_P + | YEAR_MONTH_P | YEAR_P | YES_P | ZONE diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h index b8b24176e..235165d64 100644 --- a/src/include/parser/kwlist.h +++ b/src/include/parser/kwlist.h @@ -171,6 +171,9 @@ PG_KEYWORD("datatype_cl", DATATYPE_CL, UNRESERVED_KEYWORD) PG_KEYWORD("date", DATE_P, COL_NAME_KEYWORD) PG_KEYWORD("date_format", DATE_FORMAT_P, UNRESERVED_KEYWORD) PG_KEYWORD("day", DAY_P, UNRESERVED_KEYWORD) +PG_KEYWORD("day_hour", DAY_HOUR_P, UNRESERVED_KEYWORD) +PG_KEYWORD("day_minute", DAY_MINUTE_P, UNRESERVED_KEYWORD) +PG_KEYWORD("day_second", DAY_SECOND_P, UNRESERVED_KEYWORD) PG_KEYWORD("dbcompatibility", DBCOMPATIBILITY_P, UNRESERVED_KEYWORD) PG_KEYWORD("deallocate", DEALLOCATE, UNRESERVED_KEYWORD) PG_KEYWORD("dec", DEC, COL_NAME_KEYWORD) @@ -284,6 +287,8 @@ PG_KEYWORD("hdfsdirectory", HDFSDIRECTORY, TYPE_FUNC_NAME_KEYWORD) PG_KEYWORD("header", HEADER_P, UNRESERVED_KEYWORD) PG_KEYWORD("hold", HOLD, UNRESERVED_KEYWORD) PG_KEYWORD("hour", HOUR_P, UNRESERVED_KEYWORD) +PG_KEYWORD("hour_minute", HOUR_MINUTE_P, UNRESERVED_KEYWORD) +PG_KEYWORD("hour_second", HOUR_SECOND_P, UNRESERVED_KEYWORD) /* new key-word for ALTER ROLE */ PG_KEYWORD("identified", IDENTIFIED, UNRESERVED_KEYWORD) PG_KEYWORD("identity", IDENTITY_P, UNRESERVED_KEYWORD) @@ -376,6 +381,7 @@ PG_KEYWORD("merge", MERGE, UNRESERVED_KEYWORD) PG_KEYWORD("minextents", MINEXTENTS, UNRESERVED_KEYWORD) PG_KEYWORD("minus", MINUS_P, RESERVED_KEYWORD) PG_KEYWORD("minute", MINUTE_P, UNRESERVED_KEYWORD) +PG_KEYWORD("minute_second", MINUTE_SECOND_P, UNRESERVED_KEYWORD) PG_KEYWORD("minvalue", MINVALUE, UNRESERVED_KEYWORD) PG_KEYWORD("mode", MODE, UNRESERVED_KEYWORD) PG_KEYWORD("model", MODEL, UNRESERVED_KEYWORD) @@ -693,5 +699,6 @@ PG_KEYWORD("xmlpi", XMLPI, COL_NAME_KEYWORD) PG_KEYWORD("xmlroot", XMLROOT, COL_NAME_KEYWORD) PG_KEYWORD("xmlserialize", XMLSERIALIZE, COL_NAME_KEYWORD) PG_KEYWORD("year", YEAR_P, UNRESERVED_KEYWORD) +PG_KEYWORD("year_month", YEAR_MONTH_P, UNRESERVED_KEYWORD) PG_KEYWORD("yes", YES_P, UNRESERVED_KEYWORD) PG_KEYWORD("zone", ZONE, UNRESERVED_KEYWORD) diff --git a/src/test/regress/expected/event.out b/src/test/regress/expected/event.out index 40abb708f..20a8cd239 100644 --- a/src/test/regress/expected/event.out +++ b/src/test/regress/expected/event.out @@ -413,6 +413,65 @@ select job_name, nspname from pg_job where dbname='event_b'; drop event if exists evtest; NOTICE: event "evtest" is not exists, skipping +--test time unit +drop event if exists ev_unit; +NOTICE: event "ev_unit" is not exists, skipping +create event ev_unit on schedule every '1-1' YEAR_MONTH do select 1; +select interval from pg_job where job_name='ev_unit'; + interval +------------------------------- + interval '1-1' year to month +(1 row) + +drop event if exists ev_unit; +create event ev_unit on schedule every '-1 10' DAY_HOUR do select 1; +select interval from pg_job where job_name='ev_unit'; + interval +------------------------------- + interval '-1 10' day to hour +(1 row) + +drop event if exists ev_unit; +create event ev_unit on schedule every '1 1:00' DAY_MINUTE do select 1; +select interval from pg_job where job_name='ev_unit'; + interval +---------------------------------- + interval '1 1:00' day to minute +(1 row) + +drop event if exists ev_unit; +create event ev_unit on schedule every '1 1:1:1' DAY_SECOND do select 1; +select interval from pg_job where job_name='ev_unit'; + interval +----------------------------------- + interval '1 1:1:1' day to second +(1 row) + +drop event if exists ev_unit; +create event ev_unit on schedule every '1:1:1' HOUR_MINUTE do select 1; +select interval from pg_job where job_name='ev_unit'; + interval +---------------------------------- + interval '1:1:1' hour to minute +(1 row) + +drop event if exists ev_unit; +create event ev_unit on schedule every '1:1' MINUTE_SECOND do select 1; +select interval from pg_job where job_name='ev_unit'; + interval +---------------------------------- + interval '1:1' minute to second +(1 row) + +drop event if exists ev_unit; +create event ev_unit on schedule every '01:12:30' HOUR_SECOND do select 1; +select interval from pg_job where job_name='ev_unit'; + interval +------------------------------------- + interval '01:12:30' hour to second +(1 row) + +drop event if exists ev_unit; --if not exists create event e on schedule every 1 month disable do select 1; select pg_sleep(0.2); @@ -907,7 +966,7 @@ schedule_expr: { interval_expr: quantity {YEAR | MONTH | DAY | HOUR | MINUTE | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE | - DAY TO SECOND | HOUR TO MINUTE | HOUR TO SECOND | MINUTE TO SECOND} + DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND} \h ALTER EVENT Command: ALTER EVENT diff --git a/src/test/regress/sql/event.sql b/src/test/regress/sql/event.sql index 677b02746..ad0a134a5 100644 --- a/src/test/regress/sql/event.sql +++ b/src/test/regress/sql/event.sql @@ -119,6 +119,29 @@ create event IF NOT EXISTS evtest on schedule every 1 minute starts sysdate + in select pg_sleep(0.2); select job_name, nspname from pg_job where dbname='event_b'; drop event if exists evtest; +--test time unit +drop event if exists ev_unit; +create event ev_unit on schedule every '1-1' YEAR_MONTH do select 1; +select interval from pg_job where job_name='ev_unit'; +drop event if exists ev_unit; +create event ev_unit on schedule every '-1 10' DAY_HOUR do select 1; +select interval from pg_job where job_name='ev_unit'; +drop event if exists ev_unit; +create event ev_unit on schedule every '1 1:00' DAY_MINUTE do select 1; +select interval from pg_job where job_name='ev_unit'; +drop event if exists ev_unit; +create event ev_unit on schedule every '1 1:1:1' DAY_SECOND do select 1; +select interval from pg_job where job_name='ev_unit'; +drop event if exists ev_unit; +create event ev_unit on schedule every '1:1:1' HOUR_MINUTE do select 1; +select interval from pg_job where job_name='ev_unit'; +drop event if exists ev_unit; +create event ev_unit on schedule every '1:1' MINUTE_SECOND do select 1; +select interval from pg_job where job_name='ev_unit'; +drop event if exists ev_unit; +create event ev_unit on schedule every '01:12:30' HOUR_SECOND do select 1; +select interval from pg_job where job_name='ev_unit'; +drop event if exists ev_unit; --if not exists