Thread: Retrieving Alias Name

Retrieving Alias Name

From
Walter Cai
Date:
Hi,

I'm currently using a (very rough) scheme to retrieve relation names from a PlannerInfo, and a RelOptInfo struct:

PlannerInfo *root
RelOptInfo *inner_rel

//...

RangeTblEntry *rte;
int x = -1;
while ((x = bms_next_member(inner_rel->relids, x)) >= 0)
{
    rte = root->simple_rte_array[x];
    if (rte->rtekind == RTE_RELATION)
    {
        char *rel_name = get_rel_name(rte->relid);
        // do stuff...
    }
}

However, I now realize it would be better to access aliases as they appear in the SQL query. For instance, if the query contains "... FROM rel_name AS rel_alias ..." I would like to retrieve `rel_alias` instead of `rel_name`.

Is it possible to derive the alias in a similar way?

For context: this code is being inserted into src/backend/optimizer/path/costsize.c and specifically in the calc_joinrel_size_estimate method.

Thanks in advance,
Walter

Re: Retrieving Alias Name

From
Julien Rouhaud
Date:
On Tue, Feb 26, 2019 at 10:48 PM Walter Cai <walter@cs.washington.edu> wrote:
>
> I'm currently using a (very rough) scheme to retrieve relation names from a PlannerInfo, and a RelOptInfo struct:
>
> PlannerInfo *root
> RelOptInfo *inner_rel
>
> //...
>
> RangeTblEntry *rte;
> int x = -1;
> while ((x = bms_next_member(inner_rel->relids, x)) >= 0)
> {
>     rte = root->simple_rte_array[x];
>     if (rte->rtekind == RTE_RELATION)
>     {
>         char *rel_name = get_rel_name(rte->relid);
>         // do stuff...
>     }
> }
>
> However, I now realize it would be better to access aliases as they appear in the SQL query. For instance, if the
querycontains "... FROM rel_name AS rel_alias ..." I would like to retrieve `rel_alias` instead of `rel_name`.
 
>
> Is it possible to derive the alias in a similar way?

You can use rte->eref->aliasname, which will contain the alias is one
was provided, otherwise the original name.  You can see RangeTblEntry
comment in include/nodes/parsenodes.h for more details.