The attached patch changes the existing behaviour of length(char(n)).
Currently, this is what happens:

template1=# select length('blah'::char(10));
 length
--------
     10
(1 row)

With this patch:

template1=# select length('blah'::char(10));
 length
--------
      4
(1 row)

This behaviour was proposed by Tom back in November last year. (I have
tried to handle multibyte correctly but probably haven't -- hence my email
hackers instead of patches).

The spec doesn't give us any insight (as far as I can tell) as to how we
should do it length(char(n)), but the above seems consistent with other
parts of the code (eg, comparison functions, concatenation).

SQL200X has these choice paragraphs for those who are interested:

         <length expression> returns the length of a given character string,
         as an exact numeric value, in characters or octets according to the
         choice of function.

And:

			the result is the number of explicit or implicit
              <char length units> in <char length expression>, counted in
              accordance with the definition of those units in the relevant
              normatively referenced document.

I have no idea what the 'normatively referenced document' is, but grep-ing
through all of SQL200X, 99 and 92 didn't reveal anything too interesting.


Gavin
Tue, 27 Jan 2004 18:21:34 +1100 (EST)
Gavin Sherry <swm@linuxworld.com.au>
Make length(char(n)) return 'true' length
Gavin Sherry <swm@linuxworld.com.au> writes:
> The attached patch changes the existing behaviour of length(char(n)).

Applied, with some simplifications (there wasn't any particular need to
make a temporary copy of the string).

I also added some documentation stating that trailing spaces are
semantically insignificant in char(n), which I believe is now generally
true (have we missed any places?).  There didn't seem to be any place to
specifically mention length() in this connection.

Interestingly, our regression tests did not detect this change of
behavior.

			regards, tom lane

Sun, 01 Feb 2004 01:31:27 -0500
Tom Lane <tgl@sss.pgh.pa.us>
Re: Make length(char(n)) return 'true' length 

Looks good to me but I will get some other eyse on it before I apply it.

Your patch has been added to the PostgreSQL unapplied patches list at:

	http://momjian.postgresql.org/cgi-bin/pgpatches

I will try to apply it within the next 48 hours.

---------------------------------------------------------------------------


Gavin Sherry wrote:
> The attached patch changes the existing behaviour of length(char(n)).
> Currently, this is what happens:
> 
> template1=# select length('blah'::char(10));
>  length
> --------
>      10
> (1 row)
> 
> With this patch:
> 
> template1=# select length('blah'::char(10));
>  length
> --------
>       4
> (1 row)
> 
> This behaviour was proposed by Tom back in November last year. (I have
> tried to handle multibyte correctly but probably haven't -- hence my email
> hackers instead of patches).
> 
> The spec doesn't give us any insight (as far as I can tell) as to how we
> should do it length(char(n)), but the above seems consistent with other
> parts of the code (eg, comparison functions, concatenation).
> 
> SQL200X has these choice paragraphs for those who are interested:
> 
>          <length expression> returns the length of a given character string,
>          as an exact numeric value, in characters or octets according to the
>          choice of function.
> 
> And:
> 
> 			the result is the number of explicit or implicit
>               <char length units> in <char length expression>, counted in
>               accordance with the definition of those units in the relevant
>               normatively referenced document.
> 
> I have no idea what the 'normatively referenced document' is, but grep-ing
> through all of SQL200X, 99 and 92 didn't reveal anything too interesting.
> 
> 
> Gavin

Content-Description: 

[ Attachment, skipping... ]

> 
> ---------------------------(end of broadcast)---------------------------
> TIP 1: subscribe and unsubscribe commands go to majordomo@postgresql.org

-- 
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073

Thu, 12 Feb 2004 12:18:35 -0500 (EST)
Bruce Momjian <pgman@candle.pha.pa.us>
Re: Make length(char(n)) return 'true' length
I believe Tom applied this while you were away.

Gavin

On Thu, 12 Feb 2004, Bruce Momjian wrote:

>
> Looks good to me but I will get some other eyse on it before I apply it.
>
> Your patch has been added to the PostgreSQL unapplied patches list at:
>
> 	http://momjian.postgresql.org/cgi-bin/pgpatches
>
> I will try to apply it within the next 48 hours.
>
> ---------------------------------------------------------------------------
>
>
> Gavin Sherry wrote:
> > The attached patch changes the existing behaviour of length(char(n)).
> > Currently, this is what happens:
> >
> > template1=# select length('blah'::char(10));
> >  length
> > --------
> >      10
> > (1 row)
> >
> > With this patch:
> >
> > template1=# select length('blah'::char(10));
> >  length
> > --------
> >       4
> > (1 row)
> >
> > This behaviour was proposed by Tom back in November last year. (I have
> > tried to handle multibyte correctly but probably haven't -- hence my email
> > hackers instead of patches).
> >
> > The spec doesn't give us any insight (as far as I can tell) as to how we
> > should do it length(char(n)), but the above seems consistent with other
> > parts of the code (eg, comparison functions, concatenation).
> >
> > SQL200X has these choice paragraphs for those who are interested:
> >
> >          <length expression> returns the length of a given character string,
> >          as an exact numeric value, in characters or octets according to the
> >          choice of function.
> >
> > And:
> >
> > 			the result is the number of explicit or implicit
> >               <char length units> in <char length expression>, counted in
> >               accordance with the definition of those units in the relevant
> >               normatively referenced document.
> >
> > I have no idea what the 'normatively referenced document' is, but grep-ing
> > through all of SQL200X, 99 and 92 didn't reveal anything too interesting.
> >
> >
> > Gavin
>
> Content-Description:
>
> [ Attachment, skipping... ]
>
> >
> > ---------------------------(end of broadcast)---------------------------
> > TIP 1: subscribe and unsubscribe commands go to majordomo@postgresql.org
>
> --
>   Bruce Momjian                        |  http://candle.pha.pa.us
>   pgman@candle.pha.pa.us               |  (610) 359-1001
>   +  If your life is a hard drive,     |  13 Roberts Road
>   +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073
>

Fri, 13 Feb 2004 05:51:26 +1100 (EST)
Gavin Sherry <swm@linuxworld.com.au>
Re: Make length(char(n)) return 'true' length
Gavin Sherry wrote:
> I believe Tom applied this while you were away.

Oh, sorry, I see it now:

	test=> select length('blah'::char(10));
	 length
	--------
	      4
	(1 row)

I did test this before placing it the queue, but I now realize I have
been testing regression installs, not command-line installs that I invoke
via psql manually.

-- 
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073

Thu, 12 Feb 2004 13:58:37 -0500 (EST)
Bruce Momjian <pgman@candle.pha.pa.us>
Re: Make length(char(n)) return 'true' length

Already applied.  Thanks.

---------------------------------------------------------------------------


Gavin Sherry wrote:
> The attached patch changes the existing behaviour of length(char(n)).
> Currently, this is what happens:
> 
> template1=# select length('blah'::char(10));
>  length
> --------
>      10
> (1 row)
> 
> With this patch:
> 
> template1=# select length('blah'::char(10));
>  length
> --------
>       4
> (1 row)
> 
> This behaviour was proposed by Tom back in November last year. (I have
> tried to handle multibyte correctly but probably haven't -- hence my email
> hackers instead of patches).
> 
> The spec doesn't give us any insight (as far as I can tell) as to how we
> should do it length(char(n)), but the above seems consistent with other
> parts of the code (eg, comparison functions, concatenation).
> 
> SQL200X has these choice paragraphs for those who are interested:
> 
>          <length expression> returns the length of a given character string,
>          as an exact numeric value, in characters or octets according to the
>          choice of function.
> 
> And:
> 
> 			the result is the number of explicit or implicit
>               <char length units> in <char length expression>, counted in
>               accordance with the definition of those units in the relevant
>               normatively referenced document.
> 
> I have no idea what the 'normatively referenced document' is, but grep-ing
> through all of SQL200X, 99 and 92 didn't reveal anything too interesting.
> 
> 
> Gavin

Content-Description: 

[ Attachment, skipping... ]

> 
> ---------------------------(end of broadcast)---------------------------
> TIP 1: subscribe and unsubscribe commands go to majordomo@postgresql.org

-- 
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073

Thu, 12 Feb 2004 13:58:56 -0500 (EST)
Bruce Momjian <pgman@candle.pha.pa.us>
Re: Make length(char(n)) return 'true' length
Bruce Momjian <pgman@candle.pha.pa.us> writes:
> Looks good to me but I will get some other eyse on it before I apply it.

It's in already ...

			regards, tom lane

Thu, 12 Feb 2004 14:21:25 -0500
Tom Lane <tgl@sss.pgh.pa.us>
Re: Make length(char(n)) return 'true' length 