[EMAIL PROTECTED] writes:
> The code in /contrib/soundex doesn't work. It does compile though. I
> create the function in the database, but it always returns nothing
> (blank)!
Hmm, while I can confirm that the soundex algorithm is implemented
incorrectly I never get blanks only. Check that you have defined the
function like this:
CREATE FUNCTION soundex(text) RETURNS text AS
'/some/where/soundex.so', 'text_soundex' LANGUAGE 'C';
(ignore the stuff in soundex.sql, it's broken).
To get a correct implementation of soundex, apply the attached patch.
You need to restart the server to get it to load the new object file.
Also note that there is a disagreement among experts over one particular
part of the algorithm. Check it out with your favourite search engine.
--
Peter Eisentraut [EMAIL PROTECTED] http://yi.org/peter-e/
*** soundex.c.orig Fri Sep 29 16:25:59 2000
--- soundex.c Fri Sep 29 16:29:48 2000
***************
*** 21,27 ****
int count = 0;
text *new_t;
! char outstr[6 + 1]; /* max length of soundex is 6 */
char *instr;
/* make a null-terminated string */
--- 21,27 ----
int count = 0;
text *new_t;
! char outstr[4 + 1]; /* max length of soundex is 4 */
char *instr;
/* make a null-terminated string */
***************
*** 70,76 ****
*outstr++ = (char) toupper(*instr++);
! while (*instr && count < 5)
{
if (isalpha(*instr) && *instr != *(instr - 1))
{
--- 70,76 ----
*outstr++ = (char) toupper(*instr++);
! while (*instr && count < 3)
{
if (isalpha(*instr) && *instr != *(instr - 1))
{
***************
*** 82,87 ****
--- 82,94 ----
}
}
++instr;
+ }
+
+ while (count < 3)
+ {
+ *outstr = '0';
+ ++outstr;
+ ++count;
}
*outstr = '\0';