duckdb 0.3.2-dev10.0 → 0.3.2-dev1000.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/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.is_null) {
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.value_.integer);
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.value_.float_);
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.value_.double_);
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.value_.bigint);
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.str_value);
187
+ value = Napi::String::New(env, duckdb::StringValue::Get(dval));
173
188
  } break;
174
189
  case duckdb::LogicalTypeId::BLOB: {
175
- value = Napi::Buffer<char>::Copy(env, dval.str_value.c_str(), dval.str_value.length());
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
- row_result.Set(node_names[col_idx], value);
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
+ });
@@ -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
+ });