On Mon, Mar 7, 2016 at 8:39 PM, Amit Langote <langote_amit...@lab.ntt.co.jp> wrote: >> Which means your creates would look like (following Robert Haas's implied >> suggestion that we leave off the string literal quotes): >> >> CREATE TABLE foo_ax1x PARTITION OF foo FOR VALUES ( , (b,2) ); >> CREATE TABLE foo_ax1x PARTITION OF foo FOR VALUES [ (b,2), (b,3) ); >> CREATE TABLE foo_ax1x PARTITION OF foo FOR VALUES [ (b,3), (b,4) ); >> CREATE TABLE foo_ax1x PARTITION OF foo FOR VALUES [ (b,4), (c,2) ); >> CREATE TABLE foo_ax1x PARTITION OF foo FOR VALUES [ (c,2), (c,3) ); >> CREATE TABLE foo_ax1x PARTITION OF foo FOR VALUES [ (c,3), (c,4) ); >> >> That's not terrible looking. > > So I tried a grammar that looked like the following: > > range_spec: lb_inc bound ',' bound ub_inc {<create-range-struct>} > > lb_inc: '[' { $$ = true; } | '(' { $$ = false; } > ub_inc: ']' { $$ = true; } | ')' { $$ = false; } > > bound: a_expr > { > if (IsA($1, RowExpr)) /* (key1, key2, ...) */ > $$ = ((RowExpr) $1)->args; > else /* key */ > $$ = list_make1($1); > } > | /* EMPTY */ { $$ = NIL; }
I think we're converging on a good syntax, but I don't think the choice of nothingness to represent an open range is a good idea, both because it will probably create grammar conflicts now or later and also because it actually is sort of confusing and unintuitive to read given the rest of our syntax. I suggest using UNBOUNDED instead. Also, I don't think allowing an a_expr as a bound is remotely sensible - I think you should allow only Sconst, NumericOnly, NULL, and UNBOUNDED. -- Robert Haas EnterpriseDB: http://www.enterprisedb.com The Enterprise PostgreSQL Company -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers