duckdb 0.8.2-dev2842.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.
Files changed (36) hide show
  1. package/binding.gyp +1 -0
  2. package/package.json +1 -1
  3. package/src/duckdb/extension/json/include/json_deserializer.hpp +1 -1
  4. package/src/duckdb/extension/json/include/json_serializer.hpp +1 -1
  5. package/src/duckdb/extension/json/json_deserializer.cpp +7 -5
  6. package/src/duckdb/extension/json/json_serializer.cpp +2 -3
  7. package/src/duckdb/src/common/adbc/adbc.cpp +400 -145
  8. package/src/duckdb/src/common/adbc/driver_manager.cpp +79 -31
  9. package/src/duckdb/src/common/adbc/nanoarrow/allocator.cpp +57 -0
  10. package/src/duckdb/src/common/adbc/nanoarrow/metadata.cpp +121 -0
  11. package/src/duckdb/src/common/adbc/nanoarrow/schema.cpp +474 -0
  12. package/src/duckdb/src/common/adbc/nanoarrow/single_batch_array_stream.cpp +84 -0
  13. package/src/duckdb/src/common/arrow/arrow_converter.cpp +4 -2
  14. package/src/duckdb/src/common/multi_file_reader.cpp +6 -0
  15. package/src/duckdb/src/execution/window_executor.cpp +5 -8
  16. package/src/duckdb/src/function/table/version/pragma_version.cpp +2 -2
  17. package/src/duckdb/src/include/duckdb/common/adbc/adbc.h +1 -0
  18. package/src/duckdb/src/include/duckdb/common/adbc/adbc.hpp +3 -3
  19. package/src/duckdb/src/include/duckdb/common/adbc/single_batch_array_stream.hpp +16 -0
  20. package/src/duckdb/src/include/duckdb/common/arrow/arrow_appender.hpp +1 -2
  21. package/src/duckdb/src/include/duckdb/common/arrow/arrow_converter.hpp +0 -2
  22. package/src/duckdb/src/include/duckdb/common/arrow/nanoarrow/nanoarrow.h +462 -0
  23. package/src/duckdb/src/include/duckdb/common/arrow/nanoarrow/nanoarrow.hpp +14 -0
  24. package/src/duckdb/src/include/duckdb/common/types/data_chunk.hpp +0 -2
  25. package/src/duckdb/src/include/duckdb/main/chunk_scan_state.hpp +2 -4
  26. package/src/duckdb/src/include/duckdb.h +16 -0
  27. package/src/duckdb/src/main/capi/arrow-c.cpp +41 -0
  28. package/src/duckdb/src/main/capi/prepared-c.cpp +60 -30
  29. package/src/duckdb/src/main/chunk_scan_state.cpp +6 -0
  30. package/src/duckdb/src/main/client_context.cpp +1 -1
  31. package/src/duckdb/src/optimizer/topn_optimizer.cpp +7 -0
  32. package/src/duckdb/src/parser/transform/constraint/transform_constraint.cpp +55 -38
  33. package/src/duckdb/src/storage/compression/bitpacking.cpp +1 -1
  34. package/src/duckdb/ub_src_common_adbc_nanoarrow.cpp +8 -0
  35. package/src/duckdb_node.hpp +1 -0
  36. 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
- static duckdb_state duckdb_bind_value(duckdb_prepared_statement prepared_statement, idx_t param_idx, Value val) {
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] = val;
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 *name) {
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
- auto &statement = wrapper->statement;
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
- *param_idx_out = entry->second;
167
- return DuckDBSuccess;
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
- return duckdb_bind_value(prepared_statement, param_idx, Value::BOOLEAN(val));
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
- return duckdb_bind_value(prepared_statement, param_idx, Value::TINYINT(val));
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
- return duckdb_bind_value(prepared_statement, param_idx, Value::SMALLINT(val));
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
- return duckdb_bind_value(prepared_statement, param_idx, Value::INTEGER(val));
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
- return duckdb_bind_value(prepared_statement, param_idx, Value::BIGINT(val));
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
- return duckdb_bind_value(prepared_statement, param_idx, Value::HUGEINT(duckdb_internal_hugeint(val)));
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
- return duckdb_bind_value(prepared_statement, param_idx, Value::UTINYINT(val));
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
- return duckdb_bind_value(prepared_statement, param_idx, Value::USMALLINT(val));
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
- return duckdb_bind_value(prepared_statement, param_idx, Value::UINTEGER(val));
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
- return duckdb_bind_value(prepared_statement, param_idx, Value::UBIGINT(val));
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
- return duckdb_bind_value(prepared_statement, param_idx, Value::FLOAT(val));
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
- return duckdb_bind_value(prepared_statement, param_idx, Value::DOUBLE(val));
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
- return duckdb_bind_value(prepared_statement, param_idx, Value::DATE(date_t(val.days)));
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
- return duckdb_bind_value(prepared_statement, param_idx, Value::TIME(dtime_t(val.micros)));
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
- return duckdb_bind_value(prepared_statement, param_idx, Value::TIMESTAMP(timestamp_t(val.micros)));
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
- return duckdb_bind_value(prepared_statement, param_idx, Value::INTERVAL(val.months, val.days, val.micros));
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
- return duckdb_bind_value(prepared_statement, param_idx, Value(val));
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
- return duckdb_bind_value(prepared_statement, param_idx, Value(std::string(val, length)));
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
- return duckdb_bind_value(prepared_statement, param_idx, Value::DECIMAL(hugeint_val, val.width, val.scale));
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
- return duckdb_bind_value(prepared_statement, param_idx, Value::DECIMAL((int64_t)value, val.width, val.scale));
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
- return duckdb_bind_value(prepared_statement, param_idx, Value::BLOB(duckdb::const_data_ptr_cast(data), length));
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
- return duckdb_bind_value(prepared_statement, param_idx, Value());
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) {
@@ -3,6 +3,12 @@
3
3
 
4
4
  namespace duckdb {
5
5
 
6
+ ChunkScanState::ChunkScanState() {
7
+ }
8
+
9
+ ChunkScanState::~ChunkScanState() {
10
+ }
11
+
6
12
  idx_t ChunkScanState::CurrentOffset() const {
7
13
  return offset;
8
14
  }
@@ -317,7 +317,7 @@ ClientContext::CreatePreparedStatement(ClientContextLock &lock, const string &qu
317
317
  if (values) {
318
318
  auto &parameter_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) {
@@ -17,8 +17,58 @@ static void ParseSchemaTableNameFK(duckdb_libpgquery::PGRangeVar *input, Foreign
17
17
  fk_info.table = input->relname;
18
18
  }
19
19
 
20
+ static bool ForeignKeyActionSupported(char action) {
21
+ switch (action) {
22
+ case PG_FKCONSTR_ACTION_NOACTION:
23
+ case PG_FKCONSTR_ACTION_RESTRICT:
24
+ return true;
25
+ case PG_FKCONSTR_ACTION_CASCADE:
26
+ case PG_FKCONSTR_ACTION_SETDEFAULT:
27
+ case PG_FKCONSTR_ACTION_SETNULL:
28
+ return false;
29
+ default:
30
+ D_ASSERT(false);
31
+ }
32
+ return false;
33
+ }
34
+
35
+ static unique_ptr<ForeignKeyConstraint>
36
+ TransformForeignKeyConstraint(duckdb_libpgquery::PGConstraint *constraint,
37
+ optional_ptr<const string> override_fk_column = nullptr) {
38
+ D_ASSERT(constraint);
39
+ if (!ForeignKeyActionSupported(constraint->fk_upd_action) ||
40
+ !ForeignKeyActionSupported(constraint->fk_del_action)) {
41
+ throw ParserException("FOREIGN KEY constraints cannot use CASCADE, SET NULL or SET DEFAULT");
42
+ }
43
+ ForeignKeyInfo fk_info;
44
+ fk_info.type = ForeignKeyType::FK_TYPE_FOREIGN_KEY_TABLE;
45
+ ParseSchemaTableNameFK(constraint->pktable, fk_info);
46
+ vector<string> pk_columns, fk_columns;
47
+ if (override_fk_column) {
48
+ D_ASSERT(!constraint->fk_attrs);
49
+ fk_columns.emplace_back(*override_fk_column);
50
+ } else if (constraint->fk_attrs) {
51
+ for (auto kc = constraint->fk_attrs->head; kc; kc = kc->next) {
52
+ fk_columns.emplace_back(reinterpret_cast<duckdb_libpgquery::PGValue *>(kc->data.ptr_value)->val.str);
53
+ }
54
+ }
55
+ if (constraint->pk_attrs) {
56
+ for (auto kc = constraint->pk_attrs->head; kc; kc = kc->next) {
57
+ pk_columns.emplace_back(reinterpret_cast<duckdb_libpgquery::PGValue *>(kc->data.ptr_value)->val.str);
58
+ }
59
+ }
60
+ if (!pk_columns.empty() && pk_columns.size() != fk_columns.size()) {
61
+ throw ParserException("The number of referencing and referenced columns for foreign keys must be the same");
62
+ }
63
+ if (fk_columns.empty()) {
64
+ throw ParserException("The set of referencing and referenced columns for foreign keys must be not empty");
65
+ }
66
+ return make_uniq<ForeignKeyConstraint>(pk_columns, fk_columns, std::move(fk_info));
67
+ }
68
+
20
69
  unique_ptr<Constraint> Transformer::TransformConstraint(duckdb_libpgquery::PGListCell *cell) {
21
70
  auto constraint = reinterpret_cast<duckdb_libpgquery::PGConstraint *>(cell->data.ptr_value);
71
+ D_ASSERT(constraint);
22
72
  switch (constraint->contype) {
23
73
  case duckdb_libpgquery::PG_CONSTR_UNIQUE:
24
74
  case duckdb_libpgquery::PG_CONSTR_PRIMARY: {
@@ -36,27 +86,9 @@ unique_ptr<Constraint> Transformer::TransformConstraint(duckdb_libpgquery::PGLis
36
86
  }
37
87
  return make_uniq<CheckConstraint>(TransformExpression(constraint->raw_expr));
38
88
  }
39
- case duckdb_libpgquery::PG_CONSTR_FOREIGN: {
40
- ForeignKeyInfo fk_info;
41
- fk_info.type = ForeignKeyType::FK_TYPE_FOREIGN_KEY_TABLE;
42
- ParseSchemaTableNameFK(constraint->pktable, fk_info);
43
- vector<string> pk_columns, fk_columns;
44
- for (auto kc = constraint->fk_attrs->head; kc; kc = kc->next) {
45
- fk_columns.emplace_back(reinterpret_cast<duckdb_libpgquery::PGValue *>(kc->data.ptr_value)->val.str);
46
- }
47
- if (constraint->pk_attrs) {
48
- for (auto kc = constraint->pk_attrs->head; kc; kc = kc->next) {
49
- pk_columns.emplace_back(reinterpret_cast<duckdb_libpgquery::PGValue *>(kc->data.ptr_value)->val.str);
50
- }
51
- }
52
- if (!pk_columns.empty() && pk_columns.size() != fk_columns.size()) {
53
- throw ParserException("The number of referencing and referenced columns for foreign keys must be the same");
54
- }
55
- if (fk_columns.empty()) {
56
- throw ParserException("The set of referencing and referenced columns for foreign keys must be not empty");
57
- }
58
- return make_uniq<ForeignKeyConstraint>(pk_columns, fk_columns, std::move(fk_info));
59
- }
89
+ case duckdb_libpgquery::PG_CONSTR_FOREIGN:
90
+ return TransformForeignKeyConstraint(constraint);
91
+
60
92
  default:
61
93
  throw NotImplementedException("Constraint type not handled yet!");
62
94
  }
@@ -96,23 +128,8 @@ unique_ptr<Constraint> Transformer::TransformConstraint(duckdb_libpgquery::PGLis
96
128
  "dictionary, pfor, bitpacking or fsst");
97
129
  }
98
130
  return nullptr;
99
- case duckdb_libpgquery::PG_CONSTR_FOREIGN: {
100
- ForeignKeyInfo fk_info;
101
- fk_info.type = ForeignKeyType::FK_TYPE_FOREIGN_KEY_TABLE;
102
- ParseSchemaTableNameFK(constraint->pktable, fk_info);
103
-
104
- vector<string> pk_columns, fk_columns;
105
- fk_columns.emplace_back(column.Name().c_str());
106
- if (constraint->pk_attrs) {
107
- for (auto kc = constraint->pk_attrs->head; kc; kc = kc->next) {
108
- pk_columns.emplace_back(reinterpret_cast<duckdb_libpgquery::PGValue *>(kc->data.ptr_value)->val.str);
109
- }
110
- }
111
- if (!pk_columns.empty() && pk_columns.size() != fk_columns.size()) {
112
- throw ParserException("The number of referencing and referenced columns for foreign keys must be the same");
113
- }
114
- return make_uniq<ForeignKeyConstraint>(pk_columns, fk_columns, std::move(fk_info));
115
- }
131
+ case duckdb_libpgquery::PG_CONSTR_FOREIGN:
132
+ return TransformForeignKeyConstraint(constraint, &column.Name());
116
133
  default:
117
134
  throw NotImplementedException("Constraint not implemented!");
118
135
  }
@@ -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
 
@@ -0,0 +1,8 @@
1
+ #include "src/common/adbc/nanoarrow/metadata.cpp"
2
+
3
+ #include "src/common/adbc/nanoarrow/schema.cpp"
4
+
5
+ #include "src/common/adbc/nanoarrow/allocator.cpp"
6
+
7
+ #include "src/common/adbc/nanoarrow/single_batch_array_stream.cpp"
8
+
@@ -7,6 +7,7 @@
7
7
  #include <unordered_map>
8
8
 
9
9
  #include "duckdb/common/vector.hpp"
10
+ #include "duckdb/common/arrow/arrow.hpp"
10
11
 
11
12
  using duckdb::vector;
12
13
 
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, (uint64_t)val.upper};
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: {