|
27 | 27 | import org.apache.calcite.rel.core.RelFactories; |
28 | 28 | import org.apache.calcite.rel.hint.RelHint; |
29 | 29 | import org.apache.calcite.rel.type.RelDataType; |
| 30 | +import org.apache.calcite.rex.RexInputRef; |
30 | 31 | import org.apache.calcite.rex.RexNode; |
| 32 | +import org.apache.calcite.rex.RexShuttle; |
31 | 33 | import org.apache.calcite.rex.RexUtil; |
32 | 34 | import org.apache.calcite.sql.SqlKind; |
33 | 35 | import org.apache.calcite.tools.RelBuilderFactory; |
@@ -136,7 +138,25 @@ public RelNode createProject(RelNode input, List<RelHint> hints, List<? extends |
136 | 138 | private static class DrillFilterFactoryImpl implements RelFactories.FilterFactory { |
137 | 139 | @Override |
138 | 140 | public RelNode createFilter(RelNode child, RexNode condition, Set<CorrelationId> variablesSet) { |
139 | | - return DrillFilterRel.create(child, condition); |
| 141 | + // Normalize nullability of RexInputRef nodes to match the input's row type |
| 142 | + // This is necessary for Calcite 1.37+ which has stricter type checking |
| 143 | + RexNode normalizedCondition = condition.accept(new RexShuttle() { |
| 144 | + @Override |
| 145 | + public RexNode visitInputRef(RexInputRef inputRef) { |
| 146 | + int index = inputRef.getIndex(); |
| 147 | + if (index >= child.getRowType().getFieldCount()) { |
| 148 | + return inputRef; |
| 149 | + } |
| 150 | + RelDataType actualType = child.getRowType().getFieldList().get(index).getType(); |
| 151 | + // If nullability differs, create a new RexInputRef with correct nullability |
| 152 | + if (inputRef.getType().isNullable() != actualType.isNullable() || |
| 153 | + !inputRef.getType().equals(actualType)) { |
| 154 | + return new RexInputRef(index, actualType); |
| 155 | + } |
| 156 | + return inputRef; |
| 157 | + } |
| 158 | + }); |
| 159 | + return DrillFilterRel.create(child, normalizedCondition); |
140 | 160 | } |
141 | 161 | } |
142 | 162 |
|
|
0 commit comments