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 e9207f2250cf786f2c91295590de3088bcda678a..286b932543bcd89d99f76bf3baa5a82c715fbebb 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 b8d1b2b4d31cbfbcccc71f9c0b0052ccb7d4e0e3..2353cb7a20bc4bdd56769db6c86765930af6d56f 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()