@Override
 public boolean next() {
   synchronized (sync) {
     if (SysProperties.CHECK && end) {
       DbException.throwInternalError();
     }
     while (true) {
       if (needNewDelta) {
         loadNext(false);
         needNewDelta = false;
       }
       if (needNewBase) {
         loadNext(true);
         needNewBase = false;
       }
       if (deltaRow == null) {
         if (baseRow == null) {
           end = true;
           return false;
         }
         onBase = true;
         needNewBase = true;
         return true;
       }
       int sessionId = deltaRow.getSessionId();
       boolean isThisSession = sessionId == session.getId();
       boolean isDeleted = deltaRow.isDeleted();
       if (isThisSession && isDeleted) {
         needNewDelta = true;
         continue;
       }
       if (baseRow == null) {
         if (isDeleted) {
           if (isThisSession) {
             end = true;
             return false;
           }
           // the row was deleted by another session: return it
           onBase = false;
           needNewDelta = true;
           return true;
         }
         DbException.throwInternalError();
       }
       int compare = index.compareRows(deltaRow, baseRow);
       if (compare == 0) {
         // can't use compareKeys because the
         // version would be compared as well
         long k1 = deltaRow.getKey();
         long k2 = baseRow.getKey();
         compare = MathUtils.compareLong(k1, k2);
       }
       if (compare == 0) {
         if (isDeleted) {
           if (isThisSession) {
             DbException.throwInternalError();
           }
           // another session updated the row
         } else {
           if (isThisSession) {
             onBase = false;
             needNewBase = true;
             needNewDelta = true;
             return true;
           }
           // another session inserted the row: ignore
           needNewBase = true;
           needNewDelta = true;
           continue;
         }
       }
       if (compare > 0) {
         onBase = true;
         needNewBase = true;
         return true;
       }
       onBase = false;
       needNewDelta = true;
       return true;
     }
   }
 }
 protected int compareSecure(Value o, CompareMode mode) {
   return MathUtils.compareLong(nanos, ((ValueTime) o).nanos);
 }
 public boolean next() {
   synchronized (this.sync) {
     if ((SysProperties.CHECK) && (this.end)) {
       DbException.throwInternalError();
     }
     int compare;
     for (; ; ) {
       if (this.needNewDelta) {
         loadNext(false);
         this.needNewDelta = false;
       }
       if (this.needNewBase) {
         loadNext(true);
         this.needNewBase = false;
       }
       if (this.deltaRow == null) {
         if (this.baseRow == null) {
           this.end = true;
           return false;
         }
         this.onBase = true;
         this.needNewBase = true;
         return true;
       }
       int sessionId = this.deltaRow.getSessionId();
       boolean isThisSession = sessionId == this.session.getId();
       boolean isDeleted = this.deltaRow.isDeleted();
       if ((isThisSession) && (isDeleted)) {
         this.needNewDelta = true;
       } else {
         if (this.baseRow == null) {
           if (isDeleted) {
             if (isThisSession) {
               this.end = true;
               return false;
             }
             this.onBase = false;
             this.needNewDelta = true;
             return true;
           }
           DbException.throwInternalError();
         }
         compare = this.index.compareRows(this.deltaRow, this.baseRow);
         if (compare == 0) {
           long k1 = this.deltaRow.getKey();
           long k2 = this.baseRow.getKey();
           compare = MathUtils.compareLong(k1, k2);
         }
         if (compare != 0) {
           break;
         }
         if (isDeleted) {
           if (!isThisSession) {
             break;
           }
           DbException.throwInternalError();
           break;
         }
         if (isThisSession) {
           this.onBase = false;
           this.needNewBase = true;
           this.needNewDelta = true;
           return true;
         }
         this.needNewBase = true;
         this.needNewDelta = true;
       }
     }
     if (compare > 0) {
       this.onBase = true;
       this.needNewBase = true;
       return true;
     }
     this.onBase = false;
     this.needNewDelta = true;
     return true;
   }
 }