private void analyzeOffset(Offset node, Scope scope) {
      long rowCount;
      if (node.getRowCount() instanceof LongLiteral) {
        rowCount = ((LongLiteral) node.getRowCount()).getParsedValue();
      } else {
        //        checkState(
        //            node.getRowCount() instanceof Parameter,
        //            "unexpected OFFSET rowCount: " +
        // node.getRowCount().getClass().getSimpleName());
        throw new SemanticException(
            "unexpected OFFSET rowCount: " + node.getRowCount().getClass().getSimpleName());
        //        OptionalLong providedValue =
        //            analyzeParameterAsRowCount((Parameter) node.getRowCount(), scope, "OFFSET");
        //        rowCount = providedValue.orElse(0);
      }
      if (rowCount < 0) {
        throw new SemanticException(
            String.format(
                "OFFSET row count must be greater or equal to 0 (actual value: %s)", rowCount));
      }
      analysis.setOffset(node, rowCount);
    }
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