@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,75 @@
1
+ import duckdb from "../../../../src/bindings/index.ts";
2
+ import {
3
+ DuckDBIntegerType,
4
+ } from '../DuckDBType';
5
+ import { DuckDBVector } from './DuckDBVector';
6
+ import { DuckDBValidity } from './DuckDBValidity';
7
+ import {
8
+ vectorData,
9
+ } from './dataAccessors';
10
+
11
+ export class DuckDBIntegerVector extends DuckDBVector<number> {
12
+ private readonly items: Int32Array;
13
+ private readonly validity: DuckDBValidity;
14
+ private readonly vector: duckdb.Vector;
15
+ constructor(
16
+ items: Int32Array,
17
+ validity: DuckDBValidity,
18
+ vector: duckdb.Vector
19
+ ) {
20
+ super();
21
+ this.items = items;
22
+ this.validity = validity;
23
+ this.vector = vector;
24
+ }
25
+ static fromRawVector(
26
+ vector: duckdb.Vector,
27
+ itemCount: number
28
+ ): DuckDBIntegerVector {
29
+ const data = vectorData(vector, itemCount * Int32Array.BYTES_PER_ELEMENT);
30
+ const items = new Int32Array(data.buffer, data.byteOffset, itemCount);
31
+ const validity = DuckDBValidity.fromVector(vector, itemCount);
32
+ return new DuckDBIntegerVector(items, validity, vector);
33
+ }
34
+ public override get type(): DuckDBIntegerType {
35
+ return DuckDBIntegerType.instance;
36
+ }
37
+ public override get itemCount(): number {
38
+ return this.items.length;
39
+ }
40
+ public override getItem(itemIndex: number): number | null {
41
+ return this.validity.itemValid(itemIndex) ? this.items[itemIndex] : null;
42
+ }
43
+ public setItem(itemIndex: number, value: number | null) {
44
+ if (value != null) {
45
+ // Checked inline for bulk-write throughput; see dataAccessors.ts.
46
+ if (!Number.isInteger(value)) {
47
+ throw new Error(`number is not an integer`);
48
+ }
49
+ if (value < -2147483648 || value > 2147483647) {
50
+ throw new Error(`number out of int32 range`);
51
+ }
52
+ this.items[itemIndex] = value;
53
+ this.validity.setItemValid(itemIndex, true);
54
+ } else {
55
+ this.validity.setItemValid(itemIndex, false);
56
+ }
57
+ }
58
+ public flush() {
59
+ duckdb.copy_data_to_vector(
60
+ this.vector,
61
+ 0,
62
+ this.items.buffer as ArrayBuffer,
63
+ this.items.byteOffset,
64
+ this.items.byteLength
65
+ );
66
+ this.validity.flush(this.vector);
67
+ }
68
+ public override slice(offset: number, length: number): DuckDBIntegerVector {
69
+ return new DuckDBIntegerVector(
70
+ this.items.slice(offset, offset + length),
71
+ this.validity.slice(offset, length),
72
+ this.vector
73
+ );
74
+ }
75
+ }
@@ -0,0 +1,100 @@
1
+ import duckdb from "../../../../src/bindings/index.ts";
2
+ import {
3
+ DuckDBIntervalType,
4
+ } from '../DuckDBType';
5
+ import {
6
+ DuckDBIntervalValue,
7
+ } from '../values';
8
+ import { DuckDBVector } from './DuckDBVector';
9
+ import { DuckDBValidity } from './DuckDBValidity';
10
+ import {
11
+ getInt32,
12
+ getInt64,
13
+ setInt32,
14
+ setInt64,
15
+ vectorData,
16
+ } from './dataAccessors';
17
+
18
+ export class DuckDBIntervalVector extends DuckDBVector<DuckDBIntervalValue> {
19
+ private readonly dataView: DataView;
20
+ private readonly validity: DuckDBValidity;
21
+ private readonly vector: duckdb.Vector;
22
+ private readonly _itemCount: number;
23
+ constructor(
24
+ dataView: DataView,
25
+ validity: DuckDBValidity,
26
+ vector: duckdb.Vector,
27
+ itemCount: number
28
+ ) {
29
+ super();
30
+ this.dataView = dataView;
31
+ this.validity = validity;
32
+ this.vector = vector;
33
+ this._itemCount = itemCount;
34
+ }
35
+ static fromRawVector(
36
+ vector: duckdb.Vector,
37
+ itemCount: number
38
+ ): DuckDBIntervalVector {
39
+ const data = vectorData(vector, itemCount * 16);
40
+ const dataView = new DataView(
41
+ data.buffer,
42
+ data.byteOffset,
43
+ data.byteLength
44
+ );
45
+ const validity = DuckDBValidity.fromVector(vector, itemCount);
46
+ return new DuckDBIntervalVector(dataView, validity, vector, itemCount);
47
+ }
48
+ public override get type(): DuckDBIntervalType {
49
+ return DuckDBIntervalType.instance;
50
+ }
51
+ public override get itemCount(): number {
52
+ return this._itemCount;
53
+ }
54
+ public override getItem(itemIndex: number): DuckDBIntervalValue | null {
55
+ if (!this.validity.itemValid(itemIndex)) {
56
+ return null;
57
+ }
58
+ const itemStart = itemIndex * 16;
59
+ const months = getInt32(this.dataView, itemStart);
60
+ const days = getInt32(this.dataView, itemStart + 4);
61
+ const micros = getInt64(this.dataView, itemStart + 8);
62
+ return new DuckDBIntervalValue(months, days, micros);
63
+ }
64
+ public override setItem(
65
+ itemIndex: number,
66
+ value: DuckDBIntervalValue | null
67
+ ) {
68
+ if (value != null) {
69
+ const itemStart = itemIndex * 16;
70
+ setInt32(this.dataView, itemStart, value.months);
71
+ setInt32(this.dataView, itemStart + 4, value.days);
72
+ setInt64(this.dataView, itemStart + 8, value.micros);
73
+ this.validity.setItemValid(itemIndex, true);
74
+ } else {
75
+ this.validity.setItemValid(itemIndex, false);
76
+ }
77
+ }
78
+ public override flush() {
79
+ duckdb.copy_data_to_vector(
80
+ this.vector,
81
+ 0,
82
+ this.dataView.buffer as ArrayBuffer,
83
+ this.dataView.byteOffset,
84
+ this.dataView.byteLength
85
+ );
86
+ this.validity.flush(this.vector);
87
+ }
88
+ public override slice(offset: number, length: number): DuckDBIntervalVector {
89
+ return new DuckDBIntervalVector(
90
+ new DataView(
91
+ this.dataView.buffer,
92
+ this.dataView.byteOffset + offset * 16,
93
+ length * 16
94
+ ),
95
+ this.validity.slice(offset, length),
96
+ this.vector,
97
+ length
98
+ );
99
+ }
100
+ }
@@ -0,0 +1,221 @@
1
+ import duckdb from "../../../../src/bindings/index.ts";
2
+ import {
3
+ DuckDBListType,
4
+ } from '../DuckDBType';
5
+ import {
6
+ DuckDBListValue,
7
+ } from '../values';
8
+ import { DuckDBVector } from './DuckDBVector';
9
+ import { DuckDBValidity } from './DuckDBValidity';
10
+ import {
11
+ vectorData,
12
+ } from './dataAccessors';
13
+
14
+ export class DuckDBListVector extends DuckDBVector<DuckDBListValue> {
15
+ private readonly parentList: DuckDBListVector | null;
16
+ private readonly listType: DuckDBListType;
17
+ private readonly entryData: BigUint64Array;
18
+ private readonly validity: DuckDBValidity;
19
+ private readonly vector: duckdb.Vector;
20
+ private childData: DuckDBVector;
21
+ private readonly itemOffset: number;
22
+ private readonly _itemCount: number;
23
+ private readonly itemCache: (DuckDBListValue | null | undefined)[];
24
+ constructor(
25
+ parentList: DuckDBListVector | null,
26
+ listType: DuckDBListType,
27
+ entryData: BigUint64Array,
28
+ validity: DuckDBValidity,
29
+ vector: duckdb.Vector,
30
+ childData: DuckDBVector,
31
+ itemOffset: number,
32
+ itemCount: number
33
+ ) {
34
+ super();
35
+ this.parentList = parentList;
36
+ this.listType = listType;
37
+ this.entryData = entryData;
38
+ this.validity = validity;
39
+ this.vector = vector;
40
+ this.childData = childData;
41
+ this.itemOffset = itemOffset;
42
+ this._itemCount = itemCount;
43
+ this.itemCache = [];
44
+ }
45
+ static fromRawVector(
46
+ listType: DuckDBListType,
47
+ vector: duckdb.Vector,
48
+ itemCount: number
49
+ ): DuckDBListVector {
50
+ const data = vectorData(
51
+ vector,
52
+ itemCount * BigUint64Array.BYTES_PER_ELEMENT * 2
53
+ );
54
+ const entryData = new BigUint64Array(
55
+ data.buffer,
56
+ data.byteOffset,
57
+ itemCount * 2
58
+ );
59
+
60
+ const validity = DuckDBValidity.fromVector(vector, itemCount);
61
+
62
+ const child_vector = duckdb.list_vector_get_child(vector);
63
+ const child_vector_size = duckdb.list_vector_get_size(vector);
64
+ const childData = DuckDBVector.create(
65
+ child_vector,
66
+ child_vector_size,
67
+ listType.valueType
68
+ );
69
+
70
+ return new DuckDBListVector(
71
+ null,
72
+ listType,
73
+ entryData,
74
+ validity,
75
+ vector,
76
+ childData,
77
+ 0,
78
+ itemCount
79
+ );
80
+ }
81
+ public override get type(): DuckDBListType {
82
+ return this.listType;
83
+ }
84
+ public override get itemCount(): number {
85
+ return this._itemCount;
86
+ }
87
+ public getItemVector(itemIndex: number): DuckDBVector | null {
88
+ if (!this.validity.itemValid(itemIndex)) {
89
+ return null;
90
+ }
91
+ const entryDataStartIndex = itemIndex * 2;
92
+ const offset = Number(this.entryData[entryDataStartIndex]);
93
+ const length = Number(this.entryData[entryDataStartIndex + 1]);
94
+ return this.childData.slice(offset, length);
95
+ }
96
+ /**
97
+ * Returns the offset into `childVector` where this row's elements begin.
98
+ * Combined with `childVector`, this allows callers to index directly into
99
+ * the flat backing storage without allocating a per-row sliced vector.
100
+ */
101
+ public getEntryOffset(itemIndex: number): number {
102
+ return Number(this.entryData[itemIndex * 2]);
103
+ }
104
+ /** Returns the number of elements this row contributes to `childVector`. */
105
+ public getEntryLength(itemIndex: number): number {
106
+ return Number(this.entryData[itemIndex * 2 + 1]);
107
+ }
108
+ /** The (flat) child vector backing all rows' list elements. */
109
+ public get childVector(): DuckDBVector {
110
+ return this.childData;
111
+ }
112
+ public override getItem(itemIndex: number): DuckDBListValue | null {
113
+ const cachedItem = this.itemCache[itemIndex];
114
+ if (cachedItem !== undefined) {
115
+ return cachedItem;
116
+ }
117
+ const vector = this.getItemVector(itemIndex);
118
+ if (!vector) {
119
+ return null;
120
+ }
121
+ const item = new DuckDBListValue(vector.toArray());
122
+ this.itemCache[itemIndex] = item;
123
+ return item;
124
+ }
125
+ public setItem(itemIndex: number, value: DuckDBListValue | null) {
126
+ this.itemCache[itemIndex] = value;
127
+ if (this.parentList) {
128
+ this.parentList.setItem(this.itemOffset + itemIndex, value);
129
+ } else {
130
+ this.validity.setItemValid(itemIndex, value != null);
131
+ }
132
+ }
133
+ public flush() {
134
+ if (this.parentList) {
135
+ this.parentList.flush();
136
+ for (let i = 0; i < this.itemCount; i++) {
137
+ this.itemCache[i] = undefined;
138
+ }
139
+ } else {
140
+ // update entryData offset & lengths
141
+ // calculate new child vector size (sum of all item lengths)
142
+ let totalLength = 0;
143
+ for (let itemIndex = 0; itemIndex < this._itemCount; itemIndex++) {
144
+ const entryDataStartIndex = itemIndex * 2;
145
+ this.entryData[entryDataStartIndex] = BigInt(totalLength);
146
+ // ensure the cache is populated for all items
147
+ const item = this.getItem(itemIndex);
148
+ if (item) {
149
+ this.entryData[entryDataStartIndex + 1] = BigInt(item.items.length);
150
+ totalLength += item.items.length;
151
+ } else {
152
+ this.entryData[entryDataStartIndex + 1] = 0n;
153
+ }
154
+ }
155
+
156
+ // grow child vector capacity (set_size does not allocate)
157
+ duckdb.list_vector_reserve(this.vector, totalLength);
158
+
159
+ // set new child vector size
160
+ duckdb.list_vector_set_size(this.vector, totalLength);
161
+
162
+ // recreate childData after resize
163
+ const child_vector = duckdb.list_vector_get_child(this.vector);
164
+ const child_vector_size = duckdb.list_vector_get_size(this.vector);
165
+ this.childData = DuckDBVector.create(
166
+ child_vector,
167
+ child_vector_size,
168
+ this.listType.valueType
169
+ );
170
+
171
+ // set all childData items
172
+ let childItemAbsoluteIndex = 0;
173
+ for (let listIndex = 0; listIndex < this._itemCount; listIndex++) {
174
+ const list = this.getItem(listIndex);
175
+ if (list) {
176
+ for (
177
+ let childItemRelativeIndex = 0;
178
+ childItemRelativeIndex < list.items.length;
179
+ childItemRelativeIndex++
180
+ ) {
181
+ this.childData.setItem(
182
+ childItemAbsoluteIndex++,
183
+ list.items[childItemRelativeIndex]
184
+ );
185
+ }
186
+ }
187
+ }
188
+
189
+ // copy childData to child vector
190
+ this.childData.flush();
191
+
192
+ // copy entryData to vector
193
+ duckdb.copy_data_to_vector(
194
+ this.vector,
195
+ 0,
196
+ this.entryData.buffer as ArrayBuffer,
197
+ this.entryData.byteOffset,
198
+ this.entryData.byteLength
199
+ );
200
+
201
+ // flush validity
202
+ this.validity.flush(this.vector);
203
+ }
204
+ }
205
+ public override slice(offset: number, length: number): DuckDBListVector {
206
+ const entryDataStartIndex = offset * 2;
207
+ return new DuckDBListVector(
208
+ this,
209
+ this.listType,
210
+ this.entryData.slice(
211
+ entryDataStartIndex,
212
+ entryDataStartIndex + length * 2
213
+ ),
214
+ this.validity.slice(offset, length),
215
+ this.vector,
216
+ this.childData,
217
+ offset,
218
+ length
219
+ );
220
+ }
221
+ }
@@ -0,0 +1,88 @@
1
+ import duckdb from "../../../../src/bindings/index.ts";
2
+ import {
3
+ DuckDBListType,
4
+ DuckDBMapType,
5
+ DuckDBStructType,
6
+ } from '../DuckDBType';
7
+ import {
8
+ DuckDBMapEntry,
9
+ DuckDBMapValue,
10
+ listValue,
11
+ structValue,
12
+ } from '../values';
13
+ import { DuckDBVector } from './DuckDBVector';
14
+ import { DuckDBListVector } from './DuckDBListVector';
15
+ import { DuckDBStructVector } from './DuckDBStructVector';
16
+
17
+ // MAP = LIST(STRUCT(key KEY_TYPE, value VALUE_TYPE))
18
+ export class DuckDBMapVector extends DuckDBVector<DuckDBMapValue> {
19
+ private readonly mapType: DuckDBMapType;
20
+ private readonly listVector: DuckDBListVector;
21
+ constructor(mapType: DuckDBMapType, listVector: DuckDBListVector) {
22
+ super();
23
+ this.mapType = mapType;
24
+ this.listVector = listVector;
25
+ }
26
+ static fromRawVector(
27
+ mapType: DuckDBMapType,
28
+ vector: duckdb.Vector,
29
+ itemCount: number
30
+ ): DuckDBMapVector {
31
+ const listVectorType = new DuckDBListType(
32
+ new DuckDBStructType(
33
+ ['key', 'value'],
34
+ [mapType.keyType, mapType.valueType]
35
+ )
36
+ );
37
+ return new DuckDBMapVector(
38
+ mapType,
39
+ DuckDBListVector.fromRawVector(listVectorType, vector, itemCount)
40
+ );
41
+ }
42
+ public override get type(): DuckDBMapType {
43
+ return this.mapType;
44
+ }
45
+ public override get itemCount(): number {
46
+ return this.listVector.itemCount;
47
+ }
48
+ public override getItem(itemIndex: number): DuckDBMapValue | null {
49
+ const itemVector = this.listVector.getItemVector(itemIndex);
50
+ if (!itemVector) {
51
+ return null;
52
+ }
53
+ if (!(itemVector instanceof DuckDBStructVector)) {
54
+ throw new Error('item in map list vector is not a struct');
55
+ }
56
+ const entries: DuckDBMapEntry[] = [];
57
+ const itemEntryCount = itemVector.itemCount;
58
+ for (let i = 0; i < itemEntryCount; i++) {
59
+ const key = itemVector.getItemValue(i, 0);
60
+ const value = itemVector.getItemValue(i, 1);
61
+ entries.push({ key, value });
62
+ }
63
+ return new DuckDBMapValue(entries);
64
+ }
65
+ public override setItem(itemIndex: number, value: DuckDBMapValue | null) {
66
+ if (value != null) {
67
+ this.listVector.setItem(
68
+ itemIndex,
69
+ listValue(
70
+ value.entries.map((entry) =>
71
+ structValue({ 'key': entry.key, 'value': entry.value })
72
+ )
73
+ )
74
+ );
75
+ } else {
76
+ this.listVector.setItem(itemIndex, null);
77
+ }
78
+ }
79
+ public override flush() {
80
+ this.listVector.flush();
81
+ }
82
+ public override slice(offset: number, length: number): DuckDBMapVector {
83
+ return new DuckDBMapVector(
84
+ this.mapType,
85
+ this.listVector.slice(offset, length)
86
+ );
87
+ }
88
+ }
@@ -0,0 +1,53 @@
1
+ import duckdb from "../../../../src/bindings/index.ts";
2
+ import { DuckDBSQLNullType } from '../DuckDBType';
3
+ import { DuckDBVector } from './DuckDBVector';
4
+ import { DuckDBValidity } from './DuckDBValidity';
5
+
6
+ /** A vector of the SQLNULL type, whose items are all null. */
7
+ export class DuckDBSQLNullVector extends DuckDBVector<null> {
8
+ private readonly validity: DuckDBValidity;
9
+ private readonly vector: duckdb.Vector;
10
+ private readonly _itemCount: number;
11
+ constructor(
12
+ validity: DuckDBValidity,
13
+ vector: duckdb.Vector,
14
+ itemCount: number
15
+ ) {
16
+ super();
17
+ this.validity = validity;
18
+ this.vector = vector;
19
+ this._itemCount = itemCount;
20
+ }
21
+ static fromRawVector(
22
+ vector: duckdb.Vector,
23
+ itemCount: number
24
+ ): DuckDBSQLNullVector {
25
+ const validity = DuckDBValidity.fromVector(vector, itemCount);
26
+ return new DuckDBSQLNullVector(validity, vector, itemCount);
27
+ }
28
+ public override get type(): DuckDBSQLNullType {
29
+ return DuckDBSQLNullType.instance;
30
+ }
31
+ public override get itemCount(): number {
32
+ return this._itemCount;
33
+ }
34
+ public override getItem(_itemIndex: number): null {
35
+ return null;
36
+ }
37
+ public override setItem(itemIndex: number, value: null) {
38
+ if (value !== null) {
39
+ throw new Error(`Cannot set a non-null value in a SQLNULL vector`);
40
+ }
41
+ this.validity.setItemValid(itemIndex, false);
42
+ }
43
+ public override flush() {
44
+ this.validity.flush(this.vector);
45
+ }
46
+ public override slice(offset: number, length: number): DuckDBSQLNullVector {
47
+ return new DuckDBSQLNullVector(
48
+ this.validity.slice(offset, length),
49
+ this.vector,
50
+ length
51
+ );
52
+ }
53
+ }
@@ -0,0 +1,75 @@
1
+ import duckdb from "../../../../src/bindings/index.ts";
2
+ import {
3
+ DuckDBSmallIntType,
4
+ } from '../DuckDBType';
5
+ import { DuckDBVector } from './DuckDBVector';
6
+ import { DuckDBValidity } from './DuckDBValidity';
7
+ import {
8
+ vectorData,
9
+ } from './dataAccessors';
10
+
11
+ export class DuckDBSmallIntVector extends DuckDBVector<number> {
12
+ private readonly items: Int16Array;
13
+ private readonly validity: DuckDBValidity;
14
+ private readonly vector: duckdb.Vector;
15
+ constructor(
16
+ items: Int16Array,
17
+ validity: DuckDBValidity,
18
+ vector: duckdb.Vector
19
+ ) {
20
+ super();
21
+ this.items = items;
22
+ this.validity = validity;
23
+ this.vector = vector;
24
+ }
25
+ static fromRawVector(
26
+ vector: duckdb.Vector,
27
+ itemCount: number
28
+ ): DuckDBSmallIntVector {
29
+ const data = vectorData(vector, itemCount * Int16Array.BYTES_PER_ELEMENT);
30
+ const items = new Int16Array(data.buffer, data.byteOffset, itemCount);
31
+ const validity = DuckDBValidity.fromVector(vector, itemCount);
32
+ return new DuckDBSmallIntVector(items, validity, vector);
33
+ }
34
+ public override get type(): DuckDBSmallIntType {
35
+ return DuckDBSmallIntType.instance;
36
+ }
37
+ public override get itemCount(): number {
38
+ return this.items.length;
39
+ }
40
+ public override getItem(itemIndex: number): number | null {
41
+ return this.validity.itemValid(itemIndex) ? this.items[itemIndex] : null;
42
+ }
43
+ public override setItem(itemIndex: number, value: number | null) {
44
+ if (value != null) {
45
+ // Checked inline for bulk-write throughput; see dataAccessors.ts.
46
+ if (!Number.isInteger(value)) {
47
+ throw new Error(`number is not an integer`);
48
+ }
49
+ if (value < -32768 || value > 32767) {
50
+ throw new Error(`number out of int16 range`);
51
+ }
52
+ this.items[itemIndex] = value;
53
+ this.validity.setItemValid(itemIndex, true);
54
+ } else {
55
+ this.validity.setItemValid(itemIndex, false);
56
+ }
57
+ }
58
+ public override flush() {
59
+ duckdb.copy_data_to_vector(
60
+ this.vector,
61
+ 0,
62
+ this.items.buffer as ArrayBuffer,
63
+ this.items.byteOffset,
64
+ this.items.byteLength
65
+ );
66
+ this.validity.flush(this.vector);
67
+ }
68
+ public override slice(offset: number, length: number): DuckDBSmallIntVector {
69
+ return new DuckDBSmallIntVector(
70
+ this.items.slice(offset, offset + length),
71
+ this.validity.slice(offset, length),
72
+ this.vector
73
+ );
74
+ }
75
+ }