Description
The expression date '1998-12-01' - interval '108' day(3) parse to SqlNode its operator is SqlMonotonicBinaryOperator, when convert it to RelNode, its operator is SqlDatetimeSubtractionOperator. When I use RelToSqlConverter to convert the RelNode to SqlNode, its operator is also SqlDatetimeSubtractionOperator. Now, sqlNode.toSqlString(sqlDialect).getSql() has a IndexOutOfBoundsException. The source code as follows:
final SqlWriter.Frame frame = writer.startList("(", ")"); call.operand(0).unparse(writer, leftPrec, rightPrec); writer.sep("-"); call.operand(1).unparse(writer, leftPrec, rightPrec); writer.endList(frame); call.operand(2).unparse(writer, leftPrec, rightPrec);
SqlDatetimeSubtractionOperator must have three operands, now it only has two operands.
The following code convert SqlMonotonicBinaryOperator to SqlDatetimeSubtractionOperator,
registerOp(SqlStdOperatorTable.MINUS, new SqlRexConvertlet() { public RexNode convertCall(SqlRexContext cx, SqlCall call) { final RexCall e = (RexCall) StandardConvertletTable.this.convertCall(cx, call, call.getOperator()); switch (e.getOperands().get(0).getType().getSqlTypeName()) { case DATE: case TIME: case TIMESTAMP: return convertDatetimeMinus(cx, SqlStdOperatorTable.MINUS_DATE, call); default: return e; } } });
For date '1998-12-01' - interval '108' day(3), this converter is OK? It only has two operands.