summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--contrib/multikey/Makefile29
-rw-r--r--contrib/multikey/create.sql15
-rw-r--r--contrib/multikey/multikey.c141
3 files changed, 185 insertions, 0 deletions
diff --git a/contrib/multikey/Makefile b/contrib/multikey/Makefile
new file mode 100644
index 00000000000..45ab0ab786f
--- /dev/null
+++ b/contrib/multikey/Makefile
@@ -0,0 +1,29 @@
+
+POSTSRC= /home/postgres/postgres95/src
+
+include $(POSTSRC)/Makefile.global
+include $(POSTSRC)/Makefile.custom
+
+CFLAGS= $(CFLAGS_SL) -Wall -Wmissing-prototypes -I$(POSTSRC)/include
+
+%.so: %.o
+ $(LD) -x -r -o $<.obj $<
+ @echo building shared object $@
+ @rm -f $@.pic
+ @${AR} cq $@.pic `lorder $<.obj | tsort`
+ ${RANLIB} $@.pic
+ @rm -f $@
+ $(LD) -x -Bshareable -Bforcearchive \
+ -o $@ $@.pic
+
+#
+# build dynamically-loaded object file
+#
+DLOBJS= multikey.so
+objdir= ./
+
+CLEANFILES+= $(DLOBJS)
+
+all:: $(DLOBJS)
+
+$(DLOBJS): multikey.c
diff --git a/contrib/multikey/create.sql b/contrib/multikey/create.sql
new file mode 100644
index 00000000000..3ccfec674ec
--- /dev/null
+++ b/contrib/multikey/create.sql
@@ -0,0 +1,15 @@
+drop function create_mki_2 (text, text, text, text);
+drop function create_mki_3 (text, text, text, text, text);
+drop function create_mki_4 (text, text, text, text, text, text);
+
+create function create_mki_2 (text, text, text, text)
+returns int4 as '/home/postgres/My/Btree/MULTIKEY/multikey.so'
+language 'c';
+
+create function create_mki_3 (text, text, text, text, text)
+returns int4 as '/home/postgres/My/Btree/MULTIKEY/multikey.so'
+language 'c';
+
+create function create_mki_4 (text, text, text, text, text, text)
+returns int4 as '/home/postgres/My/Btree/MULTIKEY/multikey.so'
+language 'c';
diff --git a/contrib/multikey/multikey.c b/contrib/multikey/multikey.c
new file mode 100644
index 00000000000..33bffdd55b8
--- /dev/null
+++ b/contrib/multikey/multikey.c
@@ -0,0 +1,141 @@
+/*-------------------------------------------------------------------------
+ *
+ * multikey.c--
+ * POSTGRES multikey indices create code.
+ *
+ *-------------------------------------------------------------------------
+ */
+#include <stdio.h>
+#include <string.h>
+
+#include <postgres.h>
+
+#include <storage/lmgr.h>
+#include <nodes/parsenodes.h>
+#include <commands/defrem.h>
+#include <utils/builtins.h>
+
+int4 create_mki_2 (struct varlena * index, struct varlena * rel,
+ struct varlena * a1, struct varlena * a2);
+int4 create_mki_3 (struct varlena * index, struct varlena * rel,
+ struct varlena * a1, struct varlena * a2,
+ struct varlena * a3);
+int4 create_mki_4 (struct varlena * index, struct varlena * rel,
+ struct varlena * a1, struct varlena * a2,
+ struct varlena * a3, struct varlena * a4);
+
+extern bool FastBuild;
+static bool BuildMode;
+
+
+int4 create_mki_2 (struct varlena * index, struct varlena * rel,
+ struct varlena * a1, struct varlena * a2)
+{
+ char * indexname = textout (index);
+ char * relname = textout (rel);
+ char * a1name = textout (a1);
+ char * a2name = textout (a2);
+ IndexElem *ie1 = makeNode(IndexElem);
+ IndexElem *ie2 = makeNode(IndexElem);
+ List *alist;
+
+ ie1->name = a1name;
+ ie1->args = NIL; ie1->class = NULL; ie1->tname = (TypeName*)NULL;
+ ie2->name = a2name;
+ ie2->args = NIL; ie2->class = NULL; ie2->tname = (TypeName*)NULL;
+
+ alist = lcons (ie2,NIL);
+ alist = lcons (ie1,alist);
+
+ BuildMode = FastBuild;
+ FastBuild = false; /* for the moment */
+
+ DefineIndex (relname, indexname, "btree", alist,
+ (List*) NULL, false, (Expr*)NULL, (List*)NULL);
+
+ FastBuild = BuildMode;
+
+ return (0);
+
+}
+
+
+int4 create_mki_3 (struct varlena * index, struct varlena * rel,
+ struct varlena * a1, struct varlena * a2,
+ struct varlena * a3)
+{
+ char * indexname = textout (index);
+ char * relname = textout (rel);
+ char * a1name = textout (a1);
+ char * a2name = textout (a2);
+ char * a3name = textout (a3);
+ IndexElem *ie1 = makeNode(IndexElem);
+ IndexElem *ie2 = makeNode(IndexElem);
+ IndexElem *ie3 = makeNode(IndexElem);
+ List *alist;
+
+ ie1->name = a1name;
+ ie1->args = NIL; ie1->class = NULL; ie1->tname = (TypeName*)NULL;
+ ie2->name = a2name;
+ ie2->args = NIL; ie2->class = NULL; ie2->tname = (TypeName*)NULL;
+ ie3->name = a3name;
+ ie3->args = NIL; ie3->class = NULL; ie3->tname = (TypeName*)NULL;
+
+ alist = lcons (ie3,NIL);
+ alist = lcons (ie2,alist);
+ alist = lcons (ie1,alist);
+
+ BuildMode = FastBuild;
+ FastBuild = false; /* for the moment */
+
+ DefineIndex (relname, indexname, "btree", alist,
+ (List*) NULL, false, (Expr*)NULL, (List*)NULL);
+
+ FastBuild = BuildMode;
+
+ return (0);
+
+}
+
+
+int4 create_mki_4 (struct varlena * index, struct varlena * rel,
+ struct varlena * a1, struct varlena * a2,
+ struct varlena * a3, struct varlena * a4)
+{
+ char * indexname = textout (index);
+ char * relname = textout (rel);
+ char * a1name = textout (a1);
+ char * a2name = textout (a2);
+ char * a3name = textout (a3);
+ char * a4name = textout (a4);
+ IndexElem *ie1 = makeNode(IndexElem);
+ IndexElem *ie2 = makeNode(IndexElem);
+ IndexElem *ie3 = makeNode(IndexElem);
+ IndexElem *ie4 = makeNode(IndexElem);
+ List *alist;
+
+ ie1->name = a1name;
+ ie1->args = NIL; ie1->class = NULL; ie1->tname = (TypeName*)NULL;
+ ie2->name = a2name;
+ ie2->args = NIL; ie2->class = NULL; ie2->tname = (TypeName*)NULL;
+ ie3->name = a3name;
+ ie3->args = NIL; ie3->class = NULL; ie3->tname = (TypeName*)NULL;
+ ie4->name = a4name;
+ ie4->args = NIL; ie4->class = NULL; ie4->tname = (TypeName*)NULL;
+
+ alist = lcons (ie4,NIL);
+ alist = lcons (ie3,alist);
+ alist = lcons (ie2,alist);
+ alist = lcons (ie1,alist);
+
+ BuildMode = FastBuild;
+ FastBuild = false; /* for the moment */
+
+ DefineIndex (relname, indexname, "btree", alist,
+ (List*) NULL, false, (Expr*)NULL, (List*)NULL);
+
+ FastBuild = BuildMode;
+
+ return (0);
+
+}