Re: Why does TRIM() expect an expr_list? - Mailing list pgsql-hackers
From | Korry Douglas |
---|---|
Subject | Re: Why does TRIM() expect an expr_list? |
Date | |
Msg-id | 50AA5CE2-24D0-4C73-B59E-ED5268FB6B9F@enterprisedb.com Whole thread Raw |
In response to | Re: Why does TRIM() expect an expr_list? (Tom Lane <tgl@sss.pgh.pa.us>) |
Responses |
Re: Why does TRIM() expect an expr_list?
|
List | 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
pgsql-hackers by date: