From dd6f60df788139d01df21c828b035a0e4344f778 Mon Sep 17 00:00:00 2001 From: zhuyongcheng <2234867425@qq.com> Date: Tue, 3 Feb 2026 09:27:21 +0800 Subject: [PATCH 1/6] fix(libsql): fix SQL query to fetch latest messages instead of earliest --- packages/libsql/src/memory-core.ts | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/libsql/src/memory-core.ts b/packages/libsql/src/memory-core.ts index aeeb7e188..bf6f9693d 100644 --- a/packages/libsql/src/memory-core.ts +++ b/packages/libsql/src/memory-core.ts @@ -573,8 +573,12 @@ export class LibSQLMemoryCore implements StorageAdapter { const messagesTable = `${this.tablePrefix}_messages`; const { limit, before, after, roles } = options || {}; - let sql = `SELECT * FROM ${messagesTable} - WHERE conversation_id = ? AND user_id = ?`; + let sql = ` + SELECT * FROM ( + SELECT * + FROM ${messagesTable} + WHERE conversation_id = ? AND user_id = ? + `; const args: any[] = [conversationId, userId]; if (roles && roles.length > 0) { @@ -593,12 +597,14 @@ export class LibSQLMemoryCore implements StorageAdapter { args.push(after.toISOString()); } - sql += " ORDER BY created_at ASC"; + sql += " ORDER BY created_at DESC"; if (limit && limit > 0) { sql += " LIMIT ?"; args.push(limit); } + sql += " ) AS subq ORDER BY created_at ASC"; + const result = await this.client.execute({ sql, args }); return result.rows.map((row) => { From 71df68048504f829fe59b0ecdb3ebccf8301e22b Mon Sep 17 00:00:00 2001 From: zhuyongcheng <2234867425@qq.com> Date: Tue, 3 Feb 2026 09:45:31 +0800 Subject: [PATCH 2/6] fix(postgres): fix SQL query to fetch latest messages instead of earliest --- packages/postgres/src/memory-adapter.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/postgres/src/memory-adapter.ts b/packages/postgres/src/memory-adapter.ts index e4dc17596..cac3b62f6 100644 --- a/packages/postgres/src/memory-adapter.ts +++ b/packages/postgres/src/memory-adapter.ts @@ -515,8 +515,9 @@ export class PostgreSQLMemoryAdapter implements StorageAdapter { }); // Build query with filters - use SELECT * to handle both old and new schemas safely - let sql = `SELECT * FROM ${messagesTable} - WHERE conversation_id = $1 AND user_id = $2`; + let sql = `SELECT * FROM ( + SELECT * FROM ${messagesTable} + WHERE conversation_id = $1 AND user_id = $2`; const params: any[] = [conversationId, userId]; let paramCount = 3; @@ -551,12 +552,14 @@ export class PostgreSQLMemoryAdapter implements StorageAdapter { } // Order by creation time and apply limit - sql += " ORDER BY created_at ASC"; + sql += " ORDER BY created_at DESC"; if (limit && limit > 0) { sql += ` LIMIT $${paramCount}`; params.push(limit); } + sql += " ) AS subq ORDER BY created_at ASC"; + // Debug: Final SQL and parameters this.log("Final SQL query:", sql); this.log("Query parameters:", params); From 48269f4f24480122e391b207c0755ade8917f444 Mon Sep 17 00:00:00 2001 From: zhuyongcheng <2234867425@qq.com> Date: Tue, 3 Feb 2026 09:46:59 +0800 Subject: [PATCH 3/6] fix(cloudflare-d1): fix SQL query to fetch latest messages instead of earliest --- packages/cloudflare-d1/src/memory-adapter.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/cloudflare-d1/src/memory-adapter.ts b/packages/cloudflare-d1/src/memory-adapter.ts index 45e3f6d91..f01fb555a 100644 --- a/packages/cloudflare-d1/src/memory-adapter.ts +++ b/packages/cloudflare-d1/src/memory-adapter.ts @@ -615,8 +615,9 @@ export class D1MemoryAdapter implements StorageAdapter { const messagesTable = `${this.tablePrefix}_messages`; const { limit, before, after, roles } = options || {}; - let sql = `SELECT * FROM ${messagesTable} - WHERE conversation_id = ? AND user_id = ?`; + let sql = `SELECT * FROM ( + SELECT * FROM ${messagesTable} + WHERE conversation_id = ? AND user_id = ?`; const args: unknown[] = [conversationId, userId]; if (roles && roles.length > 0) { @@ -635,12 +636,14 @@ export class D1MemoryAdapter implements StorageAdapter { args.push(after.toISOString()); } - sql += " ORDER BY created_at ASC"; + sql += " ORDER BY created_at DESC"; if (limit && limit > 0) { sql += " LIMIT ?"; args.push(limit); } + sql += " ) AS subq ORDER BY created_at ASC"; + const rows = await this.all(sql, args); return rows.map((row) => { From d6fbbf8e86a72a965b567535aa49c47e9622a5d5 Mon Sep 17 00:00:00 2001 From: zhuyongcheng <2234867425@qq.com> Date: Tue, 3 Feb 2026 09:49:28 +0800 Subject: [PATCH 4/6] fix(supabase): fix SQL query to fetch latest messages instead of earliest --- packages/supabase/src/memory-adapter.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/supabase/src/memory-adapter.ts b/packages/supabase/src/memory-adapter.ts index 8501d09ce..0cf64bff7 100644 --- a/packages/supabase/src/memory-adapter.ts +++ b/packages/supabase/src/memory-adapter.ts @@ -619,7 +619,7 @@ END OF MIGRATION SQL } // Order by creation time and apply limit - query = query.order("created_at", { ascending: true }); + query = query.order("created_at", { ascending: false }); if (limit && limit > 0) { query = query.limit(limit); } @@ -631,7 +631,7 @@ END OF MIGRATION SQL } // Convert to UIMessages with on-the-fly migration for old format - return (data || []).map((row) => { + return (data || []).reverse().map((row) => { // Determine parts based on whether we have new format (parts) or old format (content) let parts: any; From 20e492bc7a1dfba466f46f80544b79ac6b617390 Mon Sep 17 00:00:00 2001 From: zhuyongcheng <2234867425@qq.com> Date: Tue, 3 Feb 2026 09:56:07 +0800 Subject: [PATCH 5/6] docs: fix sql bug docs --- .changeset/icy-heads-invent.md | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 .changeset/icy-heads-invent.md diff --git a/.changeset/icy-heads-invent.md b/.changeset/icy-heads-invent.md new file mode 100644 index 000000000..1a4532780 --- /dev/null +++ b/.changeset/icy-heads-invent.md @@ -0,0 +1,8 @@ +--- +"@voltagent/cloudflare-d1": major +"@voltagent/postgres": major +"@voltagent/supabase": major +"@voltagent/libsql": major +--- + +The SQL statement has been modified. Previously, the query returned the earliest messages instead of the most recent ones. From b98f8028afcc05b80407953a6ed31f66783b4f54 Mon Sep 17 00:00:00 2001 From: Omer Aplak Date: Tue, 3 Feb 2026 18:11:21 +0300 Subject: [PATCH 6/6] chore: update changeset --- .changeset/icy-heads-invent.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.changeset/icy-heads-invent.md b/.changeset/icy-heads-invent.md index 1a4532780..7a911bc9d 100644 --- a/.changeset/icy-heads-invent.md +++ b/.changeset/icy-heads-invent.md @@ -1,8 +1,8 @@ --- -"@voltagent/cloudflare-d1": major -"@voltagent/postgres": major -"@voltagent/supabase": major -"@voltagent/libsql": major +"@voltagent/cloudflare-d1": minor +"@voltagent/postgres": minor +"@voltagent/supabase": minor +"@voltagent/libsql": minor --- The SQL statement has been modified. Previously, the query returned the earliest messages instead of the most recent ones.