/** Returns whether one type is just a widening of another. * * <p>For example:<ul> * <li>{@code VARCHAR(10)} is a widening of {@code VARCHAR(5)}. * <li>{@code VARCHAR(10)} is a widening of {@code VARCHAR(10) NOT NULL}. * </ul> */ private boolean isWidening(RelDataType type, RelDataType type1) { return type.getSqlTypeName() == type1.getSqlTypeName() && type.getPrecision() >= type1.getPrecision(); }
/** Returns whether one type is just a widening of another. * * <p>For example:<ul> * <li>{@code VARCHAR(10)} is a widening of {@code VARCHAR(5)}. * <li>{@code VARCHAR(10)} is a widening of {@code VARCHAR(10) NOT NULL}. * </ul> */ private boolean isWidening(RelDataType type, RelDataType type1) { return type.getSqlTypeName() == type1.getSqlTypeName() && type.getPrecision() >= type1.getPrecision(); }
return 8d; case BINARY: return (double) type.getPrecision(); case VARBINARY: return Math.min(type.getPrecision(), 100d); case CHAR: return (double) type.getPrecision() * BYTES_PER_CHARACTER; case VARCHAR: return Math.min((double) type.getPrecision() * BYTES_PER_CHARACTER, 100d); case ROW: Double average = 0.0;
ht = new HiveToken(HiveParser.TOK_CHAR, "TOK_CHAR", String.valueOf(calciteType.getPrecision())); if (calciteType.getPrecision() == Integer.MAX_VALUE) ht = new HiveToken(HiveParser.TOK_STRING, "TOK_STRING", String.valueOf(calciteType .getPrecision())); else ht = new HiveToken(HiveParser.TOK_VARCHAR, "TOK_VARCHAR", String.valueOf(calciteType .getPrecision())); .getPrecision()), String.valueOf(calciteType.getScale()));
/*********************** Convert Calcite Types To Hive Types ***********************/ public static HiveToken hiveToken(RelDataType calciteType) { HiveToken ht = null; switch (calciteType.getSqlTypeName()) { case CHAR: { ht = new HiveToken(HiveParser.TOK_CHAR, "TOK_CHAR", String.valueOf(calciteType.getPrecision())); } break; case VARCHAR: { if (calciteType.getPrecision() == Integer.MAX_VALUE) ht = new HiveToken(HiveParser.TOK_STRING, "TOK_STRING", String.valueOf(calciteType .getPrecision())); else ht = new HiveToken(HiveParser.TOK_VARCHAR, "TOK_VARCHAR", String.valueOf(calciteType .getPrecision())); } break; case DECIMAL: { ht = new HiveToken(HiveParser.TOK_DECIMAL, "TOK_DECIMAL", String.valueOf(calciteType .getPrecision()), String.valueOf(calciteType.getScale())); } break; default: ht = calciteToHiveTypeNameMap.get(calciteType.getSqlTypeName().getName()); } return ht; } }
return 8d; case BINARY: return (double) type.getPrecision(); case VARBINARY: return Math.min(type.getPrecision(), 100d); case CHAR: return (double) type.getPrecision() * BYTES_PER_CHARACTER; case VARCHAR: return Math.min((double) type.getPrecision() * BYTES_PER_CHARACTER, 100d); case ROW: Double average = 0.0;
@Override public Object[] apply(final RelDataTypeField field) { final RelDataType type = field.getType(); boolean isNumeric = SqlTypeName.NUMERIC_TYPES.contains(type.getSqlTypeName()); boolean isCharacter = SqlTypeName.CHAR_TYPES.contains(type.getSqlTypeName()); boolean isDateTime = SqlTypeName.DATETIME_TYPES.contains(type.getSqlTypeName()); return new Object[]{ CATALOG_NAME, // TABLE_CATALOG schemaName, // TABLE_SCHEMA tableName, // TABLE_NAME field.getName(), // COLUMN_NAME String.valueOf(field.getIndex()), // ORDINAL_POSITION "", // COLUMN_DEFAULT type.isNullable() ? "YES" : "NO", // IS_NULLABLE type.getSqlTypeName().toString(), // DATA_TYPE null, // CHARACTER_MAXIMUM_LENGTH null, // CHARACTER_OCTET_LENGTH isNumeric ? String.valueOf(type.getPrecision()) : null, // NUMERIC_PRECISION isNumeric ? "10" : null, // NUMERIC_PRECISION_RADIX isNumeric ? String.valueOf(type.getScale()) : null, // NUMERIC_SCALE isDateTime ? String.valueOf(type.getPrecision()) : null, // DATETIME_PRECISION isCharacter ? type.getCharset().name() : null, // CHARACTER_SET_NAME isCharacter ? type.getCollation().getCollationName() : null, // COLLATION_NAME Long.valueOf(type.getSqlTypeName().getJdbcOrdinal()) // JDBC_TYPE (Druid extension) }; } }
return TypeInfoFactory.binaryTypeInfo; case DECIMAL: return TypeInfoFactory.getDecimalTypeInfo(rType.getPrecision(), rType.getScale()); case VARCHAR: int varcharLength = rType.getPrecision(); if (varcharLength < 1 || varcharLength > HiveVarchar.MAX_VARCHAR_LENGTH) return TypeInfoFactory.getPrimitiveTypeInfo(serdeConstants.STRING_TYPE_NAME); return TypeInfoFactory.getVarcharTypeInfo(varcharLength); case CHAR: int charLength = rType.getPrecision(); if (charLength < 1 || charLength > HiveChar.MAX_CHAR_LENGTH) return TypeInfoFactory.getPrimitiveTypeInfo(serdeConstants.STRING_TYPE_NAME);
return TypeInfoFactory.binaryTypeInfo; case DECIMAL: return TypeInfoFactory.getDecimalTypeInfo(rType.getPrecision(), rType.getScale()); case VARCHAR: int varcharLength = rType.getPrecision(); if (varcharLength < 1 || varcharLength > HiveVarchar.MAX_VARCHAR_LENGTH) return TypeInfoFactory.getPrimitiveTypeInfo(serdeConstants.STRING_TYPE_NAME); return TypeInfoFactory.getVarcharTypeInfo(varcharLength); case CHAR: int charLength = rType.getPrecision(); if (charLength < 1 || charLength > HiveChar.MAX_CHAR_LENGTH) return TypeInfoFactory.getPrimitiveTypeInfo(serdeConstants.STRING_TYPE_NAME);
field.getType().getPrecision(), // display size field.getType().getPrecision(), // precision
case DECIMAL: return new ExprNodeConstantDesc( TypeInfoFactory.getDecimalTypeInfo(lType.getPrecision(), lType.getScale()), null); case VARCHAR: case CHAR: return new ExprNodeConstantDesc(TypeInfoFactory.binaryTypeInfo, literal.getValue3()); case DECIMAL: return new ExprNodeConstantDesc(TypeInfoFactory.getDecimalTypeInfo(lType.getPrecision(), lType.getScale()), HiveDecimal.create((BigDecimal)literal.getValue3())); case VARCHAR:
@Test public void testLegalDecimalType() { RelDataTypeSystem typeSystem = new KylinRelDataTypeSystem(); RelDataTypeFactory typeFactory = new SqlTypeFactoryImpl(typeSystem); DataType dataType = DataType.getType("decimal(30, 10)"); RelDataType relDataType = OLAPTable.createSqlType(typeFactory, dataType, true); Assert.assertTrue(relDataType instanceof BasicSqlType); Assert.assertEquals(relDataType.getSqlTypeName(), SqlTypeName.DECIMAL); Assert.assertEquals(relDataType.getPrecision(), 30); Assert.assertTrue(relDataType.getPrecision() <= typeSystem.getMaxNumericPrecision()); Assert.assertEquals(relDataType.getScale(), 10); Assert.assertTrue(relDataType.getScale() <= typeSystem.getMaxNumericScale()); }
case DECIMAL: return new ExprNodeConstantDesc( TypeInfoFactory.getDecimalTypeInfo(lType.getPrecision(), lType.getScale()), null); case VARCHAR: case CHAR: return new ExprNodeConstantDesc(TypeInfoFactory.binaryTypeInfo, literal.getValue3()); case DECIMAL: return new ExprNodeConstantDesc(TypeInfoFactory.getDecimalTypeInfo(lType.getPrecision(), lType.getScale()), HiveDecimal.create((BigDecimal)literal.getValue3())); case VARCHAR:
getOriginalScanRel().getCluster().getTypeFactory().createSqlType(SqlTypeName.VARCHAR).getPrecision()).build(); case "LONG": case "BIGINT":
@Test public void testIllegalDecimalType() { RelDataTypeSystem typeSystem = new KylinRelDataTypeSystem(); RelDataTypeFactory typeFactory = new SqlTypeFactoryImpl(typeSystem); DataType dataType = DataType.getType("decimal(40, 10)"); RelDataType relDataType = OLAPTable.createSqlType(typeFactory, dataType, true); Assert.assertTrue(relDataType instanceof BasicSqlType); Assert.assertEquals(relDataType.getSqlTypeName(), SqlTypeName.DECIMAL); Assert.assertTrue(typeSystem.getMaxNumericPrecision() < 40); Assert.assertEquals(relDataType.getPrecision(), typeSystem.getMaxNumericPrecision()); Assert.assertEquals(relDataType.getScale(), 10); Assert.assertTrue(relDataType.getScale() <= typeSystem.getMaxNumericScale()); } }
private static int getPrecision(RelDataType type) { return type.getPrecision() == RelDataType.PRECISION_NOT_SPECIFIED ? 0 : type.getPrecision(); }
/** Returns whether one type is just a widening of another. * * <p>For example:<ul> * <li>{@code VARCHAR(10)} is a widening of {@code VARCHAR(5)}. * <li>{@code VARCHAR(10)} is a widening of {@code VARCHAR(10) NOT NULL}. * </ul> */ private boolean isWidening(RelDataType type, RelDataType type1) { return type.getSqlTypeName() == type1.getSqlTypeName() && type.getPrecision() >= type1.getPrecision(); }
/** Returns whether one type is just a widening of another. * * <p>For example:<ul> * <li>{@code VARCHAR(10)} is a widening of {@code VARCHAR(5)}. * <li>{@code VARCHAR(10)} is a widening of {@code VARCHAR(10) NOT NULL}. * </ul> */ private boolean isWidening(RelDataType type, RelDataType type1) { return type.getSqlTypeName() == type1.getSqlTypeName() && type.getPrecision() >= type1.getPrecision(); }
static int getReturnTypePrecision(SqlRexContext cx, SqlCall call) { return cx.getRexBuilder() .deriveReturnType(call.getOperator(), call.getOperandList() .stream() .map(cx::convertExpression) .collect(Collectors.toList())) .getPrecision(); } }
@Override public SqlNode getCastSpec(RelDataType type) { switch (type.getSqlTypeName()) { case VARCHAR: // MySQL doesn't have a VARCHAR type, only CHAR. return new SqlDataTypeSpec(new SqlIdentifier("CHAR", SqlParserPos.ZERO), type.getPrecision(), -1, null, null, SqlParserPos.ZERO); case INTEGER: return new SqlDataTypeSpec(new SqlIdentifier("_UNSIGNED", SqlParserPos.ZERO), type.getPrecision(), -1, null, null, SqlParserPos.ZERO); } return super.getCastSpec(type); }