Skip to content

Commit 910a19f

Browse files
committed
Normalize retained numeric aliases
1 parent c74e766 commit 910a19f

2 files changed

Lines changed: 47 additions & 6 deletions

File tree

‎AdvancedCore/src/main/java/com/bencodez/advancedcore/core/user/storage/sql/MysqlUserBackend.java‎

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -473,7 +473,8 @@ private static boolean declaredTypeIsNumericOrBoolean(String sqlType) {
473473
return baseType.equals("TINYINT") || baseType.equals("SMALLINT") || baseType.equals("MEDIUMINT")
474474
|| baseType.equals("INT") || baseType.equals("INTEGER") || baseType.equals("BIGINT")
475475
|| baseType.equals("REAL") || baseType.equals("FLOAT") || baseType.equals("DOUBLE")
476-
|| baseType.equals("NUMERIC") || baseType.equals("DECIMAL") || baseType.equals("BOOLEAN")
476+
|| baseType.equals("NUMERIC") || baseType.equals("DECIMAL") || baseType.equals("DEC")
477+
|| baseType.equals("BOOLEAN")
477478
|| baseType.equals("BOOL") || baseType.equals("BIT");
478479
}
479480

@@ -504,11 +505,15 @@ private static boolean declaredTypeMatches(String sqlType, RegisteredColumnType
504505

505506
private static boolean mysqlDeclaredTypeMatches(String sqlType, RegisteredColumnType registered,
506507
MysqlColumnAttributes attributes) {
507-
if (!declaredTypeMatches(sqlType, new RegisteredColumnType(registered.jdbcType(),
508-
attributes.columnType(), registered.precision(), registered.scale()))) return false;
509508
String declared = declaredPhysicalType(sqlType).toUpperCase(java.util.Locale.ROOT);
510509
String actual = attributes.columnType() == null ? ""
511510
: attributes.columnType().toUpperCase(java.util.Locale.ROOT);
511+
RegisteredColumnType actualType = new RegisteredColumnType(registered.jdbcType(),
512+
attributes.columnType(), registered.precision(), registered.scale());
513+
boolean mysqlBooleanAlias = "BOOLEAN".equals(canonicalType(normalizedBaseType(declared)))
514+
&& "TINYINT".equals(normalizedBaseType(actual))
515+
&& java.util.Arrays.equals(declaredTypeParameters(actual), new int[] { 1 });
516+
if (!mysqlBooleanAlias && !declaredTypeMatches(declared, actualType)) return false;
512517
return declared.matches(".*\\bUNSIGNED\\b.*") == actual.matches(".*\\bUNSIGNED\\b.*")
513518
&& declared.matches(".*\\bZEROFILL\\b.*") == actual.matches(".*\\bZEROFILL\\b.*");
514519
}
@@ -544,10 +549,11 @@ private static String canonicalType(String type) {
544549

545550
private static int[] declaredTypeParameters(String sqlType) {
546551
if (sqlType == null) return new int[0];
547-
int open = sqlType.indexOf('(');
548-
int close = open < 0 ? -1 : sqlType.indexOf(')', open + 1);
552+
String physicalType = declaredPhysicalType(sqlType);
553+
int open = physicalType.indexOf('(');
554+
int close = open < 0 ? -1 : physicalType.indexOf(')', open + 1);
549555
if (open < 0 || close < 0) return new int[0];
550-
String[] values = sqlType.substring(open + 1, close).split(",");
556+
String[] values = physicalType.substring(open + 1, close).split(",");
551557
try {
552558
int[] parsed = new int[values.length];
553559
for (int i = 0; i < values.length; i++) parsed[i] = Integer.parseInt(values[i].trim());

‎AdvancedCore/src/test/java/com/bencodez/advancedcore/core/user/storage/sql/MysqlUserBackendSchemaExpansionTest.java‎

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,41 @@ private void checkTypes(DbType type) throws Exception {
203203
fixture.assertClosed();
204204
}
205205

206+
@Test void mariaDbRetainsBooleanAliasAndIgnoresDefaultExpressionParentheses() throws Exception {
207+
Fixture fixture = new Fixture(DbType.MARIADB);
208+
fixture.existing.addAll(List.of("Flag", "Sequence"));
209+
fixture.numericColumns.addAll(List.of("Flag", "Sequence"));
210+
fixture.columnTypeNames.put("Flag", "TINYINT(1)");
211+
fixture.columnTypeNames.put("Sequence", "BIGINT");
212+
fixture.columnDefaults.put("Sequence", "(0)");
213+
SqlUserSchema schema = SqlUserSchema.builder()
214+
.column("Flag", "BOOLEAN", DataType.STRING)
215+
.column("Sequence", "BIGINT DEFAULT (0)", DataType.STRING).build();
216+
217+
try (var managers = fixture.managers(); var backend = fixture.open(schema)) {
218+
assertTrue(backend.isOpen());
219+
assertFalse(fixture.sql.stream().anyMatch(sql -> sql.startsWith("ALTER TABLE")));
220+
}
221+
fixture.assertClosed();
222+
}
223+
224+
@Test void mariaDbTreatsDecAsDecimalAlias() throws Exception {
225+
Fixture fixture = new Fixture(DbType.MARIADB);
226+
fixture.existing.add("Balance");
227+
fixture.numericColumns.add("Balance");
228+
fixture.columnTypeNames.put("Balance", "DECIMAL");
229+
fixture.columnPrecisions.put("Balance", 12);
230+
fixture.columnScales.put("Balance", 2);
231+
SqlUserSchema schema = SqlUserSchema.builder()
232+
.column("Balance", "DEC(12,2)", DataType.STRING).build();
233+
234+
try (var managers = fixture.managers(); var backend = fixture.open(schema)) {
235+
assertTrue(backend.isOpen());
236+
assertFalse(fixture.sql.stream().anyMatch(sql -> sql.startsWith("ALTER TABLE")));
237+
}
238+
fixture.assertClosed();
239+
}
240+
206241
@Test void mariaDbAcceptsPeerMigrationAfterConflictingAlter() throws Exception {
207242
Fixture fixture = new Fixture(DbType.MARIADB);
208243
fixture.existing.add("VoteRemindersLast");

0 commit comments

Comments
 (0)