提交 b802bf21 编写于 作者: S ShadelessFox

#12128 Oracle: quote special floating-point values


Former-commit-id: 7e795bc5
上级 ea8e17de
......@@ -476,6 +476,16 @@ public class CommonUtils {
}
}
public static boolean isNaN(@Nullable Object value) {
return (value instanceof Float && ((Float) value).isNaN())
|| (value instanceof Double && ((Double) value).isNaN());
}
public static boolean isInfinite(@Nullable Object value) {
return (value instanceof Float && ((Float) value).isInfinite())
|| (value instanceof Double && ((Double) value).isInfinite());
}
@NotNull
public static String toHexString(@Nullable byte[] bytes) {
return bytes == null ? "" : toHexString(bytes, 0, bytes.length);
......
......@@ -33,6 +33,7 @@ import org.jkiss.dbeaver.model.impl.sql.BasicSQLDialect;
import org.jkiss.dbeaver.model.preferences.DBPPreferenceStore;
import org.jkiss.dbeaver.model.sql.SQLConstants;
import org.jkiss.dbeaver.model.sql.SQLExpressionFormatter;
import org.jkiss.dbeaver.model.struct.DBSAttributeBase;
import org.jkiss.dbeaver.model.struct.DBSTypedObject;
import org.jkiss.dbeaver.model.struct.rdb.DBSProcedure;
import org.jkiss.utils.ArrayUtils;
......@@ -382,6 +383,17 @@ public class OracleSQLDialect extends JDBCSQLDialect {
return MultiValueInsertMode.INSERT_ALL;
}
@NotNull
@Override
public String escapeScriptValue(DBSAttributeBase attribute, @NotNull Object value, @NotNull String strValue) {
if (CommonUtils.isNaN(value) || CommonUtils.isInfinite(value)) {
// These special values should be quoted, as shown in the example below
// https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions090.htm
return '\'' + String.valueOf(value) + '\'';
}
return super.escapeScriptValue(attribute, value, strValue);
}
@Override
public boolean supportsAliasInSelect() {
return true;
......
......@@ -42,6 +42,7 @@ import org.jkiss.dbeaver.model.struct.DBSTypedObject;
import org.jkiss.dbeaver.model.text.parser.TPRule;
import org.jkiss.dbeaver.model.text.parser.TPRuleProvider;
import org.jkiss.utils.ArrayUtils;
import org.jkiss.utils.CommonUtils;
import java.sql.Types;
import java.util.Arrays;
......@@ -816,9 +817,8 @@ public class PostgreDialect extends JDBCSQLDialect implements TPRuleProvider {
// For now we use workaround: represent objects as strings
return '\'' + escapeString(strValue) + '\'';
}
if ((value instanceof Float && (((Float) value).isNaN() || ((Float) value).isInfinite()))
|| (value instanceof Double && (((Double) value).isNaN() || ((Double) value).isInfinite()))) {
// PostgreSQL doesn't like special values such as NaN and +-Infinity without quotes
if (CommonUtils.isNaN(value) || CommonUtils.isInfinite(value)) {
// These special values should be quoted
// https://www.postgresql.org/docs/current/datatype-numeric.html#DATATYPE-NUMERIC-DECIMAL
return '\'' + String.valueOf(value) + '\'';
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册