On Wed, Jan 11, 2012 at 5:13 PM, Ashutosh Bapat <
ashutosh.ba...@enterprisedb.com> wrote:

> Hi,
> After running regression, I ran EXPLAIN on one of the queries in
> regression (test create_misc) and got following output
> regression=# explain verbose select * into table ramp from road where name
> ~ '.*Ramp';
>                                      QUERY
> PLAN
>
> ------------------------------------------------------------------------------------
>  Result  (cost=0.00..154.00 rows=841 width=67)
>    Output: public.road.name, public.road.thepath
>    ->  Append  (cost=0.00..154.00 rows=841 width=67)
>          ->  Seq Scan on public.road  (cost=0.00..135.05 rows=418 width=67)
>                Output: public.road.name, public.road.thepath
>                Filter: (public.road.name ~ '.*Ramp'::text)
>          ->  Seq Scan on public.ihighway road  (cost=0.00..14.99 rows=367
> width=67)
>                                                         ^^^^^
>                Output: public.road.name, public.road.thepath
>                            ^^^^^^^^^^,           ^^^^^^
>                Filter: (public.road.name ~ '.*Ramp'::text)
>                          ^^^^^^^^^^^
>          ->  Seq Scan on public.shighway road  (cost=0.00..3.96 rows=56
> width=67)
>                Output: public.road.name, public.road.thepath
>                Filter: (public.road.name ~ '.*Ramp'::text)
> (12 rows)
>
> regression=# \d+ road
>                         Table "public.road"
>  Column  | Type | Modifiers | Storage  | Stats target | Description
> ---------+------+-----------+----------+--------------+-------------
>  name    | text |           | extended |              |
>  thepath | path |           | extended |              |
> Indexes:
>     "rix" btree (name)
> Child tables: ihighway,
>               shighway
> Has OIDs: no
>
> Table "road" has children "ihighway" and "shighway" as seen in the \d+
> output above. The EXPLAIN output of Seq Scan node on children has
> "public.road" as prefix for variables. "public.road" could imply the parent
> table "road" and thus can cause confusion, as to what's been referreed, the
> columns of parent table or child table. In the EXPLAIN output children
> tables have "road" as alias (as against "public.road"). The alias comes
> from RangeTblEntry->eref->aliasname. It might be better to have "road" as
> prefix in the variable names over "public.road".
>
> The reason why this happens is the code in get_variable()
> 3865     /* Exceptions occur only if the RTE is alias-less */
> 3866     if (rte->alias == NULL)
> 3867     {
> 3868         if (rte->rtekind == RTE_RELATION)
> 3869         {
> 3870             /*
> 3871              * It's possible that use of the bare refname would find
> another
> 3872              * more-closely-nested RTE, or be ambiguous, in which
> case we need
> 3873              * to specify the schemaname to avoid these errors.
> 3874              */
> 3875             if (find_rte_by_refname(rte->eref->aliasname, context) !=
> rte)
> 3876                 schemaname =
> get_namespace_name(get_rel_namespace(rte->relid));
> 3877         }
>
> If there is no alias, we find out the schema name and later add it to the
> prefix. In the inherited table case, we are actually creating a "kind of"
> alias for the children table and thus we should not find out the schema
> name and add it to the prefix. This case has been taken care of in
> get_from_clause_item(),
> 6505         else if (rte->rtekind == RTE_RELATION &&
> 6506             strcmp(rte->eref->aliasname,
> get_relation_name(rte->relid)) != 0)
> 6507         {
> 6508             /*
> 6509              * Apparently the rel has been renamed since the rule was
> made.
> 6510              * Emit a fake alias clause so that variable references
> will still
> 6511              * work.  This is not a 100% solution but should work in
> most
> 6512              * reasonable situations.
> 6513              */
> 6514             appendStringInfo(buf, " %s",
> 6515                              quote_identifier(rte->eref->aliasname));
> 6516             gavealias = true;
> 6517         }
>
> I see similar code in ExplainTargetRel()
> 1778         if (objectname == NULL ||
> 1779             strcmp(rte->eref->aliasname, objectname) != 0)
> 1780             appendStringInfo(es->str, " %s",
> 1781                              quote_identifier(rte->eref->aliasname));
>
> Based on this, here is patch to not add schemaname in the prefix for a
> variable.
>
> I have run make check. All except inherit.sql passed. The expected output
> change is included in the patch.
>
> --
> Best Wishes,
> Ashutosh Bapat
> EntepriseDB Corporation
> The Enterprise Postgres Company
>
>
>
> --
> Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-hackers
>
>
A table can inherit from one or more parent table. So in that case,
qualifying schema/table name
helps in finding out where the column is coming from.

Regards,
Chetan

-- 
EnterpriseDB Corporation
The Enterprise PostgreSQL Company

 Website: www.enterprisedb.com
EnterpriseDB Blog : http://blogs.enterprisedb.com
Follow us on Twitter : http://www.twitter.com/enterprisedb

Reply via email to