From 3b85f4b61623b287ebedf6f6b4cc35c296b42cd8 Mon Sep 17 00:00:00 2001 From: Philip Okugbe <16838612+Philipinho@users.noreply.github.com> Date: Mon, 4 Aug 2025 09:49:29 +0100 Subject: [PATCH] fix: enforce C collation for page position ordering to ensure consistent behavior in Postgres 17+ (#1446) - Add explicit C collation to position ordering queries to fix incorrect page placement in PostgreSQL 17+ - Ensures consistent ASCII-based ordering regardless of database locale settings - Fixes issue where new pages were incorrectly placed at random positions instead of bottom --- apps/server/src/core/page/services/page.service.ts | 4 ++-- .../server/src/integrations/import/services/import.service.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/server/src/core/page/services/page.service.ts b/apps/server/src/core/page/services/page.service.ts index d07b6133..a538eedf 100644 --- a/apps/server/src/core/page/services/page.service.ts +++ b/apps/server/src/core/page/services/page.service.ts @@ -110,7 +110,7 @@ export class PageService { .select(['position']) .where('spaceId', '=', spaceId) .where('deletedAt', 'is', null) - .orderBy('position', 'desc') + .orderBy('position', (ob) => ob.collate('C').desc()) .limit(1); if (parentPageId) { @@ -191,7 +191,7 @@ export class PageService { 'deletedAt', ]) .select((eb) => this.pageRepo.withHasChildren(eb)) - .orderBy('position', 'asc') + .orderBy('position', (ob) => ob.collate('C').asc()) .where('deletedAt', 'is', null) .where('spaceId', '=', spaceId); diff --git a/apps/server/src/integrations/import/services/import.service.ts b/apps/server/src/integrations/import/services/import.service.ts index a3da4918..7901122a 100644 --- a/apps/server/src/integrations/import/services/import.service.ts +++ b/apps/server/src/integrations/import/services/import.service.ts @@ -178,7 +178,7 @@ export class ImportService { .selectFrom('pages') .select(['id', 'position']) .where('spaceId', '=', spaceId) - .orderBy('position', 'desc') + .orderBy('position', (ob) => ob.collate('C').desc()) .limit(1) .where('parentPageId', 'is', null) .executeTakeFirst();