diff --git a/src/IO/AsynchronousReadBufferFromFile.h b/src/IO/AsynchronousReadBufferFromFile.h index d3b7ffbc7dc5..5b39b707803e 100644 --- a/src/IO/AsynchronousReadBufferFromFile.h +++ b/src/IO/AsynchronousReadBufferFromFile.h @@ -45,6 +45,8 @@ class AsynchronousReadBufferFromFile : public AsynchronousReadBufferFromFileDesc { return file_name; } + + bool isRegularLocalFile(size_t * /* out_view_offset */) override { return true; } }; /** Similar to AsynchronousReadBufferFromFile but also transparently shares open file descriptors. @@ -79,6 +81,8 @@ class AsynchronousReadBufferFromFileWithDescriptorsCache : public AsynchronousRe { return file_name; } + + bool isRegularLocalFile(size_t * /* out_view_offset */) override { return true; } }; } diff --git a/src/IO/MMapReadBufferFromFile.cpp b/src/IO/MMapReadBufferFromFile.cpp index 86e05d7ae449..0596eba565fb 100644 --- a/src/IO/MMapReadBufferFromFile.cpp +++ b/src/IO/MMapReadBufferFromFile.cpp @@ -40,6 +40,13 @@ std::string MMapReadBufferFromFile::getFileName() const } +bool MMapReadBufferFromFile::isRegularLocalFile(size_t * out_view_offset) +{ + *out_view_offset = mapped.getOffset(); + return true; +} + + MMapReadBufferFromFile::MMapReadBufferFromFile(const std::string & file_name_, size_t offset, size_t length_) : file_name(file_name_) { diff --git a/src/IO/MMapReadBufferFromFile.h b/src/IO/MMapReadBufferFromFile.h index bc566a0489ca..1043e0a661f5 100644 --- a/src/IO/MMapReadBufferFromFile.h +++ b/src/IO/MMapReadBufferFromFile.h @@ -27,6 +27,8 @@ class MMapReadBufferFromFile : public MMapReadBufferFromFileDescriptor std::string getFileName() const override; + bool isRegularLocalFile(size_t * out_view_offset) override; + private: int fd = -1; std::string file_name; diff --git a/src/IO/MMapReadBufferFromFileWithCache.h b/src/IO/MMapReadBufferFromFileWithCache.h index ff84f81610a2..cb87b03df8d0 100644 --- a/src/IO/MMapReadBufferFromFileWithCache.h +++ b/src/IO/MMapReadBufferFromFileWithCache.h @@ -20,6 +20,8 @@ class MMapReadBufferFromFileWithCache : public ReadBufferFromFileBase std::string getFileName() const override; off_t seek(off_t offset, int whence) override; + bool isRegularLocalFile(size_t * /* out_view_offset */) override { return true; } + private: MMappedFileCache::MappedPtr mapped; diff --git a/src/IO/ReadBufferFromFile.h b/src/IO/ReadBufferFromFile.h index 462453d974d9..30325463cdfe 100644 --- a/src/IO/ReadBufferFromFile.h +++ b/src/IO/ReadBufferFromFile.h @@ -53,6 +53,8 @@ class ReadBufferFromFile : public ReadBufferFromFileDescriptor } size_t getFileOffsetOfBufferEnd() const override { return file_offset_of_buffer_end; } + + bool isRegularLocalFile(size_t * /* out_view_offset */) override { return true; } }; @@ -103,6 +105,8 @@ class ReadBufferFromFilePReadWithDescriptorsCache : public ReadBufferFromFileDes { return file_name; } + + bool isRegularLocalFile(size_t * /* out_view_offset */) override { return true; } }; } diff --git a/src/IO/ReadBufferFromFileBase.h b/src/IO/ReadBufferFromFileBase.h index b77db29bc238..296edf9c6892 100644 --- a/src/IO/ReadBufferFromFileBase.h +++ b/src/IO/ReadBufferFromFileBase.h @@ -54,6 +54,12 @@ class ReadBufferFromFileBase : public BufferWithOwnMemory, p void setProgressCallback(ContextPtr context); + /// Returns true if this file is on local filesystem, and getFileName() is its path. + /// I.e. it can be read using open() or mmap(). If this buffer is a "view" into a subrange of the + /// file, *out_view_offset is set to the start of that subrange, i.e. the difference between actual + /// file offset and what getPosition() returns. + virtual bool isRegularLocalFile(size_t * /* out_view_offset */ = nullptr) { return false; } + protected: std::optional file_size; ProfileCallback profile_callback;