diff --git a/contrib/pageinspect/heapfuncs.c b/contrib/pageinspect/heapfuncs.c
index 7438257c5bbc61e32f028dd2f3472b0f1f72afb0..d96ba1e8b610db687a20f45fcc92db0b7b60fe91 100644
--- a/contrib/pageinspect/heapfuncs.c
+++ b/contrib/pageinspect/heapfuncs.c
@@ -298,9 +298,8 @@ tuple_data_split_internal(Oid relid, char *tupdata,
 	TupleDesc	tupdesc;
 
 	/* Get tuple descriptor from relation OID */
-	rel = relation_open(relid, NoLock);
-	tupdesc = CreateTupleDescCopyConstr(rel->rd_att);
-	relation_close(rel, NoLock);
+	rel = relation_open(relid, AccessShareLock);
+	tupdesc = RelationGetDescr(rel);
 
 	raw_attrs = initArrayResult(BYTEAOID, CurrentMemoryContext, false);
 	nattrs = tupdesc->natts;
@@ -317,7 +316,6 @@ tuple_data_split_internal(Oid relid, char *tupdata,
 		bytea	   *attr_data = NULL;
 
 		attr = TupleDescAttr(tupdesc, i);
-		is_null = (t_infomask & HEAP_HASNULL) && att_isnull(i, t_bits);
 
 		/*
 		 * Tuple header can specify less attributes than tuple descriptor as
@@ -327,6 +325,8 @@ tuple_data_split_internal(Oid relid, char *tupdata,
 		 */
 		if (i >= (t_infomask2 & HEAP_NATTS_MASK))
 			is_null = true;
+		else
+			is_null = (t_infomask & HEAP_HASNULL) && att_isnull(i, t_bits);
 
 		if (!is_null)
 		{
@@ -386,6 +386,8 @@ tuple_data_split_internal(Oid relid, char *tupdata,
 				(errcode(ERRCODE_DATA_CORRUPTED),
 				 errmsg("end of tuple reached without looking at all its data")));
 
+	relation_close(rel, AccessShareLock);
+
 	return makeArrayResult(raw_attrs, CurrentMemoryContext);
 }