| 1 | #pragma once |
| 2 | |
| 3 | #include <DataStreams/IBlockInputStream.h> |
| 4 | #include <Common/SharedBlockRowRef.h> |
| 5 | #include <Core/SortDescription.h> |
| 6 | |
| 7 | |
| 8 | namespace DB |
| 9 | { |
| 10 | |
| 11 | |
| 12 | /** Implements the LIMIT relational operation. |
| 13 | */ |
| 14 | class LimitBlockInputStream : public IBlockInputStream |
| 15 | { |
| 16 | public: |
| 17 | /** If always_read_till_end = false (by default), then after reading enough data, |
| 18 | * returns an empty block, and this causes the query to be canceled. |
| 19 | * If always_read_till_end = true - reads all the data to the end, but ignores them. This is necessary in rare cases: |
| 20 | * when otherwise, due to the cancellation of the request, we would not have received the data for GROUP BY WITH TOTALS from the remote server. |
| 21 | * If use_limit_as_total_rows_approx = true, then addTotalRowsApprox is called to use the limit in progress & stats |
| 22 | * with_ties = true, when query has WITH TIES modifier. If so, description should be provided |
| 23 | * description lets us know which row we should check for equality |
| 24 | */ |
| 25 | LimitBlockInputStream( |
| 26 | const BlockInputStreamPtr & input, UInt64 limit_, UInt64 offset_, |
| 27 | bool always_read_till_end_ = false, bool use_limit_as_total_rows_approx = false, |
| 28 | bool with_ties_ = false, const SortDescription & description_ = {}); |
| 29 | |
| 30 | String getName() const override { return "Limit" ; } |
| 31 | |
| 32 | Block () const override { return children.at(0)->getHeader(); } |
| 33 | |
| 34 | protected: |
| 35 | Block readImpl() override; |
| 36 | |
| 37 | private: |
| 38 | UInt64 limit; |
| 39 | UInt64 offset; |
| 40 | UInt64 pos = 0; |
| 41 | bool always_read_till_end; |
| 42 | bool with_ties; |
| 43 | const SortDescription description; |
| 44 | SharedBlockRowRef ties_row_ref; |
| 45 | }; |
| 46 | |
| 47 | } |
| 48 | |