--
-- Test named and nameless parameters
--
CREATE FUNCTION test_param_names0(integer, integer) RETURNS int AS $$
return args[0] + args[1]
$$ LANGUAGE plpythonu;
CREATE FUNCTION test_param_names1(a0 integer, a1 text) RETURNS boolean AS $$
assert a0 == args[0]
assert a1 == args[1]
return True
$$ LANGUAGE plpythonu;
CREATE FUNCTION test_param_names2(u users) RETURNS text AS $$
assert u == args[0]
if isinstance(u, dict):
    # stringify dict the hard way because otherwise the order is implementation-dependent
    u_keys = list(u.keys())
    u_keys.sort()
    s = '{' + ', '.join([repr(k) + ': ' + repr(u[k]) for k in u_keys]) + '}'
else:
    s = str(u)
return s
$$ LANGUAGE plpythonu;
-- use deliberately wrong parameter names
CREATE FUNCTION test_param_names3(a0 integer) RETURNS boolean AS $$
try:
	assert a1 == args[0]
	return False
except NameError as e:
	assert e.args[0].find("a1") > -1
	return True
$$ LANGUAGE plpythonu;
SELECT test_param_names0(2,7);
 test_param_names0 
-------------------
                 9
(1 row)

SELECT test_param_names1(1,'text');
 test_param_names1 
-------------------
 t
(1 row)

SELECT test_param_names2(users) from users;
                           test_param_names2                           
-----------------------------------------------------------------------
 {'fname': 'jane', 'lname': 'doe', 'userid': 1, 'username': 'j_doe'}
 {'fname': 'john', 'lname': 'doe', 'userid': 2, 'username': 'johnd'}
 {'fname': 'willem', 'lname': 'doe', 'userid': 3, 'username': 'w_doe'}
 {'fname': 'rick', 'lname': 'smith', 'userid': 4, 'username': 'slash'}
(4 rows)

SELECT test_param_names2(NULL);
 test_param_names2 
-------------------
 None
(1 row)

SELECT test_param_names3(1);
 test_param_names3 
-------------------
 t
(1 row)

