Index: /trunk/ippTools/share/stacktool_tosummary.sql
===================================================================
--- /trunk/ippTools/share/stacktool_tosummary.sql	(revision 35855)
+++ /trunk/ippTools/share/stacktool_tosummary.sql	(revision 35856)
@@ -1,3 +1,5 @@
-SELECT DISTINCT sass_id,rawExp.camera,stackRun.workdir,stackRun.tess_id,stackRun.state
+SELECT sass_id,camera,workdir,tess_id,state FROM 
+(SELECT sass_id,rawExp.camera,stackRun.workdir,stackRun.tess_id,stackRun.state,
+       sum((stackRun.state = 'full')) AS is_done, sum(1) AS is_defined
        FROM stackRun
        JOIN stackInputSkyfile ON stackRun.stack_id = stackInputSkyfile.stack_id
@@ -12,2 +14,6 @@
 WHERE stackRun.state = 'full' AND
       stackSummary.projection_cell IS NULL
+-- WHERE HOOK %s
+GROUP BY sass_id
+) AS T
+WHERE is_done = is_defined
Index: /trunk/ippTools/src/stacktool.c
===================================================================
--- /trunk/ippTools/src/stacktool.c	(revision 35855)
+++ /trunk/ippTools/src/stacktool.c	(revision 35856)
@@ -1475,10 +1475,11 @@
   // generate where strings for arguments that require extra processing
   // beyond PXOPT_COPY*
+  psString whereClause;
   if (psListLength(where->list)) {
-    psString whereClause = psDBGenerateWhereConditionSQL(where, NULL);
-    psStringAppend(&query, " AND %s", whereClause);
-    psFree(whereClause);
+    whereClause = psDBGenerateWhereConditionSQL(where, NULL);
+    psStringPrepend(&whereClause, "\n AND ");
   } else if (!all) {
     psError(PXTOOLS_ERR_CONFIG, true, "search parameters or -all are required");
+    psFree(whereClause);
     return false;
   }
@@ -1493,9 +1494,11 @@
   }
 
-  if (!p_psDBRunQuery(config->dbh, query)) {
+  if (!p_psDBRunQueryF(config->dbh, query, whereClause)) {
     psError(PS_ERR_UNKNOWN, false, "database error");
+    psFree(whereClause);
     psFree(query);
     return false;
   }
+  psFree(whereClause);
   psFree(query);
 
