From: | Dean Rasheed <dean(dot)a(dot)rasheed(at)gmail(dot)com> |
---|---|
To: | Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> |
Cc: | Erwin Brandstetter <brsaweda(at)gmail(dot)com>, PostgreSQL-development <pgsql-hackers(at)postgresql(dot)org> |
Subject: | Re: Making the subquery alias optional in the FROM clause |
Date: | 2023-10-02 10:49:40 |
Message-ID: | CAEZATCVOJ-dMNNNrGpsXnTW+7ZAd7YM7+FMTPVw_1yexk8=zkA@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
On Mon, 2 Oct 2023 at 01:01, Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> wrote:
>
> Erwin Brandstetter <brsaweda(at)gmail(dot)com> writes:
> > On Mon, 2 Oct 2023 at 00:33, Dean Rasheed <dean(dot)a(dot)rasheed(at)gmail(dot)com> wrote:
> >> The only place that exposes the eref's made-up relation name is the
> >> existing query deparsing code in ruleutils.c, which uniquifies it and
> >> generates SQL spec-compliant output. For example:
>
> > I ran into one other place: error messages.
> > SELECT unnamed_subquery.a
> > FROM (SELECT 1 AS a)
> > ERROR: There is an entry for table "unnamed_subquery", but it cannot be
> > referenced from this part of the query.invalid reference to FROM-clause
> > entry for table "unnamed_subquery"
>
> Yeah, that's exposing more of the implementation than we really want.
>
Note that this isn't a new issue, specific to unnamed subqueries. The
same thing happens for unnamed joins:
create table foo(a int);
create table bar(a int);
select unnamed_join.a from foo join bar using (a);
ERROR: invalid reference to FROM-clause entry for table "unnamed_join"
LINE 1: select unnamed_join.a from foo join bar using (a);
^
DETAIL: There is an entry for table "unnamed_join", but it cannot be
referenced from this part of the query.
And there's a similar problem with VALUES RTEs:
insert into foo values (1),(2) returning "*VALUES*".a;
ERROR: invalid reference to FROM-clause entry for table "*VALUES*"
LINE 1: insert into foo values (1),(2) returning "*VALUES*".a;
^
DETAIL: There is an entry for table "*VALUES*", but it cannot be
referenced from this part of the query.
> I'm inclined to think we should avoid letting "unnamed_subquery"
> appear in the parse tree, too. It might not be a good idea to
> try to leave the eref field null, but could we set it to an
> empty string instead, that is
>
> - eref = alias ? copyObject(alias) : makeAlias("unnamed_subquery", NIL);
> + eref = alias ? copyObject(alias) : makeAlias("", NIL);
>
> and then let ruleutils replace that with "unnamed_subquery"?
Hmm, I think that there would be other side-effects if we did that --
at least doing it for VALUES RTEs would also require additional
changes to retain current EXPLAIN output. I think perhaps it would be
better to try for a more targeted fix of the parser error reporting.
In searchRangeTableForRel() we try to find any RTE that could possibly
match the RangeVar, but certain kinds of RTE don't naturally have
names, and if they also haven't been given aliases, then they can't
possibly match anywhere in the query (and thus it's misleading to
report that they can't be referred to from specific places).
So I think perhaps it's better to just have searchRangeTableForRel()
exclude these kinds of RTE, if they haven't been given an alias.
Regards,
Dean
Attachment | Content-Type | Size |
---|---|---|
improve-error-reporting-for-refs-to-unnamed-rtes.patch | application/x-patch | 2.9 KB |
From | Date | Subject | |
---|---|---|---|
Next Message | Hayato Kuroda (Fujitsu) | 2023-10-02 10:59:06 | RE: Synchronizing slots from primary to standby |
Previous Message | Heikki Linnakangas | 2023-10-02 10:08:36 | Re: bgwriter doesn't flush WAL stats |