MCPcopy Create free account
hub / github.com/FirebirdSQL/firebird / pass1_make_derived_field

Function pass1_make_derived_field

src/dsql/pass1.cpp:1646–1710  ·  view source on GitHub ↗

pass1_make_derived_field @brief Create a derived field based on underlying expressions @param dsqlScratch @param tdbb @param select_item **/

Source from the content-addressed store, hash-verified

1644
1645 **/
1646static 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,

Callers 1

PASS1_derived_tableFunction · 0.85

Calls 3

DerivedFieldNodeClass · 0.85
getDefaultPoolMethod · 0.45
setDsqlDescMethod · 0.45

Tested by

no test coverage detected