sql >> Databáze >  >> RDS >> PostgreSQL

Vytvoření testu rozšíření v postgresql

Toto je minimální příklad, který funguje, pokud máte postgresql-server vývojový balíček pro ubuntu nainstalován

extension.c
Jednoduché rozšíření

/* Postgres headers */
#include <postgres.h>
#include <utils/rel.h>

#include <stdio.h>
#include <string.h>

#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif

static char *
extract_string(text *word)
{
    char *head;
    char *tail;

    if (word == NULL)
        return NULL;

    head = VARDATA(word);
    tail = head + VARSIZE(word) - VARHDRSZ;
    tail[0] = '\0';

    return head;
}

PG_FUNCTION_INFO_V1(compare_strings);
Datum
compare_strings(PG_FUNCTION_ARGS)
{
    char *lhs;
    char *rhs;

    lhs = extract_string(PG_GETARG_TEXT_P(0));
    rhs = extract_string(PG_GETARG_TEXT_P(1));

    PG_RETURN_BOOL(strcmp(lhs, rhs) == 0);
}

Makefile
Jednoduchý soubor Makefile pro ilustraci, jak byste mohli sestavit rozšíření.

CC     = gcc
OBJECT = extension.o
NAME   = my-extension.so
CFLAGS = -Wall -Werror -g3 -O0 -I$(shell pg_config --includedir-server)

all: $(OBJECT)
    $(CC) -shared -o $(NAME) $(OBJECT)

%.o: %.c
    $(CC) -c -fPIC $(CFLAGS) $<

install: all
    @install -Dv -m755 $(NAME) $(shell pg_config --pkglibdir)/$(NAME)
    @psql -U postgres -f create-function.sql

clean:
    @rm -fv *.o *.so

create-function.sql
Jednoduchý skript pro vytvoření funkce

CREATE OR REPLACE FUNCTION 
    compare_strings(VARCHAR,VARCHAR) RETURNS integer AS 'my-extension' 
LANGUAGE C STRICT;

Jak se zdá z vaší otázky, budete schopni porozumět tomu, co to dělá, a také tomu, jak to udělat, aby to fungovalo pro váš případ použití.



  1. Vyberte N záznamů pro každou kategorii a seřaďte je podle X

  2. zobrazit poslední komentář, který má pouze 1 komentář na uživatele

  3. Chcete-li obejít ORA-29278, dejte přihlašovací údaje na UTL_MAIL.SEND

  4. Začlenění zvyšující se hodnoty do tohoto sql