/** * Walks parent translator chain and verifies if the expression is nullable. * * @param node RexNode to check if it is nullable or not * @return null when nullability is not known, true or false otherwise */ protected Boolean isKnownNullable(RexNode node) { if (!exprNullableMap.isEmpty()) { Boolean nullable = exprNullableMap.get(node); if (nullable != null) { return nullable; } } return parent == null ? null : parent.isKnownNullable(node); }
/** * Walks parent translator chain and verifies if the expression is nullable. * * @param node RexNode to check if it is nullable or not * @return null when nullability is not known, true or false otherwise */ protected Boolean isKnownNullable(RexNode node) { if (!exprNullableMap.isEmpty()) { Boolean nullable = exprNullableMap.get(node); if (nullable != null) { return nullable; } } return parent == null ? null : parent.isKnownNullable(node); }
/** Returns whether an expression is nullable. Even if its type says it is * nullable, if we have previously generated a check to make sure that it is * not null, we will say so. * * <p>For example, {@code WHERE a == b} translates to * {@code a != null && b != null && a.equals(b)}. When translating the * 3rd part of the disjunction, we already know a and b are not null.</p> * * @param e Expression * @return Whether expression is nullable in the current translation context */ public boolean isNullable(RexNode e) { if (!e.getType().isNullable()) { return false; } final Boolean b = isKnownNullable(e); return b == null || b; }
/** Returns whether an expression is nullable. Even if its type says it is * nullable, if we have previously generated a check to make sure that it is * not null, we will say so. * * <p>For example, {@code WHERE a == b} translates to * {@code a != null && b != null && a.equals(b)}. When translating the * 3rd part of the disjunction, we already know a and b are not null.</p> * * @param e Expression * @return Whether expression is nullable in the current translation context */ public boolean isNullable(RexNode e) { if (!e.getType().isNullable()) { return false; } final Boolean b = isKnownNullable(e); return b == null || b; }