fix SPI build
This commit is contained in:
parent
ade7586c30
commit
8463572bea
@ -1,6 +1,7 @@
|
||||
EXTENSION = own_test
|
||||
MODULES = own_test
|
||||
DATA = own_test.sql
|
||||
PG_CPPFLAGS = -I /usr/include/postgresql
|
||||
|
||||
# postgresql build stuff
|
||||
PG_CONFIG = pg_config
|
||||
|
@ -1,41 +1,37 @@
|
||||
Server Programming Interface (SPI)
|
||||
|
||||
|
||||
Dependencies:
|
||||
=============
|
||||
|
||||
These are the direct dependencies for running SPI functions :
|
||||
|
||||
|
||||
|
||||
Step 1:
|
||||
"postgresql-server-dev-<depends on your postgresql version>"
|
||||
-- sudo apt-get install libpq-dev postgresql-server-dev-13
|
||||
|
||||
Step 2:
|
||||
To solve gssapi/gssapi.h, use the following command:
|
||||
apt-get install libkrb5-dev
|
||||
|
||||
Step 3:
|
||||
apt-cache search openssl | grep -- -dev
|
||||
apt-get install libssl-dev
|
||||
|
||||
Compile:
|
||||
Overview
|
||||
========
|
||||
gcc -shared -o <file_name>.so <file_name>.c
|
||||
|
||||
CALL FUNCTIONS:
|
||||
===============
|
||||
This folder contains results from an experiment by Joseph Xu
|
||||
to use the Postgres SPI. They are not currently used at all
|
||||
by the GNU Taler exchange.
|
||||
|
||||
psql -c "SELECT <function_name>();" db_name
|
||||
|
||||
Structure:
|
||||
==========
|
||||
Dependencies
|
||||
============
|
||||
|
||||
usr/include/postgres/
|
||||
These are the direct dependencies for compiling the code:
|
||||
|
||||
usr/include/postgres/13/server/
|
||||
# apt-get install libpq-dev postgresql-server-dev-13
|
||||
# apt-get install libkrb5-dev
|
||||
# apt-get install libssl-dev
|
||||
|
||||
make
|
||||
make install
|
||||
psql
|
||||
|
||||
Compilation
|
||||
===========
|
||||
|
||||
$ make
|
||||
|
||||
Loading functions
|
||||
=================
|
||||
|
||||
# make install
|
||||
$ psql "$DB_NAME" < own_test.sql
|
||||
|
||||
|
||||
Calling functions
|
||||
==================
|
||||
|
||||
$ psql -c "SELECT $FUNCTION_NAME($ARGS);" "$DB_NAME"
|
||||
|
@ -2,17 +2,17 @@
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <libpq-fe.h>
|
||||
#include <internal/libpq-int.h>
|
||||
#include <postgresql/libpq-fe.h>
|
||||
#include <libpq-int.h>
|
||||
#include <catalog/pg_type.h>
|
||||
#include <executor/spi.h>
|
||||
#include <funcapi.h>
|
||||
#include <fmgr.h>
|
||||
#include <utils/builtins.h>
|
||||
#include "utils/array.h"
|
||||
#include <utils/array.h>
|
||||
#include <sys/time.h>
|
||||
#include "utils/numeric.h"
|
||||
#include "utils/timestamp.h"
|
||||
#include <utils/numeric.h>
|
||||
#include <utils/timestamp.h>
|
||||
#include <utils/bytea.h>
|
||||
|
||||
#ifdef PG_MODULE_MAGIC
|
||||
@ -66,7 +66,7 @@ pg_spi_prepare_example (PG_FUNCTION_ARGS)
|
||||
{
|
||||
if (prepared_plan == NULL)
|
||||
{
|
||||
new_plan = SPI_prepare ("SELECT 1 FROM joseph_test.X", 0, NULL);
|
||||
new_plan = SPI_prepare ("SELECT 1 FROM X", 0, NULL);
|
||||
prepared_plan = SPI_saveplan (new_plan);
|
||||
|
||||
if (prepared_plan == NULL)
|
||||
@ -112,7 +112,7 @@ pg_spi_prepare_example_without_saveplan (PG_FUNCTION_ARGS)
|
||||
}
|
||||
|
||||
{
|
||||
new_plan = SPI_prepare ("SELECT 1 FROM joseph_test.X", 0, NULL);
|
||||
new_plan = SPI_prepare ("SELECT 1 FROM X", 0, NULL);
|
||||
ret = SPI_execute_plan (new_plan, NULL, 0,false, 0);
|
||||
if (ret != SPI_OK_SELECT)
|
||||
{
|
||||
@ -142,7 +142,7 @@ Datum
|
||||
pg_spi_select_from_x (PG_FUNCTION_ARGS)
|
||||
{
|
||||
int ret;
|
||||
char *query = "SELECT 1 FROM joseph_test.X";
|
||||
char *query = "SELECT 1 FROM X";
|
||||
uint64 proc;
|
||||
ret = SPI_connect ();
|
||||
|
||||
@ -172,7 +172,7 @@ pg_spi_insert_int (PG_FUNCTION_ARGS)
|
||||
int nargs;
|
||||
Oid argtypes[1];
|
||||
Datum values[1];
|
||||
char *query = "INSERT INTO joseph_test.X (a) VALUES ($1)";
|
||||
char *query = "INSERT INTO X (a) VALUES ($1)";
|
||||
|
||||
ret = SPI_connect ();
|
||||
if (ret != SPI_OK_CONNECT)
|
||||
@ -204,7 +204,7 @@ pg_spi_prepare_insert (PG_FUNCTION_ARGS)
|
||||
int nargs;
|
||||
Oid argtypes[1];
|
||||
Datum values[1];
|
||||
char *query = "INSERT INTO joseph_test.X (a) VALUES ($1)";
|
||||
const char *query = "INSERT INTO X (a) VALUES ($1)";
|
||||
SPIPlanPtr new_plan;
|
||||
ret = SPI_connect ();
|
||||
if (ret != SPI_OK_CONNECT)
|
||||
@ -252,7 +252,7 @@ pg_spi_prepare_insert_bytea(PG_FUNCTION_ARGS)
|
||||
Datum values[1];
|
||||
Oid argtypes2[1];
|
||||
Datum val[1];
|
||||
char *query = "INSERT INTO joseph_test.X (a) VALUES ($1)";
|
||||
char *query = "INSERT INTO X (a) VALUES ($1)";
|
||||
SPIPlanPtr new_plan;
|
||||
ret = SPI_connect();
|
||||
if (ret != SPI_OK_CONNECT)
|
||||
@ -296,7 +296,7 @@ pg_spi_prepare_insert_without_saveplan (PG_FUNCTION_ARGS)
|
||||
int nargs;
|
||||
Oid argtypes[1];
|
||||
Datum values[1];
|
||||
char *query = "INSERT INTO joseph_test.X (a) VALUES ($1)";
|
||||
const char *query = "INSERT INTO X (a) VALUES ($1)";
|
||||
SPIPlanPtr new_plan;
|
||||
ret = SPI_connect ();
|
||||
if (ret != SPI_OK_CONNECT)
|
||||
@ -333,7 +333,7 @@ pg_spi_select_pair_from_y(PG_FUNCTION_ARGS)
|
||||
int ret;
|
||||
valuest result;
|
||||
bool isnull;
|
||||
char *query = "SELECT 1,1 FROM joseph_test.Y";
|
||||
char *query = "SELECT 1,1 FROM Y";
|
||||
result.col1 = 0;
|
||||
result.col2 = 0;
|
||||
|
||||
@ -368,7 +368,7 @@ pg_spi_select_with_cond(PG_FUNCTION_ARGS)
|
||||
Oid argtypes[1];
|
||||
Datum values[1];
|
||||
uint64 proc;
|
||||
query = "SELECT col1 FROM joseph_test.Y WHERE col2 = $1";
|
||||
query = "SELECT col1 FROM Y WHERE col2 = $1";
|
||||
|
||||
ret = SPI_connect();
|
||||
if (ret != SPI_OK_CONNECT) {
|
||||
@ -401,7 +401,7 @@ Datum pg_spi_prepare_select_with_cond(PG_FUNCTION_ARGS) {
|
||||
uint64 proc;
|
||||
int nargs;
|
||||
Oid argtypes[1];
|
||||
char *query = "SELECT col1 FROM joseph_test.Y WHERE col1 = $1";
|
||||
char *query = "SELECT col1 FROM Y WHERE col1 = $1";
|
||||
int result = 0;
|
||||
|
||||
ret = SPI_connect();
|
||||
@ -461,7 +461,7 @@ pg_spi_prepare_select_with_cond_without_saveplan (PG_FUNCTION_ARGS)
|
||||
uint64 proc;
|
||||
int nargs;
|
||||
Oid argtypes[1];
|
||||
char *query = "SELECT col1 FROM joseph_test.Y WHERE col2 = $1";
|
||||
char *query = "SELECT col1 FROM Y WHERE col2 = $1";
|
||||
int result = 0;
|
||||
|
||||
ret = SPI_connect ();
|
||||
@ -519,7 +519,7 @@ pg_spi_update_y (PG_FUNCTION_ARGS)
|
||||
int nargs;
|
||||
Oid argtypes[1];
|
||||
Datum values[1];
|
||||
char *query = "UPDATE joseph_test.Y SET col1 = 4 WHERE (col2 = $1)";
|
||||
const char *query = "UPDATE Y SET col1 = 4 WHERE (col2 = $1)";
|
||||
|
||||
ret = SPI_connect ();
|
||||
if (ret != SPI_OK_CONNECT)
|
||||
@ -552,7 +552,7 @@ pg_spi_prepare_update (PG_FUNCTION_ARGS)
|
||||
int nargs;
|
||||
Oid argtypes[1];
|
||||
Datum values[1];
|
||||
char *query = "UPDATE joseph_test.Y SET col1 = 4 WHERE (col2 = $1)";
|
||||
const char *query = "UPDATE Y SET col1 = 4 WHERE (col2 = $1)";
|
||||
|
||||
ret = SPI_connect ();
|
||||
if (ret != SPI_OK_CONNECT)
|
||||
|
@ -1,42 +1,20 @@
|
||||
|
||||
DROP TABLE joseph_test.X;
|
||||
CREATE TABLE joseph_test.X (
|
||||
DROP TABLE IF EXISTS X;
|
||||
CREATE TABLE X (
|
||||
a integer
|
||||
);
|
||||
|
||||
INSERT INTO joseph_test.X (a) VALUES (1), (2), (3), (4), (5), (6), (7);
|
||||
|
||||
DROP TABLE joseph_test.Y;
|
||||
CREATE TABLE joseph_test.Y (col1 INT, col2 INT);
|
||||
INSERT INTO joseph_test.Y (col1,col2) VALUES (1,2), (2,0), (0,4), (4,0), (0,6), (6,7), (7,8);
|
||||
|
||||
DROP TABLE joseph_test.Z;
|
||||
CREATE TABLE joseph_test.Z(col1 BYTEA);
|
||||
DROP TABLE deposits;
|
||||
/*CREATE TABLE deposits(
|
||||
deposit_serial_id BIGINT GENERATED BY DEFAULT AS IDENTITY
|
||||
,shard INT8 NOT NULL
|
||||
,coin_pub BYTEA NOT NULL CHECK (LENGTH(coin_pub)=32)
|
||||
,known_coin_id INT8 NOT NULL
|
||||
,amount_with_fee_val INT8 NOT NULL
|
||||
,amount_with_fee_frac INT4 NOT NULL
|
||||
,wallet_timestamp INT8 NOT NULL
|
||||
,exchange_timestamp INT8 NOT NULL
|
||||
,refund_deadline INT8 NOT NULL
|
||||
,wire_deadline INT8 NOT NULL
|
||||
,merchant_pub BYTEA NOT NULL CHECK (LENGTH(merchant_pub)=32)
|
||||
,h_contract_terms BYTEA NOT NULL CHECK (LENGTH(h_contract_terms)=64)
|
||||
,coin_sig BYTEA NOT NULL CHECK (LENGTH(coin_sig)=64)
|
||||
,wire_salt BYTEA NOT NULL CHECK (LENGTH(wire_salt)=16)
|
||||
,wire_target_h_payto BYTEA CHECK (LENGTH(wire_target_h_payto)=32)
|
||||
,done BOOLEAN NOT NULL DEFAULT FALSE
|
||||
,policy_blocked BOOLEAN NOT NULL DEFAULT FALSE
|
||||
,policy_details_serial_id INT8);
|
||||
*/
|
||||
--INSERT INTO deposits VALUES ();
|
||||
INSERT INTO X (a)
|
||||
VALUES (1), (2), (3), (4), (5), (6), (7);
|
||||
|
||||
DROP TABLE IF EXISTS Y;
|
||||
CREATE TABLE Y (col1 INT, col2 INT);
|
||||
INSERT INTO Y (col1,col2)
|
||||
VALUES (1,2), (2,0), (0,4), (4,0), (0,6), (6,7), (7,8);
|
||||
|
||||
DROP TABLE IF EXISTS Z;
|
||||
CREATE TABLE Z (col1 BYTEA);
|
||||
|
||||
DROP TABLE IF EXISTS deposits;
|
||||
CREATE TABLE deposits(
|
||||
deposit_serial_id BIGINT GENERATED BY DEFAULT AS IDENTITY
|
||||
,shard INT8 NOT NULL
|
||||
@ -58,79 +36,81 @@ CREATE TABLE deposits(
|
||||
,policy_details_serial_id INT8);
|
||||
|
||||
|
||||
CREATE OR REPLACE FUNCTION pg_spi_insert_int()
|
||||
DROP FUNCTION IF EXISTS pg_spi_insert_int;
|
||||
CREATE FUNCTION pg_spi_insert_int()
|
||||
RETURNS VOID
|
||||
LANGUAGE c COST 100
|
||||
LANGUAGE c VOLATILE COST 100
|
||||
AS '$libdir/own_test', 'pg_spi_insert_int';
|
||||
DROP FUNCTION pg_spi_select_from_x();
|
||||
CREATE OR REPLACE FUNCTION pg_spi_select_from_x()
|
||||
|
||||
DROP FUNCTION IF EXISTS pg_spi_select_from_x;
|
||||
CREATE FUNCTION pg_spi_select_from_x()
|
||||
RETURNS INT8
|
||||
LANGUAGE c COST 100
|
||||
AS '$libdir/own_test', 'pg_spi_select_from_x';
|
||||
|
||||
/*DROP FUNCTION pg_spi_select_pair_from_y();
|
||||
CREATE OR REPLACE FUNCTION pg_spi_select_pair_from_y()
|
||||
/*
|
||||
CREATE FUNCTION pg_spi_select_pair_from_y()
|
||||
RETURNS valuest
|
||||
LANGUAGE c COST 100
|
||||
AS '$libdir/own_test', 'pg_spi_select_pair_from_y';
|
||||
*/
|
||||
/*CREATE OR REPLACE FUNCTION pg_spi_select_with_cond()
|
||||
/*CREATE FUNCTION pg_spi_select_with_cond()
|
||||
RETURNS INT8
|
||||
LANGUAGE c COST 100
|
||||
AS '$libdir/own_test', 'pg_spi_select_with_cond';
|
||||
*/
|
||||
DROP FUNCTION pg_spi_update_y();
|
||||
CREATE OR REPLACE FUNCTION pg_spi_update_y()
|
||||
RETURNS VOID
|
||||
LANGUAGE c COST 100
|
||||
AS '$libdir/own_test', 'pg_spi_update_y';
|
||||
DROP FUNCTION pg_spi_prepare_example();
|
||||
|
||||
CREATE OR REPLACE FUNCTION pg_spi_prepare_example()
|
||||
DROP FUNCTION IF EXISTS pg_spi_update_y;
|
||||
CREATE FUNCTION pg_spi_update_y()
|
||||
RETURNS VOID
|
||||
LANGUAGE c VOLATILE COST 100
|
||||
AS '$libdir/own_test', 'pg_spi_update_y';
|
||||
|
||||
DROP FUNCTION IF EXISTS pg_spi_prepare_example;
|
||||
CREATE FUNCTION pg_spi_prepare_example()
|
||||
RETURNS INT8
|
||||
LANGUAGE c COST 100
|
||||
AS '$libdir/own_test', 'pg_spi_prepare_example';
|
||||
|
||||
DROP FUNCTION pg_spi_prepare_example_without_saveplan();
|
||||
CREATE OR REPLACE FUNCTION pg_spi_prepare_example_without_saveplan()
|
||||
DROP FUNCTION IF EXISTS pg_spi_prepare_example_without_saveplan;
|
||||
CREATE FUNCTION pg_spi_prepare_example_without_saveplan()
|
||||
RETURNS INT8
|
||||
LANGUAGE c COST 100
|
||||
AS '$libdir/own_test', 'pg_spi_prepare_example_without_saveplan';
|
||||
|
||||
CREATE OR REPLACE FUNCTION pg_spi_prepare_insert()
|
||||
DROP FUNCTION IF EXISTS pg_spi_prepare_insert;
|
||||
CREATE FUNCTION pg_spi_prepare_insert()
|
||||
RETURNS VOID
|
||||
LANGUAGE c COST 100
|
||||
LANGUAGE c VOLATILE COST 100
|
||||
AS '$libdir/own_test', 'pg_spi_prepare_insert';
|
||||
|
||||
CREATE OR REPLACE FUNCTION pg_spi_prepare_insert_without_saveplan()
|
||||
DROP FUNCTION IF EXISTS pg_spi_prepare_insert_without_saveplan;
|
||||
CREATE FUNCTION pg_spi_prepare_insert_without_saveplan()
|
||||
RETURNS VOID
|
||||
LANGUAGE c COST 100
|
||||
LANGUAGE c VOLATILE COST 100
|
||||
AS '$libdir/own_test', 'pg_spi_prepare_insert_without_saveplan';
|
||||
|
||||
/*DROP FUNCTION pg_spi_prepare_select_with_cond();
|
||||
CREATE OR REPLACE FUNCTION pg_spi_prepare_select_with_cond()
|
||||
/*
|
||||
CREATE FUNCTION pg_spi_prepare_select_with_cond()
|
||||
RETURNS INT8
|
||||
LANGUAGE c COST 100
|
||||
AS '$libdir/own_test', 'pg_spi_prepare_select_with_cond';
|
||||
*/
|
||||
DROP FUNCTION pg_spi_prepare_select_with_cond_without_saveplan();
|
||||
CREATE OR REPLACE FUNCTION pg_spi_prepare_select_with_cond_without_saveplan()
|
||||
|
||||
DROP FUNCTION IF EXISTS pg_spi_prepare_select_with_cond_without_saveplan;
|
||||
CREATE FUNCTION pg_spi_prepare_select_with_cond_without_saveplan()
|
||||
RETURNS INT8
|
||||
LANGUAGE c COST 100
|
||||
AS '$libdir/own_test', 'pg_spi_prepare_select_with_cond_without_saveplan';
|
||||
|
||||
DROP FUNCTION pg_spi_prepare_update();
|
||||
CREATE OR REPLACE FUNCTION pg_spi_prepare_update()
|
||||
DROP FUNCTION IF EXISTS pg_spi_prepare_update;
|
||||
CREATE FUNCTION pg_spi_prepare_update()
|
||||
RETURNS VOID
|
||||
LANGUAGE c COST 100
|
||||
LANGUAGE c VOLATILE COST 100
|
||||
AS '$libdir/own_test', 'pg_spi_prepare_update';
|
||||
|
||||
DROP FUNCTION pg_spi_get_dep_ref_fees(
|
||||
IN in_timestamp INT8
|
||||
,IN merchant_pub BYTEA
|
||||
,IN wire_target_h_payto BYTEA
|
||||
,IN wtid BYTEA);
|
||||
CREATE OR REPLACE FUNCTION pg_spi_get_dep_ref_fees(
|
||||
DROP FUNCTION IF EXISTS pg_spi_get_dep_ref_fees;
|
||||
CREATE FUNCTION pg_spi_get_dep_ref_fees(
|
||||
IN in_timestamp INT8
|
||||
,IN merchant_pub BYTEA
|
||||
,IN wire_target_h_payto BYTEA
|
||||
@ -140,7 +120,8 @@ CREATE OR REPLACE FUNCTION pg_spi_get_dep_ref_fees(
|
||||
LANGUAGE c VOLATILE COST 100
|
||||
AS '$libdir/own_test', 'pg_spi_get_dep_ref_fees';
|
||||
|
||||
CREATE OR REPLACE FUNCTION update_pg_spi_get_dep_ref_fees(
|
||||
DROP FUNCTION IF EXISTS update_pg_spi_get_dep_ref_fees;
|
||||
CREATE FUNCTION update_pg_spi_get_dep_ref_fees(
|
||||
IN in_refund_deadline INT8,
|
||||
IN in_merchant_pub BYTEA,
|
||||
IN in_wire_target_h_payto BYTEA
|
||||
@ -165,43 +146,47 @@ RETURN QUERY
|
||||
amount_with_fee_frac;
|
||||
END $$;
|
||||
|
||||
CREATE OR REPLACE FUNCTION stored_procedure_update(
|
||||
DROP FUNCTION IF EXISTS stored_procedure_update;
|
||||
CREATE FUNCTION stored_procedure_update(
|
||||
IN in_number INT8
|
||||
)
|
||||
RETURNS VOID
|
||||
LANGUAGE plpgsql
|
||||
AS $$
|
||||
BEGIN
|
||||
UPDATE joseph_test.Y
|
||||
UPDATE Y
|
||||
SET col1 = 4
|
||||
WHERE col2 = in_number;
|
||||
END $$;
|
||||
|
||||
CREATE OR REPLACE FUNCTION stored_procedure_select(OUT out_value INT8)
|
||||
DROP FUNCTION IF EXISTS stored_procedure_select;
|
||||
CREATE FUNCTION stored_procedure_select(OUT out_value INT8)
|
||||
RETURNS INT8
|
||||
LANGUAGE plpgsql
|
||||
AS $$
|
||||
BEGIN
|
||||
SELECT 1
|
||||
INTO out_value
|
||||
FROM joseph_test.X;
|
||||
FROM X;
|
||||
RETURN;
|
||||
END $$;
|
||||
|
||||
|
||||
CREATE OR REPLACE FUNCTION stored_procedure_insert(
|
||||
DROP FUNCTION IF EXISTS stored_procedure_insert;
|
||||
CREATE FUNCTION stored_procedure_insert(
|
||||
IN in_number INT8,
|
||||
OUT out_number INT8)
|
||||
RETURNS INT8
|
||||
LANGUAGE plpgsql
|
||||
AS $$
|
||||
BEGIN
|
||||
INSERT INTO joseph_test.X (a)
|
||||
INSERT INTO X (a)
|
||||
VALUES (in_number)
|
||||
RETURNING a INTO out_number;
|
||||
END $$;
|
||||
|
||||
CREATE OR REPLACE FUNCTION stored_procedure_select_with_cond(
|
||||
DROP FUNCTION IF EXISTS stored_procedure_select_with_cond;
|
||||
CREATE FUNCTION stored_procedure_select_with_cond(
|
||||
IN in_number INT8,
|
||||
OUT out_number INT8
|
||||
)
|
||||
@ -210,7 +195,7 @@ LANGUAGE plpgsql
|
||||
AS $$
|
||||
BEGIN
|
||||
SELECT col1 INTO out_number
|
||||
FROM joseph_test.Y
|
||||
FROM Y
|
||||
WHERE col2 = in_number;
|
||||
RETURN;
|
||||
END $$;
|
||||
|
Loading…
Reference in New Issue
Block a user