提交 7e5d933e 编写于 作者: S serge-rider

#2785 Convert CRLF (into LF) in queries for Oracle 10 and earlier


Former-commit-id: 55b0a726
上级 025ee8d7
......@@ -74,6 +74,7 @@ class OracleSQLDialect extends JDBCSQLDialect {
"ELSIF",
"EXIT",
};
private boolean crlfBroken;
public OracleSQLDialect() {
super("Oracle");
......@@ -81,6 +82,7 @@ class OracleSQLDialect extends JDBCSQLDialect {
public void initDriverSettings(JDBCDataSource dataSource, JDBCDatabaseMetaData metaData) {
super.initDriverSettings(dataSource, metaData);
crlfBroken = !dataSource.isServerVersionAtLeast(11, 0);
addFunctions(
Arrays.asList(
......@@ -384,4 +386,9 @@ class OracleSQLDialect extends JDBCSQLDialect {
public String getScriptDelimiter() {
return super.getScriptDelimiter();
}
@Override
public boolean isCRLFBroken() {
return crlfBroken;
}
}
......@@ -1005,7 +1005,7 @@ public final class DBUtils {
boolean scrollable) throws DBCException
{
DBCStatementType statementType = DBCStatementType.SCRIPT;
//query = SQLUtils.makeUnifiedLineFeeds(query);
query = SQLUtils.makeUnifiedLineFeeds(session.getDataSource(), query);
if (SQLUtils.isExecQuery(SQLUtils.getDialectFromObject(session.getDataSource()), query)) {
statementType = DBCStatementType.EXEC;
}
......@@ -1025,7 +1025,7 @@ public final class DBUtils {
{
DBCStatementType statementType = DBCStatementType.QUERY;
// Normalize query
//query = SQLUtils.makeUnifiedLineFeeds(query);
query = SQLUtils.makeUnifiedLineFeeds(session.getDataSource(), query);
if (SQLUtils.isExecQuery(SQLUtils.getDialectFromObject(session.getDataSource()), query)) {
statementType = DBCStatementType.EXEC;
......
......@@ -342,6 +342,13 @@ public abstract class JDBCDataSource
try (JDBCSession session = DBUtils.openMetaSession(monitor, this, ModelMessages.model_jdbc_read_database_meta_data)) {
JDBCDatabaseMetaData metaData = session.getMetaData();
try {
databaseMajorVersion = metaData.getDatabaseMajorVersion();
databaseMinorVersion = metaData.getDatabaseMinorVersion();
} catch (Throwable e) {
log.error("Error determining server version", e);
}
if (this.sqlDialect instanceof JDBCSQLDialect) {
try {
((JDBCSQLDialect) this.sqlDialect).initDriverSettings(this, metaData);
......@@ -350,13 +357,6 @@ public abstract class JDBCDataSource
}
}
try {
databaseMajorVersion = metaData.getDatabaseMajorVersion();
databaseMinorVersion = metaData.getDatabaseMinorVersion();
} catch (Throwable e) {
log.error("Error determining server version", e);
}
try {
dataSourceInfo = createDataSourceInfo(metaData);
} catch (Throwable e) {
......
......@@ -456,6 +456,11 @@ public class BasicSQLDialect implements SQLDialect {
return true;
}
@Override
public boolean isCRLFBroken() {
return false;
}
protected boolean isStandardSQL() {
return true;
}
......
......@@ -288,6 +288,12 @@ public interface SQLDialect {
*/
boolean isQuoteReservedWords();
/**
* Reports about broken CRLF. Queries mustn't contain CRLF line feeds, only LF.
* This actually seems to be Oracle 9 and earlier JDBC driver issue.
*/
boolean isCRLFBroken();
@NotNull
DBDBinaryFormatter getNativeBinaryFormatter();
......
......@@ -263,11 +263,17 @@ public final class SQLUtils {
* Removes \\r characters from query.
* Actually this is done specially for Oracle due to some bug in it's driver
*
*
* @param dataSource
* @param query query
* @return normalized query
*/
public static String makeUnifiedLineFeeds(String query)
public static String makeUnifiedLineFeeds(DBPDataSource dataSource, String query)
{
SQLDialect dialect = SQLUtils.getDialectFromDataSource(dataSource);
if (!dialect.isCRLFBroken()) {
return query;
}
if (query.indexOf('\r') == -1) {
return query;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册