@avidian/duckdb-bun 0.0.0-stage → 1.0.1

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 +286 -2
  3. package/package.json +96 -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 +213 -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 +153 -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,48 @@
1
+ /** Matches BLOB-to-VARCHAR conversion behavior of DuckDB. */
2
+ export function stringFromBlob(bytes: Uint8Array): string {
3
+ // String concatenation appears to be faster for this function at smaller sizes.
4
+ // Threshold of (2^16) experimentally determined on a MacBook Pro (M2 Max).
5
+ // See stringFromBlob.bench.ts.
6
+ if (bytes.length <= 65536) {
7
+ return stringFromBlobStringConcat(bytes);
8
+ }
9
+ return stringFromBlobArrayJoin(bytes);
10
+ }
11
+
12
+ export function stringFromBlobStringConcat(bytes: Uint8Array): string {
13
+ let byteString: string = '';
14
+
15
+ for (const byte of bytes) {
16
+ if (
17
+ byte <= 0x1f ||
18
+ byte === 0x22 /* double quote */ ||
19
+ byte === 0x27 /* single quote */ ||
20
+ byte >= 0x7f
21
+ ) {
22
+ byteString += `\\x${byte.toString(16).toUpperCase().padStart(2, '0')}`;
23
+ } else {
24
+ byteString += String.fromCharCode(byte);
25
+ }
26
+ }
27
+ return byteString;
28
+ }
29
+
30
+ export function stringFromBlobArrayJoin(bytes: Uint8Array): string {
31
+ const byteStrings: string[] = [];
32
+
33
+ for (const byte of bytes) {
34
+ if (
35
+ byte <= 0x1f ||
36
+ byte === 0x22 /* double quote */ ||
37
+ byte === 0x27 /* single quote */ ||
38
+ byte >= 0x7f
39
+ ) {
40
+ byteStrings.push(
41
+ `\\x${byte.toString(16).toUpperCase().padStart(2, '0')}`
42
+ );
43
+ } else {
44
+ byteStrings.push(String.fromCharCode(byte));
45
+ }
46
+ }
47
+ return byteStrings.join('');
48
+ }
@@ -0,0 +1,129 @@
1
+ /**
2
+ * Decimal string formatting.
3
+ *
4
+ * Supports a subset of the functionality of `BigInt.prototype.toLocaleString` for locale-specific formatting.
5
+ */
6
+
7
+ /*
8
+ * Locale formatting options for DuckDBDecimal.
9
+ *
10
+ * This is a subset of the options available for `BigInt.prototype.toLocaleString`
11
+ */
12
+ export interface DuckDBDecimalFormatOptions {
13
+ useGrouping?: boolean;
14
+ minimumFractionDigits?: number;
15
+ maximumFractionDigits?: number;
16
+ }
17
+
18
+ export interface LocaleOptions {
19
+ locales?: string | string[];
20
+ options?: DuckDBDecimalFormatOptions;
21
+ }
22
+
23
+ /*
24
+ * Get the decimal separator for a given locale.
25
+ * Somewhat expensive, so use getCachedDecimalSeparator if you need to call this multiple times.
26
+ */
27
+
28
+ function getDecimalSeparator(locales?: string | string[]): string {
29
+ const decimalSeparator =
30
+ new Intl.NumberFormat(locales, { useGrouping: false })
31
+ .formatToParts(0.1)
32
+ .find((part) => part.type === 'decimal')?.value ?? '.';
33
+ return decimalSeparator;
34
+ }
35
+
36
+ /*
37
+ * Get the decimal separator for a given locale, and cache the result.
38
+ */
39
+ const cachedDecimalSeparators: { [localeKey: string]: string } = {};
40
+
41
+ function getCachedDecimalSeparator(locales?: string | string[]): string {
42
+ const cacheKey = JSON.stringify(locales);
43
+ if (cacheKey in cachedDecimalSeparators) {
44
+ return cachedDecimalSeparators[cacheKey];
45
+ }
46
+ const decimalSeparator = getDecimalSeparator(locales);
47
+ cachedDecimalSeparators[cacheKey] = decimalSeparator;
48
+ return decimalSeparator;
49
+ }
50
+
51
+ // Helper function to format whole part of a decimal value.
52
+ // Note that we explicitly omit 'minimumFractionDigits' and 'maximumFractionDigits' from the options
53
+ // passed to toLocaleString, because they are only relevant for the fractional part of the number, and
54
+ // would result in formatting the whole part as a real number, which we don't want.
55
+ function formatWholePart(
56
+ localeOptions: LocaleOptions | undefined,
57
+ val: bigint,
58
+ ): string {
59
+ if (localeOptions) {
60
+ const {
61
+ minimumFractionDigits: _minFD,
62
+ maximumFractionDigits: _maxFD,
63
+ ...restOptions
64
+ } = localeOptions.options ?? {};
65
+ return val.toLocaleString(localeOptions?.locales, restOptions);
66
+ }
67
+ return String(val);
68
+ }
69
+
70
+ // Format the fractional part of a decimal value
71
+ // Note that we must handle minimumFractionDigits and maximumFractionDigits ourselves, and that
72
+ // we don't apply `useGrouping` because that only applies to the whole part of the number.
73
+ function formatFractionalPart(
74
+ localeOptions: LocaleOptions | undefined,
75
+ val: bigint,
76
+ scale: number,
77
+ ): string {
78
+ const fractionalPartStr = String(val).padStart(scale, '0');
79
+ if (!localeOptions) {
80
+ return fractionalPartStr;
81
+ }
82
+ const minFracDigits = localeOptions?.options?.minimumFractionDigits ?? 0;
83
+ const maxFracDigits = localeOptions?.options?.maximumFractionDigits ?? 20;
84
+
85
+ return fractionalPartStr.padEnd(minFracDigits, '0').slice(0, maxFracDigits);
86
+ }
87
+
88
+ /**
89
+ * Convert a scaled decimal value to a string, possibly using locale-specific formatting.
90
+ */
91
+ export function stringFromDecimal(
92
+ scaledValue: bigint,
93
+ scale: number,
94
+ localeOptions?: LocaleOptions,
95
+ ): string {
96
+ // Decimal values are represented as integers that have been scaled up by a power of ten. The `scale` property of
97
+ // the type is the exponent of the scale factor. For a scale greater than zero, we need to separate out the
98
+ // fractional part by reversing this scaling.
99
+ if (scale > 0) {
100
+ const scaleFactor = BigInt(10) ** BigInt(scale);
101
+ const absScaledValue = scaledValue < 0 ? -scaledValue : scaledValue;
102
+
103
+ const prefix = scaledValue < 0 ? '-' : '';
104
+
105
+ const wholePartNum = absScaledValue / scaleFactor;
106
+ const wholePartStr = formatWholePart(localeOptions, wholePartNum);
107
+
108
+ const fractionalPartNum = absScaledValue % scaleFactor;
109
+ const fractionalPartStr = formatFractionalPart(
110
+ localeOptions,
111
+ fractionalPartNum,
112
+ scale,
113
+ );
114
+
115
+ const decimalSeparatorStr = localeOptions
116
+ ? getCachedDecimalSeparator(localeOptions.locales)
117
+ : '.';
118
+
119
+ return `${prefix}${wholePartStr}${decimalSeparatorStr}${fractionalPartStr}`;
120
+ }
121
+ // For a scale of zero, there is no fractional part, so a direct string conversion works.
122
+ if (localeOptions) {
123
+ return scaledValue.toLocaleString(
124
+ localeOptions?.locales,
125
+ localeOptions?.options as BigIntToLocaleStringOptions | undefined,
126
+ );
127
+ }
128
+ return String(scaledValue);
129
+ }
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Decodes an unsigned LEB128 (little-endian base-128) varint at
3
+ * `view[offset]`. Each byte contributes 7 bits of payload; the high bit is
4
+ * a continuation flag.
5
+ *
6
+ * Returns the decoded `value` and the byte position `nextOffset` immediately
7
+ * after the varint. Throws if the varint:
8
+ * - reads past the end of `view` (truncated),
9
+ * - exceeds 2**32-1 (overflow).
10
+ *
11
+ * Uses arithmetic (not bitwise) accumulation so values up to 2**32-1
12
+ * round-trip correctly — JS bitwise operators coerce to signed int32 and
13
+ * would turn 0xffffffff into -1.
14
+ */
15
+ export function varintDecode(
16
+ view: DataView,
17
+ offset: number
18
+ ): { value: number; nextOffset: number } {
19
+ let value = 0;
20
+ let multiplier = 1;
21
+ let cur = offset;
22
+ while (true) {
23
+ if (cur >= view.byteLength) {
24
+ throw new Error('varint truncated');
25
+ }
26
+ const byte = view.getUint8(cur++);
27
+ value += (byte & 0x7f) * multiplier;
28
+ if ((byte & 0x80) === 0) {
29
+ break;
30
+ }
31
+ multiplier *= 128;
32
+ if (multiplier > 0x80000000) {
33
+ // multiplier == 128**5 means we're about to process a 6th byte —
34
+ // even a single payload bit beyond would push past 2**32-1.
35
+ throw new Error('varint overflow');
36
+ }
37
+ }
38
+ if (value > 0xffffffff) {
39
+ throw new Error('varint overflow');
40
+ }
41
+ return { value, nextOffset: cur };
42
+ }
@@ -0,0 +1,28 @@
1
+ import { DuckDBDataChunk } from './DuckDBDataChunk';
2
+ import { DuckDBValueConverter } from './DuckDBValueConverter';
3
+
4
+ export function convertColumnsFromChunks<T>(
5
+ chunks: readonly DuckDBDataChunk[],
6
+ columnCount: number,
7
+ converter: DuckDBValueConverter<T>
8
+ ): (T | null)[][] {
9
+ if (chunks.length === 0) {
10
+ return Array.from({ length: columnCount }, () => []);
11
+ }
12
+ const convertedColumns = chunks[0].convertColumns(converter);
13
+ for (let chunkIndex = 1; chunkIndex < chunks.length; chunkIndex++) {
14
+ for (
15
+ let columnIndex = 0;
16
+ columnIndex < convertedColumns.length;
17
+ columnIndex++
18
+ ) {
19
+ const chunk = chunks[chunkIndex];
20
+ chunk.visitColumnValues(
21
+ columnIndex,
22
+ (value, _rowIndex, _columnIndex, type) =>
23
+ convertedColumns[columnIndex].push(converter(value, type, converter))
24
+ );
25
+ }
26
+ }
27
+ return convertedColumns;
28
+ }
@@ -0,0 +1,29 @@
1
+ import { DuckDBDataChunk } from './DuckDBDataChunk';
2
+ import { DuckDBValueConverter } from './DuckDBValueConverter';
3
+
4
+ export function convertColumnsObjectFromChunks<T>(
5
+ chunks: readonly DuckDBDataChunk[],
6
+ columnNames: readonly string[],
7
+ converter: DuckDBValueConverter<T>
8
+ ): Record<string, (T | null)[]> {
9
+ const convertedColumnsObject: Record<string, (T | null)[]> = {};
10
+ for (const columnName of columnNames) {
11
+ convertedColumnsObject[columnName] = [];
12
+ }
13
+ if (chunks.length === 0) {
14
+ return convertedColumnsObject;
15
+ }
16
+ const columnCount = chunks[0].columnCount;
17
+ for (let chunkIndex = 0; chunkIndex < chunks.length; chunkIndex++) {
18
+ for (let columnIndex = 0; columnIndex < columnCount; columnIndex++) {
19
+ chunks[chunkIndex].visitColumnValues(
20
+ columnIndex,
21
+ (value, _rowIndex, _columnIndex, type) =>
22
+ convertedColumnsObject[columnNames[columnIndex]].push(
23
+ converter(value, type, converter)
24
+ )
25
+ );
26
+ }
27
+ }
28
+ return convertedColumnsObject;
29
+ }
@@ -0,0 +1,21 @@
1
+ import { DuckDBDataChunk } from './DuckDBDataChunk';
2
+ import { DuckDBValueConverter } from './DuckDBValueConverter';
3
+
4
+ export function convertRowObjectsFromChunks<T>(
5
+ chunks: readonly DuckDBDataChunk[],
6
+ columnNames: readonly string[],
7
+ converter: DuckDBValueConverter<T>
8
+ ): Record<string, T | null>[] {
9
+ const rowObjects: Record<string, T | null>[] = [];
10
+ for (const chunk of chunks) {
11
+ const rowCount = chunk.rowCount;
12
+ for (let rowIndex = 0; rowIndex < rowCount; rowIndex++) {
13
+ const rowObject: Record<string, T | null> = {};
14
+ chunk.visitRowValues(rowIndex, (value, _rowIndex, columnIndex, type) => {
15
+ rowObject[columnNames[columnIndex]] = converter(value, type, converter);
16
+ });
17
+ rowObjects.push(rowObject);
18
+ }
19
+ }
20
+ return rowObjects;
21
+ }
@@ -0,0 +1,16 @@
1
+ import { DuckDBDataChunk } from './DuckDBDataChunk';
2
+ import { DuckDBValueConverter } from './DuckDBValueConverter';
3
+
4
+ export function convertRowsFromChunks<T>(
5
+ chunks: readonly DuckDBDataChunk[],
6
+ converter: DuckDBValueConverter<T>
7
+ ): (T | null)[][] {
8
+ const rows: (T | null)[][] = [];
9
+ for (const chunk of chunks) {
10
+ const rowCount = chunk.rowCount;
11
+ for (let rowIndex = 0; rowIndex < rowCount; rowIndex++) {
12
+ rows.push(chunk.convertRowValues(rowIndex, converter));
13
+ }
14
+ }
15
+ return rows;
16
+ }
@@ -0,0 +1,14 @@
1
+ import duckdb from "../../../src/bindings/index.ts";
2
+
3
+ export function createConfig(options?: Record<string, string>): duckdb.Config {
4
+ const config = duckdb.create_config();
5
+ // Set the default duckdb_api value for the api. Can be overridden.
6
+ duckdb.set_config(config, 'duckdb_api', 'node-neo-api');
7
+ if (options) {
8
+ for (const optionName in options) {
9
+ const optionValue = String(options[optionName]);
10
+ duckdb.set_config(config, optionName, optionValue);
11
+ }
12
+ }
13
+ return config;
14
+ }
@@ -0,0 +1,17 @@
1
+ import { DuckDBTypeId } from './DuckDBTypeId';
2
+ import { DuckDBValueConverter } from './DuckDBValueConverter';
3
+
4
+ export function createDuckDBValueConverter<T>(
5
+ convertersByTypeId: Record<DuckDBTypeId, DuckDBValueConverter<T> | undefined>
6
+ ): DuckDBValueConverter<T> {
7
+ return (value, type, converter) => {
8
+ if (value == null) {
9
+ return null;
10
+ }
11
+ const converterForTypeId = convertersByTypeId[type.typeId];
12
+ if (!converterForTypeId) {
13
+ throw new Error(`No converter for typeId: ${type.typeId}`);
14
+ }
15
+ return converterForTypeId(value, type, converter);
16
+ };
17
+ }
@@ -0,0 +1,15 @@
1
+ import duckdb from "../../../src/bindings/index.ts";
2
+ import { DuckDBMaterializedResult } from './DuckDBMaterializedResult';
3
+ import { DuckDBResult } from './DuckDBResult';
4
+ import { StatementType } from './enums';
5
+
6
+ export function createResult(
7
+ result: duckdb.Result,
8
+ preparedStatementType?: StatementType
9
+ ) {
10
+ if (duckdb.result_is_streaming(result)) {
11
+ return new DuckDBResult(result, preparedStatementType);
12
+ } else {
13
+ return new DuckDBMaterializedResult(result, preparedStatementType);
14
+ }
15
+ }