diff --git a/.changeset/late-clocks-reply.md b/.changeset/late-clocks-reply.md new file mode 100644 index 000000000000..73a7427d996e --- /dev/null +++ b/.changeset/late-clocks-reply.md @@ -0,0 +1,7 @@ +--- +"miniflare": minor +--- + +feat: expose `rows_read` and `rows_written` in D1 result `meta` + +`rows_read`/`rows_written` contain the number of rows read from/written to the database engine when executing a query respectively. These numbers may be greater than the number of rows returned from/inserted by a query. These numbers form billing metrics when your Worker is deployed. See https://developers.cloudflare.com/d1/platform/pricing/#billing-metrics for more details. diff --git a/packages/miniflare/src/workers/d1/database.worker.ts b/packages/miniflare/src/workers/d1/database.worker.ts index 9837ac6c64c3..4ce4d956f1b0 100644 --- a/packages/miniflare/src/workers/d1/database.worker.ts +++ b/packages/miniflare/src/workers/d1/database.worker.ts @@ -37,8 +37,10 @@ interface D1SuccessResponse { duration: number; changes: number; last_row_id: number; - changed_db?: boolean; - size_after?: number; + changed_db: boolean; + size_after: number; + rows_read: number; + rows_written: number; }; } interface D1FailureResponse { @@ -143,6 +145,8 @@ export class D1DatabaseObject extends MiniflareDurableObject { last_row_id: afterChanges.lastRowId, changed_db: changed, size_after: afterSize, + rows_read: cursor.rowsRead, + rows_written: cursor.rowsWritten, }, }; }; diff --git a/packages/miniflare/src/workers/shared/sql.worker.ts b/packages/miniflare/src/workers/shared/sql.worker.ts index 7ecc71d5212d..e73c5f4c855e 100644 --- a/packages/miniflare/src/workers/shared/sql.worker.ts +++ b/packages/miniflare/src/workers/shared/sql.worker.ts @@ -29,6 +29,9 @@ export interface TypedSqlStorage { export interface TypedSqlStorageCursor { raw(): IterableIterator; [Symbol.iterator](): IterableIterator; + readonly columnNames: string[]; + readonly rowsRead: number; + readonly rowsWritten: number; } export interface TypedSqlStorageStatement< P extends TypedValue[] = TypedValue[], diff --git a/packages/miniflare/test/plugins/d1/suite.ts b/packages/miniflare/test/plugins/d1/suite.ts index 0f61c8fd64cd..99e48d9e19db 100644 --- a/packages/miniflare/test/plugins/d1/suite.ts +++ b/packages/miniflare/test/plugins/d1/suite.ts @@ -229,6 +229,8 @@ test("D1PreparedStatement: run", async (t) => { last_row_id: result.meta.last_row_id, served_by: "miniflare.db", size_after: result.meta.size_after, + rows_read: 3, + rows_written: 0, }, }); @@ -251,6 +253,8 @@ test("D1PreparedStatement: run", async (t) => { last_row_id: 4, served_by: "miniflare.db", size_after: result.meta.size_after, + rows_read: 2, + rows_written: 2, }, }); @@ -282,6 +286,8 @@ test("D1PreparedStatement: run", async (t) => { last_row_id: 5, served_by: "miniflare.db", size_after: result.meta.size_after, + rows_read: 1, + rows_written: 1, }, }); }); @@ -309,6 +315,8 @@ test("D1PreparedStatement: all", async (t) => { last_row_id: result.meta.last_row_id, served_by: "miniflare.db", size_after: result.meta.size_after, + rows_read: 3, + rows_written: 0, }, });