@Override
      protected List<Expression> visitBetweenPredicate(BetweenPredicate node, Scope context) {
        List<Expression> valueResult = process(node.getValue(), context);
        List<Expression> minResult = process(node.getMin(), context);
        List<Expression> maxResult = process(node.getMax(), context);
        if (expandedExpressions == null) {
          // no Columns need to be expanded
          return Collections.singletonList(node);
        }

        ImmutableList.Builder<Expression> resultBuilder = new ImmutableList.Builder<>();
        int valueResultSize = valueResult.size();
        int minResultSize = minResult.size();
        int maxResultSize = maxResult.size();
        int maxSize = Math.max(valueResultSize, Math.max(minResultSize, maxResultSize));

        AtomicInteger baseIndex = new AtomicInteger(0);
        // if child is expanded, index of it reference the baseIndex, else the index of it always be
        // 0
        AtomicInteger valueIndex = (valueResultSize == maxSize) ? baseIndex : new AtomicInteger(0);
        AtomicInteger minIndex = (minResultSize == maxSize) ? baseIndex : new AtomicInteger(0);
        AtomicInteger maxIndex = (maxResultSize == maxSize) ? baseIndex : new AtomicInteger(0);
        for (int i = 0; i < maxSize; i++) {
          resultBuilder.add(
              new BetweenPredicate(
                  valueResult.get(valueIndex.get()),
                  minResult.get(minIndex.get()),
                  maxResult.get(maxIndex.get())));
          baseIndex.getAndIncrement();
        }

        return resultBuilder.build();
      }
Check if there is Columns function in expression, and verify they are same if there are multi
Column functions.

@param expression input expression
@return if there is Columns function in expression
@throws SemanticException if there are multi Columns functions but different
iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/StatementAnalyzer.java