diff --git a/3rdParty/libev/ev.3 b/3rdParty/libev/ev.3 index 98d3c667a4..c2652041aa 100644 --- a/3rdParty/libev/ev.3 +++ b/3rdParty/libev/ev.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.28 (Pod::Simple 3.28) +.\" Automatically generated by Pod::Man 2.27 (Pod::Simple 3.28) .\" .\" Standard preamble: .\" ======================================================================== @@ -133,7 +133,7 @@ .\" ======================================================================== .\" .IX Title "LIBEV 3" -.TH LIBEV 3 "2016-02-09" "libev-4.22" "libev - high performance full featured event loop" +.TH LIBEV 3 "2016-02-11" "libev-4.22" "libev - high performance full featured event loop" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/CHANGELOG b/CHANGELOG index e7d9451784..f67fc8da37 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -12,19 +12,23 @@ v3.0.0 (XXXX-XX-XX) Examples: - [ 1, 2, 3 ] ANY == 2 // true - [ 1, 2, 3 ] ANY == 4 // false - [ 1, 2, 3 ] ANY > 0 // true [ 1, 2, 3 ] ANY IN [ 4, 5, 6 ] // false [ 1, 2, 3 ] ANY IN [ 1, 42 ] // true [ 1, 2, 3 ] ALL IN [ 2, 3, 4 ] // false [ 1, 2, 3 ] ALL IN [ 1, 2, 3 ] // true - [ 1, 2, 3 ] ALL > 2 // false - [ 1, 2, 3 ] ALL > 0 // true [ 1, 2, 3 ] NONE IN [ 3 ] // false [ 1, 2, 3 ] NONE IN [ 23, 42 ] // true + [ 1, 2, 3 ] ANY == 2 // true + [ 1, 2, 3 ] ANY == 4 // false + [ 1, 2, 3 ] ANY > 0 // true + [ 1, 2, 3 ] ANY <= 1 // true + [ 1, 2, 3 ] ALL > 2 // false + [ 1, 2, 3 ] ALL > 0 // true + [ 1, 2, 3 ] ALL >= 3 // false [ 1, 2, 3 ] NONE < 99 // false [ 1, 2, 3 ] NONE > 10 // true + ["foo", "bar"] ALL != "moo" // true + ["foo", "bar"] NONE == "bar" // false * improved AQL optimizer to remove unnecessary sort operations in more cases diff --git a/CMakeLists.txt b/CMakeLists.txt index 9d490820b8..39650ebfd5 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -535,6 +535,9 @@ else() message ("Boost unit test framework not found. Unit tests are disabled.") endif() +# Tcmalloc --------------------------------------------------------------------- +find_package(tcmalloc) + # OpenSSL ---------------------------------------------------------------------- #set (OPENSSL_USE_STATIC_LIBS "TRUE") find_package(OpenSSL REQUIRED) diff --git a/arangod/Aql/Functions.cpp b/arangod/Aql/Functions.cpp index 6c1964f120..b0d17f2510 100644 --- a/arangod/Aql/Functions.cpp +++ b/arangod/Aql/Functions.cpp @@ -493,6 +493,9 @@ static void AppendAsString(arangodb::basics::StringBuffer& buffer, break; } } + + // make it null-terminated for all c-string-related functions + buffer.ensureNullTerminated(); } //////////////////////////////////////////////////////////////////////////////// diff --git a/cmake/Findtcmalloc.cmake b/cmake/Findtcmalloc.cmake new file mode 100644 index 0000000000..247227cff9 --- /dev/null +++ b/cmake/Findtcmalloc.cmake @@ -0,0 +1,36 @@ +# - Locate tcmalloc library +# Defines: +# +# TCMALLOC_FOUND +# TCMALLOC_INCLUDE_DIR +# TCMALLOC_INCLUDE_DIRS (not cached) +# TCMALLOC_tcmalloc_LIBRARY +# TCMALLOC_profiler_LIBRARY +# TCMALLOC_LIBRARIES (not cached) +# TCMALLOC_LIBRARY_DIRS (not cached) +# PPROF_EXECUTABLE + +find_path(TCMALLOC_INCLUDE_DIR google/tcmalloc.h) +foreach(component tcmalloc profiler) + find_library(TCMALLOC_${component}_LIBRARY NAMES ${component}) + mark_as_advanced(TCMALLOC_${component}_LIBRARY) +endforeach() + +find_program(PPROF_EXECUTABLE NAMES pprof + HINTS ${TCMALLOC_INCLUDE_DIR}/../bin) + +set(TCMALLOC_INCLUDE_DIRS ${TCMALLOC_INCLUDE_DIR}) +set(TCMALLOC_LIBRARIES ${TCMALLOC_tcmalloc_LIBRARY} ${TCMALLOC_profiler_LIBRARY}) + +# handle the QUIETLY and REQUIRED arguments and set TCMALLOC_FOUND to TRUE if +# all listed variables are TRUE +INCLUDE(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(tcmalloc DEFAULT_MSG TCMALLOC_INCLUDE_DIR TCMALLOC_LIBRARIES) + +mark_as_advanced(TCMALLOC_FOUND TCMALLOC_INCLUDE_DIR PPROF_EXECUTABLE) + +if(TCMALLOC_tcmalloc_LIBRARY) + get_filename_component(TCMALLOC_LIBRARY_DIRS ${TCMALLOC_tcmalloc_LIBRARY} PATH) +elseif(TCMALLOC_profiler_LIBRARY) + get_filename_component(TCMALLOC_LIBRARY_DIRS ${TCMALLOC_profiler_LIBRARY} PATH) +endif() diff --git a/js/server/tests/aql/aql-functions.js b/js/server/tests/aql/aql-functions.js index 79b613deb8..be2df77d46 100644 --- a/js/server/tests/aql/aql-functions.js +++ b/js/server/tests/aql/aql-functions.js @@ -3419,6 +3419,7 @@ function ahuacatlFunctionsTestSuite () { [ { a: 1, b: 2, c: 3 }, [ "a", "b", "c" ], [ 1, 2, 3 ] ], [ { foo: "baz", bar: "foo", baz: "bar" }, [ "foo", "bar", "baz" ], [ "baz", "foo", "bar" ] ], [ { a: null, b: false, c: true, d: 42, e: 2.5, f: "test", g: [], h: [ "test1", "test2" ], i : { something: "else", more: "less" } }, [ "a", "b", "c", "d", "e", "f", "g", "h", "i" ], [ null, false, true, 42, 2.5, "test", [ ], [ "test1", "test2" ], { something: "else", more: "less" } ] ], + [ { a11111: "value", b222: "value", c: "value" }, [ "a11111", "b222", "c" ], [ "value", "value", "value" ] ] ]; values.forEach(function (value) { @@ -3434,6 +3435,23 @@ function ahuacatlFunctionsTestSuite () { }); }, +//////////////////////////////////////////////////////////////////////////////// +/// @brief test zip function +//////////////////////////////////////////////////////////////////////////////// + + testZipSubquery : function () { + // Opt + var query = "LET value = (FOR i IN 1..3 RETURN 'value') RETURN ZIP([ 'a11111', 'b222', 'c' ], value)"; + var actual = getQueryResults(query); + assertEqual({ a11111: "value", b222: "value", c: "value" }, actual[0]); + // No opt / No v8 + query = "LET value = (FOR i IN 1..3 RETURN 'value') RETURN NOOPT(ZIP([ 'a11111', 'b222', 'c' ], value))"; + assertEqual({ a11111: "value", b222: "value", c: "value" }, actual[0]); + // No opt / v8 + query = "LET value = (FOR i IN 1..3 RETURN 'value') RETURN NOOPT(V8(ZIP([ 'a11111', 'b222', 'c' ], value)))"; + assertEqual({ a11111: "value", b222: "value", c: "value" }, actual[0]); + }, + //////////////////////////////////////////////////////////////////////////////// /// @brief test zip function //////////////////////////////////////////////////////////////////////////////// diff --git a/lib/Basics/StringBuffer.cpp b/lib/Basics/StringBuffer.cpp index 385f4b81dc..362813d938 100644 --- a/lib/Basics/StringBuffer.cpp +++ b/lib/Basics/StringBuffer.cpp @@ -801,17 +801,13 @@ int TRI_AppendUrlEncodedStringStringBuffer(TRI_string_buffer_t* self, '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; size_t len = strlen(src); - int res; - - char const* end; - - res = Reserve(self, len * 3); + int res = Reserve(self, len * 3); if (res != TRI_ERROR_NO_ERROR) { return res; } - end = src + len; + char const* end = src + len; for (; src < end; ++src) { if ('0' <= *src && *src <= '9') { diff --git a/lib/Basics/StringBuffer.h b/lib/Basics/StringBuffer.h index cc7f7a3aeb..c640d33ebd 100644 --- a/lib/Basics/StringBuffer.h +++ b/lib/Basics/StringBuffer.h @@ -744,6 +744,15 @@ class StringBuffer { _buffer._current = other->_current; _buffer._len = other->_len; } + + ////////////////////////////////////////////////////////////////////////////// + /// @brief make sure the buffer is null-terminated + ////////////////////////////////////////////////////////////////////////////// + + void ensureNullTerminated () { + TRI_AppendCharStringBuffer(&_buffer, '\0'); + --_buffer._current; + } ////////////////////////////////////////////////////////////////////////////// /// @brief appends character