GUACAMOLE-220: Detect cycles within recursive query. SQL Server cannot deal with cycles on its own.

This commit is contained in:
Michael Jumper
2018-09-16 22:33:12 -07:00
parent ee35620194
commit 8399b252cd

View File

@@ -65,9 +65,10 @@
<!-- Select names of all effective groups (including inherited) --> <!-- Select names of all effective groups (including inherited) -->
<select id="selectEffectiveGroupIdentifiers" resultType="string"> <select id="selectEffectiveGroupIdentifiers" resultType="string">
WITH [related_entity] ([entity_id]) AS ( WITH [related_entity] ([entity_id], [path]) AS (
SELECT SELECT
[guacamole_user_group].entity_id [guacamole_user_group].entity_id,
'{' + CAST([guacamole_user_group].entity_id AS VARCHAR(MAX)) + '}'
FROM [guacamole_user_group] FROM [guacamole_user_group]
JOIN [guacamole_user_group_member] ON [guacamole_user_group].user_group_id = [guacamole_user_group_member].user_group_id JOIN [guacamole_user_group_member] ON [guacamole_user_group].user_group_id = [guacamole_user_group_member].user_group_id
WHERE WHERE
@@ -76,7 +77,8 @@
<if test="!effectiveGroups.isEmpty()"> <if test="!effectiveGroups.isEmpty()">
UNION ALL UNION ALL
SELECT SELECT
[guacamole_entity].entity_id [guacamole_entity].entity_id,
'{' + CAST([guacamole_entity].entity_id AS VARCHAR(MAX)) + '}'
FROM [guacamole_entity] FROM [guacamole_entity]
JOIN [guacamole_user_group] ON [guacamole_user_group].entity_id = [guacamole_entity].entity_id JOIN [guacamole_user_group] ON [guacamole_user_group].entity_id = [guacamole_entity].entity_id
WHERE WHERE
@@ -90,12 +92,14 @@
</if> </if>
UNION ALL UNION ALL
SELECT SELECT
[guacamole_user_group].entity_id [guacamole_user_group].entity_id,
[related_entity].path + '{' + CAST([guacamole_user_group].entity_id AS VARCHAR(MAX)) + '}'
FROM [related_entity] FROM [related_entity]
JOIN [guacamole_user_group_member] ON [related_entity].entity_id = [guacamole_user_group_member].member_entity_id JOIN [guacamole_user_group_member] ON [related_entity].entity_id = [guacamole_user_group_member].member_entity_id
JOIN [guacamole_user_group] ON [guacamole_user_group].user_group_id = [guacamole_user_group_member].user_group_id JOIN [guacamole_user_group] ON [guacamole_user_group].user_group_id = [guacamole_user_group_member].user_group_id
WHERE WHERE
[guacamole_user_group].disabled = 0 [guacamole_user_group].disabled = 0
AND [related_entity].path NOT LIKE '%{' + CAST([guacamole_user_group].entity_id AS VARCHAR(MAX)) + '}%'
) )
SELECT DISTINCT name SELECT DISTINCT name
FROM [related_entity] FROM [related_entity]