Skip to content

Subqueries in where conditions using a having expression themselves fail on postgres if compound keys are involved #151

@nilmerg

Description

@nilmerg

A query like this:

SELECT event.id,
       event.time,
       event.source_id,
       event.object_id,
       event.type,
       event.severity,
       event.message,
       event.username,
       event_source.id             AS event_source_id,
       event_source.type           AS event_source_type,
       event_source.name           AS event_source_name,
       event_object.id             AS event_object_id,
       event_object.host           AS event_object_host,
       event_object.service        AS event_object_service,
       event_incident.id           AS event_incident_id,
       event_incident.object_id    AS event_incident_object_id,
       event_incident.started_at   AS event_incident_started_at,
       event_incident.recovered_at AS event_incident_recovered_at,
       event_incident.severity     AS event_incident_severity
FROM event
         INNER JOIN source event_source ON event_source.id = event.source_id
         INNER JOIN object event_object ON event_object.id = event.object_id
         LEFT JOIN incident_event event_incident_event ON event_incident_event.event_id = event.id
         LEFT JOIN incident event_incident ON event_incident.id = event_incident_event.incident_id
WHERE (EXISTS(SELECT (1)
              FROM object_extra_tag sub_object_extra_tag
                       INNER JOIN object sub_object_extra_tag_object
                                  ON sub_object_extra_tag_object.id = sub_object_extra_tag.object_id
                       INNER JOIN event sub_object_extra_tag_object_event
                                  ON sub_object_extra_tag_object_event.object_id = sub_object_extra_tag_object.id
              WHERE (sub_object_extra_tag_object_event.id = event.id)
                AND ((sub_object_extra_tag.tag = 'hostgroup / linux - servers') OR
                     (sub_object_extra_tag.tag = 'servicegroup / ping'))
              HAVING COUNT(DISTINCT sub_object_extra_tag.object_id, sub_object_extra_tag.source_id,
                           sub_object_extra_tag.tag) >= 2))
  AND (event.time <= 1680271102)
ORDER BY event.time desc
LIMIT 26

fails with this message:

SQLSTATE[42883]: Undefined function: 7 ERROR: function count(bytea, bigint, text) does not exist
LINE 1: ... = $1) OR (sub_object_extra_tag.tag = $2)) HAVING COUNT(DIST...
^
HINT: No function matches the given name and argument types. You might need to add explicit type casts.

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions