15670430创建于 2020年12月28日历史提交
create user user1 password 'gauss@13';
create table user1.test1(id int);
create user user2 password 'gauss@13';
create table user2.test2(id int);
create role supper_user with sysadmin password 'Gauss@123';
\dt+ user1.test1
\dt+ user1.test1
 --change current role 
set role user1 password 'gauss@13';
select current_user;
SELECT current_schema;
--do not drop table user2.test2 in user1 schema
drop table user2.test2;
--do not create table temp for schema user2 in schema user1
create table user2.temp (id int);
--do not drop schema user2 int the schema user1
drop schema user2;
--do not drop current schema user1 in current schema user1
drop user user1 cascade;
--do grant user2 to user1 in the schema user1
grant user2 to user1; 
reset role;
 --grant user2 to user1 in case supperuser
set role user1 password 'gauss@13';
 --success drop table user2.test2 in user1 
drop table user2.test2;
 
--test tablespace
\! rm -fr '@testtablespace@/tbl_spc'
\! mkdir '@testtablespace@/tbl_spc'
-- failed, deny permission
CREATE TABLESPACE testspace LOCATION '@testtablespace@/tbl_spc' MAXSIZE '1K';
reset role;
CREATE TABLESPACE testspace LOCATION '@testtablespace@/tbl_spc' MAXSIZE '1K';
select * from pg_tablespace where spcname='testspace';
set role user1 password 'gauss@13';
--failed,deny permission
drop tablespace testspace;
reset role;
alter tablespace testspace owner to user1;
select spcname,pg_get_userbyid(spcowner)as spcowner from pg_tablespace where spcname='testspace';
set role user1 password 'gauss@13';
drop tablespace testspace;
reset role;
drop user user1 cascade;
drop user user2 cascade;
CREATE USER DFMM IDENTIFIED BY 'Gauss@123';
CREATE ROLE CBY IDENTIFIED BY 'Gauss@123';
CREATE SCHEMA CBY;
CREATE SCHEMA TEST;
set role supper_user password 'Gauss@123';
SELECT CURRENT_USER;
SELECT CURRENT_SCHEMA;
--------------------function------------------------
--ordinary function
CREATE OR REPLACE FUNCTION DFMM.INC_DFM(i INTEGER)
RETURNS INTEGER
AS $$
	BEGIN
		RETURN i + 1;
	END;
$$ LANGUAGE PLPGSQL;
CREATE OR REPLACE FUNCTION CBY.INC_CBY(i INTEGER)
RETURNS INTEGER
AS $$
	BEGIN
		RETURN i + 1;
	END;
$$ LANGUAGE PLPGSQL;
CREATE OR REPLACE FUNCTION TEST.INC_TEST(i INTEGER)
RETURNS INTEGER
AS $$
	BEGIN
		RETURN i + 1;
	END;
$$ LANGUAGE PLPGSQL;
SELECT PR.PRONAME,NS.NSPNAME,AU.ROLNAME,PR.PROISAGG
	FROM PG_PROC PR
	LEFT JOIN PG_NAMESPACE NS ON (PR.PRONAMESPACE = NS.OID)
	LEFT JOIN PG_AUTHID AU ON(PR.PROOWNER=AU.OID)
WHERE PRONAME IN ('inc_dfm','inc_cby','inc_test') ORDER BY PRONAME DESC;
DROP FUNCTION DFMM.INC_DFM;
DROP FUNCTION CBY.INC_CBY;
DROP FUNCTION TEST.INC_TEST;
--AGGREGATE 
CREATE OR REPLACE FUNCTION INC(START INT4,STEP INT4, NUM INT4)
RETURNS INTEGER
AS $$
	BEGIN
		RETURN START + STEP * NUM;
	END;
$$ LANGUAGE PLPGSQL;
CREATE AGGREGATE DFMM.INC_DFM(INT4,INT4)
(
	SFUNC = INC,
	STYPE = INT4,
	INITCOND = '0'
);
CREATE AGGREGATE CBY.INC_CBY(INT4,INT4)
(
	SFUNC = INC,
	STYPE = INT4,
	INITCOND = '0'
);
CREATE AGGREGATE TEST.INC_TEST(INT4,INT4)
(
	SFUNC = INC,
	STYPE = INT4,
	INITCOND = '0'
);
SELECT PR.PRONAME,NS.NSPNAME,AU.ROLNAME,PR.PROISAGG
	FROM PG_PROC PR
	LEFT JOIN PG_NAMESPACE NS ON (PR.PRONAMESPACE = NS.OID)
	LEFT JOIN PG_AUTHID AU ON(PR.PROOWNER=AU.OID)
WHERE PRONAME IN ('inc_dfm','inc_cby','inc_test') ORDER BY PRONAME DESC;
DROP FUNCTION INC(INT4,INT4,INT4) CASCADE;
--------------------type------------------------
--pseudo type
CREATE TYPE DFMM.TYPE_DFM_P;
CREATE TYPE CBY.TYPE_CBY_P;
CREATE TYPE TEST.TYPE_TEST_P;
SELECT TY.TYPNAME,NS.NSPNAME,AU.ROLNAME,TY.TYPTYPE
	FROM PG_TYPE TY
	LEFT JOIN PG_NAMESPACE NS ON (TY.TYPNAMESPACE = NS.OID)
	LEFT JOIN PG_AUTHID AU ON(TY.TYPOWNER=AU.OID)
WHERE TY.TYPNAME IN ('type_dfm_p','type_cby_p','type_test_p') ORDER BY TY.TYPNAME DESC;

DROP TYPE DFMM.TYPE_DFM_P;
DROP TYPE CBY.TYPE_CBY_P;
DROP TYPE TEST.TYPE_TEST_P;
--enum type
CREATE TYPE DFMM.TYPE_DFM_E AS ENUM('new', 'open', 'closed');
CREATE TYPE CBY.TYPE_CBY_E AS ENUM('new', 'open', 'closed');
CREATE TYPE TEST.TYPE_TEST_E AS ENUM('new', 'open', 'closed');
SELECT TY.TYPNAME,NS.NSPNAME,AU.ROLNAME,TY.TYPTYPE
	FROM PG_TYPE TY
	LEFT JOIN PG_NAMESPACE NS ON (TY.TYPNAMESPACE = NS.OID)
	LEFT JOIN PG_AUTHID AU ON(TY.TYPOWNER=AU.OID)
WHERE TY.TYPNAME IN('type_dfm_e','type_cby_e','type_test_e','_type_dfm_e','_type_cby_e','_type_test_e') ORDER BY TY.TYPNAME DESC;

DROP TYPE DFMM.TYPE_DFM_E;
DROP TYPE CBY.TYPE_CBY_E;
DROP TYPE TEST.TYPE_TEST_E;

--range type
CREATE TYPE DFMM.TYPE_R_DFM AS RANGE(SUBTYPE = INT4);
CREATE TYPE CBY.TYPE_R_CBY AS RANGE(SUBTYPE = INT4);
CREATE TYPE TEST.TYPE_R_TEST AS RANGE(SUBTYPE = INT4);
SELECT TY.TYPNAME,NS.NSPNAME,AU.ROLNAME,TY.TYPTYPE
	FROM PG_TYPE TY
	LEFT JOIN PG_NAMESPACE NS ON (TY.TYPNAMESPACE = NS.OID)
	LEFT JOIN PG_AUTHID AU ON(TY.TYPOWNER=AU.OID)
WHERE TY.TYPNAME IN('type_r_dfm','type_r_cby','type_r_test','_type_r_dfm','_type_r_cby','_type_r_test') ORDER BY TY.TYPNAME DESC;

DROP TYPE DFMM.TYPE_R_DFM;
DROP TYPE CBY.TYPE_R_CBY;
DROP TYPE TEST.TYPE_R_TEST;
--domain type
CREATE DOMAIN DFMM.TYPE_D_DFM AS INT4;
CREATE DOMAIN CBY.TYPE_D_CBY AS INT4;
CREATE DOMAIN TEST.TYPE_D_TEST AS INT4;
SELECT TY.TYPNAME,NS.NSPNAME,AU.ROLNAME,TY.TYPTYPE
	FROM PG_TYPE TY
	LEFT JOIN PG_NAMESPACE NS ON (TY.TYPNAMESPACE = NS.OID)
	LEFT JOIN PG_AUTHID AU ON(TY.TYPOWNER=AU.OID)
WHERE TY.TYPNAME IN('type_d_dfm','type_d_cby','type_d_test') ORDER BY TY.TYPNAME DESC;

DROP TYPE DFMM.TYPE_D_DFM;
DROP TYPE CBY.TYPE_D_CBY;
DROP TYPE TEST.TYPE_D_TEST;
--composite type: invoke DefineRelation
CREATE TYPE DFMM.TYPE_C_DFM AS (F1 INT, F2 TEXT);
CREATE TYPE CBY.TYPE_C_CBY AS (F1 INT, F2 TEXT);
CREATE TYPE TEST.TYPE_C_TEST AS (F1 INT, F2 TEXT);
SELECT TY.TYPNAME,NS.NSPNAME,AU.ROLNAME,TY.TYPTYPE
	FROM PG_TYPE TY
	LEFT JOIN PG_NAMESPACE NS ON (TY.TYPNAMESPACE = NS.OID)
	LEFT JOIN PG_AUTHID AU ON(TY.TYPOWNER=AU.OID)
WHERE TY.TYPNAME IN ('type_c_dfm','type_c_cby','type_c_test') ORDER BY TY.TYPNAME DESC;

DROP TYPE DFMM.TYPE_C_DFM;
DROP TYPE CBY.TYPE_C_CBY;
DROP TYPE TEST.TYPE_C_TEST;

--base type
--------------------operator------------------------
CREATE FUNCTION NEQ(INT4, INT4) RETURNS BOOL
	AS 'SELECT $1 <> $2;'
	LANGUAGE SQL
	IMMUTABLE
	RETURNS NULL ON NULL INPUT;
CREATE OPERATOR CBY.<<>> (
	LEFTARG = INT4,
	RIGHTARG = INT4,
	PROCEDURE = Neq,
	COMMUTATOR = =>>> ,
	NEGATOR = =<<<
);
CREATE OPERATOR TEST.<<>> (
	LEFTARG = INT4,
	RIGHTARG = INT4,
	PROCEDURE = Neq,
	COMMUTATOR = =>>>>,
	NEGATOR = =<<<<
);
SELECT OP.OPRNAME,NS.NSPNAME,AU.ROLNAME
	FROM PG_OPERATOR OP
	LEFT JOIN PG_NAMESPACE NS ON (OP.OPRNAMESPACE=NS.OID)
	LEFT JOIN PG_AUTHID AU ON (OP.OPROWNER=AU.OID)
WHERE OP.OPRNAME IN ('<<>>','=>>','=<<','=>>>','=<<<','=>>>>','=<<<<') ORDER BY OP.OPRNAME DESC;

DROP OPERATOR CBY.<<>> ( INT4, INT4);
DROP OPERATOR TEST.<<>> ( INT4, INT4);
DROP OPERATOR =>> ( INT4, INT4);
DROP OPERATOR =<< ( INT4, INT4);
DROP OPERATOR =>>> ( INT4, INT4);
DROP OPERATOR =<<< ( INT4, INT4);
DROP OPERATOR =>>>> ( INT4, INT4);
DROP OPERATOR =<<<< ( INT4, INT4);
DROP FUNCTION NEQ(INT4, INT4);

DROP SCHEMA CBY;
DROP SCHEMA TEST;
DROP USER CBY;
DROP USER DFMM;
reset role;
drop user supper_user cascade;

--cstore test
create user cstore_user password 'Gauss@123';
set role cstore_user password 'Gauss@123';
create table test_user_cstore(id int) with(orientation = column);
create index test_user_cstore_idx on test_user_cstore(id);
\c
drop user cstore_user cascade;