How to Create an PostgreSQL Extension
转自:https://severalnines.com/blog/creating-new-modules-using-postgresql-create-extension
Extensibility is one of the most powerful feature in PostgreSQL. You can add new functionality for a particular use case by using contrib module and install it using CREATE EXTENSION.
In this section, we are going to learn how to create a simple contrib module and how to use its functionality in PostgreSQL.
Extension Files
To be able to run the CREATE EXTENSION command in your database, your extension must need at least two files:
- Control file
The file format must be extension_name.control, which tells the basics about extension to PostgreSQL, and must be placed in the installation’s SHAREDIR/extension directory. - SQL script file
The file in the format extension--version.sql contains the functions that you would like to add.
The file format of the control file in the extension is same as postgresql.conf file, namely a list of parameter_name = value assignments, one per line.
Example
Please check the below complete example of an SQL-only extension, create Oracle compatible NVL function in PostgreSQL. There are many cases but here we can consider only one case for example.
The SQL script file nvlfunc--1.0.sql looks like this...
Nvlfunc--1.0.sql file:
|
1
2
3
4
5
6
7
|
--complain if script is sourced in psql, rather than via CREATE EXTENSION\echo Use "CREATE EXTENSION nvlfunc" to load this file. \quitCREATE OR REPLACE FUNCTION public.NVL(SMALLINT,SMALLINT)RETURNS SMALLINT AS $$SELECT COALESCE($1,$2);$$ LANGUAGE SQL IMMUTABLE; |
The control file nvlfunc looks like this...
Nvlfunc.conntrol file:
|
1
2
3
4
5
|
# nvlfunc extensioncomment = 'Oracle compatible nvl function'default_version = '1.0'module_pathname = '$libdir/nvlfunc'relocatable = false |
While you hardly need a makefile to install these files into the correct directory, you could use a Makefile containing this:
Makefile:
|
1
2
3
4
5
6
|
EXTENSION = nvlfuncDATA = nvlfunc--1.0.sqlPG_CONFIG = pg_configPGXS := $(shell $(PG_CONFIG) --pgxs)include $(PGXS) |
If you have implemented the function using ‘C’ language then you need to add the file in the makefile.
Installation
The command make install will install the control file and sql script file into the correct directory as reported by pg_config.
Once the files are installed, use the CREATE EXTENSION command to load the objects into any particular database in PostgreSQL.
Please check the following steps to install the nvlfunc extension and you can also add this file in your extension directory:
INSTALL.nvlfunc file:
|
1
2
3
4
5
6
7
8
9
10
11
12
|
This module is a PostgreSQL extension which provides the Oracle compatible nvl function feature.Use below command in source directory of nvlfunc to install the module.make installThen use the below command to create extension nvlfunc in database.CREATE EXTENSION nvlfunc;Use the below command to remove the nvlfunc extension from database.DROP EXTENSION nvlfunc;Use below command in source directory of nvlfunc to uninstall the module.make uninstallNote:This extension module requires PostgreSQL 9.1 or later because CREATE EXTENSIONfeature is available in PostgreSQL 9.1 and later version. |
PostgreSQL extensions must be installed in your database before you can use their functionality. To install a particular extension, run the CREATE EXTENSION command from psql to load the packaged objects into the database.
Testing
Once you create the extension, it is recommended to create a test case for that extension so that when you are installing this module in a different PostgreSQL version, you can then check whether all the test cases are working as expected or not.
This is an optional step but you can create it. The test cases look like this:
sql/nvlfunc.sql file:
|
1
|
SELECT NVL(NULL::SMALLINT, 11::SMALLINT); |
Then you can add expected output in another file. The expected output file looks like this:
expected/nvlfunc.out file:
|
1
2
3
4
5
|
SELECT NVL(NULL::SMALLINT, 11::SMALLINT); nvl ----- 11(1 row) |
This is just one example, that’s why only one test case is added. But when you are creating a new extension, you can add more test cases.
Nvlfunc extension directory structure:
|
1
2
3
4
|
# mkdir nvlfunc# cd nvlfunc# lsMakefile nvlfunc.control nvlfunc--1.0.sql sql expected INSTALL.nvlfunc README |
Pros
- Easy to extend the PostgreSQL functionality
- Very easy to create and install the extension
- Easy to test for regressions on different versions of PostgreSQL
Cons
- There is no special cons but test the feature you are adding in the extension before you use it.
How to Create an PostgreSQL Extension的更多相关文章
- use Swig to create C/C++ extension for Python
SWIG is a software development tool that simplifies the task of interfacing different languages to C ...
- 开发一个简单的postgresql extension
主要是学习如何编写一个简单的pg extension,参考https://severalnines.com/blog/creating-new-modules-using-postgresql-c ...
- 使用fpm 方便快速生成postgresql extension分发包
fpm 是一个不错,而且强大的rpm.deb,系统启动服务工具包,我们可以用来快速的生成专业的软件分发包 演示一个pg 扩展包分发包的生成(rpm 以及deb) 安装fpm sudo gem inst ...
- [Tools] Create a Chrome Extension
Creating a Chrome extension requires a manifest.json file which defines how your extension will beha ...
- [官网]CREATE EXTENSION PostGreSQL 创建函数的方法
CREATE EXTENSION https://www.postgresql.org/docs/current/sql-createextension.html CREATE EXTENSION — ...
- How to debug PostgreSQL function with pgAdminIII
How to debug plpgsql with pgAdminIII [root@localhost soft_bak]# git clone git://git.postgresql.org/g ...
- ubuntu安装postgresql与postgis
版本信息 ubuntu 14.04.1LTS postgresql 9.3.5 postgis 2.1.2 今天尝试着安装了postgis 2.1.2,(较简便的包安装,不是源码 ...
- 使用rpm 打包开发的postgres extension
环境准备 安装依赖包 rpmdevtools rpm-build yum install -y rpm-build rpmdevtools 初始化rpm pacakge 项目 主要是rpm 打包的 ...
- PostgreSQL通过mysql_fdw访问MySQL数据库
Mysql与PostgreSQL的安装过程省略. 为简便起见,把MySQL和PostgreSQL都安装在一个机器上,然后在此机器上(准确地说是在PostgreSQL运行的机器上)安装mysql_fdw ...
随机推荐
- 安装完MySQL数据库设置密码
对于windows平台来说安装完MySQL数据库后,系统就已经默认生成了许可表和账户,你不需要像在Unix平台上那样执行 mysql_install_db脚本来生成帐户和相应权限许可表.但是如果不是用 ...
- 在客户端先通过JS验证后再将表单提交到服务器
问题:想要在客户端先通过JS验证后再将表单提交到服务器 参考资料: jQuery 事件 - submit() 方法 试验过程: 服务器端使用PHP <html> <head> ...
- [easyUI] autocomplete 简单自动完成以及ajax从服务器端完成
通过id取input标签对象,调用autocomplete方法 <script> var sources = [ "ActionScript", "Apple ...
- hdu-4856 Tunnels 状压DP
http://acm.hdu.edu.cn/showproblem.php?pid=4856 有若干管道,每个管道有且只能走一次,而地图可以随意走. 那么可以先处理每个管道间的最短路(不要考虑借助其他 ...
- android -------- OkGo (让网络请求更简单的框架)
项目地址:https://github.com/jeasonlzy 该库是封装了okhttp的网络框架,可以与RxJava完美结合,比Retrofit更简单易用.支持大文件上传下载,上传进度回调,下载 ...
- 解决无法连接mysql问题
解决无法连接mysql问题 在my.ini文件下加入explicit_defaults_for_timestamp 清空data文件夹 Cmd初始化mysql 输入>Mysqld --in ...
- 『关键点检测』CPN:Cascaded Pyramid Network for Multi-Person Pose Estimation
论文连接 网络简介 face++2017年coco keypoint benchmark 数据集冠军的文章,发表于CVPR201 1 提出了一种金字塔型的串接模型,即CPN(cascaded pyr ...
- C++中数组声名后不初始化,数组里的值都是0吗?
这得看数组的申明情况: 1.全局/静态数组 如果申明的是全局/静态数组,系统会把数组的内容自动初始化为0. 2.局部数组 如果申明的是局部数组,数组的内容会是随机的,不一定是0.如函数内声明: int ...
- matplotlib各图形绘制
2D图形 import numpy as np import pandas as pd from pandas import Series,DataFrame import matplotlib.py ...
- GANs用于文本生成
上学期期末老师给了我本杂志让我好好看看里面的Gans网络是如何应用在文本生成上的,文章里面也没有介绍原理性的东西,只是说了加入这个Gans模型后效果有多好,给出了模型架构图和训练时所用的语料例子,也没 ...