diff --git a/jOOQ-codegen/src/main/java/org/jooq/codegen/AbstractGenerator.java b/jOOQ-codegen/src/main/java/org/jooq/codegen/AbstractGenerator.java index bfaef526b3..a3a1948bf8 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/AbstractGenerator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/AbstractGenerator.java @@ -181,6 +181,7 @@ abstract class AbstractGenerator implements Generator { boolean generateXmlTypes = true; boolean generateJsonTypes = true; boolean generateIntervalTypes = true; + boolean generateDecfloatTypes = true; boolean generateTableValuedFunctions = false; boolean generateEmptyCatalogs = false; boolean generateEmptySchemas = false; @@ -1444,6 +1445,16 @@ abstract class AbstractGenerator implements Generator { this.generateIntervalTypes = generateIntervalTypes; } + @Override + public boolean generateDecfloatTypes() { + return generateDecfloatTypes; + } + + @Override + public void setGenerateDecfloatTypes(boolean generateDecfloatTypes) { + this.generateDecfloatTypes = generateDecfloatTypes; + } + @Override public boolean generateEmptyCatalogs() { return generateEmptyCatalogs; diff --git a/jOOQ-codegen/src/main/java/org/jooq/codegen/GenerationTool.java b/jOOQ-codegen/src/main/java/org/jooq/codegen/GenerationTool.java index 67305d79a2..f9a246356b 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/GenerationTool.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/GenerationTool.java @@ -961,6 +961,8 @@ public class GenerationTool { generator.setGenerateJsonTypes(g.getGenerate().isJsonTypes()); if (g.getGenerate().isIntervalTypes() != null) generator.setGenerateIntervalTypes(g.getGenerate().isIntervalTypes()); + if (g.getGenerate().isDecfloatTypes() != null) + generator.setGenerateDecfloatTypes(g.getGenerate().isDecfloatTypes()); if (g.getGenerate().isEmptyCatalogs() != null) generator.setGenerateEmptyCatalogs(g.getGenerate().isEmptyCatalogs()); if (g.getGenerate().isEmptySchemas() != null) diff --git a/jOOQ-codegen/src/main/java/org/jooq/codegen/Generator.java b/jOOQ-codegen/src/main/java/org/jooq/codegen/Generator.java index 38fa7bfa06..8d412666f8 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/Generator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/Generator.java @@ -43,6 +43,7 @@ import java.util.Locale; import org.jooq.Condition; import org.jooq.Constants; +import org.jooq.Decfloat; import org.jooq.Generated; import org.jooq.JSON; import org.jooq.JSONB; @@ -1354,7 +1355,19 @@ public interface Generator { * A flag indicating whether the {@link Interval} type support should be * enabled. */ - void setGenerateIntervalTypes(boolean generateJsonTypes); + void setGenerateIntervalTypes(boolean generateIntervalTypes); + + /** + * A flag indicating whether the {@link Decfloat} type support should be + * enabled. + */ + boolean generateDecfloatTypes(); + + /** + * A flag indicating whether the {@link Decfloat} type support should be + * enabled. + */ + void setGenerateDecfloatTypes(boolean generateDecfloatTypes); /** * Whether empty catalogs should still be generated. diff --git a/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java b/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java index 04891e965d..2a0c515e7c 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java @@ -11097,7 +11097,8 @@ public class JavaGenerator extends AbstractGenerator { dataType.isSpatial() && !generateSpatialTypes() || dataType.isJSON() && !generateJsonTypes() || dataType.isXML() && !generateXmlTypes() || - dataType.isInterval() && !generateIntervalTypes() + dataType.isInterval() && !generateIntervalTypes() || + dataType.isFloat() && dataType.isDecimal() && !generateDecfloatTypes() ) result = SQLDataType.OTHER; diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/jaxb/Generate.java b/jOOQ-meta/src/main/java/org/jooq/meta/jaxb/Generate.java index dea948e828..16ba5a8e97 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/jaxb/Generate.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/jaxb/Generate.java @@ -254,6 +254,8 @@ public class Generate implements Serializable, XMLAppendable protected Boolean jsonTypes = true; @XmlElement(defaultValue = "true") protected Boolean intervalTypes = true; + @XmlElement(defaultValue = "true") + protected Boolean decfloatTypes = true; @XmlElement(defaultValue = "\\n") @XmlJavaTypeAdapter(StringAdapter.class) protected String newline = "\\n"; @@ -2935,6 +2937,30 @@ public class Generate implements Serializable, XMLAppendable this.intervalTypes = value; } + /** + * A flag indicating whether the DECFLOAT type support should be enabled. + * + * @return + * possible object is + * {@link Boolean } + * + */ + public Boolean isDecfloatTypes() { + return decfloatTypes; + } + + /** + * A flag indicating whether the DECFLOAT type support should be enabled. + * + * @param value + * allowed object is + * {@link Boolean } + * + */ + public void setDecfloatTypes(Boolean value) { + this.decfloatTypes = value; + } + /** * The newline characters to be used in generated code. Whitespace characters can be used, e.g. \n, \r\n * @@ -4184,6 +4210,15 @@ public class Generate implements Serializable, XMLAppendable return this; } + /** + * A flag indicating whether the DECFLOAT type support should be enabled. + * + */ + public Generate withDecfloatTypes(Boolean value) { + setDecfloatTypes(value); + return this; + } + /** * The newline characters to be used in generated code. Whitespace characters can be used, e.g. \n, \r\n * @@ -4392,6 +4427,7 @@ public class Generate implements Serializable, XMLAppendable builder.append("xmlTypes", xmlTypes); builder.append("jsonTypes", jsonTypes); builder.append("intervalTypes", intervalTypes); + builder.append("decfloatTypes", decfloatTypes); builder.append("newline", newline); builder.append("indentation", indentation); builder.append("printMarginForBlockComment", printMarginForBlockComment); @@ -5413,6 +5449,15 @@ public class Generate implements Serializable, XMLAppendable return false; } } + if (decfloatTypes == null) { + if (other.decfloatTypes!= null) { + return false; + } + } else { + if (!decfloatTypes.equals(other.decfloatTypes)) { + return false; + } + } if (newline == null) { if (other.newline!= null) { return false; @@ -5620,6 +5665,7 @@ public class Generate implements Serializable, XMLAppendable result = ((prime*result)+((xmlTypes == null)? 0 :xmlTypes.hashCode())); result = ((prime*result)+((jsonTypes == null)? 0 :jsonTypes.hashCode())); result = ((prime*result)+((intervalTypes == null)? 0 :intervalTypes.hashCode())); + result = ((prime*result)+((decfloatTypes == null)? 0 :decfloatTypes.hashCode())); result = ((prime*result)+((newline == null)? 0 :newline.hashCode())); result = ((prime*result)+((indentation == null)? 0 :indentation.hashCode())); result = ((prime*result)+((printMarginForBlockComment == null)? 0 :printMarginForBlockComment.hashCode())); diff --git a/jOOQ-meta/src/main/resources/org/jooq/meta/xsd/jooq-codegen-3.20.0.xsd b/jOOQ-meta/src/main/resources/org/jooq/meta/xsd/jooq-codegen-3.20.0.xsd index 887a1db420..e5a8e0bf9d 100644 --- a/jOOQ-meta/src/main/resources/org/jooq/meta/xsd/jooq-codegen-3.20.0.xsd +++ b/jOOQ-meta/src/main/resources/org/jooq/meta/xsd/jooq-codegen-3.20.0.xsd @@ -2976,6 +2976,10 @@ This flag is ignored in the commercial Java 6 distribution of jOOQ 3.9+ ]]> + + + + diff --git a/jOOQ/src/main/java/org/jooq/DataType.java b/jOOQ/src/main/java/org/jooq/DataType.java index 7722beb6ba..0a2e8f2aa2 100644 --- a/jOOQ/src/main/java/org/jooq/DataType.java +++ b/jOOQ/src/main/java/org/jooq/DataType.java @@ -1322,6 +1322,7 @@ public interface DataType extends Named { *
  • {@link SQLDataType#DECIMAL}
  • *
  • {@link SQLDataType#DECIMAL_INTEGER}
  • *
  • {@link SQLDataType#NUMERIC}
  • + *
  • {@link SQLDataType#DECFLOAT}
  • * * * @see #isNumeric() @@ -1349,10 +1350,24 @@ public interface DataType extends Named { *
  • {@link SQLDataType#FLOAT}
  • *
  • {@link SQLDataType#DOUBLE}
  • *
  • {@link SQLDataType#REAL}
  • + *
  • {@link SQLDataType#DECFLOAT}
  • * */ boolean isFloat(); + /** + * Whether this data type is any decimal numeric data type. + *

    + * This applies to any of these types: + *

      + *
    • {@link SQLDataType#DECIMAL}
    • + *
    • {@link SQLDataType#DECIMAL_INTEGER}
    • + *
    • {@link SQLDataType#NUMERIC}
    • + *
    • {@link SQLDataType#DECFLOAT}
    • + *
    + */ + boolean isDecimal(); + /** * Whether this data type is any boolean data type. *

    @@ -1408,6 +1423,7 @@ public interface DataType extends Named { *

  • {@link SQLDataType#OFFSETTIME}
  • *
  • {@link SQLDataType#OFFSETDATETIME}
  • *
  • {@link SQLDataType#INSTANT}
  • + *
  • {@link SQLDataType#YEAR}
  • * * * @see #isDate() @@ -1460,6 +1476,8 @@ public interface DataType extends Named { *
  • {@link SQLDataType#LOCALDATETIME}
  • *
  • {@link SQLDataType#OFFSETTIME}
  • *
  • {@link SQLDataType#OFFSETDATETIME}
  • + *
  • {@link SQLDataType#INSTANT}
  • + *
  • {@link SQLDataType#YEAR}
  • *
  • {@link YearToSecond}
  • *
  • {@link YearToMonth}
  • *
  • {@link DayToSecond}
  • diff --git a/jOOQ/src/main/java/org/jooq/Decfloat.java b/jOOQ/src/main/java/org/jooq/Decfloat.java index 85d6022f0e..a34891fdc1 100644 --- a/jOOQ/src/main/java/org/jooq/Decfloat.java +++ b/jOOQ/src/main/java/org/jooq/Decfloat.java @@ -52,7 +52,7 @@ import org.jetbrains.annotations.Nullable; * data() == null. This is consistent with jOOQ's general way of * returning NULL from {@link Result} and {@link Record} methods. */ -public class Decfloat implements Data { +public final class Decfloat extends Number implements Data { private final String data; private transient BigDecimal coefficient; @@ -97,6 +97,34 @@ public class Decfloat implements Data { return data == null ? null : decfloat(data); } + // ------------------------------------------------------------------------ + // The Number API + // ------------------------------------------------------------------------ + + @Override + public final double doubleValue() { + return Double.valueOf(data); + } + + @Override + public final float floatValue() { + return Float.valueOf(data); + } + + @Override + public final int intValue() { + return (int) doubleValue(); + } + + @Override + public final long longValue() { + return (long) doubleValue(); + } + + // ------------------------------------------------------------------------ + // The Object API + // ------------------------------------------------------------------------ + @Override public int hashCode() { parse(); @@ -156,7 +184,7 @@ public class Decfloat implements Data { return String.valueOf(data); } - private void parse() { + private final void parse() { if (coefficient != null || special != null) return; diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractDataType.java b/jOOQ/src/main/java/org/jooq/impl/AbstractDataType.java index 944756386c..0f7f83940e 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractDataType.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractDataType.java @@ -73,6 +73,7 @@ import static org.jooq.impl.QOM.GenerationOption.VIRTUAL; import static org.jooq.impl.SQLDataType.BLOB; import static org.jooq.impl.SQLDataType.CHAR; import static org.jooq.impl.SQLDataType.CLOB; +import static org.jooq.impl.SQLDataType.LONGNVARCHAR; import static org.jooq.impl.SQLDataType.NCHAR; import static org.jooq.impl.SQLDataType.NCLOB; import static org.jooq.impl.SQLDataType.NVARCHAR; @@ -114,6 +115,7 @@ import org.jooq.ContextConverter; import org.jooq.Converter; import org.jooq.ConverterContext; import org.jooq.DataType; +import org.jooq.Decfloat; import org.jooq.Domain; import org.jooq.EmbeddableRecord; import org.jooq.EnumType; @@ -863,6 +865,14 @@ implements return Number.class.isAssignableFrom(tType0()) && !isInterval(); } + @Override + public final boolean isDecimal() { + Class tType = tType0(); + return BigInteger.class == tType + || BigDecimal.class == tType + || Decfloat.class == tType; + } + @Override public final boolean isInteger() { Class tType = tType0(); @@ -879,6 +889,7 @@ implements Class tType = tType0(); return Float.class == tType || Double.class == tType + || Decfloat.class == tType ; } @@ -898,11 +909,14 @@ implements return t == NCHAR || t == NCLOB || t == NVARCHAR + || t == LONGNVARCHAR // [#9540] [#10368] In case the constant literals haven't been initialised yet || NCHAR == null && "nchar".equals(t.typeName0()) || NCLOB == null && "nclob".equals(t.typeName0()) - || NVARCHAR == null && "nvarchar".equals(t.typeName0()); + || NVARCHAR == null && "nvarchar".equals(t.typeName0()) + || LONGNVARCHAR == null && "longnvarchar".equals(t.typeName0()) + ; } @Override