bugfix: subquery-wrap pending chapters query so DISTINCT + ORDER BY agree (0.26.1)
PG rejects `SELECT DISTINCT c.id, c.manga_id, cs.source_url ... ORDER BY c.manga_id, c.created_at` because the ORDER BY references a column not in the DISTINCT projection. Wrap the DISTINCT in a subquery (which includes created_at) and apply the ORDER BY in the outer SELECT. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -424,16 +424,25 @@ async fn sync_bookmarked_chapter_content(
|
||||
workers: usize,
|
||||
force_refetch: bool,
|
||||
) -> anyhow::Result<()> {
|
||||
// Subquery first so DISTINCT collapses multi-user bookmark rows
|
||||
// without forcing every ORDER BY column into the SELECT list (PG
|
||||
// rejects `ORDER BY c.created_at` against `SELECT DISTINCT c.id,
|
||||
// c.manga_id, cs.source_url` with "ORDER BY expressions must
|
||||
// appear in select list"). Outer ORDER BY then groups chapters by
|
||||
// their manga, oldest first, so backfills proceed in reading
|
||||
// order per manga.
|
||||
let pending: Vec<(Uuid, Uuid, String)> = sqlx::query_as(
|
||||
r#"
|
||||
SELECT DISTINCT c.id, c.manga_id, cs.source_url
|
||||
FROM chapters c
|
||||
JOIN bookmarks b ON b.manga_id = c.manga_id
|
||||
JOIN chapter_sources cs ON cs.chapter_id = c.id
|
||||
WHERE cs.source_id = $1
|
||||
AND cs.dropped_at IS NULL
|
||||
AND (c.page_count = 0 OR $2)
|
||||
ORDER BY c.manga_id, c.created_at ASC
|
||||
SELECT id, manga_id, source_url FROM (
|
||||
SELECT DISTINCT c.id, c.manga_id, c.created_at, cs.source_url
|
||||
FROM chapters c
|
||||
JOIN bookmarks b ON b.manga_id = c.manga_id
|
||||
JOIN chapter_sources cs ON cs.chapter_id = c.id
|
||||
WHERE cs.source_id = $1
|
||||
AND cs.dropped_at IS NULL
|
||||
AND (c.page_count = 0 OR $2)
|
||||
) sub
|
||||
ORDER BY manga_id, created_at ASC
|
||||
"#,
|
||||
)
|
||||
.bind(source_id)
|
||||
|
||||
Reference in New Issue
Block a user