 $$ LANGUAGE plpgsql;
 CREATE TRIGGER grants_modified AFTER INSERT OR UPDATE ON grants
     FOR EACH ROW EXECUTE PROCEDURE grants_modified();
-
-
-
--- An expanded list of the grants this principal has access to
-CREATE or REPLACE FUNCTION g_has_proxy_access_to( INT8, INT ) RETURNS SETOF grants AS $$
-  SELECT $1, by_collection, by_principal,
-         (CASE WHEN by_collection IS NULL THEN pprivs($1,by_principal,$2)
-               ELSE path_privs($1,(SELECT dav_name FROM collection WHERE collection_id = by_collection),$2)
-           END) AS privileges,
-         coalesce((principal.type_id=3), FALSE) AS is_group
-    FROM (
-      SELECT by_principal, by_collection FROM grants
-           WHERE to_principal IN (SELECT $1 UNION SELECT expand_memberships($1,$2))
-             AND (privileges & 5::BIT(24)) != 0::BIT(24)
-             AND by_principal != $1
-         UNION
-      SELECT principal_id AS by_principal, NULL::INT8 FROM principal
-           WHERE (default_privileges & 5::BIT(24)) != 0::BIT(24)
-             AND principal_id != $1
-    ) subquery LEFT JOIN principal ON (subquery.by_principal = principal_id);
-$$ LANGUAGE 'SQL' STABLE STRICT;
-
-
--- A list of the principals who can proxy to this principal
-CREATE or REPLACE FUNCTION g_grants_proxy_access_from( INT8, INT ) RETURNS SETOF grants AS $$
-  SELECT DISTINCT ON (grants.by_principal) by_principal, NULL::INT8, $1 AS to_principal, pprivs(by_principal,$1,$2), (principal.type_id=3) AS is_group
-    FROM grants JOIN principal ON (by_principal = principal_id)
-   WHERE by_collection IS NULL AND by_principal != $1
-     AND by_principal IN (SELECT $1 UNION SELECT expand_members(g2.to_principal,$2) FROM grants g2 WHERE g2.by_principal = $1)
-   ;
-$$ LANGUAGE 'SQL' STABLE STRICT;
-
 
 
 




-- A list of the principals who can proxy to this principal
CREATE or REPLACE FUNCTION i_proxy_to( INT8 ) RETURNS SETOF grants AS $$
  SELECT by_principal, by_collection, to_principal, bit_or(privileges), bool_or(is_group)
    FROM (SELECT by_principal, by_collection, to_principal, pprivs(to_principal,by_principal,2) AS privileges, is_group FROM grants WHERE by_principal = $1 AND by_collection IS NULL
                  UNION
          SELECT $1, NULL, group_id, 32::BIT(24), TRUE FROM group_member WHERE member_id = $1
                  UNION
          SELECT $1, NULL, principal_id, pprivs(principal_id,$1,2) AS privileges, (type_id=3) AS is_group FROM principal WHERE (default_privileges & 5::BIT(24)) != 0::BIT(24)
                  UNION
          SELECT $1, collection_id, NULL, path_privs($1,collection.dav_name,2) AS privileges, FALSE AS is_group FROM collection WHERE (default_privileges & 5::BIT(24)) != 0::BIT(24)
          ) a GROUP BY 1, 2, 3;
$$ LANGUAGE 'SQL' STRICT;


CREATE or REPLACE FUNCTION i_proxy_for( INT8 ) RETURNS SETOF grants AS $$
SELECT by_principal, by_collection, to_principal, bit_or(privileges), bool_or(is_group)
      FROM (SELECT by_principal, by_collection, to_principal, privileges, is_group FROM grants WHERE to_principal = $1
                    UNION
            SELECT member_id, NULL, $1, 32::BIT(24), TRUE FROM group_member WHERE group_id = $1
           ) a GROUP BY 1, 2, 3;
$$ LANGUAGE 'SQL' STRICT;



-- A list of the principals who this principal can proxy
CREATE or REPLACE FUNCTION proxied_by( INT8 ) RETURNS SETOF grants AS $$
SELECT by_principal, by_collection, to_principal, privileges, is_group FROM grants WHERE to_principal = $1 AND NOT is_group AND by_collection IS NULL
     UNION
SELECT by_principal, by_collection, member_id, privileges, is_group FROM grants
              JOIN group_member ON (to_principal=group_id) where member_id = $1 and is_group AND by_collection IS NULL;
$$ LANGUAGE 'SQL' STRICT;

CREATE or REPLACE FUNCTION proxy_list( INT8 ) RETURNS SETOF grants AS $$
SELECT by_principal, by_collection, to_principal, privileges, is_group FROM grants WHERE by_principal = $1 AND NOT is_group AND by_collection IS NULL
     UNION
SELECT by_principal, by_collection, member_id, privileges, is_group FROM grants
              JOIN group_member ON (to_principal=group_id) where by_principal = $1 and is_group AND by_collection IS NULL
     UNION
SELECT by_principal, by_collection, to_principal, privileges, is_group FROM grants WHERE to_principal = $1 AND NOT is_group AND by_collection IS NULL
     UNION
SELECT by_principal, by_collection, member_id, privileges, is_group FROM grants
              JOIN group_member ON (to_principal=group_id) where member_id = $1 and is_group AND by_collection IS NULL;
$$ LANGUAGE 'SQL' STRICT;


-- New in 1.2.7

CREATE or REPLACE FUNCTION write_sync_change( INT8, INT, TEXT ) RETURNS BOOLEAN AS $$

LANGUAGE 'PlPgSQL' IMMUTABLE STRICT;


-- Expanded group memberships out to some depth
CREATE or REPLACE FUNCTION expand_memberships( INT8, INT ) RETURNS SETOF INT8 AS $$
  SELECT group_id FROM group_member WHERE member_id = $1
