Thread: Creating unique or "internal-use-only" column names (ColumnRef)

Creating unique or "internal-use-only" column names (ColumnRef)

From
Peter Moser
Date:
Good afternoon,
is it possible to create unique column names or to give column names 
inside the parser phase that do not interfer with the outside world, 
i.e. with column names from tables or aliases given by the user.

Some short background:
I created my own from-clause-item, that gets rewritten into a sub-query. 
I do this because I want to re-use existing code as much as possible. 
The rewritten sub-query gets transformed with "transformRangeSubselect"...
Within this sub-query I need 3 columns that shouldn't interfer with 
columns from the input. We refer to them from a JOIN-ON clause and an 
ORDER-BY clause.

Example code:

ColumnRef     *ref;
ref = makeNode(ColumnRef);
ref->fields = list_make1(makeString("some_unique_name"));
ref->location = -1; /* Unknown location */

...

sb1 = makeNode(SortBy);
sb1->node = ref;

...

ssResult = makeNode(SelectStmt);
ssResult->withClause = NULL;
ssResult->fromClause = list_make1(joinExpr);
ssResult->targetList = list_make1(rtAStarWithR);  /* input = r.* */
ssResult->sortClause = list_make2(sb1, sb2);

Is there a possibility for such column names?

Thanks for your help,
Peter




Re: Creating unique or "internal-use-only" column names (ColumnRef)

From
Alvaro Herrera
Date:
Peter Moser wrote:
> Good afternoon,
> is it possible to create unique column names or to give column names inside
> the parser phase that do not interfer with the outside world, i.e. with
> column names from tables or aliases given by the user.
> 
> Some short background:
> I created my own from-clause-item, that gets rewritten into a sub-query. I
> do this because I want to re-use existing code as much as possible. The
> rewritten sub-query gets transformed with "transformRangeSubselect"...
> Within this sub-query I need 3 columns that shouldn't interfer with columns
> from the input. We refer to them from a JOIN-ON clause and an ORDER-BY
> clause.

This seems pretty much the same as a junk attribute, if I understand you
correctly.  I suggest given a look at how those work.

-- 
Álvaro Herrera                http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services



Re: Creating unique or "internal-use-only" column names (ColumnRef)

From
Andrew Dunstan
Date:

On 09/07/2015 09:28 AM, Alvaro Herrera wrote:
> Peter Moser wrote:
>> Good afternoon,
>> is it possible to create unique column names or to give column names inside
>> the parser phase that do not interfer with the outside world, i.e. with
>> column names from tables or aliases given by the user.
>>
>> Some short background:
>> I created my own from-clause-item, that gets rewritten into a sub-query. I
>> do this because I want to re-use existing code as much as possible. The
>> rewritten sub-query gets transformed with "transformRangeSubselect"...
>> Within this sub-query I need 3 columns that shouldn't interfer with columns
>> from the input. We refer to them from a JOIN-ON clause and an ORDER-BY
>> clause.
> This seems pretty much the same as a junk attribute, if I understand you
> correctly.  I suggest given a look at how those work.
>



Is that actually documented anywhere much? I had to use one recently for 
the Redis FDW and looked in vain for some docco - not saying it's not 
there, just that I didn't find it.

cheers

andrew



Re: Creating unique or "internal-use-only" column names (ColumnRef)

From
Tom Lane
Date:
Andrew Dunstan <andrew@dunslane.net> writes:
> On 09/07/2015 09:28 AM, Alvaro Herrera wrote:
>> This seems pretty much the same as a junk attribute, if I understand you
>> correctly.  I suggest given a look at how those work.

> Is that actually documented anywhere much?

I don't think there's much besides a code comment here and there.
Grepping for functions that touch the "resjunk" field of TargetListEntries
should give you the lay of the land.
        regards, tom lane



Re: Creating unique or "internal-use-only" column names (ColumnRef)

From
Peter Moser
Date:

Am 07.09.2015 um 16:40 schrieb Tom Lane:
> Andrew Dunstan <andrew@dunslane.net> writes:
>> On 09/07/2015 09:28 AM, Alvaro Herrera wrote:
>>> This seems pretty much the same as a junk attribute, if I understand you
>>> correctly.  I suggest given a look at how those work.
>
>> Is that actually documented anywhere much?
>
> I don't think there's much besides a code comment here and there.
> Grepping for functions that touch the "resjunk" field of TargetListEntries
> should give you the lay of the land.
>
>             regards, tom lane
>

I have marked them as resjunk already. The problem is that the subquery 
I build contains another subquery. As SQL it looks something like the 
following:

select *
from(select *, row_number() over () rn from r) r
left outer join(select *, ts p1 from r    union all select *, te p1 from r) s
on p1 >= r.ts and p1 < r.te
order by rn, p1;

I set then the output columns of the outer select to resjunk for rn and 
p1, like this...

i = list_length(qry->targetList);
get_tle_by_resno(qry->targetList, i)->resjunk = true;
get_tle_by_resno(qry->targetList, --i)->resjunk = true;


However, I cannot do that inside, because I need them above... or do I 
miss something here?

~peter