Re: Why does TRIM() expect an expr_list?

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

In response to

Responses

Browse pgsql-hackers by date

  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?