public static List<TColumnType> toThrift(ArrayList<ColumnType> types) { ArrayList<TColumnType> result = Lists.newArrayList(); for (ColumnType t : types) { result.add(t.toThrift()); } return result; }
// Identical to createDecimalType except that higher precisions are truncated // to the max storable precision. The BE will report overflow in these cases // (think of this as adding ints to BIGINT but BIGINT can still overflow). public static ColumnType createDecimalTypeInternal(int precision, int scale) { ColumnType type = new ColumnType(PrimitiveType.DECIMAL); type.precision_ = Math.min(precision, MAX_PRECISION); type.scale_ = Math.min(type.precision_, scale); type.isAnalyzed_ = true; return type; }
public static ColumnType createDecimalType(int precision, int scale) { Preconditions.checkState(precision >= 0); // Enforced by parser Preconditions.checkState(scale >= 0); // Enforced by parser. ColumnType type = new ColumnType(PrimitiveType.DECIMAL); type.precision_ = precision; type.scale_ = scale; return type; }
private boolean supportsBinaryEncoding(FieldSchema fs) { try { ColumnType colType = parseColumnType(fs); // Only boolean, integer and floating point types can use binary storage. return colType.isBoolean() || colType.isIntegerType() || colType.isFloatingPointType(); } catch (TableLoadingException e) { return false; } }
@Override public String toString() { StringBuilder sb = new StringBuilder(colName_); if (colType_ != null) sb.append(" " + colType_.toString()); if (comment_ != null) sb.append(String.format(" COMMENT '%s'", comment_)); return sb.toString(); }
public void analyze() throws AnalysisException { // Check whether the column name meets the Metastore's requirements. if (!MetaStoreUtils.validateName(colName_)) { throw new AnalysisException("Invalid column name: " + colName_); } colType_.analyze(); }
/** * Returns true if this object is of type t. Handles wildcard types. That is, if t is the wildcard * type variant of 'this', returns true. */ public boolean matchesType(ColumnType t) { if (equals(t)) return true; if (isDecimal() && t.isWildcardDecimal()) { Preconditions.checkState(!isWildcardDecimal()); return true; } return false; }
static { compatibilityMatrix = new PrimitiveType[STRING.ordinal() + 1][STRING.ordinal() + 1]; // NULL_TYPE is compatible with any type and results in the non-null type. compatibilityMatrix[NULL.ordinal()][NULL.ordinal()] = PrimitiveType.NULL_TYPE; compatibilityMatrix[NULL.ordinal()][BOOLEAN.ordinal()] = PrimitiveType.BOOLEAN; compatibilityMatrix[NULL.ordinal()][TINYINT.ordinal()] = PrimitiveType.TINYINT; compatibilityMatrix[NULL.ordinal()][SMALLINT.ordinal()] = PrimitiveType.SMALLINT; compatibilityMatrix[NULL.ordinal()][INT.ordinal()] = PrimitiveType.INT; compatibilityMatrix[NULL.ordinal()][BIGINT.ordinal()] = PrimitiveType.BIGINT; compatibilityMatrix[NULL.ordinal()][FLOAT.ordinal()] = PrimitiveType.FLOAT; compatibilityMatrix[NULL.ordinal()][DOUBLE.ordinal()] = PrimitiveType.DOUBLE; compatibilityMatrix[NULL.ordinal()][DATE.ordinal()] = PrimitiveType.DATE; compatibilityMatrix[NULL.ordinal()][DATETIME.ordinal()] = PrimitiveType.DATETIME; compatibilityMatrix[NULL.ordinal()][TIMESTAMP.ordinal()] = PrimitiveType.TIMESTAMP; compatibilityMatrix[NULL.ordinal()][STRING.ordinal()] = PrimitiveType.STRING; compatibilityMatrix[BOOLEAN.ordinal()][BOOLEAN.ordinal()] = PrimitiveType.BOOLEAN; compatibilityMatrix[BOOLEAN.ordinal()][TINYINT.ordinal()] = PrimitiveType.TINYINT; compatibilityMatrix[BOOLEAN.ordinal()][SMALLINT.ordinal()] = PrimitiveType.SMALLINT; compatibilityMatrix[BOOLEAN.ordinal()][INT.ordinal()] = PrimitiveType.INT; compatibilityMatrix[BOOLEAN.ordinal()][BIGINT.ordinal()] = PrimitiveType.BIGINT; compatibilityMatrix[BOOLEAN.ordinal()][FLOAT.ordinal()] = PrimitiveType.FLOAT; compatibilityMatrix[BOOLEAN.ordinal()][DOUBLE.ordinal()] = PrimitiveType.DOUBLE; compatibilityMatrix[BOOLEAN.ordinal()][DATE.ordinal()] = PrimitiveType.INVALID_TYPE; compatibilityMatrix[BOOLEAN.ordinal()][DATETIME.ordinal()] = PrimitiveType.INVALID_TYPE; compatibilityMatrix[BOOLEAN.ordinal()][TIMESTAMP.ordinal()] = PrimitiveType.INVALID_TYPE; compatibilityMatrix[BOOLEAN.ordinal()][STRING.ordinal()] = PrimitiveType.INVALID_TYPE; compatibilityMatrix[TINYINT.ordinal()][TINYINT.ordinal()] = PrimitiveType.TINYINT; compatibilityMatrix[TINYINT.ordinal()][SMALLINT.ordinal()] = PrimitiveType.SMALLINT; compatibilityMatrix[TINYINT.ordinal()][INT.ordinal()] = PrimitiveType.INT; compatibilityMatrix[TINYINT.ordinal()][BIGINT.ordinal()] = PrimitiveType.BIGINT; compatibilityMatrix[TINYINT.ordinal()][FLOAT.ordinal()] = PrimitiveType.FLOAT; compatibilityMatrix[TINYINT.ordinal()][DOUBLE.ordinal()] = PrimitiveType.DOUBLE; compatibilityMatrix[TINYINT.ordinal()][DATE.ordinal()] = PrimitiveType.INVALID_TYPE; compatibilityMatrix[TINYINT.ordinal()][DATETIME.ordinal()] = PrimitiveType.INVALID_TYPE; compatibilityMatrix[TINYINT.ordinal()][TIMESTAMP.ordinal()] = PrimitiveType.INVALID_TYPE; compatibilityMatrix[TINYINT.ordinal()][STRING.ordinal()] = PrimitiveType.INVALID_TYPE; compatibilityMatrix[SMALLINT.ordinal()][SMALLINT.ordinal()] = PrimitiveType.SMALLINT; compatibilityMatrix[SMALLINT.ordinal()][INT.ordinal()] = PrimitiveType.INT; compatibilityMatrix[SMALLINT.ordinal()][BIGINT.ordinal()] = PrimitiveType.BIGINT; compatibilityMatrix[SMALLINT.ordinal()][FLOAT.ordinal()] = PrimitiveType.FLOAT; compatibilityMatrix[SMALLINT.ordinal()][DOUBLE.ordinal()] = PrimitiveType.DOUBLE; compatibilityMatrix[SMALLINT.ordinal()][DATE.ordinal()] = PrimitiveType.INVALID_TYPE; compatibilityMatrix[SMALLINT.ordinal()][DATETIME.ordinal()] = PrimitiveType.INVALID_TYPE; compatibilityMatrix[SMALLINT.ordinal()][TIMESTAMP.ordinal()] = PrimitiveType.INVALID_TYPE; compatibilityMatrix[SMALLINT.ordinal()][STRING.ordinal()] = PrimitiveType.INVALID_TYPE; compatibilityMatrix[INT.ordinal()][INT.ordinal()] = PrimitiveType.INT; compatibilityMatrix[INT.ordinal()][BIGINT.ordinal()] = PrimitiveType.BIGINT; compatibilityMatrix[INT.ordinal()][FLOAT.ordinal()] = PrimitiveType.FLOAT; compatibilityMatrix[INT.ordinal()][DOUBLE.ordinal()] = PrimitiveType.DOUBLE; compatibilityMatrix[INT.ordinal()][DATE.ordinal()] = PrimitiveType.INVALID_TYPE; compatibilityMatrix[INT.ordinal()][DATETIME.ordinal()] = PrimitiveType.INVALID_TYPE; compatibilityMatrix[INT.ordinal()][TIMESTAMP.ordinal()] = PrimitiveType.INVALID_TYPE; compatibilityMatrix[INT.ordinal()][STRING.ordinal()] = PrimitiveType.INVALID_TYPE; compatibilityMatrix[BIGINT.ordinal()][BIGINT.ordinal()] = PrimitiveType.BIGINT; compatibilityMatrix[BIGINT.ordinal()][FLOAT.ordinal()] = PrimitiveType.FLOAT; compatibilityMatrix[BIGINT.ordinal()][DOUBLE.ordinal()] = PrimitiveType.DOUBLE; compatibilityMatrix[BIGINT.ordinal()][DATE.ordinal()] = PrimitiveType.INVALID_TYPE; compatibilityMatrix[BIGINT.ordinal()][DATETIME.ordinal()] = PrimitiveType.INVALID_TYPE; compatibilityMatrix[BIGINT.ordinal()][TIMESTAMP.ordinal()] = PrimitiveType.INVALID_TYPE; compatibilityMatrix[BIGINT.ordinal()][STRING.ordinal()] = PrimitiveType.INVALID_TYPE; compatibilityMatrix[FLOAT.ordinal()][FLOAT.ordinal()] = PrimitiveType.FLOAT; compatibilityMatrix[FLOAT.ordinal()][DOUBLE.ordinal()] = PrimitiveType.DOUBLE; compatibilityMatrix[FLOAT.ordinal()][DATE.ordinal()] = PrimitiveType.INVALID_TYPE; compatibilityMatrix[FLOAT.ordinal()][DATETIME.ordinal()] = PrimitiveType.INVALID_TYPE; compatibilityMatrix[FLOAT.ordinal()][TIMESTAMP.ordinal()] = PrimitiveType.INVALID_TYPE; compatibilityMatrix[FLOAT.ordinal()][STRING.ordinal()] = PrimitiveType.INVALID_TYPE; compatibilityMatrix[DOUBLE.ordinal()][DOUBLE.ordinal()] = PrimitiveType.DOUBLE; compatibilityMatrix[DOUBLE.ordinal()][DATE.ordinal()] = PrimitiveType.INVALID_TYPE; compatibilityMatrix[DOUBLE.ordinal()][DATETIME.ordinal()] = PrimitiveType.INVALID_TYPE; compatibilityMatrix[DOUBLE.ordinal()][TIMESTAMP.ordinal()] = PrimitiveType.INVALID_TYPE; compatibilityMatrix[DOUBLE.ordinal()][STRING.ordinal()] = PrimitiveType.INVALID_TYPE; compatibilityMatrix[DATE.ordinal()][DATE.ordinal()] = PrimitiveType.DATE; compatibilityMatrix[DATE.ordinal()][DATETIME.ordinal()] = PrimitiveType.DATETIME; compatibilityMatrix[DATE.ordinal()][TIMESTAMP.ordinal()] = PrimitiveType.TIMESTAMP; compatibilityMatrix[DATE.ordinal()][STRING.ordinal()] = PrimitiveType.INVALID_TYPE; compatibilityMatrix[DATETIME.ordinal()][DATETIME.ordinal()] = PrimitiveType.DATETIME; compatibilityMatrix[DATETIME.ordinal()][TIMESTAMP.ordinal()] = PrimitiveType.TIMESTAMP; compatibilityMatrix[DATETIME.ordinal()][STRING.ordinal()] = PrimitiveType.INVALID_TYPE; compatibilityMatrix[TIMESTAMP.ordinal()][TIMESTAMP.ordinal()] = PrimitiveType.TIMESTAMP; compatibilityMatrix[TIMESTAMP.ordinal()][STRING.ordinal()] = PrimitiveType.TIMESTAMP; compatibilityMatrix[STRING.ordinal()][STRING.ordinal()] = PrimitiveType.STRING; }
/** * Return type t such that values from both t1 and t2 can be assigned to t without loss of * precision. Returns INVALID_TYPE if there is no such type or if any of t1 and t2 is * INVALID_TYPE. */ public static ColumnType getAssignmentCompatibleType(ColumnType t1, ColumnType t2) { if (!t1.isValid() || !t2.isValid()) return INVALID; if (t1.equals(t2)) return t1; if (t1.isDecimal() || t2.isDecimal()) { if (t1.isNull()) return t2; if (t2.isNull()) return t1; // Allow casts between decimal and numeric types by converting // numeric types to the containing decimal type. ColumnType t1Decimal = t1.getMinResolutionDecimal(); ColumnType t2Decimal = t2.getMinResolutionDecimal(); if (t1Decimal.isInvalid() || t2Decimal.isInvalid()) return ColumnType.INVALID; Preconditions.checkState(t1Decimal.isDecimal()); Preconditions.checkState(t2Decimal.isDecimal()); if (t1Decimal.isSupertypeOf(t2Decimal)) return t1; if (t2Decimal.isSupertypeOf(t1Decimal)) return t2; return TypesUtil.getDecimalAssignmentCompatibleType(t1Decimal, t2Decimal); } PrimitiveType smallerType = (t1.type_.ordinal() < t2.type_.ordinal() ? t1.type_ : t2.type_); PrimitiveType largerType = (t1.type_.ordinal() > t2.type_.ordinal() ? t1.type_ : t2.type_); PrimitiveType result = compatibilityMatrix[smallerType.ordinal()][largerType.ordinal()]; Preconditions.checkNotNull(result); return createType(result); }
/* Returns true if this decimal type is a supertype of the other decimal type. * e.g. (10,3) is a super type of (3,3) but (5,4) is not a supertype of (3,0). * To be a super type of another decimal, the number of digits before and after * the decimal point must be greater or equal. */ public boolean isSupertypeOf(ColumnType o) { Preconditions.checkState(isDecimal()); Preconditions.checkState(o.isDecimal()); if (isWildcardDecimal()) return true; return scale_ >= o.scale_ && precision_ - scale_ >= o.precision_ - o.scale_; }
public static ColumnType createCharType(int len) { ColumnType type = new ColumnType(PrimitiveType.CHAR); type.len_ = len; return type; }