a9b3f6390b742c276dd6df49e581d5a26b987168
hiram
  Fri Jul 24 10:09:59 2026 -0700
avoiding an existing situation with sqlUpdateRows() function refs #31811

diff --git src/hg/hubApi/apiUtils.c src/hg/hubApi/apiUtils.c
index 3e0f02e1f20..a1c68258f60 100644
--- src/hg/hubApi/apiUtils.c
+++ src/hg/hubApi/apiUtils.c
@@ -922,31 +922,32 @@
             status = "rateLimited";
         else
             {
             /* Atomic insert with duplicate re-check, closing the race window
              * between the SELECT above and this INSERT. */
             struct dyString *update = dyStringNew(0);
             sqlDyStringPrintf(update,
                 "INSERT INTO %s (requestType, fromDb, toDb, email, comment, requestTime, status, buildDir) "
                 "SELECT 'liftOver', '%s', '%s', '%s', '%s', now(), 0, '' "
                 "WHERE NOT EXISTS ("
                 "  SELECT 1 FROM %s WHERE requestType='liftOver' AND "
                 "  ((fromDb='%s' AND toDb='%s') OR (fromDb='%s' AND toDb='%s'))"
                 ")",
                 ottoTable, fromDb, toDb, email, comment,
                 ottoTable, fromDb, toDb, toDb, fromDb);
-            int rowsAffected = sqlUpdateRows(conn, dyStringCannibalize(&update), NULL);
+            sqlUpdate(conn, dyStringCannibalize(&update));
+            int rowsAffected = sqlQuickNum(conn, "SELECT ROW_COUNT()");
             status = (rowsAffected > 0) ? "accepted" : "duplicate";
             }
         }
     }
 else if (sameString(requestType, "assembly"))
     {
     struct dyString *update = dyStringNew(0);
     sqlDyStringPrintf(update,
         "INSERT INTO %s (requestType, fromDb, toDb, email, comment, requestTime, status, buildDir) "
         "VALUES ('assembly', '%s', '%s', '%s', '%s', now(), 0, '')",
         ottoTable, fromDb, toDb, email, comment);
     sqlUpdate(conn, dyStringCannibalize(&update));
     status = "accepted";
     }
 hDisconnectCentral(&conn);