30
30
import org .hibernate .hql .spi .id .local .LocalTemporaryTableBulkIdStrategy ;
31
31
import org .hibernate .internal .util .JdbcExceptionHelper ;
32
32
import org .hibernate .internal .util .StringHelper ;
33
+ import org .hibernate .mapping .Column ;
33
34
import org .hibernate .type .StandardBasicTypes ;
34
35
35
36
/**
@@ -326,11 +327,13 @@ public String getCastTypeName(int code) {
326
327
case Types .INTEGER :
327
328
case Types .BIGINT :
328
329
case Types .SMALLINT :
329
- return "signed" ;
330
+ return smallIntegerCastTarget () ;
330
331
case Types .FLOAT :
332
+ case Types .REAL : {
333
+ return floatingPointNumberCastTarget ();
334
+ }
331
335
case Types .NUMERIC :
332
- case Types .REAL :
333
- return "decimal" ;
336
+ return fixedPointNumberCastTarget ();
334
337
case Types .VARCHAR :
335
338
return "char" ;
336
339
case Types .VARBINARY :
@@ -340,6 +343,37 @@ public String getCastTypeName(int code) {
340
343
}
341
344
}
342
345
346
+ /**
347
+ * Determine the cast target for {@link Types#INTEGER}, {@link Types#BIGINT} and {@link Types#SMALLINT}
348
+ *
349
+ * @return The proper cast target type.
350
+ */
351
+ protected String smallIntegerCastTarget () {
352
+ return "signed" ;
353
+ }
354
+
355
+ /**
356
+ * Determine the cast target for {@link Types#FLOAT} and {@link Types#REAL} (DOUBLE)
357
+ *
358
+ * @return The proper cast target type.
359
+ */
360
+ protected String floatingPointNumberCastTarget () {
361
+ // MySQL does not allow casting to DOUBLE nor FLOAT, so we have to cast these as DECIMAL.
362
+ // MariaDB does allow casting to DOUBLE, although not FLOAT.
363
+ return fixedPointNumberCastTarget ();
364
+ }
365
+
366
+ /**
367
+ * Determine the cast target for {@link Types#NUMERIC}
368
+ *
369
+ * @return The proper cast target type.
370
+ */
371
+ protected String fixedPointNumberCastTarget () {
372
+ // NOTE : the precision/scale are somewhat arbitrary choices, but MySQL/MariaDB
373
+ // effectively require *some* values
374
+ return "decimal(" + Column .DEFAULT_PRECISION + "," + Column .DEFAULT_SCALE + ")" ;
375
+ }
376
+
343
377
@ Override
344
378
public boolean supportsCurrentTimestampSelection () {
345
379
return true ;
0 commit comments