private CalciteContextException fieldExceedsPrecisionException( SqlParserPos pos, int sign, BigDecimal value, TimeUnit type, int precision) { if (sign == -1) { value = value.negate(); } return SqlUtil.newContextException(pos, RESOURCE.intervalFieldExceedsPrecision( value, type.name() + "(" + precision + ")")); } }
private boolean isSecondaryFieldInRange(BigDecimal field, TimeUnit unit) { // we should never get handed a negative field value assert field.compareTo(ZERO) >= 0; // YEAR and DAY can never be secondary units, // nor can unit be null. assert unit != null; switch (unit) { case YEAR: case DAY: default: throw Util.unexpected(unit); // Secondary field limits, as per section 4.6.3 of SQL2003 spec case MONTH: case HOUR: case MINUTE: case SECOND: return unit.isValidValue(field); } }
private LogicalExpression handleDateTruncFunction(final List<LogicalExpression> args) { // Assert that the first argument to extract is a QuotedString assert args.get(0) instanceof ValueExpressions.QuotedString; // Get the unit of time to be extracted String timeUnitStr = ((ValueExpressions.QuotedString) args.get(0)).value.toUpperCase(); TimeUnit timeUnit = TimeUnit.valueOf(timeUnitStr); switch (timeUnit) { case YEAR: case MONTH: case DAY: case HOUR: case MINUTE: case SECOND: case WEEK: case QUARTER: case DECADE: case CENTURY: case MILLENNIUM: final String functionPostfix = StringUtils.capitalize(timeUnitStr.toLowerCase()); return FunctionCallFactory.createExpression("date_trunc_" + functionPostfix, args.subList(1, 2)); } throw new UnsupportedOperationException("date_trunc function supports the following time units: " + "YEAR, MONTH, DAY, HOUR, MINUTE, SECOND, WEEK, QUARTER, DECADE, CENTURY, MILLENNIUM"); }
/** * For Extract and date_part functions, infer the return types based on timeUnit */ public static SqlTypeName getSqlTypeNameForTimeUnit(String timeUnitStr) { TimeUnit timeUnit = TimeUnit.valueOf(timeUnitStr); switch (timeUnit) { case YEAR: case MONTH: case DAY: case HOUR: case MINUTE: return SqlTypeName.BIGINT; case SECOND: return SqlTypeName.DOUBLE; default: throw UserException .functionError() .message("extract function supports the following time units: YEAR, MONTH, DAY, HOUR, MINUTE, SECOND") .build(logger); } }
private CalciteContextException fieldExceedsPrecisionException( SqlParserPos pos, int sign, BigDecimal value, TimeUnit type, int precision) { if (sign == -1) { value = value.negate(); } return SqlUtil.newContextException(pos, RESOURCE.intervalFieldExceedsPrecision( value, type.name() + "(" + precision + ")")); } }
private boolean isSecondaryFieldInRange(BigDecimal field, TimeUnit unit) { // we should never get handed a negative field value assert field.compareTo(ZERO) >= 0; // YEAR and DAY can never be secondary units, // nor can unit be null. assert unit != null; switch (unit) { case YEAR: case DAY: default: throw Util.unexpected(unit); // Secondary field limits, as per section 4.6.3 of SQL2003 spec case MONTH: case HOUR: case MINUTE: case SECOND: return unit.isValidValue(field); } }
@Override public void unparseSqlIntervalQualifier(SqlWriter writer, SqlIntervalQualifier qualifier, RelDataTypeSystem typeSystem) { switch (qualifier.timeUnitRange) { case YEAR: case QUARTER: case MONTH: case WEEK: case DAY: case HOUR: case MINUTE: case SECOND: case MILLISECOND: case MICROSECOND: final String timeUnit = qualifier.timeUnitRange.startUnit.name(); writer.keyword(timeUnit); break; default: throw new AssertionError("Unsupported type: " + qualifier.timeUnitRange); } if (null != qualifier.timeUnitRange.endUnit) { throw new AssertionError("End unit is not supported now: " + qualifier.timeUnitRange.endUnit); } }
/** Returns a list of the time units covered by an interval type such * as HOUR TO SECOND. Adds MILLISECOND if the end is SECOND, to deal with * fractional seconds. */ private static List<TimeUnit> getTimeUnits(SqlTypeName typeName) { final TimeUnit start = typeName.getStartUnit(); final TimeUnit end = typeName.getEndUnit(); final ImmutableList<TimeUnit> list = TIME_UNITS.subList(start.ordinal(), end.ordinal() + 1); if (end == TimeUnit.SECOND) { return CompositeList.of(list, ImmutableList.of(TimeUnit.MILLISECOND)); } return list; }
@Override public void unparseSqlIntervalQualifier(SqlWriter writer, SqlIntervalQualifier qualifier, RelDataTypeSystem typeSystem) { switch (qualifier.timeUnitRange) { case YEAR: case QUARTER: case MONTH: case WEEK: case DAY: case HOUR: case MINUTE: case SECOND: case MILLISECOND: case MICROSECOND: final String timeUnit = qualifier.timeUnitRange.startUnit.name(); writer.keyword(timeUnit); break; default: throw new AssertionError("Unsupported type: " + qualifier.timeUnitRange); } if (null != qualifier.timeUnitRange.endUnit) { throw new AssertionError("End unit is not supported now: " + qualifier.timeUnitRange.endUnit); } }
/** Returns a list of the time units covered by an interval type such * as HOUR TO SECOND. Adds MILLISECOND if the end is SECOND, to deal with * fractional seconds. */ private static List<TimeUnit> getTimeUnits(SqlTypeName typeName) { final TimeUnit start = typeName.getStartUnit(); final TimeUnit end = typeName.getEndUnit(); final ImmutableList<TimeUnit> list = TIME_UNITS.subList(start.ordinal(), end.ordinal() + 1); if (end == TimeUnit.SECOND) { return CompositeList.of(list, ImmutableList.of(TimeUnit.MILLISECOND)); } return list; }
@Override public void unparseSqlIntervalQualifier(SqlWriter writer, SqlIntervalQualifier qualifier, RelDataTypeSystem typeSystem) { // DB2 supported qualifiers. Singular form of these keywords are also acceptable. // YEAR/YEARS // MONTH/MONTHS // DAY/DAYS // HOUR/HOURS // MINUTE/MINUTES // SECOND/SECONDS switch (qualifier.timeUnitRange) { case YEAR: case MONTH: case DAY: case HOUR: case MINUTE: case SECOND: case MICROSECOND: final String timeUnit = qualifier.timeUnitRange.startUnit.name(); writer.keyword(timeUnit); break; default: throw new AssertionError("Unsupported type: " + qualifier.timeUnitRange); } if (null != qualifier.timeUnitRange.endUnit) { throw new AssertionError("Unsupported end unit: " + qualifier.timeUnitRange.endUnit); } }
that.intervalQualifier); if (thisStart.ordinal() > thatStart.ordinal()) { thisEnd = thisStart; thisStart = thatStart; secondPrec = that.intervalQualifier.getStartPrecisionPreservingDefault(); } else if (thisStart.ordinal() == thatStart.ordinal()) { secondPrec = SqlIntervalQualifier.combineStartPrecisionPreservingDefault( this.intervalQualifier, that.intervalQualifier); } else if (null == thisEnd || thisEnd.ordinal() < thatStart.ordinal()) { thisEnd = thatStart; if (null == thisEnd || thisEnd.ordinal() < thatEnd.ordinal()) { thisEnd = thatEnd;
@Override public void unparseSqlIntervalQualifier(SqlWriter writer, SqlIntervalQualifier qualifier, RelDataTypeSystem typeSystem) { // DB2 supported qualifiers. Singular form of these keywords are also acceptable. // YEAR/YEARS // MONTH/MONTHS // DAY/DAYS // HOUR/HOURS // MINUTE/MINUTES // SECOND/SECONDS switch (qualifier.timeUnitRange) { case YEAR: case MONTH: case DAY: case HOUR: case MINUTE: case SECOND: case MICROSECOND: final String timeUnit = qualifier.timeUnitRange.startUnit.name(); writer.keyword(timeUnit); break; default: throw new AssertionError("Unsupported type: " + qualifier.timeUnitRange); } if (null != qualifier.timeUnitRange.endUnit) { throw new AssertionError("Unsupported end unit: " + qualifier.timeUnitRange.endUnit); } }
TimeUnit.YEAR.ordinal()); assertEquals( 1, TimeUnit.MONTH.ordinal()); assertEquals( 2, TimeUnit.DAY.ordinal()); assertEquals( 3, TimeUnit.HOUR.ordinal()); assertEquals( 4, TimeUnit.MINUTE.ordinal()); assertEquals( 5, TimeUnit.SECOND.ordinal()); boolean b = (TimeUnit.YEAR.ordinal() < TimeUnit.MONTH.ordinal()) && (TimeUnit.MONTH.ordinal() < TimeUnit.DAY.ordinal()) && (TimeUnit.DAY.ordinal() < TimeUnit.HOUR.ordinal()) && (TimeUnit.HOUR.ordinal() < TimeUnit.MINUTE.ordinal()) && (TimeUnit.MINUTE.ordinal() < TimeUnit.SECOND.ordinal()); assertTrue(b);
TimeUnit.YEAR.ordinal()); assertEquals( 1, TimeUnit.MONTH.ordinal()); assertEquals( 2, TimeUnit.DAY.ordinal()); assertEquals( 3, TimeUnit.HOUR.ordinal()); assertEquals( 4, TimeUnit.MINUTE.ordinal()); assertEquals( 5, TimeUnit.SECOND.ordinal()); boolean b = (TimeUnit.YEAR.ordinal() < TimeUnit.MONTH.ordinal()) && (TimeUnit.MONTH.ordinal() < TimeUnit.DAY.ordinal()) && (TimeUnit.DAY.ordinal() < TimeUnit.HOUR.ordinal()) && (TimeUnit.HOUR.ordinal() < TimeUnit.MINUTE.ordinal()) && (TimeUnit.MINUTE.ordinal() < TimeUnit.SECOND.ordinal()); assertTrue(b);