mirror of
https://github.com/postgres/postgres.git
synced 2025-06-11 20:28:21 +03:00
/contrib patch from Karel.
This commit is contained in:
@ -1,65 +1,53 @@
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# Makefile --
|
||||
# $Header: /cvsroot/pgsql/contrib/array/Attic/Makefile,v 1.8 2000/06/15 18:54:31 momjian Exp $
|
||||
#
|
||||
# Makefile for array iterator module.
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
|
||||
PGDIR = ../..
|
||||
SRCDIR = $(PGDIR)/src
|
||||
TOPDIR=../..
|
||||
|
||||
include $(SRCDIR)/Makefile.global
|
||||
include ../Makefile.global
|
||||
|
||||
NAME = array_iterator
|
||||
|
||||
PROGRAM =
|
||||
OBJS = $(NAME).o
|
||||
DOCS = $(NAME).doc
|
||||
SQLS = $(NAME).sql
|
||||
BINS =
|
||||
EXAMPLES=
|
||||
MODS = $(NAME)$(DLSUFFIX)
|
||||
|
||||
CFLAGS += -I. $(CFLAGS_SL)
|
||||
|
||||
MODNAME = array_iterator
|
||||
OTHER_CLEAN = $(SQLS)
|
||||
|
||||
SQLDEFS = $(MODNAME).sql
|
||||
|
||||
MODULE = $(MODNAME)$(DLSUFFIX)
|
||||
|
||||
MODDIR = $(LIBDIR)/modules
|
||||
|
||||
SQLDIR = $(LIBDIR)/sql
|
||||
|
||||
all: module sql
|
||||
|
||||
module: $(MODULE)
|
||||
|
||||
sql: $(SQLDEFS)
|
||||
|
||||
install: $(MODULE) $(SQLDEFS) $(MODDIR) $(SQLDIR)
|
||||
cp -p $(MODULE) $(MODDIR)/
|
||||
strip $(MODDIR)/$(MODULE)
|
||||
cp -p $(SQLDEFS) $(SQLDIR)/
|
||||
|
||||
install-doc:
|
||||
if [ -d "$(DOCDIR)" ]; then \
|
||||
cp -p *.doc $(DOCDIR); \
|
||||
else \
|
||||
cp -p *.doc $(SQLDIR); \
|
||||
fi
|
||||
|
||||
$(MODDIR):
|
||||
mkdir -p $@
|
||||
|
||||
$(SQLDIR):
|
||||
mkdir -p $@
|
||||
all: $(MODS) $(SQLS)
|
||||
|
||||
%.sql: %.sql.in
|
||||
sed "s|MODULE_PATHNAME|$(MODDIR)/$(MODULE)|" < $< > $@
|
||||
$(SED) "s|MODULE_PATHNAME|$(CONTRIB_MODDIR)/$@|" < $< > $@
|
||||
|
||||
.SUFFIXES: $(DLSUFFIX)
|
||||
install: install_doc install_sql install_mod
|
||||
|
||||
install_doc:
|
||||
for inst_file in $(DOCS); do \
|
||||
$(INSTALL) $(INSTL_LIB_OPTS) $$inst_file $(CONTRIB_DOCDIR); \
|
||||
done
|
||||
|
||||
install_sql:
|
||||
for inst_file in $(SQLS); do \
|
||||
$(INSTALL) $(INSTL_LIB_OPTS) $$inst_file $(CONTRIB_SQLDIR); \
|
||||
done
|
||||
|
||||
install_mod:
|
||||
for inst_file in $(MODS); do \
|
||||
$(INSTALL) $(INSTL_SHLIB_OPTS) $$inst_file $(CONTRIB_MODDIR); \
|
||||
done
|
||||
|
||||
%$(DLSUFFIX): %.c
|
||||
$(CC) $(CFLAGS) -shared -o $@ $<
|
||||
|
||||
depend dep:
|
||||
$(CC) -MM $(CFLAGS) *.c >depend
|
||||
$(CC) -MM -MG $(CFLAGS) *.c > depend
|
||||
|
||||
clean:
|
||||
rm -f *~ $(MODULE) $(MODNAME).sql
|
||||
$(RM) *~ $(OBJS) $(MODS) $(PROGRAM) depend $(OTHER_CLEAN) core log
|
||||
|
||||
ifeq (depend,$(wildcard depend))
|
||||
include depend
|
||||
|
49
contrib/array/README
Normal file
49
contrib/array/README
Normal file
@ -0,0 +1,49 @@
|
||||
Array iterator functions, by Massimo Dal Zotto <dz@cs.unitn.it>
|
||||
Copyright (C) 1999, Massimo Dal Zotto <dz@cs.unitn.it>
|
||||
|
||||
This software is distributed under the GNU General Public License
|
||||
either version 2, or (at your option) any later version.
|
||||
|
||||
|
||||
This loadable module defines a new class of functions which take
|
||||
an array and a scalar value, iterate a scalar operator over the
|
||||
elements of the array and the value, and compute a result as
|
||||
the logical OR or AND of the iteration results.
|
||||
For example array_int4eq returns true if some of the elements
|
||||
of an array of int4 is equal to the given value:
|
||||
|
||||
array_int4eq({1,2,3}, 1) --> true
|
||||
array_int4eq({1,2,3}, 4) --> false
|
||||
|
||||
If we have defined T array types and O scalar operators we can
|
||||
define T x O x 2 array functions, each of them has a name like
|
||||
"array_[all_]<basetype><operation>" and takes an array of type T
|
||||
iterating the operator O over all the elements. Note however
|
||||
that some of the possible combination are invalid, for example
|
||||
the array_int4_like because there is no like operator for int4.
|
||||
|
||||
We can then define new operators based on these functions and use
|
||||
them to write queries with qualification clauses based on the
|
||||
values of some of the elements of an array.
|
||||
For example to select rows having some or all element of an array
|
||||
attribute equal to a given value or matching a regular expression:
|
||||
|
||||
create table t(id int4[], txt text[]);
|
||||
|
||||
-- select tuples with some id element equal to 123
|
||||
select * from t where t.id *= 123;
|
||||
|
||||
-- select tuples with some txt element matching '[a-z]'
|
||||
select * from t where t.txt *~ '[a-z]';
|
||||
|
||||
-- select tuples with all txt elements matching '^[A-Z]'
|
||||
select * from t where t.txt[1:3] **~ '^[A-Z]';
|
||||
|
||||
The scheme is quite general, each operator which operates on a base type
|
||||
can be iterated over the elements of an array. It seem to work well but
|
||||
defining each new operators requires writing a different C function.
|
||||
Furthermore in each function there are two hardcoded OIDs which reference
|
||||
a base type and a procedure. Not very portable. Can anyone suggest a
|
||||
better and more portable way to do it ?
|
||||
|
||||
See also array_iterator.sql for an example on how to use this module.
|
Reference in New Issue
Block a user