From b413c7f277d4285a4c9552f5d1e9d5cf721585b5 Mon Sep 17 00:00:00 2001 From: Sebastian Harl Date: Fri, 24 Oct 2014 18:08:14 +0200 Subject: [PATCH] store: During lookup use strcmp() only for unknown data-types. Unknown data-types means that we don't know the type of either one expression before hand. For example, this is true for attributes given that there is no schema. --- src/core/store_lookup.c | 2 ++ t/unit/core/store_lookup_test.c | 14 +++++++------- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/core/store_lookup.c b/src/core/store_lookup.c index 3a99f80..93fb347 100644 --- a/src/core/store_lookup.c +++ b/src/core/store_lookup.c @@ -184,6 +184,8 @@ cmp_expr(sdb_store_expr_t *e1, sdb_store_expr_t *e2, status = INT_MAX; else if (v1.type == v2.type) status = sdb_data_cmp(&v1, &v2); + else if ((e1->data_type >= 0) && (e2->data_type >= 0)) + status = INT_MAX; else status = sdb_data_strcmp(&v1, &v2); diff --git a/t/unit/core/store_lookup_test.c b/t/unit/core/store_lookup_test.c index 4acfc0f..65cbc62 100644 --- a/t/unit/core/store_lookup_test.c +++ b/t/unit/core/store_lookup_test.c @@ -266,6 +266,9 @@ START_TEST(test_cmp_attr) { sdb_store_gt_matcher, golden_data[i].expected_gt }, }; + const char *op_str[] = { "<", "<=", "=", ">=", ">" }; + assert(SDB_STATIC_ARRAY_LEN(tests) == SDB_STATIC_ARRAY_LEN(op_str)); + sdb_data_format(&golden_data[i].value, value_str, sizeof(value_str), SDB_UNQUOTED); @@ -288,8 +291,10 @@ START_TEST(test_cmp_attr) status = sdb_store_matcher_matches(m, host, /* filter */ NULL); fail_unless(status == tests[j].expected, - "sdb_store_matcher_matches(, , NULL) = %d; " - "expected: %d", status, tests[j].expected); + "sdb_store_matcher_matches(, " + ", NULL) = %d; expected: %d", + golden_data[i].attr, op_str[j], value_str, + status, tests[j].expected); sdb_object_deref(SDB_OBJ(m)); } @@ -332,8 +337,6 @@ START_TEST(test_cmp_obj) { "a", SDB_FIELD_INTERVAL, { SDB_TYPE_DATETIME, { .datetime = 1 } }, 1, 1, 0, 0, 0 }, /* type mismatch */ - /* TODO: let matchers only use data_strcmp for attributes - * everything else has a well-known type { "a", SDB_FIELD_LAST_UPDATE, { SDB_TYPE_INTEGER, { .integer = 0 } }, 0, 0, 0, 0, 0 }, { "a", SDB_FIELD_AGE, @@ -344,13 +347,10 @@ START_TEST(test_cmp_obj) { SDB_TYPE_INTEGER, { .integer = 0 } }, 0, 0, 0, 0, 0 }, { "a", SDB_FIELD_BACKEND, { SDB_TYPE_INTEGER, { .integer = 0 } }, 0, 0, 0, 0, 0 }, - */ /* (64bit) integer value without zero-bytes */ - /* { "a", SDB_FIELD_BACKEND, { SDB_TYPE_INTEGER, { .integer = 0xffffffffffffffffL } }, 0, 0, 0, 0, 0 }, - */ }; int status; -- 2.30.2