protected LocalResult queryWithoutCache(int maxRows, ResultTarget target) { int limitRows = maxRows == 0 ? -1 : maxRows; if (limitExpr != null) { Value v = limitExpr.getValue(session); int l = v == ValueNull.INSTANCE ? -1 : v.getInt(); if (limitRows < 0) { limitRows = l; } else if (l >= 0) { limitRows = Math.min(l, limitRows); } } int columnCount = expressions.size(); LocalResult result = null; if (target == null || !session.getDatabase().getSettings().optimizeInsertFromSelect) { result = createLocalResult(result); } if (sort != null && (!sortUsingIndex || distinct)) { result = createLocalResult(result); result.setSortOrder(sort); } if (distinct && !isDistinctQuery) { result = createLocalResult(result); result.setDistinct(); } if (randomAccessResult) { result = createLocalResult(result); result.setRandomAccess(); } if (isGroupQuery && !isGroupSortedQuery) { result = createLocalResult(result); } if (limitRows >= 0 || offsetExpr != null) { result = createLocalResult(result); } topTableFilter.startQuery(session); topTableFilter.reset(); boolean exclusive = isForUpdate && !isForUpdateMvcc; if (isForUpdateMvcc) { if (isGroupQuery) { throw DbException.getUnsupportedException("FOR UPDATE && GROUP"); } else if (distinct) { throw DbException.getUnsupportedException("FOR UPDATE && DISTINCT"); } else if (isQuickAggregateQuery) { throw DbException.getUnsupportedException("FOR UPDATE && AGGREGATE"); } else if (topTableFilter.getJoin() != null) { throw DbException.getUnsupportedException("FOR UPDATE && JOIN"); } else if (topTableFilter.getJoin() != null) { throw DbException.getUnsupportedException("FOR UPDATE && JOIN"); } } topTableFilter.lock(session, exclusive, exclusive); ResultTarget to = result != null ? result : target; if (limitRows != 0) { if (isQuickAggregateQuery) { queryQuick(columnCount, to); } else if (isGroupQuery) { if (isGroupSortedQuery) { queryGroupSorted(columnCount, to); } else { queryGroup(columnCount, result); } } else if (isDistinctQuery) { queryDistinct(to, limitRows); } else { queryFlat(columnCount, to, limitRows); } } if (offsetExpr != null) { result.setOffset(offsetExpr.getValue(session).getInt()); } if (limitRows >= 0) { result.setLimit(limitRows); } if (result != null) { result.done(); if (target != null) { while (result.next()) { target.addRow(result.currentRow()); } result.close(); return null; } return result; } return null; }