Обсуждение: BUG #18307: system columns does not support using join

Поиск
Список
Период
Сортировка

BUG #18307: system columns does not support using join

От
PG Bug reporting form
Дата:
The following bug has been logged on the website:

Bug reference:      18307
Logged by:          RekGRpth
Email address:      rekgrpth@gmail.com
PostgreSQL version: 16.1
Operating system:   docker alpine
Description:

create table t(i int);

explain (costs off) select * from t join t tt on t.xmin = tt.xmin;
           QUERY PLAN            
---------------------------------
 Hash Join
   Hash Cond: (t.xmin = tt.xmin)
   ->  Seq Scan on t
   ->  Hash
         ->  Seq Scan on t tt
(5 rows)

explain (costs off) select * from t join t tt using (xmin);
ERROR:  column "xmin" specified in USING clause does not exist in left table


Re: BUG #18307: system columns does not support using join

От
"David G. Johnston"
Дата:
On Tuesday, January 23, 2024, PG Bug reporting form <noreply@postgresql.org> wrote:
The following bug has been logged on the website:

Bug reference:      18307
Logged by:          RekGRpth
Email address:      rekgrpth@gmail.com
PostgreSQL version: 16.1
Operating system:   docker alpine
Description:       

create table t(i int);

explain (costs off) select * from t join t tt on t.xmin = tt.xmin;
           QUERY PLAN           
---------------------------------
 Hash Join
   Hash Cond: (t.xmin = tt.xmin)
   ->  Seq Scan on t
   ->  Hash
         ->  Seq Scan on t tt
(5 rows)

explain (costs off) select * from t join t tt using (xmin);
ERROR:  column "xmin" specified in USING clause does not exist in left table

I don’t this being worth the effort to change, and really seems like completely expected behavior. “Select *” doesn’t output xmin, it requires explicit table qualification to see it.  This is the same thing.

David J.
 

Re: BUG #18307: system columns does not support using join

От
RekGRpth
Дата:
Thanks, I'll look into it.

explain (costs off) select t.xmin from t join t tt on t.xmin = tt.xmin;
           QUERY PLAN
---------------------------------
 Hash Join
   Hash Cond: (t.xmin = tt.xmin)
   ->  Seq Scan on t
   ->  Hash
         ->  Seq Scan on t tt
(5 rows)

explain (costs off) select t.xmin from t join t tt using (xmin);
ERROR:  column "xmin" specified in USING clause does not exist in left table

explain (costs off) select tt.xmin from t join t tt using (xmin);
ERROR:  column "xmin" specified in USING clause does not exist in left table

explain (costs off) select t.xmin, tt.xmin from t join t tt using (xmin);
ERROR:  column "xmin" specified in USING clause does not exist in left table

ср, 24 янв. 2024 г. в 19:26, David G. Johnston <david.g.johnston@gmail.com>:
>
> On Tuesday, January 23, 2024, PG Bug reporting form <noreply@postgresql.org> wrote:
>>
>> The following bug has been logged on the website:
>>
>> Bug reference:      18307
>> Logged by:          RekGRpth
>> Email address:      rekgrpth@gmail.com
>> PostgreSQL version: 16.1
>> Operating system:   docker alpine
>> Description:
>>
>> create table t(i int);
>>
>> explain (costs off) select * from t join t tt on t.xmin = tt.xmin;
>>            QUERY PLAN
>> ---------------------------------
>>  Hash Join
>>    Hash Cond: (t.xmin = tt.xmin)
>>    ->  Seq Scan on t
>>    ->  Hash
>>          ->  Seq Scan on t tt
>> (5 rows)
>>
>> explain (costs off) select * from t join t tt using (xmin);
>> ERROR:  column "xmin" specified in USING clause does not exist in left table
>
>
> I don’t this being worth the effort to change, and really seems like completely expected behavior. “Select *” doesn’t
outputxmin, it requires explicit table qualification to see it.  This is the same thing. 
>
> David J.
>



Re: BUG #18307: system columns does not support using join

От
Tom Lane
Дата:
"David G. Johnston" <david.g.johnston@gmail.com> writes:
> On Tuesday, January 23, 2024, PG Bug reporting form <noreply@postgresql.org>
> wrote:
>> create table t(i int);
>>
>> explain (costs off) select * from t join t tt on t.xmin = tt.xmin;
>> QUERY PLAN
>> ---------------------------------
>> Hash Join
>> Hash Cond: (t.xmin = tt.xmin)
>> ->  Seq Scan on t
>> ->  Hash
>> ->  Seq Scan on t tt
>> (5 rows)
>>
>> explain (costs off) select * from t join t tt using (xmin);
>> ERROR:  column "xmin" specified in USING clause does not exist in left
>> table

> I don’t this being worth the effort to change, and really seems like
> completely expected behavior. “Select *” doesn’t output xmin, it requires
> explicit table qualification to see it.  This is the same thing.

Well, it is odd that "using (xmin)" isn't equivalent to the allegedly
equivalent "on t.xmin = tt.xmin".  This is down to the infrastructure
in transformFromClauseItem(), which searches the lists of (regular,
non-system) relation output column names to expand USING().  But like
you, I can't get excited about changing it.  There are a couple of
practical reasons why not:

* NATURAL JOIN is defined in terms of USING.  But we *certainly* don't
want "x NATURAL JOIN y" deciding that it should equate all the system
columns of x to those of y.  So there's going to be inconsistency at
one level or the other no matter what.

* I really find it hard to imagine a valid use case for joining on any
system column.  There are use-cases for joining on TID in an UPDATE
involving a self-join to the target table; but you can't write that
with JOIN USING syntax.

            regards, tom lane