Skip to content

Commit

Permalink
Merge pull request #26 from duckdb/jray/updates-for-v1.1.1
Browse files Browse the repository at this point in the history
updates for v1.1.1
  • Loading branch information
jraymakers authored Oct 18, 2024
2 parents 4e5d25c + 37771bd commit fe31928
Show file tree
Hide file tree
Showing 8 changed files with 1,029 additions and 54 deletions.
1 change: 1 addition & 0 deletions bindings/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,5 @@ pkgs/**/*.so
pkgs/**/*.dylib
pkgs/**/*.dll
test/tsconfig.tsbuildinfo
*Sigs.json
__pycache__
224 changes: 215 additions & 9 deletions bindings/pkgs/@duckdb/node-bindings/duckdb.d.ts

Large diffs are not rendered by default.

595 changes: 568 additions & 27 deletions bindings/src/duckdb_node_bindings.cpp

Large diffs are not rendered by default.

7 changes: 6 additions & 1 deletion bindings/test/appender.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ suite('appender', () => {
varchar varchar, \
blob blob, \
null_column integer, \
integer_with_default integer default 42\
)');
try {
await expectResult(createResult, {
Expand All @@ -107,7 +108,7 @@ suite('appender', () => {

const appender = duckdb.appender_create(connection, 'main', 'appender_target');
try {
expect(duckdb.appender_column_count(appender)).toBe(20);
expect(duckdb.appender_column_count(appender)).toBe(21);

const expectedLogicalTypes = [
BOOLEAN,
Expand All @@ -130,6 +131,7 @@ suite('appender', () => {
VARCHAR,
BLOB,
INTEGER,
INTEGER,
];
for (let i = 0; i < expectLogicalType.length; i++) {
const column_type = duckdb.appender_column_type(appender, i);
Expand Down Expand Up @@ -160,6 +162,7 @@ suite('appender', () => {
duckdb.append_varchar(appender, '🦆🦆🦆🦆🦆🦆');
duckdb.append_blob(appender, Buffer.from('thisisalongblob\x00withnullbytes'));
duckdb.append_null(appender);
duckdb.append_default(appender);

duckdb.appender_end_row(appender);
// explicitly calling flush and close is unnecessary because destroy does both, but this exercises them.
Expand Down Expand Up @@ -193,6 +196,7 @@ suite('appender', () => {
{ name: 'varchar', logicalType: VARCHAR },
{ name: 'blob', logicalType: BLOB },
{ name: 'null_column', logicalType: INTEGER },
{ name: 'integer_with_default', logicalType: INTEGER },
],
chunks: [
{
Expand All @@ -218,6 +222,7 @@ suite('appender', () => {
data(16, [true], ['🦆🦆🦆🦆🦆🦆']),
data(16, [true], [Buffer.from('thisisalongblob\x00withnullbytes')]),
data(4, [false], [null]),
data(4, [true], [42]),
],
},
],
Expand Down
6 changes: 6 additions & 0 deletions bindings/test/enums.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,9 @@ suite('enums', () => {
expect(duckdb.Type.BIT).toBe(29);
expect(duckdb.Type.TIME_TZ).toBe(30);
expect(duckdb.Type.TIMESTAMP_TZ).toBe(31);
expect(duckdb.Type.ANY).toBe(34);
expect(duckdb.Type.VARINT).toBe(35);
expect(duckdb.Type.SQLNULL).toBe(36);

expect(duckdb.Type[duckdb.Type.BOOLEAN]).toBe('BOOLEAN')
expect(duckdb.Type[duckdb.Type.TINYINT]).toBe('TINYINT');
Expand Down Expand Up @@ -140,5 +143,8 @@ suite('enums', () => {
expect(duckdb.Type[duckdb.Type.BIT]).toBe('BIT');
expect(duckdb.Type[duckdb.Type.TIME_TZ]).toBe('TIME_TZ');
expect(duckdb.Type[duckdb.Type.TIMESTAMP_TZ]).toBe('TIMESTAMP_TZ');
expect(duckdb.Type[duckdb.Type.ANY]).toBe('ANY');
expect(duckdb.Type[duckdb.Type.VARINT]).toBe('VARINT');
expect(duckdb.Type[duckdb.Type.SQLNULL]).toBe('SQLNULL');
});
});
4 changes: 3 additions & 1 deletion bindings/test/logical_type.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,13 @@ import duckdb from '@duckdb/node-bindings';
import { expect, suite, test } from 'vitest';

suite('logical_type', () => {
test('create, get, and destroy', () => {
test('create, get id, get/set alias, and destroy', () => {
const int_type = duckdb.create_logical_type(duckdb.Type.INTEGER);
try {
expect(duckdb.get_type_id(int_type)).toBe(duckdb.Type.INTEGER);
expect(duckdb.logical_type_get_alias(int_type)).toBeNull();
duckdb.logical_type_set_alias(int_type, 'my_logical_type');
expect(duckdb.logical_type_get_alias(int_type)).toBe('my_logical_type');
} finally {
duckdb.destroy_logical_type(int_type);
}
Expand Down
25 changes: 17 additions & 8 deletions bindings/test/prepared_statements.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import {
STRUCT,
TIME,
TIMESTAMP,
TIMESTAMP_TZ,
TINYINT,
UBIGINT,
UHUGEINT,
Expand Down Expand Up @@ -223,6 +224,7 @@ suite('prepared statements', () => {
? as date, \
? as time, \
? as timestamp, \
? as timestamp_tz, \
? as interval, \
? as varchar, \
? as blob, \
Expand Down Expand Up @@ -280,17 +282,20 @@ suite('prepared statements', () => {
duckdb.bind_timestamp(prepared, 17, { micros: 9223372036854775806n });
expect(duckdb.param_type(prepared, 17)).toBe(duckdb.Type.TIMESTAMP);

duckdb.bind_interval(prepared, 18, { months: 999, days: 999, micros: 999999999n });
expect(duckdb.param_type(prepared, 18)).toBe(duckdb.Type.INTERVAL);
duckdb.bind_timestamp_tz(prepared, 18, { micros: 9223372036854775806n });
expect(duckdb.param_type(prepared, 18)).toBe(duckdb.Type.TIMESTAMP_TZ);

duckdb.bind_varchar(prepared, 19, '🦆🦆🦆🦆🦆🦆');
expect(duckdb.param_type(prepared, 19)).toBe(duckdb.Type.VARCHAR);
duckdb.bind_interval(prepared, 19, { months: 999, days: 999, micros: 999999999n });
expect(duckdb.param_type(prepared, 19)).toBe(duckdb.Type.INTERVAL);

duckdb.bind_blob(prepared, 20, Buffer.from('thisisalongblob\x00withnullbytes'));
expect(duckdb.param_type(prepared, 20)).toBe(duckdb.Type.BLOB);
duckdb.bind_varchar(prepared, 20, '🦆🦆🦆🦆🦆🦆');
expect(duckdb.param_type(prepared, 20)).toBe(duckdb.Type.VARCHAR);

duckdb.bind_null(prepared, 21);
expect(duckdb.param_type(prepared, 21)).toBe(duckdb.Type.SQLNULL);
duckdb.bind_blob(prepared, 21, Buffer.from('thisisalongblob\x00withnullbytes'));
expect(duckdb.param_type(prepared, 21)).toBe(duckdb.Type.BLOB);

duckdb.bind_null(prepared, 22);
expect(duckdb.param_type(prepared, 22)).toBe(duckdb.Type.SQLNULL);

const result = await duckdb.execute_prepared(prepared);
try {
Expand All @@ -313,6 +318,7 @@ suite('prepared statements', () => {
{ name: 'date', logicalType: DATE },
{ name: 'time', logicalType: TIME },
{ name: 'timestamp', logicalType: TIMESTAMP },
{ name: 'timestamp_tz', logicalType: TIMESTAMP_TZ },
{ name: 'interval', logicalType: INTERVAL },
{ name: 'varchar', logicalType: VARCHAR },
{ name: 'blob', logicalType: BLOB },
Expand All @@ -339,6 +345,7 @@ suite('prepared statements', () => {
data(4, [true], [2147483646]),
data(8, [true], [86400000000n]),
data(8, [true], [9223372036854775806n]),
data(8, [true], [9223372036854775806n]),
data(16, [true], [{ months: 999, days: 999, micros: 999999999n }]),
data(16, [true], ['🦆🦆🦆🦆🦆🦆']),
data(16, [true], [Buffer.from('thisisalongblob\x00withnullbytes')]),
Expand Down Expand Up @@ -383,6 +390,8 @@ suite('prepared statements', () => {
duckdb.bind_value(prepared, 3, array_value);
expect(duckdb.param_type(prepared, 3)).toBe(duckdb.Type.ARRAY);

// TODO: map value?

const result = await duckdb.execute_prepared(prepared);
try {
await expectResult(result, {
Expand Down
221 changes: 213 additions & 8 deletions bindings/test/values.test.ts
Original file line number Diff line number Diff line change
@@ -1,23 +1,228 @@
import duckdb from '@duckdb/node-bindings';
import { expect, suite, test } from 'vitest';
import { expectLogicalType } from './utils/expectLogicalType';
import {
BIGINT,
BLOB,
BOOLEAN,
DATE,
DOUBLE,
FLOAT,
HUGEINT,
INTEGER,
INTERVAL,
SMALLINT,
TIME,
TIME_TZ,
TIMESTAMP,
TINYINT,
UBIGINT,
UHUGEINT,
UINTEGER,
USMALLINT,
UTINYINT,
VARCHAR,
} from './utils/expectedLogicalTypes';

suite('values', () => {
test('varchar', () => {
const varchar_text = 'varchar_text';
const varchar_value = duckdb.create_varchar(varchar_text);
test('bool', () => {
const input = true;
const bool_value = duckdb.create_bool(input);
try {
expect(duckdb.get_varchar(varchar_value)).toBe(varchar_text);
expectLogicalType(duckdb.get_value_type(bool_value), BOOLEAN);
expect(duckdb.get_bool(bool_value)).toBe(input);
} finally {
duckdb.destroy_value(varchar_value);
duckdb.destroy_value(bool_value);
}
});
test('int8', () => {
const input = 127;
const int8_value = duckdb.create_int8(input);
try {
expectLogicalType(duckdb.get_value_type(int8_value), TINYINT);
expect(duckdb.get_int8(int8_value)).toBe(input);
} finally {
duckdb.destroy_value(int8_value);
}
});
test('uint8', () => {
const input = 255;
const uint8_value = duckdb.create_uint8(input);
try {
expectLogicalType(duckdb.get_value_type(uint8_value), UTINYINT);
expect(duckdb.get_uint8(uint8_value)).toBe(input);
} finally {
duckdb.destroy_value(uint8_value);
}
});
test('int16', () => {
const input = 32767;
const int16_value = duckdb.create_int16(input);
try {
expectLogicalType(duckdb.get_value_type(int16_value), SMALLINT);
expect(duckdb.get_int16(int16_value)).toBe(input);
} finally {
duckdb.destroy_value(int16_value);
}
});
test('uint16', () => {
const input = 65535;
const uint16_value = duckdb.create_uint16(input);
try {
expectLogicalType(duckdb.get_value_type(uint16_value), USMALLINT);
expect(duckdb.get_uint16(uint16_value)).toBe(input);
} finally {
duckdb.destroy_value(uint16_value);
}
});
test('int32', () => {
const input = 2147483647;
const int32_value = duckdb.create_int32(input);
try {
expectLogicalType(duckdb.get_value_type(int32_value), INTEGER);
expect(duckdb.get_int32(int32_value)).toBe(input);
} finally {
duckdb.destroy_value(int32_value);
}
});
test('uint32', () => {
const input = 4294967295;
const uint32_value = duckdb.create_uint32(input);
try {
expectLogicalType(duckdb.get_value_type(uint32_value), UINTEGER);
expect(duckdb.get_uint32(uint32_value)).toBe(input);
} finally {
duckdb.destroy_value(uint32_value);
}
});
test('int64', () => {
const int64_bigint = 12345n;
const int64_value = duckdb.create_int64(int64_bigint);
const input = 9223372036854775807n;
const int64_value = duckdb.create_int64(input);
try {
expect(duckdb.get_int64(int64_value)).toBe(int64_bigint);
expectLogicalType(duckdb.get_value_type(int64_value), BIGINT);
expect(duckdb.get_int64(int64_value)).toBe(input);
} finally {
duckdb.destroy_value(int64_value);
}
});
test('uint64', () => {
const input = 18446744073709551615n;
const uint64_value = duckdb.create_uint64(input);
try {
expectLogicalType(duckdb.get_value_type(uint64_value), UBIGINT);
expect(duckdb.get_uint64(uint64_value)).toBe(input);
} finally {
duckdb.destroy_value(uint64_value);
}
});
test('hugeint', () => {
const input = 170141183460469231731687303715884105727n;
const hugeint_value = duckdb.create_hugeint(input);
try {
expectLogicalType(duckdb.get_value_type(hugeint_value), HUGEINT);
expect(duckdb.get_hugeint(hugeint_value)).toBe(input);
} finally {
duckdb.destroy_value(hugeint_value);
}
});
test('uhugeint', () => {
const input = 340282366920938463463374607431768211455n;
const uhugeint_value = duckdb.create_uhugeint(input);
try {
expectLogicalType(duckdb.get_value_type(uhugeint_value), UHUGEINT);
expect(duckdb.get_uhugeint(uhugeint_value)).toBe(input);
} finally {
duckdb.destroy_value(uhugeint_value);
}
});
test('float', () => {
const input = 3.4028234663852886e+38;
const float_value = duckdb.create_float(input);
try {
expectLogicalType(duckdb.get_value_type(float_value), FLOAT);
expect(duckdb.get_float(float_value)).toBe(input);
} finally {
duckdb.destroy_value(float_value);
}
});
test('double', () => {
const input = 1.7976931348623157e+308;
const double_value = duckdb.create_double(input);
try {
expectLogicalType(duckdb.get_value_type(double_value), DOUBLE);
expect(duckdb.get_double(double_value)).toBe(input);
} finally {
duckdb.destroy_value(double_value);
}
});
test('date', () => {
const input = { days: 2147483646 };
const date_value = duckdb.create_date(input);
try {
expectLogicalType(duckdb.get_value_type(date_value), DATE);
expect(duckdb.get_date(date_value)).toStrictEqual(input);
} finally {
duckdb.destroy_value(date_value);
}
});
test('time', () => {
const input = { micros: 86400000000 };
const time_value = duckdb.create_time(input);
try {
expectLogicalType(duckdb.get_value_type(time_value), TIME);
expect(duckdb.get_time(time_value)).toStrictEqual(input);
} finally {
duckdb.destroy_value(time_value);
}
});
test('time_tz', () => {
const input = { bits: 1449551462400115198n };
const time_tz_value = duckdb.create_time_tz_value(input);
try {
expectLogicalType(duckdb.get_value_type(time_tz_value), TIME_TZ);
expect(duckdb.get_time_tz(time_tz_value)).toStrictEqual(input);
} finally {
duckdb.destroy_value(time_tz_value);
}
});
test('timestamp', () => {
const input = { micros: 9223372036854775806n };
const timestamp_value = duckdb.create_timestamp(input);
try {
expectLogicalType(duckdb.get_value_type(timestamp_value), TIMESTAMP);
expect(duckdb.get_timestamp(timestamp_value)).toStrictEqual(input);
} finally {
duckdb.destroy_value(timestamp_value);
}
});
test('interval', () => {
const input = { months: 999, days: 999, micros: 999999999n };
const interval_value = duckdb.create_interval(input);
try {
expectLogicalType(duckdb.get_value_type(interval_value), INTERVAL);
expect(duckdb.get_interval(interval_value)).toStrictEqual(input);
} finally {
duckdb.destroy_value(interval_value);
}
});
test('blob', () => {
const input = Buffer.from('thisisalongblob\x00withnullbytes');
const blob_value = duckdb.create_blob(input);
try {
expectLogicalType(duckdb.get_value_type(blob_value), BLOB);
expect(duckdb.get_blob(blob_value)).toStrictEqual(input);
} finally {
duckdb.destroy_value(blob_value);
}
});
test('varchar', () => {
const input = 'varchar_text';
const varchar_value = duckdb.create_varchar(input);
try {
expectLogicalType(duckdb.get_value_type(varchar_value), VARCHAR);
expect(duckdb.get_varchar(varchar_value)).toBe(input);
} finally {
duckdb.destroy_value(varchar_value);
}
});
});

0 comments on commit fe31928

Please sign in to comment.