@@ -367,15 +367,7 @@ void GenSeriesFunctionScan::close(thread_db* tdbb) const
367367 const auto impure = request->getImpure <Impure>(m_impure);
368368
369369 if (impure->irsb_flags & irsb_open)
370- {
371370 impure->irsb_flags &= ~irsb_open;
372-
373- if (impure->m_recordBuffer )
374- {
375- delete impure->m_recordBuffer ;
376- impure->m_recordBuffer = nullptr ;
377- }
378- }
379371}
380372
381373
@@ -431,16 +423,15 @@ void GenSeriesFunctionScan::internalOpen(thread_db* tdbb) const
431423 if (step == 0 )
432424 status_exception::raise (Arg::Gds (isc_genseq_stepmustbe_nonzero) << Arg::Str (m_name));
433425
434-
435426 const auto impure = request->getImpure <Impure>(m_impure);
436427 impure->irsb_flags |= irsb_open;
437- impure->m_recordBuffer = FB_NEW_POOL (pool) RecordBuffer (pool, m_format) ;
428+ impure->m_recordBuffer = nullptr ;
438429 impure->m_start = start;
439430 impure->m_finish = finish;
440431 impure->m_step = step;
441432 impure->m_result = start;
442433 impure->m_scale = scale;
443-
434+ impure-> m_recordExists = true ;
444435
445436 Record* const record = VIO_record (tdbb, rpb, m_format, &pool);
446437
@@ -450,7 +441,6 @@ void GenSeriesFunctionScan::internalOpen(thread_db* tdbb) const
450441 fromDesc.makeInt64 (scale, &impure->m_result );
451442
452443 assignParameter (tdbb, &fromDesc, toDesc, 0 , record);
453- impure->m_recordBuffer ->store (record);
454444}
455445
456446void GenSeriesFunctionScan::internalGetPlan (thread_db* tdbb, PlanEntry& planEntry, unsigned /* level*/ ,
@@ -467,6 +457,36 @@ void GenSeriesFunctionScan::internalGetPlan(thread_db* tdbb, PlanEntry& planEntr
467457 planEntry.alias = m_alias;
468458}
469459
460+ bool GenSeriesFunctionScan::internalGetRecord (thread_db* tdbb) const
461+ {
462+ JRD_reschedule (tdbb);
463+
464+ const auto request = tdbb->getRequest ();
465+ const auto impure = request->getImpure <Impure>(m_impure);
466+ const auto rpb = &request->req_rpb [m_stream];
467+
468+ if (!(impure->irsb_flags & irsb_open))
469+ {
470+ rpb->rpb_number .setValid (false );
471+ return false ;
472+ }
473+
474+ rpb->rpb_number .increment ();
475+
476+ do
477+ {
478+ if (impure->m_recordExists )
479+ {
480+ impure->m_recordExists = false ;
481+ rpb->rpb_number .setValid (true );
482+ return true ;
483+ }
484+ } while (nextBuffer (tdbb));
485+
486+ rpb->rpb_number .setValid (false );
487+ return false ;
488+ }
489+
470490bool GenSeriesFunctionScan::nextBuffer (thread_db* tdbb) const
471491{
472492 const auto request = tdbb->getRequest ();
@@ -481,7 +501,7 @@ bool GenSeriesFunctionScan::nextBuffer(thread_db* tdbb) const
481501 dsc fromDesc;
482502 fromDesc.makeInt64 (impure->m_scale , &i);
483503 assignParameter (tdbb, &fromDesc, toDesc, 0 , record);
484- impure->m_recordBuffer -> store (record) ;
504+ impure->m_recordExists = true ;
485505 };
486506
487507 impure->m_result += impure->m_step ;
0 commit comments