summaryrefslogtreecommitdiff
path: root/contrib/soundex
diff options
context:
space:
mode:
authorMarc G. Fournier1996-08-18 22:14:33 +0000
committerMarc G. Fournier1996-08-18 22:14:33 +0000
commit9848d3655d44aa2e58d28fe9f93a94b2934eedc8 (patch)
tree059111c2156111b083ea668b84bc8b3481676fca /contrib/soundex
parent1960a3b96573ad1ec73cd50255edde29cc80df88 (diff)
Support Docs & Contrib
Diffstat (limited to 'contrib/soundex')
-rw-r--r--contrib/soundex/soundex.c83
-rw-r--r--contrib/soundex/soundex.sql57
2 files changed, 140 insertions, 0 deletions
diff --git a/contrib/soundex/soundex.c b/contrib/soundex/soundex.c
new file mode 100644
index 00000000000..2ce6ef510f6
--- /dev/null
+++ b/contrib/soundex/soundex.c
@@ -0,0 +1,83 @@
+/*****************************************************************************/
+/* soundex.c */
+/*****************************************************************************/
+
+#include <string.h>
+#include <stdio.h>
+#include "postgres.h" /* for char16, etc. */
+#include "utils/palloc.h" /* for palloc */
+#include "libpq-fe.h" /* for TUPLE */
+#include <stdio.h>
+#include <ctype.h>
+
+/* prototype for soundex function */
+char *soundex(char *instr, char *outstr);
+
+text *text_soundex(text *t)
+{
+ /* ABCDEFGHIJKLMNOPQRSTUVWXYZ */
+ char *table = "01230120022455012623010202";
+ int count = 0;
+ text *new_t;
+
+ char outstr[6+1]; /* max length of soundex is 6 */
+ char *instr;
+
+ /* make a null-terminated string */
+ instr=palloc(VARSIZE(t)+1);
+ memcpy(instr,VARDATA(t),VARSIZE(t)-VARHDRSZ);
+ instr[VARSIZE(t)-VARHDRSZ] = (char)0;
+
+ /* load soundex into outstr */
+ soundex(instr, outstr);
+
+ /* Now the outstr contains the soundex of instr */
+ /* copy outstr to new_t */
+ new_t = (text *) palloc(strlen(outstr)+VARHDRSZ);
+ memset(new_t, 0, strlen(outstr)+1);
+ VARSIZE(new_t) = strlen(outstr)+VARHDRSZ;
+ memcpy((void *) VARDATA(new_t),
+ (void *) outstr,
+ strlen(outstr));
+
+ /* free instr */
+ pfree(instr);
+
+ return(new_t);
+}
+
+char *soundex(char *instr, char *outstr)
+{ /* ABCDEFGHIJKLMNOPQRSTUVWXYZ */
+ char *table = "01230120022455012623010202";
+ int count = 0;
+
+ while(!isalpha(instr[0]) && instr[0])
+ ++instr;
+
+ if(!instr[0]) { /* Hey! Where'd the string go? */
+ outstr[0]=(char)0;
+ return outstr;
+ }
+
+ if(toupper(instr[0]) == 'P' && toupper(instr[1]) == 'H') {
+ instr[0] = 'F';
+ instr[1] = 'A';
+ }
+
+ *outstr++ = (char)toupper(*instr++);
+
+ while(*instr && count < 5) {
+ if(isalpha(*instr) && *instr != *(instr-1)) {
+ *outstr = table[toupper(instr[0]) - 'A'];
+ if(*outstr != '0') {
+ ++outstr;
+ ++count;
+ }
+ }
+ ++instr;
+ }
+
+ *outstr = '\0';
+ return(outstr);
+}
+
diff --git a/contrib/soundex/soundex.sql b/contrib/soundex/soundex.sql
new file mode 100644
index 00000000000..af8ea41fd2f
--- /dev/null
+++ b/contrib/soundex/soundex.sql
@@ -0,0 +1,57 @@
+--------------- soundex.sql:
+
+CREATE FUNCTION text_soundex(text) RETURNS text
+ AS '/usr/local/postgres/postgres95/src/funcs/soundex.so' LANGUAGE 'c';
+
+SELECT text_soundex('hello world!');
+
+CREATE TABLE s (nm text)\g
+
+insert into s values ('john')\g
+insert into s values ('joan')\g
+insert into s values ('wobbly')\g
+
+select * from s
+where text_soundex(nm) = text_soundex('john')\g
+
+select nm from s a, s b
+where text_soundex(a.nm) = text_soundex(b.nm)
+and a.oid <> b.oid\g
+
+CREATE FUNCTION text_sx_eq(text, text) RETURNS bool AS
+'select text_soundex($1) = text_soundex($2)'
+LANGUAGE 'sql'\g
+
+CREATE FUNCTION text_sx_lt(text,text) RETURNS bool AS
+'select text_soundex($1) < text_soundex($2)'
+LANGUAGE 'sql'\g
+
+CREATE FUNCTION text_sx_gt(text,text) RETURNS bool AS
+'select text_soundex($1) > text_soundex($2)'
+LANGUAGE 'sql';
+
+CREATE FUNCTION text_sx_le(text,text) RETURNS bool AS
+'select text_soundex($1) <= text_soundex($2)'
+LANGUAGE 'sql';
+
+CREATE FUNCTION text_sx_ge(text,text) RETURNS bool AS
+'select text_soundex($1) >= text_soundex($2)'
+LANGUAGE 'sql';
+
+CREATE FUNCTION text_sx_ne(text,text) RETURNS bool AS
+'select text_soundex($1) <> text_soundex($2)'
+LANGUAGE 'sql';
+
+DROP OPERATOR #= (text,text)\g
+
+CREATE OPERATOR #= (leftarg=text, rightarg=text, procedure=text_sx_eq,
+commutator=text_sx_eq)\g
+
+SELECT *
+FROM s
+WHERE text_sx_eq(nm,'john')\g
+
+SELECT *
+from s
+where s.nm #= 'john';
+