Files
openGauss-server/src/test/regress/sql/event.sql

489 lines
20 KiB
SQL

drop database if exists event_b;
create database event_b with dbcompatibility 'b';
\c event_b
create user event_a sysadmin password 'event_123';
create user event_b sysadmin password 'event_123';
--CREATE EVENT
--Schedule Parameter Test
--CHECK Schedule AT .. situation
create event IF NOT EXISTS ee11 on schedule at '2022-12-09 17:24:11' disable do insert into t values(0);
select pg_sleep(0.2);
select job_name, nspname from pg_job where dbname='event_b';
drop event if exists ee11;
create event IF NOT EXISTS ee11 on schedule at sysdate disable do insert into t values(0);
select pg_sleep(0.2);
select job_name, nspname from pg_job where dbname='event_b';
drop event if exists ee11;
create event IF NOT EXISTS ee11 on schedule at CURRENT_DATE disable do insert into t values(0);
select pg_sleep(0.2);
select job_name, nspname from pg_job where dbname='event_b';
drop event if exists ee11;
create event IF NOT EXISTS ee11 on schedule at CURRENT_TIME disable do insert into t values(0);
select pg_sleep(0.2);
select job_name, nspname from pg_job where dbname='event_b';
drop event if exists ee11;
create event IF NOT EXISTS ee11 on schedule at CURRENT_TIME (1) disable do insert into t values(0);
select pg_sleep(0.2);
select job_name, nspname from pg_job where dbname='event_b';
drop event if exists ee11;
create event IF NOT EXISTS ee11 on schedule at CURRENT_TIMESTAMP disable do insert into t values(0);
select pg_sleep(0.2);
select job_name, nspname from pg_job where dbname='event_b';
drop event if exists ee11;
create event IF NOT EXISTS ee11 on schedule at CURRENT_TIMESTAMP (1) disable do insert into t values(0);
select pg_sleep(0.2);
select job_name, nspname from pg_job where dbname='event_b';
drop event if exists ee11;
create event IF NOT EXISTS ee11 on schedule at LOCALTIME disable do insert into t values(0);
select pg_sleep(0.2);
select job_name, nspname from pg_job where dbname='event_b';
drop event if exists ee11;
create event IF NOT EXISTS ee11 on schedule at LOCALTIME (1) disable do insert into t values(0);
select pg_sleep(0.2);
select job_name, nspname from pg_job where dbname='event_b';
drop event if exists ee11;
create event IF NOT EXISTS ee11 on schedule at LOCALTIMESTAMP disable do insert into t values(0);
select pg_sleep(0.2);
select job_name, nspname from pg_job where dbname='event_b';
drop event if exists ee11;
create event IF NOT EXISTS ee11 on schedule at LOCALTIMESTAMP (1) disable do insert into t values(0);
select pg_sleep(0.2);
select job_name, nspname from pg_job where dbname='event_b';
drop event if exists ee11;
create event IF NOT EXISTS ee11 on schedule at LOCALTIMESTAMP (1) disable do insert into t values(0);
select pg_sleep(0.2);
select job_name, nspname from pg_job where dbname='event_b';
drop event if exists ee11;
create event IF NOT EXISTS ee11 on schedule at now() disable do insert into t values(0);
select pg_sleep(0.2);
select job_name, nspname from pg_job where dbname='event_b';
drop event if exists ee11;
create event IF NOT EXISTS ee11 on schedule at CURRENT_TIMESTAMP + interval 1 minute disable do insert into t values(0);
select pg_sleep(0.2);
select job_name, nspname from pg_job where dbname='event_b';
drop event if exists ee11;
create event IF NOT EXISTS ee11 on schedule at SYSDATE + interval 10 second disable do insert into t values(0);
select pg_sleep(0.2);
select job_name, nspname from pg_job where dbname='event_b';
drop event if exists ee11;
create event IF NOT EXISTS ee11 on schedule at SYSDATE + interval 0.5 second disable do insert into t values(0);
select pg_sleep(0.2);
select job_name, nspname from pg_job where dbname='event_b';
drop event if exists ee11;
create event IF NOT EXISTS ee11 on schedule at now() + interval 1 hour disable do insert into t values(0);
select pg_sleep(0.2);
select job_name, nspname from pg_job where dbname='event_b';
drop event if exists ee11;
create event IF NOT EXISTS ee11 on schedule at LOCALTIMESTAMP + interval '00:00' minute to second disable do insert into t values(0);
select pg_sleep(0.2);
select job_name, nspname from pg_job where dbname='event_b';
drop event if exists ee11;
create event IF NOT EXISTS ee11 on schedule at now() + interval 1 year + interval '00:00' minute to second disable do insert into t values(0);
select pg_sleep(0.2);
select job_name, nspname from pg_job where dbname='event_b';
drop event if exists ee11;
create event IF NOT EXISTS ee11 on schedule at now() + interval 666666666666666666666666666667 year + interval '00:00' minute to second disable do insert into t values(0);
select pg_sleep(0.2);
select job_name, nspname from pg_job where dbname='event_b';
drop event if exists ee11;
create event IF NOT EXISTS ee11 on schedule at sysdate + interval 1234567890 second + interval 1234567890 minute disable do insert into t values(0);
select pg_sleep(0.2);
select job_name, nspname from pg_job where dbname='event_b';
drop event if exists ee11;
create event IF NOT EXISTS ee11 on schedule at sysdate + interval 1.5 second + interval 1.33 minute disable do insert into t values(0);
select pg_sleep(0.2);
select job_name, nspname from pg_job where dbname='event_b';
drop event if exists ee11;
--CHECK Schedule EVERY ..situation
create event IF NOT EXISTS evtest on schedule every 1 minute disable do insert into t values(0);
select pg_sleep(0.2);
select job_name, nspname from pg_job where dbname='event_b';
drop event if exists evtest;
create event IF NOT EXISTS evtest on schedule every '00:30' minute to second disable do insert into t values(0);
select pg_sleep(0.2);
select job_name, nspname from pg_job where dbname='event_b';
drop event if exists evtest;
create event IF NOT EXISTS evtest on schedule every 1 minute starts sysdate disable do insert into t values(0);
select pg_sleep(0.2);
select job_name, nspname from pg_job where dbname='event_b';
drop event if exists evtest;
create event IF NOT EXISTS evtest on schedule every 1 minute ends sysdate + interval 1 hour disable do insert into t values(0);
select job_name, nspname from pg_job where dbname='event_b';
drop event if exists evtest;
create event IF NOT EXISTS evtest on schedule every 1 minute starts sysdate + interval 1 day ends now() + interval 1 year disable do insert into t values(0);
select pg_sleep(0.2);
select job_name, nspname from pg_job where dbname='event_b';
drop event if exists evtest;
create event IF NOT EXISTS evtest on schedule every 1 minute starts sysdate + interval 1 day + interval '00:99' minute to second disable do insert into t values(0);
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
create event e on schedule every 1 month disable do select 1;
select pg_sleep(0.2);
create event e on schedule at sysdate disable do select 1;
select pg_sleep(0.2);
create event if not exists e on schedule at sysdate disable do select 1;
select pg_sleep(0.2);
drop event e;
--auto_drop
drop event e;
create event e on schedule at sysdate disable do select 1;
select pg_sleep(0.2);
drop event e;
create event e on schedule at sysdate on completion not preserve disable do select 1;
select pg_sleep(0.2);
drop event e;
create event e on schedule at sysdate on completion preserve disable do select 1;
drop event e;
--job_status
create event e on schedule every 1 hour do select 1;
drop event e;
create event e on schedule every 1 hour enable do select 1;
drop event e;
create event e on schedule every 1 hour disable do select 1;
drop event e;
create event e on schedule every 1 hour disable on slave do select 1;
drop event e;
--comment
create event e on schedule at sysdate disable do select 1;
select pg_sleep(0.2);
drop event e;
create event e on schedule at sysdate disable comment '======' do select 1;
select pg_sleep(0.2);
drop event e;
create event e on schedule at sysdate disable comment 'fsdfjksadfhkjsfafkjsdfhjkahfdsknvxhguiyeurfbsdbccguyaHUFAWEFKSJBFCNJNDAgudagsHJBHDSBHJFBSAHBkjbhjbhjBHJBUbhbhBYGUIOInkb' do select 1;
select pg_sleep(0.2);
drop event e;
create event e on schedule at now() disable
comment '=================================================================================================
==========================================================================================================
==========================================================================================================
==========================================================================================================
==========================================================================================================
'
do select 1;
select pg_sleep(0.2);
drop event e;
--sql body
--abort
CREATE TABLE customer_demographics_t1
(
CD_DEMO_SK INTEGER NOT NULL,
CD_GENDER CHAR(1) ,
CD_MARITAL_STATUS CHAR(1) ,
CD_EDUCATION_STATUS CHAR(20) ,
CD_PURCHASE_ESTIMATE INTEGER ,
CD_CREDIT_RATING CHAR(10) ,
CD_DEP_COUNT INTEGER ,
CD_DEP_EMPLOYED_COUNT INTEGER ,
CD_DEP_COLLEGE_COUNT INTEGER
)
WITH (ORIENTATION = COLUMN,COMPRESSION=MIDDLE)
;
INSERT INTO customer_demographics_t1 VALUES(1920801,'M', 'U', 'DOCTOR DEGREE', 200, 'GOOD', 1, 0,0);
SELECT * FROM customer_demographics_t1 WHERE cd_demo_sk = 1920801;
START TRANSACTION;
UPDATE customer_demographics_t1 SET cd_education_status= 'Unknown';
SELECT * FROM customer_demographics_t1 WHERE cd_demo_sk = 1920801;
create event e on schedule at sysdate do ABORT;
SELECT * FROM customer_demographics_t1 WHERE cd_demo_sk = 1920801;
DROP TABLE customer_demographics_t1;
ABORT;
--CALL
CREATE FUNCTION func_add_sql(num1 integer, num2 integer) RETURN integer
AS
BEGIN
RETURN num1 + num2;
END;
/
create event e on schedule at sysdate disable do CALL func_add_sql(1, 3);
DROP FUNCTION func_add_sql;
drop event e;
--ALTER EVENT
--alter schedule
\c event_b
drop event e;
create definer=event_a event e on schedule at '2023-01-16 21:05:40' disable do select 1;
show events where job_name='e';
alter definer=event_a event e on schedule at '2023-01-16 21:05:40' + interval 1 year;
show events where job_name='e';
alter definer=event_a event e on schedule every 1 year;
show events where job_name='e';
alter definer=event_a event e on schedule every 0.5 minute starts '2023-01-16 21:05:40' + interval '00:50' minute to second;
show events where job_name='e';
alter definer=event_a event e on schedule at '2023-01-16 21:05:40' + interval 500 second;
show events where job_name='e';
drop event e;
--alter auto_drop
drop event e;
create definer=event_a event e on schedule at '2023-01-16 21:05:40' disable do select 1;
show events where job_name='e';
select * from gs_job_attribute where job_name='e' and attribute_name='auto_drop';
drop event e;
create definer=event_a event e on schedule at '2023-01-16 21:05:40' on completion preserve disable do select 1;
show events where job_name='e';
select * from gs_job_attribute where job_name='e' and attribute_name='auto_drop';
alter definer=event_a event e on completion not preserve;
show events where job_name='e';
select * from gs_job_attribute where job_name='e' and attribute_name='auto_drop';
alter definer=event_a event e on completion preserve;
show events where job_name='e';
select * from gs_job_attribute where job_name='e' and attribute_name='auto_drop';
drop event e;
--alter event_name
drop event e;
create event e on schedule at '2023-01-16 21:05:40' disable do select 1;
select job_name, nspname from pg_job where dbname='event_b';
alter event e rename to e_new;
select job_name, nspname from pg_job where dbname='event_b';
select what,job_name from pg_job_proc where job_name='e_new';
alter event e_new rename to e;
select job_name, nspname from pg_job where dbname='event_b';
select what,job_name from pg_job_proc where job_name='e';
drop event e;
--alter status
drop table if exists a;
create table a(a int);
create event e on schedule at '2023-01-16 21:05:40' disable do insert into a values(0);
select * from a;
alter event e on schedule every 1 year enable do insert into a values(0);
select * from a;
truncate table a;
alter event e disable;
select * from a;
drop event e;
create event e on schedule every 1 minute starts '3000-01-16 21:05:40' do select 1;
select enable from pg_job where job_name='e';
alter event e disable;
select enable from pg_job where job_name='e';
alter event e enable;
select enable from pg_job where job_name='e';
drop event e;
--Alter event combination test.
drop event e;
create event e on schedule at '2023-01-16 21:05:40' disable do select 1;
alter definer=event_b event e on schedule every 1 year ends '2023-01-16 21:05:40' + interval 1 year;
alter event e disable;
alter event e do select 2;
alter event e rename to ee comment 'test ee' do select sysdate;
alter event ee comment '========test=========';
alter event ee on schedule at '2023-01-16 21:05:40' + interval 1 year on completion preserve rename to test_e;
drop event if exists test_e;
--Test owner
create user evtest_owner password 'event_123';
create event e on schedule at sysdate disable do select 1;
alter definer=evtest_owner event e;
select log_user, priv_user from pg_job where job_name='e';
alter event e rename to ee;
alter definer=evtest_owner event ee rename to e;
select log_user, priv_user from pg_job where job_name='e';
create definer=evtest_owner event e_a on schedule at sysdate disable do select 1;
select log_user, priv_user from pg_job where job_name='e_a';
alter event e_a rename to ea;
alter definer=evtest_owner event ea rename to e_a;
select log_user, priv_user from pg_job where job_name='e_a';
select log_user, priv_user from pg_job where dbname='event_b';
drop user evtest_owner;
select log_user, priv_user from pg_job where dbname='event_b';
select * from gs_job_attribute where job_name='e' or job_name='e_a';
--SHOW EVENTS
drop event if exists e1;
create definer=event_a event e1 on schedule at '2023-01-16 21:05:40' disable do select 1;
select job_name, nspname from pg_job where dbname='event_b';
show events in a;
show events from a;
show events like 'e';
show events like 'e%';
show events like 'e_';
show events where job_name='e1';
drop event if exists e1;
--security check
drop user if exists event_se_a cascade;
drop user if exists event_se_b cascade;
drop user if exists event_se_c cascade;
drop user if exists event_se_d cascade;
create user event_se_a with MONADMIN password 'event_123';
create user event_se_b with OPRADMIN password 'event_123';
create user event_se_c with INDEPENDENT password 'event_123';
create user event_se_d with SYSADMIN password 'event_123';
drop event if exists e;
create definer=event_se_a event e on schedule at sysdate do select 1;
create definer=event_se_b event e on schedule at sysdate do select 1;
create definer=event_se_c event e on schedule at sysdate do select 1;
create definer=event_se_d event e on schedule at sysdate do select 1;
drop event if exists e;
create event e on schedule at sysdate disable do select 1;
alter definer=event_se_a event e;
alter definer=event_se_b event e;
alter definer=event_se_c event e;
alter definer=event_se_d event e;
drop event if exists e;
\c event_b
drop user if exists event_se_a cascade;
drop user if exists event_se_b cascade;
drop user if exists event_se_c cascade;
drop user if exists event_se_d cascade;
--test privilege
drop user if exists priv_a cascade;
drop user if exists priv_b cascade;
drop user if exists priv_c cascade;
create user priv_a password 'event_123';
create user priv_b with sysadmin password 'event_123';
create user priv_c password 'event_123';
--test CREATE
set role priv_a password 'event_123';
drop event if exists priv_e_a;
--fail Non-administrator users do not have the permission
create event priv_b.priv_e_a on schedule at sysdate disable do select 1;
\c event_b
grant create on schema priv_b to priv_a;
set role priv_a password 'event_123';
--success
create event priv_b.priv_e_a on schedule at sysdate disable do select 1;
drop event if exists priv_e_a;
set role priv_b password 'event_123';
--success
drop event if exists priv_e_b;
create event priv_a.priv_e_b on schedule at sysdate disable do select 1;
drop event if exists priv_e_b;
-- event execute failed and auto_drop is true, shuold drop event
create event priv_a.failed_and_drop on schedule at now() do insert into t-t-t select 666; -- execute failed, and should drop event
select pg_sleep(1);
select count(*) from pg_job where job_name = 'failed_and_drop';
create event priv_a.failed_and_drop on schedule at now() on completion preserve do insert into t-t-t select 1689; -- execute failed, don't drop
select pg_sleep(1);
select count(*) from pg_job where job_name = 'failed_and_drop';
\c event_b
revoke all on schema priv_b from priv_a;
--test ALTER
set role priv_a password 'event_123';
drop event if exists priv_e_a;
create event priv_a.priv_e_a on schedule at sysdate disable do select 1;
--fail Non-administrator users do not have the permission
set role priv_c password 'event_123';
alter event priv_a.priv_e_a do select 2;
\c event_b
grant usage on schema priv_a to priv_c;
set role priv_c password 'event_123';
--fail only owner and sysadmin user have the permission
alter event priv_a.priv_e_a do select 2;
\c event_b
alter definer = priv_c event priv_a.priv_e_a;
set role priv_c password 'event_123';
--success
alter event priv_a.priv_e_a do select 2;
drop event if exists priv_e_a;
set role priv_a password 'event_123';
drop event if exists priv_e_a;
create event priv_a.priv_e_a on schedule at sysdate disable do select 1;
set role priv_b password 'event_123';
--success
alter event priv_a.priv_e_a do select 2;
drop event if exists priv_e_a;
revoke all on schema priv_a from priv_c;
--test DROP
set role priv_a password 'event_123';
drop event if exists priv_e_a;
create event priv_a.priv_e_a on schedule at sysdate disable do select 1;
set role priv_c password 'event_123';
--fail Non-administrator users do not have the permission
drop event if exists priv_e_a;
create event if not exists ee11 on schedule at now() + interval 1 second do update t1 set a = 0 where a = 1;
select pg_sleep(2);
select job_name, enable, failure_msg from pg_job where job_name = 'ee11';
\c event_b
grant usage on schema priv_a to priv_c;
set role priv_c password 'event_123';
--fail only owner and sysadmin user have the permission
drop event if exists priv_e_a;
--success
set role priv_a password 'event_123';
drop event if exists priv_e_a;
create event priv_a.priv_e_a on schedule at sysdate disable do select 1;
set role priv_b password 'event_123';
--success
drop event if exists priv_e_a;
\c event_b
drop user if exists priv_a cascade;
drop user if exists priv_b cascade;
drop user if exists priv_c cascade;
--test sql help
\h CREATE EVENT
\h ALTER EVENT
\h DROP EVENT
\h SHOW EVENTS
drop table if exists event_a.a;
drop table if exists event_b.t;
drop schema if exists event_a;
drop schema if exists event_b;
drop user if exists event_a;
drop user if exists event_b;
\c regression
drop database if exists event_b;