code: def _create_read_fn(self, num_rows: int, offset: int):
      def read_fn() -> Iterable[Block]:
          with _connect(self.connection_factory) as cursor:
              cursor.execute(
                  f"SELECT * FROM ({self.sql}) as T LIMIT {num_rows} OFFSET {offset}"
              )
              block = _cursor_to_block(cursor)
              return [block]
  
      return read_fn
  
file_path: ray/python/ray/data/datasource/sql_datasource.py
imports: import math
  from contextlib import contextmanager
  from typing import Any, Callable, Iterable, Iterator, List, Optional
  from ray.data.block import Block, BlockAccessor, BlockMetadata
  from ray.data.datasource.datasource import Datasource, ReadTask
  from ray.util.annotations import PublicAPI
label_desc: Use image node_id 6 for calling the SQLDatasource obj's underlying member method code with example usage: obj._create_read_fn(num_rows, offset) and returns: read_fn, list