Allow non-string types to be used in "in" expressions (#211)

* Allow non-string types to be used in "in" expressions

* No unidecode smashing in "in" expressions, though!

* Update version and changelog
This commit is contained in:
Erica Fischer
2024-03-04 10:16:48 -08:00
committed by GitHub
parent 6a8f1b83d8
commit 021bb96aeb
3 changed files with 12 additions and 9 deletions
+4
View File
@@ -1,3 +1,7 @@
# 2.49.0
* FSL-style "in" expressions now allow numeric comparisons, but they no longer use unidecode to remove diacritics.
# 2.48.0
* Fix some undefined behavior bugs, one of which results in slight changes to line simplification choices
+7 -8
View File
@@ -387,22 +387,21 @@ static int eval(std::function<mvt_value(std::string const &)> feature, json_obje
if (f->value.array.array[2]->type == JSON_ARRAY &&
(strcmp(f->value.array.array[1]->value.string.string, "in") == 0 ||
strcmp(f->value.array.array[1]->value.string.string, "ni") == 0)) {
std::string s = mvt_value_to_string(lhs, fail, unidecode_data);
static std::vector<std::string> no_unidecode_data;
std::string s = mvt_value_to_string(lhs, fail, no_unidecode_data);
if (fail) {
return -1; // null in anything => false
}
bool contains = false;
for (size_t i = 0; i < f->value.array.array[2]->value.array.length; i++) {
if (f->value.array.array[2]->value.array.array[i]->type != JSON_STRING) {
return -1; // anything in [not-a-string] => null
fail = false;
int cmp = compare_fsl(ff, f->value.array.array[2]->value.array.array[i], fail, no_unidecode_data);
if (fail) {
continue; // null
}
if (unidecode_data.size() > 0) {
smash(unidecode_data, f->value.array.array[2]->value.array.array[i]);
}
if (strcmp(s.c_str(), f->value.array.array[2]->value.array.array[i]->value.string.string) == 0) {
if (cmp == 0) {
contains = true;
break;
}
+1 -1
View File
@@ -1,6 +1,6 @@
#ifndef VERSION_HPP
#define VERSION_HPP
#define VERSION "v2.48.0"
#define VERSION "v2.49.0"
#endif