@avidian/duckdb-bun 0.0.0-stage → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (231) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +284 -2
  3. package/package.json +95 -4
  4. package/src/bindings/api/appender.ts +288 -0
  5. package/src/bindings/api/data-chunk.ts +58 -0
  6. package/src/bindings/api/database.ts +232 -0
  7. package/src/bindings/api/datetime.ts +158 -0
  8. package/src/bindings/api/index.ts +13 -0
  9. package/src/bindings/api/logical-types.ts +227 -0
  10. package/src/bindings/api/query.ts +616 -0
  11. package/src/bindings/api/scalar-function.ts +274 -0
  12. package/src/bindings/api/table-function.ts +339 -0
  13. package/src/bindings/api/values.ts +546 -0
  14. package/src/bindings/api/vector.ts +266 -0
  15. package/src/bindings/generated/capi.ts +695 -0
  16. package/src/bindings/generated/contract.ts +162 -0
  17. package/src/bindings/index.ts +10 -0
  18. package/src/bindings/runtime/convert.ts +307 -0
  19. package/src/bindings/runtime/diagnostics.ts +45 -0
  20. package/src/bindings/runtime/dispatch.ts +200 -0
  21. package/src/bindings/runtime/exception.ts +103 -0
  22. package/src/bindings/runtime/flags.ts +19 -0
  23. package/src/bindings/runtime/handle.ts +217 -0
  24. package/src/bindings/runtime/kinds.ts +53 -0
  25. package/src/bindings/runtime/marshal.ts +190 -0
  26. package/src/bindings/runtime/native.ts +150 -0
  27. package/src/bindings/runtime/ring.ts +54 -0
  28. package/src/bindings/runtime/scope.ts +133 -0
  29. package/src/bindings/runtime/trace.ts +65 -0
  30. package/src/connection.ts +35 -0
  31. package/src/database.ts +27 -0
  32. package/src/errors.ts +30 -0
  33. package/src/file-assets.d.ts +10 -0
  34. package/src/index.ts +17 -0
  35. package/src/library.ts +83 -0
  36. package/src/neo.ts +16 -0
  37. package/src/reader.ts +47 -0
  38. package/src/statement.ts +61 -0
  39. package/src/types.ts +52 -0
  40. package/src/version.ts +6 -0
  41. package/vendor/node-api/LICENSE +7 -0
  42. package/vendor/node-api/PROVENANCE.md +54 -0
  43. package/vendor/node-api/node-bindings.d.ts +1669 -0
  44. package/vendor/node-api/src/DuckDBAppender.ts +237 -0
  45. package/vendor/node-api/src/DuckDBClientContext.ts +13 -0
  46. package/vendor/node-api/src/DuckDBConnection.ts +315 -0
  47. package/vendor/node-api/src/DuckDBDataChunk.ts +412 -0
  48. package/vendor/node-api/src/DuckDBDataChunkWriter.ts +144 -0
  49. package/vendor/node-api/src/DuckDBExtractedStatements.ts +37 -0
  50. package/vendor/node-api/src/DuckDBInstance.ts +35 -0
  51. package/vendor/node-api/src/DuckDBInstanceCache.ts +29 -0
  52. package/vendor/node-api/src/DuckDBLogicalType.ts +446 -0
  53. package/vendor/node-api/src/DuckDBMaterializedResult.ts +39 -0
  54. package/vendor/node-api/src/DuckDBPendingResult.ts +83 -0
  55. package/vendor/node-api/src/DuckDBPreparedStatement.ts +376 -0
  56. package/vendor/node-api/src/DuckDBPreparedStatementCollection.ts +5 -0
  57. package/vendor/node-api/src/DuckDBPreparedStatementWeakRefCollection.ts +31 -0
  58. package/vendor/node-api/src/DuckDBResult.ts +403 -0
  59. package/vendor/node-api/src/DuckDBResultReader.ts +283 -0
  60. package/vendor/node-api/src/DuckDBScalarFunction.ts +149 -0
  61. package/vendor/node-api/src/DuckDBScalarFunctionBindInfo.ts +34 -0
  62. package/vendor/node-api/src/DuckDBScalarFunctionInfo.ts +34 -0
  63. package/vendor/node-api/src/DuckDBScalarFunctionInitInfo.ts +35 -0
  64. package/vendor/node-api/src/DuckDBTableFunction.ts +149 -0
  65. package/vendor/node-api/src/DuckDBTableFunctionBindInfo.ts +56 -0
  66. package/vendor/node-api/src/DuckDBTableFunctionInfo.ts +36 -0
  67. package/vendor/node-api/src/DuckDBTableFunctionInitInfo.ts +52 -0
  68. package/vendor/node-api/src/DuckDBType.ts +1 -0
  69. package/vendor/node-api/src/DuckDBTypeId.ts +46 -0
  70. package/vendor/node-api/src/DuckDBValueConverter.ts +23 -0
  71. package/vendor/node-api/src/DuckDBValueConverters.ts +461 -0
  72. package/vendor/node-api/src/DuckDBVector.ts +1 -0
  73. package/vendor/node-api/src/JS.ts +11 -0
  74. package/vendor/node-api/src/JSDuckDBValueConverter.ts +85 -0
  75. package/vendor/node-api/src/JSInputTypeForTypeId.ts +101 -0
  76. package/vendor/node-api/src/JSToDuckDBValueConverter.ts +136 -0
  77. package/vendor/node-api/src/JSTypeForTypeId.ts +78 -0
  78. package/vendor/node-api/src/Json.ts +7 -0
  79. package/vendor/node-api/src/JsonDuckDBValueConverter.ts +72 -0
  80. package/vendor/node-api/src/JsonTypeForTypeId.ts +86 -0
  81. package/vendor/node-api/src/ToDuckDBValueConverter.ts +68 -0
  82. package/vendor/node-api/src/ToDuckDBValueConverters.ts +303 -0
  83. package/vendor/node-api/src/configurationOptionDescriptions.ts +13 -0
  84. package/vendor/node-api/src/conversion/bytesFromString.ts +5 -0
  85. package/vendor/node-api/src/conversion/dateTimeStringConversion.ts +343 -0
  86. package/vendor/node-api/src/conversion/displayStringForDuckDBValue.ts +12 -0
  87. package/vendor/node-api/src/conversion/stringFromBlob.ts +48 -0
  88. package/vendor/node-api/src/conversion/stringFromDecimal.ts +129 -0
  89. package/vendor/node-api/src/conversion/varintDecode.ts +42 -0
  90. package/vendor/node-api/src/convertColumnsFromChunks.ts +28 -0
  91. package/vendor/node-api/src/convertColumnsObjectFromChunks.ts +29 -0
  92. package/vendor/node-api/src/convertRowObjectsFromChunks.ts +21 -0
  93. package/vendor/node-api/src/convertRowsFromChunks.ts +16 -0
  94. package/vendor/node-api/src/createConfig.ts +14 -0
  95. package/vendor/node-api/src/createDuckDBValueConverter.ts +17 -0
  96. package/vendor/node-api/src/createResult.ts +15 -0
  97. package/vendor/node-api/src/createValue.ts +355 -0
  98. package/vendor/node-api/src/duckdb.ts +51 -0
  99. package/vendor/node-api/src/enums.ts +7 -0
  100. package/vendor/node-api/src/getColumnsFromChunks.ts +13 -0
  101. package/vendor/node-api/src/getColumnsObjectFromChunks.ts +16 -0
  102. package/vendor/node-api/src/getRowObjectsFromChunks.ts +13 -0
  103. package/vendor/node-api/src/getRowsFromChunks.ts +12 -0
  104. package/vendor/node-api/src/index.ts +3 -0
  105. package/vendor/node-api/src/readValue.ts +31 -0
  106. package/vendor/node-api/src/sleep.ts +5 -0
  107. package/vendor/node-api/src/sql.ts +7 -0
  108. package/vendor/node-api/src/tsconfig.json +7 -0
  109. package/vendor/node-api/src/typeForValue.ts +144 -0
  110. package/vendor/node-api/src/types/BaseDuckDBType.ts +31 -0
  111. package/vendor/node-api/src/types/DuckDBAnyType.ts +13 -0
  112. package/vendor/node-api/src/types/DuckDBArrayType.ts +43 -0
  113. package/vendor/node-api/src/types/DuckDBBigIntType.ts +21 -0
  114. package/vendor/node-api/src/types/DuckDBBigNumType.ts +21 -0
  115. package/vendor/node-api/src/types/DuckDBBitType.ts +13 -0
  116. package/vendor/node-api/src/types/DuckDBBlobType.ts +13 -0
  117. package/vendor/node-api/src/types/DuckDBBooleanType.ts +13 -0
  118. package/vendor/node-api/src/types/DuckDBDateType.ts +29 -0
  119. package/vendor/node-api/src/types/DuckDBDecimalType.ts +46 -0
  120. package/vendor/node-api/src/types/DuckDBDoubleType.ts +21 -0
  121. package/vendor/node-api/src/types/DuckDBEnumType.ts +111 -0
  122. package/vendor/node-api/src/types/DuckDBFloatType.ts +21 -0
  123. package/vendor/node-api/src/types/DuckDBGeometryType.ts +36 -0
  124. package/vendor/node-api/src/types/DuckDBHugeIntType.ts +21 -0
  125. package/vendor/node-api/src/types/DuckDBIntegerLiteralType.ts +13 -0
  126. package/vendor/node-api/src/types/DuckDBIntegerType.ts +21 -0
  127. package/vendor/node-api/src/types/DuckDBIntervalType.ts +13 -0
  128. package/vendor/node-api/src/types/DuckDBListType.ts +35 -0
  129. package/vendor/node-api/src/types/DuckDBMapType.ts +47 -0
  130. package/vendor/node-api/src/types/DuckDBSQLNullType.ts +17 -0
  131. package/vendor/node-api/src/types/DuckDBSmallIntType.ts +21 -0
  132. package/vendor/node-api/src/types/DuckDBStringLiteralType.ts +13 -0
  133. package/vendor/node-api/src/types/DuckDBStructType.ts +104 -0
  134. package/vendor/node-api/src/types/DuckDBTimeNSType.ts +20 -0
  135. package/vendor/node-api/src/types/DuckDBTimeTZType.ts +23 -0
  136. package/vendor/node-api/src/types/DuckDBTimeType.ts +20 -0
  137. package/vendor/node-api/src/types/DuckDBTimestampMillisecondsType.ts +29 -0
  138. package/vendor/node-api/src/types/DuckDBTimestampNanosecondsType.ts +29 -0
  139. package/vendor/node-api/src/types/DuckDBTimestampSecondsType.ts +29 -0
  140. package/vendor/node-api/src/types/DuckDBTimestampTZNanosecondsType.ts +32 -0
  141. package/vendor/node-api/src/types/DuckDBTimestampTZType.ts +32 -0
  142. package/vendor/node-api/src/types/DuckDBTimestampType.ts +32 -0
  143. package/vendor/node-api/src/types/DuckDBTinyIntType.ts +21 -0
  144. package/vendor/node-api/src/types/DuckDBType.ts +86 -0
  145. package/vendor/node-api/src/types/DuckDBUBigIntType.ts +21 -0
  146. package/vendor/node-api/src/types/DuckDBUHugeIntType.ts +21 -0
  147. package/vendor/node-api/src/types/DuckDBUIntegerType.ts +21 -0
  148. package/vendor/node-api/src/types/DuckDBUSmallIntType.ts +21 -0
  149. package/vendor/node-api/src/types/DuckDBUTinyIntType.ts +21 -0
  150. package/vendor/node-api/src/types/DuckDBUUIDType.ts +20 -0
  151. package/vendor/node-api/src/types/DuckDBUnionType.ts +74 -0
  152. package/vendor/node-api/src/types/DuckDBVarCharType.ts +13 -0
  153. package/vendor/node-api/src/types/DuckDBVariantType.ts +13 -0
  154. package/vendor/node-api/src/types/index.ts +44 -0
  155. package/vendor/node-api/src/values/DuckDBArrayValue.ts +18 -0
  156. package/vendor/node-api/src/values/DuckDBBitValue.ts +117 -0
  157. package/vendor/node-api/src/values/DuckDBBlobValue.ts +26 -0
  158. package/vendor/node-api/src/values/DuckDBDateValue.ts +43 -0
  159. package/vendor/node-api/src/values/DuckDBDecimalValue.ts +44 -0
  160. package/vendor/node-api/src/values/DuckDBGeometryValue.ts +30 -0
  161. package/vendor/node-api/src/values/DuckDBIntervalValue.ts +22 -0
  162. package/vendor/node-api/src/values/DuckDBListValue.ts +18 -0
  163. package/vendor/node-api/src/values/DuckDBMapValue.ts +25 -0
  164. package/vendor/node-api/src/values/DuckDBStructValue.ts +22 -0
  165. package/vendor/node-api/src/values/DuckDBTimeNSValue.ts +23 -0
  166. package/vendor/node-api/src/values/DuckDBTimeTZValue.ts +96 -0
  167. package/vendor/node-api/src/values/DuckDBTimeValue.ts +34 -0
  168. package/vendor/node-api/src/values/DuckDBTimestampMillisecondsValue.ts +29 -0
  169. package/vendor/node-api/src/values/DuckDBTimestampNanosecondsValue.ts +28 -0
  170. package/vendor/node-api/src/values/DuckDBTimestampSecondsValue.ts +28 -0
  171. package/vendor/node-api/src/values/DuckDBTimestampTZNanosecondsValue.ts +44 -0
  172. package/vendor/node-api/src/values/DuckDBTimestampTZValue.ts +54 -0
  173. package/vendor/node-api/src/values/DuckDBTimestampValue.ts +45 -0
  174. package/vendor/node-api/src/values/DuckDBTupleValue.ts +22 -0
  175. package/vendor/node-api/src/values/DuckDBUUIDValue.ts +48 -0
  176. package/vendor/node-api/src/values/DuckDBUnionValue.ts +22 -0
  177. package/vendor/node-api/src/values/DuckDBValue.ts +53 -0
  178. package/vendor/node-api/src/values/DuckDBVariantValue.ts +34 -0
  179. package/vendor/node-api/src/values/index.ts +24 -0
  180. package/vendor/node-api/src/vectors/DuckDBArrayVector.ts +107 -0
  181. package/vendor/node-api/src/vectors/DuckDBBigIntVector.ts +75 -0
  182. package/vendor/node-api/src/vectors/DuckDBBigNumVector.ts +98 -0
  183. package/vendor/node-api/src/vectors/DuckDBBitVector.ts +102 -0
  184. package/vendor/node-api/src/vectors/DuckDBBlobVector.ts +112 -0
  185. package/vendor/node-api/src/vectors/DuckDBBooleanVector.ts +84 -0
  186. package/vendor/node-api/src/vectors/DuckDBDateVector.ts +80 -0
  187. package/vendor/node-api/src/vectors/DuckDBDecimal128Vector.ts +107 -0
  188. package/vendor/node-api/src/vectors/DuckDBDecimal16Vector.ts +104 -0
  189. package/vendor/node-api/src/vectors/DuckDBDecimal32Vector.ts +104 -0
  190. package/vendor/node-api/src/vectors/DuckDBDecimal64Vector.ts +104 -0
  191. package/vendor/node-api/src/vectors/DuckDBDoubleVector.ts +68 -0
  192. package/vendor/node-api/src/vectors/DuckDBEnum16Vector.ts +75 -0
  193. package/vendor/node-api/src/vectors/DuckDBEnum32Vector.ts +75 -0
  194. package/vendor/node-api/src/vectors/DuckDBEnum8Vector.ts +75 -0
  195. package/vendor/node-api/src/vectors/DuckDBFloatVector.ts +68 -0
  196. package/vendor/node-api/src/vectors/DuckDBGeometryVector.ts +97 -0
  197. package/vendor/node-api/src/vectors/DuckDBHugeIntVector.ts +89 -0
  198. package/vendor/node-api/src/vectors/DuckDBIntegerVector.ts +75 -0
  199. package/vendor/node-api/src/vectors/DuckDBIntervalVector.ts +100 -0
  200. package/vendor/node-api/src/vectors/DuckDBListVector.ts +221 -0
  201. package/vendor/node-api/src/vectors/DuckDBMapVector.ts +88 -0
  202. package/vendor/node-api/src/vectors/DuckDBSQLNullVector.ts +53 -0
  203. package/vendor/node-api/src/vectors/DuckDBSmallIntVector.ts +75 -0
  204. package/vendor/node-api/src/vectors/DuckDBStructVector.ts +138 -0
  205. package/vendor/node-api/src/vectors/DuckDBTimeNSVector.ts +80 -0
  206. package/vendor/node-api/src/vectors/DuckDBTimeTZVector.ts +80 -0
  207. package/vendor/node-api/src/vectors/DuckDBTimeVector.ts +80 -0
  208. package/vendor/node-api/src/vectors/DuckDBTimestampMillisecondsVector.ts +88 -0
  209. package/vendor/node-api/src/vectors/DuckDBTimestampNanosecondsVector.ts +88 -0
  210. package/vendor/node-api/src/vectors/DuckDBTimestampSecondsVector.ts +88 -0
  211. package/vendor/node-api/src/vectors/DuckDBTimestampTZNanosecondsVector.ts +88 -0
  212. package/vendor/node-api/src/vectors/DuckDBTimestampTZVector.ts +86 -0
  213. package/vendor/node-api/src/vectors/DuckDBTimestampVector.ts +83 -0
  214. package/vendor/node-api/src/vectors/DuckDBTinyIntVector.ts +75 -0
  215. package/vendor/node-api/src/vectors/DuckDBTupleVector.ts +125 -0
  216. package/vendor/node-api/src/vectors/DuckDBUBigIntVector.ts +75 -0
  217. package/vendor/node-api/src/vectors/DuckDBUHugeIntVector.ts +89 -0
  218. package/vendor/node-api/src/vectors/DuckDBUIntegerVector.ts +75 -0
  219. package/vendor/node-api/src/vectors/DuckDBUSmallIntVector.ts +75 -0
  220. package/vendor/node-api/src/vectors/DuckDBUTinyIntVector.ts +75 -0
  221. package/vendor/node-api/src/vectors/DuckDBUUIDVector.ts +89 -0
  222. package/vendor/node-api/src/vectors/DuckDBUnionVector.ts +84 -0
  223. package/vendor/node-api/src/vectors/DuckDBValidity.ts +104 -0
  224. package/vendor/node-api/src/vectors/DuckDBVarCharVector.ts +100 -0
  225. package/vendor/node-api/src/vectors/DuckDBVariantVector.ts +609 -0
  226. package/vendor/node-api/src/vectors/DuckDBVector.ts +33 -0
  227. package/vendor/node-api/src/vectors/createVector.ts +269 -0
  228. package/vendor/node-api/src/vectors/dataAccessors.ts +387 -0
  229. package/vendor/node-api/src/vectors/index.ts +50 -0
  230. package/vendor/node-api/src/vectors/vectorRegistry.ts +24 -0
  231. package/vendor/node-api/src/version.ts +5 -0
@@ -0,0 +1,266 @@
1
+ // Vector, validity mask and raw data functions of the @duckdb/node-bindings
2
+ // contract. Semantics and error text follow the official binding
3
+ // (bindings/src/duckdb_node_bindings.cpp and conversion_helpers.h at the
4
+ // vendored tag).
5
+ //
6
+ // vector_get_data, vector_get_validity and get_data_from_pointer return Buffers
7
+ // over DuckDB's memory, as the official external buffers do, of the byte count
8
+ // the caller asks for: DuckDB exposes no capacity to check it against. Each view
9
+ // keeps the handle that owns its memory reachable (runtime/scope.ts).
10
+ import { type Pointer, toArrayBuffer } from "bun:ffi";
11
+ import type { LogicalType, Value, Vector } from "../generated/contract.ts";
12
+ import {
13
+ checkValidityRowInRange,
14
+ expectBoolean,
15
+ expectString,
16
+ throwIndexOutOfRange,
17
+ uint32FromNumber,
18
+ } from "../runtime/convert.ts";
19
+ import { type Handle, handleOf, unwrap } from "../runtime/handle.ts";
20
+ import { borrow, own } from "../runtime/kinds.ts";
21
+ import { slot, utf8 } from "../runtime/marshal.ts";
22
+ import { duckdb } from "../runtime/native.ts";
23
+ import { derived, liveOwnerOfBuffer, nativeCopy } from "../runtime/scope.ts";
24
+
25
+ function asHandle<T>(handle: Handle): T {
26
+ return handle as unknown as T;
27
+ }
28
+
29
+ /** node-addon-api's Uint8Array cast: any typed array, read as bytes. */
30
+ function bytesOf(value: unknown): Uint8Array {
31
+ if (!ArrayBuffer.isView(value) || value instanceof DataView) throw new Error("Invalid argument");
32
+ return new Uint8Array(value.buffer, value.byteOffset, value.byteLength);
33
+ }
34
+
35
+ /** node-addon-api's ArrayBuffer cast. */
36
+ function arrayBufferOf(value: unknown): ArrayBuffer {
37
+ if (!(value instanceof ArrayBuffer)) throw new Error("Invalid argument");
38
+ return value;
39
+ }
40
+
41
+ /** A vector a parent vector owns, such as a list's child, kept alive through the parent. */
42
+ function childVector(parent: Handle, child: Pointer | null): Vector {
43
+ return asHandle(derived(parent, borrow("vector", child, parent)));
44
+ }
45
+
46
+ // --- vectors -------------------------------------------------------------------------------
47
+
48
+ export function vector_size(): number {
49
+ return Number(duckdb.duckdb_vector_size());
50
+ }
51
+
52
+ export function create_vector(logical_type: LogicalType, capacity: number): Vector {
53
+ const type = unwrap(logical_type, "logical type");
54
+ const vector = duckdb.duckdb_create_vector(type, uint32FromNumber(capacity)) as Pointer | null;
55
+ if (vector === null) throw new Error("Failed to create vector");
56
+ return asHandle(own("vector", vector));
57
+ }
58
+
59
+ export function vector_get_column_type(vector: Vector): LogicalType {
60
+ const type = duckdb.duckdb_vector_get_column_type(unwrap(vector, "vector")) as Pointer;
61
+ return asHandle(own("logical type", type));
62
+ }
63
+
64
+ export function vector_get_data(vector: Vector, byte_count: number): Uint8Array {
65
+ const handle = handleOf(vector, "vector");
66
+ const byteCount = uint32FromNumber(byte_count);
67
+ const data = duckdb.duckdb_vector_get_data(handle.ptr) as Pointer | null;
68
+ return nativeCopy(data, byteCount, handle);
69
+ }
70
+
71
+ export function vector_get_validity(vector: Vector, byte_count: number): Uint8Array {
72
+ const handle = handleOf(vector, "vector");
73
+ const byteCount = uint32FromNumber(byte_count);
74
+ const validity = duckdb.duckdb_vector_get_validity(handle.ptr) as Pointer | null;
75
+ // The contract types this as Uint8Array, but the official binding returns
76
+ // null for a vector without a validity mask, and callers rely on it.
77
+ if (validity === null) return null as unknown as Uint8Array;
78
+ return nativeCopy(validity, byteCount, handle);
79
+ }
80
+
81
+ export function vector_ensure_validity_writable(vector: Vector): void {
82
+ duckdb.duckdb_vector_ensure_validity_writable(unwrap(vector, "vector"));
83
+ }
84
+
85
+ // Not bounds-checked, as in the official binding: the C API exposes no capacity
86
+ // for a vector (a list child grows past duckdb_vector_size()), so the caller
87
+ // bounds the index.
88
+ export function vector_assign_string_element(vector: Vector, index: number, str: string): void {
89
+ const ptr = unwrap(vector, "vector");
90
+ const row = uint32FromNumber(index);
91
+ // The _len variant keeps embedded NUL characters.
92
+ const { bytes, length } = utf8(expectString(str));
93
+ duckdb.duckdb_vector_assign_string_element_len(ptr, row, bytes, length);
94
+ }
95
+
96
+ export function vector_assign_string_element_len(vector: Vector, index: number, data: Uint8Array): void {
97
+ const ptr = unwrap(vector, "vector");
98
+ const row = uint32FromNumber(index);
99
+ const bytes = bytesOf(data);
100
+ // A zero-length view still needs a valid address; DuckDB reads none of it.
101
+ duckdb.duckdb_vector_assign_string_element_len(
102
+ ptr,
103
+ row,
104
+ bytes.byteLength === 0 ? new Uint8Array(1) : bytes,
105
+ bytes.byteLength,
106
+ );
107
+ }
108
+
109
+ export function list_vector_get_child(vector: Vector): Vector {
110
+ const handle = handleOf(vector, "vector");
111
+ return childVector(handle, duckdb.duckdb_list_vector_get_child(handle.ptr) as Pointer | null);
112
+ }
113
+
114
+ export function list_vector_get_size(vector: Vector): number {
115
+ return Number(duckdb.duckdb_list_vector_get_size(unwrap(vector, "vector")));
116
+ }
117
+
118
+ export function list_vector_set_size(vector: Vector, size: number): void {
119
+ const ptr = unwrap(vector, "vector");
120
+ duckdb.duckdb_list_vector_set_size(ptr, uint32FromNumber(size));
121
+ }
122
+
123
+ export function list_vector_reserve(vector: Vector, required_capacity: number): void {
124
+ const ptr = unwrap(vector, "vector");
125
+ duckdb.duckdb_list_vector_reserve(ptr, uint32FromNumber(required_capacity));
126
+ }
127
+
128
+ /**
129
+ * Bounds-checked, unlike the official binding. Out of range, DuckDB throws a C++
130
+ * exception across the C API, which node-addon-api happens to catch but which
131
+ * aborts the process through bun:ffi, so the index is checked against the
132
+ * vector's struct child count first (a union counts its tag).
133
+ */
134
+ export function struct_vector_get_child(vector: Vector, index: number): Vector {
135
+ const handle = handleOf(vector, "vector");
136
+ const ptr = handle.ptr;
137
+ const childIndex = uint32FromNumber(index);
138
+ if (ptr !== null) {
139
+ const type = duckdb.duckdb_vector_get_column_type(ptr) as Pointer;
140
+ const count = Number(duckdb.duckdb_struct_type_child_count(type));
141
+ duckdb.duckdb_destroy_logical_type(slot(type));
142
+ if (childIndex >= count) throwIndexOutOfRange(childIndex, count, "struct entry");
143
+ }
144
+ return childVector(handle, duckdb.duckdb_struct_vector_get_child(ptr, childIndex) as Pointer | null);
145
+ }
146
+
147
+ export function array_vector_get_child(vector: Vector): Vector {
148
+ const handle = handleOf(vector, "vector");
149
+ return childVector(handle, duckdb.duckdb_array_vector_get_child(handle.ptr) as Pointer | null);
150
+ }
151
+
152
+ export function vector_reference_value(vector: Vector, value: Value): void {
153
+ const ptr = unwrap(vector, "vector");
154
+ duckdb.duckdb_vector_reference_value(ptr, unwrap(value, "value"));
155
+ }
156
+
157
+ // --- validity masks ---------------------------------------------------------------------------
158
+ //
159
+ // The duckdb_validity_* functions index a mask of uint64 words, where row r is
160
+ // bit r % 64 of word r / 64. On the little-endian platforms this package ships
161
+ // for, that is bit r % 8 of byte r / 8, so these read and write the Uint8Array
162
+ // directly instead of crossing into C, after the same bounds check.
163
+
164
+ function rowBit(mask: Uint8Array, row: number): { byte: number; bit: number } {
165
+ checkValidityRowInRange(mask, row);
166
+ return { byte: row >>> 3, bit: 1 << (row & 7) };
167
+ }
168
+
169
+ export function validity_row_is_valid(validity: Uint8Array | null, row_index: number): boolean {
170
+ const row = uint32FromNumber(row_index);
171
+ // A null mask means every row is valid, so there is nothing to bound.
172
+ if (validity === null) return true;
173
+ const mask = bytesOf(validity);
174
+ const { byte, bit } = rowBit(mask, row);
175
+ return (mask[byte] & bit) !== 0;
176
+ }
177
+
178
+ function setRow(mask: Uint8Array, row: number, valid: boolean): void {
179
+ const { byte, bit } = rowBit(mask, row);
180
+ mask[byte] = valid ? mask[byte] | bit : mask[byte] & ~bit;
181
+ }
182
+
183
+ export function validity_set_row_validity(validity: Uint8Array, row_index: number, valid: boolean): void {
184
+ const mask = bytesOf(validity);
185
+ const row = uint32FromNumber(row_index);
186
+ setRow(mask, row, expectBoolean(valid));
187
+ }
188
+
189
+ export function validity_set_row_invalid(validity: Uint8Array, row_index: number): void {
190
+ const mask = bytesOf(validity);
191
+ setRow(mask, uint32FromNumber(row_index), false);
192
+ }
193
+
194
+ export function validity_set_row_valid(validity: Uint8Array, row_index: number): void {
195
+ const mask = bytesOf(validity);
196
+ setRow(mask, uint32FromNumber(row_index), true);
197
+ }
198
+
199
+ // --- raw data ---------------------------------------------------------------------------------
200
+
201
+ /**
202
+ * The `byte_count` bytes a pointer stored at `pointer_offset` of `array_buffer`
203
+ * points to: the out-of-line bytes of a duckdb_string_t in a copy of a vector's
204
+ * data, copied as the official binding does. It throws when that vector is gone,
205
+ * since the string lives in the vector's string heap.
206
+ */
207
+ export function get_data_from_pointer(
208
+ array_buffer: ArrayBuffer,
209
+ pointer_offset: number,
210
+ byte_count: number,
211
+ ): Uint8Array {
212
+ const buffer = arrayBufferOf(array_buffer);
213
+ const offset = uint32FromNumber(pointer_offset);
214
+ const byteCount = uint32FromNumber(byte_count);
215
+ const owner = liveOwnerOfBuffer(buffer);
216
+ const pointer = Number(new DataView(buffer).getBigUint64(offset, true));
217
+ return nativeCopy(pointer, byteCount, owner);
218
+ }
219
+
220
+ function copyInto(
221
+ target: Pointer | null,
222
+ targetOffset: number,
223
+ source: ArrayBuffer,
224
+ sourceOffset: number,
225
+ byteCount: number,
226
+ what: string,
227
+ ): void {
228
+ const bytes = new Uint8Array(source, sourceOffset, byteCount);
229
+ if (byteCount === 0) return;
230
+ // The official binding copies to whatever pointer DuckDB returns, and so
231
+ // writes through null for a vector with no data or no validity mask.
232
+ if (target === null) throw new Error(`Vector has no ${what}`);
233
+ new Uint8Array(toArrayBuffer(target, targetOffset, byteCount)).set(bytes);
234
+ }
235
+
236
+ export function copy_data_to_vector(
237
+ target_vector: Vector,
238
+ target_byte_offset: number,
239
+ source_buffer: ArrayBuffer,
240
+ source_byte_offset: number,
241
+ source_byte_count: number,
242
+ ): void {
243
+ const ptr = unwrap(target_vector, "vector");
244
+ const targetOffset = uint32FromNumber(target_byte_offset);
245
+ const source = arrayBufferOf(source_buffer);
246
+ const sourceOffset = uint32FromNumber(source_byte_offset);
247
+ const byteCount = uint32FromNumber(source_byte_count);
248
+ const target = duckdb.duckdb_vector_get_data(ptr) as Pointer | null;
249
+ copyInto(target, targetOffset, source, sourceOffset, byteCount, "data");
250
+ }
251
+
252
+ export function copy_data_to_vector_validity(
253
+ target_vector: Vector,
254
+ target_byte_offset: number,
255
+ source_buffer: ArrayBuffer,
256
+ source_byte_offset: number,
257
+ source_byte_count: number,
258
+ ): void {
259
+ const ptr = unwrap(target_vector, "vector");
260
+ const targetOffset = uint32FromNumber(target_byte_offset);
261
+ const source = arrayBufferOf(source_buffer);
262
+ const sourceOffset = uint32FromNumber(source_byte_offset);
263
+ const byteCount = uint32FromNumber(source_byte_count);
264
+ const target = duckdb.duckdb_vector_get_validity(ptr) as Pointer | null;
265
+ copyInto(target, targetOffset, source, sourceOffset, byteCount, "validity mask");
266
+ }