>From b8a3640af3f06abb68a1e0b5a286a9ff7368a782 Mon Sep 17 00:00:00 2001
From: Alvaro Herrera <alvherre@alvh.no-ip.org>
Date: Tue, 10 Feb 2015 17:35:51 -0300
Subject: [PATCH 29/42] deparse: support SECURITY LABEL

---
 src/backend/tcop/deparse_utility.c | 38 +++++++++++++++++++++++++++++++++++++-
 src/backend/tcop/utility.c         |  3 ++-
 2 files changed, 39 insertions(+), 2 deletions(-)

diff --git a/src/backend/tcop/deparse_utility.c b/src/backend/tcop/deparse_utility.c
index 9d3ebba..bd0a4df 100644
--- a/src/backend/tcop/deparse_utility.c
+++ b/src/backend/tcop/deparse_utility.c
@@ -4117,6 +4117,41 @@ deparse_CommentStmt(Oid objectId, Oid objectSubId, Node *parsetree)
 }
 
 static ObjTree *
+deparse_SecLabelStmt(Oid objectId, Oid objectSubId, Node *parsetree)
+{
+	SecLabelStmt *node = (SecLabelStmt *) parsetree;
+	ObjTree	   *label;
+	ObjectAddress addr;
+	char	   *fmt;
+
+	if (node->label)
+	{
+		fmt = psprintf("SECURITY LABEL FOR %%{provider}s ON %s %%{identity}s IS %%{label}L",
+				   stringify_objtype(node->objtype));
+		label = new_objtree_VA(fmt, 0);
+
+		append_string_object(label, "label", node->label);
+	}
+	else
+	{
+		fmt = psprintf("SECURITY LABEL FOR %%{provider}s ON %s %%{identity}s IS NULL",
+				   stringify_objtype(node->objtype));
+		label = new_objtree_VA(fmt, 0);
+	}
+
+	append_string_object(label, "provider", node->provider);
+
+	addr.classId = get_objtype_catalog_oid(node->objtype);
+	addr.objectId = objectId;
+	addr.objectSubId = objectSubId;
+
+	append_string_object(label, "identity",
+						 getObjectIdentity(&addr));
+
+	return label;
+}
+
+static ObjTree *
 deparse_CreateConversion(Oid objectId, Node *parsetree)
 {
 	HeapTuple   conTup;
@@ -5113,7 +5148,8 @@ deparse_simple_command(StashedCommand *cmd)
 			break;
 
 		case T_SecLabelStmt:
-			elog(ERROR, "unimplemented deparse of %s", CreateCommandTag(parsetree));
+			command = deparse_SecLabelStmt(objectId, cmd->d.simple.objectSubId,
+										   parsetree);
 			break;
 
 		default:
diff --git a/src/backend/tcop/utility.c b/src/backend/tcop/utility.c
index 92bccf5..bec5231 100644
--- a/src/backend/tcop/utility.c
+++ b/src/backend/tcop/utility.c
@@ -1486,7 +1486,8 @@ ProcessUtilitySlow(Node *parsetree,
 				{
 					SecLabelStmt *stmt = (SecLabelStmt *) parsetree;
 
-					ExecSecLabelStmt(stmt);
+					objectId = ExecSecLabelStmt(stmt);
+					EventTriggerStashCommand(objectId, 0, stmt->objtype, InvalidOid, parsetree);
 				}
 				break;
 
-- 
2.1.4

