Search in sources :

Example 1 with DoubleType

use of io.prestosql.spi.type.DoubleType in project hetu-core by openlookeng.

the class MySqlRowExpressionConverter method visitCall.

@Override
public String visitCall(CallExpression call, JdbcConverterContext context) {
    // remote udf verify
    FunctionHandle functionHandle = call.getFunctionHandle();
    if (!isDefaultFunction(call)) {
        Optional<String> result = mySqlApplyRemoteFunctionPushDown.rewriteRemoteFunction(call, this, context);
        if (result.isPresent()) {
            return result.get();
        }
        throw new PrestoException(NOT_SUPPORTED, String.format("MySql connector does not support remote function: %s.%s", call.getDisplayName(), call.getFunctionHandle().getFunctionNamespace()));
    }
    if (standardFunctionResolution.isArrayConstructor(functionHandle)) {
        throw new PrestoException(NOT_SUPPORTED, "MySql connector does not support array constructor");
    }
    if (standardFunctionResolution.isSubscriptFunction(functionHandle)) {
        throw new PrestoException(NOT_SUPPORTED, "MySql connector does not support subscript expression");
    }
    if (standardFunctionResolution.isCastFunction(functionHandle)) {
        // deal with literal, when generic literal expression translate to rowExpression, it will be
        // translated to a 'CAST' rowExpression with a varchar type 'CONSTANT' rowExpression, in some
        // case, 'CAST' is superfluous
        RowExpression argument = call.getArguments().get(0);
        Type type = call.getType();
        if (argument instanceof ConstantExpression && argument.getType().equals(VARCHAR)) {
            String value = argument.accept(this, context);
            if (type instanceof VarcharType || type instanceof CharType || type instanceof VarbinaryType || type instanceof DecimalType || type instanceof RealType || type instanceof DoubleType) {
                return value;
            }
        }
        if (call.getType().getDisplayName().equals(LIKE_PATTERN_NAME)) {
            return call.getArguments().get(0).accept(this, context);
        }
        return getCastExpression(call.getArguments().get(0).accept(this, context), call.getType());
    }
    return super.visitCall(call, context);
}
Also used : VarcharType(io.prestosql.spi.type.VarcharType) ConstantExpression(io.prestosql.spi.relation.ConstantExpression) RowExpression(io.prestosql.spi.relation.RowExpression) PrestoException(io.prestosql.spi.PrestoException) RealType(io.prestosql.spi.type.RealType) CharType(io.prestosql.spi.type.CharType) DecimalType(io.prestosql.spi.type.DecimalType) DoubleType(io.prestosql.spi.type.DoubleType) Type(io.prestosql.spi.type.Type) RealType(io.prestosql.spi.type.RealType) VarbinaryType(io.prestosql.spi.type.VarbinaryType) VarcharType(io.prestosql.spi.type.VarcharType) VarbinaryType(io.prestosql.spi.type.VarbinaryType) DoubleType(io.prestosql.spi.type.DoubleType) DecimalType(io.prestosql.spi.type.DecimalType) CharType(io.prestosql.spi.type.CharType) FunctionHandle(io.prestosql.spi.function.FunctionHandle)

Example 2 with DoubleType

use of io.prestosql.spi.type.DoubleType in project hetu-core by openlookeng.

the class TypeUtils method getActualValue.

public static Object getActualValue(Type type, Object value) {
    if (type instanceof BigintType || type instanceof TinyintType || type instanceof SmallintType || type instanceof IntegerType) {
        return value;
    } else if (type instanceof BooleanType) {
        return value;
    } else if (type instanceof DoubleType) {
        return value;
    } else if (type instanceof DateType) {
        // keep the `long` representation of date
        return value;
    } else if (type instanceof RealType) {
        Long number = (Long) value;
        return intBitsToFloat(number.intValue());
    } else if (type instanceof VarcharType || type instanceof CharType) {
        if (value instanceof Slice) {
            return ((Slice) value).toStringUtf8();
        }
        return value;
    } else if (type instanceof DecimalType) {
        DecimalType decimalType = (DecimalType) type;
        if (decimalType.isShort()) {
            checkState(value instanceof Long);
            return new BigDecimal(BigInteger.valueOf((Long) value), decimalType.getScale(), new MathContext(decimalType.getPrecision()));
        }
        Slice slice;
        if (value instanceof String) {
            slice = Slices.utf8Slice((String) value);
        } else {
            checkState(value instanceof Slice);
            slice = (Slice) value;
        }
        return new BigDecimal(decodeUnscaledValue(slice), decimalType.getScale(), new MathContext(decimalType.getPrecision()));
    } else if (type instanceof TimestampType) {
        Long time = (Long) value;
        return new Timestamp(time);
    }
    throw new UnsupportedOperationException("Not Implemented Exception: " + value + "->" + type);
}
Also used : VarcharType(io.prestosql.spi.type.VarcharType) TinyintType(io.prestosql.spi.type.TinyintType) BooleanType(io.prestosql.spi.type.BooleanType) RealType(io.prestosql.spi.type.RealType) Timestamp(java.sql.Timestamp) BigintType(io.prestosql.spi.type.BigintType) BigDecimal(java.math.BigDecimal) MathContext(java.math.MathContext) IntegerType(io.prestosql.spi.type.IntegerType) DoubleType(io.prestosql.spi.type.DoubleType) Slice(io.airlift.slice.Slice) DecimalType(io.prestosql.spi.type.DecimalType) TimestampType(io.prestosql.spi.type.TimestampType) SmallintType(io.prestosql.spi.type.SmallintType) CharType(io.prestosql.spi.type.CharType) DateType(io.prestosql.spi.type.DateType)

Example 3 with DoubleType

use of io.prestosql.spi.type.DoubleType in project hetu-core by openlookeng.

the class LiteralInterpreter method evaluate.

public static Object evaluate(ConstantExpression node) {
    Type type = node.getType();
    if (node.getValue() == null) {
        return null;
    }
    if (type instanceof BooleanType) {
        return node.getValue();
    }
    if (type instanceof BigintType || type instanceof TinyintType || type instanceof SmallintType || type instanceof IntegerType) {
        return node.getValue();
    }
    if (type instanceof DoubleType) {
        return node.getValue();
    }
    if (type instanceof RealType) {
        Long number = (Long) node.getValue();
        return intBitsToFloat(number.intValue());
    }
    if (type instanceof DecimalType) {
        DecimalType decimalType = (DecimalType) type;
        if (decimalType.isShort()) {
            checkState(node.getValue() instanceof Long);
            return decodeDecimal(BigInteger.valueOf((long) node.getValue()), decimalType);
        }
        checkState(node.getValue() instanceof Slice);
        Slice value = (Slice) node.getValue();
        return decodeDecimal(decodeUnscaledValue(value), decimalType);
    }
    if (type instanceof VarcharType || type instanceof CharType) {
        return (node.getValue() instanceof String) ? node.getValue() : ((Slice) node.getValue()).toStringUtf8();
    }
    if (type instanceof VarbinaryType) {
        return new SqlVarbinary(((Slice) node.getValue()).getBytes());
    }
    if (type instanceof DateType) {
        return new SqlDate(((Long) node.getValue()).intValue());
    }
    if (type instanceof TimeType) {
        return new SqlTime((long) node.getValue());
    }
    if (type instanceof TimestampType) {
        try {
            return new SqlTimestamp((long) node.getValue());
        } catch (RuntimeException e) {
            throw new PrestoException(GENERIC_USER_ERROR, format("'%s' is not a valid timestamp literal", (String) node.getValue()));
        }
    }
    if (type instanceof IntervalDayTimeType) {
        return new SqlIntervalDayTime((long) node.getValue());
    }
    if (type instanceof IntervalYearMonthType) {
        return new SqlIntervalYearMonth(((Long) node.getValue()).intValue());
    }
    if (type.getJavaType().equals(Slice.class)) {
        // DO NOT ever remove toBase64. Calling toString directly on Slice whose base is not byte[] will cause JVM to crash.
        return "'" + VarbinaryFunctions.toBase64((Slice) node.getValue()).toStringUtf8() + "'";
    }
    // We should not fail at the moment; just return the raw value (block, regex, etc) to the user
    return node.getValue();
}
Also used : IntervalYearMonthType(io.prestosql.type.IntervalYearMonthType) VarcharType(io.prestosql.spi.type.VarcharType) TinyintType(io.prestosql.spi.type.TinyintType) SqlVarbinary(io.prestosql.spi.type.SqlVarbinary) SqlTime(io.prestosql.spi.type.SqlTime) SqlIntervalYearMonth(io.prestosql.type.SqlIntervalYearMonth) SqlTimestamp(io.prestosql.spi.type.SqlTimestamp) PrestoException(io.prestosql.spi.PrestoException) RealType(io.prestosql.spi.type.RealType) IntervalDayTimeType(io.prestosql.type.IntervalDayTimeType) TimeType(io.prestosql.spi.type.TimeType) VarbinaryType(io.prestosql.spi.type.VarbinaryType) TimestampType(io.prestosql.spi.type.TimestampType) SmallintType(io.prestosql.spi.type.SmallintType) DateType(io.prestosql.spi.type.DateType) BooleanType(io.prestosql.spi.type.BooleanType) BigintType(io.prestosql.spi.type.BigintType) IntegerType(io.prestosql.spi.type.IntegerType) DecimalType(io.prestosql.spi.type.DecimalType) IntervalDayTimeType(io.prestosql.type.IntervalDayTimeType) Type(io.prestosql.spi.type.Type) RealType(io.prestosql.spi.type.RealType) VarbinaryType(io.prestosql.spi.type.VarbinaryType) TimestampType(io.prestosql.spi.type.TimestampType) IntervalYearMonthType(io.prestosql.type.IntervalYearMonthType) BigintType(io.prestosql.spi.type.BigintType) CharType(io.prestosql.spi.type.CharType) DoubleType(io.prestosql.spi.type.DoubleType) SmallintType(io.prestosql.spi.type.SmallintType) IntegerType(io.prestosql.spi.type.IntegerType) TimeType(io.prestosql.spi.type.TimeType) TinyintType(io.prestosql.spi.type.TinyintType) DateType(io.prestosql.spi.type.DateType) BooleanType(io.prestosql.spi.type.BooleanType) VarcharType(io.prestosql.spi.type.VarcharType) DoubleType(io.prestosql.spi.type.DoubleType) Slices.utf8Slice(io.airlift.slice.Slices.utf8Slice) Slice(io.airlift.slice.Slice) SqlDate(io.prestosql.spi.type.SqlDate) SqlIntervalDayTime(io.prestosql.type.SqlIntervalDayTime) IntervalDayTimeType(io.prestosql.type.IntervalDayTimeType) DecimalType(io.prestosql.spi.type.DecimalType) CharType(io.prestosql.spi.type.CharType)

Example 4 with DoubleType

use of io.prestosql.spi.type.DoubleType in project hetu-core by openlookeng.

the class BaseJdbcRowExpressionConverter method visitConstant.

@Override
public String visitConstant(ConstantExpression literal, JdbcConverterContext context) {
    Type type = literal.getType();
    if (literal.getValue() == null) {
        return "null";
    }
    if (type instanceof BooleanType) {
        return String.valueOf(((Boolean) literal.getValue()).booleanValue());
    }
    if (type instanceof BigintType || type instanceof TinyintType || type instanceof SmallintType || type instanceof IntegerType) {
        Number number = (Number) literal.getValue();
        return format("%d", number.longValue());
    }
    if (type instanceof DoubleType) {
        return literal.getValue().toString();
    }
    if (type instanceof RealType) {
        Long number = (Long) literal.getValue();
        return format("%f", intBitsToFloat(number.intValue()));
    }
    if (type instanceof DecimalType) {
        DecimalType decimalType = (DecimalType) type;
        if (decimalType.isShort()) {
            checkState(literal.getValue() instanceof Long);
            return decodeDecimal(BigInteger.valueOf((long) literal.getValue()), decimalType).toString();
        }
        checkState(literal.getValue() instanceof Slice);
        Slice value = (Slice) literal.getValue();
        return decodeDecimal(decodeUnscaledValue(value), decimalType).toString();
    }
    if (type instanceof VarcharType || type instanceof CharType) {
        return "'" + ((Slice) literal.getValue()).toStringUtf8() + "'";
    }
    if (type.equals(DATE)) {
        String date = printDate(Integer.parseInt(String.valueOf(literal.getValue())));
        return StandardTypes.DATE + " " + ExpressionFormatter.formatStringLiteral(date);
    }
    if (type instanceof TimestampType) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
        Long time = (Long) literal.getValue();
        return format("TIMESTAMP '%s'", formatter.format(Instant.ofEpochMilli(time).atZone(UTC).toLocalDateTime()));
    }
    throw new PrestoException(NOT_SUPPORTED, String.format("Cannot handle the constant expression %s with value of type %s", literal.getValue(), type));
}
Also used : VarcharType(io.prestosql.spi.type.VarcharType) TinyintType(io.prestosql.spi.type.TinyintType) BooleanType(io.prestosql.spi.type.BooleanType) PrestoException(io.prestosql.spi.PrestoException) RealType(io.prestosql.spi.type.RealType) BigintType(io.prestosql.spi.type.BigintType) IntegerType(io.prestosql.spi.type.IntegerType) DecimalType(io.prestosql.spi.type.DecimalType) OperatorType(io.prestosql.spi.function.OperatorType) Type(io.prestosql.spi.type.Type) RealType(io.prestosql.spi.type.RealType) TimestampType(io.prestosql.spi.type.TimestampType) BigintType(io.prestosql.spi.type.BigintType) CharType(io.prestosql.spi.type.CharType) DoubleType(io.prestosql.spi.type.DoubleType) SmallintType(io.prestosql.spi.type.SmallintType) IntegerType(io.prestosql.spi.type.IntegerType) TinyintType(io.prestosql.spi.type.TinyintType) BooleanType(io.prestosql.spi.type.BooleanType) VarcharType(io.prestosql.spi.type.VarcharType) DoubleType(io.prestosql.spi.type.DoubleType) Slice(io.airlift.slice.Slice) DecimalType(io.prestosql.spi.type.DecimalType) TimestampType(io.prestosql.spi.type.TimestampType) SmallintType(io.prestosql.spi.type.SmallintType) CharType(io.prestosql.spi.type.CharType) DateTimeFormatter(java.time.format.DateTimeFormatter)

Example 5 with DoubleType

use of io.prestosql.spi.type.DoubleType in project hetu-core by openlookeng.

the class OracleRowExpressionConverter method visitCall.

@Override
public String visitCall(CallExpression call, JdbcConverterContext context) {
    FunctionHandle functionHandle = call.getFunctionHandle();
    String functionName = functionMetadataManager.getFunctionMetadata(functionHandle).getName().getObjectName();
    if (timeExtractFields.contains(functionName)) {
        if (call.getArguments().size() == 1) {
            try {
                Time.ExtractField field = Time.ExtractField.valueOf(functionName.toUpperCase(ENGLISH));
                return format("EXTRACT(%s FROM %s)", field, call.getArguments().get(0).accept(this, context));
            } catch (IllegalArgumentException e) {
                throw new PrestoException(INVALID_FUNCTION_ARGUMENT, "Illegal argument: " + e);
            }
        } else {
            throw new PrestoException(INVALID_FUNCTION_ARGUMENT, "Illegal argument num of function " + functionName);
        }
    }
    if (functionName.equals(AT_TIMEZONE_FUNCTION_NAME)) {
        if (call.getArguments().size() == 2) {
            return format("%s AT TIME ZONE %s", call.getArguments().get(0).accept(this, context), call.getArguments().get(1).accept(this, context));
        } else {
            throw new PrestoException(INVALID_FUNCTION_ARGUMENT, "Illegal argument num of function " + functionName);
        }
    }
    if (standardFunctionResolution.isArrayConstructor(functionHandle)) {
        throw new PrestoException(NOT_SUPPORTED, "Oracle connector does not support array constructor");
    }
    if (standardFunctionResolution.isSubscriptFunction(functionHandle)) {
        throw new PrestoException(NOT_SUPPORTED, "Oracle connector does not support subscript expression");
    }
    if (standardFunctionResolution.isCastFunction(functionHandle)) {
        // deal with literal, when generic literal expression translate to rowExpression, it will be
        // translated to a 'CAST' rowExpression with a varchar type 'CONSTANT' rowExpression, in some
        // case, 'CAST' is superfluous
        RowExpression argument = call.getArguments().get(0);
        Type type = call.getType();
        if (argument instanceof ConstantExpression && argument.getType() instanceof VarcharType) {
            String value = argument.accept(this, context);
            if (type instanceof DateType) {
                return format("date %s", value);
            }
            if (type instanceof VarcharType || type instanceof CharType || type instanceof VarbinaryType || type instanceof DecimalType || type instanceof RealType || type instanceof DoubleType) {
                return value;
            }
        }
        if (call.getType().getDisplayName().equals(LIKE_PATTERN_NAME)) {
            return call.getArguments().get(0).accept(this, context);
        }
        return getCastExpression(call.getArguments().get(0).accept(this, context), call.getType());
    }
    return super.visitCall(call, context);
}
Also used : VarcharType(io.prestosql.spi.type.VarcharType) ConstantExpression(io.prestosql.spi.relation.ConstantExpression) RowExpression(io.prestosql.spi.relation.RowExpression) Time(io.prestosql.spi.sql.expression.Time) PrestoException(io.prestosql.spi.PrestoException) RealType(io.prestosql.spi.type.RealType) CharType(io.prestosql.spi.type.CharType) DecimalType(io.prestosql.spi.type.DecimalType) DoubleType(io.prestosql.spi.type.DoubleType) Type(io.prestosql.spi.type.Type) RealType(io.prestosql.spi.type.RealType) VarbinaryType(io.prestosql.spi.type.VarbinaryType) DateType(io.prestosql.spi.type.DateType) VarcharType(io.prestosql.spi.type.VarcharType) VarbinaryType(io.prestosql.spi.type.VarbinaryType) DoubleType(io.prestosql.spi.type.DoubleType) DecimalType(io.prestosql.spi.type.DecimalType) CharType(io.prestosql.spi.type.CharType) FunctionHandle(io.prestosql.spi.function.FunctionHandle) DateType(io.prestosql.spi.type.DateType)

Aggregations

DoubleType (io.prestosql.spi.type.DoubleType)9 VarcharType (io.prestosql.spi.type.VarcharType)9 RealType (io.prestosql.spi.type.RealType)8 Type (io.prestosql.spi.type.Type)8 BigintType (io.prestosql.spi.type.BigintType)7 CharType (io.prestosql.spi.type.CharType)7 DecimalType (io.prestosql.spi.type.DecimalType)7 IntegerType (io.prestosql.spi.type.IntegerType)7 PrestoException (io.prestosql.spi.PrestoException)6 BooleanType (io.prestosql.spi.type.BooleanType)6 DateType (io.prestosql.spi.type.DateType)6 SmallintType (io.prestosql.spi.type.SmallintType)6 TimestampType (io.prestosql.spi.type.TimestampType)6 TinyintType (io.prestosql.spi.type.TinyintType)5 VarbinaryType (io.prestosql.spi.type.VarbinaryType)5 Slice (io.airlift.slice.Slice)4 TimeType (io.prestosql.spi.type.TimeType)3 FunctionHandle (io.prestosql.spi.function.FunctionHandle)2 ConstantExpression (io.prestosql.spi.relation.ConstantExpression)2 RowExpression (io.prestosql.spi.relation.RowExpression)2