/** @return true if all tuples match rowType; otherwise, assert on mismatch */ private boolean assertRowType() { for (List<RexLiteral> tuple : tuples) { assert tuple.size() == rowType.getFieldCount(); for (Pair<RexLiteral, RelDataTypeField> pair : Pair.zip(tuple, rowType.getFieldList())) { RexLiteral literal = pair.left; RelDataType fieldType = pair.right.getType(); // TODO jvs 19-Feb-2006: strengthen this a bit. For example, // overflow, rounding, and padding/truncation must already have // been dealt with. if (!RexLiteral.isNullLiteral(literal)) { assert (SqlTypeUtil.canAssignFrom(fieldType, literal.getType())); } } } return true; }
/** * Returns whether a node represents the NULL value. * * <p>Examples: * * <ul> * <li>For {@link org.eigenbase.rex.RexLiteral} Unknown, returns false. * <li>For <code>CAST(NULL AS <i>type</i>)</code>, returns true if <code> * allowCast</code> is true, false otherwise. * <li>For <code>CAST(CAST(NULL AS <i>type</i>) AS <i>type</i>))</code>, returns false. * </ul> */ public static boolean isNullLiteral(RexNode node, boolean allowCast) { if (node instanceof RexLiteral) { RexLiteral literal = (RexLiteral) node; if (literal.getTypeName() == SqlTypeName.NULL) { assert (null == literal.getValue()); return true; } else { // We don't regard UNKNOWN -- SqlLiteral(null,Boolean) -- as // NULL. return false; } } if (allowCast) { if (node.isA(RexKind.Cast)) { RexCall call = (RexCall) node; if (isNullLiteral(call.operands[0], false)) { // node is "CAST(NULL as type)" return true; } } } return false; }
/** * Returns whether a node represents the NULL value or a series of nested CAST(NULL as <TYPE>) * calls<br> * For Example:<br> * isNull(CAST(CAST(NULL as INTEGER) AS VARCHAR(1))) returns true */ public static boolean isNull(RexNode node) { /* Checks to see if the RexNode is null */ return RexLiteral.isNullLiteral(node) || ((node.getKind() == RexKind.Cast) && isNull(((RexCall) node).operands[0])); }