duckdb 0.7.1-dev90.0 → 0.7.2-dev0.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/README.md +1 -1
- package/binding.gyp +7 -7
- package/package.json +3 -3
- package/src/duckdb/extension/json/buffered_json_reader.cpp +50 -9
- package/src/duckdb/extension/json/include/buffered_json_reader.hpp +7 -2
- package/src/duckdb/extension/json/include/json_scan.hpp +45 -10
- package/src/duckdb/extension/json/json_functions/copy_json.cpp +35 -22
- package/src/duckdb/extension/json/json_functions/json_create.cpp +8 -8
- package/src/duckdb/extension/json/json_functions/json_structure.cpp +8 -3
- package/src/duckdb/extension/json/json_functions/json_transform.cpp +54 -10
- package/src/duckdb/extension/json/json_functions/read_json.cpp +104 -49
- package/src/duckdb/extension/json/json_functions/read_json_objects.cpp +5 -3
- package/src/duckdb/extension/json/json_functions.cpp +7 -0
- package/src/duckdb/extension/json/json_scan.cpp +144 -38
- package/src/duckdb/extension/parquet/column_reader.cpp +7 -0
- package/src/duckdb/extension/parquet/include/column_reader.hpp +1 -0
- package/src/duckdb/extension/parquet/parquet-extension.cpp +2 -10
- package/src/duckdb/src/catalog/catalog.cpp +62 -13
- package/src/duckdb/src/catalog/catalog_entry/index_catalog_entry.cpp +8 -7
- package/src/duckdb/src/catalog/catalog_entry/schema_catalog_entry.cpp +1 -1
- package/src/duckdb/src/catalog/catalog_set.cpp +1 -1
- package/src/duckdb/src/catalog/default/default_functions.cpp +1 -0
- package/src/duckdb/src/catalog/default/default_views.cpp +1 -1
- package/src/duckdb/src/common/bind_helpers.cpp +55 -0
- package/src/duckdb/src/common/file_system.cpp +23 -9
- package/src/duckdb/src/common/hive_partitioning.cpp +1 -0
- package/src/duckdb/src/common/local_file_system.cpp +4 -4
- package/src/duckdb/src/common/string_util.cpp +8 -4
- package/src/duckdb/src/common/types/partitioned_column_data.cpp +1 -0
- package/src/duckdb/src/common/types.cpp +37 -11
- package/src/duckdb/src/execution/column_binding_resolver.cpp +5 -2
- package/src/duckdb/src/execution/index/art/art.cpp +117 -67
- package/src/duckdb/src/execution/index/art/art_key.cpp +24 -12
- package/src/duckdb/src/execution/index/art/leaf.cpp +7 -8
- package/src/duckdb/src/execution/index/art/node.cpp +13 -27
- package/src/duckdb/src/execution/index/art/node16.cpp +5 -8
- package/src/duckdb/src/execution/index/art/node256.cpp +3 -5
- package/src/duckdb/src/execution/index/art/node4.cpp +4 -7
- package/src/duckdb/src/execution/index/art/node48.cpp +5 -8
- package/src/duckdb/src/execution/index/art/prefix.cpp +2 -3
- package/src/duckdb/src/execution/operator/aggregate/physical_window.cpp +6 -27
- package/src/duckdb/src/execution/operator/helper/physical_reset.cpp +1 -9
- package/src/duckdb/src/execution/operator/helper/physical_set.cpp +1 -9
- package/src/duckdb/src/execution/operator/join/physical_iejoin.cpp +7 -9
- package/src/duckdb/src/execution/operator/persistent/buffered_csv_reader.cpp +9 -0
- package/src/duckdb/src/execution/physical_operator.cpp +6 -6
- package/src/duckdb/src/function/pragma/pragma_queries.cpp +38 -11
- package/src/duckdb/src/function/scalar/generic/current_setting.cpp +2 -2
- package/src/duckdb/src/function/scalar/list/array_slice.cpp +2 -3
- package/src/duckdb/src/function/scalar/map/map.cpp +69 -21
- package/src/duckdb/src/function/scalar/string/like.cpp +6 -3
- package/src/duckdb/src/function/table/read_csv.cpp +16 -5
- package/src/duckdb/src/function/table/system/duckdb_temporary_files.cpp +59 -0
- package/src/duckdb/src/function/table/system_functions.cpp +1 -0
- package/src/duckdb/src/function/table/table_scan.cpp +3 -0
- package/src/duckdb/src/function/table/version/pragma_version.cpp +2 -2
- package/src/duckdb/src/include/duckdb/catalog/catalog.hpp +7 -1
- package/src/duckdb/src/include/duckdb/catalog/catalog_entry/duck_index_entry.hpp +1 -1
- package/src/duckdb/src/include/duckdb/catalog/catalog_entry/index_catalog_entry.hpp +1 -1
- package/src/duckdb/src/include/duckdb/common/bind_helpers.hpp +2 -0
- package/src/duckdb/src/include/duckdb/common/enums/statement_type.hpp +1 -1
- package/src/duckdb/src/include/duckdb/common/enums/wal_type.hpp +3 -0
- package/src/duckdb/src/include/duckdb/common/file_system.hpp +1 -1
- package/src/duckdb/src/include/duckdb/common/hive_partitioning.hpp +9 -1
- package/src/duckdb/src/include/duckdb/common/radix_partitioning.hpp +4 -4
- package/src/duckdb/src/include/duckdb/common/string_util.hpp +9 -2
- package/src/duckdb/src/include/duckdb/execution/index/art/art.hpp +37 -41
- package/src/duckdb/src/include/duckdb/execution/index/art/art_key.hpp +8 -11
- package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_reader_options.hpp +2 -0
- package/src/duckdb/src/include/duckdb/function/scalar/string_functions.hpp +2 -1
- package/src/duckdb/src/include/duckdb/function/table/system_functions.hpp +4 -0
- package/src/duckdb/src/include/duckdb/main/client_data.hpp +2 -2
- package/src/duckdb/src/include/duckdb/main/config.hpp +2 -0
- package/src/duckdb/src/include/duckdb/main/{extension_functions.hpp → extension_entries.hpp} +27 -5
- package/src/duckdb/src/include/duckdb/main/extension_helper.hpp +11 -1
- package/src/duckdb/src/include/duckdb/main/settings.hpp +9 -0
- package/src/duckdb/src/include/duckdb/parallel/pipeline_executor.hpp +0 -7
- package/src/duckdb/src/include/duckdb/parser/query_node/select_node.hpp +1 -1
- package/src/duckdb/src/include/duckdb/parser/sql_statement.hpp +2 -2
- package/src/duckdb/src/include/duckdb/parser/statement/copy_statement.hpp +1 -1
- package/src/duckdb/src/include/duckdb/parser/statement/select_statement.hpp +3 -3
- package/src/duckdb/src/include/duckdb/parser/tableref/subqueryref.hpp +1 -1
- package/src/duckdb/src/include/duckdb/planner/binder.hpp +3 -0
- package/src/duckdb/src/include/duckdb/planner/expression_binder/index_binder.hpp +10 -3
- package/src/duckdb/src/include/duckdb/planner/operator/logical_execute.hpp +1 -5
- package/src/duckdb/src/include/duckdb/planner/operator/logical_show.hpp +1 -2
- package/src/duckdb/src/include/duckdb/storage/buffer_manager.hpp +8 -0
- package/src/duckdb/src/include/duckdb/storage/data_table.hpp +7 -1
- package/src/duckdb/src/include/duckdb/storage/index.hpp +47 -38
- package/src/duckdb/src/include/duckdb/storage/write_ahead_log.hpp +7 -0
- package/src/duckdb/src/main/client_context.cpp +2 -0
- package/src/duckdb/src/main/config.cpp +1 -0
- package/src/duckdb/src/main/database.cpp +14 -5
- package/src/duckdb/src/main/extension/extension_alias.cpp +2 -1
- package/src/duckdb/src/main/extension/extension_helper.cpp +15 -0
- package/src/duckdb/src/main/extension/extension_install.cpp +60 -16
- package/src/duckdb/src/main/extension/extension_load.cpp +62 -13
- package/src/duckdb/src/main/settings/settings.cpp +16 -0
- package/src/duckdb/src/optimizer/statistics/operator/propagate_join.cpp +2 -6
- package/src/duckdb/src/parallel/pipeline_executor.cpp +1 -55
- package/src/duckdb/src/parser/parsed_data/create_index_info.cpp +3 -0
- package/src/duckdb/src/parser/statement/copy_statement.cpp +2 -13
- package/src/duckdb/src/parser/statement/delete_statement.cpp +3 -0
- package/src/duckdb/src/parser/statement/insert_statement.cpp +9 -0
- package/src/duckdb/src/parser/statement/update_statement.cpp +3 -0
- package/src/duckdb/src/parser/transform/expression/transform_case.cpp +3 -3
- package/src/duckdb/src/planner/bind_context.cpp +1 -1
- package/src/duckdb/src/planner/binder/expression/bind_aggregate_expression.cpp +3 -0
- package/src/duckdb/src/planner/binder/statement/bind_copy.cpp +7 -14
- package/src/duckdb/src/planner/binder/statement/bind_create_table.cpp +13 -0
- package/src/duckdb/src/planner/binder/statement/bind_drop.cpp +2 -2
- package/src/duckdb/src/planner/binder/statement/bind_insert.cpp +22 -1
- package/src/duckdb/src/planner/expression_binder/index_binder.cpp +32 -1
- package/src/duckdb/src/planner/logical_operator.cpp +4 -1
- package/src/duckdb/src/storage/buffer_manager.cpp +105 -26
- package/src/duckdb/src/storage/compression/bitpacking.cpp +16 -7
- package/src/duckdb/src/storage/data_table.cpp +66 -3
- package/src/duckdb/src/storage/index.cpp +1 -1
- package/src/duckdb/src/storage/local_storage.cpp +1 -1
- package/src/duckdb/src/storage/table_index_list.cpp +1 -2
- package/src/duckdb/src/storage/wal_replay.cpp +68 -0
- package/src/duckdb/src/storage/write_ahead_log.cpp +21 -1
- package/src/duckdb/src/transaction/commit_state.cpp +5 -2
- package/src/duckdb/third_party/concurrentqueue/blockingconcurrentqueue.h +2 -2
- package/src/duckdb/third_party/fmt/include/fmt/core.h +1 -2
- package/src/duckdb/ub_extension_icu_third_party_icu_i18n.cpp +4 -4
- package/src/duckdb/ub_src_function_table_system.cpp +2 -0
- package/src/statement.cpp +46 -12
- package/test/arrow.test.ts +3 -3
- package/test/prepare.test.ts +39 -1
- package/test/typescript_decls.test.ts +1 -1
package/src/statement.cpp
CHANGED
|
@@ -8,6 +8,8 @@
|
|
|
8
8
|
#include <string>
|
|
9
9
|
#include <regex>
|
|
10
10
|
|
|
11
|
+
using std::unique_ptr;
|
|
12
|
+
|
|
11
13
|
namespace node_duckdb {
|
|
12
14
|
|
|
13
15
|
Napi::FunctionReference Statement::constructor;
|
|
@@ -28,13 +30,45 @@ Napi::Object Statement::Init(Napi::Env env, Napi::Object exports) {
|
|
|
28
30
|
return exports;
|
|
29
31
|
}
|
|
30
32
|
|
|
33
|
+
static unique_ptr<duckdb::PreparedStatement> PrepareManyInternal(Statement &statement) {
|
|
34
|
+
auto &connection = statement.connection_ref->connection;
|
|
35
|
+
std::vector<unique_ptr<duckdb::SQLStatement>> statements;
|
|
36
|
+
try {
|
|
37
|
+
if (connection == nullptr) {
|
|
38
|
+
throw duckdb::ConnectionException("Connection was never established or has been closed already");
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Prepare all statements
|
|
42
|
+
statements = connection->ExtractStatements(statement.sql);
|
|
43
|
+
if (statements.empty()) {
|
|
44
|
+
throw duckdb::InvalidInputException("No statement to prepare!");
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// if there are multiple statements, we directly execute the statements besides the last one
|
|
48
|
+
// we only return the result of the last statement to the user, unless one of the previous statements fails
|
|
49
|
+
for (idx_t i = 0; i + 1 < statements.size(); i++) {
|
|
50
|
+
auto pending_query = connection->PendingQuery(std::move(statements[i]));
|
|
51
|
+
auto res = pending_query->Execute();
|
|
52
|
+
if (res->HasError()) {
|
|
53
|
+
return duckdb::make_unique<duckdb::PreparedStatement>(res->GetErrorObject());
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
return connection->Prepare(std::move(statements.back()));
|
|
58
|
+
} catch (const duckdb::Exception &ex) {
|
|
59
|
+
return duckdb::make_unique<duckdb::PreparedStatement>(duckdb::PreservedError(ex));
|
|
60
|
+
} catch (std::exception &ex) {
|
|
61
|
+
return duckdb::make_unique<duckdb::PreparedStatement>(duckdb::PreservedError(ex));
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
31
65
|
struct PrepareTask : public Task {
|
|
32
66
|
PrepareTask(Statement &statement, Napi::Function callback) : Task(statement, callback) {
|
|
33
67
|
}
|
|
34
68
|
|
|
35
69
|
void DoWork() override {
|
|
36
70
|
auto &statement = Get<Statement>();
|
|
37
|
-
statement.statement =
|
|
71
|
+
statement.statement = PrepareManyInternal(statement);
|
|
38
72
|
}
|
|
39
73
|
|
|
40
74
|
void Callback() override {
|
|
@@ -221,7 +255,7 @@ struct StatementParam {
|
|
|
221
255
|
};
|
|
222
256
|
|
|
223
257
|
struct RunPreparedTask : public Task {
|
|
224
|
-
RunPreparedTask(Statement &statement,
|
|
258
|
+
RunPreparedTask(Statement &statement, unique_ptr<StatementParam> params, RunType run_type)
|
|
225
259
|
: Task(statement, params->callback), params(std::move(params)), run_type(run_type) {
|
|
226
260
|
}
|
|
227
261
|
|
|
@@ -366,13 +400,13 @@ struct RunPreparedTask : public Task {
|
|
|
366
400
|
} break;
|
|
367
401
|
}
|
|
368
402
|
}
|
|
369
|
-
|
|
370
|
-
|
|
403
|
+
unique_ptr<duckdb::QueryResult> result;
|
|
404
|
+
unique_ptr<StatementParam> params;
|
|
371
405
|
RunType run_type;
|
|
372
406
|
};
|
|
373
407
|
|
|
374
408
|
struct RunQueryTask : public Task {
|
|
375
|
-
RunQueryTask(Statement &statement,
|
|
409
|
+
RunQueryTask(Statement &statement, unique_ptr<StatementParam> params, Napi::Promise::Deferred deferred)
|
|
376
410
|
: Task(statement), deferred(deferred), params(std::move(params)) {
|
|
377
411
|
}
|
|
378
412
|
|
|
@@ -406,11 +440,11 @@ struct RunQueryTask : public Task {
|
|
|
406
440
|
}
|
|
407
441
|
|
|
408
442
|
Napi::Promise::Deferred deferred;
|
|
409
|
-
|
|
410
|
-
|
|
443
|
+
unique_ptr<duckdb::QueryResult> result;
|
|
444
|
+
unique_ptr<StatementParam> params;
|
|
411
445
|
};
|
|
412
446
|
|
|
413
|
-
|
|
447
|
+
unique_ptr<StatementParam> Statement::HandleArgs(const Napi::CallbackInfo &info) {
|
|
414
448
|
size_t start_idx = ignore_first_param ? 1 : 0;
|
|
415
449
|
auto params = duckdb::make_unique<StatementParam>();
|
|
416
450
|
|
|
@@ -541,7 +575,7 @@ struct GetChunkTask : public Task {
|
|
|
541
575
|
}
|
|
542
576
|
|
|
543
577
|
Napi::Promise::Deferred deferred;
|
|
544
|
-
|
|
578
|
+
unique_ptr<duckdb::DataChunk> chunk;
|
|
545
579
|
};
|
|
546
580
|
|
|
547
581
|
struct GetNextArrowIpcTask : public Task {
|
|
@@ -571,10 +605,10 @@ struct GetNextArrowIpcTask : public Task {
|
|
|
571
605
|
duckdb::string_t blob = *(duckdb::string_t *)(chunk->data[0].GetData());
|
|
572
606
|
|
|
573
607
|
// Transfer ownership and Construct ArrayBuffer
|
|
574
|
-
auto data_chunk_ptr = new
|
|
608
|
+
auto data_chunk_ptr = new unique_ptr<duckdb::DataChunk>();
|
|
575
609
|
*data_chunk_ptr = std::move(chunk);
|
|
576
610
|
auto deleter = [](Napi::Env, void *finalizeData, void *hint) {
|
|
577
|
-
delete static_cast<
|
|
611
|
+
delete static_cast<unique_ptr<duckdb::DataChunk> *>(hint);
|
|
578
612
|
};
|
|
579
613
|
auto array_buffer =
|
|
580
614
|
Napi::ArrayBuffer::New(env, (void *)blob.GetDataUnsafe(), blob.GetSize(), deleter, data_chunk_ptr);
|
|
@@ -583,7 +617,7 @@ struct GetNextArrowIpcTask : public Task {
|
|
|
583
617
|
}
|
|
584
618
|
|
|
585
619
|
Napi::Promise::Deferred deferred;
|
|
586
|
-
|
|
620
|
+
unique_ptr<duckdb::DataChunk> chunk;
|
|
587
621
|
};
|
|
588
622
|
|
|
589
623
|
Napi::Value QueryResult::NextChunk(const Napi::CallbackInfo &info) {
|
package/test/arrow.test.ts
CHANGED
|
@@ -20,13 +20,13 @@ describe('arrow IPC API fails neatly when extension not loaded', function() {
|
|
|
20
20
|
db.arrowIPCStream(query).then(
|
|
21
21
|
() => Promise.reject(new Error('Expected method to reject.')),
|
|
22
22
|
err => {
|
|
23
|
-
assert.ok(err.message.includes("
|
|
23
|
+
assert.ok(err.message.includes("arrow"))
|
|
24
24
|
}
|
|
25
25
|
);
|
|
26
26
|
|
|
27
27
|
db.arrowIPCAll(`SELECT * FROM ipc_table`, function (err: null | Error, result: ArrowArray) {
|
|
28
28
|
if (err) {
|
|
29
|
-
assert.ok(err.message.includes("
|
|
29
|
+
assert.ok(err.message.includes("arrow"))
|
|
30
30
|
} else {
|
|
31
31
|
assert.fail("Expected error");
|
|
32
32
|
}
|
|
@@ -39,7 +39,7 @@ describe('arrow IPC API fails neatly when extension not loaded', function() {
|
|
|
39
39
|
it('register buffer should be disabled currently', function(done) {
|
|
40
40
|
db.register_buffer("test", [new Uint8Array(new ArrayBuffer(10))], true, (err: null | Error) => {
|
|
41
41
|
assert.ok(err)
|
|
42
|
-
assert.ok(err.toString().includes("
|
|
42
|
+
assert.ok(err.toString().includes("arrow"));
|
|
43
43
|
done()
|
|
44
44
|
});
|
|
45
45
|
});
|
package/test/prepare.test.ts
CHANGED
|
@@ -66,7 +66,6 @@ describe('prepare', function() {
|
|
|
66
66
|
}
|
|
67
67
|
});
|
|
68
68
|
|
|
69
|
-
|
|
70
69
|
it('should prepare a statement and return values again', function(done) {
|
|
71
70
|
var stmt = db.prepare("SELECT txt, num, flt, blb FROM foo ORDER BY num", function(err: null | Error) {
|
|
72
71
|
if (err) throw err;
|
|
@@ -343,6 +342,45 @@ describe('prepare', function() {
|
|
|
343
342
|
after(function(done) { db.close(done); });
|
|
344
343
|
});
|
|
345
344
|
|
|
345
|
+
describe('prepare multiple statements', function() {
|
|
346
|
+
var db: sqlite3.Database;
|
|
347
|
+
before(function(done) { db = new sqlite3.Database(':memory:',
|
|
348
|
+
function(err) {
|
|
349
|
+
db.run("CREATE TABLE foo (a integer)", done)
|
|
350
|
+
}
|
|
351
|
+
); });
|
|
352
|
+
|
|
353
|
+
it('should directly execute first statements', function(done) {
|
|
354
|
+
db.prepare("insert into foo values (3); insert into foo values (4); select * from foo")
|
|
355
|
+
.all(function(err: null | Error, rows: TableData) {
|
|
356
|
+
if (err) throw err;
|
|
357
|
+
assert.equal(rows[0].a, 3);
|
|
358
|
+
assert.equal(rows[1].a, 4);
|
|
359
|
+
})
|
|
360
|
+
.finalize(done);
|
|
361
|
+
});
|
|
362
|
+
|
|
363
|
+
it('should fail in prepare, when executing the first statement', function(done) {
|
|
364
|
+
let prepared = db.prepare("SELECT * FROM non_existent_table; SELECT 42", function(err: null | Error) {
|
|
365
|
+
if (err) {
|
|
366
|
+
done();
|
|
367
|
+
return;
|
|
368
|
+
}
|
|
369
|
+
});
|
|
370
|
+
});
|
|
371
|
+
|
|
372
|
+
it('should fail in prepare, when preparing the first statement', function(done) {
|
|
373
|
+
let prepared = db.prepare("SELCET * FROM foo; SELECT 42", function(err: null | Error) {
|
|
374
|
+
if (err) {
|
|
375
|
+
done();
|
|
376
|
+
return;
|
|
377
|
+
}
|
|
378
|
+
});
|
|
379
|
+
});
|
|
380
|
+
|
|
381
|
+
after(function(done) { db.close(done); });
|
|
382
|
+
});
|
|
383
|
+
|
|
346
384
|
describe('all()', function() {
|
|
347
385
|
var db: sqlite3.Database;
|
|
348
386
|
before(function(done) { db = new sqlite3.Database(':memory:',
|
|
@@ -2,7 +2,7 @@ import * as duckdb from "..";
|
|
|
2
2
|
import assert from "assert";
|
|
3
3
|
import fs from "fs";
|
|
4
4
|
|
|
5
|
-
describe("TypeScript
|
|
5
|
+
describe("TypeScript declarations", function () {
|
|
6
6
|
var db: duckdb.Database;
|
|
7
7
|
before(function (done) {
|
|
8
8
|
db = new duckdb.Database(":memory:", duckdb.OPEN_READWRITE, done);
|