| 513 | }; |
| 514 | |
| 515 | class SkipRowsStream : public RecordSource |
| 516 | { |
| 517 | struct Impure : public RecordSource::Impure |
| 518 | { |
| 519 | SINT64 irsb_count; |
| 520 | }; |
| 521 | |
| 522 | public: |
| 523 | SkipRowsStream(CompilerScratch* csb, RecordSource* next, ValueExprNode* value); |
| 524 | |
| 525 | void close(thread_db* tdbb) const override; |
| 526 | |
| 527 | bool refetchRecord(thread_db* tdbb) const override; |
| 528 | WriteLockResult lockRecord(thread_db* tdbb) const override; |
| 529 | |
| 530 | void getChildren(Firebird::Array<const RecordSource*>& children) const override; |
| 531 | |
| 532 | void print(thread_db* tdbb, Firebird::string& plan, |
| 533 | bool detailed, unsigned level, bool recurse) const override; |
| 534 | |
| 535 | void markRecursive() override; |
| 536 | void invalidateRecords(Request* request) const override; |
| 537 | |
| 538 | void findUsedStreams(StreamList& streams, bool expandAll = false) const override; |
| 539 | bool isDependent(const StreamList& streams) const override; |
| 540 | void nullRecords(thread_db* tdbb) const override; |
| 541 | |
| 542 | void setAnyBoolean(BoolExprNode* anyBoolean, bool ansiAny, bool ansiNot) override |
| 543 | { |
| 544 | m_next->setAnyBoolean(anyBoolean, ansiAny, ansiNot); |
| 545 | } |
| 546 | |
| 547 | protected: |
| 548 | void internalOpen(thread_db* tdbb) const override; |
| 549 | bool internalGetRecord(thread_db* tdbb) const override; |
| 550 | |
| 551 | private: |
| 552 | NestConst<RecordSource> m_next; |
| 553 | NestConst<ValueExprNode> const m_value; |
| 554 | }; |
| 555 | |
| 556 | class FilteredStream : public RecordSource |
| 557 | { |