init
This commit is contained in:
363
createudf.sql
Executable file
363
createudf.sql
Executable file
@@ -0,0 +1,363 @@
|
||||
-- 登录数据库,切换postgres用户,输入创建用户自定函数语句.用下面的命令为PostgreSQL定义这些函数:
|
||||
-- 创建的函数名为sahe_add(text, text, text),该函数输入两个text类型的数据,返回类型为text的计算结果.
|
||||
-- 其余函数#sahe_addplain,sahe_substract,sahe_multiply,sahe_negate,smhe_multiply,smhe_multiplyplain,
|
||||
-- smhe_divide,smhe_pow,smhe_inverse,以此类推.
|
||||
-- $libdir的实际目录位置可以用pg_config --pkglibdir命令找到。
|
||||
CREATE OR REPLACE FUNCTION sahe_add(text, text, text, text) RETURNS text
|
||||
AS
|
||||
'$libdir/libudf',
|
||||
'sahe_add'
|
||||
COST 5000
|
||||
PARALLEL SAFE
|
||||
LANGUAGE C;
|
||||
CREATE OR REPLACE FUNCTION sahe_addplain(text, INTEGER) RETURNS text
|
||||
AS
|
||||
'$libdir/libudf',
|
||||
'sahe_addplain'
|
||||
COST 5000
|
||||
PARALLEL SAFE
|
||||
LANGUAGE C;
|
||||
CREATE OR REPLACE FUNCTION sahe_substract(text, text, text, text) RETURNS text
|
||||
AS
|
||||
'$libdir/libudf',
|
||||
'sahe_substract'
|
||||
COST 5000
|
||||
PARALLEL SAFE
|
||||
LANGUAGE C;
|
||||
CREATE OR REPLACE FUNCTION sahe_sbustract(text, text, text, text) RETURNS text
|
||||
AS
|
||||
'$libdir/libudf',
|
||||
'sahe_substract'
|
||||
COST 5000
|
||||
PARALLEL SAFE
|
||||
LANGUAGE C;
|
||||
CREATE OR REPLACE FUNCTION sahe_multiply(text, INTEGER) RETURNS text
|
||||
AS
|
||||
'$libdir/libudf',
|
||||
'sahe_multiply'
|
||||
COST 5000
|
||||
PARALLEL SAFE
|
||||
LANGUAGE C;
|
||||
CREATE OR REPLACE FUNCTION sahe_negate(text) RETURNS text
|
||||
AS
|
||||
'$libdir/libudf',
|
||||
'sahe_negate'
|
||||
COST 5000
|
||||
PARALLEL SAFE
|
||||
LANGUAGE C;
|
||||
CREATE OR REPLACE FUNCTION smhe_multiply(text, text, text, text) RETURNS text
|
||||
AS
|
||||
'$libdir/libudf',
|
||||
'smhe_multiply'
|
||||
COST 5000
|
||||
PARALLEL SAFE
|
||||
LANGUAGE C;
|
||||
CREATE OR REPLACE FUNCTION smhe_multiplyplain(text, INTEGER) RETURNS text
|
||||
AS
|
||||
'$libdir/libudf',
|
||||
'smhe_multiplyplain'
|
||||
COST 5000
|
||||
PARALLEL SAFE
|
||||
LANGUAGE C;
|
||||
CREATE OR REPLACE FUNCTION smhe_divide(text, text, text, text) RETURNS text
|
||||
AS
|
||||
'$libdir/libudf',
|
||||
'smhe_divide'
|
||||
COST 5000
|
||||
PARALLEL SAFE
|
||||
LANGUAGE C;
|
||||
CREATE OR REPLACE FUNCTION smhe_pow(text, text, INTEGER) RETURNS text
|
||||
AS
|
||||
'$libdir/libudf',
|
||||
'smhe_pow'
|
||||
COST 5000
|
||||
PARALLEL SAFE
|
||||
LANGUAGE C;
|
||||
CREATE OR REPLACE FUNCTION smhe_inverse(text) RETURNS text
|
||||
AS
|
||||
'$libdir/libudf',
|
||||
'smhe_inverse'
|
||||
COST 5000
|
||||
PARALLEL SAFE
|
||||
LANGUAGE C;
|
||||
CREATE OR REPLACE FUNCTION udf_ore_lt(text, text, text, text) RETURNS BOOLEAN
|
||||
AS
|
||||
'$libdir/libudf',
|
||||
'udf_ore_lt'
|
||||
COST 5000
|
||||
PARALLEL SAFE
|
||||
LANGUAGE C;
|
||||
CREATE OR REPLACE FUNCTION udf_ore_le(text, text, text, text) RETURNS BOOLEAN
|
||||
AS
|
||||
'$libdir/libudf',
|
||||
'udf_ore_le'
|
||||
COST 5000
|
||||
PARALLEL SAFE
|
||||
LANGUAGE C;
|
||||
CREATE OR REPLACE FUNCTION udf_ore_gt(text, text, text, text) RETURNS BOOLEAN
|
||||
IMMUTABLE
|
||||
AS
|
||||
'$libdir/libudf',
|
||||
'udf_ore_gt'
|
||||
COST 5000
|
||||
PARALLEL SAFE
|
||||
LANGUAGE C;
|
||||
CREATE OR REPLACE FUNCTION udf_ore_ge(text, text, text, text) RETURNS BOOLEAN
|
||||
AS
|
||||
'$libdir/libudf',
|
||||
'udf_ore_ge'
|
||||
COST 5000
|
||||
PARALLEL SAFE
|
||||
LANGUAGE C;
|
||||
CREATE OR REPLACE FUNCTION udf_ore_ee(text, text, text, text) RETURNS BOOLEAN
|
||||
AS
|
||||
'$libdir/libudf',
|
||||
'udf_ore_ee'
|
||||
COST 5000
|
||||
PARALLEL SAFE
|
||||
LANGUAGE C;
|
||||
CREATE OR REPLACE FUNCTION udf_ore_ne(text, text, text, text) RETURNS BOOLEAN
|
||||
AS
|
||||
'$libdir/libudf',
|
||||
'udf_ore_ne'
|
||||
COST 5000
|
||||
PARALLEL SAFE
|
||||
LANGUAGE C;
|
||||
DROP AGGREGATE IF EXISTS sahe_sum(text, text);
|
||||
DROP AGGREGATE IF EXISTS ore_max(text, text);
|
||||
DROP AGGREGATE IF EXISTS ore_min(text, text);
|
||||
CREATE OR REPLACE FUNCTION sum_sahe_sfunc(text, text, text) RETURNS text
|
||||
AS
|
||||
'$libdir/libudf',
|
||||
'sum_sahe_sfunc'
|
||||
COST 5000
|
||||
LANGUAGE C
|
||||
IMMUTABLE
|
||||
STRICT;
|
||||
CREATE AGGREGATE sahe_sum(text, text)
|
||||
(
|
||||
sfunc = sum_sahe_sfunc,
|
||||
stype = text,
|
||||
initcond = ''
|
||||
);
|
||||
CREATE OR REPLACE FUNCTION ore_max_sfunc(text, text, text) RETURNS text
|
||||
AS
|
||||
'$libdir/libudf',
|
||||
'ore_max_sfunc'
|
||||
COST 5000
|
||||
PARALLEL SAFE
|
||||
LANGUAGE C
|
||||
IMMUTABLE
|
||||
STRICT;
|
||||
CREATE OR REPLACE FUNCTION ore_max_final(text) RETURNS text
|
||||
AS
|
||||
'$libdir/libudf',
|
||||
'ore_max_final'
|
||||
COST 5000
|
||||
PARALLEL SAFE
|
||||
LANGUAGE C
|
||||
IMMUTABLE
|
||||
STRICT;
|
||||
CREATE AGGREGATE ore_max(text, text)
|
||||
(
|
||||
sfunc = ore_max_sfunc,
|
||||
finalfunc = ore_max_final,
|
||||
stype = text,
|
||||
initcond = ''
|
||||
);
|
||||
CREATE OR REPLACE FUNCTION ore_min_sfunc(text, text, text) RETURNS text
|
||||
AS
|
||||
'$libdir/libudf',
|
||||
'ore_min_sfunc'
|
||||
COST 5000
|
||||
PARALLEL SAFE
|
||||
LANGUAGE C
|
||||
IMMUTABLE
|
||||
STRICT;
|
||||
CREATE OR REPLACE FUNCTION ore_min_final(text) RETURNS text
|
||||
AS
|
||||
'$libdir/libudf',
|
||||
'ore_min_final'
|
||||
COST 5000
|
||||
PARALLEL SAFE
|
||||
LANGUAGE C
|
||||
IMMUTABLE
|
||||
STRICT;
|
||||
CREATE AGGREGATE ore_min(text, text)
|
||||
(
|
||||
sfunc = ore_min_sfunc,
|
||||
finalfunc = ore_min_final,
|
||||
stype = text,
|
||||
initcond = ''
|
||||
);
|
||||
CREATE TYPE ore_en;
|
||||
CREATE OR REPLACE FUNCTION ore_en_in(cstring) RETURNS ore_en
|
||||
AS
|
||||
'$libdir/libudf'
|
||||
LANGUAGE C IMMUTABLE
|
||||
STRICT;
|
||||
CREATE OR REPLACE FUNCTION ore_en_out(ore_en) RETURNS cstring
|
||||
AS
|
||||
'$libdir/libudf'
|
||||
LANGUAGE C IMMUTABLE
|
||||
STRICT;
|
||||
/*
|
||||
CREATE FUNCTION ore_en_recv(internal) RETURNS ore_en
|
||||
AS '$libdir/libudf'
|
||||
LANGUAGE C IMMUTABLE STRICT;
|
||||
CREATE FUNCTION ore_en_send(ore_en) RETURNS bytea
|
||||
AS '$libdir/libudf'
|
||||
LANGUAGE C IMMUTABLE STRICT;
|
||||
*/
|
||||
CREATE TYPE ore_en
|
||||
(
|
||||
input = ore_en_in,
|
||||
output = ore_en_out, --RECEIVE = ore_en_recv,
|
||||
--SEND = ore_en_send,
|
||||
INTERNALLENGTH = VARIABLE,
|
||||
STORAGE = extended,
|
||||
CATEGORY = 'S',
|
||||
PREFERRED = false,
|
||||
COLLATABLE = true
|
||||
);
|
||||
CREATE FUNCTION ore_en_abs_lt(ore_en, ore_en) RETURNS bool AS
|
||||
'$libdir/libudf' LANGUAGE C IMMUTABLE
|
||||
STRICT;
|
||||
CREATE FUNCTION ore_en_abs_le(ore_en, ore_en) RETURNS bool AS
|
||||
'$libdir/libudf' LANGUAGE C IMMUTABLE
|
||||
STRICT;
|
||||
CREATE FUNCTION ore_en_abs_gt(ore_en, ore_en) RETURNS bool AS
|
||||
'$libdir/libudf' LANGUAGE C IMMUTABLE
|
||||
STRICT;
|
||||
CREATE FUNCTION ore_en_abs_ge(ore_en, ore_en) RETURNS bool AS
|
||||
'$libdir/libudf' LANGUAGE C IMMUTABLE
|
||||
STRICT;
|
||||
CREATE FUNCTION ore_en_abs_eq(ore_en, ore_en) RETURNS bool AS
|
||||
'$libdir/libudf' LANGUAGE C IMMUTABLE
|
||||
STRICT;
|
||||
CREATE FUNCTION ore_en_abs_ne(ore_en, ore_en) RETURNS bool AS
|
||||
'$libdir/libudf' LANGUAGE C IMMUTABLE
|
||||
STRICT;
|
||||
CREATE OPERATOR < (
|
||||
leftarg = ore_en, rightarg = ore_en, procedure = ore_en_abs_lt,
|
||||
commutator = > , negator = >= ,
|
||||
restrict = scalarltsel, join = scalarltjoinsel
|
||||
);
|
||||
CREATE OPERATOR <= (
|
||||
leftarg = ore_en, rightarg = ore_en, procedure = ore_en_abs_le,
|
||||
commutator = >= , negator = > ,
|
||||
restrict = scalarltsel, join = scalarltjoinsel
|
||||
);
|
||||
CREATE OPERATOR = (
|
||||
leftarg = ore_en, rightarg = ore_en, procedure = ore_en_abs_eq,
|
||||
commutator = = ,
|
||||
restrict = eqsel, join = eqjoinsel
|
||||
);
|
||||
CREATE OPERATOR <> (
|
||||
leftarg = ore_en, rightarg = ore_en, procedure = ore_en_abs_ne,
|
||||
commutator = <> ,
|
||||
restrict = neqsel, join = neqjoinsel
|
||||
);
|
||||
CREATE OPERATOR >= (
|
||||
leftarg = ore_en, rightarg = ore_en, procedure = ore_en_abs_ge,
|
||||
commutator = <= , negator = < ,
|
||||
restrict = scalargtsel, join = scalargtjoinsel
|
||||
);
|
||||
CREATE OPERATOR > (
|
||||
leftarg = ore_en, rightarg = ore_en, procedure = ore_en_abs_gt,
|
||||
commutator = < , negator = <= ,
|
||||
restrict = scalargtsel, join = scalargtjoinsel
|
||||
);
|
||||
CREATE FUNCTION ore_en_abs_cmp(ore_en, ore_en) RETURNS int4
|
||||
AS
|
||||
'$libdir/libudf' LANGUAGE C IMMUTABLE
|
||||
STRICT;
|
||||
CREATE OPERATOR CLASS ore_en_abs_ops
|
||||
DEFAULT FOR TYPE ore_en USING btree AS
|
||||
OPERATOR 1 < ,
|
||||
OPERATOR 2 <= ,
|
||||
OPERATOR 3 <> ,
|
||||
OPERATOR 4 >= ,
|
||||
OPERATOR 5 > ,
|
||||
FUNCTION 1 ore_en_abs_cmp(ore_en, ore_en);
|
||||
CREATE OR REPLACE FUNCTION ore_en_min_sfunc(ore_en, ore_en, text) RETURNS ore_en
|
||||
AS
|
||||
'$libdir/libudf',
|
||||
'ore_en_min_sfunc'
|
||||
LANGUAGE C IMMUTABLE
|
||||
STRICT;
|
||||
CREATE OR REPLACE FUNCTION ore_en_min_final(ore_en) RETURNS ore_en
|
||||
AS
|
||||
'$libdir/libudf',
|
||||
'ore_en_min_final'
|
||||
LANGUAGE C IMMUTABLE
|
||||
STRICT;
|
||||
CREATE AGGREGATE ore_min(ore_en, text)
|
||||
(
|
||||
sfunc = ore_en_min_sfunc,
|
||||
finalfunc = ore_en_min_final,
|
||||
stype = ore_en,
|
||||
initcond = ''
|
||||
);
|
||||
CREATE OR REPLACE FUNCTION ore_en_max_sfunc(ore_en, ore_en, text) RETURNS ore_en
|
||||
AS
|
||||
'$libdir/libudf',
|
||||
'ore_en_max_sfunc'
|
||||
LANGUAGE C IMMUTABLE
|
||||
STRICT;
|
||||
CREATE OR REPLACE FUNCTION ore_en_max_final(ore_en) RETURNS ore_en
|
||||
AS
|
||||
'$libdir/libudf',
|
||||
'ore_en_max_final'
|
||||
LANGUAGE C IMMUTABLE
|
||||
STRICT;
|
||||
CREATE AGGREGATE ore_max(ore_en, text)
|
||||
(
|
||||
sfunc = ore_en_max_sfunc,
|
||||
finalfunc = ore_en_max_final,
|
||||
stype = ore_en,
|
||||
initcond = ''
|
||||
);
|
||||
|
||||
|
||||
|
||||
UPDATE pg_aggregate
|
||||
SET agginitval = NULL
|
||||
WHERE aggfnoid IN (SELECT oid
|
||||
FROM pg_proc
|
||||
WHERE proname IN ('ore_max', 'ore_min', 'sahe_sum'));
|
||||
|
||||
|
||||
-- 添加rotate_id列
|
||||
CREATE OR REPLACE FUNCTION add_rotate_id_column()
|
||||
RETURNS event_trigger AS $$
|
||||
DECLARE
|
||||
obj record;
|
||||
BEGIN
|
||||
FOR obj IN SELECT * FROM pg_event_trigger_ddl_commands() WHERE command_tag = 'CREATE TABLE' LOOP
|
||||
IF obj.object_type = 'table' AND obj.schema_name NOT IN ('pg_catalog', 'information_schema') THEN
|
||||
BEGIN
|
||||
EXECUTE format(
|
||||
'ALTER TABLE %s ADD COLUMN rotate_id SERIAL UNIQUE',
|
||||
obj.object_identity
|
||||
);
|
||||
RAISE NOTICE 'Added rotate_id to %', obj.object_identity;
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
RAISE WARNING 'Failed to add rotate_id to %: %', obj.object_identity, SQLERRM;
|
||||
END;
|
||||
END IF;
|
||||
END LOOP;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
-- DROP FUNCTION add_rotate_id_column();
|
||||
|
||||
-- 创建事件触发器
|
||||
CREATE EVENT TRIGGER add_rotate_id_trigger
|
||||
ON ddl_command_end
|
||||
WHEN TAG IN ('CREATE TABLE')
|
||||
EXECUTE FUNCTION add_rotate_id_column();
|
||||
|
||||
-- 如果需要删除触发器(测试时可能需要)
|
||||
-- DROP EVENT TRIGGER IF EXISTS add_rotate_id_trigger;
|
||||
Reference in New Issue
Block a user