| 472 | }; |
| 473 | |
| 474 | class FirstRowsStream : public RecordSource |
| 475 | { |
| 476 | struct Impure : public RecordSource::Impure |
| 477 | { |
| 478 | SINT64 irsb_count; |
| 479 | }; |
| 480 | |
| 481 | public: |
| 482 | FirstRowsStream(CompilerScratch* csb, RecordSource* next, ValueExprNode* value); |
| 483 | |
| 484 | void close(thread_db* tdbb) const override; |
| 485 | |
| 486 | bool refetchRecord(thread_db* tdbb) const override; |
| 487 | WriteLockResult lockRecord(thread_db* tdbb) const override; |
| 488 | |
| 489 | void getChildren(Firebird::Array<const RecordSource*>& children) const override; |
| 490 | |
| 491 | void print(thread_db* tdbb, Firebird::string& plan, |
| 492 | bool detailed, unsigned level, bool recurse) const override; |
| 493 | |
| 494 | void markRecursive() override; |
| 495 | void invalidateRecords(Request* request) const override; |
| 496 | |
| 497 | void findUsedStreams(StreamList& streams, bool expandAll = false) const override; |
| 498 | bool isDependent(const StreamList& streams) const override; |
| 499 | void nullRecords(thread_db* tdbb) const override; |
| 500 | |
| 501 | void setAnyBoolean(BoolExprNode* anyBoolean, bool ansiAny, bool ansiNot) override |
| 502 | { |
| 503 | m_next->setAnyBoolean(anyBoolean, ansiAny, ansiNot); |
| 504 | } |
| 505 | |
| 506 | protected: |
| 507 | void internalOpen(thread_db* tdbb) const override; |
| 508 | bool internalGetRecord(thread_db* tdbb) const override; |
| 509 | |
| 510 | private: |
| 511 | NestConst<RecordSource> m_next; |
| 512 | NestConst<ValueExprNode> const m_value; |
| 513 | }; |
| 514 | |
| 515 | class SkipRowsStream : public RecordSource |
| 516 | { |