pass1_make_derived_field @brief Create a derived field based on underlying expressions @param dsqlScratch @param tdbb @param select_item **/
| 1644 | |
| 1645 | **/ |
| 1646 | static ValueExprNode* pass1_make_derived_field(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, |
| 1647 | ValueExprNode* select_item) |
| 1648 | { |
| 1649 | MemoryPool& pool = *tdbb->getDefaultPool(); |
| 1650 | DsqlAliasNode* aliasNode; |
| 1651 | SubQueryNode* subQueryNode; |
| 1652 | DsqlMapNode* mapNode; |
| 1653 | FieldNode* fieldNode; |
| 1654 | DerivedFieldNode* derivedField; |
| 1655 | |
| 1656 | if ((aliasNode = nodeAs<DsqlAliasNode>(select_item))) |
| 1657 | { |
| 1658 | // Create a derived field and ignore alias node. |
| 1659 | DerivedFieldNode* newField = FB_NEW_POOL(pool) DerivedFieldNode(pool, |
| 1660 | aliasNode->name, dsqlScratch->scopeLevel, aliasNode->value); |
| 1661 | newField->setDsqlDesc(aliasNode->value->getDsqlDesc()); |
| 1662 | return newField; |
| 1663 | } |
| 1664 | else if ((subQueryNode = nodeAs<SubQueryNode>(select_item))) |
| 1665 | { |
| 1666 | // Try to generate derived field from sub-select |
| 1667 | ValueExprNode* derived_field = pass1_make_derived_field(tdbb, dsqlScratch, |
| 1668 | subQueryNode->value1); |
| 1669 | |
| 1670 | if ((derivedField = nodeAs<DerivedFieldNode>(derived_field))) |
| 1671 | { |
| 1672 | derivedField->value = select_item; |
| 1673 | return derived_field; |
| 1674 | } |
| 1675 | } |
| 1676 | else if ((mapNode = nodeAs<DsqlMapNode>(select_item))) |
| 1677 | { |
| 1678 | // Aggregate's have map on top. |
| 1679 | ValueExprNode* derived_field = pass1_make_derived_field(tdbb, dsqlScratch, mapNode->map->map_node); |
| 1680 | |
| 1681 | // If we had succesfully made a derived field node change it with orginal map. |
| 1682 | if ((derivedField = nodeAs<DerivedFieldNode>(derived_field))) |
| 1683 | { |
| 1684 | derivedField->value = select_item; |
| 1685 | derivedField->scope = dsqlScratch->scopeLevel; |
| 1686 | derivedField->setDsqlDesc(select_item->getDsqlDesc()); |
| 1687 | return derived_field; |
| 1688 | } |
| 1689 | } |
| 1690 | else if ((fieldNode = nodeAs<FieldNode>(select_item))) |
| 1691 | { |
| 1692 | // Create a derived field and hook in. |
| 1693 | |
| 1694 | DerivedFieldNode* newField = FB_NEW_POOL(pool) DerivedFieldNode(pool, |
| 1695 | fieldNode->dsqlField->fld_name, dsqlScratch->scopeLevel, select_item); |
| 1696 | newField->setDsqlDesc(fieldNode->getDsqlDesc()); |
| 1697 | return newField; |
| 1698 | } |
| 1699 | else if ((derivedField = nodeAs<DerivedFieldNode>(select_item))) |
| 1700 | { |
| 1701 | // Create a derived field that points to a derived field. |
| 1702 | |
| 1703 | DerivedFieldNode* newField = FB_NEW_POOL(pool) DerivedFieldNode(pool, |
no test coverage detected