diff options
| author | Peter Eisentraut <peter_e@gmx.net> | 2009-09-12 22:13:12 +0000 |
|---|---|---|
| committer | Peter Eisentraut <peter_e@gmx.net> | 2009-09-12 22:13:12 +0000 |
| commit | 4ab6ebf3f4dc8182556dc23c49ee59e602a78f1c (patch) | |
| tree | 90ef67eaf8d83d4ff9a25ee73c7c3885557df3de /src/pl/plpython/sql | |
| parent | 9bb342811bf6a93a574a648c5848feedbaaef8f2 (diff) | |
Add Unicode support in PL/Python
PL/Python now accepts Unicode objects where it previously only accepted string
objects (for example, as return value). Unicode objects are converted to the
PostgreSQL server encoding as necessary.
This change is also necessary for future Python 3 support, which treats all
strings as Unicode objects.
Since this removes the error conditions that the plpython_unicode test file
tested for, the alternative result files are no longer necessary.
Diffstat (limited to 'src/pl/plpython/sql')
| -rw-r--r-- | src/pl/plpython/sql/plpython_trigger.sql | 33 | ||||
| -rw-r--r-- | src/pl/plpython/sql/plpython_unicode.sql | 23 |
2 files changed, 45 insertions, 11 deletions
diff --git a/src/pl/plpython/sql/plpython_trigger.sql b/src/pl/plpython/sql/plpython_trigger.sql index 385fa93bda4..d6f441f827f 100644 --- a/src/pl/plpython/sql/plpython_trigger.sql +++ b/src/pl/plpython/sql/plpython_trigger.sql @@ -159,6 +159,22 @@ UPDATE trigger_test SET v = 'null' WHERE i = 0; DROP TRIGGER stupid_trigger3 ON trigger_test; +-- Unicode variant + +CREATE FUNCTION stupid3u() RETURNS trigger +AS $$ + return u"foo" +$$ LANGUAGE plpythonu; + +CREATE TRIGGER stupid_trigger3 +BEFORE UPDATE ON trigger_test +FOR EACH ROW EXECUTE PROCEDURE stupid3u(); + +UPDATE trigger_test SET v = 'null' WHERE i = 0; + +DROP TRIGGER stupid_trigger3 ON trigger_test; + + -- deleting the TD dictionary CREATE FUNCTION stupid4() RETURNS trigger @@ -227,6 +243,23 @@ UPDATE trigger_test SET v = 'null' WHERE i = 0; DROP TRIGGER stupid_trigger7 ON trigger_test; +-- Unicode variant + +CREATE FUNCTION stupid7u() RETURNS trigger +AS $$ + TD["new"] = {u'a': 'foo', u'b': 'bar'} + return "MODIFY" +$$ LANGUAGE plpythonu; + +CREATE TRIGGER stupid_trigger7 +BEFORE UPDATE ON trigger_test +FOR EACH ROW EXECUTE PROCEDURE stupid7u(); + +UPDATE trigger_test SET v = 'null' WHERE i = 0; + +DROP TRIGGER stupid_trigger7 ON trigger_test; + + -- calling a trigger function directly SELECT stupid7(); diff --git a/src/pl/plpython/sql/plpython_unicode.sql b/src/pl/plpython/sql/plpython_unicode.sql index d2c8ee1bd88..6b9fac682a2 100644 --- a/src/pl/plpython/sql/plpython_unicode.sql +++ b/src/pl/plpython/sql/plpython_unicode.sql @@ -6,32 +6,33 @@ CREATE TABLE unicode_test ( testvalue text NOT NULL ); -CREATE FUNCTION unicode_return_error() RETURNS text AS E' +CREATE FUNCTION unicode_return() RETURNS text AS E' return u"\\x80" ' LANGUAGE plpythonu; -CREATE FUNCTION unicode_trigger_error() RETURNS trigger AS E' +CREATE FUNCTION unicode_trigger() RETURNS trigger AS E' TD["new"]["testvalue"] = u"\\x80" return "MODIFY" ' LANGUAGE plpythonu; CREATE TRIGGER unicode_test_bi BEFORE INSERT ON unicode_test - FOR EACH ROW EXECUTE PROCEDURE unicode_trigger_error(); + FOR EACH ROW EXECUTE PROCEDURE unicode_trigger(); -CREATE FUNCTION unicode_plan_error1() RETURNS text AS E' +CREATE FUNCTION unicode_plan1() RETURNS text AS E' plan = plpy.prepare("SELECT $1 AS testvalue", ["text"]) rv = plpy.execute(plan, [u"\\x80"], 1) return rv[0]["testvalue"] ' LANGUAGE plpythonu; -CREATE FUNCTION unicode_plan_error2() RETURNS text AS E' -plan = plpy.prepare("SELECT $1 AS testvalue1, $2 AS testvalue2", ["text", "text"]) -rv = plpy.execute(plan, u"\\x80", 1) -return rv[0]["testvalue1"] +CREATE FUNCTION unicode_plan2() RETURNS text AS E' +plan = plpy.prepare("SELECT $1 || $2 AS testvalue", ["text", u"text"]) +rv = plpy.execute(plan, ["foo", "bar"], 1) +return rv[0]["testvalue"] ' LANGUAGE plpythonu; -SELECT unicode_return_error(); +SELECT unicode_return(); INSERT INTO unicode_test (testvalue) VALUES ('test'); -SELECT unicode_plan_error1(); -SELECT unicode_plan_error2(); +SELECT * FROM unicode_test; +SELECT unicode_plan1(); +SELECT unicode_plan2(); |
