v20260703-0004-Dropping-a-property-not-associated-with-th.patch
text/x-patch
Filename: v20260703-0004-Dropping-a-property-not-associated-with-th.patch
Type: text/x-patch
Part: 8
Patch
Format: format-patch
Series: patch v20260703-0004
Subject: Dropping a property not associated with the given label
| File | + | − |
|---|---|---|
| src/backend/commands/propgraphcmds.c | 19 | 28 |
| src/test/regress/expected/create_property_graph.out | 2 | 0 |
| src/test/regress/sql/create_property_graph.sql | 1 | 0 |
From b2754115b76231183ded49f608a9db1f806c10e4 Mon Sep 17 00:00:00 2001
From: Ashutosh Bapat <ashutosh.bapat.oss@gmail.com>
Date: Tue, 28 Apr 2026 12:43:40 +0530
Subject: [PATCH v20260703 04/14] Dropping a property not associated with the
given label
When dropping a property by name from a label, the code checked only
whether the property existed in the graph's property catalog. It did not
verify that the property was actually associated with the given label,
resulting in passing InvalidOid to performDeletion(). Fix it by
explicilty checking the label property association.
While at it also rearrange the code so as to avoid multiple ereport
calls for the same error in the same block.
Reported by: Chao Li <lic@highgo.com>
Author: Chao Li <lic@highgo.com>
Reviewed by: Ashutosh Bapat <ashutosh.bapat.oss@gmail.com>
Discussion: https://postgr.es/m/1DA5D52A-4AFA-426E-83F7-42ED974D682B@gmail.com
---
src/backend/commands/propgraphcmds.c | 47 ++++++++-----------
.../expected/create_property_graph.out | 2 +
.../regress/sql/create_property_graph.sql | 1 +
3 files changed, 22 insertions(+), 28 deletions(-)
diff --git a/src/backend/commands/propgraphcmds.c b/src/backend/commands/propgraphcmds.c
index 4c0fe763b5c..510cc1ccc03 100644
--- a/src/backend/commands/propgraphcmds.c
+++ b/src/backend/commands/propgraphcmds.c
@@ -1611,7 +1611,7 @@ AlterPropGraph(ParseState *pstate, const AlterPropGraphStmt *stmt)
Oid peoid;
Oid pgerelid;
Oid labeloid;
- Oid ellabeloid;
+ Oid ellabeloid = InvalidOid;
if (stmt->element_kind == PROPGRAPH_ELEMENT_KIND_VERTEX)
peoid = get_vertex_oid(pstate, pgrelid, stmt->element_alias, -1);
@@ -1622,17 +1622,11 @@ AlterPropGraph(ParseState *pstate, const AlterPropGraphStmt *stmt)
Anum_pg_propgraph_label_oid,
ObjectIdGetDatum(pgrelid),
CStringGetDatum(stmt->alter_label));
- if (!labeloid)
- ereport(ERROR,
- errcode(ERRCODE_UNDEFINED_OBJECT),
- errmsg("property graph \"%s\" element \"%s\" has no label \"%s\"",
- get_rel_name(pgrelid), stmt->element_alias, stmt->alter_label),
- parser_errposition(pstate, -1));
-
- ellabeloid = GetSysCacheOid2(PROPGRAPHELEMENTLABELELEMENTLABEL,
- Anum_pg_propgraph_element_label_oid,
- ObjectIdGetDatum(peoid),
- ObjectIdGetDatum(labeloid));
+ if (labeloid)
+ ellabeloid = GetSysCacheOid2(PROPGRAPHELEMENTLABELELEMENTLABEL,
+ Anum_pg_propgraph_element_label_oid,
+ ObjectIdGetDatum(peoid),
+ ObjectIdGetDatum(labeloid));
if (!ellabeloid)
ereport(ERROR,
errcode(ERRCODE_UNDEFINED_OBJECT),
@@ -1653,7 +1647,7 @@ AlterPropGraph(ParseState *pstate, const AlterPropGraphStmt *stmt)
{
Oid peoid;
Oid labeloid;
- Oid ellabeloid;
+ Oid ellabeloid = InvalidOid;
ObjectAddress obj;
if (stmt->element_kind == PROPGRAPH_ELEMENT_KIND_VERTEX)
@@ -1665,17 +1659,11 @@ AlterPropGraph(ParseState *pstate, const AlterPropGraphStmt *stmt)
Anum_pg_propgraph_label_oid,
ObjectIdGetDatum(pgrelid),
CStringGetDatum(stmt->alter_label));
- if (!labeloid)
- ereport(ERROR,
- errcode(ERRCODE_UNDEFINED_OBJECT),
- errmsg("property graph \"%s\" element \"%s\" has no label \"%s\"",
- get_rel_name(pgrelid), stmt->element_alias, stmt->alter_label),
- parser_errposition(pstate, -1));
-
- ellabeloid = GetSysCacheOid2(PROPGRAPHELEMENTLABELELEMENTLABEL,
- Anum_pg_propgraph_element_label_oid,
- ObjectIdGetDatum(peoid),
- ObjectIdGetDatum(labeloid));
+ if (labeloid)
+ ellabeloid = GetSysCacheOid2(PROPGRAPHELEMENTLABELELEMENTLABEL,
+ Anum_pg_propgraph_element_label_oid,
+ ObjectIdGetDatum(peoid),
+ ObjectIdGetDatum(labeloid));
if (!ellabeloid)
ereport(ERROR,
@@ -1688,21 +1676,24 @@ AlterPropGraph(ParseState *pstate, const AlterPropGraphStmt *stmt)
{
char *propname = strVal(lfirst(lc));
Oid propoid;
- Oid plpoid;
+ Oid plpoid = InvalidOid;
propoid = GetSysCacheOid2(PROPGRAPHPROPNAME,
Anum_pg_propgraph_property_oid,
ObjectIdGetDatum(pgrelid),
CStringGetDatum(propname));
- if (!propoid)
+ if (propoid)
+ plpoid = GetSysCacheOid2(PROPGRAPHLABELPROP,
+ Anum_pg_propgraph_label_property_oid,
+ ObjectIdGetDatum(ellabeloid),
+ ObjectIdGetDatum(propoid));
+ if (!plpoid)
ereport(ERROR,
errcode(ERRCODE_UNDEFINED_OBJECT),
errmsg("property graph \"%s\" element \"%s\" label \"%s\" has no property \"%s\"",
get_rel_name(pgrelid), stmt->element_alias, stmt->alter_label, propname),
parser_errposition(pstate, -1));
- plpoid = GetSysCacheOid2(PROPGRAPHLABELPROP, Anum_pg_propgraph_label_property_oid, ObjectIdGetDatum(ellabeloid), ObjectIdGetDatum(propoid));
-
ObjectAddressSet(obj, PropgraphLabelPropertyRelationId, plpoid);
performDeletion(&obj, stmt->drop_behavior, 0);
}
diff --git a/src/test/regress/expected/create_property_graph.out b/src/test/regress/expected/create_property_graph.out
index 5930d844319..7f12697bbd5 100644
--- a/src/test/regress/expected/create_property_graph.out
+++ b/src/test/regress/expected/create_property_graph.out
@@ -89,6 +89,8 @@ CREATE PROPERTY GRAPH g4
);
ALTER PROPERTY GRAPH g4 ALTER VERTEX TABLE t2 ALTER LABEL t2 ADD PROPERTIES (k * 2 AS kk);
ALTER PROPERTY GRAPH g4 ALTER VERTEX TABLE t2 ALTER LABEL t2 DROP PROPERTIES (k);
+ALTER PROPERTY GRAPH g4 ALTER VERTEX TABLE t2 ALTER LABEL t2 DROP PROPERTIES (yy); -- error
+ERROR: property graph "g4" element "t2" label "t2" has no property "yy"
CREATE TABLE t11 (a int PRIMARY KEY);
CREATE TABLE t12 (b int PRIMARY KEY);
CREATE TABLE t13 (
diff --git a/src/test/regress/sql/create_property_graph.sql b/src/test/regress/sql/create_property_graph.sql
index a4285ef8846..171260ac69f 100644
--- a/src/test/regress/sql/create_property_graph.sql
+++ b/src/test/regress/sql/create_property_graph.sql
@@ -80,6 +80,7 @@ CREATE PROPERTY GRAPH g4
ALTER PROPERTY GRAPH g4 ALTER VERTEX TABLE t2 ALTER LABEL t2 ADD PROPERTIES (k * 2 AS kk);
ALTER PROPERTY GRAPH g4 ALTER VERTEX TABLE t2 ALTER LABEL t2 DROP PROPERTIES (k);
+ALTER PROPERTY GRAPH g4 ALTER VERTEX TABLE t2 ALTER LABEL t2 DROP PROPERTIES (yy); -- error
CREATE TABLE t11 (a int PRIMARY KEY);
CREATE TABLE t12 (b int PRIMARY KEY);
--
2.34.1