From: | Korry Douglas <korry(dot)douglas(at)enterprisedb(dot)com> |
---|---|
To: | PostgreSQL-development Hackers <pgsql-hackers(at)postgresql(dot)org> |
Subject: | Re: Why does TRIM() expect an expr_list? |
Date: | 2010-04-20 16:53:30 |
Message-ID: | 50AA5CE2-24D0-4C73-B59E-ED5268FB6B9F@enterprisedb.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
>> It seems to me that trim_list should defined as:
>
>> trim_list: a_expr FROM a_expr { $$ = list_make2($3, $1); }
>> | FROM a_expr { $$ = list_make1($2); }
>> | a_expr { $$ = list_make1($1); }
>
>> Am I missing something?
>
> That will break the ability to call trim() with ordinary function
> syntax.
>
> We possibly could change that in conjunction with adding a straight
> TRIM '(' expr_list ')' production, though.
Hmm... it seems counterintuitive to call TRIM() using ordinary
function syntax anyway. What would the argument list look like?
I think you would have to reverse the order of the arguments (and
there's no way to factor the LEADING/TRAILING/BOTH stuff into the
argument list since those map to calls to different functions).
For example to write:
TRIM( 'foo' FROM 'foobar' )
using function syntax, you would have to write:
TRIM( 'foobar', 'foo' )
As far as I know, that usage is not documented anywhere. And since
"trim" is not really a function, you can't discover the proper
argument list using \df
On the other hand, someone is surely (ab)using TRIM() that way...
> What this looks like to me is somebody was trying to allow for future
> extensions in the keyword-ized syntax, but I can't imagine the SQL
> committee introducing a mix of keyword-ized and non-keyword-ized
> arguments. So I agree that the expr_list cases are pretty silly
> except for the bare no-keyword-anywhere path.
I suspect that it was simply easier to write it that way than to code
the make_list1() invocations, but who knows.
> Actually, on closer examination I think there's another bug here.
> I see this in SQL99:
>
> <trim function> ::=
> TRIM <left paren> <trim operands> <right paren>
>
> <trim operands> ::=
> [ [ <trim specification> ] [ <trim character> ] FROM ]
> <trim source>
>
> <trim specification> ::=
> LEADING
> | TRAILING
> | BOTH
>
> <trim character> ::= <character value expression>
>
> <trim source> ::= <character value expression>
>
> It looks to me like you're not supposed to be able to omit FROM if
> you've written a <trim specification>. Should we tighten our
> syntax to reject that?
That depends on how much code you want to break. Doesn't really
matter to me.
-- Korry
-----------------------------------------------------------------------
Korry Douglas
Senior Database Dude
EnterpriseDB Corporation
The Enterprise Postgres Company
Phone: (804)241-4301
Mobile: (620) EDB-NERD
From | Date | Subject | |
---|---|---|---|
Next Message | Peter Eisentraut | 2010-04-20 16:55:18 | Re: pgindent and tabs in comments |
Previous Message | Robert Haas | 2010-04-20 16:51:13 | Re: Why does TRIM() expect an expr_list? |