private boolean executeSingleQuery( @NotNull DBCSession session, @NotNull SQLQuery sqlQuery, boolean fireEvents) { lastError = null; final String originalQueryText = sqlQuery.getQuery(); DBCExecutionContext executionContext = getExecutionContext(); SQLQueryResult curResult = new SQLQueryResult(sqlQuery); if (rsOffset > 0) { curResult.setRowOffset(rsOffset); } SQLQuery originalQuery = sqlQuery; long startTime = System.currentTimeMillis(); if (fireEvents && listener != null) { // Notify query start listener.onStartQuery(sqlQuery); } try { // Prepare statement closeStatement(); // Check and invalidate connection DBPDataSource dataSource = executionContext.getDataSource(); if (!connectionInvalidated && dataSource .getContainer() .getPreferenceStore() .getBoolean(DBeaverPreferences.STATEMENT_INVALIDATE_BEFORE_EXECUTE)) { executionContext.invalidateContext(session.getProgressMonitor()); connectionInvalidated = true; } try { // Modify query (filters + parameters) if (dataFilter != null && dataFilter.hasFilters() && dataSource instanceof SQLDataSource) { String filteredQueryText = ((SQLDataSource) dataSource) .getSQLDialect() .addFiltersToQuery(dataSource, originalQueryText, dataFilter); sqlQuery = new SQLQuery(filteredQueryText, sqlQuery.getOffset(), sqlQuery.getLength()); } } catch (DBException e) { throw new DBCException("Can't apply query filter", e); } Boolean hasParameters = prepareStatementParameters(sqlQuery); if (hasParameters == null) { return false; } statistics.setQueryText(originalQueryText); startTime = System.currentTimeMillis(); DBCExecutionSource source = new AbstractExecutionSource( dataContainer, executionContext, partSite.getPart(), sqlQuery); curStatement = DBUtils.prepareStatement( source, session, hasParameters ? DBCStatementType.QUERY : DBCStatementType.SCRIPT, sqlQuery, rsOffset, rsMaxRows); if (hasParameters) { bindStatementParameters(session, sqlQuery); } // Execute statement try { boolean hasResultSet = curStatement.executeStatement(); curResult.setHasResultSet(hasResultSet); statistics.addExecuteTime(System.currentTimeMillis() - startTime); statistics.addStatementsCount(); long updateCount = -1; while (hasResultSet || resultSetNumber == 0 || updateCount >= 0) { // Fetch data only if we have to fetch all results or if it is rs requested if (fetchResultSetNumber < 0 || fetchResultSetNumber == resultSetNumber) { if (hasResultSet && fetchResultSets) { DBDDataReceiver dataReceiver = resultsConsumer.getDataReceiver(sqlQuery, resultSetNumber); if (dataReceiver != null) { hasResultSet = fetchQueryData( session, curStatement.openResultSet(), curResult, dataReceiver, true); } } } if (!hasResultSet) { try { updateCount = curStatement.getUpdateRowCount(); if (updateCount >= 0) { curResult.setUpdateCount(updateCount); statistics.addRowsUpdated(updateCount); } } catch (DBCException e) { // In some cases we can't read update count // This is bad but we can live with it // Just print a warning log.warn("Can't obtain update count", e); } } if (hasResultSet && fetchResultSets) { resultSetNumber++; fetchResultSetNumber = resultSetNumber; } if (!hasResultSet && updateCount < 0) { // Nothing else to fetch break; } if (dataSource.getInfo().supportsMultipleResults()) { hasResultSet = curStatement.nextResults(); updateCount = hasResultSet ? -1 : 0; } else { break; } } try { curResult.setWarnings(curStatement.getStatementWarnings()); } catch (Throwable e) { log.warn("Can't read execution warnings", e); } } finally { // monitor.subTask("Close query"); if (!keepStatementOpen()) { closeStatement(); } // Release parameters releaseStatementParameters(sqlQuery); } } catch (Throwable ex) { if (!(ex instanceof DBException)) { log.error("Unexpected error while processing SQL", ex); } curResult.setError(ex); lastError = ex; } finally { curResult.setQueryTime(System.currentTimeMillis() - startTime); if (fireEvents && listener != null) { // Notify query end listener.onEndQuery(curResult); } } if (curResult.getError() != null && errorHandling != SQLScriptErrorHandling.IGNORE) { return false; } // Success lastGoodQuery = originalQuery; return true; }