Skip to content

Commit 74c0767

Browse files
committed
Improved from_string for SparseVector
1 parent 5f3aff7 commit 74c0767

File tree

2 files changed

+21
-27
lines changed

2 files changed

+21
-27
lines changed

include/pgvector/pqxx.hpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -130,16 +130,16 @@ template <> struct string_traits<pgvector::SparseVector> {
130130
throw conversion_error("Malformed sparsevec literal");
131131
}
132132

133-
int dimensions = std::stoi(std::string(text.substr(n + 2)));
133+
int dimensions = pqxx::from_string<int>(text.substr(n + 2));
134134
if (dimensions < 0) {
135-
throw conversion_error("Malformed sparsevec literal");
135+
throw conversion_error("Dimensions cannot be negative");
136136
}
137137

138138
std::vector<int> indices;
139139
std::vector<float> values;
140140

141141
if (n > 1) {
142-
std::istringstream ss(std::string(text.substr(1, n)));
142+
std::istringstream ss(std::string(text.substr(1, n - 1)));
143143
while (ss.good()) {
144144
std::string substr;
145145
std::getline(ss, substr, ',');
@@ -149,11 +149,11 @@ template <> struct string_traits<pgvector::SparseVector> {
149149
throw conversion_error("Malformed sparsevec literal");
150150
}
151151

152-
int index = std::stoi(substr.substr(0, ne));
153-
float value = std::stof(substr.substr(ne + 1));
152+
int index = pqxx::from_string<int>(substr.substr(0, ne));
153+
float value = pqxx::from_string<float>(substr.substr(ne + 1));
154154

155155
if (index < 1) {
156-
throw conversion_error("Malformed sparsevec literal");
156+
throw conversion_error("Index out of bounds");
157157
}
158158

159159
indices.push_back(index - 1);

test/pqxx_test.cpp

Lines changed: 15 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -241,27 +241,25 @@ void test_sparsevec_from_string() {
241241
assert(std::string_view(e.what()) == "Malformed sparsevec literal");
242242
}
243243

244-
// TODO change to pqxx::conversion_error
245244
try {
246245
auto unused = pqxx::from_string<pgvector::SparseVector>("{ }/");
247246
assert(false);
248-
} catch (const std::invalid_argument& e) {
249-
assert(true);
247+
} catch (const pqxx::conversion_error& e) {
248+
assert(std::string_view(e.what()) == "Could not convert '' to int");
250249
}
251250

252251
try {
253252
auto unused = pqxx::from_string<pgvector::SparseVector>("{}/-1");
254253
assert(false);
255254
} catch (const pqxx::conversion_error& e) {
256-
assert(std::string_view(e.what()) == "Malformed sparsevec literal");
255+
assert(std::string_view(e.what()) == "Dimensions cannot be negative");
257256
}
258257

259-
// TODO change to pqxx::conversion_error
260258
try {
261259
auto unused = pqxx::from_string<pgvector::SparseVector>("{:}/1");
262260
assert(false);
263-
} catch (const std::invalid_argument& e) {
264-
assert(true);
261+
} catch (const pqxx::conversion_error& e) {
262+
assert(std::string_view(e.what()) == "Could not convert '' to int");
265263
}
266264

267265
try {
@@ -275,46 +273,42 @@ void test_sparsevec_from_string() {
275273
auto unused = pqxx::from_string<pgvector::SparseVector>("{0:1}/1");
276274
assert(false);
277275
} catch (const pqxx::conversion_error& e) {
278-
assert(std::string_view(e.what()) == "Malformed sparsevec literal");
276+
assert(std::string_view(e.what()) == "Index out of bounds");
279277
}
280278

281279
try {
282280
auto unused = pqxx::from_string<pgvector::SparseVector>("{-2147483648:1}/1");
283281
assert(false);
284282
} catch (const pqxx::conversion_error& e) {
285-
assert(std::string_view(e.what()) == "Malformed sparsevec literal");
283+
assert(std::string_view(e.what()) == "Index out of bounds");
286284
}
287285

288-
// TODO change to pqxx::conversion_error
289286
try {
290287
auto unused = pqxx::from_string<pgvector::SparseVector>("{1:4e38}/1");
291288
assert(false);
292-
} catch (const std::out_of_range& e) {
293-
assert(true);
289+
} catch (const pqxx::conversion_error& e) {
290+
assert(std::string_view(e.what()) == "Could not convert string to numeric value: '4e38'." || std::string_view(e.what()) == "Could not convert '4e38' to float");
294291
}
295292

296-
// TODO change to pqxx::conversion_error
297293
try {
298294
auto unused = pqxx::from_string<pgvector::SparseVector>("{a:1}/1");
299295
assert(false);
300-
} catch (const std::invalid_argument& e) {
301-
assert(true);
296+
} catch (const pqxx::conversion_error& e) {
297+
assert(std::string_view(e.what()) == "Could not convert 'a' to int");
302298
}
303299

304-
// TODO change to pqxx::conversion_error
305300
try {
306301
auto unused = pqxx::from_string<pgvector::SparseVector>("{1:a}/1");
307302
assert(false);
308-
} catch (const std::invalid_argument& e) {
309-
assert(true);
303+
} catch (const pqxx::conversion_error& e) {
304+
assert(std::string_view(e.what()) == "Could not convert string to numeric value: 'a'." || std::string_view(e.what()) == "Could not convert 'a' to float");
310305
}
311306

312-
// TODO change to pqxx::conversion_error
313307
try {
314308
auto unused = pqxx::from_string<pgvector::SparseVector>("{}/a");
315309
assert(false);
316-
} catch (const std::invalid_argument& e) {
317-
assert(true);
310+
} catch (const pqxx::conversion_error& e) {
311+
assert(std::string_view(e.what()) == "Could not convert 'a' to int");
318312
}
319313
}
320314

0 commit comments

Comments
 (0)