| 446 | } |
| 447 | |
| 448 | dsc* AggNode::execute(thread_db* tdbb, Request* request) const |
| 449 | { |
| 450 | impure_value_ex* impure = request->getImpure<impure_value_ex>(impureOffset); |
| 451 | |
| 452 | if (impure->vlu_blob) |
| 453 | { |
| 454 | impure->vlu_blob->BLB_close(tdbb); |
| 455 | impure->vlu_blob = NULL; |
| 456 | } |
| 457 | |
| 458 | if (distinct) |
| 459 | { |
| 460 | impure_agg_sort* asbImpure = request->getImpure<impure_agg_sort>(asb->impure); |
| 461 | dsc desc = asb->desc; |
| 462 | |
| 463 | // Sort the values already "put" to sort. |
| 464 | asbImpure->iasb_sort->sort(tdbb); |
| 465 | |
| 466 | // Now get the sorted/projected values and compute the aggregate. |
| 467 | |
| 468 | while (true) |
| 469 | { |
| 470 | UCHAR* data; |
| 471 | asbImpure->iasb_sort->get(tdbb, reinterpret_cast<ULONG**>(&data)); |
| 472 | |
| 473 | if (!data) |
| 474 | { |
| 475 | // We are done, close the sort. |
| 476 | delete asbImpure->iasb_sort; |
| 477 | asbImpure->iasb_sort = NULL; |
| 478 | break; |
| 479 | } |
| 480 | |
| 481 | desc.dsc_address = data + (asb->intl ? asb->keyItems[1].getSkdOffset() : 0); |
| 482 | |
| 483 | aggPass(tdbb, request, &desc); |
| 484 | } |
| 485 | } |
| 486 | |
| 487 | return aggExecute(tdbb, request); |
| 488 | } |
| 489 | |
| 490 | |
| 491 | //-------------------- |
no test coverage detected