docs: void fireBeforeTriggers(Session session, int trigVecIndex,
                              Object[] oldData, Object[] newData, int[] cols) {
  
          if (!database.isReferentialIntegrity()) {
              return;
          }
  
          TriggerDef[] trigVec = triggerLists[trigVecIndex];
  
          for (int i = 0, size = trigVec.length; i < size; i++) {
              TriggerDef td         = trigVec[i];
              boolean    sqlTrigger = td instanceof TriggerDefSQL;
  
              if (cols != null && td.getUpdateColumnIndexes() != null
                      && !ArrayUtil.haveCommonElement(
                          td.getUpdateColumnIndexes(), cols, cols.length)) {
                  continue;
              }
  
              if (td.isForEachRow()) {
                  switch (td.triggerType) {
  
                      case Trigger.UPDATE_BEFORE_ROW :
                      case Trigger.DELETE_BEFORE_ROW :
                          if (!sqlTrigger) {
                              oldData =
                                  (Object[]) ArrayUtil.duplicateArray(oldData);
                          }
                          break;
                  }
  
                  td.pushPair(session, oldData, newData);
              } else {
                  td.pushPair(session, null, null);
              }
          }
      }