| 592 | } |
| 593 | |
| 594 | void DsqlCompilerScratch::addCTEs(WithClause* withClause) |
| 595 | { |
| 596 | if (ctes.getCount()) |
| 597 | { |
| 598 | ERRD_post(Arg::Gds(isc_sqlerr) << Arg::Num(-104) << |
| 599 | // WITH clause can't be nested |
| 600 | Arg::Gds(isc_dsql_cte_nested_with)); |
| 601 | } |
| 602 | |
| 603 | if (withClause->recursive) |
| 604 | flags |= DsqlCompilerScratch::FLAG_RECURSIVE_CTE; |
| 605 | |
| 606 | const SelectExprNode* const* end = withClause->end(); |
| 607 | |
| 608 | for (SelectExprNode* const* cte = withClause->begin(); cte != end; ++cte) |
| 609 | { |
| 610 | if (withClause->recursive) |
| 611 | { |
| 612 | currCtes.push(*cte); |
| 613 | PsqlChanger changer(this, false); |
| 614 | ctes.add(pass1RecursiveCte(*cte)); |
| 615 | currCtes.pop(); |
| 616 | |
| 617 | // Add CTE name into CTE aliases stack. It allows later to search for |
| 618 | // aliases of given CTE. |
| 619 | addCTEAlias((*cte)->alias); |
| 620 | } |
| 621 | else |
| 622 | ctes.add(*cte); |
| 623 | } |
| 624 | } |
| 625 | |
| 626 | SelectExprNode* DsqlCompilerScratch::findCTE(const MetaName& name) |
| 627 | { |