From 05d8314e59587dcf2b3f9509ecd0abc84241fe9f Mon Sep 17 00:00:00 2001 From: Rafsun Masud Date: Fri, 3 Nov 2023 10:00:59 -0700 Subject: [PATCH] Fix issue #1347 - unknow type of agtype container 0 The error was caused by the Datum referenced by edge_entry->edge_properties becoming non-persistent. As a result, the pointer becomes dangling. This issue is fixed by making a copy of the Datum into the MemoryContext it is used. The fix is also applied to vertex_entry->vertex_properties. Thanks to John for finding out the correct function to copy a Datum. Co-authored-by: John Gemignani --- src/backend/utils/adt/age_global_graph.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/backend/utils/adt/age_global_graph.c b/src/backend/utils/adt/age_global_graph.c index fec676158..240e1367d 100644 --- a/src/backend/utils/adt/age_global_graph.c +++ b/src/backend/utils/adt/age_global_graph.c @@ -25,13 +25,13 @@ #include "access/table.h" #include "access/tableam.h" #include "catalog/namespace.h" +#include "common/hashfn.h" #include "commands/label_commands.h" +#include "utils/datum.h" #include "utils/lsyscache.h" #include "utils/memutils.h" #include "utils/rel.h" #include "utils/snapmgr.h" -#include "commands/label_commands.h" -#include "common/hashfn.h" #include "catalog/ag_graph.h" #include "catalog/ag_label.h" @@ -448,6 +448,8 @@ static void load_vertex_hashtable(GRAPH_global_context *ggctx) /* get the vertex properties datum */ vertex_properties = column_get_datum(tupdesc, tuple, 1, "properties", AGTYPEOID, true); + /* we need to make a copy of the properties datum */ + vertex_properties = datumCopy(vertex_properties, false, -1); /* insert vertex into vertex hashtable */ inserted = insert_vertex_entry(ggctx, vertex_id, @@ -561,6 +563,9 @@ static void load_edge_hashtable(GRAPH_global_context *ggctx) edge_properties = column_get_datum(tupdesc, tuple, 3, "properties", AGTYPEOID, true); + /* we need to make a copy of the properties datum */ + edge_properties = datumCopy(edge_properties, false, -1); + /* insert edge into edge hashtable */ inserted = insert_edge(ggctx, edge_id, edge_properties, edge_vertex_start_id, edge_vertex_end_id,