Re: [HACKERS] WITH clause in CREATE STATISTICS - Mailing list pgsql-hackers

From Alvaro Herrera
Subject Re: [HACKERS] WITH clause in CREATE STATISTICS
Date
Msg-id 20170511193236.ecuwhixts7y3s7u5@alvherre.pgsql
Whole thread Raw
In response to Re: [HACKERS] WITH clause in CREATE STATISTICS  (Tom Lane <tgl@sss.pgh.pa.us>)
Responses Re: [HACKERS] WITH clause in CREATE STATISTICS  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-hackers
Tom Lane wrote:

> Have you thought further about the upthread suggestion to just borrow
> SELECT's syntax lock stock and barrel?  That is, it'd look something
> like
> 
> CREATE STATISTICS name [(list of stats types)] expression-list FROM ...
>     [ WHERE ... ] [ WITH (options) ]
> 
> This would certainly support any FROM stuff we might want later.
> Yeah, you'd need to reject any features you weren't supporting at
> execution, but doing that would allow issuing a friendlier message than
> "syntax error" anyway.
> 
> If you don't have the cycles for that, I'd be willing to look into it.

Bison seems to like the productions below.  Is this what you had in
mind?  These mostly mimic joined_table and table_ref, stripping out the
rules that we don't need.

Note that I had to put back the FOR keyword in there; without the FOR,
that is "CREATE STATS any_name opt_name_list expr_list FROM" there was
one shift/reduce conflict, which I tried to solve by splitting
opt_name_list using two rules (one with "'(' name_list ')'" and one
without), but that gave rise to two reduce/reduce conflicts, and I didn't
see any way to deal with them.

(Note that I ended up realizing that stats_type_list is unnecessary
since we can use name_list.)


CreateStatsStmt:        CREATE opt_if_not_exists STATISTICS any_name        opt_name_list FOR expr_list FROM
stats_joined_table           {                CreateStatsStmt *n = makeNode(CreateStatsStmt);
n->defnames= $4;                n->stat_types = $6;                n->if_not_exists = $2;
 
                stmt->relation = $9;                stmt->keys = $7;                $$ = (Node *)n;            }
;

stats_joined_table:      '(' stats_joined_table ')'            {            }        | stats_table_ref CROSS JOIN
stats_table_ref           {            }        | stats_table_ref join_type JOIN stats_table_ref join_qual            {
          }        | stats_table_ref JOIN stats_table_ref join_qual            {            }        | stats_table_ref
NATURALjoin_type JOIN stats_table_ref            {            }        | stats_table_ref NATURAL JOIN table_ref
  {            }    ;
 

stats_table_ref:        relation_expr opt_alias_clause            {            }        | stats_joined_table
{           }        | '(' stats_joined_table ')' alias_clause            {            }    ;
 



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



pgsql-hackers by date:

Previous
From: Andres Freund
Date:
Subject: Re: [HACKERS] Cached plans and statement generalization
Next
From: Konstantin Knizhnik
Date:
Subject: Re: [HACKERS] Cached plans and statement generalization