pg icon indicating copy to clipboard operation
pg copied to clipboard

Relation function generated wrong sql statement after WrapWith

Open woolen-sheep opened this issue 4 years ago • 1 comments

Relation function generated wrong sql statement after WrapWith. I wrote code like this:

	err := m.tx.Model((*Resume)(nil)).
		ColumnExpr("json_agg(tags) as tags, resume.*").
		Where("resume.period_id = ?", period).
		Join("JOIN tags ON resume.id = tags.resume_id").
		Group("resume.id").
		Order("create_time").
		WrapWith("resume").
		Table("resume").
		Relation("Turn").
		Where("turn.group_id = ?", group).
		Select(&resumes)

Expected Behavior

I want to get something like this:

WITH "resume" AS (SELECT json_agg(tags) as tags, resume.* FROM "resumes" AS "resume" JOIN tags ON resume.id = tags.resume_id WHERE (resume.period_id = 14) GROUP BY "resume"."id" ORDER BY "create_time") SELECT resume.*, "turn"."id" AS "turn__id", "turn"."name" AS "turn__name", "turn"."period_id" AS "turn__period_id", "turn"."group_id" AS "turn__group_id", "turn"."current" AS "turn__current", "turn"."status" AS "turn__status", "turn"."passed_message" AS "turn__passed_message", "turn"."not_passed_message" AS "turn__not_passed_message" FROM "resume" LEFT JOIN "turns" AS "turn" ON "turn"."id" = "resume"."turn_id" WHERE (turn.group_id = 17)

Current Behavior

go-pg generated sql statment below:

WITH "resume" AS (SELECT json_agg(tags) as tags, resume.*, "turn"."id" AS "turn__id", "turn"."name" AS "turn__name", "turn"."period_id" AS "turn__period_id", "turn"."group_id" AS "turn__group_id", "turn"."current" AS "turn__current", "turn"."status" AS "turn__status", "turn"."passed_message" AS "turn__passed_message", "turn"."not_passed_message" AS "turn__not_passed_message" FROM "resumes" AS "resume" LEFT JOIN "turns" AS "turn" ON "turn"."id" = "resume"."turn_id" JOIN tags ON resume.id = tags.resume_id WHERE (resume.period_id = 14) GROUP BY "resume"."id" ORDER BY "create_time") SELECT *, "turn"."id" AS "turn__id", "turn"."name" AS "turn__name", "turn"."period_id" AS "turn__period_id", "turn"."group_id" AS "turn__group_id", "turn"."current" AS "turn__current", "turn"."status" AS "turn__status", "turn"."passed_message" AS "turn__passed_message", "turn"."not_passed_message" AS "turn__not_passed_message" FROM "resume" LEFT JOIN "turns" AS "turn" ON "turn"."id" = "resume"."turn_id" WHERE (turn.group_id = 17)

And it cause ERROR #42803 column "turn.id" must appear in the GROUP BY clause or be used in an aggregate function because turn.id has different values.

Possible Solution

Steps to Reproduce

  1. Query on a table tableA with .Group() and tableA has a foreign key towards tableB
  2. Wrap result in 1 as a table newTable
  3. Call .Relation("tableB") on the new table

Context (Environment)

Detailed Description

I want Relation function only select in the new table, DO NOT add those columns to the select statement in the wrapped table.

Possible Implementation

woolen-sheep avatar Aug 16 '21 06:08 woolen-sheep

It looks like if you add Column("_") to your query before the ColumnExpr("json_agg(tags) as tags, resume.*"). it should fix it.

elliotcourant avatar Nov 20 '21 19:11 elliotcourant