Index: trunk/ippTools/src/releasetool.c
===================================================================
--- trunk/ippTools/src/releasetool.c	(revision 37095)
+++ trunk/ippTools/src/releasetool.c	(revision 37122)
@@ -48,4 +48,5 @@
 static bool updaterelstackMode(pxConfig *config);
 static bool listrelstackMode(pxConfig *config);
+static bool deleterelstackMode(pxConfig *config);
 static bool summaryMode(pxConfig *config);
 static bool definerelgroupMode(pxConfig *config);
@@ -87,4 +88,5 @@
         MODECASE(RELEASETOOL_MODE_UPDATERELSTACK,   updaterelstackMode);
         MODECASE(RELEASETOOL_MODE_LISTRELSTACK,     listrelstackMode);
+        MODECASE(RELEASETOOL_MODE_DELETERELSTACK,   deleterelstackMode);
         MODECASE(RELEASETOOL_MODE_SUMMARY,          summaryMode);
 
@@ -857,6 +859,6 @@
     PXOPT_COPY_STR(config->args, where, "-exp_name", "rawExp.exp_name", "==");
 
-    PXOPT_COPY_S32(config->args, where, "-rel_id",  "rel_id", "==");
-    PXOPT_COPY_STR(config->args, where, "-release_name", "release_name", "==");
+    PXOPT_COPY_S32(config->args, where, "-rel_id",  "relExp.rel_id", "==");
+    PXOPT_COPY_STR(config->args, where, "-release_name", "ippRelease.release_name", "==");
 
     psString query = pxDataGet("releasetool_deleterelexp.sql");
@@ -1088,4 +1090,57 @@
     return false;
 }
+static bool deleterelstackMode(pxConfig *config)
+{
+    PS_ASSERT_PTR_NON_NULL(config, false);
+
+    PXOPT_LOOKUP_S64(relstack_id, config->args,   "-relstack_id", false, false);
+    // If relexp_id is supplied that is all that we need
+    if (!relstack_id) {
+        // Otherwise we need to identify the release ...
+        PXOPT_LOOKUP_STR(release_name, config->args, "-release_name", false, false);
+        PXOPT_LOOKUP_S32(rel_id, config->args,      "-rel_id", false, false);
+
+        if (!release_name && !rel_id) {
+            psError(PXTOOLS_ERR_CONFIG, true, "at least one of -relstack_id, -release_name, or -rel_id is required\n");
+            return false;
+        }
+        // ... and the Stack
+        PXOPT_LOOKUP_STR(label, config->args,       "-label", false, false);
+        PXOPT_LOOKUP_S64(stack_id, config->args,    "-stack_id", false, false);
+        if (!label && !stack_id) {
+            psError(PXTOOLS_ERR_CONFIG, true, "at least one of -label and  -stack_id is required\n");
+            return false;
+        }
+    }
+
+    psMetadata *where = psMetadataAlloc();
+
+    PXOPT_COPY_S32(config->args, where, "-relstack_id", "relStack.relstack_id", "==");
+    PXOPT_COPY_STR(config->args, where, "-label", "stackRun.label", "==");
+    PXOPT_COPY_S64(config->args, where, "-stack_id", "relStack.stack_id", "==");
+
+    PXOPT_COPY_S32(config->args, where, "-rel_id", "relStack.rel_id", "==");
+    PXOPT_COPY_STR(config->args, where, "-release_name", "ippRelease.release_name", "==");
+
+    psString query = pxDataGet("releasetool_deleterelstack.sql");
+
+    psString whereClause = psDBGenerateWhereConditionSQL(where, NULL);
+    psStringAppend(&query, "\n    AND %s", whereClause);
+    psFree(whereClause);
+
+    if (!p_psDBRunQuery(config->dbh, query)) {
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        psFree(query);
+        return false;
+    }
+
+    psU64 affected = psDBAffectedRows(config->dbh);
+    psLogMsg("releasetool", PS_LOG_INFO, "Deleted %" PRIu64 " relStack rows", affected);
+
+
+    psFree(query);
+
+    return true;
+}
 
 static bool listrelstackMode(pxConfig *config)
