Compare commits
7 Commits
add-gcc-11
...
v2.4.1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
287c2e94d1 | ||
|
|
417cf4b30b | ||
|
|
68e7fd3d36 | ||
|
|
5261d82063 | ||
|
|
9eb87bcf3e | ||
|
|
a9491d3e68 | ||
|
|
b42e47b0be |
@@ -6,7 +6,7 @@ DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
|
||||
source "$DIR/../util.sh"
|
||||
|
||||
check_operating_system "debian-11"
|
||||
check_architecture "arm64"
|
||||
check_architecture "arm64" "aarch64"
|
||||
|
||||
TOOLCHAIN_BUILD_DEPS=(
|
||||
coreutils gcc g++ build-essential make # generic build tools
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
#!/bin/bash
|
||||
|
||||
operating_system() {
|
||||
function operating_system() {
|
||||
grep -E '^(VERSION_)?ID=' /etc/os-release | \
|
||||
sort | cut -d '=' -f 2- | sed 's/"//g' | paste -s -d '-'
|
||||
}
|
||||
|
||||
check_operating_system() {
|
||||
function check_operating_system() {
|
||||
if [ "$(operating_system)" != "$1" ]; then
|
||||
echo "Not the right operating system!"
|
||||
exit 1
|
||||
@@ -14,20 +14,22 @@ check_operating_system() {
|
||||
fi
|
||||
}
|
||||
|
||||
architecture() {
|
||||
function architecture() {
|
||||
uname -m
|
||||
}
|
||||
|
||||
check_architecture() {
|
||||
if [ "$(architecture)" != "$1" ]; then
|
||||
echo "Not the right architecture!"
|
||||
exit 1
|
||||
else
|
||||
echo "The right architecture."
|
||||
fi
|
||||
for arch in "$@"; do
|
||||
if [ "$(architecture)" = "$arch" ]; then
|
||||
echo "The right architecture!"
|
||||
return 0
|
||||
fi
|
||||
done
|
||||
echo "Not the right architecture!"
|
||||
exit 1
|
||||
}
|
||||
|
||||
check_all_yum() {
|
||||
function check_all_yum() {
|
||||
local missing=""
|
||||
for pkg in $1; do
|
||||
if ! yum list installed "$pkg" >/dev/null 2>/dev/null; then
|
||||
@@ -40,7 +42,7 @@ check_all_yum() {
|
||||
fi
|
||||
}
|
||||
|
||||
check_all_dpkg() {
|
||||
function check_all_dpkg() {
|
||||
local missing=""
|
||||
for pkg in $1; do
|
||||
if ! dpkg -s "$pkg" >/dev/null 2>/dev/null; then
|
||||
@@ -53,7 +55,7 @@ check_all_dpkg() {
|
||||
fi
|
||||
}
|
||||
|
||||
check_all_dnf() {
|
||||
function check_all_dnf() {
|
||||
local missing=""
|
||||
for pkg in $1; do
|
||||
if ! dnf list installed "$pkg" >/dev/null 2>/dev/null; then
|
||||
@@ -65,7 +67,8 @@ check_all_dnf() {
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
install_all_apt() {
|
||||
|
||||
function install_all_apt() {
|
||||
for pkg in $1; do
|
||||
apt install -y "$pkg"
|
||||
done
|
||||
|
||||
11
init
11
init
@@ -5,6 +5,9 @@ cd "$DIR"
|
||||
|
||||
source "$DIR/environment/util.sh"
|
||||
|
||||
DISTRO=$(operating_system)
|
||||
ARCHITECTURE=$(architecture)
|
||||
|
||||
function print_help () {
|
||||
echo "Usage: $0 [OPTION]"
|
||||
echo -e "Check for missing packages and setup the project.\n"
|
||||
@@ -64,8 +67,6 @@ else
|
||||
done
|
||||
fi
|
||||
|
||||
DISTRO=$(operating_system)
|
||||
ARCHITECTURE=$(architecture)
|
||||
if [ "${ARCHITECTURE}" = "arm64" ] || [ "${ARCHITECTURE}" = "aarch64" ]; then
|
||||
OS_SCRIPT=$DIR/environment/os/$DISTRO-arm.sh
|
||||
else
|
||||
@@ -111,6 +112,12 @@ if [[ "$setup_libs" == "true" ]]; then
|
||||
cd ..
|
||||
fi
|
||||
|
||||
# Fix for centos 7 during release
|
||||
if [ "${ARCHITECTURE}" = "centos-7" ]; then
|
||||
python3 -m pip uninstall virtualenv
|
||||
python3 -m pip install virtualenv
|
||||
fi
|
||||
|
||||
# setup gql_behave dependencies
|
||||
setup_virtualenv tests/gql_behave
|
||||
|
||||
|
||||
@@ -36,7 +36,7 @@ ADDITIONAL USE GRANT: You may use the Licensed Work in accordance with the
|
||||
3. using the Licensed Work to create a work or solution
|
||||
which competes (or might reasonably be expected to
|
||||
compete) with the Licensed Work.
|
||||
CHANGE DATE: 2026-27-04
|
||||
CHANGE DATE: 2026-07-10
|
||||
CHANGE LICENSE: Apache License, Version 2.0
|
||||
|
||||
For information about alternative licensing arrangements, please visit: https://memgraph.com/legal.
|
||||
|
||||
@@ -72,6 +72,8 @@ make_package () {
|
||||
docker exec "$build_container" bash -c "/memgraph/environment/os/$os.sh install MEMGRAPH_BUILD_DEPS"
|
||||
|
||||
echo "Building targeted package..."
|
||||
# Fix issue with git marking directory as not safe
|
||||
docker exec "$build_container" bash -c "cd /memgraph && git config --global --add safe.directory '*'"
|
||||
docker exec "$build_container" bash -c "cd /memgraph && $ACTIVATE_TOOLCHAIN && ./init"
|
||||
docker exec "$build_container" bash -c "cd $container_build_dir && rm -rf ./*"
|
||||
if [[ "$os" == "debian-11-arm" ]]; then
|
||||
|
||||
@@ -646,7 +646,7 @@ void AuthQueryHandler::EditPermissions(
|
||||
#ifdef MG_ENTERPRISE
|
||||
if (memgraph::utils::license::global_license_checker.IsValidLicenseFast()) {
|
||||
for (const auto &label_privilege : label_privileges) {
|
||||
edit_fine_grained_permissions_fun(user->fine_grained_access_handler().label_permissions(), label_privilege);
|
||||
edit_fine_grained_permissions_fun(role->fine_grained_access_handler().label_permissions(), label_privilege);
|
||||
}
|
||||
for (const auto &edge_type_privilege : edge_type_privileges) {
|
||||
edit_fine_grained_permissions_fun(role->fine_grained_access_handler().edge_type_permissions(),
|
||||
|
||||
@@ -1846,7 +1846,8 @@ mgp_error mgp_vertex_label_at(mgp_vertex *v, size_t i, mgp_label *result) {
|
||||
"Expected LabelToName to return a pointer or reference, so we "
|
||||
"don't have to take a copy and manage memory.");
|
||||
|
||||
const auto &name = std::visit([label](const auto *impl) { return impl->LabelToName(label); }, v->graph->impl);
|
||||
const auto &name = std::visit(
|
||||
[label](const auto *impl) -> const std::string & { return impl->LabelToName(label); }, v->graph->impl);
|
||||
return name.c_str();
|
||||
},
|
||||
&result->name);
|
||||
@@ -2157,8 +2158,9 @@ mgp_error mgp_edge_equal(mgp_edge *e1, mgp_edge *e2, int *result) {
|
||||
mgp_error mgp_edge_get_type(mgp_edge *e, mgp_edge_type *result) {
|
||||
return WrapExceptions(
|
||||
[e] {
|
||||
const auto &name =
|
||||
std::visit([e](const auto *impl) { return impl->EdgeTypeToName(e->impl.EdgeType()); }, e->from.graph->impl);
|
||||
const auto &name = std::visit(
|
||||
[e](const auto *impl) -> const std::string & { return impl->EdgeTypeToName(e->impl.EdgeType()); },
|
||||
e->from.graph->impl);
|
||||
return name.c_str();
|
||||
},
|
||||
&result->name);
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
#include "storage/v2/temporal.hpp"
|
||||
#include "utils/exceptions.hpp"
|
||||
#include "utils/fnv.hpp"
|
||||
#include "utils/memory.hpp"
|
||||
|
||||
namespace memgraph::query {
|
||||
|
||||
@@ -215,7 +216,8 @@ TypedValue::TypedValue(const TypedValue &other, utils::MemoryResource *memory) :
|
||||
new (&duration_v) utils::Duration(other.duration_v);
|
||||
return;
|
||||
case Type::Graph:
|
||||
new (&graph_v) Graph(other.graph_v, memory_);
|
||||
auto *graph_ptr = utils::Allocator<Graph>(memory_).new_object<Graph>(*other.graph_v);
|
||||
new (&graph_v) std::unique_ptr<Graph>(graph_ptr);
|
||||
return;
|
||||
}
|
||||
LOG_FATAL("Unsupported TypedValue::Type");
|
||||
@@ -267,7 +269,12 @@ TypedValue::TypedValue(TypedValue &&other, utils::MemoryResource *memory) : memo
|
||||
new (&duration_v) utils::Duration(other.duration_v);
|
||||
break;
|
||||
case Type::Graph:
|
||||
new (&graph_v) Graph(std::move(other.graph_v), memory_);
|
||||
if (other.GetMemoryResource() == memory_) {
|
||||
new (&graph_v) std::unique_ptr<Graph>(std::move(other.graph_v));
|
||||
} else {
|
||||
auto *graph_ptr = utils::Allocator<Graph>(memory_).new_object<Graph>(std::move(*other.graph_v));
|
||||
new (&graph_v) std::unique_ptr<Graph>(graph_ptr);
|
||||
}
|
||||
}
|
||||
other.DestroyValue();
|
||||
}
|
||||
@@ -336,7 +343,22 @@ DEFINE_VALUE_AND_TYPE_GETTERS(utils::Date, Date, date_v)
|
||||
DEFINE_VALUE_AND_TYPE_GETTERS(utils::LocalTime, LocalTime, local_time_v)
|
||||
DEFINE_VALUE_AND_TYPE_GETTERS(utils::LocalDateTime, LocalDateTime, local_date_time_v)
|
||||
DEFINE_VALUE_AND_TYPE_GETTERS(utils::Duration, Duration, duration_v)
|
||||
DEFINE_VALUE_AND_TYPE_GETTERS(Graph, Graph, graph_v)
|
||||
|
||||
Graph &TypedValue::ValueGraph() {
|
||||
if (type_ != Type::Graph) {
|
||||
throw TypedValueException("TypedValue is of type '{}', not '{}'", type_, Type::Graph);
|
||||
}
|
||||
return *graph_v;
|
||||
}
|
||||
|
||||
const Graph &TypedValue::ValueGraph() const {
|
||||
if (type_ != Type::Graph) {
|
||||
throw TypedValueException("TypedValue is of type '{}', not '{}'", type_, Type::Graph);
|
||||
}
|
||||
return *graph_v;
|
||||
}
|
||||
|
||||
bool TypedValue::IsGraph() const { return type_ == Type::Graph; }
|
||||
|
||||
#undef DEFINE_VALUE_AND_TYPE_GETTERS
|
||||
|
||||
@@ -530,9 +552,11 @@ TypedValue &TypedValue::operator=(const TypedValue &other) {
|
||||
case TypedValue::Type::Path:
|
||||
new (&path_v) Path(other.path_v, memory_);
|
||||
return *this;
|
||||
case TypedValue::Type::Graph:
|
||||
new (&graph_v) Graph(other.graph_v, memory_);
|
||||
case TypedValue::Type::Graph: {
|
||||
auto *graph_ptr = utils::Allocator<Graph>(memory_).new_object<Graph>(*other.graph_v);
|
||||
new (&graph_v) std::unique_ptr<Graph>(graph_ptr);
|
||||
return *this;
|
||||
}
|
||||
case Type::Date:
|
||||
new (&date_v) utils::Date(other.date_v);
|
||||
return *this;
|
||||
@@ -605,7 +629,12 @@ TypedValue &TypedValue::operator=(TypedValue &&other) noexcept(false) {
|
||||
new (&duration_v) utils::Duration(other.duration_v);
|
||||
break;
|
||||
case Type::Graph:
|
||||
new (&graph_v) Graph(std::move(other.graph_v), memory_);
|
||||
if (other.GetMemoryResource() == memory_) {
|
||||
new (&graph_v) std::unique_ptr<Graph>(std::move(other.graph_v));
|
||||
} else {
|
||||
auto *graph_ptr = utils::Allocator<Graph>(memory_).new_object<Graph>(std::move(*other.graph_v));
|
||||
new (&graph_v) std::unique_ptr<Graph>(graph_ptr);
|
||||
}
|
||||
break;
|
||||
}
|
||||
other.DestroyValue();
|
||||
@@ -625,31 +654,36 @@ void TypedValue::DestroyValue() {
|
||||
// we need to call destructors for non primitive types since we used
|
||||
// placement new
|
||||
case Type::String:
|
||||
string_v.~TString();
|
||||
std::destroy_at(&string_v);
|
||||
break;
|
||||
case Type::List:
|
||||
list_v.~TVector();
|
||||
std::destroy_at(&list_v);
|
||||
break;
|
||||
case Type::Map:
|
||||
map_v.~TMap();
|
||||
std::destroy_at(&map_v);
|
||||
break;
|
||||
case Type::Vertex:
|
||||
vertex_v.~VertexAccessor();
|
||||
std::destroy_at(&vertex_v);
|
||||
break;
|
||||
case Type::Edge:
|
||||
edge_v.~EdgeAccessor();
|
||||
std::destroy_at(&edge_v);
|
||||
break;
|
||||
case Type::Path:
|
||||
path_v.~Path();
|
||||
std::destroy_at(&path_v);
|
||||
break;
|
||||
case Type::Date:
|
||||
case Type::LocalTime:
|
||||
case Type::LocalDateTime:
|
||||
case Type::Duration:
|
||||
break;
|
||||
case Type::Graph:
|
||||
graph_v.~Graph();
|
||||
case Type::Graph: {
|
||||
auto *graph = graph_v.release();
|
||||
std::destroy_at(&graph_v);
|
||||
if (graph) {
|
||||
utils::Allocator<Graph>(memory_).delete_object(graph);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
type_ = TypedValue::Type::Null;
|
||||
|
||||
@@ -416,7 +416,8 @@ class TypedValue {
|
||||
* element-wise move and graph is not guaranteed to be empty.
|
||||
*/
|
||||
TypedValue(Graph &&graph, utils::MemoryResource *memory) : memory_(memory), type_(Type::Graph) {
|
||||
new (&graph_v) Graph(std::move(graph), memory_);
|
||||
auto *graph_ptr = utils::Allocator<Graph>(memory_).new_object<Graph>(std::move(graph));
|
||||
new (&graph_v) std::unique_ptr<Graph>(graph_ptr);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -547,7 +548,8 @@ class TypedValue {
|
||||
utils::LocalTime local_time_v;
|
||||
utils::LocalDateTime local_date_time_v;
|
||||
utils::Duration duration_v;
|
||||
Graph graph_v;
|
||||
// As the unique_ptr is not allocator aware, it requires special attention when copying or moving graphs
|
||||
std::unique_ptr<Graph> graph_v;
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
@@ -254,6 +254,22 @@ class GraphSession {
|
||||
Execute(fmt::format("MATCH ()-[e]->() WHERE e.id > {} AND e.id < {} SET e.value = {}", lo, hi, num));
|
||||
}
|
||||
|
||||
void CheckGraphProjection() {
|
||||
uint64_t vertex_id = *vertices_.rbegin();
|
||||
uint64_t lo = std::floor(GetRandom() * vertex_id);
|
||||
uint64_t hi = std::floor(lo + vertex_id * 0.01);
|
||||
|
||||
Execute(fmt::format(
|
||||
"MATCH p=()-[e]->() WHERE e.id > {} AND e.id < {} WITH project(p) as graph WITH graph.nodes as nodes "
|
||||
"UNWIND nodes as n RETURN n.x "
|
||||
"as x ORDER BY x DESC",
|
||||
lo, hi));
|
||||
Execute(fmt::format(
|
||||
"MATCH p=()-[e]->() WHERE e.id > {} AND e.id < {} WITH project(p) as graph WITH graph.edges as edges "
|
||||
"UNWIND edges as e RETURN e.prop as y ORDER BY y DESC",
|
||||
lo, hi));
|
||||
}
|
||||
|
||||
/** Checks if the local info corresponds to DB state */
|
||||
void VerifyGraph() {
|
||||
// helper lambda for set verification
|
||||
@@ -357,6 +373,7 @@ class GraphSession {
|
||||
} else {
|
||||
CreateVertices(1);
|
||||
}
|
||||
CheckGraphProjection();
|
||||
}
|
||||
|
||||
// final verification
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
|
||||
#include "gtest/gtest.h"
|
||||
|
||||
#include "query/graph.hpp"
|
||||
#include "query/typed_value.hpp"
|
||||
#include "storage/v2/storage.hpp"
|
||||
|
||||
@@ -48,8 +49,13 @@ class AllTypesFixture : public testing::Test {
|
||||
{"e", TypedValue()}});
|
||||
auto vertex = dba.InsertVertex();
|
||||
values_.emplace_back(vertex);
|
||||
values_.emplace_back(*dba.InsertEdge(&vertex, &vertex, dba.NameToEdgeType("et")));
|
||||
auto edge = *dba.InsertEdge(&vertex, &vertex, dba.NameToEdgeType("et"));
|
||||
values_.emplace_back(edge);
|
||||
values_.emplace_back(memgraph::query::Path(dba.InsertVertex()));
|
||||
memgraph::query::Graph graph{memgraph::utils::NewDeleteResource()};
|
||||
graph.InsertVertex(vertex);
|
||||
graph.InsertEdge(edge);
|
||||
values_.emplace_back(std::move(graph));
|
||||
}
|
||||
};
|
||||
|
||||
@@ -533,6 +539,18 @@ TEST_F(AllTypesFixture, PropagationOfMemoryOnConstruction) {
|
||||
EXPECT_EQ(copied.vertices(), original.vertices());
|
||||
EXPECT_EQ(copied.edges(), original.edges());
|
||||
EXPECT_EQ(copied.GetMemoryResource(), &monotonic_memory);
|
||||
} else if (value.type() == TypedValue::Type::Graph) {
|
||||
ASSERT_EQ(move_constructed_value.type(), value.type());
|
||||
const auto &original = value.ValueGraph();
|
||||
const auto &moved = move_constructed_value.ValueGraph();
|
||||
const auto &copied = copy_constructed_value.ValueGraph();
|
||||
EXPECT_EQ(original.GetMemoryResource(), memgraph::utils::NewDeleteResource());
|
||||
EXPECT_EQ(moved.vertices(), original.vertices());
|
||||
EXPECT_EQ(moved.edges(), original.edges());
|
||||
EXPECT_EQ(moved.GetMemoryResource(), &monotonic_memory);
|
||||
EXPECT_EQ(copied.vertices(), original.vertices());
|
||||
EXPECT_EQ(copied.edges(), original.edges());
|
||||
EXPECT_EQ(copied.GetMemoryResource(), &monotonic_memory);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user