WIP: transformation hook modules and JSON support

From: Pavel Stehule <pavel(dot)stehule(at)gmail(dot)com>
To: PostgreSQL Hackers <pgsql-hackers(at)postgresql(dot)org>
Subject: WIP: transformation hook modules and JSON support
Date: 2009-03-29 10:41:34
Message-ID: 162867790903290341h357c4e8dj8f1c0f0b91271c4d@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Hello

I am sending samples of transformation hook modules. One module is
JSON support:.

From these modules only JSON support has general usage - so only JSON
should be integrated to core.

Regards
Pavel Stehule

=== README ===
JSON generating functions - this module contains functions, that allows
simply generation JSON objects. Inspiration of this module was Json library
http://www.mysqludf.org/lib_mysqludf_json/index.php .

note: an result isn't same as Roland library. Roland more respect javascript
rules. This library more respect JSON standard from json.org..

RAW parameters and labeled parameters
-----------------------------------
PostgreSQL parser ensure well typed parameters for any functions.
Types of parameters.
are described in pg_proc record. Exception from this rule are raw
parameters (of "any"
type). Raw parameters are passed without any conversion..

Sample of function with raw parameters is function json_array:

postgres=# select json.json_array(10,20,30,'Pavel',current_date);
json_array............
---------------------------------
[10,20,30,"Pavel","2009-03-28"]
(1 row)

postgres=# select
json.json_array(10,20,30,'Pavel',json.json_array(20,30), true, false);
json_array...............
---------------------------------------
[10,20,30,"Pavel",[20,30],true,false]
(1 row)

Smart parameter take some addition info from calling environment. One
sample of smart
parameter's function is SQL/XML function xmforest..

Json library use raw parameters for automatical double quotes wrapping
of string values.
json_object functions use labeled parameters. Aditional info use as
property name..

postgres=# select json_object(10,'akaka',29);
ERROR: invalid input syntax for integer: "akaka"
LINE 1: select json_object(10,'akaka',29);
^
postgres=# load 'json';
LOAD
Time: 1,677 ms
postgres=# select json_object(10,'akaka',29);
ERROR: unnamed JSON attribute must be a column reference
LINE 1: select json_object(10,'akaka',29);
^
postgres=# select json_object(10 as b,'akaka' as c,29 as x);
json_object......
-----------------------
{b:10,c:"akaka",x:29}
1 row)

Function json_members is very specific. PostgreSQL definition should be like
json_members(text, "any", text, "any", text, "any", ...). Parameters
are pairs of
property name and json value. First in pair should be text or any type
with implicit
cast to text.

postgres=# select json.json_members('a',2,'b',current_date);
json_members......
------------------------
"a":2,"b":"2009-03-29"
(1 row)

postgres=# select json.json_object(json.json_members('a',2,'b',current_date));
json_object........
--------------------------
{"a":2,"b":"2009-03-29"}
(1 row)

Attachment Content-Type Size
parsermod.tgz application/x-gzip 10.1 KB

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Hitoshi Harada 2009-03-29 13:07:04 Re: tuplestore API problem
Previous Message Guillaume Smet 2009-03-29 09:52:01 Re: 8.4 release notes proof reading 1/2