public static SQLBinaryOpExpr merge(ParameterizedVisitor v, SQLBinaryOpExpr x) {
    SQLExpr left = x.getLeft();
    SQLExpr right = x.getRight();
    SQLObject parent = x.getParent();

    if (left instanceof SQLLiteralExpr && right instanceof SQLLiteralExpr) {
      if (x.getOperator() == SQLBinaryOperator.Equality //
          || x.getOperator() == SQLBinaryOperator.NotEqual) {
        if ((left instanceof SQLIntegerExpr) && (right instanceof SQLIntegerExpr)) {
          if (((SQLIntegerExpr) left).getNumber().intValue() < 100) {
            left.putAttribute(ATTR_PARAMS_SKIP, true);
          }
          if (((SQLIntegerExpr) right).getNumber().intValue() < 100) {
            right.putAttribute(ATTR_PARAMS_SKIP, true);
          }
        } else {
          left.putAttribute(ATTR_PARAMS_SKIP, true);
          right.putAttribute(ATTR_PARAMS_SKIP, true);
        }
      }
      return x;
    }

    for (; ; ) {
      if (x.getRight() instanceof SQLBinaryOpExpr) {
        if (x.getLeft() instanceof SQLBinaryOpExpr) {
          SQLBinaryOpExpr leftBinaryExpr = (SQLBinaryOpExpr) x.getLeft();
          if (leftBinaryExpr.getRight().equals(x.getRight())) {
            x = leftBinaryExpr;
            v.incrementReplaceCunt();
            continue;
          }
        }
        SQLExpr mergedRight = merge(v, (SQLBinaryOpExpr) x.getRight());
        if (mergedRight != x.getRight()) {
          x = new SQLBinaryOpExpr(x.getLeft(), x.getOperator(), mergedRight);
          v.incrementReplaceCunt();
        }
        x.setParent(parent);
      }

      break;
    }

    if (x.getLeft() instanceof SQLBinaryOpExpr) {
      SQLExpr mergedLeft = merge(v, (SQLBinaryOpExpr) x.getLeft());
      if (mergedLeft != x.getLeft()) {
        x = new SQLBinaryOpExpr(mergedLeft, x.getOperator(), x.getRight());
        v.incrementReplaceCunt();
      }
      x.setParent(parent);
    }

    // ID = ? OR ID = ? => ID = ?
    if (x.getOperator() == SQLBinaryOperator.BooleanOr) {
      if ((left instanceof SQLBinaryOpExpr) && (right instanceof SQLBinaryOpExpr)) {
        SQLBinaryOpExpr leftBinary = (SQLBinaryOpExpr) x.getLeft();
        SQLBinaryOpExpr rightBinary = (SQLBinaryOpExpr) x.getRight();

        if (mergeEqual(leftBinary, rightBinary)) {
          v.incrementReplaceCunt();
          return leftBinary;
        }

        if (isLiteralExpr(leftBinary.getLeft()) //
            && leftBinary.getOperator() == SQLBinaryOperator.BooleanOr) {
          if (mergeEqual(leftBinary.getRight(), right)) {
            v.incrementReplaceCunt();
            return leftBinary;
          }
        }
      }
    }

    return x;
  }