sql >> データベース >  >> RDS >> PostgreSQL

postgresqlで拡張テストを作成する

    これは、postgresql-serverがある場合に機能する最小限の例です。 インストールされているubuntuの開発パッケージ

    extension.c
    単純な拡張機能

    /* 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
    拡張機能を構築する方法を説明する簡単なMakefile。

    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
    関数を作成するための簡単なスクリプト

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

    あなたの質問からわかるように、これが何をするのか、そしてあなたのユースケースでそれをどのように機能させるのかを理解することができます。



    1. MySQLのすべての親子関係

    2. MySQL'誤ったINTEGER値を切り捨てました'

    3. nodejsmysql複数のクエリの場所

    4. SQL:BETWEEN句の最適化