Index: /branches/eam_branches/ipp-20220316/Ohana/src/opihi/cmd.data/subset.c
===================================================================
--- /branches/eam_branches/ipp-20220316/Ohana/src/opihi/cmd.data/subset.c	(revision 42156)
+++ /branches/eam_branches/ipp-20220316/Ohana/src/opihi/cmd.data/subset.c	(revision 42157)
@@ -44,5 +44,5 @@
   ResetVector (ovec, ivec->type, tvec[0].Nelements);
 
-  // we have four cases: (ivec == flt or int) and (tvec == flt or int)
+  // we have size cases: (ivec == flt, int, str) and (tvec == flt or int)
   if ((ivec->type == OPIHI_FLT) && (tvec->type == OPIHI_FLT)) {
     opihi_flt *vi = ivec[0].elements.Flt;
@@ -81,4 +81,23 @@
     }
   }
+  // XXX if ivec is an existing vector, this step will
+  // leak (existing elements need to be freed if they
+  // have been allocated).
+  if ((ivec->type == OPIHI_STR) && (tvec->type == OPIHI_FLT)) {
+    opihi_flt *vt = tvec[0].elements.Flt;
+    for (Npts = i = 0; i < tvec[0].Nelements; i++, vt++) {
+      if (!*vt) continue;
+      ovec[0].elements.Str[Npts] = strcreate(ivec[0].elements.Str[i]);
+      Npts++;
+    }
+  }
+  if ((ivec->type == OPIHI_STR) && (tvec->type == OPIHI_INT)) {
+    opihi_int *vt = tvec[0].elements.Int;
+    for (Npts = i = 0; i < tvec[0].Nelements; i++, vt++) {
+      if (!*vt) continue;
+      ovec[0].elements.Str[Npts] = strcreate(ivec[0].elements.Str[i]);
+      Npts++;
+    }
+  }
 
   // free up unused memory
