[#2486] Allow to specify precision, scale, length for type-rewrites in <forcedType/>

This commit is contained in:
Lukas Eder 2014-07-29 16:32:28 +02:00
parent 5c7114d1e3
commit 818bebeecb
5 changed files with 329 additions and 6 deletions

View File

@ -41,9 +41,14 @@
package org.jooq.util;
import static org.jooq.tools.Convert.convert;
import static org.jooq.tools.StringUtils.isEmpty;
import java.sql.Types;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.jooq.DataType;
import org.jooq.exception.SQLDialectNotSupportedException;
@ -58,7 +63,8 @@ abstract class AbstractTypedElementDefinition<T extends Definition>
extends AbstractDefinition
implements TypedElementDefinition<T> {
private static final JooqLogger log = JooqLogger.getLogger(AbstractTypedElementDefinition.class);
private static final JooqLogger log = JooqLogger.getLogger(AbstractTypedElementDefinition.class);
private static final Pattern LENGTH_PRECISION_SCALE_PATTERN = Pattern.compile("[\\w\\s]+(?:\\(\\s*?(\\d+)\\s*?\\)|\\(\\s*?(\\d+)\\s*?,\\s*?(\\d+)\\s*?\\))");
private final T container;
private final DataTypeDefinition definedType;
@ -146,13 +152,25 @@ abstract class AbstractTypedElementDefinition<T extends Definition>
log.info("Forcing type", child + " into " + type + (converter != null ? " using converter " + converter : ""));
DataType<?> forcedDataType = null;
String t = result.getType();
int l = result.getLength();
int p = result.getPrecision();
int s = result.getScale();
boolean n = result.isNullable();
boolean d = result.isDefaulted();
int l = 0;
int p = 0;
int s = 0;
// [#2486] Allow users to override length, precision, and scale
Matcher matcher = LENGTH_PRECISION_SCALE_PATTERN.matcher(type);
if (matcher.find()) {
if (!isEmpty(matcher.group(1))) {
l = p = convert(matcher.group(1), int.class);
}
else {
p = convert(matcher.group(2), int.class);
s = convert(matcher.group(3), int.class);
}
}
try {
forcedDataType = DefaultDataType.getDataType(db.getDialect(), type, p, s);
} catch (SQLDialectNotSupportedException ignore) {}
@ -164,6 +182,10 @@ abstract class AbstractTypedElementDefinition<T extends Definition>
// Other forced types are UDT's, enums, etc.
else {
l = result.getLength();
p = result.getPrecision();
s = result.getScale();
String t = result.getType();
result = new DefaultDataTypeDefinition(db, child.getSchema(), t, l, p, s, n, d, type, converter);
}
}

View File

@ -46,6 +46,7 @@
<!-- [pro] xxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
@ -221,6 +222,13 @@
</dependency>
<!-- [pro] xxx
xxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxx
xxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
@ -1217,6 +1225,25 @@
</customTypes>
<forcedTypes>
<!-- [#2486] Remove precision and scale from existing DECIMALs -->
<forcedType>
<name>DECIMAL</name>
<expression>(?i:.*?\.t_2486\.(val1|val3|val5))</expression>
</forcedType>
<!-- [#2486] Add precision and scale from existing DECIMALs -->
<forcedType>
<name>DECIMAL(21, 4)</name>
<expression>(?i:.*?\.t_2486\.(val2|val4|val6))</expression>
</forcedType>
<!-- [#2486] Add precision but remove scale from existing DECIMALs -->
<forcedType>
<name>DECIMAL(20)</name>
<expression>(?i:.*?\.t_2486\.(val7|val8))</expression>
</forcedType>
<forcedType>
<name>BOOLEAN</name>
<expression>(?i:(.*?.)?T_BOOLEANS.(VC|C|N)_BOOLEAN)</expression>
@ -3849,6 +3876,222 @@
xxxxxxxxxx
xxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxx
xxxxxxxxx
xxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxx
xxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxx
xxxxxxxxxxxxxxxxxxxxx
xxxxxxxx
xxxxxxxxxxxxxxx
xxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxx
xxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxx
xxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxx
xxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxx
xxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxx
xxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxx
xxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxx
xxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxx
xxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxx
xxxxxxxxxxxxxx
xxxxxxxxxxxxx
xxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxx
xxxxxxxxxxxx
xxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxx
xxxx xxxxxxx xxxxx xx xxxxxxxx xxxxx xxxx xxxxxxxxx xxx
xxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxx
xxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxx
xxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxx
xxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxx
xxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxx
xxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxx
xxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxx
xxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxx
xxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxx
xxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxx
xxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxx
xxxxxxxxxxxxxx
xxxxxxxxxxx
xxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxx
xxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxx
xxxxxxxxxxxx
xxxxxxxxxxxxxxxx
xxxxxxxxxxxx
xxxxxxxxxxxxx
xxxxxxxxxxxxxx
xxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxx
xxxxxxxxxxxxxxx
xxxxxxxxx
xxxxxxxxxx
xxxxxxxx
xxxxxxxxxx
xxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxx
xxxxxxxxx
xxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxx
xxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxx
xxxxxxxxxxxxxxxxxxxxx
xxxxxxxx
xxxxxxxxxxxxxxx
xxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxx
xxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxx
xxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxx
xxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxx
xxxxxxxxxxxx
xxxxxxxxxxxxxxxx
xxxxxxxxxxxx
xxxxxxxxxxxxx
xxxxxxxxxxxxxx
xxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxx
xxxxxxxxxxxxxxx
xxxxxxxxx
xxxxxxxxxx
xxxxxxxx
xxxxxxxxxx
xxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxx
xxxxxxx

View File

@ -46,6 +46,7 @@ DROP TABLE IF EXISTS t_658_32/
DROP TABLE IF EXISTS t_725_lob_test/
DROP TABLE IF EXISTS t_785/
DROP TABLE IF EXISTS t_877/
DROP TABLE IF EXISTS t_2486/
DROP TABLE IF EXISTS t_2698/
DROP TABLE IF EXISTS t_2718/
DROP TABLE IF EXISTS t_unsigned/
@ -166,6 +167,18 @@ CREATE TABLE t_877 (
)
/
CREATE TABLE t_2486 (
VAL1 DECIMAL(20),
VAL2 DECIMAL(20),
VAL3 DECIMAL(20, 5),
VAL4 DECIMAL(20, 5),
VAL5 VARCHAR(20),
VAL6 VARCHAR(20),
VAL7 DECIMAL(20, 5),
VAL8 DECIMAL
)
/
CREATE TABLE t_2698 (
ID INT,
XX INT DEFAULT -1 NOT NULL,

View File

@ -46,6 +46,7 @@ import static org.jooq.impl.DSL.count;
import static org.jooq.impl.DSL.defaultValue;
import static org.jooq.impl.DSL.select;
import static org.jooq.impl.DSL.table;
import static org.jooq.test.h2.generatedclasses.Tables.T_2486;
import static org.jooq.test.h2.generatedclasses.Tables.T_2698;
import static org.jooq.test.h2.generatedclasses.Tables.T_639_NUMBERS_TABLE;
import static org.jooq.test.h2.generatedclasses.Tables.T_725_LOB_TEST;
@ -124,6 +125,7 @@ import org.jooq.test.h2.generatedclasses.tables.records.TIdentityPkRecord;
import org.jooq.test.h2.generatedclasses.tables.records.TIdentityRecord;
import org.jooq.test.h2.generatedclasses.tables.records.TTriggersRecord;
import org.jooq.test.h2.generatedclasses.tables.records.TUnsignedRecord;
import org.jooq.test.h2.generatedclasses.tables.records.T_2486Record;
import org.jooq.test.h2.generatedclasses.tables.records.T_2698Record;
import org.jooq.test.h2.generatedclasses.tables.records.T_639NumbersTableRecord;
import org.jooq.test.h2.generatedclasses.tables.records.T_725LobTestRecord;
@ -1015,4 +1017,47 @@ public class H2Test extends jOOQAbstractTest<
dao.deleteById(key2);
assertNull(dao.findById(key2));
}
@Test
@SuppressWarnings("unused")
public void testH2ForcedTypes2486() {
// This should compile
TableField<T_2486Record, BigDecimal> val1 = T_2486.VAL1;
TableField<T_2486Record, BigDecimal> val2 = T_2486.VAL2;
TableField<T_2486Record, BigDecimal> val3 = T_2486.VAL3;
TableField<T_2486Record, BigDecimal> val4 = T_2486.VAL4;
TableField<T_2486Record, BigDecimal> val5 = T_2486.VAL5;
TableField<T_2486Record, BigDecimal> val6 = T_2486.VAL6;
TableField<T_2486Record, BigInteger> val7 = T_2486.VAL7;
TableField<T_2486Record, BigInteger> val8 = T_2486.VAL8;
assertEquals(BigDecimal.class, T_2486.VAL1.getType());
assertEquals(BigDecimal.class, T_2486.VAL2.getType());
assertEquals(BigDecimal.class, T_2486.VAL3.getType());
assertEquals(BigDecimal.class, T_2486.VAL4.getType());
assertEquals(BigDecimal.class, T_2486.VAL5.getType());
assertEquals(BigDecimal.class, T_2486.VAL6.getType());
assertEquals(BigInteger.class, T_2486.VAL7.getType());
assertEquals(BigInteger.class, T_2486.VAL8.getType());
assertEquals(0, T_2486.VAL1.getDataType().precision());
assertEquals(21, T_2486.VAL2.getDataType().precision());
assertEquals(0, T_2486.VAL3.getDataType().precision());
assertEquals(21, T_2486.VAL4.getDataType().precision());
assertEquals(0, T_2486.VAL5.getDataType().precision());
assertEquals(21, T_2486.VAL6.getDataType().precision());
assertEquals(20, T_2486.VAL7.getDataType().precision());
assertEquals(20, T_2486.VAL8.getDataType().precision());
assertEquals(0, T_2486.VAL1.getDataType().scale());
assertEquals(4, T_2486.VAL2.getDataType().scale());
assertEquals(0, T_2486.VAL3.getDataType().scale());
assertEquals(4, T_2486.VAL4.getDataType().scale());
assertEquals(0, T_2486.VAL5.getDataType().scale());
assertEquals(4, T_2486.VAL6.getDataType().scale());
assertEquals(0, T_2486.VAL7.getDataType().scale());
assertEquals(0, T_2486.VAL8.getDataType().scale());
}
}

View File

@ -97,7 +97,7 @@ public class DefaultDataType<T> implements DataType<T> {
/**
* A pattern for data type name normalisation.
*/
private static final Pattern NORMALISE_PATTERN = Pattern.compile("\"|\\.|\\s|\\(\\w+(,\\w+)*\\)|(NOT\\s*NULL)?");
private static final Pattern NORMALISE_PATTERN = Pattern.compile("\"|\\.|\\s|\\(\\w+(\\s*,\\s*\\w+)*\\)|(NOT\\s*NULL)?");
/**
* A pattern to be used to replace all precision, scale, and length