@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.
- package/LICENSE +22 -0
- package/README.md +286 -2
- package/package.json +96 -4
- package/src/bindings/api/appender.ts +288 -0
- package/src/bindings/api/data-chunk.ts +58 -0
- package/src/bindings/api/database.ts +232 -0
- package/src/bindings/api/datetime.ts +158 -0
- package/src/bindings/api/index.ts +13 -0
- package/src/bindings/api/logical-types.ts +227 -0
- package/src/bindings/api/query.ts +616 -0
- package/src/bindings/api/scalar-function.ts +274 -0
- package/src/bindings/api/table-function.ts +339 -0
- package/src/bindings/api/values.ts +546 -0
- package/src/bindings/api/vector.ts +266 -0
- package/src/bindings/generated/capi.ts +695 -0
- package/src/bindings/generated/contract.ts +162 -0
- package/src/bindings/index.ts +10 -0
- package/src/bindings/runtime/convert.ts +307 -0
- package/src/bindings/runtime/diagnostics.ts +45 -0
- package/src/bindings/runtime/dispatch.ts +213 -0
- package/src/bindings/runtime/exception.ts +103 -0
- package/src/bindings/runtime/flags.ts +19 -0
- package/src/bindings/runtime/handle.ts +217 -0
- package/src/bindings/runtime/kinds.ts +53 -0
- package/src/bindings/runtime/marshal.ts +190 -0
- package/src/bindings/runtime/native.ts +153 -0
- package/src/bindings/runtime/ring.ts +54 -0
- package/src/bindings/runtime/scope.ts +133 -0
- package/src/bindings/runtime/trace.ts +65 -0
- package/src/connection.ts +35 -0
- package/src/database.ts +27 -0
- package/src/errors.ts +30 -0
- package/src/file-assets.d.ts +10 -0
- package/src/index.ts +17 -0
- package/src/library.ts +83 -0
- package/src/neo.ts +16 -0
- package/src/reader.ts +47 -0
- package/src/statement.ts +61 -0
- package/src/types.ts +52 -0
- package/src/version.ts +6 -0
- package/vendor/node-api/LICENSE +7 -0
- package/vendor/node-api/PROVENANCE.md +54 -0
- package/vendor/node-api/node-bindings.d.ts +1669 -0
- package/vendor/node-api/src/DuckDBAppender.ts +237 -0
- package/vendor/node-api/src/DuckDBClientContext.ts +13 -0
- package/vendor/node-api/src/DuckDBConnection.ts +315 -0
- package/vendor/node-api/src/DuckDBDataChunk.ts +412 -0
- package/vendor/node-api/src/DuckDBDataChunkWriter.ts +144 -0
- package/vendor/node-api/src/DuckDBExtractedStatements.ts +37 -0
- package/vendor/node-api/src/DuckDBInstance.ts +35 -0
- package/vendor/node-api/src/DuckDBInstanceCache.ts +29 -0
- package/vendor/node-api/src/DuckDBLogicalType.ts +446 -0
- package/vendor/node-api/src/DuckDBMaterializedResult.ts +39 -0
- package/vendor/node-api/src/DuckDBPendingResult.ts +83 -0
- package/vendor/node-api/src/DuckDBPreparedStatement.ts +376 -0
- package/vendor/node-api/src/DuckDBPreparedStatementCollection.ts +5 -0
- package/vendor/node-api/src/DuckDBPreparedStatementWeakRefCollection.ts +31 -0
- package/vendor/node-api/src/DuckDBResult.ts +403 -0
- package/vendor/node-api/src/DuckDBResultReader.ts +283 -0
- package/vendor/node-api/src/DuckDBScalarFunction.ts +149 -0
- package/vendor/node-api/src/DuckDBScalarFunctionBindInfo.ts +34 -0
- package/vendor/node-api/src/DuckDBScalarFunctionInfo.ts +34 -0
- package/vendor/node-api/src/DuckDBScalarFunctionInitInfo.ts +35 -0
- package/vendor/node-api/src/DuckDBTableFunction.ts +149 -0
- package/vendor/node-api/src/DuckDBTableFunctionBindInfo.ts +56 -0
- package/vendor/node-api/src/DuckDBTableFunctionInfo.ts +36 -0
- package/vendor/node-api/src/DuckDBTableFunctionInitInfo.ts +52 -0
- package/vendor/node-api/src/DuckDBType.ts +1 -0
- package/vendor/node-api/src/DuckDBTypeId.ts +46 -0
- package/vendor/node-api/src/DuckDBValueConverter.ts +23 -0
- package/vendor/node-api/src/DuckDBValueConverters.ts +461 -0
- package/vendor/node-api/src/DuckDBVector.ts +1 -0
- package/vendor/node-api/src/JS.ts +11 -0
- package/vendor/node-api/src/JSDuckDBValueConverter.ts +85 -0
- package/vendor/node-api/src/JSInputTypeForTypeId.ts +101 -0
- package/vendor/node-api/src/JSToDuckDBValueConverter.ts +136 -0
- package/vendor/node-api/src/JSTypeForTypeId.ts +78 -0
- package/vendor/node-api/src/Json.ts +7 -0
- package/vendor/node-api/src/JsonDuckDBValueConverter.ts +72 -0
- package/vendor/node-api/src/JsonTypeForTypeId.ts +86 -0
- package/vendor/node-api/src/ToDuckDBValueConverter.ts +68 -0
- package/vendor/node-api/src/ToDuckDBValueConverters.ts +303 -0
- package/vendor/node-api/src/configurationOptionDescriptions.ts +13 -0
- package/vendor/node-api/src/conversion/bytesFromString.ts +5 -0
- package/vendor/node-api/src/conversion/dateTimeStringConversion.ts +343 -0
- package/vendor/node-api/src/conversion/displayStringForDuckDBValue.ts +12 -0
- package/vendor/node-api/src/conversion/stringFromBlob.ts +48 -0
- package/vendor/node-api/src/conversion/stringFromDecimal.ts +129 -0
- package/vendor/node-api/src/conversion/varintDecode.ts +42 -0
- package/vendor/node-api/src/convertColumnsFromChunks.ts +28 -0
- package/vendor/node-api/src/convertColumnsObjectFromChunks.ts +29 -0
- package/vendor/node-api/src/convertRowObjectsFromChunks.ts +21 -0
- package/vendor/node-api/src/convertRowsFromChunks.ts +16 -0
- package/vendor/node-api/src/createConfig.ts +14 -0
- package/vendor/node-api/src/createDuckDBValueConverter.ts +17 -0
- package/vendor/node-api/src/createResult.ts +15 -0
- package/vendor/node-api/src/createValue.ts +355 -0
- package/vendor/node-api/src/duckdb.ts +51 -0
- package/vendor/node-api/src/enums.ts +7 -0
- package/vendor/node-api/src/getColumnsFromChunks.ts +13 -0
- package/vendor/node-api/src/getColumnsObjectFromChunks.ts +16 -0
- package/vendor/node-api/src/getRowObjectsFromChunks.ts +13 -0
- package/vendor/node-api/src/getRowsFromChunks.ts +12 -0
- package/vendor/node-api/src/index.ts +3 -0
- package/vendor/node-api/src/readValue.ts +31 -0
- package/vendor/node-api/src/sleep.ts +5 -0
- package/vendor/node-api/src/sql.ts +7 -0
- package/vendor/node-api/src/tsconfig.json +7 -0
- package/vendor/node-api/src/typeForValue.ts +144 -0
- package/vendor/node-api/src/types/BaseDuckDBType.ts +31 -0
- package/vendor/node-api/src/types/DuckDBAnyType.ts +13 -0
- package/vendor/node-api/src/types/DuckDBArrayType.ts +43 -0
- package/vendor/node-api/src/types/DuckDBBigIntType.ts +21 -0
- package/vendor/node-api/src/types/DuckDBBigNumType.ts +21 -0
- package/vendor/node-api/src/types/DuckDBBitType.ts +13 -0
- package/vendor/node-api/src/types/DuckDBBlobType.ts +13 -0
- package/vendor/node-api/src/types/DuckDBBooleanType.ts +13 -0
- package/vendor/node-api/src/types/DuckDBDateType.ts +29 -0
- package/vendor/node-api/src/types/DuckDBDecimalType.ts +46 -0
- package/vendor/node-api/src/types/DuckDBDoubleType.ts +21 -0
- package/vendor/node-api/src/types/DuckDBEnumType.ts +111 -0
- package/vendor/node-api/src/types/DuckDBFloatType.ts +21 -0
- package/vendor/node-api/src/types/DuckDBGeometryType.ts +36 -0
- package/vendor/node-api/src/types/DuckDBHugeIntType.ts +21 -0
- package/vendor/node-api/src/types/DuckDBIntegerLiteralType.ts +13 -0
- package/vendor/node-api/src/types/DuckDBIntegerType.ts +21 -0
- package/vendor/node-api/src/types/DuckDBIntervalType.ts +13 -0
- package/vendor/node-api/src/types/DuckDBListType.ts +35 -0
- package/vendor/node-api/src/types/DuckDBMapType.ts +47 -0
- package/vendor/node-api/src/types/DuckDBSQLNullType.ts +17 -0
- package/vendor/node-api/src/types/DuckDBSmallIntType.ts +21 -0
- package/vendor/node-api/src/types/DuckDBStringLiteralType.ts +13 -0
- package/vendor/node-api/src/types/DuckDBStructType.ts +104 -0
- package/vendor/node-api/src/types/DuckDBTimeNSType.ts +20 -0
- package/vendor/node-api/src/types/DuckDBTimeTZType.ts +23 -0
- package/vendor/node-api/src/types/DuckDBTimeType.ts +20 -0
- package/vendor/node-api/src/types/DuckDBTimestampMillisecondsType.ts +29 -0
- package/vendor/node-api/src/types/DuckDBTimestampNanosecondsType.ts +29 -0
- package/vendor/node-api/src/types/DuckDBTimestampSecondsType.ts +29 -0
- package/vendor/node-api/src/types/DuckDBTimestampTZNanosecondsType.ts +32 -0
- package/vendor/node-api/src/types/DuckDBTimestampTZType.ts +32 -0
- package/vendor/node-api/src/types/DuckDBTimestampType.ts +32 -0
- package/vendor/node-api/src/types/DuckDBTinyIntType.ts +21 -0
- package/vendor/node-api/src/types/DuckDBType.ts +86 -0
- package/vendor/node-api/src/types/DuckDBUBigIntType.ts +21 -0
- package/vendor/node-api/src/types/DuckDBUHugeIntType.ts +21 -0
- package/vendor/node-api/src/types/DuckDBUIntegerType.ts +21 -0
- package/vendor/node-api/src/types/DuckDBUSmallIntType.ts +21 -0
- package/vendor/node-api/src/types/DuckDBUTinyIntType.ts +21 -0
- package/vendor/node-api/src/types/DuckDBUUIDType.ts +20 -0
- package/vendor/node-api/src/types/DuckDBUnionType.ts +74 -0
- package/vendor/node-api/src/types/DuckDBVarCharType.ts +13 -0
- package/vendor/node-api/src/types/DuckDBVariantType.ts +13 -0
- package/vendor/node-api/src/types/index.ts +44 -0
- package/vendor/node-api/src/values/DuckDBArrayValue.ts +18 -0
- package/vendor/node-api/src/values/DuckDBBitValue.ts +117 -0
- package/vendor/node-api/src/values/DuckDBBlobValue.ts +26 -0
- package/vendor/node-api/src/values/DuckDBDateValue.ts +43 -0
- package/vendor/node-api/src/values/DuckDBDecimalValue.ts +44 -0
- package/vendor/node-api/src/values/DuckDBGeometryValue.ts +30 -0
- package/vendor/node-api/src/values/DuckDBIntervalValue.ts +22 -0
- package/vendor/node-api/src/values/DuckDBListValue.ts +18 -0
- package/vendor/node-api/src/values/DuckDBMapValue.ts +25 -0
- package/vendor/node-api/src/values/DuckDBStructValue.ts +22 -0
- package/vendor/node-api/src/values/DuckDBTimeNSValue.ts +23 -0
- package/vendor/node-api/src/values/DuckDBTimeTZValue.ts +96 -0
- package/vendor/node-api/src/values/DuckDBTimeValue.ts +34 -0
- package/vendor/node-api/src/values/DuckDBTimestampMillisecondsValue.ts +29 -0
- package/vendor/node-api/src/values/DuckDBTimestampNanosecondsValue.ts +28 -0
- package/vendor/node-api/src/values/DuckDBTimestampSecondsValue.ts +28 -0
- package/vendor/node-api/src/values/DuckDBTimestampTZNanosecondsValue.ts +44 -0
- package/vendor/node-api/src/values/DuckDBTimestampTZValue.ts +54 -0
- package/vendor/node-api/src/values/DuckDBTimestampValue.ts +45 -0
- package/vendor/node-api/src/values/DuckDBTupleValue.ts +22 -0
- package/vendor/node-api/src/values/DuckDBUUIDValue.ts +48 -0
- package/vendor/node-api/src/values/DuckDBUnionValue.ts +22 -0
- package/vendor/node-api/src/values/DuckDBValue.ts +53 -0
- package/vendor/node-api/src/values/DuckDBVariantValue.ts +34 -0
- package/vendor/node-api/src/values/index.ts +24 -0
- package/vendor/node-api/src/vectors/DuckDBArrayVector.ts +107 -0
- package/vendor/node-api/src/vectors/DuckDBBigIntVector.ts +75 -0
- package/vendor/node-api/src/vectors/DuckDBBigNumVector.ts +98 -0
- package/vendor/node-api/src/vectors/DuckDBBitVector.ts +102 -0
- package/vendor/node-api/src/vectors/DuckDBBlobVector.ts +112 -0
- package/vendor/node-api/src/vectors/DuckDBBooleanVector.ts +84 -0
- package/vendor/node-api/src/vectors/DuckDBDateVector.ts +80 -0
- package/vendor/node-api/src/vectors/DuckDBDecimal128Vector.ts +107 -0
- package/vendor/node-api/src/vectors/DuckDBDecimal16Vector.ts +104 -0
- package/vendor/node-api/src/vectors/DuckDBDecimal32Vector.ts +104 -0
- package/vendor/node-api/src/vectors/DuckDBDecimal64Vector.ts +104 -0
- package/vendor/node-api/src/vectors/DuckDBDoubleVector.ts +68 -0
- package/vendor/node-api/src/vectors/DuckDBEnum16Vector.ts +75 -0
- package/vendor/node-api/src/vectors/DuckDBEnum32Vector.ts +75 -0
- package/vendor/node-api/src/vectors/DuckDBEnum8Vector.ts +75 -0
- package/vendor/node-api/src/vectors/DuckDBFloatVector.ts +68 -0
- package/vendor/node-api/src/vectors/DuckDBGeometryVector.ts +97 -0
- package/vendor/node-api/src/vectors/DuckDBHugeIntVector.ts +89 -0
- package/vendor/node-api/src/vectors/DuckDBIntegerVector.ts +75 -0
- package/vendor/node-api/src/vectors/DuckDBIntervalVector.ts +100 -0
- package/vendor/node-api/src/vectors/DuckDBListVector.ts +221 -0
- package/vendor/node-api/src/vectors/DuckDBMapVector.ts +88 -0
- package/vendor/node-api/src/vectors/DuckDBSQLNullVector.ts +53 -0
- package/vendor/node-api/src/vectors/DuckDBSmallIntVector.ts +75 -0
- package/vendor/node-api/src/vectors/DuckDBStructVector.ts +138 -0
- package/vendor/node-api/src/vectors/DuckDBTimeNSVector.ts +80 -0
- package/vendor/node-api/src/vectors/DuckDBTimeTZVector.ts +80 -0
- package/vendor/node-api/src/vectors/DuckDBTimeVector.ts +80 -0
- package/vendor/node-api/src/vectors/DuckDBTimestampMillisecondsVector.ts +88 -0
- package/vendor/node-api/src/vectors/DuckDBTimestampNanosecondsVector.ts +88 -0
- package/vendor/node-api/src/vectors/DuckDBTimestampSecondsVector.ts +88 -0
- package/vendor/node-api/src/vectors/DuckDBTimestampTZNanosecondsVector.ts +88 -0
- package/vendor/node-api/src/vectors/DuckDBTimestampTZVector.ts +86 -0
- package/vendor/node-api/src/vectors/DuckDBTimestampVector.ts +83 -0
- package/vendor/node-api/src/vectors/DuckDBTinyIntVector.ts +75 -0
- package/vendor/node-api/src/vectors/DuckDBTupleVector.ts +125 -0
- package/vendor/node-api/src/vectors/DuckDBUBigIntVector.ts +75 -0
- package/vendor/node-api/src/vectors/DuckDBUHugeIntVector.ts +89 -0
- package/vendor/node-api/src/vectors/DuckDBUIntegerVector.ts +75 -0
- package/vendor/node-api/src/vectors/DuckDBUSmallIntVector.ts +75 -0
- package/vendor/node-api/src/vectors/DuckDBUTinyIntVector.ts +75 -0
- package/vendor/node-api/src/vectors/DuckDBUUIDVector.ts +89 -0
- package/vendor/node-api/src/vectors/DuckDBUnionVector.ts +84 -0
- package/vendor/node-api/src/vectors/DuckDBValidity.ts +104 -0
- package/vendor/node-api/src/vectors/DuckDBVarCharVector.ts +100 -0
- package/vendor/node-api/src/vectors/DuckDBVariantVector.ts +609 -0
- package/vendor/node-api/src/vectors/DuckDBVector.ts +33 -0
- package/vendor/node-api/src/vectors/createVector.ts +269 -0
- package/vendor/node-api/src/vectors/dataAccessors.ts +387 -0
- package/vendor/node-api/src/vectors/index.ts +50 -0
- package/vendor/node-api/src/vectors/vectorRegistry.ts +24 -0
- package/vendor/node-api/src/version.ts +5 -0
|
@@ -0,0 +1,616 @@
|
|
|
1
|
+
// Query, prepared statement, bind, pending result, extracted statement and
|
|
2
|
+
// result functions of the @duckdb/node-bindings contract. Semantics and error
|
|
3
|
+
// text follow the official binding (bindings/src/duckdb_node_bindings.cpp,
|
|
4
|
+
// promise_workers.h and conversion_helpers.h at the vendored tag).
|
|
5
|
+
import type { Pointer } from "bun:ffi";
|
|
6
|
+
import type {
|
|
7
|
+
Connection,
|
|
8
|
+
DataChunk,
|
|
9
|
+
Date_,
|
|
10
|
+
Decimal,
|
|
11
|
+
ExtractedStatements,
|
|
12
|
+
ExtractedStatementsAndCount,
|
|
13
|
+
Interval,
|
|
14
|
+
LogicalType,
|
|
15
|
+
PendingResult,
|
|
16
|
+
PendingState,
|
|
17
|
+
PreparedStatement,
|
|
18
|
+
Result,
|
|
19
|
+
ResultType,
|
|
20
|
+
StatementType,
|
|
21
|
+
Time,
|
|
22
|
+
Timestamp,
|
|
23
|
+
Type,
|
|
24
|
+
Value,
|
|
25
|
+
} from "../generated/contract.ts";
|
|
26
|
+
import {
|
|
27
|
+
checkIndexInRange,
|
|
28
|
+
checkOneBasedIndexInRange,
|
|
29
|
+
dateFromObject,
|
|
30
|
+
decimalFromObject,
|
|
31
|
+
expectBoolean,
|
|
32
|
+
expectNumber,
|
|
33
|
+
expectString,
|
|
34
|
+
hugeintFromBigInt,
|
|
35
|
+
type IntegerType,
|
|
36
|
+
int64FromBigInt,
|
|
37
|
+
integerFromNumber,
|
|
38
|
+
intervalFromObject,
|
|
39
|
+
throwIndexOutOfRange,
|
|
40
|
+
timeFromObject,
|
|
41
|
+
timestampFromObject,
|
|
42
|
+
uhugeintFromBigInt,
|
|
43
|
+
uint64FromBigInt,
|
|
44
|
+
} from "../runtime/convert.ts";
|
|
45
|
+
import { jobOut0, jobOut1, runJob } from "../runtime/dispatch.ts";
|
|
46
|
+
import { Handle, type Kind, unwrap } from "../runtime/handle.ts";
|
|
47
|
+
import { own } from "../runtime/kinds.ts";
|
|
48
|
+
import { cstr, encode, type LayoutName, readCString, slot, slotValue, takeCString, utf8 } from "../runtime/marshal.ts";
|
|
49
|
+
import { duckdb, shim } from "../runtime/native.ts";
|
|
50
|
+
import { RingOp, record } from "../runtime/ring.ts";
|
|
51
|
+
import { callContext } from "../runtime/trace.ts";
|
|
52
|
+
import { create_data_chunk } from "./data-chunk.ts";
|
|
53
|
+
|
|
54
|
+
/** The duckdb_type value DuckDB returns for an out-of-range column. */
|
|
55
|
+
const DUCKDB_TYPE_INVALID = 0;
|
|
56
|
+
|
|
57
|
+
function asHandle<T>(handle: Handle): T {
|
|
58
|
+
return handle as unknown as T;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** The pointer and the handle behind a contract value, for a job that must hold the handle. */
|
|
62
|
+
function claim(value: unknown, kind: Kind): { ptr: Pointer | null; handle: Handle } {
|
|
63
|
+
const ptr = unwrap(value, kind);
|
|
64
|
+
return { ptr, handle: value as Handle };
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/** The handle behind `value` without the destroyed check, for the idempotent `*_sync` destroys. */
|
|
68
|
+
function handleForDestroy(value: unknown, kind: Kind): Handle {
|
|
69
|
+
if (!(value instanceof Handle) || value.kind !== kind) throw new Error(`Invalid ${kind} argument`);
|
|
70
|
+
return value;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/** node-addon-api's Number::Uint32Value: the value modulo 2^32, as an index the C API takes. */
|
|
74
|
+
function u32(value: unknown): number {
|
|
75
|
+
return expectNumber(value) >>> 0;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function resultFrom(job: Pointer): Result {
|
|
79
|
+
return asHandle(own("result", jobOut0(job) as Pointer));
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function preparedFrom(job: Pointer): PreparedStatement {
|
|
83
|
+
return asHandle(own("prepared statement", jobOut0(job) as Pointer));
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// --- query ----------------------------------------------------------------------------
|
|
87
|
+
|
|
88
|
+
// The official binding's async workers read their string and number arguments
|
|
89
|
+
// before their handles, so these check them first too.
|
|
90
|
+
|
|
91
|
+
export function query(connection: Connection, sql: string): Promise<Result> {
|
|
92
|
+
const { bytes, length } = utf8(expectString(sql));
|
|
93
|
+
const { ptr, handle } = claim(connection, "connection");
|
|
94
|
+
return runJob(
|
|
95
|
+
callContext("query", sql),
|
|
96
|
+
[handle],
|
|
97
|
+
() => shim.dbs_job_query(ptr, bytes, length) as Pointer | null,
|
|
98
|
+
resultFrom,
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// --- prepared statements ----------------------------------------------------------------
|
|
103
|
+
|
|
104
|
+
export function prepare(connection: Connection, sql: string): Promise<PreparedStatement> {
|
|
105
|
+
const { bytes, length } = utf8(expectString(sql));
|
|
106
|
+
const { ptr, handle } = claim(connection, "connection");
|
|
107
|
+
return runJob(
|
|
108
|
+
callContext("prepare", sql),
|
|
109
|
+
[handle],
|
|
110
|
+
() => shim.dbs_job_prepare(ptr, bytes, length) as Pointer | null,
|
|
111
|
+
preparedFrom,
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export function destroy_prepare_sync(prepared_statement: PreparedStatement): void {
|
|
116
|
+
const handle = handleForDestroy(prepared_statement, "prepared statement");
|
|
117
|
+
record(RingOp.destroyPrepared, handle.ptr);
|
|
118
|
+
handle.requestDestroy();
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export function nparams(prepared_statement: PreparedStatement): number {
|
|
122
|
+
return Number(duckdb.duckdb_nparams(unwrap(prepared_statement, "prepared statement")));
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
export function parameter_name(prepared_statement: PreparedStatement, index: number): string {
|
|
126
|
+
const ptr = unwrap(prepared_statement, "prepared statement");
|
|
127
|
+
const i = u32(index);
|
|
128
|
+
const name = takeCString(duckdb.duckdb_parameter_name(ptr, i) as Pointer | null);
|
|
129
|
+
if (name === null) throwIndexOutOfRange(i, Number(duckdb.duckdb_nparams(ptr)), "parameter");
|
|
130
|
+
return name;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
export function param_type(prepared_statement: PreparedStatement, index: number): Type {
|
|
134
|
+
const ptr = unwrap(prepared_statement, "prepared statement");
|
|
135
|
+
const i = u32(index);
|
|
136
|
+
checkOneBasedIndexInRange(i, Number(duckdb.duckdb_nparams(ptr)), "parameter");
|
|
137
|
+
return duckdb.duckdb_param_type(ptr, i) as Type;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
export function param_logical_type(prepared_statement: PreparedStatement, index: number): LogicalType {
|
|
141
|
+
const type = duckdb.duckdb_param_logical_type(
|
|
142
|
+
unwrap(prepared_statement, "prepared statement"),
|
|
143
|
+
u32(index),
|
|
144
|
+
) as Pointer | null;
|
|
145
|
+
if (type === null) throw new Error("Failed to get param logical type");
|
|
146
|
+
return asHandle(own("logical type", type));
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
export function clear_bindings(prepared_statement: PreparedStatement): void {
|
|
150
|
+
if (duckdb.duckdb_clear_bindings(unwrap(prepared_statement, "prepared statement"))) {
|
|
151
|
+
throw new Error("Failed to clear bindings");
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
export function prepared_statement_type(prepared_statement: PreparedStatement): StatementType {
|
|
156
|
+
return duckdb.duckdb_prepared_statement_type(unwrap(prepared_statement, "prepared statement")) as StatementType;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
export function prepared_statement_column_count(prepared_statement: PreparedStatement): number {
|
|
160
|
+
return Number(duckdb.duckdb_prepared_statement_column_count(unwrap(prepared_statement, "prepared statement")));
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
export function prepared_statement_column_name(prepared_statement: PreparedStatement, index: number): string {
|
|
164
|
+
const name = takeCString(
|
|
165
|
+
duckdb.duckdb_prepared_statement_column_name(
|
|
166
|
+
unwrap(prepared_statement, "prepared statement"),
|
|
167
|
+
u32(index),
|
|
168
|
+
) as Pointer | null,
|
|
169
|
+
);
|
|
170
|
+
if (name === null) throw new Error("Failed to get prepared statement column name");
|
|
171
|
+
return name;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
export function prepared_statement_column_logical_type(
|
|
175
|
+
prepared_statement: PreparedStatement,
|
|
176
|
+
index: number,
|
|
177
|
+
): LogicalType {
|
|
178
|
+
const type = duckdb.duckdb_prepared_statement_column_logical_type(
|
|
179
|
+
unwrap(prepared_statement, "prepared statement"),
|
|
180
|
+
u32(index),
|
|
181
|
+
) as Pointer | null;
|
|
182
|
+
if (type === null) throw new Error("Failed to get prepared statement column logical type");
|
|
183
|
+
return asHandle(own("logical type", type));
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
export function prepared_statement_column_type(prepared_statement: PreparedStatement, index: number): Type {
|
|
187
|
+
const ptr = unwrap(prepared_statement, "prepared statement");
|
|
188
|
+
const i = u32(index);
|
|
189
|
+
checkIndexInRange(i, Number(duckdb.duckdb_prepared_statement_column_count(ptr)), "column");
|
|
190
|
+
return duckdb.duckdb_prepared_statement_column_type(ptr, i) as Type;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// --- bind -------------------------------------------------------------------------------
|
|
194
|
+
|
|
195
|
+
/** ThrowBindError: "Failed to bind <type>", plus DuckDB's prepare error when it has one. */
|
|
196
|
+
function bindOrThrow(ptr: Pointer | null, typeName: string, failed: number): void {
|
|
197
|
+
if (!failed) return;
|
|
198
|
+
const error = readCString(duckdb.duckdb_prepare_error(ptr) as Pointer | null);
|
|
199
|
+
throw new Error(error === null ? `Failed to bind ${typeName}` : `Failed to bind ${typeName}: ${error}`);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Binds a struct the C API takes by value, through the shim's by-pointer wrapper.
|
|
204
|
+
* `value` converts the argument only after the statement and the index are
|
|
205
|
+
* checked, so those are reported first, as the official binding reads its
|
|
206
|
+
* arguments in order.
|
|
207
|
+
*/
|
|
208
|
+
function bindStruct(
|
|
209
|
+
prepared_statement: PreparedStatement,
|
|
210
|
+
index: number,
|
|
211
|
+
typeName: string,
|
|
212
|
+
layout: LayoutName,
|
|
213
|
+
value: () => unknown,
|
|
214
|
+
bind: (ptr: Pointer | null, index: number, value: Uint8Array) => number,
|
|
215
|
+
): void {
|
|
216
|
+
const ptr = unwrap(prepared_statement, "prepared statement");
|
|
217
|
+
const i = u32(index);
|
|
218
|
+
bindOrThrow(ptr, typeName, bind(ptr, i, encode(layout, value())));
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
function bindInteger(
|
|
222
|
+
prepared_statement: PreparedStatement,
|
|
223
|
+
index: number,
|
|
224
|
+
type: IntegerType,
|
|
225
|
+
value: unknown,
|
|
226
|
+
bind: (ptr: Pointer | null, index: number, value: number) => number,
|
|
227
|
+
): void {
|
|
228
|
+
const ptr = unwrap(prepared_statement, "prepared statement");
|
|
229
|
+
const i = u32(index);
|
|
230
|
+
bindOrThrow(ptr, type, bind(ptr, i, integerFromNumber(value, type)));
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
export function bind_value(prepared_statement: PreparedStatement, index: number, value: Value): void {
|
|
234
|
+
const ptr = unwrap(prepared_statement, "prepared statement");
|
|
235
|
+
const i = u32(index);
|
|
236
|
+
bindOrThrow(ptr, "value", duckdb.duckdb_bind_value(ptr, i, unwrap(value, "value")));
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
export function bind_parameter_index(prepared_statement: PreparedStatement, name: string): number {
|
|
240
|
+
const out = slot();
|
|
241
|
+
if (
|
|
242
|
+
duckdb.duckdb_bind_parameter_index(unwrap(prepared_statement, "prepared statement"), out, cstr(expectString(name)))
|
|
243
|
+
) {
|
|
244
|
+
throw new Error("Failed to retrieve bind parameter index");
|
|
245
|
+
}
|
|
246
|
+
return Number(out[0]);
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
export function bind_boolean(prepared_statement: PreparedStatement, index: number, bool: boolean): void {
|
|
250
|
+
const ptr = unwrap(prepared_statement, "prepared statement");
|
|
251
|
+
const i = u32(index);
|
|
252
|
+
bindOrThrow(ptr, "boolean", duckdb.duckdb_bind_boolean(ptr, i, expectBoolean(bool)));
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
export function bind_int8(prepared_statement: PreparedStatement, index: number, int8: number): void {
|
|
256
|
+
bindInteger(prepared_statement, index, "int8", int8, (p, i, v) => duckdb.duckdb_bind_int8(p, i, v));
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
export function bind_int16(prepared_statement: PreparedStatement, index: number, int16: number): void {
|
|
260
|
+
bindInteger(prepared_statement, index, "int16", int16, (p, i, v) => duckdb.duckdb_bind_int16(p, i, v));
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
export function bind_int32(prepared_statement: PreparedStatement, index: number, int32: number): void {
|
|
264
|
+
bindInteger(prepared_statement, index, "int32", int32, (p, i, v) => duckdb.duckdb_bind_int32(p, i, v));
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
export function bind_int64(prepared_statement: PreparedStatement, index: number, int64: bigint): void {
|
|
268
|
+
const ptr = unwrap(prepared_statement, "prepared statement");
|
|
269
|
+
const i = u32(index);
|
|
270
|
+
const value = int64FromBigInt(int64, "bigint");
|
|
271
|
+
bindOrThrow(ptr, "int64", duckdb.duckdb_bind_int64(ptr, i, value));
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
export function bind_hugeint(prepared_statement: PreparedStatement, index: number, hugeint: bigint): void {
|
|
275
|
+
bindStruct(
|
|
276
|
+
prepared_statement,
|
|
277
|
+
index,
|
|
278
|
+
"hugeint",
|
|
279
|
+
"hugeint",
|
|
280
|
+
() => hugeintFromBigInt(hugeint),
|
|
281
|
+
(p, i, v) => shim.dbs_bind_hugeint(p, i, v),
|
|
282
|
+
);
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
export function bind_uhugeint(prepared_statement: PreparedStatement, index: number, uhugeint: bigint): void {
|
|
286
|
+
bindStruct(
|
|
287
|
+
prepared_statement,
|
|
288
|
+
index,
|
|
289
|
+
"uhugeint",
|
|
290
|
+
"uhugeint",
|
|
291
|
+
() => uhugeintFromBigInt(uhugeint),
|
|
292
|
+
(p, i, v) => shim.dbs_bind_uhugeint(p, i, v),
|
|
293
|
+
);
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
export function bind_decimal(prepared_statement: PreparedStatement, index: number, decimal: Decimal): void {
|
|
297
|
+
bindStruct(
|
|
298
|
+
prepared_statement,
|
|
299
|
+
index,
|
|
300
|
+
"decimal",
|
|
301
|
+
"decimal",
|
|
302
|
+
() => decimalFromObject(decimal),
|
|
303
|
+
(p, i, v) => shim.dbs_bind_decimal(p, i, v),
|
|
304
|
+
);
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
export function bind_uint8(prepared_statement: PreparedStatement, index: number, uint8: number): void {
|
|
308
|
+
bindInteger(prepared_statement, index, "uint8", uint8, (p, i, v) => duckdb.duckdb_bind_uint8(p, i, v));
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
export function bind_uint16(prepared_statement: PreparedStatement, index: number, uint16: number): void {
|
|
312
|
+
bindInteger(prepared_statement, index, "uint16", uint16, (p, i, v) => duckdb.duckdb_bind_uint16(p, i, v));
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
export function bind_uint32(prepared_statement: PreparedStatement, index: number, uint32: number): void {
|
|
316
|
+
bindInteger(prepared_statement, index, "uint32", uint32, (p, i, v) => duckdb.duckdb_bind_uint32(p, i, v));
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
export function bind_uint64(prepared_statement: PreparedStatement, index: number, uint64: bigint): void {
|
|
320
|
+
const ptr = unwrap(prepared_statement, "prepared statement");
|
|
321
|
+
const i = u32(index);
|
|
322
|
+
const value = uint64FromBigInt(uint64, "bigint");
|
|
323
|
+
bindOrThrow(ptr, "uint64", duckdb.duckdb_bind_uint64(ptr, i, value));
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
export function bind_float(prepared_statement: PreparedStatement, index: number, float: number): void {
|
|
327
|
+
const ptr = unwrap(prepared_statement, "prepared statement");
|
|
328
|
+
const i = u32(index);
|
|
329
|
+
bindOrThrow(ptr, "float", duckdb.duckdb_bind_float(ptr, i, expectNumber(float)));
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
export function bind_double(prepared_statement: PreparedStatement, index: number, double: number): void {
|
|
333
|
+
const ptr = unwrap(prepared_statement, "prepared statement");
|
|
334
|
+
const i = u32(index);
|
|
335
|
+
bindOrThrow(ptr, "double", duckdb.duckdb_bind_double(ptr, i, expectNumber(double)));
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
export function bind_date(prepared_statement: PreparedStatement, index: number, date: Date_): void {
|
|
339
|
+
bindStruct(
|
|
340
|
+
prepared_statement,
|
|
341
|
+
index,
|
|
342
|
+
"date",
|
|
343
|
+
"date",
|
|
344
|
+
() => dateFromObject(date),
|
|
345
|
+
(p, i, v) => shim.dbs_bind_date(p, i, v),
|
|
346
|
+
);
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
export function bind_time(prepared_statement: PreparedStatement, index: number, time: Time): void {
|
|
350
|
+
bindStruct(
|
|
351
|
+
prepared_statement,
|
|
352
|
+
index,
|
|
353
|
+
"time",
|
|
354
|
+
"time",
|
|
355
|
+
() => timeFromObject(time),
|
|
356
|
+
(p, i, v) => shim.dbs_bind_time(p, i, v),
|
|
357
|
+
);
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
export function bind_timestamp(prepared_statement: PreparedStatement, index: number, timestamp: Timestamp): void {
|
|
361
|
+
bindStruct(
|
|
362
|
+
prepared_statement,
|
|
363
|
+
index,
|
|
364
|
+
"timestamp",
|
|
365
|
+
"timestamp",
|
|
366
|
+
() => timestampFromObject(timestamp),
|
|
367
|
+
(p, i, v) => shim.dbs_bind_timestamp(p, i, v),
|
|
368
|
+
);
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
export function bind_timestamp_tz(prepared_statement: PreparedStatement, index: number, timestamp: Timestamp): void {
|
|
372
|
+
bindStruct(
|
|
373
|
+
prepared_statement,
|
|
374
|
+
index,
|
|
375
|
+
"timestamp_tz",
|
|
376
|
+
"timestamp",
|
|
377
|
+
() => timestampFromObject(timestamp),
|
|
378
|
+
(p, i, v) => shim.dbs_bind_timestamp_tz(p, i, v),
|
|
379
|
+
);
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
export function bind_interval(prepared_statement: PreparedStatement, index: number, interval: Interval): void {
|
|
383
|
+
bindStruct(
|
|
384
|
+
prepared_statement,
|
|
385
|
+
index,
|
|
386
|
+
"interval",
|
|
387
|
+
"interval",
|
|
388
|
+
() => intervalFromObject(interval),
|
|
389
|
+
(p, i, v) => shim.dbs_bind_interval(p, i, v),
|
|
390
|
+
);
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
export function bind_varchar(prepared_statement: PreparedStatement, index: number, varchar: string): void {
|
|
394
|
+
const ptr = unwrap(prepared_statement, "prepared statement");
|
|
395
|
+
const i = u32(index);
|
|
396
|
+
const { bytes, length } = utf8(expectString(varchar));
|
|
397
|
+
bindOrThrow(ptr, "varchar", duckdb.duckdb_bind_varchar_length(ptr, i, bytes, length));
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
export function bind_blob(prepared_statement: PreparedStatement, index: number, data: Uint8Array): void {
|
|
401
|
+
const ptr = unwrap(prepared_statement, "prepared statement");
|
|
402
|
+
const i = u32(index);
|
|
403
|
+
// A zero-length view still needs a valid address; DuckDB reads none of it.
|
|
404
|
+
const bytes = data.byteLength === 0 ? new Uint8Array(1) : data;
|
|
405
|
+
bindOrThrow(ptr, "blob", duckdb.duckdb_bind_blob(ptr, i, bytes, data.byteLength));
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
export function bind_null(prepared_statement: PreparedStatement, index: number): void {
|
|
409
|
+
const ptr = unwrap(prepared_statement, "prepared statement");
|
|
410
|
+
const i = u32(index);
|
|
411
|
+
bindOrThrow(ptr, "null", duckdb.duckdb_bind_null(ptr, i));
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
// --- execute ----------------------------------------------------------------------------
|
|
415
|
+
|
|
416
|
+
export function execute_prepared(prepared_statement: PreparedStatement): Promise<Result> {
|
|
417
|
+
const { ptr, handle } = claim(prepared_statement, "prepared statement");
|
|
418
|
+
return runJob(
|
|
419
|
+
callContext("execute_prepared"),
|
|
420
|
+
[handle],
|
|
421
|
+
() => shim.dbs_job_execute_prepared(ptr) as Pointer | null,
|
|
422
|
+
resultFrom,
|
|
423
|
+
);
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
export function execute_prepared_streaming(prepared_statement: PreparedStatement): Promise<Result> {
|
|
427
|
+
const { ptr, handle } = claim(prepared_statement, "prepared statement");
|
|
428
|
+
return runJob(
|
|
429
|
+
callContext("execute_prepared_streaming"),
|
|
430
|
+
[handle],
|
|
431
|
+
() => shim.dbs_job_execute_prepared_streaming(ptr) as Pointer | null,
|
|
432
|
+
resultFrom,
|
|
433
|
+
);
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
// --- pending results ----------------------------------------------------------------------
|
|
437
|
+
|
|
438
|
+
function pendingFrom(
|
|
439
|
+
prepared_statement: PreparedStatement,
|
|
440
|
+
start: (ptr: Pointer | null, out: BigUint64Array) => number,
|
|
441
|
+
): PendingResult {
|
|
442
|
+
const out = slot();
|
|
443
|
+
if (start(unwrap(prepared_statement, "prepared statement"), out)) {
|
|
444
|
+
const pending = slotValue(out);
|
|
445
|
+
const error = readCString(duckdb.duckdb_pending_error(pending) as Pointer | null);
|
|
446
|
+
duckdb.duckdb_destroy_pending(out);
|
|
447
|
+
throw new Error(error ?? "Failed to create pending result");
|
|
448
|
+
}
|
|
449
|
+
return asHandle(own("pending result", slotValue(out) as Pointer));
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
export function pending_prepared(prepared_statement: PreparedStatement): PendingResult {
|
|
453
|
+
return pendingFrom(prepared_statement, (p, out) => duckdb.duckdb_pending_prepared(p, out));
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
export function pending_prepared_streaming(prepared_statement: PreparedStatement): PendingResult {
|
|
457
|
+
return pendingFrom(prepared_statement, (p, out) => duckdb.duckdb_pending_prepared_streaming(p, out));
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
export function destroy_pending_sync(pending_result: PendingResult): void {
|
|
461
|
+
const handle = handleForDestroy(pending_result, "pending result");
|
|
462
|
+
record(RingOp.destroyPending, handle.ptr);
|
|
463
|
+
handle.requestDestroy();
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
export function pending_error(pending_result: PendingResult): string {
|
|
467
|
+
return readCString(duckdb.duckdb_pending_error(unwrap(pending_result, "pending result")) as Pointer | null) ?? "";
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
export function pending_execute_task(pending_result: PendingResult): PendingState {
|
|
471
|
+
const ptr = unwrap(pending_result, "pending result");
|
|
472
|
+
record(RingOp.pendingExecuteTask, ptr);
|
|
473
|
+
return duckdb.duckdb_pending_execute_task(ptr) as PendingState;
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
export function pending_execute_check_state(pending_result: PendingResult): PendingState {
|
|
477
|
+
return duckdb.duckdb_pending_execute_check_state(unwrap(pending_result, "pending result")) as PendingState;
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
export function execute_pending(pending_result: PendingResult): Promise<Result> {
|
|
481
|
+
const { ptr, handle } = claim(pending_result, "pending result");
|
|
482
|
+
return runJob(
|
|
483
|
+
callContext("execute_pending"),
|
|
484
|
+
[handle],
|
|
485
|
+
() => shim.dbs_job_execute_pending(ptr) as Pointer | null,
|
|
486
|
+
resultFrom,
|
|
487
|
+
);
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
export function pending_execution_is_finished(pending_state: PendingState): boolean {
|
|
491
|
+
return duckdb.duckdb_pending_execution_is_finished(u32(pending_state));
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
// --- extracted statements -------------------------------------------------------------------
|
|
495
|
+
|
|
496
|
+
export function extract_statements(connection: Connection, sql: string): Promise<ExtractedStatementsAndCount> {
|
|
497
|
+
const { bytes, length } = utf8(expectString(sql));
|
|
498
|
+
const { ptr, handle } = claim(connection, "connection");
|
|
499
|
+
return runJob(
|
|
500
|
+
callContext("extract_statements", sql),
|
|
501
|
+
[handle],
|
|
502
|
+
() => shim.dbs_job_extract_statements(ptr, bytes, length) as Pointer | null,
|
|
503
|
+
(job) => ({
|
|
504
|
+
extracted_statements: asHandle<ExtractedStatements>(own("extracted statements", jobOut0(job) as Pointer)),
|
|
505
|
+
statement_count: jobOut1(job),
|
|
506
|
+
}),
|
|
507
|
+
);
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
export function prepare_extracted_statement(
|
|
511
|
+
connection: Connection,
|
|
512
|
+
extracted_statements: ExtractedStatements,
|
|
513
|
+
index: number,
|
|
514
|
+
): Promise<PreparedStatement> {
|
|
515
|
+
const i = u32(index);
|
|
516
|
+
const { ptr, handle } = claim(connection, "connection");
|
|
517
|
+
const extracted = claim(extracted_statements, "extracted statements");
|
|
518
|
+
return runJob(
|
|
519
|
+
callContext("prepare_extracted_statement"),
|
|
520
|
+
[handle, extracted.handle],
|
|
521
|
+
() => shim.dbs_job_prepare_extracted_statement(ptr, extracted.ptr, i) as Pointer | null,
|
|
522
|
+
preparedFrom,
|
|
523
|
+
);
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
export function extract_statements_error(extracted_statements: ExtractedStatements): string {
|
|
527
|
+
const ptr = unwrap(extracted_statements, "extracted statements");
|
|
528
|
+
return readCString(duckdb.duckdb_extract_statements_error(ptr) as Pointer | null) ?? "";
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
// --- results ------------------------------------------------------------------------------
|
|
532
|
+
|
|
533
|
+
export function destroy_result_sync(result: Result): void {
|
|
534
|
+
const handle = handleForDestroy(result, "result");
|
|
535
|
+
// A no-op if already destroyed; deferred while fetch_chunk is in flight.
|
|
536
|
+
if (handle.destroyRequested) return;
|
|
537
|
+
record(RingOp.destroyResult, handle.ptr);
|
|
538
|
+
handle.requestDestroy();
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
function columnCount(ptr: Pointer | null): number {
|
|
542
|
+
return Number(duckdb.duckdb_column_count(ptr));
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
export function column_name(result: Result, column_index: number): string {
|
|
546
|
+
const ptr = unwrap(result, "result");
|
|
547
|
+
const i = u32(column_index);
|
|
548
|
+
const name = readCString(duckdb.duckdb_column_name(ptr, i) as Pointer | null);
|
|
549
|
+
if (name === null) throwIndexOutOfRange(i, columnCount(ptr), "column");
|
|
550
|
+
return name;
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
export function column_type(result: Result, column_index: number): Type {
|
|
554
|
+
const ptr = unwrap(result, "result");
|
|
555
|
+
const i = u32(column_index);
|
|
556
|
+
const type = duckdb.duckdb_column_type(ptr, i);
|
|
557
|
+
if (type === DUCKDB_TYPE_INVALID) throwIndexOutOfRange(i, columnCount(ptr), "column");
|
|
558
|
+
return type as Type;
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
export function result_statement_type(result: Result): StatementType {
|
|
562
|
+
return shim.dbs_result_statement_type(unwrap(result, "result")) as StatementType;
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
export function column_logical_type(result: Result, column_index: number): LogicalType {
|
|
566
|
+
const ptr = unwrap(result, "result");
|
|
567
|
+
const i = u32(column_index);
|
|
568
|
+
const type = duckdb.duckdb_column_logical_type(ptr, i) as Pointer | null;
|
|
569
|
+
if (type === null) throwIndexOutOfRange(i, columnCount(ptr), "column");
|
|
570
|
+
return asHandle(own("logical type", type));
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
export function column_count(result: Result): number {
|
|
574
|
+
return columnCount(unwrap(result, "result"));
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
export function rows_changed(result: Result): number {
|
|
578
|
+
return Number(duckdb.duckdb_rows_changed(unwrap(result, "result")));
|
|
579
|
+
}
|
|
580
|
+
|
|
581
|
+
export function result_return_type(result: Result): ResultType {
|
|
582
|
+
return shim.dbs_result_return_type(unwrap(result, "result")) as ResultType;
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
export function fetch_chunk(result: Result): Promise<DataChunk | null> {
|
|
586
|
+
const { ptr, handle } = claim(result, "result");
|
|
587
|
+
return runJob(
|
|
588
|
+
callContext("fetch_chunk"),
|
|
589
|
+
[handle],
|
|
590
|
+
() => shim.dbs_job_fetch_chunk(ptr) as Pointer | null,
|
|
591
|
+
(job) => {
|
|
592
|
+
const chunk = jobOut0(job);
|
|
593
|
+
// Past the end, duckdb_fetch_chunk returns null and the official binding
|
|
594
|
+
// resolves to a chunk with no columns and no rows, never to null.
|
|
595
|
+
return chunk === null ? create_data_chunk([]) : asHandle<DataChunk>(own("data chunk", chunk));
|
|
596
|
+
},
|
|
597
|
+
);
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
export function row_count(result: Result): number {
|
|
601
|
+
return Number(duckdb.duckdb_row_count(unwrap(result, "result")));
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
export function result_get_chunk(result: Result, chunkIndex: number): DataChunk {
|
|
605
|
+
const chunk = shim.dbs_result_get_chunk(unwrap(result, "result"), u32(chunkIndex)) as Pointer | null;
|
|
606
|
+
if (chunk === null) throw new Error("Failed to get data chunk. Only supported for materialized results.");
|
|
607
|
+
return asHandle(own("data chunk", chunk));
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
export function result_is_streaming(result: Result): boolean {
|
|
611
|
+
return shim.dbs_result_is_streaming(unwrap(result, "result"));
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
export function result_chunk_count(result: Result): number {
|
|
615
|
+
return Number(shim.dbs_result_chunk_count(unwrap(result, "result")));
|
|
616
|
+
}
|