Skip to content

Commit 98e5002

Browse files
committed
fix binding strings with nulls; update param type tests
1 parent a2c89ad commit 98e5002

File tree

2 files changed

+11
-13
lines changed

2 files changed

+11
-13
lines changed

bindings/src/duckdb_node_bindings.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2037,7 +2037,7 @@ class DuckDBNodeAddon : public Napi::Addon<DuckDBNodeAddon> {
20372037
auto prepared_statement = GetPreparedStatementFromExternal(env, info[0]);
20382038
auto index = info[1].As<Napi::Number>().Uint32Value();
20392039
std::string value = info[2].As<Napi::String>();
2040-
if (duckdb_bind_varchar(prepared_statement, index, value.c_str())) {
2040+
if (duckdb_bind_varchar_length(prepared_statement, index, value.c_str(), value.size())) {
20412041
throw Napi::Error::New(env, "Failed to bind varchar");
20422042
}
20432043
return env.Undefined();
@@ -2221,7 +2221,7 @@ class DuckDBNodeAddon : public Napi::Addon<DuckDBNodeAddon> {
22212221
Napi::Value create_varchar(const Napi::CallbackInfo& info) {
22222222
auto env = info.Env();
22232223
std::string text = info[0].As<Napi::String>();
2224-
auto value = duckdb_create_varchar(text.c_str());
2224+
auto value = duckdb_create_varchar_length(text.c_str(), text.size());
22252225
return CreateExternalForValue(env, value);
22262226
}
22272227

@@ -3634,7 +3634,7 @@ class DuckDBNodeAddon : public Napi::Addon<DuckDBNodeAddon> {
36343634
auto env = info.Env();
36353635
auto appender = GetAppenderFromExternal(env, info[0]);
36363636
std::string str = info[1].As<Napi::String>();
3637-
if (duckdb_append_varchar(appender, str.c_str())) {
3637+
if (duckdb_append_varchar_length(appender, str.c_str(), str.size())) {
36383638
throw Napi::Error::New(env, duckdb_appender_error(appender));
36393639
}
36403640
return env.Undefined();

bindings/test/prepared_statements.test.ts

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -119,25 +119,23 @@ suite('prepared statements', () => {
119119
expect(duckdb.parameter_name(prepared, 1)).toBe('x');
120120
expect(duckdb.bind_parameter_index(prepared, 'x')).toBe(1);
121121
duckdb.bind_int32(prepared, 1, 11);
122-
// param_type doesn't appear to work for named parameters
123-
// expect(duckdb.param_type(prepared, 1)).toBe(duckdb.Type.INTEGER);
122+
expect(duckdb.param_type(prepared, 1)).toBe(duckdb.Type.INTEGER);
124123

125124
expect(duckdb.parameter_name(prepared, 2)).toBe('y');
126125
expect(duckdb.bind_parameter_index(prepared, 'y')).toBe(2);
127-
duckdb.bind_int32(prepared, 2, 22);
128-
// param_type doesn't appear to work for named parameters
129-
// expect(duckdb.param_type(prepared, 2)).toBe(duckdb.Type.INTEGER);
126+
duckdb.bind_varchar(prepared, 2, 'a');
127+
// expect(duckdb.param_type(prepared, 2)).toBe(duckdb.Type.VARCHAR); // TODO 1.2.0 - param_type is returning INVALID for VARCHAR
130128

131129
const result = await duckdb.execute_prepared(prepared);
132130
await expectResult(result, {
133131
chunkCount: 1,
134132
rowCount: 1,
135133
columns: [
136134
{ name: 'a', logicalType: INTEGER },
137-
{ name: 'b', logicalType: INTEGER },
135+
{ name: 'b', logicalType: VARCHAR },
138136
],
139137
chunks: [
140-
{ rowCount: 1, vectors: [data(4, [true], [11]), data(4, [true], [22])] },
138+
{ rowCount: 1, vectors: [data(4, [true], [11]), data(16, [true], ['a'])] },
141139
],
142140
});
143141
});
@@ -258,8 +256,8 @@ suite('prepared statements', () => {
258256
duckdb.bind_interval(prepared, 19, { months: 999, days: 999, micros: 999999999n });
259257
expect(duckdb.param_type(prepared, 19)).toBe(duckdb.Type.INTERVAL);
260258

261-
duckdb.bind_varchar(prepared, 20, '🦆🦆🦆🦆🦆🦆');
262-
// expect(duckdb.param_type(prepared, 20)).toBe(duckdb.Type.VARCHAR); // TODO 1.2.0 - Why does this check fail?
259+
duckdb.bind_varchar(prepared, 20, '🦆🦆🦆\x00🦆🦆🦆');
260+
// expect(duckdb.param_type(prepared, 20)).toBe(duckdb.Type.VARCHAR); // TODO 1.2.0 - param_type is returning INVALID for VARCHAR
263261

264262
duckdb.bind_blob(prepared, 21, Buffer.from('thisisalongblob\x00withnullbytes'));
265263
expect(duckdb.param_type(prepared, 21)).toBe(duckdb.Type.BLOB);
@@ -318,7 +316,7 @@ suite('prepared statements', () => {
318316
data(8, [true], [9223372036854775806n]),
319317
data(8, [true], [9223372036854775806n]),
320318
data(16, [true], [{ months: 999, days: 999, micros: 999999999n }]),
321-
data(16, [true], ['🦆🦆🦆🦆🦆🦆']),
319+
data(16, [true], ['🦆🦆🦆\x00🦆🦆🦆']),
322320
data(16, [true], [Buffer.from('thisisalongblob\x00withnullbytes')]),
323321
data(4, [false], [null]),
324322
]

0 commit comments

Comments
 (0)