@Override
    protected Expression visitGenericDataType(GenericDataType node, Context<C> context) {
      if (!context.isDefaultRewrite()) {
        Expression result =
            rewriter.rewriteGenericDataType(node, context.get(), ExpressionTreeRewriter.this);
        if (result != null) {
          return result;
        }
      }

      Identifier name = rewrite(node.getName(), context.get());

      ImmutableList.Builder<DataTypeParameter> arguments = ImmutableList.builder();
      for (DataTypeParameter argument : node.getArguments()) {
        if (argument instanceof NumericParameter) {
          arguments.add(argument);
        } else if (argument instanceof TypeParameter) {
          TypeParameter parameter = (TypeParameter) argument;
          DataType value = (DataType) process(parameter.getValue(), context);

          if (value != parameter.getValue()) {
            arguments.add(new TypeParameter(value));
          } else {
            arguments.add(argument);
          }
        }
      }

      List<DataTypeParameter> rewrittenArguments = arguments.build();

      if (name != node.getName() || !sameElements(rewrittenArguments, node.getArguments())) {
        return node.getLocation().isPresent()
            ? new GenericDataType(node.getLocation().get(), name, rewrittenArguments)
            : new GenericDataType(name, rewrittenArguments);
      }

      return node;
    }
Invoke the default rewrite logic explicitly. Specifically, it skips the invocation of the
expression rewriter for the provided node.
iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/ir/ExpressionTreeRewriter.java