@Override
 public void meet(SqlOr node) throws RuntimeException {
   super.meet(node);
   SqlExpr left = node.getLeftArg();
   SqlExpr right = node.getRightArg();
   if (left instanceof TrueValue || right instanceof TrueValue) {
     replace(node, new TrueValue());
   } else if (left instanceof FalseValue && right instanceof FalseValue) {
     replace(node, new FalseValue());
   } else if (left instanceof FalseValue) {
     replace(node, right.clone());
   } else if (right instanceof FalseValue) {
     replace(node, left.clone());
   } else if (right instanceof SqlNull && andAllTheWay(node)) {
     replace(node, left.clone());
   } else if (left instanceof SqlNull && andAllTheWay(node)) {
     replace(node, right.clone());
   } else if (right instanceof SqlNull && left instanceof SqlNull) {
     replace(node, new SqlNull());
   } else if (left instanceof SqlNull && right instanceof SqlOr) {
     SqlOr r = (SqlOr) right;
     SqlExpr rleft = r.getLeftArg();
     SqlExpr rright = r.getRightArg();
     if (rleft instanceof SqlNull || rright instanceof SqlNull) {
       replace(node, right.clone());
     }
   } else if (right instanceof SqlNull && left instanceof SqlOr) {
     SqlOr l = (SqlOr) left;
     SqlExpr lleft = l.getLeftArg();
     SqlExpr lright = l.getRightArg();
     if (lleft instanceof SqlNull || lright instanceof SqlNull) {
       replace(node, left.clone());
     }
   } else if (right instanceof SqlNull && left instanceof SqlAnd) {
     // value IS NOT NULL AND value = ? OR NULL
     // -> value = ?
     SqlAnd l = (SqlAnd) left;
     SqlExpr lleft = l.getLeftArg();
     SqlExpr lright = l.getRightArg();
     SqlExpr isNotNull = arg(arg(lleft, SqlNot.class), SqlIsNull.class);
     SqlExpr isNotEq = other(lright, isNotNull, SqlEq.class);
     if (isNotEq instanceof SqlConstant) {
       replace(node, lright);
     }
   }
 }
 @Override
 public void meet(SqlAnd node) throws RuntimeException {
   super.meet(node);
   SqlExpr left = node.getLeftArg();
   SqlExpr right = node.getRightArg();
   if (left instanceof FalseValue || right instanceof FalseValue) {
     replace(node, new FalseValue());
   } else if (left instanceof TrueValue && right instanceof TrueValue) {
     replace(node, new TrueValue());
   } else if (left instanceof TrueValue) {
     replace(node, right.clone());
   } else if (right instanceof TrueValue) {
     replace(node, left.clone());
   } else if (right instanceof SqlNull || left instanceof SqlNull) {
     replace(node, new SqlNull());
   } else if (right instanceof SqlNot && ((SqlNot) right).getArg().equals(left)) {
     replace(node, new FalseValue());
   } else if (left instanceof SqlNot && ((SqlNot) left).getArg().equals(right)) {
     replace(node, new FalseValue());
   }
 }