@Override
    public RexNode visit(CallExpression call) {
        boolean isBatchMode = unwrapContext(relBuilder).isBatchMode();
        for (CallExpressionConvertRule rule : getFunctionConvertChain(isBatchMode)) {
            Optional<RexNode> converted = rule.convert(call, newFunctionContext());
            if (converted.isPresent()) {
                return converted.get();
            }
        }
        throw new RuntimeException("Unknown call expression: " + call);
    }
@Test
    void testTimestampWithLocalZoneLiteral() {
        RexNode rex =
                converter.visit(
                        valueLiteral(
                                Instant.ofEpochMilli(100),
                                DataTypes.TIMESTAMP_WITH_LOCAL_TIME_ZONE(3).notNull()));
        assertThat(((RexLiteral) rex).getValueAs(TimestampString.class))
                .isEqualTo(TimestampString.fromMillisSinceEpoch(100));
        assertThat(rex.getType().getSqlTypeName())
                .isEqualTo(SqlTypeName.TIMESTAMP_WITH_LOCAL_TIME_ZONE);
        assertThat(rex.getType().getPrecision()).isEqualTo(3);
    }