Update caldav_functions.sql for Postgresql 10

From version 10, Postgresql does not allow set-returning functions in
CASE statements. As we're using the functions recursively, we cannot
use LATERAL as suggested in the error message, but we can switch the
condition inside-out with only a limited amount of repetition.
This commit is contained in:
Florian Schlichting 2017-10-03 22:36:29 +02:00
parent 6ad5511c1e
commit 39001794a3
2 changed files with 29 additions and 13 deletions

View File

@ -897,21 +897,37 @@ LANGUAGE plpgsql IMMUTABLE STRICT;
-- Expanded group memberships out to some depth -- Expanded group memberships out to some depth
CREATE or REPLACE FUNCTION expand_memberships( INT8, INT ) RETURNS SETOF INT8 AS $$ CREATE or REPLACE FUNCTION expand_memberships( INT8, INT ) RETURNS SETOF INT8 AS $$
SELECT group_id FROM group_member WHERE member_id = $1 BEGIN
UNION IF $2 > 0 THEN
SELECT expanded.g_id FROM (SELECT CASE WHEN $2 > 0 THEN expand_memberships( group_id, $2 - 1) END AS g_id RETURN QUERY
FROM group_member WHERE member_id = $1) AS expanded SELECT group_id FROM group_member WHERE member_id = $1
WHERE expanded.g_id IS NOT NULL; UNION
$$ LANGUAGE sql STABLE STRICT; SELECT expanded.g_id FROM (SELECT expand_memberships( group_id, $2 - 1) AS g_id
FROM group_member WHERE member_id = $1) AS expanded
WHERE expanded.g_id IS NOT NULL;
ELSE
RETURN QUERY
SELECT group_id FROM group_member WHERE member_id = $1;
END IF;
END
$$ LANGUAGE plpgsql IMMUTABLE STRICT;
-- Expanded group members out to some depth -- Expanded group members out to some depth
CREATE or REPLACE FUNCTION expand_members( INT8, INT ) RETURNS SETOF INT8 AS $$ CREATE or REPLACE FUNCTION expand_members( INT8, INT ) RETURNS SETOF INT8 AS $$
SELECT member_id FROM group_member WHERE group_id = $1 BEGIN
UNION IF $2 > 0 THEN
SELECT expanded.m_id FROM (SELECT CASE WHEN $2 > 0 THEN expand_members( member_id, $2 - 1) END AS m_id RETURN QUERY
FROM group_member WHERE group_id = $1) AS expanded SELECT member_id FROM group_member WHERE group_id = $1
WHERE expanded.m_id IS NOT NULL; UNION
$$ LANGUAGE sql STABLE STRICT; SELECT expanded.m_id FROM (SELECT expand_members( member_id, $2 - 1) AS m_id
FROM group_member WHERE group_id = $1) AS expanded
WHERE expanded.m_id IS NOT NULL;
ELSE
RETURN QUERY
SELECT member_id FROM group_member WHERE group_id = $1;
END IF;
END
$$ LANGUAGE plpgsql IMMUTABLE STRICT;

View File

@ -1,4 +1,4 @@
The database is version 9.6 currently at revision 1.3.2. The database is version 10.0 currently at revision 1.3.2.
No patches were applied. No patches were applied.
Supported locales updated. Supported locales updated.
Updated view: dav_principal.sql applied. Updated view: dav_principal.sql applied.