2015-10-04 00:19:37 +08:00
|
|
|
CREATE EXTENSION hstore_plpython2u CASCADE;
|
|
|
|
NOTICE: installing required extension "plpython2u"
|
2015-04-26 22:33:14 +08:00
|
|
|
-- test hstore -> python
|
|
|
|
CREATE FUNCTION test1(val hstore) RETURNS int
|
|
|
|
LANGUAGE plpythonu
|
|
|
|
TRANSFORM FOR TYPE hstore
|
|
|
|
AS $$
|
|
|
|
assert isinstance(val, dict)
|
2015-05-17 11:35:29 +08:00
|
|
|
i = list(val.items())
|
2015-05-05 10:30:21 +08:00
|
|
|
i.sort()
|
|
|
|
plpy.info(i)
|
2015-04-26 22:33:14 +08:00
|
|
|
return len(val)
|
|
|
|
$$;
|
|
|
|
SELECT test1('aa=>bb, cc=>NULL'::hstore);
|
|
|
|
INFO: [('aa', 'bb'), ('cc', None)]
|
|
|
|
test1
|
|
|
|
-------
|
|
|
|
2
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
-- the same with the versioned language name
|
|
|
|
CREATE FUNCTION test1n(val hstore) RETURNS int
|
|
|
|
LANGUAGE plpython2u
|
|
|
|
TRANSFORM FOR TYPE hstore
|
|
|
|
AS $$
|
|
|
|
assert isinstance(val, dict)
|
2015-05-17 11:35:29 +08:00
|
|
|
i = list(val.items())
|
2015-05-05 10:30:21 +08:00
|
|
|
i.sort()
|
|
|
|
plpy.info(i)
|
2015-04-26 22:33:14 +08:00
|
|
|
return len(val)
|
|
|
|
$$;
|
|
|
|
SELECT test1n('aa=>bb, cc=>NULL'::hstore);
|
|
|
|
INFO: [('aa', 'bb'), ('cc', None)]
|
|
|
|
test1n
|
|
|
|
--------
|
|
|
|
2
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
-- test hstore[] -> python
|
|
|
|
CREATE FUNCTION test1arr(val hstore[]) RETURNS int
|
|
|
|
LANGUAGE plpythonu
|
|
|
|
TRANSFORM FOR TYPE hstore
|
|
|
|
AS $$
|
2015-05-31 19:10:45 +08:00
|
|
|
assert(val == [{'aa': 'bb', 'cc': None}, {'dd': 'ee'}])
|
2015-04-26 22:33:14 +08:00
|
|
|
return len(val)
|
|
|
|
$$;
|
|
|
|
SELECT test1arr(array['aa=>bb, cc=>NULL'::hstore, 'dd=>ee']);
|
|
|
|
test1arr
|
|
|
|
----------
|
|
|
|
2
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
-- test python -> hstore
|
|
|
|
CREATE FUNCTION test2() RETURNS hstore
|
|
|
|
LANGUAGE plpythonu
|
|
|
|
TRANSFORM FOR TYPE hstore
|
|
|
|
AS $$
|
|
|
|
val = {'a': 1, 'b': 'boo', 'c': None}
|
|
|
|
return val
|
|
|
|
$$;
|
|
|
|
SELECT test2();
|
|
|
|
test2
|
|
|
|
---------------------------------
|
|
|
|
"a"=>"1", "b"=>"boo", "c"=>NULL
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
-- test python -> hstore[]
|
|
|
|
CREATE FUNCTION test2arr() RETURNS hstore[]
|
|
|
|
LANGUAGE plpythonu
|
|
|
|
TRANSFORM FOR TYPE hstore
|
|
|
|
AS $$
|
|
|
|
val = [{'a': 1, 'b': 'boo', 'c': None}, {'d': 2}]
|
|
|
|
return val
|
|
|
|
$$;
|
|
|
|
SELECT test2arr();
|
|
|
|
test2arr
|
|
|
|
--------------------------------------------------------------
|
|
|
|
{"\"a\"=>\"1\", \"b\"=>\"boo\", \"c\"=>NULL","\"d\"=>\"2\""}
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
-- test as part of prepare/execute
|
|
|
|
CREATE FUNCTION test3() RETURNS void
|
|
|
|
LANGUAGE plpythonu
|
|
|
|
TRANSFORM FOR TYPE hstore
|
|
|
|
AS $$
|
|
|
|
rv = plpy.execute("SELECT 'aa=>bb, cc=>NULL'::hstore AS col1")
|
2015-05-31 19:10:45 +08:00
|
|
|
assert(rv[0]["col1"] == {'aa': 'bb', 'cc': None})
|
2015-04-26 22:33:14 +08:00
|
|
|
|
|
|
|
val = {'a': 1, 'b': 'boo', 'c': None}
|
|
|
|
plan = plpy.prepare("SELECT $1::text AS col1", ["hstore"])
|
|
|
|
rv = plpy.execute(plan, [val])
|
2015-05-31 19:10:45 +08:00
|
|
|
assert(rv[0]["col1"] == '"a"=>"1", "b"=>"boo", "c"=>NULL')
|
2015-04-26 22:33:14 +08:00
|
|
|
$$;
|
|
|
|
SELECT test3();
|
|
|
|
test3
|
|
|
|
-------
|
|
|
|
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
-- test trigger
|
|
|
|
CREATE TABLE test1 (a int, b hstore);
|
|
|
|
INSERT INTO test1 VALUES (1, 'aa=>bb, cc=>NULL');
|
|
|
|
SELECT * FROM test1;
|
|
|
|
a | b
|
|
|
|
---+------------------------
|
|
|
|
1 | "aa"=>"bb", "cc"=>NULL
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
CREATE FUNCTION test4() RETURNS trigger
|
|
|
|
LANGUAGE plpythonu
|
|
|
|
TRANSFORM FOR TYPE hstore
|
|
|
|
AS $$
|
2015-05-31 19:10:45 +08:00
|
|
|
assert(TD["new"] == {'a': 1, 'b': {'aa': 'bb', 'cc': None}})
|
2015-04-26 22:33:14 +08:00
|
|
|
if TD["new"]["a"] == 1:
|
|
|
|
TD["new"]["b"] = {'a': 1, 'b': 'boo', 'c': None}
|
|
|
|
|
|
|
|
return "MODIFY"
|
|
|
|
$$;
|
|
|
|
CREATE TRIGGER test4 BEFORE UPDATE ON test1 FOR EACH ROW EXECUTE PROCEDURE test4();
|
|
|
|
UPDATE test1 SET a = a;
|
|
|
|
SELECT * FROM test1;
|
|
|
|
a | b
|
|
|
|
---+---------------------------------
|
|
|
|
1 | "a"=>"1", "b"=>"boo", "c"=>NULL
|
|
|
|
(1 row)
|
|
|
|
|