Index: trunk/ippTools/src/stacktool.c
===================================================================
--- trunk/ippTools/src/stacktool.c	(revision 18675)
+++ trunk/ippTools/src/stacktool.c	(revision 18676)
@@ -101,4 +101,5 @@
     psMetadata *whereRE = psMetadataAlloc(); // rawExp where
     psMetadata *whereWSF = psMetadataAlloc(); // warpSkyfile where
+    psMetadata *having = psMetadataAlloc(); // HAVING clause
     // map -inst -> camera, etc
     PXOPT_COPY_STR(config->args, whereRE, "-select_inst", "camera", "==");
@@ -121,8 +122,8 @@
 
     PXOPT_COPY_STR(config->args, having, "-select_skycell_id", "skycell_id", "==");
+    PXOPT_COPY_S32(config->args, having, "-min_num", "num_warp", ">=");
 
     PXOPT_LOOKUP_S32(randomLimit, config->args, "-random", false, false);
 
-    PXOPT_LOOKUP_S32(min_num, config->args, "-min_num", false, false);
     PXOPT_LOOKUP_S32(min_new, config->args, "-min_new", false, false);
     PXOPT_LOOKUP_F32(min_frac, config->args, "-min_frac", false, false);
@@ -170,25 +171,31 @@
     psFree(groupby);
 
-    psString having = NULL;             // HAVING string
-    if (min_num > 0) {
-        psStringAppend(&having, " min_num >= %d", min_num);
-    }
-    if (min_new > 0) {
-        if (having) {
-            psStringAppend(&having, " AND");
-        }
-        psStringAppend(&having, " ((num_warp - num_stack >= %d) OR num_stack IS NULL)", min_new);
-    }
-    if (isfinite(min_frac)) {
-        if (having) {
-            psStringAppend(&having, " AND");
-        }
-        // Avoiding division by zero
-        psStringAppend(&select, " ((num_warp >= %f * num_stack) OR num_stack IS NULL)", (double)min_frac);
-    }
-    if (having) {
-        psStringAppend(&select, " HAVING %s", having);
-        psFree(having);
-    }
+    // Restriction on aggregated quantities using HAVING
+    {
+        psString havingClause = NULL;   // HAVING string
+        if (psListLength(having->list)) {
+            havingClause = psDBGenerateWhereConditionSQL(having, NULL);
+        }
+
+        if (min_new > 0) {
+            if (havingClause) {
+                psStringAppend(&havingClause, " AND");
+            }
+            psStringAppend(&havingClause, " ((num_warp - num_stack >= %d) OR num_stack IS NULL)", min_new);
+        }
+        if (isfinite(min_frac)) {
+            if (havingClause) {
+                psStringAppend(&havingClause, " AND");
+            }
+            // Avoiding division by zero
+            psStringAppend(&havingClause, " ((num_warp >= %f * num_stack) OR num_stack IS NULL)",
+                           (double)min_frac);
+        }
+        if (havingClause) {
+            psStringAppend(&select, " HAVING %s", havingClause);
+            psFree(havingClause);
+        }
+    }
+    psFree(having);
 
 
