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:
MechaCat02
2026-05-24 22:20:15 +02:00
parent 728d704a66
commit 89b84252a5
4 changed files with 20 additions and 11 deletions

2
backend/Cargo.lock generated
View File

@@ -1448,7 +1448,7 @@ checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4"
[[package]] [[package]]
name = "mangalord" name = "mangalord"
version = "0.26.0" version = "0.26.1"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"argon2", "argon2",

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "mangalord" name = "mangalord"
version = "0.26.0" version = "0.26.1"
edition = "2021" edition = "2021"
default-run = "mangalord" default-run = "mangalord"

View File

@@ -424,16 +424,25 @@ async fn sync_bookmarked_chapter_content(
workers: usize, workers: usize,
force_refetch: bool, force_refetch: bool,
) -> anyhow::Result<()> { ) -> 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( let pending: Vec<(Uuid, Uuid, String)> = sqlx::query_as(
r#" r#"
SELECT DISTINCT c.id, c.manga_id, cs.source_url SELECT id, manga_id, source_url FROM (
FROM chapters c SELECT DISTINCT c.id, c.manga_id, c.created_at, cs.source_url
JOIN bookmarks b ON b.manga_id = c.manga_id FROM chapters c
JOIN chapter_sources cs ON cs.chapter_id = c.id JOIN bookmarks b ON b.manga_id = c.manga_id
WHERE cs.source_id = $1 JOIN chapter_sources cs ON cs.chapter_id = c.id
AND cs.dropped_at IS NULL WHERE cs.source_id = $1
AND (c.page_count = 0 OR $2) AND cs.dropped_at IS NULL
ORDER BY c.manga_id, c.created_at ASC AND (c.page_count = 0 OR $2)
) sub
ORDER BY manga_id, created_at ASC
"#, "#,
) )
.bind(source_id) .bind(source_id)

View File

@@ -1,6 +1,6 @@
{ {
"name": "mangalord-frontend", "name": "mangalord-frontend",
"version": "0.26.0", "version": "0.26.1",
"private": true, "private": true,
"type": "module", "type": "module",
"scripts": { "scripts": {