Fix correlated subqueries referencing non-grouped column
Replace sub.guild_id = dl.guild_id with sub.guild_id = $1 in all 5 stats queries to satisfy PostgreSQL GROUP BY strictness. PostgreSQL requires columns in correlated subqueries to appear in the outer GROUP BY, but guild_id was not grouped. Since the outer query already filters by WHERE guild_id = $1, using $1 directly in the subquery is correct and avoids the error. Affected: GetLeaderboard, GetUserStats, GetStatsInRange, GetYearlyLeaderboard, GetUserYearlyStats
This commit is contained in:
10
db/db.go
10
db/db.go
@@ -186,7 +186,7 @@ func (d *DB) AdjustKM(ctx context.Context, guildID, userID, username string, km
|
|||||||
|
|
||||||
func (d *DB) GetLeaderboard(ctx context.Context, guildID string, since time.Time, limit int) ([]*UserStats, error) {
|
func (d *DB) GetLeaderboard(ctx context.Context, guildID string, since time.Time, limit int) ([]*UserStats, error) {
|
||||||
q := `SELECT user_id,
|
q := `SELECT user_id,
|
||||||
(SELECT username FROM distance_logs sub WHERE sub.user_id = dl.user_id AND sub.guild_id = dl.guild_id ORDER BY logged_at DESC LIMIT 1),
|
(SELECT username FROM distance_logs sub WHERE sub.user_id = dl.user_id AND sub.guild_id = $1 ORDER BY logged_at DESC LIMIT 1),
|
||||||
SUM(km), COUNT(*), MAX(logged_at)
|
SUM(km), COUNT(*), MAX(logged_at)
|
||||||
FROM distance_logs dl WHERE guild_id = $1`
|
FROM distance_logs dl WHERE guild_id = $1`
|
||||||
args := []interface{}{guildID}
|
args := []interface{}{guildID}
|
||||||
@@ -230,7 +230,7 @@ func (d *DB) GetTotalKM(ctx context.Context, guildID string, since time.Time) (f
|
|||||||
|
|
||||||
func (d *DB) GetUserStats(ctx context.Context, guildID, userID string, since time.Time) (*UserStats, error) {
|
func (d *DB) GetUserStats(ctx context.Context, guildID, userID string, since time.Time) (*UserStats, error) {
|
||||||
q := `SELECT user_id,
|
q := `SELECT user_id,
|
||||||
COALESCE((SELECT username FROM distance_logs sub WHERE sub.user_id = dl.user_id AND sub.guild_id = dl.guild_id ORDER BY logged_at DESC LIMIT 1), ''),
|
COALESCE((SELECT username FROM distance_logs sub WHERE sub.user_id = dl.user_id AND sub.guild_id = $1 ORDER BY logged_at DESC LIMIT 1), ''),
|
||||||
COALESCE(SUM(km), 0), COUNT(*), COALESCE(MAX(logged_at)::text, '')
|
COALESCE(SUM(km), 0), COUNT(*), COALESCE(MAX(logged_at)::text, '')
|
||||||
FROM distance_logs dl WHERE guild_id = $1 AND user_id = $2`
|
FROM distance_logs dl WHERE guild_id = $1 AND user_id = $2`
|
||||||
args := []interface{}{guildID, userID}
|
args := []interface{}{guildID, userID}
|
||||||
@@ -252,7 +252,7 @@ func (d *DB) GetUserStats(ctx context.Context, guildID, userID string, since tim
|
|||||||
func (d *DB) GetStatsInRange(ctx context.Context, guildID string, from, to time.Time, limit int) ([]*UserStats, error) {
|
func (d *DB) GetStatsInRange(ctx context.Context, guildID string, from, to time.Time, limit int) ([]*UserStats, error) {
|
||||||
rows, err := d.conn.QueryContext(ctx, `
|
rows, err := d.conn.QueryContext(ctx, `
|
||||||
SELECT user_id,
|
SELECT user_id,
|
||||||
(SELECT username FROM distance_logs sub WHERE sub.user_id = dl.user_id AND sub.guild_id = dl.guild_id ORDER BY logged_at DESC LIMIT 1),
|
(SELECT username FROM distance_logs sub WHERE sub.user_id = dl.user_id AND sub.guild_id = $1 ORDER BY logged_at DESC LIMIT 1),
|
||||||
SUM(km), COUNT(*), MAX(logged_at)
|
SUM(km), COUNT(*), MAX(logged_at)
|
||||||
FROM distance_logs dl
|
FROM distance_logs dl
|
||||||
WHERE guild_id = $1 AND logged_at >= $2 AND logged_at <= $3
|
WHERE guild_id = $1 AND logged_at >= $2 AND logged_at <= $3
|
||||||
@@ -310,7 +310,7 @@ type YearTotal struct {
|
|||||||
func (d *DB) GetYearlyLeaderboard(ctx context.Context, guildID string, year, limit int) ([]*UserStats, error) {
|
func (d *DB) GetYearlyLeaderboard(ctx context.Context, guildID string, year, limit int) ([]*UserStats, error) {
|
||||||
rows, err := d.conn.QueryContext(ctx, `
|
rows, err := d.conn.QueryContext(ctx, `
|
||||||
SELECT user_id,
|
SELECT user_id,
|
||||||
(SELECT username FROM distance_logs sub WHERE sub.user_id = dl.user_id AND sub.guild_id = dl.guild_id ORDER BY logged_at DESC LIMIT 1),
|
(SELECT username FROM distance_logs sub WHERE sub.user_id = dl.user_id AND sub.guild_id = $1 ORDER BY logged_at DESC LIMIT 1),
|
||||||
SUM(km), COUNT(*), MAX(logged_at)
|
SUM(km), COUNT(*), MAX(logged_at)
|
||||||
FROM distance_logs dl
|
FROM distance_logs dl
|
||||||
WHERE guild_id = $1 AND EXTRACT(YEAR FROM logged_at) = $2
|
WHERE guild_id = $1 AND EXTRACT(YEAR FROM logged_at) = $2
|
||||||
@@ -341,7 +341,7 @@ func (d *DB) GetUserYearlyStats(ctx context.Context, guildID, userID string, yea
|
|||||||
var lastUpdated sql.NullTime
|
var lastUpdated sql.NullTime
|
||||||
err := d.conn.QueryRowContext(ctx, `
|
err := d.conn.QueryRowContext(ctx, `
|
||||||
SELECT user_id,
|
SELECT user_id,
|
||||||
(SELECT username FROM distance_logs sub WHERE sub.user_id = dl.user_id AND sub.guild_id = dl.guild_id ORDER BY logged_at DESC LIMIT 1),
|
(SELECT username FROM distance_logs sub WHERE sub.user_id = dl.user_id AND sub.guild_id = $1 ORDER BY logged_at DESC LIMIT 1),
|
||||||
COALESCE(SUM(km), 0), COUNT(*), MAX(logged_at)
|
COALESCE(SUM(km), 0), COUNT(*), MAX(logged_at)
|
||||||
FROM distance_logs dl
|
FROM distance_logs dl
|
||||||
WHERE guild_id = $1 AND user_id = $2 AND EXTRACT(YEAR FROM logged_at) = $3
|
WHERE guild_id = $1 AND user_id = $2 AND EXTRACT(YEAR FROM logged_at) = $3
|
||||||
|
|||||||
Reference in New Issue
Block a user