From ac995eb88f24419c4a72ef7d496a2a4974c7c3a1 Mon Sep 17 00:00:00 2001 From: Serge Rider Date: Thu, 9 Aug 2018 15:46:17 +0300 Subject: [PATCH] #3512 Oracle: disable escape processing for non-callable statements --- .../ext/oracle/model/OracleDataSource.java | 11 ++++++++ .../impl/jdbc/exec/JDBCConnectionImpl.java | 26 ++++++++++++++++--- 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/plugins/org.jkiss.dbeaver.ext.oracle/src/org/jkiss/dbeaver/ext/oracle/model/OracleDataSource.java b/plugins/org.jkiss.dbeaver.ext.oracle/src/org/jkiss/dbeaver/ext/oracle/model/OracleDataSource.java index e9207f2250..286b932543 100644 --- a/plugins/org.jkiss.dbeaver.ext.oracle/src/org/jkiss/dbeaver/ext/oracle/model/OracleDataSource.java +++ b/plugins/org.jkiss.dbeaver.ext.oracle/src/org/jkiss/dbeaver/ext/oracle/model/OracleDataSource.java @@ -669,6 +669,7 @@ public class OracleDataSource extends JDBCDataSource private Pattern ERROR_POSITION_PATTERN = Pattern.compile(".+\\s+line ([0-9]+), column ([0-9]+)"); private Pattern ERROR_POSITION_PATTERN_2 = Pattern.compile(".+\\s+at line ([0-9]+)"); + private Pattern ERROR_POSITION_PATTERN_3 = Pattern.compile(".+\\s+at position\\: ([0-9]+)"); @Nullable @Override @@ -699,6 +700,16 @@ public class OracleDataSource extends JDBCDataSource positions.add(pos); } } + if (positions.isEmpty()) { + matcher = ERROR_POSITION_PATTERN_3.matcher(message); + while (matcher.find()) { + DBPErrorAssistant.ErrorPosition pos = new DBPErrorAssistant.ErrorPosition(); + pos.info = matcher.group(1); + pos.position = Integer.parseInt(matcher.group(1)) - 1; + positions.add(pos); + } + } + if (!positions.isEmpty()) { return positions.toArray(new ErrorPosition[positions.size()]); } diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/jdbc/exec/JDBCConnectionImpl.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/jdbc/exec/JDBCConnectionImpl.java index b8d1b2b4d3..2353cb7a20 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/jdbc/exec/JDBCConnectionImpl.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/jdbc/exec/JDBCConnectionImpl.java @@ -23,7 +23,10 @@ import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.model.DBPErrorAssistant; import org.jkiss.dbeaver.model.DBUtils; import org.jkiss.dbeaver.model.data.DBDValueHandler; -import org.jkiss.dbeaver.model.exec.*; +import org.jkiss.dbeaver.model.exec.DBCException; +import org.jkiss.dbeaver.model.exec.DBCExecutionPurpose; +import org.jkiss.dbeaver.model.exec.DBCSavepoint; +import org.jkiss.dbeaver.model.exec.DBCStatementType; import org.jkiss.dbeaver.model.exec.jdbc.*; import org.jkiss.dbeaver.model.impl.AbstractSession; import org.jkiss.dbeaver.model.impl.jdbc.JDBCDataSource; @@ -151,6 +154,7 @@ public class JDBCConnectionImpl extends AbstractSession implements JDBCSession, if (statement instanceof JDBCStatementImpl) { statement.setQueryString(sqlQuery); } + disableStatementEscapeProcessing(statement); return statement; } else if (returnGeneratedKeys) { // Return keys @@ -170,23 +174,26 @@ public class JDBCConnectionImpl extends AbstractSession implements JDBCSession, } } } else { + JDBCPreparedStatement dbStat; try { // Generic prepared statement - return prepareStatement( + dbStat = prepareStatement( sqlQuery, scrollable ? ResultSet.TYPE_SCROLL_INSENSITIVE : ResultSet.TYPE_FORWARD_ONLY, updatable ? ResultSet.CONCUR_UPDATABLE : ResultSet.CONCUR_READ_ONLY); } catch (SQLFeatureNotSupportedException | UnsupportedOperationException | IncompatibleClassChangeError e) { - return prepareStatement(sqlQuery); + dbStat = prepareStatement(sqlQuery); } catch (SQLException e) { if (DBUtils.discoverErrorType(getDataSource(), e) == DBPErrorAssistant.ErrorType.FEATURE_UNSUPPORTED) { - return prepareStatement(sqlQuery); + dbStat = prepareStatement(sqlQuery); } else { throw e; } } + disableStatementEscapeProcessing(dbStat); + return dbStat; } } catch (SQLException e) { @@ -194,6 +201,17 @@ public class JDBCConnectionImpl extends AbstractSession implements JDBCSession, } } + // Disable escaping (#3512) + private void disableStatementEscapeProcessing(JDBCStatement statement) { + if (statement != null) { + try { + statement.setEscapeProcessing(false); + } catch (Throwable e) { + log.debug(e); + } + } + } + @NotNull @Override public DBDValueHandler getDefaultValueHandler() -- GitLab