diff --git a/contrib/multikey/Makefile b/contrib/multikey/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..45ab0ab786f3a2d1581d80c4227987282c7571e8 --- /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 0000000000000000000000000000000000000000..3ccfec674ec9b15ab6f23566858630e4ceeebc14 --- /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 0000000000000000000000000000000000000000..33bffdd55b80fcaed5ee12aaad302c901f172336 --- /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); + +}