3bae5ca22bf4695cff6eeb0988cc9708e1c83105
angie
  Mon Jul 25 12:20:15 2016 -0700
Added missing SQL 'on' keyword -- triggered by joining snp147Mult with snp147ExceptionDesc (snp147Mult is a non-huge table and exceptions is comma-separated list).

diff --git src/hg/lib/annoStreamDb.c src/hg/lib/annoStreamDb.c
index a550f6c..ce6b30c 100644
--- src/hg/lib/annoStreamDb.c
+++ src/hg/lib/annoStreamDb.c
@@ -214,31 +214,31 @@
     }
 else
     {
     // Use both a and b of the first pair and only b of each subsequent pair
     appendOneTable(self, self->joinMixer->sqlRouteList->a, query);
     struct joinerPair *jp;
     for (jp = self->joinMixer->sqlRouteList;  jp != NULL;  jp = jp->next)
         {
         dyStringAppend(query, " left join ");
         appendOneTable(self, jp->b, query);
         char fieldA[PATH_LEN], fieldB[PATH_LEN];
         joinerDtfToSqlFieldString(jp->a, self->db, fieldA, sizeof(fieldA));
         joinerDtfToSqlFieldString(jp->b, self->db, fieldB, sizeof(fieldB));
         struct joinerField *jfA = joinerSetFindField(jp->identifier, jp->a);
         if (sameOk(jfA->separator, ","))
-            dyStringPrintf(query, " find_in_set(%s, %s)", fieldB, fieldA);
+            dyStringPrintf(query, " on find_in_set(%s, %s)", fieldB, fieldA);
         else
             dyStringPrintf(query, " on %s = %s", fieldA, fieldB);
         hasLeftJoin = TRUE;
         }
     }
 return hasLeftJoin;
 }
 
 // libify?
 static struct joinerDtf *joinerDtfCloneList(struct joinerDtf *listIn)
 /* Return a list with cloned items of listIn. */
 {
 struct joinerDtf *listOut = NULL, *item;
 for (item = listIn;  item != NULL;  item = item->next)
     slAddHead(&listOut, joinerDtfClone(item));