duckdb 0.9.3-dev3.0 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -114,7 +114,7 @@ jobs:
114
114
  strategy:
115
115
  matrix:
116
116
  target_arch: [ x64, arm64 ]
117
- node: [ '12', '14', '16', '17', '18', '19', '20', '21']
117
+ node: [ '16', '17', '18', '19', '20', '21']
118
118
  isRelease:
119
119
  - ${{ startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/main' }}
120
120
  exclude:
package/README.md CHANGED
@@ -15,7 +15,7 @@ Then you can run a query:
15
15
  ```js
16
16
  db.all('SELECT 42 AS fortytwo', function(err, res) {
17
17
  if (err) {
18
- throw err;
18
+ console.warn(err);
19
19
  }
20
20
  console.log(res[0].fortytwo)
21
21
  });
@@ -26,7 +26,7 @@ Other available methods are `each`, where the callback is invoked for each row,
26
26
  ```js
27
27
  db.all('SELECT ?::INTEGER AS fortytwo, ?::STRING as hello', 42, 'Hello, World', function(err, res) {
28
28
  if (err) {
29
- throw err;
29
+ console.warn(err);
30
30
  }
31
31
  console.log(res[0].fortytwo)
32
32
  console.log(res[0].hello)
@@ -47,7 +47,7 @@ You can create multiple connections, each with their own transaction context.
47
47
  ```js
48
48
  con.all('SELECT 42 AS fortytwo', function(err, res) {
49
49
  if (err) {
50
- throw err;
50
+ console.warn(err);
51
51
  }
52
52
  console.log(res[0].fortytwo)
53
53
  });
@@ -64,7 +64,7 @@ To execute this statement, you can call for example `all()` on the `stmt` object
64
64
  ```js
65
65
  stmt.all(42, function(err, res) {
66
66
  if (err) {
67
- throw err;
67
+ console.warn(err);
68
68
  }
69
69
  console.log(res[0].fortytwo)
70
70
  });
@@ -81,7 +81,7 @@ for (var i = 0; i < 10; i++) {
81
81
  stmt.finalize();
82
82
  con.all('SELECT * FROM a', function(err, res) {
83
83
  if (err) {
84
- throw err;
84
+ console.warn(err);
85
85
  }
86
86
  console.log(res)
87
87
  });
@@ -93,7 +93,7 @@ con.all('SELECT * FROM a', function(err, res) {
93
93
  var stmt = con.prepare('select ?::INTEGER as fortytwo', function(err, stmt) {
94
94
  stmt.all(42, function(err, res) {
95
95
  if (err) {
96
- throw err;
96
+ console.warn(err);
97
97
  }
98
98
  console.log(res[0].fortytwo)
99
99
  });
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "duckdb",
3
3
  "main": "./lib/duckdb.js",
4
4
  "types": "./lib/duckdb.d.ts",
5
- "version": "0.9.3-dev3.0",
5
+ "version": "0.10.0",
6
6
  "description": "DuckDB node.js API",
7
7
  "gypfile": true,
8
8
  "dependencies": {
package/src/database.cpp CHANGED
@@ -33,6 +33,7 @@ struct OpenTask : public Task {
33
33
  : Task(database_, callback_), filename(filename_) {
34
34
 
35
35
  duckdb_config.options.access_mode = access_mode_;
36
+ duckdb_config.SetOptionByName("duckdb_api", duckdb::Value("nodejs"));
36
37
  Napi::Env env = database_.Env();
37
38
  Napi::HandleScope scope(env);
38
39
 
@@ -45,7 +46,8 @@ struct OpenTask : public Task {
45
46
  try {
46
47
  duckdb_config.SetOptionByName(key, duckdb::Value(val));
47
48
  } catch (std::exception &e) {
48
- throw Napi::TypeError::New(env, "Failed to set configuration option " + key + ": " + e.what());
49
+ duckdb::ErrorData error(e);
50
+ throw Napi::TypeError::New(env, "Failed to set configuration option " + key + ": " + error.Message());
49
51
  }
50
52
  }
51
53
  }
@@ -50,6 +50,7 @@ extern "C" WINBASEAPI BOOL WINAPI GetPhysicallyInstalledSystemMemory(PULONGLONG)
50
50
  #endif // NOLINT
51
51
  #elif defined(_WIN32)
52
52
  #include <RestartManager.h>
53
+ #pragma comment(lib, "rstrtmgr.lib")
53
54
  #endif
54
55
 
55
56
  namespace duckdb {
package/src/statement.cpp CHANGED
@@ -161,15 +161,25 @@ static Napi::Value convert_col_val(Napi::Env &env, duckdb::Value dval, duckdb::L
161
161
  case duckdb::LogicalTypeId::DOUBLE: {
162
162
  value = Napi::Number::New(env, duckdb::DoubleValue::Get(dval));
163
163
  } break;
164
+ case duckdb::LogicalTypeId::UHUGEINT: {
165
+ auto val = duckdb::UhugeIntValue::Get(dval);
166
+ const uint64_t words[] = {val.lower, val.upper};
167
+ value = Napi::BigInt::New(env, false, 2, words);
168
+ } break;
164
169
  case duckdb::LogicalTypeId::HUGEINT: {
165
170
  auto val = duckdb::HugeIntValue::Get(dval);
166
- auto negative = val.upper < 0;
167
- if (negative) {
168
- duckdb::Hugeint::NegateInPlace(val); // remove signing bit
171
+ const uint64_t words_min[] = {0, 1ull<<63};
172
+ if (val == duckdb::NumericLimits<duckdb::hugeint_t>::Minimum()) {
173
+ value = Napi::BigInt::New(env, true, 2, words_min);
174
+ } else {
175
+ auto negative = val.upper < 0;
176
+ if (negative) {
177
+ duckdb::Hugeint::NegateInPlace(val); // remove signing bit
178
+ }
179
+ D_ASSERT(val.upper >= 0);
180
+ const uint64_t words[] = {val.lower, static_cast<uint64_t>(val.upper)};
181
+ value = Napi::BigInt::New(env, negative, 2, words);
169
182
  }
170
- D_ASSERT(val.upper >= 0);
171
- const uint64_t words[] = {val.lower, static_cast<uint64_t>(val.upper)};
172
- value = Napi::BigInt::New(env, negative, 2, words);
173
183
  } break;
174
184
  case duckdb::LogicalTypeId::DECIMAL: {
175
185
  value = Napi::Number::New(env, dval.GetValue<double>());
@@ -13,7 +13,7 @@ describe('query properties', function() {
13
13
  var j = 1;
14
14
  for (var i = 0; i < 5000; i++) {
15
15
  stmt.run(i, "demo", function(err: null | Error) {
16
- if (err) throw err;
16
+ if (err) done(new Error('Query failed unexpectedly'));
17
17
  // Relies on SQLite's row numbering to be gapless and starting
18
18
  // from 1.
19
19
  // @ts-ignore
@@ -26,7 +26,7 @@ describe('query properties', function() {
26
26
 
27
27
  it.skip('should return the correct changes count', function(done) {
28
28
  db.run("UPDATE foo SET id = id + 1 WHERE id % 2 = 0", function(err: null | Error) {
29
- if (err) throw err;
29
+ if (err) done(new Error('Query failed unexpectedly'));
30
30
  // FIXME assert.equal(2500, this.changes);
31
31
  done();
32
32
  });
@@ -8,11 +8,11 @@ describe('Column Types', function() {
8
8
  it('should prepare a statement and return the columns and their types', function(done) {
9
9
  // we dont include the large_enum and small_enum since they are huge and test the same code path as the small_enum
10
10
  var stmt = db.prepare("SELECT * EXCLUDE(medium_enum, large_enum) FROM test_all_types()", function(err: null | Error) {
11
- if (err) throw err;
11
+ if (err) done(new Error('Query failed unexpectedly'));
12
12
 
13
13
  let cols = stmt.columns();
14
14
 
15
- assert.equal(cols.length, 42);
15
+ assert.equal(cols.length, 43);
16
16
 
17
17
  var expected = [
18
18
  { name: 'bool', type: { id: 'BOOLEAN', sql_type: 'BOOLEAN' } },
@@ -21,6 +21,7 @@ describe('Column Types', function() {
21
21
  { name: 'int', type: { id: 'INTEGER', sql_type: 'INTEGER' } },
22
22
  { name: 'bigint', type: { id: 'BIGINT', sql_type: 'BIGINT' } },
23
23
  { name: 'hugeint', type: { id: 'HUGEINT', sql_type: 'HUGEINT' } },
24
+ { name: 'uhugeint', type: { id: 'UHUGEINT', sql_type: 'UHUGEINT' } },
24
25
  { name: 'utinyint', type: { id: 'UTINYINT', sql_type: 'UTINYINT' } },
25
26
  { name: 'usmallint', type: { id: 'USMALLINT', sql_type: 'USMALLINT' } },
26
27
  { name: 'uint', type: { id: 'UINTEGER', sql_type: 'UINTEGER' } },
@@ -262,4 +263,4 @@ describe('Column Types', function() {
262
263
  });
263
264
  stmt.finalize(done);
264
265
  });
265
- });
266
+ });
@@ -0,0 +1,30 @@
1
+ import * as duckdb from '..';
2
+ import * as assert from 'assert';
3
+ import {TableData} from "..";
4
+
5
+ describe('user_agent', () => {
6
+
7
+ it('default value', (done) => {
8
+ const db: duckdb.Database = new duckdb.Database(':memory:');
9
+
10
+ db.all('PRAGMA USER_AGENT', (err: null | Error, rows: TableData) => {
11
+ if (err) {
12
+ done(new Error('Query failed unexpectedly'));
13
+ }
14
+ assert.match(rows[0].user_agent, /duckdb\/.*\(*\) nodejs/);
15
+ done();
16
+ });
17
+ })
18
+
19
+ it('with custom_user_agent', (done) => {
20
+ const db: duckdb.Database = new duckdb.Database(':memory:', { 'custom_user_agent': 'a_framework' });
21
+
22
+ db.all('PRAGMA USER_AGENT', (err: null | Error, rows: TableData) => {
23
+ if (err) {
24
+ done(new Error('Query failed unexpectedly'));
25
+ }
26
+ assert.match(rows[0].user_agent, /duckdb\/.*\(*\) nodejs a_framework/);
27
+ done();
28
+ });
29
+ })
30
+ })
package/test/each.test.ts CHANGED
@@ -14,7 +14,7 @@ describe('each', function() {
14
14
 
15
15
 
16
16
  db.each('SELECT id, txt FROM foo WHERE ROWID < ?', total, function(err: null | Error, row: RowData) {
17
- if (err) throw err;
17
+ if (err) done(new Error('Query failed unexpectedly'));
18
18
  retrieved++;
19
19
 
20
20
  if(retrieved === total) {
@@ -29,7 +29,7 @@ describe('each', function() {
29
29
  var retrieved = 0;
30
30
 
31
31
  db.each('SELECT id, txt FROM foo WHERE ROWID < ?', total, function(err: null | Error, row: RowData) {
32
- if (err) throw err;
32
+ if (err) done(new Error('Query failed unexpectedly'));
33
33
  retrieved++;
34
34
  }, function(err: null | Error, num: RowData) {
35
35
  assert.equal(retrieved, num);
package/test/exec.test.ts CHANGED
@@ -12,14 +12,14 @@ describe('exec', function() {
12
12
  it('Database#exec', function(done) {
13
13
  var sql = fs.readFileSync('test/support/script.sql', 'utf8');
14
14
  db.exec(sql, function(err: null | Error) {
15
- if (err) throw err;
15
+ if (err) done(new Error('Query failed unexpectedly'));
16
16
  done();
17
17
  });
18
18
  });
19
19
 
20
20
  it('retrieve database structure', function(done) {
21
21
  db.all("SELECT type, name FROM sqlite_master ORDER BY type, name", function(err: null | Error, rows: TableData) {
22
- if (err) throw err;
22
+ if (err) done(new Error('Query failed unexpectedly'));
23
23
  assert.deepEqual(rows, [
24
24
  // { type: 'index', name: 'grid_key_lookup' },
25
25
  // { type: 'index', name: 'grid_utfgrid_lookup' },
@@ -21,7 +21,7 @@ describe.skip('named columns', function() {
21
21
 
22
22
  it('should retrieve the values', function(done) {
23
23
  db.get("SELECT txt, num FROM foo ORDER BY num", function(err, row) {
24
- if (err) throw err;
24
+ if (err) done(new Error('Query failed unexpectedly'));
25
25
  assert.equal(row.txt, "Lorem Ipsum");
26
26
  assert.equal(row.num, 1);
27
27
  done();
@@ -30,7 +30,7 @@ describe.skip('named columns', function() {
30
30
 
31
31
  it('should be able to retrieve rowid of last inserted value', function(done) {
32
32
  db.get("SELECT last_insert_rowid() as last_id FROM foo", function(err, row) {
33
- if (err) throw err;
33
+ if (err) done(new Error('Query failed unexpectedly'));
34
34
  assert.equal(row.last_id, 1);
35
35
  done();
36
36
  });
@@ -17,14 +17,14 @@ describe('null error', function() {
17
17
 
18
18
  it('should insert rows with lots of null values', function(done) {
19
19
  var stmt = db.prepare('INSERT INTO febp_data VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', function(err: null | Error) {
20
- if (err) throw err;
20
+ if (err) done(new Error('Query failed unexpectedly'));
21
21
 
22
22
  for (var i = 0; i < 100; i++) {
23
23
  stmt.run([ '100005', 'Albertville City School District', 'ALABAMA', 'AL', '1', '856031', '753000', 'NULL', 'NULL', '6-Small Town', 'Town', 21, '130', '6624', '7140', '8731', '8520', '102', '88', '100', '94', '23352000', '27280000', '30106000', '33028000', '768478', '845886', '782696', '1096819', '1279663', '1168521', '561522', '657649', '684366', '687531', '710543', '727276', '726647', 'N/A', 'N/A', 'N/A', 'N/A', '986', '977', '1006', '1080250', '1202325', '1009962', '1109310', '70287', '93015', '14693.56', '13634.58', 'N/A', '0.230', '0.301', '0.268882175', '73', '26', '29', '3718', '3747', '3790', '2663', '2615', '2575', '75', '82', '89', '3', '2', '6', '11', '9', '8', '955', '1028', '1102', '1991', '2061', '2146', '649', '729', '770', '443', '278', '267', '0.860', '0.86', '0.8474', '0.84', '0.8235', '0.810', '0.84', '0.7729', '0.75', '0.7843', '1121', '1205', '0.74', '0.6862', '0.72', '0.7317', '0.78', '0.7766', '0.79', '0.7387', '0.84', '0.9255', '0.86', '0.9302', '0.88', '0.9308', '0.84', '0.8605' ]);
24
24
  }
25
25
 
26
26
  stmt.finalize(function(err) {
27
- if (err) throw err;
27
+ if (err) done(new Error('Query failed unexpectedly'));
28
28
  done();
29
29
  });
30
30
  });
@@ -14,7 +14,9 @@ describe('prepare', function() {
14
14
  err.message === 'Parser: syntax error at or near "CRATE' */) {
15
15
  done();
16
16
  }
17
- else throw err;
17
+ else {
18
+ done(new Error('Query failed unexpectedly'));
19
+ }
18
20
  });
19
21
  });
20
22
 
@@ -56,11 +58,11 @@ describe('prepare', function() {
56
58
  i * Math.PI,
57
59
  null,
58
60
  function(err: null | Error) {
59
- if (err) throw err;
61
+ if (err) done(new Error('Query failed unexpectedly'));
60
62
  inserted++;
61
63
  }
62
64
  ).finalize(function(err) {
63
- if (err) throw err;
65
+ if (err) done(new Error('Query failed unexpectedly'));
64
66
  if (inserted == count) done();
65
67
  });
66
68
  }
@@ -68,12 +70,12 @@ describe('prepare', function() {
68
70
 
69
71
  it('should prepare a statement and return values again', function(done) {
70
72
  var stmt = db.prepare("SELECT txt, num, flt, blb FROM foo ORDER BY num", function(err: null | Error) {
71
- if (err) throw err;
73
+ if (err) done(new Error('Query failed unexpectedly'));
72
74
  assert.equal(stmt.sql, 'SELECT txt, num, flt, blb FROM foo ORDER BY num');
73
75
  });
74
76
 
75
77
  stmt.each(function(err: null | Error, row: RowData) {
76
- if (err) throw err;
78
+ if (err) done(new Error('Query failed unexpectedly'));
77
79
  assert.equal(row.txt, 'String ' + retrieved);
78
80
  assert.equal(row.num, retrieved);
79
81
  assert.equal(row.flt, retrieved * Math.PI);
@@ -93,13 +95,13 @@ describe('prepare', function() {
93
95
  /* // get() is an abomination and should be killed
94
96
  it('should prepare a statement and run it ' + (count + 5) + ' times', function(done) {
95
97
  var stmt = db.prepare("SELECT txt, num, flt, blb FROM foo ORDER BY num", function(err) {
96
- if (err) throw err;
98
+ if (err) done(new Error('Query failed unexpectedly'));
97
99
  assert.equal(stmt.sql, 'SELECT txt, num, flt, blb FROM foo ORDER BY num');
98
100
  });
99
101
 
100
102
  for (var i = 0; i < count + 5; i++) (function(i) {
101
103
  stmt.get(function(err, row) {
102
- if (err) throw err;
104
+ if (err) done(new Error('Query failed unexpectedly'));
103
105
 
104
106
  if (retrieved >= 1000) {
105
107
  assert.equal(row, undefined);
@@ -138,7 +140,7 @@ describe('prepare', function() {
138
140
 
139
141
  it('should insert two rows', function(done) {
140
142
  db.prepare('INSERT INTO foo VALUES(4)').run(function(err: null | Error) {
141
- if (err) throw err;
143
+ if (err) done(new Error('Query failed unexpectedly'));
142
144
  inserted++;
143
145
  }).run(undefined, function (err: null | Error) {
144
146
  // The second time we pass undefined as a parameter. This is
@@ -149,7 +151,7 @@ describe('prepare', function() {
149
151
  };
150
152
  inserted++;
151
153
  }).finalize(function(err) {
152
- if (err) throw err;
154
+ if (err) done(new Error('Query failed unexpectedly'));
153
155
  if (inserted == 2) done();
154
156
  });
155
157
  });
@@ -157,12 +159,12 @@ describe('prepare', function() {
157
159
  /*
158
160
  it('should retrieve the data', function(done) {
159
161
  var stmt = db.prepare("SELECT num FROM foo", function(err) {
160
- if (err) throw err;
162
+ if (err) done(new Error('Query failed unexpectedly'));
161
163
  });
162
164
 
163
165
  for (var i = 0; i < 2; i++) (function(i) {
164
166
  stmt.get(function(err, row) {
165
- if (err) throw err;
167
+ if (err) done(new Error('Query failed unexpectedly'));
166
168
  assert(row);
167
169
  assert.equal(row.num, 4);
168
170
  retrieved++;
@@ -175,11 +177,11 @@ describe('prepare', function() {
175
177
 
176
178
  it('should retrieve the data', function(done) {
177
179
  var stmt = db.prepare("SELECT num FROM foo", function(err: null | Error) {
178
- if (err) throw err;
180
+ if (err) done(new Error('Query failed unexpectedly'));
179
181
  });
180
182
 
181
183
  stmt.each(function(err: null | Error, row: RowData) {
182
- if (err) throw err;
184
+ if (err) done(new Error('Query failed unexpectedly'));
183
185
  assert.ok(row);
184
186
  assert.equal(row.num, 4);
185
187
  retrieved++;
@@ -211,7 +213,7 @@ describe('prepare', function() {
211
213
  for (var i = 0; i < 10; i++) {
212
214
  stmt.reset();
213
215
  stmt.get(function(err, row) {
214
- if (err) throw err;
216
+ if (err) done(new Error('Query failed unexpectedly'));
215
217
  assert.equal(row.txt, 'String 0');
216
218
  assert.equal(row.num, 0);
217
219
  assert.equal(row.flt, 0.0);
@@ -245,7 +247,7 @@ describe('prepare', function() {
245
247
 
246
248
  for (var i = 0; i < 10; i++) (function(i) {
247
249
  stmt.get(i * 10 + 1, function(err, row) {
248
- if (err) throw err;
250
+ if (err) done(new Error('Query failed unexpectedly'));
249
251
  var val = i * 10 + 1;
250
252
  assert.equal(row.txt, 'String ' + val);
251
253
  assert.equal(row.num, val);
@@ -279,7 +281,7 @@ describe('prepare', function() {
279
281
  /* it('should retrieve particular rows', function(done) {
280
282
  db.prepare("SELECT txt, num, flt, blb FROM foo WHERE num = ? AND txt = ?", 10, 'String 10')
281
283
  .get(function(err, row) {
282
- if (err) throw err;
284
+ if (err) done(new Error('Query failed unexpectedly'));
283
285
  assert.equal(row.txt, 'String 10');
284
286
  assert.equal(row.num, 10);
285
287
  assert.equal(row.flt, 10 * Math.PI);
@@ -292,7 +294,7 @@ describe('prepare', function() {
292
294
  it('should retrieve particular rows', function(done) {
293
295
  db.prepare("SELECT txt, num, flt, blb FROM foo WHERE num = ? AND txt = ?")
294
296
  .each(10, 'String 10', function(err: null | Error, row: RowData) {
295
- if (err) throw err;
297
+ if (err) done(new Error('Query failed unexpectedly'));
296
298
  assert.equal(row.txt, 'String 10');
297
299
  assert.equal(row.num, 10);
298
300
  // assert.equal(row.flt, 10 * Math.PI);
@@ -323,7 +325,7 @@ describe('prepare', function() {
323
325
  it('should retrieve particular rows', function(done) {
324
326
  db.prepare("SELECT txt, num, flt, blb FROM foo WHERE num < ? ORDER BY num")
325
327
  .all(count, function(err: null | Error, rows: TableData) {
326
- if (err) throw err;
328
+ if (err) done(new Error('Query failed unexpectedly'));
327
329
  for (var i = 0; i < rows.length; i++) {
328
330
  assert.equal(rows[i].txt, 'String ' + i);
329
331
  assert.equal(rows[i].num, i);
@@ -353,7 +355,7 @@ describe('prepare', function() {
353
355
  it('should directly execute first statements', function(done) {
354
356
  db.prepare("insert into foo values (3); insert into foo values (4); select * from foo")
355
357
  .all(function(err: null | Error, rows: TableData) {
356
- if (err) throw err;
358
+ if (err) done(new Error('Query failed unexpectedly'));
357
359
  assert.equal(rows[0].a, 3);
358
360
  assert.equal(rows[1].a, 4);
359
361
  })
@@ -392,7 +394,7 @@ describe('prepare', function() {
392
394
  it('should retrieve particular rows', function(done) {
393
395
  db.prepare("SELECT txt, num, flt, blb FROM foo WHERE num > 5000")
394
396
  .all(function(err: null | Error, rows: TableData) {
395
- if (err) throw err;
397
+ if (err) done(new Error('Query failed unexpectedly'));
396
398
  assert.ok(rows.length === 0);
397
399
  })
398
400
  .finalize(done);
@@ -435,10 +437,10 @@ describe('prepare', function() {
435
437
  for (var i = 0; i < data.length; i++) {
436
438
  var stmt = db.prepare("INSERT INTO foo VALUES(?, ?, ?, ?)");
437
439
  stmt.run(data[i][0], data[i][1], data[i][2], data[i][3], function(err: null | Error) {
438
- if (err) throw err;
440
+ if (err) done(new Error('Query failed unexpectedly'));
439
441
  inserted++;
440
442
  }).finalize(function(err) {
441
- if (err) throw err;
443
+ if (err) done(new Error('Query failed unexpectedly'));
442
444
  if (inserted == data.length) done();
443
445
  });
444
446
  }
@@ -447,7 +449,7 @@ describe('prepare', function() {
447
449
  it('should retrieve all values', function(done) {
448
450
  db.prepare("SELECT txt, num, flt, blb FROM foo")
449
451
  .all(function(err: null | Error, rows: TableData) {
450
- if (err) throw err;
452
+ if (err) done(new Error('Query failed unexpectedly'));
451
453
 
452
454
  for (var i = 0; i < rows.length; i++) {
453
455
  assert.ok(retrieved_marks[rows[i].num] !== true);
@@ -485,7 +487,7 @@ describe('prepare', function() {
485
487
 
486
488
  it('should get a row', function(done) {
487
489
  db.get("SELECT txt, num, flt, blb FROM foo WHERE num = ? AND txt = ?", 10, 'String 10', function(err, row) {
488
- if (err) throw err;
490
+ if (err) done(new Error('Query failed unexpectedly'));
489
491
  assert.equal(row.txt, 'String 10');
490
492
  assert.equal(row.num, 10);
491
493
  assert.equal(row.flt, 10 * Math.PI);
@@ -524,7 +526,7 @@ describe('prepare', function() {
524
526
  i * Math.PI,
525
527
  null,
526
528
  function(err: null | Error) {
527
- if (err) throw err;
529
+ if (err) done(new Error('Query failed unexpectedly'));
528
530
  inserted++;
529
531
  if (inserted == count) done();
530
532
  }
@@ -534,7 +536,7 @@ describe('prepare', function() {
534
536
 
535
537
  it('should retrieve all rows', function(done) {
536
538
  db.all("SELECT txt, num, flt, blb FROM foo ORDER BY num", function(err: null | Error, rows: TableData) {
537
- if (err) throw err;
539
+ if (err) done(new Error('Query failed unexpectedly'));
538
540
  for (var i = 0; i < rows.length; i++) {
539
541
  assert.equal(rows[i].txt, 'String ' + i);
540
542
  assert.equal(rows[i].num, i);
@@ -19,29 +19,30 @@ describe('serialize() and parallelize()', function() {
19
19
  db.parallelize(done);
20
20
  });
21
21
 
22
- it('should insert rows', function() {
22
+ it('should insert rows', function(done) {
23
23
  var stmt1 = db.prepare("INSERT INTO foo VALUES(?, ?, ?, ?)");
24
24
  var stmt2 = db.prepare("INSERT INTO foo VALUES(?, ?, ?, ?)");
25
25
  for (var i = 0; i < count; i++) {
26
26
  // Interleaved inserts with two statements.
27
27
  stmt1.run('String ' + i, i, i * Math.PI, null, function(err: null | Error) {
28
- if (err) throw err;
28
+ if (err) {console.warn(err);done(new Error('Query failed unexpectedly'));}
29
29
  inserted1++;
30
30
  });
31
31
  i++;
32
32
  stmt2.run('String ' + i, i, i * Math.PI, null, function(err: null | Error) {
33
- if (err) throw err;
33
+ if (err) {console.warn(err);done(new Error('Query failed unexpectedly'));}
34
34
  inserted2++;
35
35
  });
36
36
  }
37
37
  stmt1.finalize();
38
38
  stmt2.finalize();
39
+ done();
39
40
  });
40
41
 
41
42
  it('should have inserted all the rows after synchronizing with serialize()', function(done) {
42
43
  db.serialize();
43
44
  db.all("SELECT txt, num, flt, blb FROM foo ORDER BY num", function(err: null | Error, rows: TableData) {
44
- if (err) throw err;
45
+ if (err) done(new Error('Query failed unexpectedly'));
45
46
  for (var i = 0; i < rows.length; i++) {
46
47
  assert.equal(rows[i].txt, 'String ' + i);
47
48
  assert.equal(rows[i].num, i);
@@ -77,14 +78,14 @@ describe('serialize(fn)', function() {
77
78
  var d = new Date(Date.UTC(2018, 0, i));
78
79
  var ts = new Date(Date.UTC(2021, 6, 10, 0, 0, i));
79
80
  stmt.run('String ' + i, i, i * Math.PI, null, d, ts, function(err: null | Error) {
80
- if (err) throw err;
81
+ if (err) done(new Error('Query failed unexpectedly'));
81
82
  inserted++;
82
83
  });
83
84
  }
84
85
  stmt.finalize();
85
86
 
86
87
  db.all("SELECT txt, num, flt, blb, d, ts FROM foo ORDER BY num", function(err: null | Error, rows: TableData) {
87
- if (err) throw err;
88
+ if (err) done(new Error('Query failed unexpectedly'));
88
89
  for (var i = 0; i < rows.length; i++) {
89
90
  var d = new Date(Date.UTC(2018, 0, i));
90
91
  var ts = new Date(Date.UTC(2021, 6, 10, 0, 0, i));
@@ -48,8 +48,13 @@ const correct_answer_map: Record<string, any[]> = {
48
48
  int: [-2147483648, 2147483647, null],
49
49
  bigint: [BigInt("-9223372036854775808"), BigInt("9223372036854775807"), null],
50
50
 
51
+ uhugeint: [
52
+ BigInt("0"),
53
+ BigInt("340282366920938463463374607431768211455"),
54
+ null,
55
+ ],
51
56
  hugeint: [
52
- BigInt("-170141183460469231731687303715884105727"),
57
+ BigInt("-170141183460469231731687303715884105728"),
53
58
  BigInt("170141183460469231731687303715884105727"),
54
59
  null,
55
60
  ],
@@ -60,7 +65,7 @@ const correct_answer_map: Record<string, any[]> = {
60
65
  uint: [0, 4294967295, null],
61
66
  ubigint: [BigInt(0), BigInt("18446744073709551615"), null],
62
67
 
63
- time: ["00:00:00", "23:59:59.999999", null],
68
+ time: ["00:00:00", "24:00:00", null],
64
69
 
65
70
  float: [-3.4028234663852886e38, 3.4028234663852886e38, null],
66
71
  double: [-1.7976931348623157e308, 1.7976931348623157e308, null],
@@ -74,7 +79,7 @@ const correct_answer_map: Record<string, any[]> = {
74
79
  null,
75
80
  ],
76
81
  uuid: [
77
- "00000000-0000-0000-0000-000000000001",
82
+ "00000000-0000-0000-0000-000000000000",
78
83
  "ffffffff-ffff-ffff-ffff-ffffffffffff",
79
84
  null,
80
85
  ],
@@ -161,7 +166,7 @@ const correct_answer_map: Record<string, any[]> = {
161
166
  map: ["{}", "{key1=🦆🦆🦆🦆🦆🦆, key2=goose}", null],
162
167
  union: ["Frank", "5", null],
163
168
 
164
- time_tz: ["00:00:00-1559", "23:59:59.999999+1559", null],
169
+ time_tz: ["00:00:00+15:59:59", "24:00:00-15:59:59", null],
165
170
  interval: [
166
171
  timedelta({
167
172
  days: 0,
@@ -63,7 +63,7 @@ describe("TypeScript declarations", function () {
63
63
  it("typescript: Database#exec", function (done) {
64
64
  var sql = fs.readFileSync("test/support/script.sql", "utf8");
65
65
  db.exec(sql, function (err: duckdb.DuckDbError | null) {
66
- if (err) throw err;
66
+ if (err) done(new Error('Query failed unexpectedly'));
67
67
  done();
68
68
  });
69
69
  });
@@ -72,7 +72,7 @@ describe("TypeScript declarations", function () {
72
72
  db.all(
73
73
  "SELECT type, name FROM sqlite_master ORDER BY type, name",
74
74
  function (err: duckdb.DuckDbError | null, rows: duckdb.TableData) {
75
- if (err) throw err;
75
+ if (err) done(new Error('Query failed unexpectedly'));
76
76
  assert.deepEqual(rows, [
77
77
  { type: "table", name: "grid_key" },
78
78
  { type: "table", name: "grid_utfgrid" },
@@ -125,7 +125,7 @@ describe("TypeScript declarations", function () {
125
125
  db.all(
126
126
  "select udf(21, 20, 1) v",
127
127
  function (err: duckdb.DuckDbError | null, rows: duckdb.TableData) {
128
- if (err) throw err;
128
+ if (err) done(new Error('Query failed unexpectedly'));
129
129
  assert.equal(rows[0].v, 42);
130
130
  }
131
131
  );
@@ -139,7 +139,7 @@ describe("TypeScript declarations", function () {
139
139
  "SELECT * FROM range(0, ?)",
140
140
  total,
141
141
  function (err: duckdb.DuckDbError | null, row: any) {
142
- if (err) throw err;
142
+ if (err) done(new Error('Query failed unexpectedly'));
143
143
  retrieved++;
144
144
 
145
145
  if (retrieved === total) {
@@ -197,12 +197,12 @@ describe("typescript: prepared statements", function () {
197
197
  i * Math.PI,
198
198
  null,
199
199
  function (err: duckdb.DuckDbError | null) {
200
- if (err) throw err;
200
+ if (err) done(new Error('Query failed unexpectedly'));
201
201
  inserted++;
202
202
  }
203
203
  )
204
204
  .finalize(function (err) {
205
- if (err) throw err;
205
+ if (err) done(new Error('Query failed unexpectedly'));
206
206
  if (inserted == count) done();
207
207
  });
208
208
  }
package/test/udf.test.ts CHANGED
@@ -12,7 +12,7 @@ describe('UDFs', function() {
12
12
  it('0ary int', function(done) {
13
13
  db.register_udf("udf", "integer", () => 42);
14
14
  db.all("select udf() v", function(err: Error | null, rows: TableData) {
15
- if (err) throw err;
15
+ if (err) done(new Error('Query failed unexpectedly'));
16
16
  assert.equal(rows[0].v, 42);
17
17
  });
18
18
  db.unregister_udf("udf", done);
@@ -21,7 +21,7 @@ describe('UDFs', function() {
21
21
  it('0ary double', function(done) {
22
22
  db.register_udf("udf", "double", () => 4.2);
23
23
  db.all("select udf() v", function(err: null | Error, rows: TableData) {
24
- if (err) throw err;
24
+ if (err) done(new Error('Query failed unexpectedly'));
25
25
  assert.equal(rows[0].v, 4.2);
26
26
  });
27
27
  db.unregister_udf("udf", done);
@@ -30,7 +30,7 @@ describe('UDFs', function() {
30
30
  it('0ary string', function(done) {
31
31
  db.register_udf("udf", "varchar", () => 'hello');
32
32
  db.all("select udf() v", function(err: null | Error, rows: TableData) {
33
- if (err) throw err;
33
+ if (err) done(new Error('Query failed unexpectedly'));
34
34
  assert.equal(rows[0].v, 'hello');
35
35
  });
36
36
  db.unregister_udf("udf", done);
@@ -39,7 +39,7 @@ describe('UDFs', function() {
39
39
  it('0ary non-inlined string', function(done) {
40
40
  db.register_udf("udf", "varchar", () => 'this string is over 12 bytes');
41
41
  db.all("select udf() v", function(err: null | Error, rows: TableData) {
42
- if (err) throw err;
42
+ if (err) done(new Error('Query failed unexpectedly'));
43
43
  assert.equal(rows[0].v, 'this string is over 12 bytes');
44
44
  });
45
45
  db.unregister_udf("udf", done);
@@ -48,7 +48,7 @@ describe('UDFs', function() {
48
48
  it('0ary int null', function(done) {
49
49
  db.register_udf("udf", "integer", () => undefined);
50
50
  db.all("select udf() v", function(err: null | Error, rows: TableData) {
51
- if (err) throw err;
51
+ if (err) done(new Error('Query failed unexpectedly'));
52
52
  assert.equal(rows[0].v, undefined);
53
53
  });
54
54
  db.unregister_udf("udf", done);
@@ -58,7 +58,7 @@ describe('UDFs', function() {
58
58
  it('0ary string null', function(done) {
59
59
  db.register_udf("udf", "varchar", () => undefined);
60
60
  db.all("select udf() v", function(err: null | Error, rows: TableData) {
61
- if (err) throw err;
61
+ if (err) done(new Error('Query failed unexpectedly'));
62
62
  assert.equal(rows[0].v, undefined);
63
63
  });
64
64
  db.unregister_udf("udf", done);
@@ -68,7 +68,7 @@ describe('UDFs', function() {
68
68
  it('unary int', function(done) {
69
69
  db.register_udf("udf", "integer", (x) => x+1);
70
70
  db.all("select udf(42) v", function(err: null | Error, rows: TableData) {
71
- if (err) throw err;
71
+ if (err) done(new Error('Query failed unexpectedly'));
72
72
  assert.equal(rows[0].v, 43);
73
73
  });
74
74
  db.unregister_udf("udf", done);
@@ -77,7 +77,7 @@ describe('UDFs', function() {
77
77
  it('unary double', function(done) {
78
78
  db.register_udf("udf", "double", (x) => x);
79
79
  db.all("select udf(4.2::double) v", function(err: null | Error, rows: TableData) {
80
- if (err) throw err;
80
+ if (err) done(new Error('Query failed unexpectedly'));
81
81
  assert.equal(rows[0].v, 4.2);
82
82
  });
83
83
  db.unregister_udf("udf", done);
@@ -86,7 +86,7 @@ describe('UDFs', function() {
86
86
  it('unary int null', function(done) {
87
87
  db.register_udf("udf", "integer", (x) => undefined);
88
88
  db.all("select udf(42) v", function(err: null | Error, rows: TableData) {
89
- if (err) throw err;
89
+ if (err) done(new Error('Query failed unexpectedly'));
90
90
  assert.equal(rows[0].v, undefined);
91
91
  });
92
92
  db.unregister_udf("udf", done);
@@ -96,7 +96,7 @@ describe('UDFs', function() {
96
96
  it('unary double null', function(done) {
97
97
  db.register_udf("udf", "double", (x) => undefined);
98
98
  db.all("select udf(4.2::double) v", function(err: null | Error, rows: TableData) {
99
- if (err) throw err;
99
+ if (err) done(new Error('Query failed unexpectedly'));
100
100
  assert.equal(rows[0].v, undefined);
101
101
  });
102
102
  db.unregister_udf("udf", done);
@@ -106,7 +106,7 @@ describe('UDFs', function() {
106
106
  it('unary string', function(done) {
107
107
  db.register_udf("udf", "varchar", (x) => 'hello ' + x);
108
108
  db.all("select udf('world') v", function(err: null | Error, rows: TableData) {
109
- if (err) throw err;
109
+ if (err) done(new Error('Query failed unexpectedly'));
110
110
  assert.equal(rows[0].v, 'hello world');
111
111
  });
112
112
  db.unregister_udf("udf", done);
@@ -115,7 +115,7 @@ describe('UDFs', function() {
115
115
  it('unary string null', function(done) {
116
116
  db.register_udf("udf", "varchar", (x) => undefined);
117
117
  db.all("select udf('world') v", function(err: null | Error, rows: TableData) {
118
- if (err) throw err;
118
+ if (err) done(new Error('Query failed unexpectedly'));
119
119
  assert.equal(rows[0].v, undefined);
120
120
  });
121
121
  db.unregister_udf("udf", done);
@@ -124,7 +124,7 @@ describe('UDFs', function() {
124
124
  it('binary int', function(done) {
125
125
  db.register_udf("udf", "integer", (x, y) => x + y);
126
126
  db.all("select udf(40, 2) v", function(err: null | Error, rows: TableData) {
127
- if (err) throw err;
127
+ if (err) done(new Error('Query failed unexpectedly'));
128
128
  assert.equal(rows[0].v, 42);
129
129
  });
130
130
  db.unregister_udf("udf", done);
@@ -133,7 +133,7 @@ describe('UDFs', function() {
133
133
  it('binary string', function(done) {
134
134
  db.register_udf("udf", "varchar", (x, y) => x + ' ' + y);
135
135
  db.all("select udf('hello', 'world') v", function(err: null | Error, rows: TableData) {
136
- if (err) throw err;
136
+ if (err) done(new Error('Query failed unexpectedly'));
137
137
  assert.equal(rows[0].v, 'hello world');
138
138
  });
139
139
  db.unregister_udf("udf", done);
@@ -142,7 +142,7 @@ describe('UDFs', function() {
142
142
  it('ternary int', function(done) {
143
143
  db.register_udf("udf", "integer", (x, y, z) => x + y + z);
144
144
  db.all("select udf(21, 20, 1) v", function(err: null | Error, rows: TableData) {
145
- if (err) throw err;
145
+ if (err) done(new Error('Query failed unexpectedly'));
146
146
  assert.equal(rows[0].v, 42);
147
147
  });
148
148
  db.unregister_udf("udf", done);
@@ -151,7 +151,7 @@ describe('UDFs', function() {
151
151
  it('unary larger series', function(done) {
152
152
  db.register_udf("udf", "integer", (x) => 1);
153
153
  db.all("select sum(udf(range::double)) v from range(10000)", function(err: null | Error, rows: TableData) {
154
- if (err) throw err;
154
+ if (err) done(new Error('Query failed unexpectedly'));
155
155
  assert.equal(rows[0].v, 10000);
156
156
  });
157
157
  db.unregister_udf("udf", done);
@@ -167,7 +167,7 @@ describe('UDFs', function() {
167
167
  it('tinyint', function(done) {
168
168
  db.register_udf("udf", "integer", (x) => x+1);
169
169
  db.all("select udf(42::tinyint) v", function(err: null | Error, rows: TableData) {
170
- if (err) throw err;
170
+ if (err) done(new Error('Query failed unexpectedly'));
171
171
  assert.equal(rows[0].v, 43);
172
172
  });
173
173
  db.unregister_udf("udf", done);
@@ -176,7 +176,7 @@ describe('UDFs', function() {
176
176
  it('smallint', function(done) {
177
177
  db.register_udf("udf", "integer", (x) => x+1);
178
178
  db.all("select udf(42::smallint) v", function(err: null | Error, rows: TableData) {
179
- if (err) throw err;
179
+ if (err) done(new Error('Query failed unexpectedly'));
180
180
  assert.equal(rows[0].v, 43);
181
181
  });
182
182
  db.unregister_udf("udf", done);
@@ -185,7 +185,7 @@ describe('UDFs', function() {
185
185
  it('int', function(done) {
186
186
  db.register_udf("udf", "integer", (x) => x+1);
187
187
  db.all("select udf(42::integer) v", function(err: null | Error, rows: TableData) {
188
- if (err) throw err;
188
+ if (err) done(new Error('Query failed unexpectedly'));
189
189
  assert.equal(rows[0].v, 43);
190
190
  });
191
191
  db.unregister_udf("udf", done);
@@ -194,7 +194,7 @@ describe('UDFs', function() {
194
194
  it('timestamp', function(done) {
195
195
  db.register_udf("udf", "timestamp", (x) => x);
196
196
  db.all("select udf(timestamp '1992-09-20 11:30:00') v", function(err: null | Error, rows: TableData) {
197
- if (err) throw err;
197
+ if (err) done(new Error('Query failed unexpectedly'));
198
198
  });
199
199
  db.unregister_udf("udf", done);
200
200
  });
@@ -204,7 +204,7 @@ describe('UDFs', function() {
204
204
  return (a.x == null ? -100 : a.x);
205
205
  });
206
206
  db.all("SELECT min(udf({'x': (case when v % 2 = 0 then v else null end)::INTEGER, 'y': 42}))::INTEGER as foo FROM generate_series(1, 10000) as t(v)", function(err: null | Error, rows: TableData) {
207
- if (err) throw err;
207
+ if (err) done(new Error('Query failed unexpectedly'));
208
208
  assert.equal(rows[0].foo, -100);
209
209
  });
210
210
  db.unregister_udf("udf", done);
@@ -215,7 +215,7 @@ describe('UDFs', function() {
215
215
  return (a.x == null ? -100 : a.x.y);
216
216
  });
217
217
  db.all("SELECT min(udf({'x': (case when v % 2 = 0 then {'y': v::INTEGER } else null end), 'z': 42}))::INTEGER as foo FROM generate_series(1, 10000) as t(v)", function(err: null | Error, rows: TableData) {
218
- if (err) throw err;
218
+ if (err) done(new Error('Query failed unexpectedly'));
219
219
  assert.equal(rows[0].foo, -100);
220
220
  });
221
221
  db.unregister_udf("udf", done);
@@ -224,7 +224,7 @@ describe('UDFs', function() {
224
224
  it('blob', function(done) {
225
225
  db.register_udf("udf", "varchar", (buf: Buffer) => buf.toString("hex"));
226
226
  db.all("select udf('\\xAA\\xAB\\xAC'::BLOB) v", function(err: null | Error, rows: TableData) {
227
- if (err) throw err;
227
+ if (err) done(new Error('Query failed unexpectedly'));
228
228
  assert.equal(rows[0].v, "aaabac");
229
229
  });
230
230
  db.unregister_udf("udf", done);
@@ -86,7 +86,7 @@ describe('unicode', function() {
86
86
  const stmt = db.prepare("INSERT INTO foo VALUES(?, ?)");
87
87
  for (let i = 0; i < data.length; i++) {
88
88
  stmt.run(i, data[i], function(err: null | Error) {
89
- if (err) throw err;
89
+ if (err) done(new Error('Query failed unexpectedly'));
90
90
  inserted++;
91
91
  });
92
92
  }
@@ -95,7 +95,7 @@ describe('unicode', function() {
95
95
 
96
96
  it('should retrieve all values', function(done) {
97
97
  db.all("SELECT txt FROM foo ORDER BY id", function(err: null | Error, rows: TableData) {
98
- if (err) throw err;
98
+ if (err) done(new Error('Query failed unexpectedly'));
99
99
 
100
100
  for (let i = 0; i < rows.length; i++) {
101
101
  assert.equal(rows[i].txt, data[i]);