private List<RexNode> rewriteToDateChildren(List<RexNode> childRexNodeLst) { List<RexNode> newChildRexNodeLst = new ArrayList<RexNode>(); assert childRexNodeLst.size() == 1; RexNode child = childRexNodeLst.get(0); if (SqlTypeUtil.isDatetime(child.getType()) || SqlTypeUtil.isInterval(child.getType())) { newChildRexNodeLst.add(child); } else { newChildRexNodeLst.add(makeCast(SqlTypeName.TIMESTAMP, child)); } return newChildRexNodeLst; }
@Nullable @Override public String toDruidExpression(RexNode rexNode, RelDataType rowType, DruidQuery query ) { final RexCall call = (RexCall) rexNode; final String arg0 = DruidExpressions.toDruidExpression(call.getOperands().get(0), rowType, query); if (arg0 == null) { return null; } if (SqlTypeUtil.isDatetime((call.getOperands().get(0).getType()))) { // Timestamp is represented as long internally no need to any thing here return DruidExpressions.functionCall("div", ImmutableList.of(arg0, DruidExpressions.numberLiteral(1000))); } // dealing with String type final String format = call.getOperands().size() == 2 ? DruidExpressions .toDruidExpression(call.getOperands().get(1), rowType, query) : DEFAULT_TS_FORMAT; return DruidExpressions .functionCall("unix_timestamp", ImmutableList.of(arg0, DruidExpressions.stringLiteral(format))); } }
return null; if (SqlTypeUtil.isDatetime(call.getOperands().get(0).getType())) { final TimeZone tz = timezoneId(query, call.getOperands().get(0)); return applyTimestampFormat(
if (SqlTypeUtil.isDatetime(child.getType()) || SqlTypeUtil.isInterval(child.getType())) { newChildRexNodeLst.add(child); } else {
public boolean checkSingleOperandType(SqlCallBinding callBinding, SqlNode node, int iFormalOperand, boolean throwOnFailure) { assert 0 == iFormalOperand; RelDataType type = callBinding.getValidator().deriveType(callBinding.getScope(), node); boolean valid = false; if (type.isStruct() && type.getFieldList().size() == 2) { final RelDataType t0 = type.getFieldList().get(0).getType(); final RelDataType t1 = type.getFieldList().get(1).getType(); if (SqlTypeUtil.isDatetime(t0)) { if (SqlTypeUtil.isDatetime(t1)) { // t0 must be comparable with t1; (DATE, TIMESTAMP) is not valid if (SqlTypeUtil.sameNamedType(t0, t1)) { valid = true; } } else if (SqlTypeUtil.isInterval(t1)) { valid = true; } } } if (!valid && throwOnFailure) { throw callBinding.newValidationSignatureError(); } return valid; }
public boolean checkSingleOperandType(SqlCallBinding callBinding, SqlNode node, int iFormalOperand, boolean throwOnFailure) { assert 0 == iFormalOperand; RelDataType type = callBinding.getValidator().deriveType(callBinding.getScope(), node); boolean valid = false; if (type.isStruct() && type.getFieldList().size() == 2) { final RelDataType t0 = type.getFieldList().get(0).getType(); final RelDataType t1 = type.getFieldList().get(1).getType(); if (SqlTypeUtil.isDatetime(t0)) { if (SqlTypeUtil.isDatetime(t1)) { // t0 must be comparable with t1; (DATE, TIMESTAMP) is not valid if (SqlTypeUtil.sameNamedType(t0, t1)) { valid = true; } } else if (SqlTypeUtil.isInterval(t1)) { valid = true; } } } if (!valid && throwOnFailure) { throw callBinding.newValidationSignatureError(); } return valid; }
if (!SqlTypeUtil.isDatetime(t1)) { final RelDataType t00 = t0.getFieldList().get(0).getType(); final RelDataType t10 = t1.getFieldList().get(0).getType();
if (!SqlTypeUtil.isDatetime(t1)) { final RelDataType t00 = t0.getFieldList().get(0).getType(); final RelDataType t10 = t1.getFieldList().get(0).getType();
if (SqlTypeUtil.isDatetime(type1)) { resultType = type1; return createTypeWithNullability(resultType, if (SqlTypeUtil.isDatetime(type1)) { resultType = type1; return createTypeWithNullability(resultType, (IntervalSqlType) type1); } else if (SqlTypeUtil.isDatetime(type)) {
if (SqlTypeUtil.isDatetime(type1)) { resultType = type1; return createTypeWithNullability(resultType, if (SqlTypeUtil.isDatetime(type1)) { resultType = type1; return createTypeWithNullability(resultType, (IntervalSqlType) type1); } else if (SqlTypeUtil.isDatetime(type)) {