duckdb 0.6.2-dev6.0 → 0.6.2-dev623.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/.mocharc.json +2 -2
- package/Makefile +8 -5
- package/README.md +17 -0
- package/binding.gyp +84 -58
- package/binding.gyp.in +88 -0
- package/configure +1 -7
- package/configure.py +126 -0
- package/filelist.cache +0 -0
- package/lib/duckdb.d.ts +29 -11
- package/lib/duckdb.js +6 -0
- package/package.json +1 -1
- package/src/connection.cpp +7 -1
- package/src/database.cpp +1 -3
- package/test/{affected.test.js → affected.test.ts} +8 -10
- package/test/{arrow.test.js → arrow.test.ts} +12 -11
- package/test/{data_type_support.test.js → data_type_support.test.ts} +36 -35
- package/test/{database_fail.test.js → database_fail.test.ts} +25 -24
- package/test/{each.test.js → each.test.ts} +10 -9
- package/test/{exec.test.js → exec.test.ts} +7 -6
- package/test/{extension.test.js → extension.test.ts} +20 -19
- package/test/{interrupt.test.js → interrupt.test.ts} +7 -7
- package/test/{jsdoc.test.js → jsdoc.test.ts} +19 -20
- package/test/{named_columns.test.js → named_columns.test.ts} +4 -6
- package/test/{null_error.test.js → null_error.test.ts} +5 -6
- package/test/{open_close.test.js → open_close.test.ts} +10 -10
- package/test/{parallel_insert.test.js → parallel_insert.test.ts} +6 -7
- package/test/{parquet.js → parquet.test.ts} +2 -4
- package/test/{pathnames.test.js → pathnames.test.ts} +24 -22
- package/test/{prepare.test.js → prepare.test.ts} +53 -50
- package/test/{query_result.test.js → query_result.test.ts} +4 -4
- package/test/{serialization.test.js → serialization.test.ts} +10 -9
- package/test/support/helper.ts +42 -0
- package/test/{syntax_error.test.js → syntax_error.test.ts} +4 -4
- package/test/{udf.test.js → udf.test.ts} +26 -25
- package/test/{unicode.test.js → unicode.test.ts} +23 -22
- package/src/duckdb.cpp +0 -343989
- package/src/duckdb.hpp +0 -32676
- package/src/parquet-amalgamation.cpp +0 -44462
- package/src/parquet-amalgamation.hpp +0 -7981
- package/test/support/helper.js +0 -37
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
var helper = require('./support/helper');
|
|
1
|
+
import * as sqlite3 from '..';
|
|
2
|
+
import * as helper from './support/helper';
|
|
4
3
|
|
|
5
4
|
describe('null error', function() {
|
|
6
5
|
var filename = 'test/tmp/test_sqlite_ok_error.db';
|
|
7
|
-
var db;
|
|
6
|
+
var db: sqlite3.Database;
|
|
8
7
|
|
|
9
8
|
before(function(done) {
|
|
10
9
|
helper.ensureExists('test/tmp');
|
|
@@ -17,7 +16,7 @@ describe('null error', function() {
|
|
|
17
16
|
});
|
|
18
17
|
|
|
19
18
|
it('should insert rows with lots of null values', function(done) {
|
|
20
|
-
var stmt = db.prepare('INSERT INTO febp_data VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', function(err) {
|
|
19
|
+
var stmt = db.prepare('INSERT INTO febp_data VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', function(err: null | Error) {
|
|
21
20
|
if (err) throw err;
|
|
22
21
|
|
|
23
22
|
for (var i = 0; i < 100; i++) {
|
|
@@ -32,7 +31,7 @@ describe('null error', function() {
|
|
|
32
31
|
});
|
|
33
32
|
|
|
34
33
|
it('should have created the database', function() {
|
|
35
|
-
|
|
34
|
+
helper.fileExists(filename);
|
|
36
35
|
});
|
|
37
36
|
|
|
38
37
|
after(function() {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import * as sqlite3 from '..';
|
|
2
|
+
import * as assert from 'assert';
|
|
3
|
+
import * as fs from 'fs';
|
|
4
|
+
import * as helper from './support/helper';
|
|
5
5
|
|
|
6
6
|
describe('open/close', function() {
|
|
7
7
|
before(function() {
|
|
@@ -13,7 +13,7 @@ describe('open/close', function() {
|
|
|
13
13
|
helper.deleteFile('test/tmp/test_create.db');
|
|
14
14
|
});
|
|
15
15
|
|
|
16
|
-
var db;
|
|
16
|
+
var db: sqlite3.Database;
|
|
17
17
|
it('should open the database', function(done) {
|
|
18
18
|
db = new sqlite3.Database('test/tmp/test_create.db', done);
|
|
19
19
|
});
|
|
@@ -23,7 +23,7 @@ describe('open/close', function() {
|
|
|
23
23
|
});
|
|
24
24
|
|
|
25
25
|
it('should have created the file', function() {
|
|
26
|
-
|
|
26
|
+
helper.fileExists('test/tmp/test_create.db');
|
|
27
27
|
});
|
|
28
28
|
|
|
29
29
|
after(function() {
|
|
@@ -123,7 +123,7 @@ describe('open/close', function() {
|
|
|
123
123
|
});
|
|
124
124
|
|
|
125
125
|
it('should not have created the file', function() {
|
|
126
|
-
|
|
126
|
+
helper.fileDoesNotExist('test/tmp/test_readonly.db');
|
|
127
127
|
});
|
|
128
128
|
|
|
129
129
|
after(function() {
|
|
@@ -132,7 +132,7 @@ describe('open/close', function() {
|
|
|
132
132
|
});
|
|
133
133
|
|
|
134
134
|
describe('open and close memory database queuing', function() {
|
|
135
|
-
var db;
|
|
135
|
+
var db: sqlite3.Database;
|
|
136
136
|
it('should open the database', function(done) {
|
|
137
137
|
db = new sqlite3.Database(':memory:', done);
|
|
138
138
|
});
|
|
@@ -155,7 +155,7 @@ describe('open/close', function() {
|
|
|
155
155
|
var completedSecond = false;
|
|
156
156
|
var closed = false;
|
|
157
157
|
|
|
158
|
-
var db;
|
|
158
|
+
var db: sqlite3.Database;
|
|
159
159
|
before(function(done) {
|
|
160
160
|
db = new sqlite3.Database(':memory:', done);
|
|
161
161
|
});
|
|
@@ -164,7 +164,7 @@ describe('open/close', function() {
|
|
|
164
164
|
db.run("CREATE TABLE foo (id INT, num INT)", done);
|
|
165
165
|
});
|
|
166
166
|
|
|
167
|
-
var stmt;
|
|
167
|
+
var stmt: sqlite3.Statement;
|
|
168
168
|
it('should prepare/run a statement', function(done) {
|
|
169
169
|
stmt = db.prepare('INSERT INTO foo VALUES (?, ?)');
|
|
170
170
|
stmt.run(1, 2, done);
|
|
@@ -1,22 +1,21 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
var helper = require('./support/helper');
|
|
1
|
+
import * as sqlite3 from '..';
|
|
2
|
+
import * as helper from './support/helper';
|
|
4
3
|
|
|
5
4
|
describe('parallel', function() {
|
|
6
|
-
var db;
|
|
5
|
+
var db: sqlite3.Database;
|
|
7
6
|
before(function(done) {
|
|
8
7
|
helper.deleteFile('test/tmp/test_parallel_inserts.db');
|
|
9
8
|
helper.ensureExists('test/tmp');
|
|
10
9
|
db = new sqlite3.Database('test/tmp/test_parallel_inserts.db', done);
|
|
11
10
|
});
|
|
12
11
|
|
|
13
|
-
var columns = [];
|
|
12
|
+
var columns: string[] = [];
|
|
14
13
|
for (var i = 0; i < 128; i++) {
|
|
15
14
|
columns.push('id' + i + " INTEGER");
|
|
16
15
|
}
|
|
17
16
|
|
|
18
17
|
it('should create the table', function(done) {
|
|
19
|
-
db.run("CREATE TABLE foo (" + columns + ")", function(err) {
|
|
18
|
+
db.run("CREATE TABLE foo (" + columns + ")", function(err: null | Error) {
|
|
20
19
|
done();
|
|
21
20
|
});
|
|
22
21
|
});
|
|
@@ -37,7 +36,7 @@ describe('parallel', function() {
|
|
|
37
36
|
});
|
|
38
37
|
|
|
39
38
|
it('should verify that the database exists', function() {
|
|
40
|
-
|
|
39
|
+
helper.fileExists('test/tmp/test_parallel_inserts.db');
|
|
41
40
|
});
|
|
42
41
|
|
|
43
42
|
after(function() {
|
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
var assert = require('assert');
|
|
3
|
-
var helper = require('./support/helper');
|
|
1
|
+
import * as sqlite3 from '..';
|
|
4
2
|
|
|
5
3
|
describe('can query parquet', function() {
|
|
6
|
-
var db;
|
|
4
|
+
var db: sqlite3.Database;
|
|
7
5
|
|
|
8
6
|
before(function(done) {
|
|
9
7
|
db = new sqlite3.Database(':memory:', done);
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import * as sqlite3 from "..";
|
|
2
|
+
import * as assert from "assert";
|
|
3
|
+
import {DuckDbError, TableData} from "..";
|
|
3
4
|
|
|
4
5
|
describe("pathname search support", function () {
|
|
5
|
-
let db;
|
|
6
|
+
let db: sqlite3.Database;
|
|
6
7
|
describe("without search paths", () => {
|
|
7
8
|
before((done) => {
|
|
8
9
|
db = new sqlite3.Database(":memory:", done);
|
|
@@ -10,19 +11,20 @@ describe("pathname search support", function () {
|
|
|
10
11
|
|
|
11
12
|
it("supports a full path", function (done) {
|
|
12
13
|
db.prepare('select * from "test/support/prepare.csv"').all(
|
|
13
|
-
(err, result) => {
|
|
14
|
-
assert(err
|
|
15
|
-
assert(result.length
|
|
14
|
+
(err: null | Error, result: TableData) => {
|
|
15
|
+
assert.equal(err, null);
|
|
16
|
+
assert.equal(result.length, 5000);
|
|
16
17
|
done();
|
|
17
18
|
}
|
|
18
19
|
);
|
|
19
20
|
});
|
|
20
21
|
|
|
21
22
|
it("don't not support a partial path", function (done) {
|
|
22
|
-
db.prepare('select * from "prepare.csv"').all((err, result) => {
|
|
23
|
-
assert(err
|
|
24
|
-
assert(err.
|
|
25
|
-
assert(
|
|
23
|
+
db.prepare('select * from "prepare.csv"').all((err: null | DuckDbError, result: TableData) => {
|
|
24
|
+
assert.ok(err);
|
|
25
|
+
assert.equal(err.code, "DUCKDB_NODEJS_ERROR");
|
|
26
|
+
assert.equal(err.errno, -1);
|
|
27
|
+
assert.equal(result, null);
|
|
26
28
|
done();
|
|
27
29
|
});
|
|
28
30
|
});
|
|
@@ -37,18 +39,18 @@ describe("pathname search support", function () {
|
|
|
37
39
|
|
|
38
40
|
it("supports a full path", function (done) {
|
|
39
41
|
db.prepare('select * from "test/support/prepare.csv"').all(
|
|
40
|
-
(err, result) => {
|
|
41
|
-
assert(err
|
|
42
|
-
assert(result.length
|
|
42
|
+
(err: null | Error, result: TableData) => {
|
|
43
|
+
assert.equal(err, null);
|
|
44
|
+
assert.equal(result.length, 5000);
|
|
43
45
|
done();
|
|
44
46
|
}
|
|
45
47
|
);
|
|
46
48
|
});
|
|
47
49
|
|
|
48
50
|
it("supports a partial path", function (done) {
|
|
49
|
-
db.prepare('select * from "prepare.csv"').all((err, result) => {
|
|
50
|
-
assert(err
|
|
51
|
-
assert(result.length
|
|
51
|
+
db.prepare('select * from "prepare.csv"').all((err: null | Error, result: TableData) => {
|
|
52
|
+
assert.equal(err, null);
|
|
53
|
+
assert.equal(result.length, 5000);
|
|
52
54
|
done();
|
|
53
55
|
});
|
|
54
56
|
});
|
|
@@ -63,18 +65,18 @@ describe("pathname search support", function () {
|
|
|
63
65
|
|
|
64
66
|
it("supports a full path", function (done) {
|
|
65
67
|
db.prepare('select * from "test/support/prepare.csv"').all(
|
|
66
|
-
(err, result) => {
|
|
67
|
-
assert(err
|
|
68
|
-
assert(result.length
|
|
68
|
+
(err: null | Error, result: TableData) => {
|
|
69
|
+
assert.equal(err, null);
|
|
70
|
+
assert.equal(result.length, 5000);
|
|
69
71
|
done();
|
|
70
72
|
}
|
|
71
73
|
);
|
|
72
74
|
});
|
|
73
75
|
|
|
74
76
|
it("supports a partial path", function (done) {
|
|
75
|
-
db.prepare('select * from "prepare.csv"').all((err, result) => {
|
|
76
|
-
assert(err
|
|
77
|
-
assert(result.length
|
|
77
|
+
db.prepare('select * from "prepare.csv"').all((err: null | Error, result: TableData) => {
|
|
78
|
+
assert.equal(err, null);
|
|
79
|
+
assert.equal(result.length, 5000);
|
|
78
80
|
done();
|
|
79
81
|
});
|
|
80
82
|
});
|
|
@@ -1,14 +1,15 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import * as sqlite3 from '..';
|
|
2
|
+
import * as assert from 'assert';
|
|
3
|
+
import {DuckDbError, RowData, Statement, TableData} from "..";
|
|
3
4
|
|
|
4
5
|
describe('prepare', function() {
|
|
5
6
|
describe('invalid SQL', function() {
|
|
6
|
-
var db;
|
|
7
|
+
var db: sqlite3.Database;
|
|
7
8
|
before(function(done) { db = new sqlite3.Database(':memory:', done); });
|
|
8
9
|
|
|
9
10
|
var stmt;
|
|
10
11
|
it('should fail preparing a statement with invalid SQL', function(done) {
|
|
11
|
-
stmt = db.prepare('CRATE TALE foo text bar)', function(err, statement) {
|
|
12
|
+
stmt = db.prepare('CRATE TALE foo text bar)', function(err: null | DuckDbError, statement: Statement) {
|
|
12
13
|
if (err && err.errno == sqlite3.ERROR /*&&
|
|
13
14
|
err.message === 'Parser: syntax error at or near "CRATE' */) {
|
|
14
15
|
done();
|
|
@@ -21,7 +22,7 @@ describe('prepare', function() {
|
|
|
21
22
|
});
|
|
22
23
|
|
|
23
24
|
describe('simple prepared statement', function() {
|
|
24
|
-
var db;
|
|
25
|
+
var db: sqlite3.Database;
|
|
25
26
|
before(function(done) { db = new sqlite3.Database(':memory:', done); });
|
|
26
27
|
|
|
27
28
|
it('should prepare, run and finalize the statement', function(done) {
|
|
@@ -34,7 +35,7 @@ describe('prepare', function() {
|
|
|
34
35
|
});
|
|
35
36
|
|
|
36
37
|
describe('inserting and retrieving rows', function() {
|
|
37
|
-
var db;
|
|
38
|
+
var db: sqlite3.Database;
|
|
38
39
|
before(function(done) { db = new sqlite3.Database(':memory:', done); });
|
|
39
40
|
|
|
40
41
|
var inserted = 0;
|
|
@@ -54,7 +55,7 @@ describe('prepare', function() {
|
|
|
54
55
|
i,
|
|
55
56
|
i * Math.PI,
|
|
56
57
|
null,
|
|
57
|
-
function(err) {
|
|
58
|
+
function(err: null | Error) {
|
|
58
59
|
if (err) throw err;
|
|
59
60
|
inserted++;
|
|
60
61
|
}
|
|
@@ -67,12 +68,12 @@ describe('prepare', function() {
|
|
|
67
68
|
|
|
68
69
|
|
|
69
70
|
it('should prepare a statement and return values again', function(done) {
|
|
70
|
-
var stmt = db.prepare("SELECT txt, num, flt, blb FROM foo ORDER BY num", function(err) {
|
|
71
|
+
var stmt = db.prepare("SELECT txt, num, flt, blb FROM foo ORDER BY num", function(err: null | Error) {
|
|
71
72
|
if (err) throw err;
|
|
72
73
|
assert.equal(stmt.sql, 'SELECT txt, num, flt, blb FROM foo ORDER BY num');
|
|
73
74
|
});
|
|
74
75
|
|
|
75
|
-
stmt.each(function(err, row) {
|
|
76
|
+
stmt.each(function(err: null | Error, row: RowData) {
|
|
76
77
|
if (err) throw err;
|
|
77
78
|
assert.equal(row.txt, 'String ' + retrieved);
|
|
78
79
|
assert.equal(row.num, retrieved);
|
|
@@ -126,7 +127,7 @@ describe('prepare', function() {
|
|
|
126
127
|
|
|
127
128
|
|
|
128
129
|
describe('inserting with accidental undefined', function() {
|
|
129
|
-
var db;
|
|
130
|
+
var db: sqlite3.Database;
|
|
130
131
|
before(function(done) { db = new sqlite3.Database(':memory:', done); });
|
|
131
132
|
|
|
132
133
|
var inserted = 0;
|
|
@@ -137,10 +138,10 @@ describe('prepare', function() {
|
|
|
137
138
|
});
|
|
138
139
|
|
|
139
140
|
it('should insert two rows', function(done) {
|
|
140
|
-
db.prepare('INSERT INTO foo VALUES(4)').run(function(err) {
|
|
141
|
+
db.prepare('INSERT INTO foo VALUES(4)').run(function(err: null | Error) {
|
|
141
142
|
if (err) throw err;
|
|
142
143
|
inserted++;
|
|
143
|
-
}).run(undefined, function (err) {
|
|
144
|
+
}).run(undefined, function (err: null | Error) {
|
|
144
145
|
// The second time we pass undefined as a parameter. This is
|
|
145
146
|
// a mistake, but it should either throw an error or be ignored,
|
|
146
147
|
// not silently fail to run the statement.
|
|
@@ -174,13 +175,13 @@ describe('prepare', function() {
|
|
|
174
175
|
*/
|
|
175
176
|
|
|
176
177
|
it('should retrieve the data', function(done) {
|
|
177
|
-
var stmt = db.prepare("SELECT num FROM foo", function(err) {
|
|
178
|
+
var stmt = db.prepare("SELECT num FROM foo", function(err: null | Error) {
|
|
178
179
|
if (err) throw err;
|
|
179
180
|
});
|
|
180
181
|
|
|
181
|
-
stmt.each(function(err, row) {
|
|
182
|
+
stmt.each(function(err: null | Error, row: RowData) {
|
|
182
183
|
if (err) throw err;
|
|
183
|
-
assert(row);
|
|
184
|
+
assert.ok(row);
|
|
184
185
|
assert.equal(row.num, 4);
|
|
185
186
|
retrieved++;
|
|
186
187
|
});
|
|
@@ -267,7 +268,7 @@ describe('prepare', function() {
|
|
|
267
268
|
*/
|
|
268
269
|
|
|
269
270
|
describe('prepare() parameter binding', function() {
|
|
270
|
-
var db;
|
|
271
|
+
var db: sqlite3.Database;
|
|
271
272
|
before(function(done) { db = new sqlite3.Database(':memory:',
|
|
272
273
|
function(err) {
|
|
273
274
|
db.run("CREATE TEMPORARY VIEW foo AS SELECT * FROM read_csv_auto('test/support/prepare.csv')", done)
|
|
@@ -291,7 +292,7 @@ describe('prepare', function() {
|
|
|
291
292
|
|
|
292
293
|
it('should retrieve particular rows', function(done) {
|
|
293
294
|
db.prepare("SELECT txt, num, flt, blb FROM foo WHERE num = ? AND txt = ?")
|
|
294
|
-
.each(10, 'String 10', function(err, row) {
|
|
295
|
+
.each(10, 'String 10', function(err: null | Error, row: RowData) {
|
|
295
296
|
if (err) throw err;
|
|
296
297
|
assert.equal(row.txt, 'String 10');
|
|
297
298
|
assert.equal(row.num, 10);
|
|
@@ -310,7 +311,7 @@ describe('prepare', function() {
|
|
|
310
311
|
});
|
|
311
312
|
|
|
312
313
|
describe('all()', function() {
|
|
313
|
-
var db;
|
|
314
|
+
var db: sqlite3.Database;
|
|
314
315
|
before(function(done) { db = new sqlite3.Database(':memory:',
|
|
315
316
|
function(err) {
|
|
316
317
|
db.run("CREATE TEMPORARY VIEW foo AS SELECT * FROM read_csv_auto('test/support/prepare.csv')", done)
|
|
@@ -322,7 +323,7 @@ describe('prepare', function() {
|
|
|
322
323
|
|
|
323
324
|
it('should retrieve particular rows', function(done) {
|
|
324
325
|
db.prepare("SELECT txt, num, flt, blb FROM foo WHERE num < ? ORDER BY num")
|
|
325
|
-
.all(count, function(err, rows) {
|
|
326
|
+
.all(count, function(err: null | Error, rows: TableData) {
|
|
326
327
|
if (err) throw err;
|
|
327
328
|
for (var i = 0; i < rows.length; i++) {
|
|
328
329
|
assert.equal(rows[i].txt, 'String ' + i);
|
|
@@ -343,7 +344,7 @@ describe('prepare', function() {
|
|
|
343
344
|
});
|
|
344
345
|
|
|
345
346
|
describe('all()', function() {
|
|
346
|
-
var db;
|
|
347
|
+
var db: sqlite3.Database;
|
|
347
348
|
before(function(done) { db = new sqlite3.Database(':memory:',
|
|
348
349
|
function(err) {
|
|
349
350
|
db.run("CREATE TEMPORARY VIEW foo AS SELECT * FROM read_csv_auto('test/support/prepare.csv')", done)
|
|
@@ -352,7 +353,7 @@ describe('prepare', function() {
|
|
|
352
353
|
|
|
353
354
|
it('should retrieve particular rows', function(done) {
|
|
354
355
|
db.prepare("SELECT txt, num, flt, blb FROM foo WHERE num > 5000")
|
|
355
|
-
.all(function(err, rows) {
|
|
356
|
+
.all(function(err: null | Error, rows: TableData) {
|
|
356
357
|
if (err) throw err;
|
|
357
358
|
assert.ok(rows.length === 0);
|
|
358
359
|
})
|
|
@@ -363,7 +364,7 @@ describe('prepare', function() {
|
|
|
363
364
|
});
|
|
364
365
|
|
|
365
366
|
describe('high concurrency', function() {
|
|
366
|
-
var db;
|
|
367
|
+
var db: sqlite3.Database;
|
|
367
368
|
before(function(done) { db = new sqlite3.Database(':memory:', done); });
|
|
368
369
|
|
|
369
370
|
function randomString() {
|
|
@@ -378,10 +379,12 @@ describe('prepare', function() {
|
|
|
378
379
|
}
|
|
379
380
|
|
|
380
381
|
// Generate random data.
|
|
381
|
-
var data = [];
|
|
382
|
+
var data: [string, number, number, null][] = [];
|
|
383
|
+
var retrieved_marks: boolean[] = [];
|
|
382
384
|
var length = Math.floor(Math.random() * 1000) + 200;
|
|
383
385
|
for (var i = 0; i < length; i++) {
|
|
384
386
|
data.push([ randomString(), i, i * Math.random(), null ]);
|
|
387
|
+
retrieved_marks.push(false);
|
|
385
388
|
}
|
|
386
389
|
var inserted = 0;
|
|
387
390
|
var retrieved = 0;
|
|
@@ -393,7 +396,7 @@ describe('prepare', function() {
|
|
|
393
396
|
it('should insert all values', function(done) {
|
|
394
397
|
for (var i = 0; i < data.length; i++) {
|
|
395
398
|
var stmt = db.prepare("INSERT INTO foo VALUES(?, ?, ?, ?)");
|
|
396
|
-
stmt.run(data[i][0], data[i][1], data[i][2], data[i][3], function(err) {
|
|
399
|
+
stmt.run(data[i][0], data[i][1], data[i][2], data[i][3], function(err: null | Error) {
|
|
397
400
|
if (err) throw err;
|
|
398
401
|
inserted++;
|
|
399
402
|
}).finalize(function(err) {
|
|
@@ -405,11 +408,11 @@ describe('prepare', function() {
|
|
|
405
408
|
|
|
406
409
|
it('should retrieve all values', function(done) {
|
|
407
410
|
db.prepare("SELECT txt, num, flt, blb FROM foo")
|
|
408
|
-
.all(function(err, rows) {
|
|
411
|
+
.all(function(err: null | Error, rows: TableData) {
|
|
409
412
|
if (err) throw err;
|
|
410
413
|
|
|
411
414
|
for (var i = 0; i < rows.length; i++) {
|
|
412
|
-
assert.ok(
|
|
415
|
+
assert.ok(retrieved_marks[rows[i].num] !== true);
|
|
413
416
|
|
|
414
417
|
assert.equal(rows[i].txt, data[rows[i].num][0]);
|
|
415
418
|
assert.equal(rows[i].num, data[rows[i].num][1]);
|
|
@@ -417,7 +420,7 @@ describe('prepare', function() {
|
|
|
417
420
|
//assert.equal(rows[i].blb, data[rows[i].num][3]);
|
|
418
421
|
|
|
419
422
|
// Mark the data row as already retrieved.
|
|
420
|
-
|
|
423
|
+
retrieved_marks[rows[i].num] = true;
|
|
421
424
|
retrieved++;
|
|
422
425
|
|
|
423
426
|
}
|
|
@@ -462,7 +465,7 @@ describe('prepare', function() {
|
|
|
462
465
|
});
|
|
463
466
|
*/
|
|
464
467
|
describe('Database#run() and Database#all()', function() {
|
|
465
|
-
var db;
|
|
468
|
+
var db: sqlite3.Database;
|
|
466
469
|
before(function(done) { db = new sqlite3.Database(':memory:', done); });
|
|
467
470
|
|
|
468
471
|
var inserted = 0;
|
|
@@ -482,7 +485,7 @@ describe('prepare', function() {
|
|
|
482
485
|
i,
|
|
483
486
|
i * Math.PI,
|
|
484
487
|
null,
|
|
485
|
-
function(err) {
|
|
488
|
+
function(err: null | Error) {
|
|
486
489
|
if (err) throw err;
|
|
487
490
|
inserted++;
|
|
488
491
|
if (inserted == count) done();
|
|
@@ -492,7 +495,7 @@ describe('prepare', function() {
|
|
|
492
495
|
});
|
|
493
496
|
|
|
494
497
|
it('should retrieve all rows', function(done) {
|
|
495
|
-
db.all("SELECT txt, num, flt, blb FROM foo ORDER BY num", function(err, rows) {
|
|
498
|
+
db.all("SELECT txt, num, flt, blb FROM foo ORDER BY num", function(err: null | Error, rows: TableData) {
|
|
496
499
|
if (err) throw err;
|
|
497
500
|
for (var i = 0; i < rows.length; i++) {
|
|
498
501
|
assert.equal(rows[i].txt, 'String ' + i);
|
|
@@ -511,44 +514,44 @@ describe('prepare', function() {
|
|
|
511
514
|
|
|
512
515
|
describe('using aggregate functions', function() {
|
|
513
516
|
it("should aggregate string_agg(txt)", function (done) {
|
|
514
|
-
db.all("SELECT string_agg(txt, ',') as string_agg FROM foo WHERE num < 2", function (err, res) {
|
|
517
|
+
db.all("SELECT string_agg(txt, ',') as string_agg FROM foo WHERE num < 2", function (err: null | Error, res: TableData) {
|
|
515
518
|
assert.equal(res[0].string_agg, "String 0,String 1");
|
|
516
519
|
done(err);
|
|
517
520
|
});
|
|
518
521
|
});
|
|
519
522
|
|
|
520
523
|
it("should aggregate min(flt)", function (done) {
|
|
521
|
-
db.all("SELECT min(flt) as min FROM foo WHERE flt > 0", function (err, res) {
|
|
524
|
+
db.all("SELECT min(flt) as min FROM foo WHERE flt > 0", function (err: null | Error, res: TableData) {
|
|
522
525
|
assert.equal(res[0].min, Math.PI);
|
|
523
526
|
done(err);
|
|
524
527
|
});
|
|
525
528
|
});
|
|
526
529
|
it("should aggregate max(flt)", function (done) {
|
|
527
|
-
db.all("SELECT max(flt) as max FROM foo", function (err, res) {
|
|
530
|
+
db.all("SELECT max(flt) as max FROM foo", function (err: null | Error, res: TableData) {
|
|
528
531
|
assert.equal(res[0].max, Math.PI * 999);
|
|
529
532
|
done(err);
|
|
530
533
|
});
|
|
531
534
|
});
|
|
532
535
|
it("should aggregate avg(flt)", function (done) {
|
|
533
|
-
db.all("SELECT avg(flt) as avg FROM foo", function (err, res) {
|
|
536
|
+
db.all("SELECT avg(flt) as avg FROM foo", function (err: null | Error, res: TableData) {
|
|
534
537
|
assert.equal(res[0].avg, 1569.2255304681016);
|
|
535
538
|
done(err);
|
|
536
539
|
});
|
|
537
540
|
});
|
|
538
541
|
it("should aggregate first(flt)", function (done) {
|
|
539
|
-
db.all("SELECT first(flt) as first FROM foo WHERE flt > 0", function (err, res) {
|
|
542
|
+
db.all("SELECT first(flt) as first FROM foo WHERE flt > 0", function (err: null | Error, res: TableData) {
|
|
540
543
|
assert.equal(res[0].first, Math.PI);
|
|
541
544
|
done(err);
|
|
542
545
|
});
|
|
543
546
|
});
|
|
544
547
|
it("should aggregate approx_count_distinct(flt)", function (done) {
|
|
545
|
-
db.all("SELECT approx_count_distinct(flt) as approx_count_distinct FROM foo", function (err, res) {
|
|
548
|
+
db.all("SELECT approx_count_distinct(flt) as approx_count_distinct FROM foo", function (err: null | Error, res: TableData) {
|
|
546
549
|
assert.ok(res[0].approx_count_distinct >= 950);
|
|
547
550
|
done(err);
|
|
548
551
|
});
|
|
549
552
|
});
|
|
550
553
|
it("should aggregate sum(flt)", function (done) {
|
|
551
|
-
db.all("SELECT sum(flt) as sum FROM foo", function (err, res) {
|
|
554
|
+
db.all("SELECT sum(flt) as sum FROM foo", function (err: null | Error, res: TableData) {
|
|
552
555
|
assert.equal(res[0].sum, 1569225.5304681016);
|
|
553
556
|
done(err);
|
|
554
557
|
});
|
|
@@ -556,75 +559,75 @@ describe('prepare', function() {
|
|
|
556
559
|
|
|
557
560
|
|
|
558
561
|
it("should aggregate min(num)", function (done) {
|
|
559
|
-
db.all("SELECT min(num) as min FROM foo WHERE num > 0", function (err, res) {
|
|
562
|
+
db.all("SELECT min(num) as min FROM foo WHERE num > 0", function (err: null | Error, res: TableData) {
|
|
560
563
|
assert.equal(res[0].min, 1);
|
|
561
564
|
done(err);
|
|
562
565
|
});
|
|
563
566
|
});
|
|
564
567
|
it("should aggregate max(num)", function (done) {
|
|
565
|
-
db.all("SELECT max(num) as max FROM foo", function (err, res) {
|
|
568
|
+
db.all("SELECT max(num) as max FROM foo", function (err: null | Error, res: TableData) {
|
|
566
569
|
assert.equal(res[0].max, 999);
|
|
567
570
|
done(err);
|
|
568
571
|
});
|
|
569
572
|
});
|
|
570
573
|
it("should aggregate count(num)", function (done) {
|
|
571
|
-
db.all("SELECT count(num) as count FROM foo", function (err, res) {
|
|
574
|
+
db.all("SELECT count(num) as count FROM foo", function (err: null | Error, res: TableData) {
|
|
572
575
|
assert.equal(res[0].count, 1000);
|
|
573
576
|
done(err);
|
|
574
577
|
});
|
|
575
578
|
});
|
|
576
579
|
it("should aggregate avg(num)", function (done) {
|
|
577
|
-
db.all("SELECT avg(num) as avg FROM foo", function (err, res) {
|
|
580
|
+
db.all("SELECT avg(num) as avg FROM foo", function (err: null | Error, res: TableData) {
|
|
578
581
|
assert.equal(res[0].avg, 499.5);
|
|
579
582
|
done(err);
|
|
580
583
|
});
|
|
581
584
|
});
|
|
582
585
|
it("should aggregate first(num)", function (done) {
|
|
583
|
-
db.all("SELECT first(num) as first FROM foo WHERE num > 0", function (err, res) {
|
|
586
|
+
db.all("SELECT first(num) as first FROM foo WHERE num > 0", function (err: null | Error, res: TableData) {
|
|
584
587
|
assert.equal(res[0].first, 1);
|
|
585
588
|
done(err);
|
|
586
589
|
});
|
|
587
590
|
});
|
|
588
591
|
it("should aggregate approx_count_distinct(num)", function (done) {
|
|
589
|
-
db.all("SELECT approx_count_distinct(num) as approx_count_distinct FROM foo", function (err, res) {
|
|
592
|
+
db.all("SELECT approx_count_distinct(num) as approx_count_distinct FROM foo", function (err: null | Error, res: TableData) {
|
|
590
593
|
assert.ok(res[0].approx_count_distinct >= 950);
|
|
591
594
|
done(err);
|
|
592
595
|
});
|
|
593
596
|
});
|
|
594
597
|
it("should aggregate approx_quantile(num, 0.5)", function (done) {
|
|
595
|
-
db.all("SELECT approx_quantile(num, 0.5) as approx_quantile FROM foo", function (err, res) {
|
|
598
|
+
db.all("SELECT approx_quantile(num, 0.5) as approx_quantile FROM foo", function (err: null | Error, res: TableData) {
|
|
596
599
|
assert.ok(res[0].approx_quantile >= 499);
|
|
597
600
|
done(err);
|
|
598
601
|
});
|
|
599
602
|
});
|
|
600
603
|
it("should aggregate reservoir_quantile(num, 0.5, 10)", function (done) {
|
|
601
|
-
db.all("SELECT reservoir_quantile(num, 0.5, 10) as reservoir_quantile FROM foo", function (err, res) {
|
|
604
|
+
db.all("SELECT reservoir_quantile(num, 0.5, 10) as reservoir_quantile FROM foo", function (err: null | Error, res: TableData) {
|
|
602
605
|
assert.equal(res[0].reservoir_quantile, 4);
|
|
603
606
|
done(err);
|
|
604
607
|
});
|
|
605
608
|
});
|
|
606
609
|
it("should aggregate var_samp(num)", function (done) {
|
|
607
|
-
db.all("SELECT var_samp(num) as var_samp FROM foo", function (err, res) {
|
|
610
|
+
db.all("SELECT var_samp(num) as var_samp FROM foo", function (err: null | Error, res: TableData) {
|
|
608
611
|
assert.equal(res[0].var_samp, 83416.66666666667);
|
|
609
612
|
done(err);
|
|
610
613
|
});
|
|
611
614
|
});
|
|
612
615
|
it("should aggregate kurtosis(num)", function (done) {
|
|
613
|
-
db.all("SELECT kurtosis(num) as kurtosis FROM foo", function (err, res) {
|
|
616
|
+
db.all("SELECT kurtosis(num) as kurtosis FROM foo", function (err: null | Error, res: TableData) {
|
|
614
617
|
assert.equal(res[0].kurtosis, -1.1999999999999997);
|
|
615
618
|
done(err);
|
|
616
619
|
});
|
|
617
620
|
});
|
|
618
621
|
|
|
619
622
|
it("should aggregate sum(num)", function (done) {
|
|
620
|
-
db.all("SELECT sum(num) as sum FROM foo", function (err, res) {
|
|
623
|
+
db.all("SELECT sum(num) as sum FROM foo", function (err: null | Error, res: TableData) {
|
|
621
624
|
assert.equal(res[0].sum, 499500);
|
|
622
625
|
done(err);
|
|
623
626
|
});
|
|
624
627
|
});
|
|
625
628
|
|
|
626
629
|
it("should aggregate product(num)", function (done) {
|
|
627
|
-
db.all("SELECT product(num) as product FROM foo WHERE num < 20 AND num > 0", function (err, res) {
|
|
630
|
+
db.all("SELECT product(num) as product FROM foo WHERE num < 20 AND num > 0", function (err: null | Error, res: TableData) {
|
|
628
631
|
assert.equal(res[0].product, 121645100408832000);
|
|
629
632
|
done(err);
|
|
630
633
|
});
|
|
@@ -632,7 +635,7 @@ describe('prepare', function() {
|
|
|
632
635
|
|
|
633
636
|
|
|
634
637
|
it("should aggregate product(flt)", function (done) {
|
|
635
|
-
db.all("SELECT product(flt) as product FROM foo WHERE num < 10 AND num > 0", function (err, res) {
|
|
638
|
+
db.all("SELECT product(flt) as product FROM foo WHERE num < 10 AND num > 0", function (err: null | Error, res: TableData) {
|
|
636
639
|
assert.equal(res[0].product, 10817125966.120956);
|
|
637
640
|
done(err);
|
|
638
641
|
});
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import * as duckdb from '..';
|
|
2
|
+
import * as assert from 'assert';
|
|
3
3
|
|
|
4
4
|
describe('QueryResult', () => {
|
|
5
5
|
const total = 1000;
|
|
6
6
|
|
|
7
|
-
let db;
|
|
8
|
-
let conn;
|
|
7
|
+
let db: duckdb.Database;
|
|
8
|
+
let conn: duckdb.Connection;
|
|
9
9
|
before((done) => {
|
|
10
10
|
db = new duckdb.Database(':memory:', () => {
|
|
11
11
|
conn = new duckdb.Connection(db, done);
|