diff --git a/agents/drivers/oceanbase-oracle/src/main/java/com/dbx/agent/oceanbaseoracle/OceanBaseOracleAgent.java b/agents/drivers/oceanbase-oracle/src/main/java/com/dbx/agent/oceanbaseoracle/OceanBaseOracleAgent.java index 7a8d6ba9af..38af2ddac4 100644 --- a/agents/drivers/oceanbase-oracle/src/main/java/com/dbx/agent/oceanbaseoracle/OceanBaseOracleAgent.java +++ b/agents/drivers/oceanbase-oracle/src/main/java/com/dbx/agent/oceanbaseoracle/OceanBaseOracleAgent.java @@ -2075,6 +2075,9 @@ public final class OceanBaseOracleAgent extends ConfiguredJdbcAgent { yield len == null ? base : base + "(" + len + ")"; } case "NUMBER" -> { + if (numPrec == null && numScale != null) { + yield base + "(*," + numScale + ")"; + } if (numPrec != null && numScale != null && numScale != 0) { yield base + "(" + numPrec + "," + numScale + ")"; } @@ -2083,6 +2086,7 @@ public final class OceanBaseOracleAgent extends ConfiguredJdbcAgent { } yield base; } + case "FLOAT" -> numPrec != null && numPrec > 0 ? base + "(" + numPrec + ")" : base; case "RAW" -> dataLen == null ? "RAW" : "RAW(" + dataLen + ")"; default -> base; }; diff --git a/agents/drivers/oceanbase-oracle/src/test/java/com/dbx/agent/oceanbaseoracle/OceanBaseOracleAgentTest.java b/agents/drivers/oceanbase-oracle/src/test/java/com/dbx/agent/oceanbaseoracle/OceanBaseOracleAgentTest.java index 849bfb40be..382c9be49d 100644 --- a/agents/drivers/oceanbase-oracle/src/test/java/com/dbx/agent/oceanbaseoracle/OceanBaseOracleAgentTest.java +++ b/agents/drivers/oceanbase-oracle/src/test/java/com/dbx/agent/oceanbaseoracle/OceanBaseOracleAgentTest.java @@ -1022,6 +1022,23 @@ class OceanBaseOracleAgentTest { Assertions.assertTrue(sql.get(0).contains("c.CHAR_USED")); } + @Test + void getColumnsPreservesFloatPrecisionAndNumberStarScale() { + List sql = new ArrayList<>(); + OceanBaseOracleAgent agent = new OceanBaseOracleAgent(); + TestSupport.setPrivateConnection(agent, preparedConnection(sql, columnResultSet(new Object[][]{ + {"F", "FLOAT", "Y", 63, null, 22, 0, null, null, 0, null}, + {"FU", "FLOAT", "Y", null, null, 22, 0, null, null, 0, null}, + {"NS", "NUMBER", "Y", null, 3, 22, 0, null, null, 0, null}, + {"NN", "NUMBER", "Y", null, -2, 22, 0, null, null, 0, null}, + {"NZ", "NUMBER", "Y", null, 0, 22, 0, null, null, 0, null}, + {"NU", "NUMBER", "Y", null, null, 22, 0, null, null, 0, null} + }))); + List columns = agent.getColumns("APP", "NUMERIC_COLUMNS"); + Assertions.assertEquals(List.of("FLOAT(63)", "FLOAT", "NUMBER(*,3)", "NUMBER(*,-2)", "NUMBER(*,0)", "NUMBER"), + columns.stream().map(ColumnInfo::getData_type).toList()); + } + @Test void getColumnsResolvesTheCurrentSchemaWhenSchemaIsEmpty() { List sql = new ArrayList<>(); diff --git a/agents/drivers/oracle-go/main.go b/agents/drivers/oracle-go/main.go index 4c126c75b2..d287429a06 100644 --- a/agents/drivers/oracle-go/main.go +++ b/agents/drivers/oracle-go/main.go @@ -3644,6 +3644,9 @@ func oracleColumnTypeDDL(column columnInfo) string { return fmt.Sprintf("%s(%d)", dataType, *column.CharacterMaximumLength) } if dataType == "NUMBER" { + if column.NumericPrecision == nil && column.NumericScale != nil { + return fmt.Sprintf("NUMBER(*,%d)", *column.NumericScale) + } if column.NumericPrecision != nil && *column.NumericPrecision > 0 { if column.NumericScale != nil && *column.NumericScale != 0 { return fmt.Sprintf("NUMBER(%d,%d)", *column.NumericPrecision, *column.NumericScale) @@ -3652,7 +3655,7 @@ func oracleColumnTypeDDL(column columnInfo) string { } return "NUMBER" } - if (dataType == "FLOAT" || dataType == "BINARY_FLOAT" || dataType == "BINARY_DOUBLE") && + if dataType == "FLOAT" && column.NumericPrecision != nil && *column.NumericPrecision > 0 { return fmt.Sprintf("%s(%d)", dataType, *column.NumericPrecision) } diff --git a/agents/drivers/oracle-go/main_test.go b/agents/drivers/oracle-go/main_test.go index 7b43abdb58..49e25321e9 100644 --- a/agents/drivers/oracle-go/main_test.go +++ b/agents/drivers/oracle-go/main_test.go @@ -1311,6 +1311,7 @@ func TestOracleColumnTypeDDL(t *testing.T) { precision := 10 scale := 2 zeroScale := 0 + negativeScale := -2 byteUnit := "B" charUnit := "C" @@ -1325,6 +1326,17 @@ func TestOracleColumnTypeDDL(t *testing.T) { {name: "national character type ignores unit", column: columnInfo{DataType: "NVARCHAR2", CharacterMaximumLength: &charLen, CharacterLengthUnit: &charUnit}, want: "NVARCHAR2(64)"}, {name: "number scale", column: columnInfo{DataType: "NUMBER", NumericPrecision: &precision, NumericScale: &scale}, want: "NUMBER(10,2)"}, {name: "number zero scale", column: columnInfo{DataType: "NUMBER", NumericPrecision: &precision, NumericScale: &zeroScale}, want: "NUMBER(10)"}, + {name: "number star scale", column: columnInfo{DataType: "NUMBER", NumericScale: &scale}, want: "NUMBER(*,2)"}, + {name: "number star negative scale", column: columnInfo{DataType: "NUMBER", NumericScale: &negativeScale}, want: "NUMBER(*,-2)"}, + {name: "number star zero scale", column: columnInfo{DataType: "NUMBER", NumericScale: &zeroScale}, want: "NUMBER(*,0)"}, + {name: "number unknown", column: columnInfo{DataType: "NUMBER"}, want: "NUMBER"}, + {name: "number negative scale", column: columnInfo{DataType: "NUMBER", NumericPrecision: &precision, NumericScale: &negativeScale}, want: "NUMBER(10,-2)"}, + {name: "explicit number parameters", column: columnInfo{DataType: "NUMBER(12,-2)", NumericPrecision: &precision, NumericScale: &scale}, want: "NUMBER(12,-2)"}, + {name: "explicit float parameters", column: columnInfo{DataType: "FLOAT(63)", NumericPrecision: &precision}, want: "FLOAT(63)"}, + {name: "float precision", column: columnInfo{DataType: "FLOAT", NumericPrecision: &precision}, want: "FLOAT(10)"}, + {name: "float unknown", column: columnInfo{DataType: "FLOAT"}, want: "FLOAT"}, + {name: "binary float fixed precision", column: columnInfo{DataType: "BINARY_FLOAT", NumericPrecision: &precision}, want: "BINARY_FLOAT"}, + {name: "binary double fixed precision", column: columnInfo{DataType: "BINARY_DOUBLE", NumericPrecision: &precision}, want: "BINARY_DOUBLE"}, {name: "timestamp preserves precision", column: columnInfo{DataType: "TIMESTAMP(6)"}, want: "TIMESTAMP(6)"}, } for _, tt := range tests { diff --git a/apps/desktop/src/components/editor/DangerConfirmDialog.vue b/apps/desktop/src/components/editor/DangerConfirmDialog.vue index 7870c3f98a..03cb544cbb 100644 --- a/apps/desktop/src/components/editor/DangerConfirmDialog.vue +++ b/apps/desktop/src/components/editor/DangerConfirmDialog.vue @@ -32,6 +32,8 @@ const props = withDefaults( message?: string; details?: string; detailsText?: string; + detailsLabel?: string; + showCancel?: boolean; confirmLabel?: string; showSuppressToggle?: boolean; suppressToggleLabel?: string; @@ -56,6 +58,8 @@ const props = withDefaults( message: "", details: "", detailsText: "", + detailsLabel: "", + showCancel: true, confirmLabel: "", showSuppressToggle: false, suppressToggleLabel: "", @@ -139,7 +143,8 @@ async function copyFullCode() {

{{ message || t("dangerDialog.message") }}

{{ detailsText }}

-
+ + {{ detailsLabel }}
           
- +
@@ -168,7 +173,7 @@ async function copyFullCode() { {{ t("dangerDialog.cancelRunning") }} - +