Re: Extension for PostgreSQL cast jsonb to hstore WIP

2024-04-02 Thread ShadowGhost
At the moment, this cast supports only these structures, as it was enough
for my tasks:
{str:numeric}
{str:str}
{str:bool}
{str:null}
But it's a great idea and I'll think about implementing it.

вт, 2 апр. 2024 г. в 19:48, Andrew Dunstan :

>
> On 2024-04-02 Tu 07:07, ShadowGhost wrote:
> > Hello all.
> > Recently, when working with the hstore and json formats, I came across
> > the fact that PostgreSQL has a cast of hstore to json, but there is no
> > reverse cast. I thought it might make it more difficult to work with
> > these formats. And I decided to make a cast json in the hstore. I used
> > the built-in jsonb structure to create it and may have introduced
> > methods to increase efficiency by 25% than converting the form
> > jsonb->text->hstore. Which of course is a good fact. I also wrote
> > regression tests to check the performance. I think this extension will
> > improve the work with jsonb and hstore in PostgreSQL.
> > If you've read this far, thank you for your interest, and I hope you
> > enjoy this extension!
> >
>
> One reason we don't have such a cast is that hstore has a flat
> structure, while json is tree structured, and it's not always an object
> / hash. Thus it's easy to reliably cast hstore to json but far less easy
> to cast json to hstore in the general case.
>
> What do you propose to do in the case or json consisting of scalars, or
> arrays, or with nested elements?
>
>
> cheers
>
>
> andrew
>
>
>
> --
> Andrew Dunstan
> EDB: https://www.enterprisedb.com
>
>


Extension for PostgreSQL cast jsonb to hstore WIP

2024-04-02 Thread ShadowGhost
Hello all.
Recently, when working with the hstore and json formats, I came across the
fact that PostgreSQL has a cast of hstore to json, but there is no reverse
cast. I thought it might make it more difficult to work with these formats.
And I decided to make a cast json in the hstore. I used the built-in jsonb
structure to create it and may have introduced methods to increase
efficiency by 25% than converting the form jsonb->text->hstore. Which of
course is a good fact. I also wrote regression tests to check the
performance. I think this extension will improve the work with jsonb and
hstore in PostgreSQL.
If you've read this far, thank you for your interest, and I hope you enjoy
this extension!
 Antoine
From 334bf26cbea8d3ccd1821a7ecd5bd1134d9b1641 Mon Sep 17 00:00:00 2001
From: Antoine Violin 
Date: Mon, 25 Mar 2024 17:34:23 +0700
Subject: [PATCH v1] Add cast jsonb to hstore

---
 contrib/cast_jsonb_to_hstore/Makefile |  18 +++
 .../cast_jsonb_to_hstore--1.0.sql |  16 +++
 .../cast_jsonb_to_hstore.c| 119 ++
 .../cast_jsonb_to_hstore.control  |   5 +
 .../expected/cast_jsonb_to_hstore.out |  71 +++
 .../sql/cast_jsonb_to_hstore.sql  |  27 
 6 files changed, 256 insertions(+)
 create mode 100644 contrib/cast_jsonb_to_hstore/Makefile
 create mode 100644 contrib/cast_jsonb_to_hstore/cast_jsonb_to_hstore--1.0.sql
 create mode 100644 contrib/cast_jsonb_to_hstore/cast_jsonb_to_hstore.c
 create mode 100644 contrib/cast_jsonb_to_hstore/cast_jsonb_to_hstore.control
 create mode 100644 contrib/cast_jsonb_to_hstore/expected/cast_jsonb_to_hstore.out
 create mode 100644 contrib/cast_jsonb_to_hstore/sql/cast_jsonb_to_hstore.sql

diff --git a/contrib/cast_jsonb_to_hstore/Makefile b/contrib/cast_jsonb_to_hstore/Makefile
new file mode 100644
index 00..96db73215a
--- /dev/null
+++ b/contrib/cast_jsonb_to_hstore/Makefile
@@ -0,0 +1,18 @@
+MODULES = cast_jsonb_to_hstore
+EXTENSION = cast_jsonb_to_hstore
+DATA = cast_jsonb_to_hstore--1.0.sql
+PGFILEDESC = "Convert data between different character sets"
+REGRESS = cast_jsonb_to_hstore
+EXTRA_INSTALL = contrib/hstore
+
+ifdef USE_PGXS
+PG_CONFIG = PG_CONFIG
+PGXS := $(shell $(PG_CONFIG) --pgxs)
+include $(PGXS)
+else
+PG_CPPFLAGS = -I$(top_srcdir)/contrib
+subdir = contrib/cast_jsonb_to_hstore
+top_builddir = ../..
+include $(top_builddir)/src/Makefile.global
+include $(top_srcdir)/contrib/contrib-global.mk
+endif
\ No newline at end of file
diff --git a/contrib/cast_jsonb_to_hstore/cast_jsonb_to_hstore--1.0.sql b/contrib/cast_jsonb_to_hstore/cast_jsonb_to_hstore--1.0.sql
new file mode 100644
index 00..db31fedf48
--- /dev/null
+++ b/contrib/cast_jsonb_to_hstore/cast_jsonb_to_hstore--1.0.sql
@@ -0,0 +1,16 @@
+\echo Use "CREATE EXTENSION cast_jsonb_to_hstore" to load this file. \quit
+CREATE OR REPLACE FUNCTION jsonb_to_hstore(j0 jsonb)
+RETURNS hstore 
+AS '$libdir/cast_jsonb_to_hstore', 'jsonb_to_hstore'
+LANGUAGE C IMMUTABLE STRICT;
+
+CREATE OR REPLACE FUNCTION json_to_hstore(j0 json)
+RETURNS hstore AS 
+$BODY$
+SELECT hstore(array_agg(key), array_agg(value))
+FROM json_each_text(j0)
+$BODY$
+LANGUAGE 'sql' IMMUTABLE;
+
+CREATE CAST (jsonb AS hstore) WITH FUNCTION jsonb_to_hstore(jsonb) AS IMPLICIT;
+CREATE CAST (json AS hstore) WITH FUNCTION json_to_hstore(json) AS IMPLICIT;
\ No newline at end of file
diff --git a/contrib/cast_jsonb_to_hstore/cast_jsonb_to_hstore.c b/contrib/cast_jsonb_to_hstore/cast_jsonb_to_hstore.c
new file mode 100644
index 00..c174414896
--- /dev/null
+++ b/contrib/cast_jsonb_to_hstore/cast_jsonb_to_hstore.c
@@ -0,0 +1,119 @@
+#include "postgres.h"
+#include "hstore/hstore.h"
+#include "utils/jsonb.h"
+
+PG_MODULE_MAGIC;
+
+typedef int (*hstoreUniquePairs_t) (Pairs *a, int32 l, int32 *buflen);
+static hstoreUniquePairs_t hstoreUniquePairs_p;
+typedef HStore *(*hstorePairs_t) (Pairs *pairs, int32 pcount, int32 buflen);
+static hstorePairs_t hstorePairs_p;
+typedef size_t (*hstoreCheckKeyLen_t) (size_t len);
+static hstoreCheckKeyLen_t hstoreCheckKeyLen_p;
+typedef size_t (*hstoreCheckValLen_t) (size_t len);
+static hstoreCheckValLen_t hstoreCheckValLen_p;
+
+void
+_PG_init(void)
+{
+	AssertVariableIsOfType(, hstoreUniquePairs_t);
+	hstoreUniquePairs_p = (hstoreUniquePairs_t)
+		load_external_function("$libdir/hstore", "hstoreUniquePairs",
+			   true, NULL);
+	AssertVariableIsOfType(, hstorePairs_t);
+	hstorePairs_p = (hstorePairs_t)
+		load_external_function("$libdir/hstore", "hstorePairs",
+			   true, NULL);
+	AssertVariableIsOfType(, hstoreCheckKeyLen_t);
+	hstoreCheckKeyLen_p = (hstoreCheckKeyLen_t)
+		load_external_function("$libdir/hstore", "hstoreCheckKeyLen",
+			   true, NULL);
+	AssertVariableIsOfType(, hstoreCheckValLen_t);
+	hstoreCheckValLen_p = (hstoreCheckValLen_t)
+		load_external_function("$libdir/hstore", "hstoreCheckValLen",
+			   true, NULL);
+}
+
+#define hstoreUniquePairs 

Extension for PostgreSQL WIP

2024-03-24 Thread ShadowGhost
Cast_jsonb_to_hstore WIP
v1
This extension add function that can cast jsonb to hstore.
That link to my github where does my extension lie
https://github.com/antuanviolin/cast_jsonb_to_hstore