duckdb 0.8.2-dev2850.0 → 0.8.2-dev3007.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.
- package/binding.gyp +1 -0
- package/package.json +1 -1
- package/src/duckdb/src/common/adbc/adbc.cpp +400 -145
- package/src/duckdb/src/common/adbc/driver_manager.cpp +79 -31
- package/src/duckdb/src/common/adbc/nanoarrow/allocator.cpp +57 -0
- package/src/duckdb/src/common/adbc/nanoarrow/metadata.cpp +121 -0
- package/src/duckdb/src/common/adbc/nanoarrow/schema.cpp +474 -0
- package/src/duckdb/src/common/adbc/nanoarrow/single_batch_array_stream.cpp +84 -0
- package/src/duckdb/src/common/arrow/arrow_converter.cpp +4 -2
- package/src/duckdb/src/common/multi_file_reader.cpp +6 -0
- package/src/duckdb/src/execution/window_executor.cpp +5 -8
- package/src/duckdb/src/function/table/version/pragma_version.cpp +2 -2
- package/src/duckdb/src/include/duckdb/common/adbc/adbc.h +1 -0
- package/src/duckdb/src/include/duckdb/common/adbc/adbc.hpp +3 -3
- package/src/duckdb/src/include/duckdb/common/adbc/single_batch_array_stream.hpp +16 -0
- package/src/duckdb/src/include/duckdb/common/arrow/arrow_appender.hpp +1 -2
- package/src/duckdb/src/include/duckdb/common/arrow/arrow_converter.hpp +0 -2
- package/src/duckdb/src/include/duckdb/common/arrow/nanoarrow/nanoarrow.h +462 -0
- package/src/duckdb/src/include/duckdb/common/arrow/nanoarrow/nanoarrow.hpp +14 -0
- package/src/duckdb/src/include/duckdb/common/types/data_chunk.hpp +0 -2
- package/src/duckdb/src/include/duckdb/main/chunk_scan_state.hpp +2 -4
- package/src/duckdb/src/include/duckdb.h +16 -0
- package/src/duckdb/src/main/capi/arrow-c.cpp +41 -0
- package/src/duckdb/src/main/capi/prepared-c.cpp +60 -30
- package/src/duckdb/src/main/chunk_scan_state.cpp +6 -0
- package/src/duckdb/src/main/client_context.cpp +1 -1
- package/src/duckdb/src/optimizer/topn_optimizer.cpp +7 -0
- package/src/duckdb/src/storage/compression/bitpacking.cpp +1 -1
- package/src/duckdb/ub_src_common_adbc_nanoarrow.cpp +8 -0
- package/src/duckdb_node.hpp +1 -0
- package/src/statement.cpp +1 -1
@@ -139,52 +139,65 @@ duckdb_state duckdb_clear_bindings(duckdb_prepared_statement prepared_statement)
|
|
139
139
|
return DuckDBSuccess;
|
140
140
|
}
|
141
141
|
|
142
|
-
|
142
|
+
duckdb_state duckdb_bind_value(duckdb_prepared_statement prepared_statement, idx_t param_idx, duckdb_value val) {
|
143
|
+
auto value = reinterpret_cast<Value *>(val);
|
143
144
|
auto wrapper = reinterpret_cast<PreparedStatementWrapper *>(prepared_statement);
|
144
145
|
if (!wrapper || !wrapper->statement || wrapper->statement->HasError()) {
|
145
146
|
return DuckDBError;
|
146
147
|
}
|
147
148
|
if (param_idx <= 0 || param_idx > wrapper->statement->n_param) {
|
149
|
+
wrapper->statement->error =
|
150
|
+
duckdb::InvalidInputException("Can not bind to parameter number %d, statement only has %d parameter(s)",
|
151
|
+
param_idx, wrapper->statement->n_param);
|
148
152
|
return DuckDBError;
|
149
153
|
}
|
150
154
|
auto identifier = duckdb_parameter_name_internal(prepared_statement, param_idx);
|
151
|
-
wrapper->values[identifier] =
|
155
|
+
wrapper->values[identifier] = *value;
|
152
156
|
return DuckDBSuccess;
|
153
157
|
}
|
154
158
|
|
155
159
|
duckdb_state duckdb_bind_parameter_index(duckdb_prepared_statement prepared_statement, idx_t *param_idx_out,
|
156
|
-
const char *
|
160
|
+
const char *name_p) {
|
157
161
|
auto wrapper = (PreparedStatementWrapper *)prepared_statement;
|
158
162
|
if (!wrapper || !wrapper->statement || wrapper->statement->HasError()) {
|
159
163
|
return DuckDBError;
|
160
164
|
}
|
161
|
-
|
162
|
-
auto entry = statement->named_param_map.find(name);
|
163
|
-
if (entry == statement->named_param_map.end()) {
|
165
|
+
if (!name_p || !param_idx_out) {
|
164
166
|
return DuckDBError;
|
165
167
|
}
|
166
|
-
|
167
|
-
|
168
|
+
auto name = std::string(name_p);
|
169
|
+
for (auto &pair : wrapper->statement->named_param_map) {
|
170
|
+
if (duckdb::StringUtil::CIEquals(pair.first, name)) {
|
171
|
+
*param_idx_out = pair.second;
|
172
|
+
return DuckDBSuccess;
|
173
|
+
}
|
174
|
+
}
|
175
|
+
return DuckDBError;
|
168
176
|
}
|
169
177
|
|
170
178
|
duckdb_state duckdb_bind_boolean(duckdb_prepared_statement prepared_statement, idx_t param_idx, bool val) {
|
171
|
-
|
179
|
+
auto value = Value::BOOLEAN(val);
|
180
|
+
return duckdb_bind_value(prepared_statement, param_idx, (duckdb_value)&value);
|
172
181
|
}
|
173
182
|
|
174
183
|
duckdb_state duckdb_bind_int8(duckdb_prepared_statement prepared_statement, idx_t param_idx, int8_t val) {
|
175
|
-
|
184
|
+
auto value = Value::TINYINT(val);
|
185
|
+
return duckdb_bind_value(prepared_statement, param_idx, (duckdb_value)&value);
|
176
186
|
}
|
177
187
|
|
178
188
|
duckdb_state duckdb_bind_int16(duckdb_prepared_statement prepared_statement, idx_t param_idx, int16_t val) {
|
179
|
-
|
189
|
+
auto value = Value::SMALLINT(val);
|
190
|
+
return duckdb_bind_value(prepared_statement, param_idx, (duckdb_value)&value);
|
180
191
|
}
|
181
192
|
|
182
193
|
duckdb_state duckdb_bind_int32(duckdb_prepared_statement prepared_statement, idx_t param_idx, int32_t val) {
|
183
|
-
|
194
|
+
auto value = Value::INTEGER(val);
|
195
|
+
return duckdb_bind_value(prepared_statement, param_idx, (duckdb_value)&value);
|
184
196
|
}
|
185
197
|
|
186
198
|
duckdb_state duckdb_bind_int64(duckdb_prepared_statement prepared_statement, idx_t param_idx, int64_t val) {
|
187
|
-
|
199
|
+
auto value = Value::BIGINT(val);
|
200
|
+
return duckdb_bind_value(prepared_statement, param_idx, (duckdb_value)&value);
|
188
201
|
}
|
189
202
|
|
190
203
|
static hugeint_t duckdb_internal_hugeint(duckdb_hugeint val) {
|
@@ -195,53 +208,65 @@ static hugeint_t duckdb_internal_hugeint(duckdb_hugeint val) {
|
|
195
208
|
}
|
196
209
|
|
197
210
|
duckdb_state duckdb_bind_hugeint(duckdb_prepared_statement prepared_statement, idx_t param_idx, duckdb_hugeint val) {
|
198
|
-
|
211
|
+
auto value = Value::HUGEINT(duckdb_internal_hugeint(val));
|
212
|
+
return duckdb_bind_value(prepared_statement, param_idx, (duckdb_value)&value);
|
199
213
|
}
|
200
214
|
|
201
215
|
duckdb_state duckdb_bind_uint8(duckdb_prepared_statement prepared_statement, idx_t param_idx, uint8_t val) {
|
202
|
-
|
216
|
+
auto value = Value::UTINYINT(val);
|
217
|
+
return duckdb_bind_value(prepared_statement, param_idx, (duckdb_value)&value);
|
203
218
|
}
|
204
219
|
|
205
220
|
duckdb_state duckdb_bind_uint16(duckdb_prepared_statement prepared_statement, idx_t param_idx, uint16_t val) {
|
206
|
-
|
221
|
+
auto value = Value::USMALLINT(val);
|
222
|
+
return duckdb_bind_value(prepared_statement, param_idx, (duckdb_value)&value);
|
207
223
|
}
|
208
224
|
|
209
225
|
duckdb_state duckdb_bind_uint32(duckdb_prepared_statement prepared_statement, idx_t param_idx, uint32_t val) {
|
210
|
-
|
226
|
+
auto value = Value::UINTEGER(val);
|
227
|
+
return duckdb_bind_value(prepared_statement, param_idx, (duckdb_value)&value);
|
211
228
|
}
|
212
229
|
|
213
230
|
duckdb_state duckdb_bind_uint64(duckdb_prepared_statement prepared_statement, idx_t param_idx, uint64_t val) {
|
214
|
-
|
231
|
+
auto value = Value::UBIGINT(val);
|
232
|
+
return duckdb_bind_value(prepared_statement, param_idx, (duckdb_value)&value);
|
215
233
|
}
|
216
234
|
|
217
235
|
duckdb_state duckdb_bind_float(duckdb_prepared_statement prepared_statement, idx_t param_idx, float val) {
|
218
|
-
|
236
|
+
auto value = Value::FLOAT(val);
|
237
|
+
return duckdb_bind_value(prepared_statement, param_idx, (duckdb_value)&value);
|
219
238
|
}
|
220
239
|
|
221
240
|
duckdb_state duckdb_bind_double(duckdb_prepared_statement prepared_statement, idx_t param_idx, double val) {
|
222
|
-
|
241
|
+
auto value = Value::DOUBLE(val);
|
242
|
+
return duckdb_bind_value(prepared_statement, param_idx, (duckdb_value)&value);
|
223
243
|
}
|
224
244
|
|
225
245
|
duckdb_state duckdb_bind_date(duckdb_prepared_statement prepared_statement, idx_t param_idx, duckdb_date val) {
|
226
|
-
|
246
|
+
auto value = Value::DATE(date_t(val.days));
|
247
|
+
return duckdb_bind_value(prepared_statement, param_idx, (duckdb_value)&value);
|
227
248
|
}
|
228
249
|
|
229
250
|
duckdb_state duckdb_bind_time(duckdb_prepared_statement prepared_statement, idx_t param_idx, duckdb_time val) {
|
230
|
-
|
251
|
+
auto value = Value::TIME(dtime_t(val.micros));
|
252
|
+
return duckdb_bind_value(prepared_statement, param_idx, (duckdb_value)&value);
|
231
253
|
}
|
232
254
|
|
233
255
|
duckdb_state duckdb_bind_timestamp(duckdb_prepared_statement prepared_statement, idx_t param_idx,
|
234
256
|
duckdb_timestamp val) {
|
235
|
-
|
257
|
+
auto value = Value::TIMESTAMP(timestamp_t(val.micros));
|
258
|
+
return duckdb_bind_value(prepared_statement, param_idx, (duckdb_value)&value);
|
236
259
|
}
|
237
260
|
|
238
261
|
duckdb_state duckdb_bind_interval(duckdb_prepared_statement prepared_statement, idx_t param_idx, duckdb_interval val) {
|
239
|
-
|
262
|
+
auto value = Value::INTERVAL(val.months, val.days, val.micros);
|
263
|
+
return duckdb_bind_value(prepared_statement, param_idx, (duckdb_value)&value);
|
240
264
|
}
|
241
265
|
|
242
266
|
duckdb_state duckdb_bind_varchar(duckdb_prepared_statement prepared_statement, idx_t param_idx, const char *val) {
|
243
267
|
try {
|
244
|
-
|
268
|
+
auto value = Value(val);
|
269
|
+
return duckdb_bind_value(prepared_statement, param_idx, (duckdb_value)&value);
|
245
270
|
} catch (...) {
|
246
271
|
return DuckDBError;
|
247
272
|
}
|
@@ -250,7 +275,8 @@ duckdb_state duckdb_bind_varchar(duckdb_prepared_statement prepared_statement, i
|
|
250
275
|
duckdb_state duckdb_bind_varchar_length(duckdb_prepared_statement prepared_statement, idx_t param_idx, const char *val,
|
251
276
|
idx_t length) {
|
252
277
|
try {
|
253
|
-
|
278
|
+
auto value = Value(std::string(val, length));
|
279
|
+
return duckdb_bind_value(prepared_statement, param_idx, (duckdb_value)&value);
|
254
280
|
} catch (...) {
|
255
281
|
return DuckDBError;
|
256
282
|
}
|
@@ -259,19 +285,23 @@ duckdb_state duckdb_bind_varchar_length(duckdb_prepared_statement prepared_state
|
|
259
285
|
duckdb_state duckdb_bind_decimal(duckdb_prepared_statement prepared_statement, idx_t param_idx, duckdb_decimal val) {
|
260
286
|
auto hugeint_val = duckdb_internal_hugeint(val.value);
|
261
287
|
if (val.width > duckdb::Decimal::MAX_WIDTH_INT64) {
|
262
|
-
|
288
|
+
auto value = Value::DECIMAL(hugeint_val, val.width, val.scale);
|
289
|
+
return duckdb_bind_value(prepared_statement, param_idx, (duckdb_value)&value);
|
263
290
|
}
|
264
291
|
auto value = hugeint_val.lower;
|
265
|
-
|
292
|
+
auto duck_val = Value::DECIMAL((int64_t)value, val.width, val.scale);
|
293
|
+
return duckdb_bind_value(prepared_statement, param_idx, (duckdb_value)&duck_val);
|
266
294
|
}
|
267
295
|
|
268
296
|
duckdb_state duckdb_bind_blob(duckdb_prepared_statement prepared_statement, idx_t param_idx, const void *data,
|
269
297
|
idx_t length) {
|
270
|
-
|
298
|
+
auto value = Value::BLOB(duckdb::const_data_ptr_cast(data), length);
|
299
|
+
return duckdb_bind_value(prepared_statement, param_idx, (duckdb_value)&value);
|
271
300
|
}
|
272
301
|
|
273
302
|
duckdb_state duckdb_bind_null(duckdb_prepared_statement prepared_statement, idx_t param_idx) {
|
274
|
-
|
303
|
+
auto value = Value();
|
304
|
+
return duckdb_bind_value(prepared_statement, param_idx, (duckdb_value)&value);
|
275
305
|
}
|
276
306
|
|
277
307
|
duckdb_state duckdb_execute_prepared(duckdb_prepared_statement prepared_statement, duckdb_result *out_result) {
|
@@ -317,7 +317,7 @@ ClientContext::CreatePreparedStatement(ClientContextLock &lock, const string &qu
|
|
317
317
|
if (values) {
|
318
318
|
auto ¶meter_values = *values;
|
319
319
|
for (auto &value : parameter_values) {
|
320
|
-
planner.parameter_data.emplace(value);
|
320
|
+
planner.parameter_data.emplace(value.first, BoundParameterData(value.second));
|
321
321
|
}
|
322
322
|
}
|
323
323
|
|
@@ -12,6 +12,13 @@ bool TopN::CanOptimize(LogicalOperator &op) {
|
|
12
12
|
op.children[0]->type == LogicalOperatorType::LOGICAL_ORDER_BY) {
|
13
13
|
auto &limit = op.Cast<LogicalLimit>();
|
14
14
|
|
15
|
+
// When there are some expressions in the limit operator,
|
16
|
+
// we shouldn't use this optimizations. Because of the expressions
|
17
|
+
// will be lost when it convert to TopN operator.
|
18
|
+
if (limit.limit || limit.offset) {
|
19
|
+
return false;
|
20
|
+
}
|
21
|
+
|
15
22
|
// This optimization doesn't apply when OFFSET is present without LIMIT
|
16
23
|
// Or if offset is not constant
|
17
24
|
if (limit.limit_val != NumericLimits<int64_t>::Maximum() || limit.offset) {
|
@@ -220,7 +220,7 @@ public:
|
|
220
220
|
void SubtractFrameOfReference(T_INNER *buffer, T_INNER frame_of_reference) {
|
221
221
|
static_assert(IsIntegral<T_INNER>::value, "Integral type required.");
|
222
222
|
for (idx_t i = 0; i < compression_buffer_idx; i++) {
|
223
|
-
buffer[i] -= frame_of_reference;
|
223
|
+
buffer[i] -= static_cast<typename MakeUnsigned<T_INNER>::type>(frame_of_reference);
|
224
224
|
}
|
225
225
|
}
|
226
226
|
|
package/src/duckdb_node.hpp
CHANGED
package/src/statement.cpp
CHANGED
@@ -174,7 +174,7 @@ static Napi::Value convert_col_val(Napi::Env &env, duckdb::Value dval, duckdb::L
|
|
174
174
|
duckdb::Hugeint::NegateInPlace(val); // remove signing bit
|
175
175
|
}
|
176
176
|
D_ASSERT(val.upper >= 0);
|
177
|
-
const uint64_t words[] = {val.lower, (
|
177
|
+
const uint64_t words[] = {val.lower, static_cast<uint64_t>(val.upper)};
|
178
178
|
value = Napi::BigInt::New(env, negative, 2, words);
|
179
179
|
} break;
|
180
180
|
case duckdb::LogicalTypeId::DECIMAL: {
|