diff --git a/docs/todo.txt b/docs/todo.txt index a345dfe450c732414db5bbad2ae101e1fb64b11f..a230d72800f5db2a6b0299d94706fe73a5e93d79 100644 --- a/docs/todo.txt +++ b/docs/todo.txt @@ -1,4 +1,4 @@ -Firebird, Postgre +Detect source table for queries (Oracle, Postgresql, etc). Also fixes generate sql for queries. BUG: Save navigation filter and use correct nav page index BUG: open object (F4) with FQ name (schema) diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/model/DBUtils.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/model/DBUtils.java index 3716b7799f30cb7f7f9b7aea026908af9cd1741f..d3c331d916ace0203d4250402ab04893d3163d7c 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/model/DBUtils.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/model/DBUtils.java @@ -38,6 +38,7 @@ import org.jkiss.dbeaver.model.runtime.DBRRunnableWithResult; import org.jkiss.dbeaver.model.sql.SQLDataSource; import org.jkiss.dbeaver.model.sql.SQLDialect; import org.jkiss.dbeaver.model.sql.SQLUtils; +import org.jkiss.dbeaver.model.sql.parser.SQLSemanticProcessor; import org.jkiss.dbeaver.model.struct.*; import org.jkiss.dbeaver.model.struct.rdb.*; import org.jkiss.dbeaver.model.virtual.DBVEntity; @@ -932,7 +933,7 @@ public final class DBUtils { long offset, long maxRows) throws DBCException { - final boolean dataModifyQuery = SQLUtils.isDataModifyQuery(query); + final boolean dataModifyQuery = !SQLSemanticProcessor.isSelectQuery(query); final boolean hasLimits = !dataModifyQuery && offset >= 0 && maxRows > 0; DBCQueryTransformer limitTransformer = null, fetchAllTransformer = null; diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/model/sql/parser/SQLSemanticProcessor.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/model/sql/parser/SQLSemanticProcessor.java index 4727e7ced17c3e45c401ac0c7db1501e211287ee..68d0d277861cf8278c55ad686232cb4b4a1eba71 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/model/sql/parser/SQLSemanticProcessor.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/model/sql/parser/SQLSemanticProcessor.java @@ -26,10 +26,13 @@ import net.sf.jsqlparser.parser.CCJSqlParserUtil; import net.sf.jsqlparser.schema.Column; import net.sf.jsqlparser.schema.Table; import net.sf.jsqlparser.statement.Statement; +import net.sf.jsqlparser.statement.insert.Insert; import net.sf.jsqlparser.statement.select.FromItem; import net.sf.jsqlparser.statement.select.OrderByElement; import net.sf.jsqlparser.statement.select.PlainSelect; import net.sf.jsqlparser.statement.select.Select; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.model.DBPDataSource; import org.jkiss.dbeaver.model.data.DBDAttributeConstraint; @@ -48,6 +51,21 @@ public class SQLSemanticProcessor { private static final String NESTED_QUERY_AlIAS = "z_q"; + static final Log log = LogFactory.getLog(SQLUtils.class); + + public static boolean isSelectQuery(String query) + { + try { + Statement statement = CCJSqlParserUtil.parse(query); + return statement instanceof Select && + ((Select) statement).getSelectBody() instanceof PlainSelect && + ((PlainSelect) ((Select) statement).getSelectBody()).getInto() == null; + } catch (Exception e) { + log.error(e); + return false; + } + } + public static String addFiltersToQuery(final DBPDataSource dataSource, String sqlQuery, final DBDDataFilter dataFilter) throws DBException { boolean supportSubqueries = dataSource instanceof SQLDataSource && ((SQLDataSource) dataSource).getSQLDialect().supportsSubqueries(); try {