cdb348c551227ac24dc0fab9f18516459b47b962
braney
  Sat Sep 5 11:33:32 2026 -0700
hgTrackUi: don't try MySQL for a GenArk quickLift source assembly, refs #38272

The track settings page swaps in the track's quickLiftDb for the database it
passes down to the cfg routines.  For a GenArk source that is a bare accession
with no MySQL database behind it, and asForDb() connected anyway, so the page
stopped after the display-mode row.  trackHubDatabase() does not catch this
because the source hub is not loaded in that request; hgc got the matching
isGenArk() guard in #37388.

Two filter blocks in the same file guarded with isHubTrack(), a plain hub_
prefix test that a bare accession also slips past.  Same guard added there.

diff --git src/hg/lib/hui.c src/hg/lib/hui.c
index ba3f2b888ac..51caa008e9b 100644
--- src/hg/lib/hui.c
+++ src/hg/lib/hui.c
@@ -7028,31 +7028,31 @@
                                  boolean boxed, boolean parentLevel,char *name, char *title,
                                  boolean isHighlight)
 // Shows all *Filter style filters.  Note that these are in random order and have no graceful title
 {
 int count = 0;
 struct trackDbFilter *trackDbFilters = NULL;
 if (isHighlight)
     trackDbFilters = tdbGetTrackNumHighlights(tdb);
 else
     trackDbFilters = tdbGetTrackNumFilters(tdb);
 if (trackDbFilters)
     {
     puts("<BR>");
     struct trackDbFilter *filter = NULL;
     struct sqlConnection *conn = NULL;
-    if (!isHubTrack(db))
+    if (!isHubTrack(db) && !isGenArk(db))
         conn = hAllocConnTrack(db, tdb);
     struct asObject *as = asForTdb(conn, tdb);
     hFreeConn(&conn);
 
     while ((filter = slPopHead(&trackDbFilters)) != NULL)
         {
         char *field = filter->fieldName;
         char *scoreName = cloneString(filter->name);
         char *trackDbLabel = getLabelSetting(cart, tdb, field);
 
         if (as != NULL)
             {
             struct asColumn *asCol = asColumnFind(as, field);
             if (asCol != NULL)
                 { // Found label so replace field; strip "|..." suffix used for detail page
@@ -7172,31 +7172,31 @@
 
 static int textFiltersShowAll(char *db, struct cart *cart, struct trackDb *tdb, boolean isHighlight)
 /* Show all the text filters for this track. */
 {
 int count = 0;
 struct trackDbFilter *trackDbFilters = NULL;
 if (isHighlight)
     trackDbFilters = tdbGetTrackTextHighlights(tdb);
 else
     trackDbFilters = tdbGetTrackTextFilters(tdb);
 if (trackDbFilters)
     {
     puts("<BR>");
     struct trackDbFilter *filter = NULL;
     struct sqlConnection *conn = NULL;
-    if (!isHubTrack(db))
+    if (!isHubTrack(db) && !isGenArk(db))
         conn = hAllocConnTrack(db, tdb);
     struct asObject *as = asForTdb(conn, tdb);
     hFreeConn(&conn);
     while ((filter = slPopHead(&trackDbFilters)) != NULL)
         {
         char *trackDbLabel = getLabelSetting(cart, tdb, filter->fieldName);
         char *value = cartUsualStringClosestToHome(cart, tdb, FALSE, filter->name, filter->setting);
         if (as != NULL)
             {
             struct asColumn *asCol = asColumnFind(as, filter->fieldName);
             if (asCol != NULL)
                 {
                 if (trackDbLabel == NULL)
                     trackDbLabel = asCol->comment;
                 }
@@ -10606,31 +10606,33 @@
 struct asObject *asObj = NULL;
 // Wrap some error catching around asForTdbOrDie.
 if (errCatchStart(errCatch))
     {
     asObj = asForTdbOrDie(conn, tdb);
     }
 errCatchEnd(errCatch);
 errCatchFree(&errCatch);
 return asObj;
 }
 
 struct asObject *asForDb(struct trackDb *tdb, char* database)
 /* return asObject given the database. NULL if not found */
 {
 struct sqlConnection *conn = NULL ;
-if (!trackHubDatabase(database))
+// database can be a quickLift track's source assembly, which for a GenArk arrives
+// here as a bare accession with no MySQL database behind it.
+if (!trackHubDatabase(database) && !isGenArk(database))
     conn = hAllocConnTrack(database, tdb);
 struct asObject *as = asForTdb(conn, tdb);
 hFreeConn(&conn);
 return as;
 }
 
 #ifdef OLD /* This got moved to main library . */
 struct asColumn *asColumnFind(struct asObject *asObj, char *name)
 // Return named column.
 {
 struct asColumn *asCol = NULL;
 if (asObj!= NULL)
     {
     for (asCol = asObj->columnList; asCol != NULL; asCol = asCol->next)
         if (sameString(asCol->name, name))