Skip to content

Using :group with #count generating bad SQL on Postgres #5588

@ahawkins

Description

@ahawkins

Here is a call to scoped:

scoped({:select=>nil,
 :joins=>
  "JOIN taggings activities_taggings_4ce995f  ON activities_taggings_4ce995f.taggable_id = activities.id AND activities_taggings_4ce995f.taggable_type = 'Activity' AND activities_taggings_4ce995f.tag_id = 2 JOIN taggings activities_taggings_58b7315  ON activities_taggings_58b7315.taggable_id = activities.id AND activities_taggings_58b7315.taggable_type = 'Activity' AND activities_taggings_58b7315.tag_id = 3 LEFT OUTER JOIN taggings activities_taggings_group  ON activities_taggings_group.taggable_id = activities.id AND activities_taggings_group.taggable_type = 'Activity'",
 :group=>
  "activities.id, activities.reference_id, activities.reference_type, activities.account_id, activities.owner_id, activities.owner_type, activities.created_at, activities.updated_at, activities.timestamp HAVING COUNT(activities_taggings_group.taggable_id) = 2",
 :conditions=>"",
 :order=>nil,
 :readonly=>false})

Here it the error:

       PG::Error: ERROR:  syntax error at or near "AS"
       LINE 1: ... COUNT(activities_taggings_group.taggable_id) = 2 AS activit...
                                                                    ^
       : SELECT COUNT(*) AS count_all, activities.id, activities.reference_id, activities.reference_type, activities.account_id, activities.owner_id, activities.owner_type, activities.created_at, activities.updated_at, activities.timestamp HAVING COUNT(activities_taggings_group.taggable_id) = 2 AS activities_id_activities_reference_id_activities_reference_type FROM "activities" JOIN taggings activities_taggings_4ce995f  ON activities_taggings_4ce995f.taggable_id = activities.id AND activities_taggings_4ce995f.taggable_type = 'Activity' AND activities_taggings_4ce995f.tag_id = 2 JOIN taggings activities_taggings_58b7315  ON activities_taggings_58b7315.taggable_id = activities.id AND activities_taggings_58b7315.taggable_type = 'Activity' AND activities_taggings_58b7315.tag_id = 3 LEFT OUTER JOIN taggings activities_taggings_group  ON activities_taggings_group.taggable_id = activities.id AND activities_taggings_group.taggable_type = 'Activity' WHERE "activities"."reference_id" = 1 AND "activities"."reference_type" = 'CallList' GROUP BY activities.id, activities.reference_id, activities.reference_type, activities.account_id, activities.owner_id, activities.owner_type, activities.created_at, activities.updated_at, activities.timestamp HAVING COUNT(activities_taggings_group.taggable_id) = 2

Here is the query formatted nicely:

SELECT COUNT(*) 
  AS count_all, activities.id, activities.reference_id, 
    activities.reference_type, activities.account_id, 
    activities.owner_id, activities.owner_type, activities.created_at, 
    activities.updated_at, activities.timestamp 
HAVING COUNT(activities_taggings_group.taggable_id) = 2 AS activities_id_activities_reference_id_activities_reference_type 
FROM "activities" 
JOIN taggings activities_taggings_a00c683 
  ON activities_taggings_a00c683.taggable_id = activities.id
    AND activities_taggings_a00c683.taggable_type = 'Activity' 
    AND activities_taggings_a00c683.tag_id = 2 
JOIN taggings activities_taggings_0980a52 
  ON activities_taggings_0980a52.taggable_id = activities.id 
  AND activities_taggings_0980a52.taggable_type = 'Activity' 
  AND activities_taggings_0980a52.tag_id = 3 
LEFT OUTER JOIN taggings activities_taggings_group
  ON activities_taggings_group.taggable_id = activities.id
  AND activities_taggings_group.taggable_type = 'Activity' 
GROUP BY 
  activities.id, activities.reference_id, activities.reference_type, 
  activities.account_id, activities.owner_id, activities.owner_type, 
  activities.created_at, activities.updated_at, activities.timestamp 
HAVING COUNT(activities_taggings_group.taggable_id) = 2

TL;DR: rails adds HAVING COUNT to the select clause and postgres blows up.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions