首先先上两篇官方的文档:
openGauss升级脚本撰写经验总结
openGauss升级脚本撰写
对于更加具体的操作,可以参考92_364这一个脚本,长度短好参考,目录:
src/include/catalog/upgrade_sql/upgrade_catalog_maindb/upgrade_catalog_maindb_92_364.sql
函数的升级脚本
官方在《openGauss升级脚本撰写经验总结》中给出了一种基于新库自动生成函数升级脚本的sql命令,
原理就是读新函数的定义,按照升级脚本的格式输出,这样就避免了手残填错参数的可能性。
-- 先创建这个table
create table addfuncs(name varchar(100));
-- 这里往table插入需要升级的函数的函数名
insert into addfuncs values('int32_b_format_date');
-- 这里相当于读取这些新函数的定义,按照升级脚本的格式输出
SELECT format(
'SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, %s;
CREATE OR REPLACE FUNCTION pg_catalog.%s (%s) RETURNS %s LANGUAGE INTERNAL %s %s as ''%s'';
%s',
oid,
proname,
pg_catalog.pg_get_function_arguments(oid),
pg_catalog.pg_get_function_result(oid),
case when provolatile='i' then 'IMMUTABLE' when provolatile='s' then 'STABLE' when provolatile='v' then 'VOLATILE' END,
case when proisstrict = 't' then 'STRICT' else '' end,
prosrc,
case when proisagg='t' or proiswindow='t' then '--ERROR: THIS FUNCTION ABOVE IS AN AGG OR WINDOW' end)
FROM pg_proc
WHERE proname in (select name from addfuncs);
-- 这个是回滚脚本用的
SELECT format(
'DROP FUNCTION IF EXISTS pg_catalog.%s (%s);',
proname,
pg_catalog.pg_get_function_arguments(oid))
FROM pg_proc
WHERE proname in (select name from addfuncs);
有一个发现,好像和新建类型相关的函数是不用手动drop的,drop类型时可能就自动drop掉了。
类型的升级脚本
与上面自动生成函数升级脚本原理相同,我自己又写了一个类型的升级命令,不过这个功能十分简陋,还要手动把in,out放进去,
姑且算是半自动吧(逃
create table addtypes(name varchar(100));
insert into addtypes values('year');
SELECT format(
'SET LOCAL inplace_upgrade_next_system_object_oids = IUO_TYPE, %s, %s, %s;
CREATE TYPE pg_catalog.%s;
CREATE TYPE pg_catalog.%s (input=%s_in, output=%s_in, internallength=%s, passedbyvalue, alignment=%s);
',
oid,
typarray,
typtype,
typname,
typname,
typname,
typname,
typlen,
case when typalign='c' then 'char' when typalign='s' then 'short' when typalign='i' then 'int' when typalign='d' then 'double' end
)
FROM pg_type
WHERE typname in (select name from addtypes);
回退的时候记得把数组类型给回退回去,以year类型为例,回退是这样的:
DROP TYPE IF EXISTS pg_catalog.year CASCADE;
DROP TYPE IF EXISTS pg_catalog._year CASCADE;