In gram.y, the productions for the TRIM() expression expect an argument of trim_list:

        TRIM '(' trim_list ')'
        TRIM '(' TRAILING trim_list ')'
        TRIM '(' LEADING trim_list ')'
        TRIM '(' BOTH trim_list ')'

And trim_list is defined as:

  trim_list:    a_expr FROM expr_list   { $$ = lappend($3, $1); }
                        | FROM expr_list                        { $$ = $2; }
                        | expr_list                             { $$ = $1; }

But it seems wrong for trim_list to be defined in terms of expr_list's. The way it's currently written, we allow expressions such as:

        TRIM( 'foo', now(), 4+2)

or

        TRIM( LEADING FROM 'foo', 4+2)

The parser translates the TRIM expression into a call to btrim() (or ltrim() or rtrim()) and we seem to (accidentally) make up a silly argument list if the user includes an actual expr_list (with multiple expressions).

The first example results in "function ltrim(unknown, timestamp with time zone, integer) does not exist".

The second example above is translated to ltrim(4+2, 'foo').

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?

                -- Korry


-----------------------------------------------------------------------
Korry Douglas
Senior Database Dude
EnterpriseDB Corporation
The Enterprise Postgres Company

Phone: (804)241-4301
Mobile: (620) EDB-NERD



--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to