mirror of
https://github.com/postgres/postgres.git
synced 2025-06-14 18:42:34 +03:00
A function name that's double-quoted in SQL can contain almost any characters, but we were using that name directly as part of the name generated for the Python-level function, and Python doesn't like anything that isn't pretty much a standard identifier. To fix, replace anything that isn't an ASCII letter or digit with an underscore in the generated name. This doesn't create any risk of duplicate Python function names because we were already appending the function OID to the generated name to ensure uniqueness. Per bug #13960 from Jim Nasby. Patch by Jim Nasby, modified a bit by me. Back-patch to all supported branches.
54 lines
1.3 KiB
PL/PgSQL
54 lines
1.3 KiB
PL/PgSQL
-- first some tests of basic functionality
|
|
CREATE EXTENSION plpython2u;
|
|
|
|
-- really stupid function just to get the module loaded
|
|
CREATE FUNCTION stupid() RETURNS text AS 'return "zarkon"' LANGUAGE plpythonu;
|
|
|
|
select stupid();
|
|
|
|
-- check 2/3 versioning
|
|
CREATE FUNCTION stupidn() RETURNS text AS 'return "zarkon"' LANGUAGE plpython2u;
|
|
|
|
select stupidn();
|
|
|
|
-- test multiple arguments and odd characters in function name
|
|
CREATE FUNCTION "Argument test #1"(u users, a1 text, a2 text) RETURNS text
|
|
AS
|
|
'keys = list(u.keys())
|
|
keys.sort()
|
|
out = []
|
|
for key in keys:
|
|
out.append("%s: %s" % (key, u[key]))
|
|
words = a1 + " " + a2 + " => {" + ", ".join(out) + "}"
|
|
return words'
|
|
LANGUAGE plpythonu;
|
|
|
|
select "Argument test #1"(users, fname, lname) from users where lname = 'doe' order by 1;
|
|
|
|
|
|
-- check module contents
|
|
CREATE FUNCTION module_contents() RETURNS text AS
|
|
$$
|
|
contents = list(filter(lambda x: not x.startswith("__"), dir(plpy)))
|
|
contents.sort()
|
|
return ", ".join(contents)
|
|
$$ LANGUAGE plpythonu;
|
|
|
|
select module_contents();
|
|
|
|
|
|
CREATE FUNCTION elog_test() RETURNS void
|
|
AS $$
|
|
plpy.debug('debug')
|
|
plpy.log('log')
|
|
plpy.info('info')
|
|
plpy.info(37)
|
|
plpy.info()
|
|
plpy.info('info', 37, [1, 2, 3])
|
|
plpy.notice('notice')
|
|
plpy.warning('warning')
|
|
plpy.error('error')
|
|
$$ LANGUAGE plpythonu;
|
|
|
|
SELECT elog_test();
|