[feature](decimal) support decimal256 (#25386)

This commit is contained in:
TengJianPing
2023-10-25 15:47:51 +08:00
committed by GitHub
parent 97c2fe75d1
commit 693982fd1a
153 changed files with 5647 additions and 633 deletions

View File

@ -54,6 +54,7 @@ public enum PrimitiveType {
DECIMAL32("DECIMAL32", 4, TPrimitiveType.DECIMAL32, true),
DECIMAL64("DECIMAL64", 8, TPrimitiveType.DECIMAL64, true),
DECIMAL128("DECIMAL128", 16, TPrimitiveType.DECIMAL128I, true),
DECIMAL256("DECIMAL256", 32, TPrimitiveType.DECIMAL256, false),
TIME("TIME", 8, TPrimitiveType.TIME, false),
// these following types are stored as object binary in BE.
HLL("HLL", 16, TPrimitiveType.HLL, true),
@ -94,6 +95,7 @@ public enum PrimitiveType {
builder.add(DECIMAL32);
builder.add(DECIMAL64);
builder.add(DECIMAL128);
builder.add(DECIMAL256);
builder.add(DATETIMEV2);
typeWithPrecision = builder.build();
}
@ -123,6 +125,7 @@ public enum PrimitiveType {
builder.put(NULL_TYPE, DECIMAL32);
builder.put(NULL_TYPE, DECIMAL64);
builder.put(NULL_TYPE, DECIMAL128);
builder.put(NULL_TYPE, DECIMAL256);
builder.put(NULL_TYPE, CHAR);
builder.put(NULL_TYPE, VARCHAR);
builder.put(NULL_TYPE, STRING);
@ -148,6 +151,7 @@ public enum PrimitiveType {
builder.put(BOOLEAN, DECIMAL32);
builder.put(BOOLEAN, DECIMAL64);
builder.put(BOOLEAN, DECIMAL128);
builder.put(BOOLEAN, DECIMAL256);
builder.put(BOOLEAN, VARCHAR);
builder.put(BOOLEAN, STRING);
// Tinyint
@ -167,6 +171,7 @@ public enum PrimitiveType {
builder.put(TINYINT, DECIMAL32);
builder.put(TINYINT, DECIMAL64);
builder.put(TINYINT, DECIMAL128);
builder.put(TINYINT, DECIMAL256);
builder.put(TINYINT, VARCHAR);
builder.put(TINYINT, STRING);
builder.put(TINYINT, TIME);
@ -188,6 +193,7 @@ public enum PrimitiveType {
builder.put(SMALLINT, DECIMAL32);
builder.put(SMALLINT, DECIMAL64);
builder.put(SMALLINT, DECIMAL128);
builder.put(SMALLINT, DECIMAL256);
builder.put(SMALLINT, VARCHAR);
builder.put(SMALLINT, STRING);
builder.put(SMALLINT, TIME);
@ -209,6 +215,7 @@ public enum PrimitiveType {
builder.put(INT, DECIMAL32);
builder.put(INT, DECIMAL64);
builder.put(INT, DECIMAL128);
builder.put(INT, DECIMAL256);
builder.put(INT, VARCHAR);
builder.put(INT, STRING);
builder.put(INT, TIME);
@ -230,6 +237,7 @@ public enum PrimitiveType {
builder.put(BIGINT, DECIMAL32);
builder.put(BIGINT, DECIMAL64);
builder.put(BIGINT, DECIMAL128);
builder.put(BIGINT, DECIMAL256);
builder.put(BIGINT, VARCHAR);
builder.put(BIGINT, STRING);
builder.put(BIGINT, TIME);
@ -251,6 +259,7 @@ public enum PrimitiveType {
builder.put(LARGEINT, DECIMAL32);
builder.put(LARGEINT, DECIMAL64);
builder.put(LARGEINT, DECIMAL128);
builder.put(LARGEINT, DECIMAL256);
builder.put(LARGEINT, VARCHAR);
builder.put(LARGEINT, STRING);
builder.put(LARGEINT, TIME);
@ -272,6 +281,7 @@ public enum PrimitiveType {
builder.put(FLOAT, DECIMAL32);
builder.put(FLOAT, DECIMAL64);
builder.put(FLOAT, DECIMAL128);
builder.put(FLOAT, DECIMAL256);
builder.put(FLOAT, VARCHAR);
builder.put(FLOAT, STRING);
builder.put(FLOAT, TIME);
@ -293,6 +303,7 @@ public enum PrimitiveType {
builder.put(DOUBLE, DECIMAL32);
builder.put(DOUBLE, DECIMAL64);
builder.put(DOUBLE, DECIMAL128);
builder.put(DOUBLE, DECIMAL256);
builder.put(DOUBLE, VARCHAR);
builder.put(DOUBLE, STRING);
builder.put(DOUBLE, TIME);
@ -314,6 +325,7 @@ public enum PrimitiveType {
builder.put(DATE, DECIMAL32);
builder.put(DATE, DECIMAL64);
builder.put(DATE, DECIMAL128);
builder.put(DATE, DECIMAL256);
builder.put(DATE, VARCHAR);
builder.put(DATE, STRING);
// Datetime
@ -333,6 +345,7 @@ public enum PrimitiveType {
builder.put(DATETIME, DECIMAL32);
builder.put(DATETIME, DECIMAL64);
builder.put(DATETIME, DECIMAL128);
builder.put(DATETIME, DECIMAL256);
builder.put(DATETIME, VARCHAR);
builder.put(DATETIME, STRING);
// DateV2
@ -352,6 +365,7 @@ public enum PrimitiveType {
builder.put(DATEV2, DECIMAL32);
builder.put(DATEV2, DECIMAL64);
builder.put(DATEV2, DECIMAL128);
builder.put(DATEV2, DECIMAL256);
builder.put(DATEV2, VARCHAR);
builder.put(DATEV2, STRING);
// DatetimeV2
@ -371,6 +385,7 @@ public enum PrimitiveType {
builder.put(DATETIMEV2, DECIMAL32);
builder.put(DATETIMEV2, DECIMAL64);
builder.put(DATETIMEV2, DECIMAL128);
builder.put(DATETIMEV2, DECIMAL256);
builder.put(DATETIMEV2, VARCHAR);
builder.put(DATETIMEV2, STRING);
// Char
@ -391,6 +406,7 @@ public enum PrimitiveType {
builder.put(CHAR, DECIMAL32);
builder.put(CHAR, DECIMAL64);
builder.put(CHAR, DECIMAL128);
builder.put(CHAR, DECIMAL256);
builder.put(CHAR, VARCHAR);
builder.put(CHAR, STRING);
builder.put(CHAR, TIME);
@ -412,6 +428,7 @@ public enum PrimitiveType {
builder.put(VARCHAR, DECIMAL32);
builder.put(VARCHAR, DECIMAL64);
builder.put(VARCHAR, DECIMAL128);
builder.put(VARCHAR, DECIMAL256);
builder.put(VARCHAR, VARCHAR);
builder.put(VARCHAR, JSONB);
builder.put(VARCHAR, VARIANT);
@ -436,6 +453,7 @@ public enum PrimitiveType {
builder.put(STRING, DECIMAL32);
builder.put(STRING, DECIMAL64);
builder.put(STRING, DECIMAL128);
builder.put(STRING, DECIMAL256);
builder.put(STRING, VARCHAR);
builder.put(STRING, JSONB);
builder.put(STRING, VARIANT);
@ -456,6 +474,7 @@ public enum PrimitiveType {
builder.put(DECIMALV2, DECIMAL32);
builder.put(DECIMALV2, DECIMAL64);
builder.put(DECIMALV2, DECIMAL128);
builder.put(DECIMALV2, DECIMAL256);
builder.put(DECIMALV2, VARCHAR);
builder.put(DECIMALV2, STRING);
@ -471,6 +490,7 @@ public enum PrimitiveType {
builder.put(DECIMAL32, DECIMAL32);
builder.put(DECIMAL32, DECIMAL64);
builder.put(DECIMAL32, DECIMAL128);
builder.put(DECIMAL32, DECIMAL256);
builder.put(DECIMAL32, VARCHAR);
builder.put(DECIMAL32, STRING);
@ -486,6 +506,7 @@ public enum PrimitiveType {
builder.put(DECIMAL64, DECIMAL32);
builder.put(DECIMAL64, DECIMAL64);
builder.put(DECIMAL64, DECIMAL128);
builder.put(DECIMAL64, DECIMAL256);
builder.put(DECIMAL64, VARCHAR);
builder.put(DECIMAL64, STRING);
@ -501,9 +522,27 @@ public enum PrimitiveType {
builder.put(DECIMAL128, DECIMAL32);
builder.put(DECIMAL128, DECIMAL64);
builder.put(DECIMAL128, DECIMAL128);
builder.put(DECIMAL128, DECIMAL256);
builder.put(DECIMAL128, VARCHAR);
builder.put(DECIMAL128, STRING);
// decimal256
builder.put(DECIMAL256, BOOLEAN);
builder.put(DECIMAL256, TINYINT);
builder.put(DECIMAL256, SMALLINT);
builder.put(DECIMAL256, INT);
builder.put(DECIMAL256, BIGINT);
builder.put(DECIMAL256, LARGEINT);
builder.put(DECIMAL256, FLOAT);
builder.put(DECIMAL256, DOUBLE);
builder.put(DECIMAL256, DECIMALV2);
builder.put(DECIMAL256, DECIMAL32);
builder.put(DECIMAL256, DECIMAL64);
builder.put(DECIMAL256, DECIMAL128);
builder.put(DECIMAL256, DECIMAL256);
builder.put(DECIMAL256, VARCHAR);
builder.put(DECIMAL256, STRING);
// JSONB
builder.put(JSONB, BOOLEAN);
builder.put(JSONB, TINYINT);
@ -517,6 +556,8 @@ public enum PrimitiveType {
builder.put(JSONB, DECIMAL32);
builder.put(JSONB, DECIMAL64);
builder.put(JSONB, DECIMAL128);
// TODO: support and test decimal256?
// builder.put(JSONB, DECIMAL256);
builder.put(JSONB, VARCHAR);
builder.put(JSONB, STRING);
builder.put(JSONB, VARIANT);
@ -575,6 +616,7 @@ public enum PrimitiveType {
numericTypes.add(DECIMAL32);
numericTypes.add(DECIMAL64);
numericTypes.add(DECIMAL128);
numericTypes.add(DECIMAL256);
supportedTypes = Lists.newArrayList();
supportedTypes.add(NULL_TYPE);
@ -602,6 +644,7 @@ public enum PrimitiveType {
supportedTypes.add(DECIMAL32);
supportedTypes.add(DECIMAL64);
supportedTypes.add(DECIMAL128);
supportedTypes.add(DECIMAL256);
supportedTypes.add(BITMAP);
supportedTypes.add(ARRAY);
supportedTypes.add(MAP);
@ -685,6 +728,8 @@ public enum PrimitiveType {
return DECIMAL64;
case DECIMAL128I:
return DECIMAL128;
case DECIMAL256:
return DECIMAL256;
case TIME:
return TIME;
case TIMEV2:
@ -767,7 +812,7 @@ public enum PrimitiveType {
}
public boolean isDecimalV3Type() {
return this == DECIMAL32 || this == DECIMAL64 || this == DECIMAL128;
return this == DECIMAL32 || this == DECIMAL64 || this == DECIMAL128 || this == DECIMAL256;
}
public boolean isNumericType() {
@ -876,6 +921,7 @@ public enum PrimitiveType {
case DECIMAL32:
case DECIMAL64:
case DECIMAL128:
case DECIMAL256:
return MysqlColType.MYSQL_TYPE_NEWDECIMAL;
case STRING:
return MysqlColType.MYSQL_TYPE_BLOB;
@ -913,6 +959,8 @@ public enum PrimitiveType {
return 8;
case DECIMAL128:
return 16;
case DECIMAL256:
return 32;
default:
return this.getSlotSize();
}

View File

@ -72,14 +72,15 @@ public class ScalarType extends Type {
public static final int MAX_JSONB_LENGTH = 0x7fffffff - 4;
// Hive, mysql, sql server standard.
public static final int MAX_PRECISION = 38;
public static final int MAX_DECIMALV2_PRECISION = 27;
public static final int MAX_DECIMALV2_SCALE = 9;
public static final int MAX_DECIMAL32_PRECISION = 9;
public static final int MAX_DECIMAL64_PRECISION = 18;
public static final int MAX_DECIMAL128_PRECISION = 38;
public static final int MAX_DECIMAL256_PRECISION = 76;
public static final int DEFAULT_MIN_AVG_DECIMAL128_SCALE = 4;
public static final int MAX_DATETIMEV2_SCALE = 6;
public static final int MAX_PRECISION = MAX_DECIMAL256_PRECISION;
private long byteSize = -1;
@ -138,6 +139,7 @@ public class ScalarType extends Type {
case DECIMAL32:
case DECIMAL64:
case DECIMAL128:
case DECIMAL256:
return createDecimalV3Type(precision, scale);
case DECIMALV2:
return createDecimalType(precision, scale);
@ -210,6 +212,8 @@ public class ScalarType extends Type {
return DEFAULT_DECIMAL64;
case DECIMAL128:
return DEFAULT_DECIMAL128;
case DECIMAL256:
return DEFAULT_DECIMAL256;
case DECIMALV2:
return DEFAULT_DECIMALV2;
case LARGEINT:
@ -385,8 +389,10 @@ public class ScalarType extends Type {
return PrimitiveType.DECIMAL32;
} else if (precision <= MAX_DECIMAL64_PRECISION) {
return PrimitiveType.DECIMAL64;
} else {
} else if (precision <= MAX_DECIMAL128_PRECISION) {
return PrimitiveType.DECIMAL128;
} else {
return PrimitiveType.DECIMAL256;
}
}
@ -469,22 +475,6 @@ public class ScalarType extends Type {
}
}
/**
* create a wider decimal type.
*/
public static ScalarType createWiderDecimalV3Type(int precision, int scale) {
ScalarType type = new ScalarType(getSuitableDecimalType(precision, false));
if (precision <= MAX_DECIMAL32_PRECISION) {
type.precision = MAX_DECIMAL32_PRECISION;
} else if (precision <= MAX_DECIMAL64_PRECISION) {
type.precision = MAX_DECIMAL64_PRECISION;
} else {
type.precision = MAX_DECIMAL128_PRECISION;
}
type.scale = scale;
return type;
}
public static ScalarType createVarcharType(int len) {
// length checked in analysis
ScalarType type = new ScalarType(PrimitiveType.VARCHAR);
@ -611,6 +601,7 @@ public class ScalarType extends Type {
case DECIMAL32:
case DECIMAL64:
case DECIMAL128:
case DECIMAL256:
String typeName = "decimalv3";
if (Strings.isNullOrEmpty(precisionStr)) {
stringBuilder.append(typeName).append("(").append(precision)
@ -701,6 +692,7 @@ public class ScalarType extends Type {
case DECIMAL32:
case DECIMAL64:
case DECIMAL128:
case DECIMAL256:
case DATETIMEV2: {
Preconditions.checkArgument(precision >= scale,
String.format("given precision %d is out of scale bound %d", precision, scale));
@ -724,14 +716,16 @@ public class ScalarType extends Type {
public int decimalPrecision() {
Preconditions.checkState(type == PrimitiveType.DECIMALV2 || type == PrimitiveType.DATETIMEV2
|| type == PrimitiveType.TIMEV2 || type == PrimitiveType.DECIMAL32
|| type == PrimitiveType.DECIMAL64 || type == PrimitiveType.DECIMAL128);
|| type == PrimitiveType.DECIMAL64 || type == PrimitiveType.DECIMAL128
|| type == PrimitiveType.DECIMAL256);
return precision;
}
public int decimalScale() {
Preconditions.checkState(type == PrimitiveType.DECIMALV2 || type == PrimitiveType.DATETIMEV2
|| type == PrimitiveType.TIMEV2 || type == PrimitiveType.DECIMAL32
|| type == PrimitiveType.DECIMAL64 || type == PrimitiveType.DECIMAL128);
|| type == PrimitiveType.DECIMAL64 || type == PrimitiveType.DECIMAL128
|| type == PrimitiveType.DECIMAL256);
return scale;
}
@ -923,53 +917,6 @@ public class ScalarType extends Type {
return true;
}
public Type getMaxResolutionType() {
if (isIntegerType()) {
return ScalarType.BIGINT;
// Timestamps get summed as DOUBLE for AVG.
} else if (isFloatingPointType()) {
return ScalarType.DOUBLE;
} else if (isNull()) {
return ScalarType.NULL;
} else if (isDecimalV2()) {
return createDecimalTypeInternal(MAX_PRECISION, scale, true);
} else if (getPrimitiveType() == PrimitiveType.DECIMAL32) {
return createDecimalTypeInternal(MAX_DECIMAL32_PRECISION, scale, false);
} else if (getPrimitiveType() == PrimitiveType.DECIMAL64) {
return createDecimalTypeInternal(MAX_DECIMAL64_PRECISION, scale, false);
} else if (getPrimitiveType() == PrimitiveType.DECIMAL128) {
return createDecimalTypeInternal(MAX_DECIMAL128_PRECISION, scale, false);
} else if (isLargeIntType()) {
return ScalarType.LARGEINT;
} else if (isDatetimeV2()) {
return createDatetimeV2Type(6);
} else if (isTimeV2()) {
return createTimeV2Type(6);
} else {
return ScalarType.INVALID;
}
}
public ScalarType getNextResolutionType() {
Preconditions.checkState(isNumericType() || isNull());
if (type == PrimitiveType.DOUBLE || type == PrimitiveType.BIGINT || isNull()) {
return this;
} else if (type == PrimitiveType.DECIMALV2) {
return createDecimalTypeInternal(MAX_PRECISION, scale, true);
} else if (type == PrimitiveType.DECIMAL32) {
return createDecimalTypeInternal(MAX_DECIMAL64_PRECISION, scale, false);
} else if (type == PrimitiveType.DECIMAL64) {
return createDecimalTypeInternal(MAX_DECIMAL128_PRECISION, scale, false);
} else if (type == PrimitiveType.DECIMAL128) {
return createDecimalTypeInternal(MAX_DECIMAL128_PRECISION, scale, false);
} else if (type == PrimitiveType.DATETIMEV2) {
return createDatetimeV2Type(6);
} else if (type == PrimitiveType.TIMEV2) {
return createTimeV2Type(6);
}
return createType(PrimitiveType.values()[type.ordinal() + 1]);
}
/**
* Returns the smallest decimal type that can safely store this type. Returns
* INVALID if this type cannot be stored as a decimal.
@ -989,9 +936,9 @@ public class ScalarType extends Type {
case BIGINT:
return createDecimalType(19);
case FLOAT:
return createDecimalTypeInternal(MAX_PRECISION, 9, false);
return createDecimalTypeInternal(MAX_DECIMAL128_PRECISION, 9, false);
case DOUBLE:
return createDecimalTypeInternal(MAX_PRECISION, 17, false);
return createDecimalTypeInternal(MAX_DECIMAL128_PRECISION, 17, false);
default:
return ScalarType.INVALID;
}

View File

@ -87,6 +87,10 @@ public abstract class Type {
public static final ScalarType DEFAULT_DECIMAL128 =
ScalarType.createDecimalType(PrimitiveType.DECIMAL128, ScalarType.MAX_DECIMAL128_PRECISION,
ScalarType.DEFAULT_SCALE);
public static final ScalarType DEFAULT_DECIMAL256 =
ScalarType.createDecimalType(PrimitiveType.DECIMAL256, ScalarType.MAX_DECIMAL256_PRECISION,
ScalarType.DEFAULT_SCALE);
public static final ScalarType DEFAULT_DECIMALV3 = DEFAULT_DECIMAL32;
public static final ScalarType DEFAULT_DATETIMEV2 = ScalarType.createDatetimeV2Type(0);
public static final ScalarType DATETIMEV2 = DEFAULT_DATETIMEV2;
@ -96,6 +100,7 @@ public abstract class Type {
public static final ScalarType DECIMAL32 = DEFAULT_DECIMAL32;
public static final ScalarType DECIMAL64 = DEFAULT_DECIMAL64;
public static final ScalarType DECIMAL128 = DEFAULT_DECIMAL128;
public static final ScalarType DECIMAL256 = DEFAULT_DECIMAL256;
public static final ScalarType JSONB = new ScalarType(PrimitiveType.JSONB);
// (ScalarType) ScalarType.createDecimalTypeInternal(-1, -1);
public static final ScalarType DEFAULT_VARCHAR = ScalarType.createVarcharType(-1);
@ -149,6 +154,7 @@ public abstract class Type {
numericTypes.add(DECIMAL32);
numericTypes.add(DECIMAL64);
numericTypes.add(DECIMAL128);
numericTypes.add(DECIMAL256);
numericDateTimeTypes = Lists.newArrayList();
numericDateTimeTypes.add(DATE);
@ -391,7 +397,7 @@ public abstract class Type {
public boolean isDecimalV3() {
return isScalarType(PrimitiveType.DECIMAL32) || isScalarType(PrimitiveType.DECIMAL64)
|| isScalarType(PrimitiveType.DECIMAL128);
|| isScalarType(PrimitiveType.DECIMAL128) || isScalarType(PrimitiveType.DECIMAL256);
}
public boolean isDatetimeV2() {
@ -975,7 +981,8 @@ public abstract class Type {
scalarType.getScale());
} else if (scalarType.getType() == TPrimitiveType.DECIMAL32
|| scalarType.getType() == TPrimitiveType.DECIMAL64
|| scalarType.getType() == TPrimitiveType.DECIMAL128I) {
|| scalarType.getType() == TPrimitiveType.DECIMAL128I
|| scalarType.getType() == TPrimitiveType.DECIMAL256) {
Preconditions.checkState(scalarType.isSetPrecision()
&& scalarType.isSetScale());
type = ScalarType.createDecimalV3Type(scalarType.getPrecision(),
@ -1130,6 +1137,7 @@ public abstract class Type {
case DECIMAL32:
case DECIMAL64:
case DECIMAL128:
case DECIMAL256:
case DATETIMEV2:
case TIMEV2:
return t.decimalPrecision();
@ -1166,6 +1174,7 @@ public abstract class Type {
case DECIMAL32:
case DECIMAL64:
case DECIMAL128:
case DECIMAL256:
return t.decimalScale();
default:
return null;
@ -1200,6 +1209,7 @@ public abstract class Type {
case DECIMAL32:
case DECIMAL64:
case DECIMAL128:
case DECIMAL256:
return 10;
default:
// everything else (including boolean and string) is null
@ -1267,6 +1277,7 @@ public abstract class Type {
compatibilityMatrix[BOOLEAN.ordinal()][DECIMAL32.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[BOOLEAN.ordinal()][DECIMAL64.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[BOOLEAN.ordinal()][DECIMAL128.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[BOOLEAN.ordinal()][DECIMAL256.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[BOOLEAN.ordinal()][AGG_STATE.ordinal()] = PrimitiveType.INVALID_TYPE;
// TINYINT
@ -1288,6 +1299,7 @@ public abstract class Type {
compatibilityMatrix[TINYINT.ordinal()][DECIMAL32.ordinal()] = PrimitiveType.DECIMAL32;
compatibilityMatrix[TINYINT.ordinal()][DECIMAL64.ordinal()] = PrimitiveType.DECIMAL64;
compatibilityMatrix[TINYINT.ordinal()][DECIMAL128.ordinal()] = PrimitiveType.DECIMAL128;
compatibilityMatrix[TINYINT.ordinal()][DECIMAL256.ordinal()] = PrimitiveType.DECIMAL256;
compatibilityMatrix[TINYINT.ordinal()][HLL.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[TINYINT.ordinal()][TIME.ordinal()] = PrimitiveType.DOUBLE;
compatibilityMatrix[TINYINT.ordinal()][BITMAP.ordinal()] = PrimitiveType.INVALID_TYPE;
@ -1315,6 +1327,7 @@ public abstract class Type {
compatibilityMatrix[SMALLINT.ordinal()][DECIMAL32.ordinal()] = PrimitiveType.DECIMAL32;
compatibilityMatrix[SMALLINT.ordinal()][DECIMAL64.ordinal()] = PrimitiveType.DECIMAL64;
compatibilityMatrix[SMALLINT.ordinal()][DECIMAL128.ordinal()] = PrimitiveType.DECIMAL128;
compatibilityMatrix[SMALLINT.ordinal()][DECIMAL256.ordinal()] = PrimitiveType.DECIMAL256;
compatibilityMatrix[SMALLINT.ordinal()][HLL.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[SMALLINT.ordinal()][TIME.ordinal()] = PrimitiveType.DOUBLE;
compatibilityMatrix[SMALLINT.ordinal()][BITMAP.ordinal()] = PrimitiveType.INVALID_TYPE;
@ -1345,6 +1358,7 @@ public abstract class Type {
compatibilityMatrix[INT.ordinal()][DECIMAL32.ordinal()] = PrimitiveType.DECIMAL32;
compatibilityMatrix[INT.ordinal()][DECIMAL64.ordinal()] = PrimitiveType.DECIMAL64;
compatibilityMatrix[INT.ordinal()][DECIMAL128.ordinal()] = PrimitiveType.DECIMAL128;
compatibilityMatrix[INT.ordinal()][DECIMAL256.ordinal()] = PrimitiveType.DECIMAL256;
compatibilityMatrix[INT.ordinal()][HLL.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[INT.ordinal()][TIME.ordinal()] = PrimitiveType.DOUBLE;
compatibilityMatrix[INT.ordinal()][BITMAP.ordinal()] = PrimitiveType.INVALID_TYPE;
@ -1376,6 +1390,7 @@ public abstract class Type {
compatibilityMatrix[BIGINT.ordinal()][DECIMAL32.ordinal()] = PrimitiveType.DECIMAL64;
compatibilityMatrix[BIGINT.ordinal()][DECIMAL64.ordinal()] = PrimitiveType.DECIMAL64;
compatibilityMatrix[BIGINT.ordinal()][DECIMAL128.ordinal()] = PrimitiveType.DECIMAL128;
compatibilityMatrix[BIGINT.ordinal()][DECIMAL256.ordinal()] = PrimitiveType.DECIMAL256;
compatibilityMatrix[BIGINT.ordinal()][HLL.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[BIGINT.ordinal()][TIME.ordinal()] = PrimitiveType.DOUBLE;
compatibilityMatrix[BIGINT.ordinal()][BITMAP.ordinal()] = PrimitiveType.INVALID_TYPE;
@ -1399,6 +1414,7 @@ public abstract class Type {
compatibilityMatrix[LARGEINT.ordinal()][DECIMAL32.ordinal()] = PrimitiveType.DECIMAL128;
compatibilityMatrix[LARGEINT.ordinal()][DECIMAL64.ordinal()] = PrimitiveType.DECIMAL128;
compatibilityMatrix[LARGEINT.ordinal()][DECIMAL128.ordinal()] = PrimitiveType.DECIMAL128;
compatibilityMatrix[LARGEINT.ordinal()][DECIMAL256.ordinal()] = PrimitiveType.DECIMAL256;
compatibilityMatrix[LARGEINT.ordinal()][HLL.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[LARGEINT.ordinal()][TIME.ordinal()] = PrimitiveType.DOUBLE;
compatibilityMatrix[LARGEINT.ordinal()][BITMAP.ordinal()] = PrimitiveType.INVALID_TYPE;
@ -1421,6 +1437,7 @@ public abstract class Type {
compatibilityMatrix[FLOAT.ordinal()][DECIMAL32.ordinal()] = PrimitiveType.DECIMAL128;
compatibilityMatrix[FLOAT.ordinal()][DECIMAL64.ordinal()] = PrimitiveType.DECIMAL128;
compatibilityMatrix[FLOAT.ordinal()][DECIMAL128.ordinal()] = PrimitiveType.DECIMAL128;
compatibilityMatrix[FLOAT.ordinal()][DECIMAL256.ordinal()] = PrimitiveType.DECIMAL256;
compatibilityMatrix[FLOAT.ordinal()][HLL.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[FLOAT.ordinal()][TIME.ordinal()] = PrimitiveType.DOUBLE;
compatibilityMatrix[FLOAT.ordinal()][BITMAP.ordinal()] = PrimitiveType.INVALID_TYPE;
@ -1439,6 +1456,7 @@ public abstract class Type {
compatibilityMatrix[DOUBLE.ordinal()][DECIMAL32.ordinal()] = PrimitiveType.DECIMAL128;
compatibilityMatrix[DOUBLE.ordinal()][DECIMAL64.ordinal()] = PrimitiveType.DECIMAL128;
compatibilityMatrix[DOUBLE.ordinal()][DECIMAL128.ordinal()] = PrimitiveType.DECIMAL128;
compatibilityMatrix[DOUBLE.ordinal()][DECIMAL256.ordinal()] = PrimitiveType.DECIMAL256;
compatibilityMatrix[DOUBLE.ordinal()][HLL.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[DOUBLE.ordinal()][TIME.ordinal()] = PrimitiveType.DOUBLE;
compatibilityMatrix[DOUBLE.ordinal()][BITMAP.ordinal()] = PrimitiveType.INVALID_TYPE;
@ -1461,6 +1479,7 @@ public abstract class Type {
compatibilityMatrix[DATE.ordinal()][DECIMAL32.ordinal()] = PrimitiveType.DECIMAL32;
compatibilityMatrix[DATE.ordinal()][DECIMAL64.ordinal()] = PrimitiveType.DECIMAL64;
compatibilityMatrix[DATE.ordinal()][DECIMAL128.ordinal()] = PrimitiveType.DECIMAL128;
compatibilityMatrix[DATE.ordinal()][DECIMAL256.ordinal()] = PrimitiveType.DECIMAL256;
compatibilityMatrix[DATE.ordinal()][HLL.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[DATE.ordinal()][TIME.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[DATE.ordinal()][TIMEV2.ordinal()] = PrimitiveType.INVALID_TYPE;
@ -1481,6 +1500,7 @@ public abstract class Type {
compatibilityMatrix[DATEV2.ordinal()][DECIMAL32.ordinal()] = PrimitiveType.DECIMAL32;
compatibilityMatrix[DATEV2.ordinal()][DECIMAL64.ordinal()] = PrimitiveType.DECIMAL64;
compatibilityMatrix[DATEV2.ordinal()][DECIMAL128.ordinal()] = PrimitiveType.DECIMAL128;
compatibilityMatrix[DATEV2.ordinal()][DECIMAL256.ordinal()] = PrimitiveType.DECIMAL256;
compatibilityMatrix[DATEV2.ordinal()][HLL.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[DATEV2.ordinal()][TIME.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[DATEV2.ordinal()][TIMEV2.ordinal()] = PrimitiveType.INVALID_TYPE;
@ -1500,6 +1520,7 @@ public abstract class Type {
compatibilityMatrix[DATETIME.ordinal()][DECIMAL32.ordinal()] = PrimitiveType.DECIMAL64;
compatibilityMatrix[DATETIME.ordinal()][DECIMAL64.ordinal()] = PrimitiveType.DECIMAL64;
compatibilityMatrix[DATETIME.ordinal()][DECIMAL128.ordinal()] = PrimitiveType.DECIMAL128;
compatibilityMatrix[DATETIME.ordinal()][DECIMAL256.ordinal()] = PrimitiveType.DECIMAL256;
compatibilityMatrix[DATETIME.ordinal()][HLL.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[DATETIME.ordinal()][TIME.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[DATETIME.ordinal()][TIMEV2.ordinal()] = PrimitiveType.INVALID_TYPE;
@ -1519,6 +1540,7 @@ public abstract class Type {
compatibilityMatrix[DATETIMEV2.ordinal()][DECIMAL32.ordinal()] = PrimitiveType.DECIMAL64;
compatibilityMatrix[DATETIMEV2.ordinal()][DECIMAL64.ordinal()] = PrimitiveType.DECIMAL64;
compatibilityMatrix[DATETIMEV2.ordinal()][DECIMAL128.ordinal()] = PrimitiveType.DECIMAL128;
compatibilityMatrix[DATETIMEV2.ordinal()][DECIMAL256.ordinal()] = PrimitiveType.DECIMAL256;
compatibilityMatrix[DATETIMEV2.ordinal()][HLL.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[DATETIMEV2.ordinal()][TIME.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[DATETIMEV2.ordinal()][TIMEV2.ordinal()] = PrimitiveType.INVALID_TYPE;
@ -1538,6 +1560,7 @@ public abstract class Type {
compatibilityMatrix[CHAR.ordinal()][DECIMAL32.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[CHAR.ordinal()][DECIMAL64.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[CHAR.ordinal()][DECIMAL128.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[CHAR.ordinal()][DECIMAL256.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[CHAR.ordinal()][HLL.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[CHAR.ordinal()][TIME.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[CHAR.ordinal()][TIMEV2.ordinal()] = PrimitiveType.INVALID_TYPE;
@ -1553,6 +1576,7 @@ public abstract class Type {
compatibilityMatrix[VARCHAR.ordinal()][DECIMAL32.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[VARCHAR.ordinal()][DECIMAL64.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[VARCHAR.ordinal()][DECIMAL128.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[VARCHAR.ordinal()][DECIMAL256.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[VARCHAR.ordinal()][HLL.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[VARCHAR.ordinal()][TIME.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[VARCHAR.ordinal()][TIMEV2.ordinal()] = PrimitiveType.INVALID_TYPE;
@ -1576,6 +1600,7 @@ public abstract class Type {
compatibilityMatrix[STRING.ordinal()][DECIMAL32.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[STRING.ordinal()][DECIMAL64.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[STRING.ordinal()][DECIMAL128.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[STRING.ordinal()][DECIMAL256.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[STRING.ordinal()][JSONB.ordinal()] = PrimitiveType.STRING;
compatibilityMatrix[STRING.ordinal()][VARIANT.ordinal()] = PrimitiveType.STRING;
compatibilityMatrix[STRING.ordinal()][AGG_STATE.ordinal()] = PrimitiveType.INVALID_TYPE;
@ -1585,6 +1610,7 @@ public abstract class Type {
compatibilityMatrix[JSONB.ordinal()][DECIMAL32.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[JSONB.ordinal()][DECIMAL64.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[JSONB.ordinal()][DECIMAL128.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[JSONB.ordinal()][DECIMAL256.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[JSONB.ordinal()][HLL.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[JSONB.ordinal()][TIME.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[JSONB.ordinal()][TIMEV2.ordinal()] = PrimitiveType.INVALID_TYPE;
@ -1601,6 +1627,7 @@ public abstract class Type {
compatibilityMatrix[VARIANT.ordinal()][DECIMAL32.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[VARIANT.ordinal()][DECIMAL64.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[VARIANT.ordinal()][DECIMAL128.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[VARIANT.ordinal()][DECIMAL256.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[VARIANT.ordinal()][HLL.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[VARIANT.ordinal()][TIME.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[VARIANT.ordinal()][TIMEV2.ordinal()] = PrimitiveType.INVALID_TYPE;
@ -1627,6 +1654,7 @@ public abstract class Type {
compatibilityMatrix[DECIMALV2.ordinal()][DECIMAL32.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[DECIMALV2.ordinal()][DECIMAL64.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[DECIMALV2.ordinal()][DECIMAL128.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[DECIMALV2.ordinal()][DECIMAL256.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[DECIMALV2.ordinal()][AGG_STATE.ordinal()] = PrimitiveType.INVALID_TYPE;
// DECIMAL32
@ -1642,6 +1670,7 @@ public abstract class Type {
compatibilityMatrix[DECIMAL32.ordinal()][DECIMALV2.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[DECIMAL32.ordinal()][DECIMAL64.ordinal()] = PrimitiveType.DECIMAL64;
compatibilityMatrix[DECIMAL32.ordinal()][DECIMAL128.ordinal()] = PrimitiveType.DECIMAL128;
compatibilityMatrix[DECIMAL32.ordinal()][DECIMAL256.ordinal()] = PrimitiveType.DECIMAL256;
compatibilityMatrix[DECIMAL32.ordinal()][AGG_STATE.ordinal()] = PrimitiveType.INVALID_TYPE;
// DECIMAL64
@ -1657,6 +1686,7 @@ public abstract class Type {
compatibilityMatrix[DECIMAL64.ordinal()][DECIMALV2.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[DECIMAL64.ordinal()][DECIMAL32.ordinal()] = PrimitiveType.DECIMAL64;
compatibilityMatrix[DECIMAL64.ordinal()][DECIMAL128.ordinal()] = PrimitiveType.DECIMAL128;
compatibilityMatrix[DECIMAL64.ordinal()][DECIMAL256.ordinal()] = PrimitiveType.DECIMAL256;
compatibilityMatrix[DECIMAL64.ordinal()][AGG_STATE.ordinal()] = PrimitiveType.INVALID_TYPE;
// DECIMAL128
@ -1672,8 +1702,24 @@ public abstract class Type {
compatibilityMatrix[DECIMAL128.ordinal()][DECIMALV2.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[DECIMAL128.ordinal()][DECIMAL32.ordinal()] = PrimitiveType.DECIMAL128;
compatibilityMatrix[DECIMAL128.ordinal()][DECIMAL64.ordinal()] = PrimitiveType.DECIMAL128;
compatibilityMatrix[DECIMAL128.ordinal()][DECIMAL256.ordinal()] = PrimitiveType.DECIMAL256;
compatibilityMatrix[DECIMAL128.ordinal()][AGG_STATE.ordinal()] = PrimitiveType.INVALID_TYPE;
// DECIMAL256
compatibilityMatrix[DECIMAL256.ordinal()][HLL.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[DECIMAL256.ordinal()][TIME.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[DECIMAL256.ordinal()][TIMEV2.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[DECIMAL256.ordinal()][DATEV2.ordinal()] = PrimitiveType.DECIMAL256;
compatibilityMatrix[DECIMAL256.ordinal()][DATETIMEV2.ordinal()] = PrimitiveType.DECIMAL256;
compatibilityMatrix[DECIMAL256.ordinal()][BITMAP.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[DECIMAL256.ordinal()][STRING.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[DECIMAL256.ordinal()][QUANTILE_STATE.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[DECIMAL256.ordinal()][DECIMALV2.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[DECIMAL256.ordinal()][DECIMAL32.ordinal()] = PrimitiveType.DECIMAL256;
compatibilityMatrix[DECIMAL256.ordinal()][DECIMAL64.ordinal()] = PrimitiveType.DECIMAL256;
compatibilityMatrix[DECIMAL256.ordinal()][DECIMAL128.ordinal()] = PrimitiveType.DECIMAL256;
compatibilityMatrix[DECIMAL256.ordinal()][AGG_STATE.ordinal()] = PrimitiveType.INVALID_TYPE;
// HLL
compatibilityMatrix[HLL.ordinal()][TIME.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[HLL.ordinal()][TIMEV2.ordinal()] = PrimitiveType.INVALID_TYPE;
@ -1687,6 +1733,7 @@ public abstract class Type {
compatibilityMatrix[HLL.ordinal()][DECIMAL32.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[HLL.ordinal()][DECIMAL64.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[HLL.ordinal()][DECIMAL128.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[HLL.ordinal()][DECIMAL256.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[HLL.ordinal()][AGG_STATE.ordinal()] = PrimitiveType.INVALID_TYPE;
@ -1702,6 +1749,7 @@ public abstract class Type {
compatibilityMatrix[BITMAP.ordinal()][DECIMAL32.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[BITMAP.ordinal()][DECIMAL64.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[BITMAP.ordinal()][DECIMAL128.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[BITMAP.ordinal()][DECIMAL256.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[BITMAP.ordinal()][AGG_STATE.ordinal()] = PrimitiveType.INVALID_TYPE;
//QUANTILE_STATE
@ -1713,6 +1761,7 @@ public abstract class Type {
compatibilityMatrix[QUANTILE_STATE.ordinal()][DECIMAL32.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[QUANTILE_STATE.ordinal()][DECIMAL64.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[QUANTILE_STATE.ordinal()][DECIMAL128.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[QUANTILE_STATE.ordinal()][DECIMAL256.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[QUANTILE_STATE.ordinal()][AGG_STATE.ordinal()] = PrimitiveType.INVALID_TYPE;
//AGG_STATE
@ -1724,6 +1773,7 @@ public abstract class Type {
compatibilityMatrix[AGG_STATE.ordinal()][DECIMAL32.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[AGG_STATE.ordinal()][DECIMAL64.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[AGG_STATE.ordinal()][DECIMAL128.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[AGG_STATE.ordinal()][DECIMAL256.ordinal()] = PrimitiveType.INVALID_TYPE;
// TIME why here not???
compatibilityMatrix[TIME.ordinal()][TIME.ordinal()] = PrimitiveType.INVALID_TYPE;
@ -1731,6 +1781,7 @@ public abstract class Type {
compatibilityMatrix[TIME.ordinal()][DECIMAL32.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[TIME.ordinal()][DECIMAL64.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[TIME.ordinal()][DECIMAL128.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[TIME.ordinal()][DECIMAL256.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[TIME.ordinal()][DATEV2.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[TIME.ordinal()][DATETIMEV2.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[TIME.ordinal()][AGG_STATE.ordinal()] = PrimitiveType.INVALID_TYPE;
@ -1740,6 +1791,7 @@ public abstract class Type {
compatibilityMatrix[TIMEV2.ordinal()][DECIMAL32.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[TIMEV2.ordinal()][DECIMAL64.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[TIMEV2.ordinal()][DECIMAL128.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[TIMEV2.ordinal()][DECIMAL256.ordinal()] = PrimitiveType.INVALID_TYPE;
compatibilityMatrix[TIMEV2.ordinal()][AGG_STATE.ordinal()] = PrimitiveType.INVALID_TYPE;
// Check all of the necessary entries that should be filled.
@ -1801,6 +1853,8 @@ public abstract class Type {
return DECIMAL64;
case DECIMAL128:
return DECIMAL128;
case DECIMAL256:
return DECIMAL256;
case STRING:
return STRING;
case JSONB:
@ -1948,11 +2002,6 @@ public abstract class Type {
}
}
public Type getMaxResolutionType() {
Preconditions.checkState(true, "must implemented");
return null;
}
public Type getNumResultType() {
switch (getPrimitiveType()) {
case BOOLEAN:
@ -1984,6 +2033,8 @@ public abstract class Type {
return Type.DECIMAL64;
case DECIMAL128:
return Type.DECIMAL128;
case DECIMAL256:
return Type.DECIMAL256;
default:
return Type.INVALID;