提交 ac995eb8 编写于 作者: S Serge Rider

#3512 Oracle: disable escape processing for non-callable statements

上级 455b3c11
...@@ -669,6 +669,7 @@ public class OracleDataSource extends JDBCDataSource ...@@ -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 = 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_2 = Pattern.compile(".+\\s+at line ([0-9]+)");
private Pattern ERROR_POSITION_PATTERN_3 = Pattern.compile(".+\\s+at position\\: ([0-9]+)");
@Nullable @Nullable
@Override @Override
...@@ -699,6 +700,16 @@ public class OracleDataSource extends JDBCDataSource ...@@ -699,6 +700,16 @@ public class OracleDataSource extends JDBCDataSource
positions.add(pos); 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()) { if (!positions.isEmpty()) {
return positions.toArray(new ErrorPosition[positions.size()]); return positions.toArray(new ErrorPosition[positions.size()]);
} }
......
...@@ -23,7 +23,10 @@ import org.jkiss.dbeaver.Log; ...@@ -23,7 +23,10 @@ import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.model.DBPErrorAssistant; import org.jkiss.dbeaver.model.DBPErrorAssistant;
import org.jkiss.dbeaver.model.DBUtils; import org.jkiss.dbeaver.model.DBUtils;
import org.jkiss.dbeaver.model.data.DBDValueHandler; 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.exec.jdbc.*;
import org.jkiss.dbeaver.model.impl.AbstractSession; import org.jkiss.dbeaver.model.impl.AbstractSession;
import org.jkiss.dbeaver.model.impl.jdbc.JDBCDataSource; import org.jkiss.dbeaver.model.impl.jdbc.JDBCDataSource;
...@@ -151,6 +154,7 @@ public class JDBCConnectionImpl extends AbstractSession implements JDBCSession, ...@@ -151,6 +154,7 @@ public class JDBCConnectionImpl extends AbstractSession implements JDBCSession,
if (statement instanceof JDBCStatementImpl) { if (statement instanceof JDBCStatementImpl) {
statement.setQueryString(sqlQuery); statement.setQueryString(sqlQuery);
} }
disableStatementEscapeProcessing(statement);
return statement; return statement;
} else if (returnGeneratedKeys) { } else if (returnGeneratedKeys) {
// Return keys // Return keys
...@@ -170,23 +174,26 @@ public class JDBCConnectionImpl extends AbstractSession implements JDBCSession, ...@@ -170,23 +174,26 @@ public class JDBCConnectionImpl extends AbstractSession implements JDBCSession,
} }
} }
} else { } else {
JDBCPreparedStatement dbStat;
try { try {
// Generic prepared statement // Generic prepared statement
return prepareStatement( dbStat = prepareStatement(
sqlQuery, sqlQuery,
scrollable ? ResultSet.TYPE_SCROLL_INSENSITIVE : ResultSet.TYPE_FORWARD_ONLY, scrollable ? ResultSet.TYPE_SCROLL_INSENSITIVE : ResultSet.TYPE_FORWARD_ONLY,
updatable ? ResultSet.CONCUR_UPDATABLE : ResultSet.CONCUR_READ_ONLY); updatable ? ResultSet.CONCUR_UPDATABLE : ResultSet.CONCUR_READ_ONLY);
} }
catch (SQLFeatureNotSupportedException | UnsupportedOperationException | IncompatibleClassChangeError e) { catch (SQLFeatureNotSupportedException | UnsupportedOperationException | IncompatibleClassChangeError e) {
return prepareStatement(sqlQuery); dbStat = prepareStatement(sqlQuery);
} }
catch (SQLException e) { catch (SQLException e) {
if (DBUtils.discoverErrorType(getDataSource(), e) == DBPErrorAssistant.ErrorType.FEATURE_UNSUPPORTED) { if (DBUtils.discoverErrorType(getDataSource(), e) == DBPErrorAssistant.ErrorType.FEATURE_UNSUPPORTED) {
return prepareStatement(sqlQuery); dbStat = prepareStatement(sqlQuery);
} else { } else {
throw e; throw e;
} }
} }
disableStatementEscapeProcessing(dbStat);
return dbStat;
} }
} }
catch (SQLException e) { catch (SQLException e) {
...@@ -194,6 +201,17 @@ public class JDBCConnectionImpl extends AbstractSession implements JDBCSession, ...@@ -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 @NotNull
@Override @Override
public DBDValueHandler getDefaultValueHandler() public DBDValueHandler getDefaultValueHandler()
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册