initcap incompatibility issue

Started by Nonameover 22 years ago6 messages
#1Noname
nolan@celery.tssi.com

The initcap function is not completely consistent with Oracle's initcap
function:

SELECT initcap('alex hyde-whyte');

In Oracle 9.2i this will return 'Alex Hyde-White', in PostgreSQL 7.3.3
it returns 'Alex Hyde-white'.

It looks like a relatively simple change to oracle_compat.c in
backend/utils/adt, but is this a bugfix that can be made during the
pre-beta period for 7.4 or does it need to wait?
--
Mike Nolan

#2Noname
nolan@celery.tssi.com
In reply to: Noname (#1)
Re: initcap incompatibility issue

The initcap function is not completely consistent with Oracle's initcap
function:

SELECT initcap('alex hyde-whyte');

In Oracle 9.2i this will return 'Alex Hyde-White', in PostgreSQL 7.3.3
it returns 'Alex Hyde-white'.

No, it doesn't change the 'y' to an 'i', that's a typo in my earlier
note. As far as I can tell, not capitalizing the first letter after a dash
is the only inconsistency with Oracle's implementation of this function.

If a patch is in order at this time, I will try to produce it, I need to
learn set up CVS and how to do that anyway. :-)
--
Mike Nolan

#3Noname
nolan@celery.tssi.com
In reply to: Noname (#2)
Re: initcap incompatibility issue

As far as I can tell, not capitalizing the first letter after a dash
is the only inconsistency with Oracle's implementation of this function.

Wrong again. Oracle also capitalizes the first letter after a comma,
semicolon, colon, period, and both a single and double quote. (And that's
all I've tested so far.)

So, I guess I need to write a program to test all possible combinations
to see how incompatible the function is.

Making this change will be a larger patch than I had initially anticipated.

That also brings into question whether this is really a bugfix or a
specification change, a question which is relevant since we're in the
feature freeze for 7.4.
--
Mike Nolan

#4scott.marlowe
scott.marlowe@ihs.com
In reply to: Noname (#3)
Re: initcap incompatibility issue

On Wed, 9 Jul 2003 nolan@celery.tssi.com wrote:

As far as I can tell, not capitalizing the first letter after a dash
is the only inconsistency with Oracle's implementation of this function.

Wrong again. Oracle also capitalizes the first letter after a comma,
semicolon, colon, period, and both a single and double quote. (And that's
all I've tested so far.)

So, I guess I need to write a program to test all possible combinations
to see how incompatible the function is.

Making this change will be a larger patch than I had initially anticipated.

That also brings into question whether this is really a bugfix or a
specification change, a question which is relevant since we're in the
feature freeze for 7.4.

It sounds like Oracle is simply regexing for anything that ISN'T a letter
to initcap right after it. If that's the case, you could just regex too.

#5Tom Lane
tgl@sss.pgh.pa.us
In reply to: scott.marlowe (#4)
Re: initcap incompatibility issue

"scott.marlowe" <scott.marlowe@ihs.com> writes:

On Wed, 9 Jul 2003 nolan@celery.tssi.com wrote:

Wrong again. Oracle also capitalizes the first letter after a comma,
semicolon, colon, period, and both a single and double quote. (And that's
all I've tested so far.)

It sounds like Oracle is simply regexing for anything that ISN'T a letter
to initcap right after it. If that's the case, you could just regex too.

Or more likely, use the appropriate ctype.h function (isalpha, probably).

That also brings into question whether this is really a bugfix or a
specification change, a question which is relevant since we're in the
feature freeze for 7.4.

AFAIK, our specification for this function is "be like Oracle", so it's
a bug fix and fair game for 7.4. Of course, the sooner you get it in
the more likely we'll see it that way ;-). Later in beta, only critical
bugfixes will be accepted, and this one surely ain't very critical.

regards, tom lane

#6Noname
nolan@celery.tssi.com
In reply to: Tom Lane (#5)
Re: initcap incompatibility issue

It sounds like Oracle is simply regexing for anything that ISN'T a letter
to initcap right after it. If that's the case, you could just regex too.

Or more likely, use the appropriate ctype.h function (isalpha, probably).

Having tested it, Oracle capitalizes after all non-alphanumeric characters,
so !isalnum() is the appropriate function. (That makes it a one-line
patch on 7.3.3, which I've already tested.)

AFAIK, our specification for this function is "be like Oracle", so it's
a bug fix and fair game for 7.4. Of course, the sooner you get it in
the more likely we'll see it that way ;-). Later in beta, only critical
bugfixes will be accepted, and this one surely ain't very critical.

Now if I can just get CVS working on Redhat 8 and remember how to build
a patch, even a one-liner. :-)
--
Mike Nolan