From fe3829529f8d4abdb6113af3b767adf8db0e9061 Mon Sep 17 00:00:00 2001 From: DexterKoelson <271681336+DexterKoelson@users.noreply.github.com> Date: Tue, 31 Mar 2026 16:08:20 -0700 Subject: [PATCH] fix: single-column BTree index Range filter/delete The type system allowed Range for single-column BTree index .filter() and .delete(), but the runtime always serialized the argument as a point value via datastore_index_scan_point_bsatn. Passing a Range object caused: SyntaxError: Cannot convert [object Object] to a BigInt Now detects Range instances and uses datastore_index_scan_range_bsatn for both filter and delete on single-column BTree indexes. --- .../bindings-typescript/src/server/runtime.ts | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/crates/bindings-typescript/src/server/runtime.ts b/crates/bindings-typescript/src/server/runtime.ts index 705a569b20a..bd3a60761c8 100644 --- a/crates/bindings-typescript/src/server/runtime.ts +++ b/crates/bindings-typescript/src/server/runtime.ts @@ -667,9 +667,37 @@ function makeTableView( index = base as UniqueIndex; } else if (serializeSinglePoint) { // numColumns == 1 + + const serializeSingleRange = !isHashIndex + ? (buffer: ResizableBuffer, range: Range): IndexScanArgs => { + BINARY_WRITER.reset(buffer); + const writer = BINARY_WRITER; + const writeBound = (bound: Bound) => { + const tags = { included: 0, excluded: 1, unbounded: 2 }; + writer.writeU8(tags[bound.tag]); + if (bound.tag !== 'unbounded') + serializeSingleElement!(writer, bound.value); + }; + writeBound(range.from); + const rstartLen = writer.offset; + writeBound(range.to); + const rendLen = writer.offset - rstartLen; + return [0, 0, rstartLen, rendLen]; + } + : null; + const rawIndex = { filter: (range: any): IteratorObject> => { const buf = LEAF_BUF; + if (serializeSingleRange && range instanceof Range) { + const args = serializeSingleRange(buf, range); + const iter_id = sys.datastore_index_scan_range_bsatn( + index_id, + buf.buffer, + ...args + ); + return tableIterator(iter_id, deserializeRow); + } const point_len = serializeSinglePoint(buf, range); const iter_id = sys.datastore_index_scan_point_bsatn( index_id, @@ -680,6 +708,14 @@ function makeTableView( }, delete: (range: any): u32 => { const buf = LEAF_BUF; + if (serializeSingleRange && range instanceof Range) { + const args = serializeSingleRange(buf, range); + return sys.datastore_delete_by_index_scan_range_bsatn( + index_id, + buf.buffer, + ...args + ); + } const point_len = serializeSinglePoint(buf, range); return sys.datastore_delete_by_index_scan_point_bsatn( index_id,