On Fri, Aug  9, 2013 at 12:23:59PM -0400, Bruce Momjian wrote:
> Yes, I have thought about this some more and another problem is that
> rtrim/btrim/ltrim() use the source string first, so having trim() have
> the source string second when using a comma is very confusing, e.g.:
> 
>       -- with patch
>       SELECT trim('x', 'xabcx');
>        btrim
>       -------
>        abc
> 
>       -- btrim
>       SELECT btrim('xabcx', 'x');
>        btrim
>       -------
>        abc
> 
> I think we can either document what we have, or remove the ability to
> use comma with trim().  If we go with documentation, it is going to look
> confusing as the optional modifier is going to be on the source string,
> e.g.:
> 
>       SELECT trim(both 'xabcx', 'x');
>        btrim
>       -------
>        abc
> 
> We could modify the grammar to force the modifier on the second
> argument, but that is more parser states for limited value.

[ moved to hackers ]

Based on my research, I am now proposing a new, attached patch which
eliminates comma in all places in TRIM, e.g. this is no longer valid
either:

        SELECT trim(BOTH FROM 'abc', 'a');
         btrim
        -------
         bc
        (1 row)

I believe the flexible TRIM syntax was introduced when TRIM was added in
1997:

        commit 570620c5698b0c76b26a3ec71692df29375cad16
        Author: Thomas G. Lockhart <lockh...@fourpalms.org>
        Date:   Mon Sep 1 06:00:35 1997 +0000
        
            Add SQL92 string handling features (SUBSTRING, TRIM, EXTRACT).

We would now only support the documented TRIM syntax.

-- 
  Bruce Momjian  <br...@momjian.us>        http://momjian.us
  EnterpriseDB                             http://enterprisedb.com

  + It's impossible for everything to be true. +
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
new file mode 100644
index 22e82ba..aa88cfb
*** a/src/backend/parser/gram.y
--- b/src/backend/parser/gram.y
*************** substr_from:
*** 11991,11999 ****
  substr_for: FOR a_expr								{ $$ = $2; }
  		;
  
! trim_list:	a_expr FROM expr_list					{ $$ = lappend($3, $1); }
! 			| FROM expr_list						{ $$ = $2; }
! 			| expr_list								{ $$ = $1; }
  		;
  
  in_expr:	select_with_parens
--- 11991,11999 ----
  substr_for: FOR a_expr								{ $$ = $2; }
  		;
  
! trim_list:	a_expr FROM a_expr						{ $$ = list_make2($3, $1); }
! 			| FROM a_expr							{ $$ = list_make1($2); }
! 			| a_expr								{ $$ = list_make1($1); }
  		;
  
  in_expr:	select_with_parens
-- 
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