diff --git a/src/box/sql/expr.c b/src/box/sql/expr.c
index 648b7170eeda306ffd7597904cb132fa2e23e0b0..0bdcfe5764b31c55a16117d19dfe034453893cce 100644
--- a/src/box/sql/expr.c
+++ b/src/box/sql/expr.c
@@ -332,7 +332,8 @@ sql_expr_coll(Parse *parse, Expr *p, bool *is_explicit_coll, uint32_t *coll_id,
 				sql_func_by_signature(p->u.zToken, arg_count);
 			if (func == NULL)
 				break;
-			if (sql_func_flag_is_set(func, SQL_FUNC_DERIVEDCOLL)) {
+			if (sql_func_flag_is_set(func, SQL_FUNC_DERIVEDCOLL) &&
+			    arg_count > 0) {
 				/*
 				 * Now we use quite straightforward
 				 * approach assuming that resulting
diff --git a/test/sql/collation.result b/test/sql/collation.result
index 11962ef472f79c28fbe7b9e90db1708d6af5611b..fbc7ce9aa1c3867efc0474694f65f72119f11627 100644
--- a/test/sql/collation.result
+++ b/test/sql/collation.result
@@ -292,6 +292,15 @@ box.execute("SELECT * FROM t WHERE a COLLATE \"binary\" = c COLLATE \"unicode\";
 - null
 - Illegal mix of collations
 ...
+-- Make sure that using function featuring variable arguemnts
+-- length  and resulting collation which depends on arguments
+-- is processed correctly.
+--
+box.execute("SELECT * FROM t WHERE a COLLATE \"binary\" = substr();")
+---
+- null
+- 'Wrong number of arguments is passed to SUBSTR(): expected 1 or 2, got 0'
+...
 -- Compound queries perform implicit comparisons between values.
 -- Hence, rules for collations compatibilities are the same.
 --
diff --git a/test/sql/collation.test.lua b/test/sql/collation.test.lua
index 1be28b3ff24492925c4f5e5f3ac49e63c960c4bf..a013253cdddf90519bd1df83a824cff1c96990c9 100644
--- a/test/sql/collation.test.lua
+++ b/test/sql/collation.test.lua
@@ -80,6 +80,11 @@ box.execute("SELECT * FROM t WHERE b = c;")
 box.execute("SELECT * FROM t WHERE b COLLATE \"binary\" = c;")
 box.execute("SELECT * FROM t WHERE a = c;")
 box.execute("SELECT * FROM t WHERE a COLLATE \"binary\" = c COLLATE \"unicode\";")
+-- Make sure that using function featuring variable arguemnts
+-- length  and resulting collation which depends on arguments
+-- is processed correctly.
+--
+box.execute("SELECT * FROM t WHERE a COLLATE \"binary\" = substr();")
 
 -- Compound queries perform implicit comparisons between values.
 -- Hence, rules for collations compatibilities are the same.