How to Create an Extension in PostgreSQL

PostgreSQL provides a powerful way to extend its functionality through extensions. Extensions are modular pieces of software that add new functions, data types, operators, and more to your PostgreSQL database. By creating a custom extension, you can tailor PostgreSQL to meet specific needs, whether for analytical computations, text processing, or other advanced tasks. This guide will walk you through creating a custom PostgreSQL extension from scratch, including defining SQL functions and integrating C code. With this process, you can significantly enhance the capabilities of your database system.

Prepare the Necessary Files

To create a PostgreSQL extension, start by setting up a new directory within the contrib directory of your PostgreSQL source tree. This directory will house the required files for your extension. Within this directory (postgresql/contrib/your_extension_directory), prepare the following essential files:


  • SQL File (extension_name--1.0.sql): Defines the SQL functions and objects for your extension.
  • Control File (extension_name.control): Contains metadata about the extension, such as its version and compatibility.
  • C File (extension_name.c): Includes the implementation of custom logic for C functions (optional, depending on your extension's needs).
  • Makefile: Specifies the build and installation instructions for the extension.
  • Header File (extension_name.h): Optional; use this file to define function prototypes, constants, or other shared definitions for your C code.

For this guide, we’ll create an example extension that reverses a string. The directory will include the following files:

Makefile, reverse_string.control,

reverse_string--1.0.sql, and reverse_string.c.

Create the Makefile

The Makefile specifies how to compile and install the extension. Below is an example:

PGFILEDESC = "Reverses a given string"
EXTENSION = reverse_string
DATA = reverse_string--1.0.sql
PG_CONFIG = pg_config
PGXS := $(shell $(PG_CONFIG) --pgxs)
include $(PGXS)

The PGFILEDESC provides a short description of your extension, while EXTENSION specifies its name. The DATA field points to the SQL file defining the extension, and PG_CONFIG locates the PostgreSQL configuration. The PGXS variable ensures that PostgreSQL’s build infrastructure is used.

Define SQL Functions

In the extension_name--1.0.sql file, define the SQL functions that will form the core functionality of your extension. Below is an example:

CREATE FUNCTION reverse_string(inp text)
RETURNS text
LANGUAGE plpgsql IMMUTABLE STRICT
AS $$
DECLARE
  ret text;
BEGIN
  ret := reverse(inp); -- Using PostgreSQL's built-in reverse function
  RETURN ret;
END;
$$;

This function, reverse_string, reverses a string. The IMMUTABLE keyword ensures that the function always returns the same result for identical inputs, and STRICT ensures it does not run with NULL inputs.

Add the Control File

The reverse_string.control file provides metadata about the extension. Below is an example:

comment = 'Comment for your extension'
default_version = '1.0'
module_pathname = '$libdir/reverse_string'
relocatable = true

The comment field describes your extension, while default_version specifies its current version. The module_pathname defines the library directory, and setting relocatable to true allows the extension to be moved to a different schema.

Compile and Install the Extension

Navigate to the extension directory and compile the extension using the following commands:

cd contrib/your_extension_directory/
make
sudo make install

This process installs the SQL and control files into PostgreSQL's extension directory.

Create the Extension in PostgreSQL

Log in to your PostgreSQL instance and create the extension with the following commands:

sudo -i -u postgres
psql
CREATE EXTENSION reverse_string;

Once successful, the extension is installed and ready for use. You can now use the reverse_string function as defined in your SQL file.

Add C Code for Advanced Functions

To extend your extension with C functions, create the reverse_string.c file. Below is an example:

#include "postgres.h"
#include "utils/builtins.h"
#include <string.h>
#include <c.h>
PG_MODULE_MAGIC;
PG_FUNCTION_INFO_V1(reverse_string);
Datum
reverse_string(PG_FUNCTION_ARGS)
{
    text *input = PG_GETARG_TEXT_PP(0);
    char *str = text_to_cstring(input);
    char *reversed = strrev(str);  // reverse() is a built-in function
    PG_RETURN_TEXT_P(cstring_to_text(reversed));
}

The PG_MODULE_MAGIC macro ensures compatibility with the PostgreSQL version, while PG_FUNCTION_INFO_V1 registers the function. The PG_FUNCTION_ARGS macro allows the function to accept arguments. You can add your c functions in this file as per your requirement.

Update Makefile for C Compilation

To compile C functions, modify the Makefile by adding the following line:

MODULES = reverse_string

Update the SQL file to reference the C implementation:

CREATE FUNCTION reverse_string(inp text)
RETURNS text AS 'MODULE_PATHNAME'
LANGUAGE C STRICT VOLATILE;

Recompile and reinstall the extension using:

make
sudo make install

Note: After making any changes to the c file, you have to recompile and reinstall the extension. If you find any issues, try to drop the extension using “DROP EXTENSION extension_name” and create the extension again.

Verify the Extension

To verify that the extension is functioning correctly, use the following query:

SELECT reverse_string('hello world');
Expected Output:
 reverse_string 
----------------
 dlroW olleH
(1 row)

Creating a custom PostgreSQL extension allows you to add functionality tailored to your specific needs. By following the steps outlined in this guide, you can build, compile, and deploy an extension that enhances the capabilities of your PostgreSQL database. Combining SQL and C enables you to achieve efficient and robust solutions for even the most complex tasks. With these skills, you can unlock PostgreSQL’s full potential and tailor it to your requirements, making it a more versatile and powerful tool in your development toolkit.

Take a look at our detailed blog on How to Implement Undo-Redo in Odoo with PostgreSQL to explore this feature in-depth and enhance your Odoo application's functionality.

whatsapp_icon
location

Calicut

Cybrosys Technologies Pvt. Ltd.
Neospace, Kinfra Techno Park
Kakkancherry, Calicut
Kerala, India - 673635

location

Kochi

Cybrosys Technologies Pvt. Ltd.
1st Floor, Thapasya Building,
Infopark, Kakkanad,
Kochi, India - 682030.

location

Bangalore

Cybrosys Techno Solutions
The Estate, 8th Floor,
Dickenson Road,
Bangalore, India - 560042

Send Us A Message