schema compile BUGFIX checking decimal64 values
number of fraction digits were checked even if there were no fraction
digits in the value.
diff --git a/src/plugins_types.c b/src/plugins_types.c
index 0f08a1b..f069140 100644
--- a/src/plugins_types.c
+++ b/src/plugins_types.c
@@ -137,7 +137,7 @@
len = len - trailing_zeros;
decimal:
- if (len - 1 - fraction > fraction_digits) {
+ if (fraction && (len - 1 - fraction > fraction_digits)) {
asprintf(&errmsg, "Value \"%.*s\" of decimal64 type exceeds defined number (%u) of fraction digits.", (int)len, value,
fraction_digits);
goto error;
diff --git a/src/tree_schema_compile.c b/src/tree_schema_compile.c
index 623dd26..37932a7 100644
--- a/src/tree_schema_compile.c
+++ b/src/tree_schema_compile.c
@@ -1139,7 +1139,7 @@
if (basetype == LY_TYPE_DEC64) {
decimal:
assert(frdigits);
- if (*len - 1 - fraction > frdigits) {
+ if (fraction && (*len - 1 - fraction > frdigits)) {
LOGVAL(ctx->ctx, LY_VLOG_STR, ctx->path, LYVE_SYNTAX_YANG,
"Range boundary \"%.*s\" of decimal64 type exceeds defined number (%u) of fraction digits.",
*len, value, frdigits);
diff --git a/tests/src/test_tree_schema_compile.c b/tests/src/test_tree_schema_compile.c
index f03d2d3..bd00a7e 100644
--- a/tests/src/test_tree_schema_compile.c
+++ b/tests/src/test_tree_schema_compile.c
@@ -1580,6 +1580,17 @@
assert_int_equal(1000, ((struct lysc_type_dec*)type)->range->parts[2].min_64);
assert_int_equal(1000, ((struct lysc_type_dec*)type)->range->parts[2].max_64);
+ assert_non_null(mod = lys_parse_mem(ctx, "module c {namespace urn:c;prefix c;typedef mytype {type decimal64 {"
+ "fraction-digits 2;range '1 .. 65535';}}leaf l {type mytype;}}", LYS_IN_YANG));
+ type = ((struct lysc_node_leaf*)mod->compiled->data)->type;
+ assert_int_equal(LY_TYPE_DEC64, type->basetype);
+ assert_int_equal(2, ((struct lysc_type_dec*)type)->fraction_digits);
+ assert_non_null(((struct lysc_type_dec*)type)->range);
+ assert_non_null(((struct lysc_type_dec*)type)->range->parts);
+ assert_int_equal(1, LY_ARRAY_SIZE(((struct lysc_type_dec*)type)->range->parts));
+ assert_int_equal(100, ((struct lysc_type_dec*)type)->range->parts[0].min_64);
+ assert_int_equal(6553500, ((struct lysc_type_dec*)type)->range->parts[0].max_64);
+
/* invalid cases */
assert_null(lys_parse_mem(ctx, "module aa {namespace urn:aa;prefix aa; leaf l {type decimal64 {fraction-digits 0;}}}", LYS_IN_YANG));
logbuf_assert("Invalid value \"0\" of \"fraction-digits\". Line number 1.");
@@ -1610,6 +1621,13 @@
"typedef mytype2 {type mytype {fraction-digits 3;}}leaf l {type mytype2;}}", LYS_IN_YANG));
logbuf_assert("Invalid fraction-digits substatement for type \"mytype2\" not directly derived from decimal64 built-in type. /de:l");
+ assert_null(lys_parse_mem(ctx, "module ee {namespace urn:c;prefix c;typedef mytype {type decimal64 {"
+ "fraction-digits 18;range '-10 .. 0';}}leaf l {type mytype;}}", LYS_IN_YANG));
+ logbuf_assert("Invalid range restriction - invalid value \"-10000000000000000000\". /ee:l");
+ assert_null(lys_parse_mem(ctx, "module ee {namespace urn:c;prefix c;typedef mytype {type decimal64 {"
+ "fraction-digits 18;range '0 .. 10';}}leaf l {type mytype;}}", LYS_IN_YANG));
+ logbuf_assert("Invalid range restriction - invalid value \"10000000000000000000\". /ee:l");
+
*state = NULL;
ly_ctx_destroy(ctx, NULL);
}