v1-changed-event_trigger-for-DEFAULT-VALUE.patch
text/x-patch
Filename: v1-changed-event_trigger-for-DEFAULT-VALUE.patch
Type: text/x-patch
Part: 0
Patch
Format: format-patch
Series: patch v1
Subject: Changed event_trigger for DEFAULT VALUE
| File | + | − |
|---|---|---|
| src/backend/commands/event_trigger.c | 80 | 57 |
From aefa629be36f74b3067317ed67874f6eeeeafc73 Mon Sep 17 00:00:00 2001
From: Antoine Violin <a.violin@postgrespro.ru>
Date: Mon, 30 Jun 2025 10:20:52 +0700
Subject: [PATCH] Changed event_trigger for DEFAULT VALUE
---
src/backend/commands/event_trigger.c | 137 ++++++++++++++++-----------
1 file changed, 80 insertions(+), 57 deletions(-)
diff --git a/src/backend/commands/event_trigger.c b/src/backend/commands/event_trigger.c
index 31b2f51b589..e3aa1d36c26 100644
--- a/src/backend/commands/event_trigger.c
+++ b/src/backend/commands/event_trigger.c
@@ -21,6 +21,7 @@
#include "catalog/dependency.h"
#include "catalog/indexing.h"
#include "catalog/objectaccess.h"
+#include "catalog/pg_attrdef.h"
#include "catalog/pg_authid.h"
#include "catalog/pg_auth_members.h"
#include "catalog/pg_database.h"
@@ -1276,6 +1277,69 @@ trackDroppedObjectsNeeded(void)
* objects "reentrantly".
*/
+static bool
+process_catalog_object(Oid classId, Oid objectId, SQLDropObject *obj)
+{
+ Relation catalog;
+ HeapTuple tuple;
+
+ catalog = table_open(classId, AccessShareLock);
+ tuple = get_catalog_object_by_oid(catalog,
+ get_object_attnum_oid(classId),
+ objectId);
+
+ if (tuple)
+ {
+ AttrNumber attnum;
+ Datum datum;
+ bool isnull;
+
+ attnum = get_object_attnum_namespace(classId);
+ if (attnum != InvalidAttrNumber)
+ {
+ datum = heap_getattr(tuple, attnum,
+ RelationGetDescr(catalog), &isnull);
+ if (!isnull)
+ {
+ Oid namespaceId;
+
+ namespaceId = DatumGetObjectId(datum);
+ /* temp objects are only reported if they are my own */
+ if (isTempNamespace(namespaceId))
+ {
+ obj->schemaname = "pg_temp";
+ obj->istemp = true;
+ }
+ else if (isAnyTempNamespace(namespaceId))
+ {
+ table_close(catalog, AccessShareLock);
+ return false;
+ }
+ else
+ {
+ obj->schemaname = get_namespace_name(namespaceId);
+ obj->istemp = false;
+ }
+ }
+ }
+
+ if (get_object_namensp_unique(classId) &&
+ obj->address.objectSubId == 0)
+ {
+ attnum = get_object_attnum_name(classId);
+ if (attnum != InvalidAttrNumber)
+ {
+ datum = heap_getattr(tuple, attnum,
+ RelationGetDescr(catalog), &isnull);
+ if (!isnull)
+ obj->objname = pstrdup(NameStr(*DatumGetName(datum)));
+ }
+ }
+ }
+
+ table_close(catalog, AccessShareLock);
+ return true;
+}
/*
* Register one object as being dropped by the current command.
*/
@@ -1302,7 +1366,6 @@ EventTriggerSQLDropAddObject(const ObjectAddress *object, bool original, bool no
obj->address = *object;
obj->original = original;
obj->normal = normal;
-
/*
* Obtain schema names from the object's catalog tuple, if one exists;
* this lets us skip objects in temp schemas. We trust that
@@ -1311,66 +1374,26 @@ EventTriggerSQLDropAddObject(const ObjectAddress *object, bool original, bool no
*/
if (is_objectclass_supported(object->classId))
{
- Relation catalog;
- HeapTuple tuple;
-
- catalog = table_open(obj->address.classId, AccessShareLock);
- tuple = get_catalog_object_by_oid(catalog,
- get_object_attnum_oid(object->classId),
- obj->address.objectId);
-
- if (tuple)
+ if (!process_catalog_object(object->classId, object->objectId, obj))
{
- AttrNumber attnum;
- Datum datum;
- bool isnull;
-
- attnum = get_object_attnum_namespace(obj->address.classId);
- if (attnum != InvalidAttrNumber)
- {
- datum = heap_getattr(tuple, attnum,
- RelationGetDescr(catalog), &isnull);
- if (!isnull)
- {
- Oid namespaceId;
-
- namespaceId = DatumGetObjectId(datum);
- /* temp objects are only reported if they are my own */
- if (isTempNamespace(namespaceId))
- {
- obj->schemaname = "pg_temp";
- obj->istemp = true;
- }
- else if (isAnyTempNamespace(namespaceId))
- {
- pfree(obj);
- table_close(catalog, AccessShareLock);
- MemoryContextSwitchTo(oldcxt);
- return;
- }
- else
- {
- obj->schemaname = get_namespace_name(namespaceId);
- obj->istemp = false;
- }
- }
- }
-
- if (get_object_namensp_unique(obj->address.classId) &&
- obj->address.objectSubId == 0)
+ pfree(obj);
+ MemoryContextSwitchTo(oldcxt);
+ return;
+ }
+ }
+ else if (object->classId == AttrDefaultRelationId)
+ {
+ ObjectAddress relAddress;
+ relAddress = GetAttrDefaultColumnAddress(object->objectId);
+ if (OidIsValid(relAddress.objectId))
+ {
+ if(!process_catalog_object(relAddress.classId, relAddress.objectId, obj))
{
- attnum = get_object_attnum_name(obj->address.classId);
- if (attnum != InvalidAttrNumber)
- {
- datum = heap_getattr(tuple, attnum,
- RelationGetDescr(catalog), &isnull);
- if (!isnull)
- obj->objname = pstrdup(NameStr(*DatumGetName(datum)));
- }
+ pfree(obj);
+ MemoryContextSwitchTo(oldcxt);
+ return;
}
}
-
- table_close(catalog, AccessShareLock);
}
else
{
--
2.43.0