duckdb 0.3.2-dev10.0 → 0.3.2-dev1046.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/configure +3 -6
- package/package.json +3 -3
- package/src/database.cpp +3 -0
- package/src/duckdb.cpp +121251 -110323
- package/src/duckdb.hpp +12458 -4150
- package/src/parquet-amalgamation.cpp +43116 -0
- package/src/parquet-amalgamation.hpp +7666 -0
- package/src/statement.cpp +28 -8
- package/test/data_type_support.test.js +37 -0
- package/test/parquet.js +16 -0
package/src/statement.cpp
CHANGED
|
@@ -135,30 +135,45 @@ static Napi::Value convert_chunk(Napi::Env &env, std::vector<std::string> names,
|
|
|
135
135
|
|
|
136
136
|
for (duckdb::idx_t col_idx = 0; col_idx < chunk.ColumnCount(); col_idx++) {
|
|
137
137
|
Napi::Value value;
|
|
138
|
+
// set up a new Napi::Object for some data types, e.g. INTERVAL
|
|
139
|
+
Napi::Object object_value;
|
|
140
|
+
|
|
141
|
+
bool is_object_value {false};
|
|
138
142
|
|
|
139
143
|
auto dval = chunk.GetValue(col_idx, row_idx);
|
|
140
|
-
if (dval.
|
|
144
|
+
if (dval.IsNull()) {
|
|
141
145
|
row_result.Set(node_names[col_idx], env.Null());
|
|
142
146
|
continue;
|
|
143
147
|
}
|
|
144
148
|
|
|
145
149
|
// TODO templateroo here
|
|
146
150
|
switch (chunk.data[col_idx].GetType().id()) {
|
|
151
|
+
case duckdb::LogicalTypeId::BOOLEAN: {
|
|
152
|
+
value = Napi::Boolean::New(env, duckdb::BooleanValue::Get(dval));
|
|
153
|
+
} break;
|
|
147
154
|
case duckdb::LogicalTypeId::INTEGER: {
|
|
148
|
-
value = Napi::Number::New(env, dval
|
|
155
|
+
value = Napi::Number::New(env, duckdb::IntegerValue::Get(dval));
|
|
149
156
|
} break;
|
|
150
157
|
case duckdb::LogicalTypeId::FLOAT: {
|
|
151
|
-
value = Napi::Number::New(env, dval
|
|
158
|
+
value = Napi::Number::New(env, duckdb::FloatValue::Get(dval));
|
|
152
159
|
} break;
|
|
153
160
|
case duckdb::LogicalTypeId::DOUBLE: {
|
|
154
|
-
value = Napi::Number::New(env, dval
|
|
161
|
+
value = Napi::Number::New(env, duckdb::DoubleValue::Get(dval));
|
|
155
162
|
} break;
|
|
156
163
|
case duckdb::LogicalTypeId::BIGINT: {
|
|
157
|
-
value = Napi::Number::New(env, dval
|
|
164
|
+
value = Napi::Number::New(env, duckdb::BigIntValue::Get(dval));
|
|
158
165
|
} break;
|
|
159
166
|
case duckdb::LogicalTypeId::HUGEINT: {
|
|
160
167
|
value = Napi::Number::New(env, dval.GetValue<double>());
|
|
161
168
|
} break;
|
|
169
|
+
case duckdb::LogicalTypeId::INTERVAL: {
|
|
170
|
+
auto interval = duckdb::IntervalValue::Get(dval);
|
|
171
|
+
is_object_value = true;
|
|
172
|
+
object_value = Napi::Object::New(env);
|
|
173
|
+
object_value.Set("months", interval.months);
|
|
174
|
+
object_value.Set("days", interval.days);
|
|
175
|
+
object_value.Set("micros", interval.micros);
|
|
176
|
+
} break;
|
|
162
177
|
#if (NAPI_VERSION > 4)
|
|
163
178
|
case duckdb::LogicalTypeId::DATE: {
|
|
164
179
|
const auto scale = duckdb::Interval::SECS_PER_DAY * duckdb::Interval::MSECS_PER_SEC;
|
|
@@ -169,10 +184,11 @@ static Napi::Value convert_chunk(Napi::Env &env, std::vector<std::string> names,
|
|
|
169
184
|
} break;
|
|
170
185
|
#endif
|
|
171
186
|
case duckdb::LogicalTypeId::VARCHAR: {
|
|
172
|
-
value = Napi::String::New(env, dval
|
|
187
|
+
value = Napi::String::New(env, duckdb::StringValue::Get(dval));
|
|
173
188
|
} break;
|
|
174
189
|
case duckdb::LogicalTypeId::BLOB: {
|
|
175
|
-
|
|
190
|
+
auto &blob = duckdb::StringValue::Get(dval);
|
|
191
|
+
value = Napi::Buffer<char>::Copy(env, blob.c_str(), blob.length());
|
|
176
192
|
} break;
|
|
177
193
|
case duckdb::LogicalTypeId::SQLNULL: {
|
|
178
194
|
value = env.Null();
|
|
@@ -182,7 +198,11 @@ static Napi::Value convert_chunk(Napi::Env &env, std::vector<std::string> names,
|
|
|
182
198
|
.ThrowAsJavaScriptException();
|
|
183
199
|
return env.Null();
|
|
184
200
|
}
|
|
185
|
-
|
|
201
|
+
if (is_object_value == true) {
|
|
202
|
+
row_result.Set(node_names[col_idx], object_value);
|
|
203
|
+
} else {
|
|
204
|
+
row_result.Set(node_names[col_idx], value);
|
|
205
|
+
}
|
|
186
206
|
}
|
|
187
207
|
result.Set(row_idx, row_result);
|
|
188
208
|
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
var sqlite3 = require("..");
|
|
2
|
+
var assert = require("assert");
|
|
3
|
+
|
|
4
|
+
describe("data type support", function () {
|
|
5
|
+
let db;
|
|
6
|
+
before(function (done) {
|
|
7
|
+
db = new sqlite3.Database(":memory:", done);
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
it("supports BOOLEAN values", function (done) {
|
|
11
|
+
db.run("CREATE TABLE boolean_table (i BOOLEAN)");
|
|
12
|
+
const stmt = db.prepare("INSERT INTO boolean_table VALUES (?)");
|
|
13
|
+
const values = [true, false];
|
|
14
|
+
values.forEach((bool) => {
|
|
15
|
+
stmt.run(bool);
|
|
16
|
+
});
|
|
17
|
+
db.prepare("SELECT i from boolean_table;").all((err, res) => {
|
|
18
|
+
assert(err === null);
|
|
19
|
+
assert(res.every((v, i) => v.i === values[i]));
|
|
20
|
+
done();
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
it("supports INTERVAL values", function (done) {
|
|
24
|
+
db.prepare(`SELECT
|
|
25
|
+
INTERVAL 1 MINUTE as minutes,
|
|
26
|
+
INTERVAL 5 DAY as days,
|
|
27
|
+
INTERVAL 4 MONTH as months,
|
|
28
|
+
INTERVAL 4 MONTH + INTERVAL 5 DAY + INTERVAL 1 MINUTE as combined;`).each((err, row) => {
|
|
29
|
+
assert(err === null);
|
|
30
|
+
assert.deepEqual(row.minutes, { months: 0, days: 0, micros: 60 * 1000 * 1000});
|
|
31
|
+
assert.deepEqual(row.days, { months: 0, days: 5, micros: 0});
|
|
32
|
+
assert.deepEqual(row.months, {months: 4, days: 0, micros: 0});
|
|
33
|
+
assert.deepEqual(row.combined, {months: 4, days: 5, micros: 60 * 1000 * 1000});
|
|
34
|
+
done();
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
});
|
package/test/parquet.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
var sqlite3 = require('..');
|
|
2
|
+
var assert = require('assert');
|
|
3
|
+
var helper = require('./support/helper');
|
|
4
|
+
|
|
5
|
+
describe('can query parquet', function() {
|
|
6
|
+
var db;
|
|
7
|
+
|
|
8
|
+
before(function(done) {
|
|
9
|
+
db = new sqlite3.Database(':memory:', done);
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
it('should be able to read parquet files', function(done) {
|
|
13
|
+
db.run("select * from parquet_scan('../../data/parquet-testing/userdata1.parquet')", done);
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
});
|