fix SPI build

This commit is contained in:
Christian Grothoff 2023-04-16 22:07:36 +02:00
parent ade7586c30
commit 8463572bea
No known key found for this signature in database
GPG Key ID: 939E6BE1E29FC3CC
4 changed files with 107 additions and 125 deletions

View File

@ -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

View File

@ -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"

View File

@ -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)

View File

@ -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 $$;