diff --git a/arangod/Aql/V8Executor.cpp b/arangod/Aql/V8Executor.cpp index b2c9bc0092..11654e8480 100644 --- a/arangod/Aql/V8Executor.cpp +++ b/arangod/Aql/V8Executor.cpp @@ -153,7 +153,7 @@ std::unordered_map const V8Executor::FunctionNames{ { "ATTRIBUTES", Function("ATTRIBUTES", "ATTRIBUTES", "a|b,b", true, true) }, { "MERGE", Function("MERGE", "MERGE", "a,a|+", true, true) }, { "MERGE_RECURSIVE", Function("MERGE_RECURSIVE", "MERGE_RECURSIVE", "a,a|+", true, true) }, - { "DOCUMENT", Function("DOCUMENT", "DOCUMENT", "h.|.", true, true) }, + { "DOCUMENT", Function("DOCUMENT", "DOCUMENT", "h.|.", false, true) }, { "MATCHES", Function("MATCHES", "MATCHES", ".,l|b", true, true) }, { "UNSET", Function("UNSET", "UNSET", "a,sl|+", true, true) }, { "KEEP", Function("KEEP", "KEEP", "a,sl|+", true, true) }, @@ -625,18 +625,20 @@ void V8Executor::generateCodeFunctionCall (AstNode const* node) { if (member != nullptr) { if (func->containsCollectionParameter && + member->type == NODE_TYPE_COLLECTION && func->mustConvertArgument(i)) { - // the parameter at this position must be a collection name that is converted to a string - if (member->type == NODE_TYPE_COLLECTION) { - // do a parameter conversion from a collection parameter to a collection name parameter - char const* name = member->getStringValue(); - generateCodeString(name); - } + // the parameter at this position is a collection name that is converted to a string + // do a parameter conversion from a collection parameter to a collection name parameter + char const* name = member->getStringValue(); + generateCodeString(name); + } + /* else { // the parameter at the position is not a collection name... fail THROW_ARANGO_EXCEPTION_PARAMS(TRI_ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH, func->internalName.c_str()); } } + */ else { // generate regular code for the node generateCodeNode(args->getMember(i)); diff --git a/js/server/modules/org/arangodb/ahuacatl.js b/js/server/modules/org/arangodb/ahuacatl.js index 14ab58822c..78879784c9 100644 --- a/js/server/modules/org/arangodb/ahuacatl.js +++ b/js/server/modules/org/arangodb/ahuacatl.js @@ -3125,6 +3125,10 @@ function FLATTEN (values, maxDepth, depth) { if (TYPEWEIGHT(maxDepth) === TYPEWEIGHT_NULL) { maxDepth = 1; } + else if (TYPEWEIGHT(maxDepth) !== TYPEWEIGHT_NUMBER) { + THROW(INTERNAL.errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH, "FLATTEN"); + } + if (TYPEWEIGHT(depth) === TYPEWEIGHT_NULL) { depth = 0; } @@ -3663,6 +3667,10 @@ function SKIPLIST_QUERY (collection, condition, skip, limit) { function HAS (element, name) { "use strict"; + + if (TYPEWEIGHT(name) !== TYPEWEIGHT_STRING) { + THROW(INTERNAL.errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH, "HAS"); + } if (TYPEWEIGHT(element) === TYPEWEIGHT_NULL) { return false; diff --git a/js/server/tests/aql-functions.js b/js/server/tests/aql-functions.js index 9e2683d8f4..babe5468c5 100644 --- a/js/server/tests/aql-functions.js +++ b/js/server/tests/aql-functions.js @@ -1329,13 +1329,12 @@ function ahuacatlFunctionsTestSuite () { //////////////////////////////////////////////////////////////////////////////// testUnsetInvalid : function () { + assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH.code, "RETURN UNSET()"); + assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH.code, "RETURN UNSET({ })"); assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN UNSET({ }, 1)"); assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN UNSET({ }, { })"); assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN UNSET({ }, 'foo', { })"); assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN UNSET('foo', 'foo')"); - - assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH.code, "RETURN UNSET()"); - assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH.code, "RETURN UNSET({ })"); }, //////////////////////////////////////////////////////////////////////////////// @@ -2134,14 +2133,14 @@ function ahuacatlFunctionsTestSuite () { testFlattenInvalid : function () { assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH.code, "RETURN FLATTEN()"); assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH.code, "RETURN FLATTEN([ ], 1, 1)"); - assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN FLATTEN(1)"); - assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN FLATTEN(null)"); - assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN FLATTEN(false)"); - assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN FLATTEN(1)"); - assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN FLATTEN('foo')"); + assertQueryError(errors.ERROR_QUERY_LIST_EXPECTED.code, "RETURN FLATTEN(1)"); + assertQueryError(errors.ERROR_QUERY_LIST_EXPECTED.code, "RETURN FLATTEN(null)"); + assertQueryError(errors.ERROR_QUERY_LIST_EXPECTED.code, "RETURN FLATTEN(false)"); + assertQueryError(errors.ERROR_QUERY_LIST_EXPECTED.code, "RETURN FLATTEN(1)"); + assertQueryError(errors.ERROR_QUERY_LIST_EXPECTED.code, "RETURN FLATTEN('foo')"); assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN FLATTEN([ ], 'foo')"); assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN FLATTEN([ ], [ ])"); - assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN FLATTEN({ })"); + assertQueryError(errors.ERROR_QUERY_LIST_EXPECTED.code, "RETURN FLATTEN({ })"); }, //////////////////////////////////////////////////////////////////////////////// @@ -2633,11 +2632,11 @@ function ahuacatlFunctionsTestSuite () { testMinInvalid : function () { assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH.code, "RETURN MIN()"); assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH.code, "RETURN MIN([ ], 2)"); - assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN MIN(null)"); - assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN MIN(false)"); - assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN MIN(3)"); - assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN MIN(\"yes\")"); - assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN MIN({ })"); + assertQueryError(errors.ERROR_QUERY_LIST_EXPECTED.code, "RETURN MIN(null)"); + assertQueryError(errors.ERROR_QUERY_LIST_EXPECTED.code, "RETURN MIN(false)"); + assertQueryError(errors.ERROR_QUERY_LIST_EXPECTED.code, "RETURN MIN(3)"); + assertQueryError(errors.ERROR_QUERY_LIST_EXPECTED.code, "RETURN MIN(\"yes\")"); + assertQueryError(errors.ERROR_QUERY_LIST_EXPECTED.code, "RETURN MIN({ })"); }, //////////////////////////////////////////////////////////////////////////////// @@ -2677,11 +2676,11 @@ function ahuacatlFunctionsTestSuite () { testMaxInvalid : function () { assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH.code, "RETURN MAX()"); assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH.code, "RETURN MAX([ ], 2)"); - assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN MAX(null)"); - assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN MAX(false)"); - assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN MAX(3)"); - assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN MAX(\"yes\")"); - assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN MAX({ })"); + assertQueryError(errors.ERROR_QUERY_LIST_EXPECTED.code, "RETURN MAX(null)"); + assertQueryError(errors.ERROR_QUERY_LIST_EXPECTED.code, "RETURN MAX(false)"); + assertQueryError(errors.ERROR_QUERY_LIST_EXPECTED.code, "RETURN MAX(3)"); + assertQueryError(errors.ERROR_QUERY_LIST_EXPECTED.code, "RETURN MAX(\"yes\")"); + assertQueryError(errors.ERROR_QUERY_LIST_EXPECTED.code, "RETURN MAX({ })"); }, //////////////////////////////////////////////////////////////////////////////// @@ -2718,11 +2717,11 @@ function ahuacatlFunctionsTestSuite () { testSumInvalid : function () { assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH.code, "RETURN SUM()"); assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH.code, "RETURN SUM([ ], 2)"); - assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN SUM(null)"); - assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN SUM(false)"); - assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN SUM(3)"); - assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN SUM(\"yes\")"); - assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN SUM({ })"); + assertQueryError(errors.ERROR_QUERY_LIST_EXPECTED.code, "RETURN SUM(null)"); + assertQueryError(errors.ERROR_QUERY_LIST_EXPECTED.code, "RETURN SUM(false)"); + assertQueryError(errors.ERROR_QUERY_LIST_EXPECTED.code, "RETURN SUM(3)"); + assertQueryError(errors.ERROR_QUERY_LIST_EXPECTED.code, "RETURN SUM(\"yes\")"); + assertQueryError(errors.ERROR_QUERY_LIST_EXPECTED.code, "RETURN SUM({ })"); }, //////////////////////////////////////////////////////////////////////////////// @@ -2765,11 +2764,11 @@ function ahuacatlFunctionsTestSuite () { testAverageInvalid : function () { assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH.code, "RETURN AVERAGE()"); assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH.code, "RETURN AVERAGE([ ], 2)"); - assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN AVERAGE(null)"); - assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN AVERAGE(false)"); - assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN AVERAGE(3)"); - assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN AVERAGE(\"yes\")"); - assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN AVERAGE({ })"); + assertQueryError(errors.ERROR_QUERY_LIST_EXPECTED.code, "RETURN AVERAGE(null)"); + assertQueryError(errors.ERROR_QUERY_LIST_EXPECTED.code, "RETURN AVERAGE(false)"); + assertQueryError(errors.ERROR_QUERY_LIST_EXPECTED.code, "RETURN AVERAGE(3)"); + assertQueryError(errors.ERROR_QUERY_LIST_EXPECTED.code, "RETURN AVERAGE(\"yes\")"); + assertQueryError(errors.ERROR_QUERY_LIST_EXPECTED.code, "RETURN AVERAGE({ })"); }, //////////////////////////////////////////////////////////////////////////////// @@ -2823,11 +2822,11 @@ function ahuacatlFunctionsTestSuite () { testMedianInvalid : function () { assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH.code, "RETURN MEDIAN()"); assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH.code, "RETURN MEDIAN([ ], 2)"); - assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN MEDIAN(null)"); - assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN MEDIAN(false)"); - assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN MEDIAN(3)"); - assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN MEDIAN(\"yes\")"); - assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN MEDIAN({ })"); + assertQueryError(errors.ERROR_QUERY_LIST_EXPECTED.code, "RETURN MEDIAN(null)"); + assertQueryError(errors.ERROR_QUERY_LIST_EXPECTED.code, "RETURN MEDIAN(false)"); + assertQueryError(errors.ERROR_QUERY_LIST_EXPECTED.code, "RETURN MEDIAN(3)"); + assertQueryError(errors.ERROR_QUERY_LIST_EXPECTED.code, "RETURN MEDIAN(\"yes\")"); + assertQueryError(errors.ERROR_QUERY_LIST_EXPECTED.code, "RETURN MEDIAN({ })"); }, //////////////////////////////////////////////////////////////////////////////// @@ -3870,11 +3869,11 @@ function ahuacatlFunctionsTestSuite () { testVariancePopulationInvalid : function () { assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH.code, "RETURN VARIANCE_POPULATION()"); assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH.code, "RETURN VARIANCE_POPULATION([ ], 2)"); - assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN VARIANCE_POPULATION(null)"); - assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN VARIANCE_POPULATION(false)"); - assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN VARIANCE_POPULATION(3)"); - assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN VARIANCE_POPULATION(\"yes\")"); - assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN VARIANCE_POPULATION({ })"); + assertQueryError(errors.ERROR_QUERY_LIST_EXPECTED.code, "RETURN VARIANCE_POPULATION(null)"); + assertQueryError(errors.ERROR_QUERY_LIST_EXPECTED.code, "RETURN VARIANCE_POPULATION(false)"); + assertQueryError(errors.ERROR_QUERY_LIST_EXPECTED.code, "RETURN VARIANCE_POPULATION(3)"); + assertQueryError(errors.ERROR_QUERY_LIST_EXPECTED.code, "RETURN VARIANCE_POPULATION(\"yes\")"); + assertQueryError(errors.ERROR_QUERY_LIST_EXPECTED.code, "RETURN VARIANCE_POPULATION({ })"); }, //////////////////////////////////////////////////////////////////////////////// @@ -3927,11 +3926,11 @@ function ahuacatlFunctionsTestSuite () { testVarianceSampleInvalid : function () { assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH.code, "RETURN VARIANCE_SAMPLE()"); assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH.code, "RETURN VARIANCE_SAMPLE([ ], 2)"); - assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN VARIANCE_SAMPLE(null)"); - assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN VARIANCE_SAMPLE(false)"); - assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN VARIANCE_SAMPLE(3)"); - assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN VARIANCE_SAMPLE(\"yes\")"); - assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN VARIANCE_SAMPLE({ })"); + assertQueryError(errors.ERROR_QUERY_LIST_EXPECTED.code, "RETURN VARIANCE_SAMPLE(null)"); + assertQueryError(errors.ERROR_QUERY_LIST_EXPECTED.code, "RETURN VARIANCE_SAMPLE(false)"); + assertQueryError(errors.ERROR_QUERY_LIST_EXPECTED.code, "RETURN VARIANCE_SAMPLE(3)"); + assertQueryError(errors.ERROR_QUERY_LIST_EXPECTED.code, "RETURN VARIANCE_SAMPLE(\"yes\")"); + assertQueryError(errors.ERROR_QUERY_LIST_EXPECTED.code, "RETURN VARIANCE_SAMPLE({ })"); }, //////////////////////////////////////////////////////////////////////////////// @@ -3989,11 +3988,11 @@ function ahuacatlFunctionsTestSuite () { testStddevPopulationInvalid : function () { assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH.code, "RETURN STDDEV_POPULATION()"); assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH.code, "RETURN STDDEV_POPULATION([ ], 2)"); - assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN STDDEV_POPULATION(null)"); - assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN STDDEV_POPULATION(false)"); - assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN STDDEV_POPULATION(3)"); - assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN STDDEV_POPULATION(\"yes\")"); - assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN STDDEV_POPULATION({ })"); + assertQueryError(errors.ERROR_QUERY_LIST_EXPECTED.code, "RETURN STDDEV_POPULATION(null)"); + assertQueryError(errors.ERROR_QUERY_LIST_EXPECTED.code, "RETURN STDDEV_POPULATION(false)"); + assertQueryError(errors.ERROR_QUERY_LIST_EXPECTED.code, "RETURN STDDEV_POPULATION(3)"); + assertQueryError(errors.ERROR_QUERY_LIST_EXPECTED.code, "RETURN STDDEV_POPULATION(\"yes\")"); + assertQueryError(errors.ERROR_QUERY_LIST_EXPECTED.code, "RETURN STDDEV_POPULATION({ })"); }, ////////////////////////////////////////////////////////////////////////////////