diff --git a/.changeset/icy-heads-invent.md b/.changeset/icy-heads-invent.md new file mode 100644 index 000000000..7a911bc9d --- /dev/null +++ b/.changeset/icy-heads-invent.md @@ -0,0 +1,8 @@ +--- +"@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. 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) => { 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) => { 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); 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;