mirror of
https://github.com/postgres/postgres.git
synced 2025-06-14 18:42:34 +03:00
Move test modules from contrib to src/test/modules
This is advance preparation for introducing even more test modules; the easy solution is to add them to contrib, but that's bloated enough that it seems a good time to think of something different. Moved modules are dummy_seclabel, test_shm_mq, test_parser and worker_spi. (test_decoding was also a candidate, but there was too much opposition to moving that one. We can always reconsider later.)
This commit is contained in:
@ -16,7 +16,6 @@ SUBDIRS = \
|
|||||||
dblink \
|
dblink \
|
||||||
dict_int \
|
dict_int \
|
||||||
dict_xsyn \
|
dict_xsyn \
|
||||||
dummy_seclabel \
|
|
||||||
earthdistance \
|
earthdistance \
|
||||||
file_fdw \
|
file_fdw \
|
||||||
fuzzystrmatch \
|
fuzzystrmatch \
|
||||||
@ -51,12 +50,9 @@ SUBDIRS = \
|
|||||||
tablefunc \
|
tablefunc \
|
||||||
tcn \
|
tcn \
|
||||||
test_decoding \
|
test_decoding \
|
||||||
test_parser \
|
|
||||||
test_shm_mq \
|
|
||||||
tsearch2 \
|
tsearch2 \
|
||||||
unaccent \
|
unaccent \
|
||||||
vacuumlo \
|
vacuumlo
|
||||||
worker_spi
|
|
||||||
|
|
||||||
ifeq ($(with_openssl),yes)
|
ifeq ($(with_openssl),yes)
|
||||||
SUBDIRS += sslinfo
|
SUBDIRS += sslinfo
|
||||||
|
@ -113,7 +113,6 @@ CREATE EXTENSION <replaceable>module_name</> FROM unpackaged;
|
|||||||
&dblink;
|
&dblink;
|
||||||
&dict-int;
|
&dict-int;
|
||||||
&dict-xsyn;
|
&dict-xsyn;
|
||||||
&dummy-seclabel;
|
|
||||||
&earthdistance;
|
&earthdistance;
|
||||||
&file-fdw;
|
&file-fdw;
|
||||||
&fuzzystrmatch;
|
&fuzzystrmatch;
|
||||||
@ -141,8 +140,6 @@ CREATE EXTENSION <replaceable>module_name</> FROM unpackaged;
|
|||||||
&tablefunc;
|
&tablefunc;
|
||||||
&tcn;
|
&tcn;
|
||||||
&test-decoding;
|
&test-decoding;
|
||||||
&test-parser;
|
|
||||||
&test-shm-mq;
|
|
||||||
&tsearch2;
|
&tsearch2;
|
||||||
&unaccent;
|
&unaccent;
|
||||||
&uuid-ossp;
|
&uuid-ossp;
|
||||||
|
@ -1,74 +0,0 @@
|
|||||||
<!-- doc/src/sgml/dummy-seclabel.sgml -->
|
|
||||||
|
|
||||||
<sect1 id="dummy-seclabel" xreflabel="dummy_seclabel">
|
|
||||||
<title>dummy_seclabel</title>
|
|
||||||
|
|
||||||
<indexterm zone="dummy-seclabel">
|
|
||||||
<primary>dummy_seclabel</primary>
|
|
||||||
</indexterm>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
The <filename>dummy_seclabel</> module exists only to support regression
|
|
||||||
testing of the <command>SECURITY LABEL</> statement. It is not intended
|
|
||||||
to be used in production.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<sect2>
|
|
||||||
<title>Rationale</title>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
The <command>SECURITY LABEL</> statement allows the user to assign security
|
|
||||||
labels to database objects; however, security labels can only be assigned
|
|
||||||
when specifically allowed by a loadable module, so this module is provided
|
|
||||||
to allow proper regression testing.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
Security label providers intended to be used in production will typically be
|
|
||||||
dependent on a platform-specific feature such as
|
|
||||||
<productname>SE-Linux</productname>. This module is platform-independent,
|
|
||||||
and therefore better-suited to regression testing.
|
|
||||||
</para>
|
|
||||||
</sect2>
|
|
||||||
|
|
||||||
<sect2>
|
|
||||||
<title>Usage</title>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
Here's a simple example of usage:
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<programlisting>
|
|
||||||
# postgresql.conf
|
|
||||||
shared_preload_libraries = 'dummy_seclabel'
|
|
||||||
</programlisting>
|
|
||||||
|
|
||||||
<programlisting>
|
|
||||||
postgres=# CREATE TABLE t (a int, b text);
|
|
||||||
CREATE TABLE
|
|
||||||
postgres=# SECURITY LABEL ON TABLE t IS 'classified';
|
|
||||||
SECURITY LABEL
|
|
||||||
</programlisting>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
The <filename>dummy_seclabel</> module provides only four hardcoded
|
|
||||||
labels: <literal>unclassified</>, <literal>classified</>,
|
|
||||||
<literal>secret</>, and <literal>top secret</>.
|
|
||||||
It does not allow any other strings as security labels.
|
|
||||||
</para>
|
|
||||||
<para>
|
|
||||||
These labels are not used to enforce access controls. They are only used
|
|
||||||
to check whether the <command>SECURITY LABEL</> statement works as expected,
|
|
||||||
or not.
|
|
||||||
</para>
|
|
||||||
</sect2>
|
|
||||||
|
|
||||||
<sect2>
|
|
||||||
<title>Author</title>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
KaiGai Kohei <email>kaigai@ak.jp.nec.com</email>
|
|
||||||
</para>
|
|
||||||
</sect2>
|
|
||||||
|
|
||||||
</sect1>
|
|
@ -207,7 +207,7 @@ SECURITY LABEL FOR selinux ON TABLE mytable IS 'system_u:object_r:sepgsql_table_
|
|||||||
<title>See Also</title>
|
<title>See Also</title>
|
||||||
<simplelist type="inline">
|
<simplelist type="inline">
|
||||||
<member><xref linkend="sepgsql"></member>
|
<member><xref linkend="sepgsql"></member>
|
||||||
<member><xref linkend="dummy-seclabel"></member>
|
<member><filename>src/test/modules/dummy_seclabel</filename></member>
|
||||||
</simplelist>
|
</simplelist>
|
||||||
</refsect1>
|
</refsect1>
|
||||||
</refentry>
|
</refentry>
|
||||||
|
@ -8062,7 +8062,7 @@ SELECT * FROM places ORDER BY location <-> point '(101,456)' LIMIT 10;
|
|||||||
|
|
||||||
<listitem>
|
<listitem>
|
||||||
<para>
|
<para>
|
||||||
Add <link linkend="dummy-seclabel"><filename>dummy_seclabel</></link>
|
Add <filename>dummy_seclabel</>
|
||||||
contrib module (KaiGai Kohei)
|
contrib module (KaiGai Kohei)
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
|
@ -503,7 +503,7 @@
|
|||||||
</para>
|
</para>
|
||||||
|
|
||||||
<para>
|
<para>
|
||||||
This feature is illustrated in <xref linkend="test-shm-mq">.
|
This feature is illustrated in <filename>contrib/test_shm_mq</filename>.
|
||||||
</para>
|
</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
|
|
||||||
|
@ -1,90 +0,0 @@
|
|||||||
<!-- doc/src/sgml/test-parser.sgml -->
|
|
||||||
|
|
||||||
<sect1 id="test-parser" xreflabel="test_parser">
|
|
||||||
<title>test_parser</title>
|
|
||||||
|
|
||||||
<indexterm zone="test-parser">
|
|
||||||
<primary>test_parser</primary>
|
|
||||||
</indexterm>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
<filename>test_parser</> is an example of a custom parser for full-text
|
|
||||||
search. It doesn't do anything especially useful, but can serve as
|
|
||||||
a starting point for developing your own parser.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
<filename>test_parser</> recognizes words separated by white space,
|
|
||||||
and returns just two token types:
|
|
||||||
|
|
||||||
<programlisting>
|
|
||||||
mydb=# SELECT * FROM ts_token_type('testparser');
|
|
||||||
tokid | alias | description
|
|
||||||
-------+-------+---------------
|
|
||||||
3 | word | Word
|
|
||||||
12 | blank | Space symbols
|
|
||||||
(2 rows)
|
|
||||||
</programlisting>
|
|
||||||
|
|
||||||
These token numbers have been chosen to be compatible with the default
|
|
||||||
parser's numbering. This allows us to use its <function>headline()</>
|
|
||||||
function, thus keeping the example simple.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<sect2>
|
|
||||||
<title>Usage</title>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
Installing the <literal>test_parser</> extension creates a text search
|
|
||||||
parser <literal>testparser</>. It has no user-configurable parameters.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
You can test the parser with, for example,
|
|
||||||
|
|
||||||
<programlisting>
|
|
||||||
mydb=# SELECT * FROM ts_parse('testparser', 'That''s my first own parser');
|
|
||||||
tokid | token
|
|
||||||
-------+--------
|
|
||||||
3 | That's
|
|
||||||
12 |
|
|
||||||
3 | my
|
|
||||||
12 |
|
|
||||||
3 | first
|
|
||||||
12 |
|
|
||||||
3 | own
|
|
||||||
12 |
|
|
||||||
3 | parser
|
|
||||||
</programlisting>
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
Real-world use requires setting up a text search configuration
|
|
||||||
that uses the parser. For example,
|
|
||||||
|
|
||||||
<programlisting>
|
|
||||||
mydb=# CREATE TEXT SEARCH CONFIGURATION testcfg ( PARSER = testparser );
|
|
||||||
CREATE TEXT SEARCH CONFIGURATION
|
|
||||||
|
|
||||||
mydb=# ALTER TEXT SEARCH CONFIGURATION testcfg
|
|
||||||
mydb-# ADD MAPPING FOR word WITH english_stem;
|
|
||||||
ALTER TEXT SEARCH CONFIGURATION
|
|
||||||
|
|
||||||
mydb=# SELECT to_tsvector('testcfg', 'That''s my first own parser');
|
|
||||||
to_tsvector
|
|
||||||
-------------------------------
|
|
||||||
'that':1 'first':3 'parser':5
|
|
||||||
(1 row)
|
|
||||||
|
|
||||||
mydb=# SELECT ts_headline('testcfg', 'Supernovae stars are the brightest phenomena in galaxies',
|
|
||||||
mydb(# to_tsquery('testcfg', 'star'));
|
|
||||||
ts_headline
|
|
||||||
-----------------------------------------------------------------
|
|
||||||
Supernovae <b>stars</b> are the brightest phenomena in galaxies
|
|
||||||
(1 row)
|
|
||||||
</programlisting>
|
|
||||||
</para>
|
|
||||||
|
|
||||||
</sect2>
|
|
||||||
|
|
||||||
</sect1>
|
|
@ -1,71 +0,0 @@
|
|||||||
<!-- doc/src/sgml/test-shm-mq.sgml -->
|
|
||||||
|
|
||||||
<sect1 id="test-shm-mq" xreflabel="test_shm_mq">
|
|
||||||
<title>test_shm_mq</title>
|
|
||||||
|
|
||||||
<indexterm zone="test-shm-mq">
|
|
||||||
<primary>test_shm_mq</primary>
|
|
||||||
</indexterm>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
<filename>test_shm_mq</> is an example of how to use dynamic shared memory
|
|
||||||
and the shared memory message queue facilities to coordinate a user backend
|
|
||||||
with the efforts of one or more background workers. It is not intended to
|
|
||||||
do anything useful on its own; rather, it is a demonstration of how these
|
|
||||||
facilities can be used, and a unit test of those facilities.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
The function is this extension send the same message repeatedly through
|
|
||||||
a loop of processes. The message payload, the size of the message queue
|
|
||||||
through which it is sent, and the number of processes in the loop are
|
|
||||||
configurable. At the end, the message may be verified to ensure that it
|
|
||||||
has not been corrupted in transmission.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<sect2>
|
|
||||||
<title>Functions</title>
|
|
||||||
|
|
||||||
<synopsis>
|
|
||||||
test_shm_mq(queue_size int8, message text,
|
|
||||||
repeat_count int4 default 1, num_workers int4 default 1)
|
|
||||||
RETURNS void
|
|
||||||
</synopsis>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
This function sends and receives messages synchronously. The user
|
|
||||||
backend sends the provided message to the first background worker using
|
|
||||||
a message queue of the given size. The first background worker sends
|
|
||||||
the message to the second background worker, if the number of workers
|
|
||||||
is greater than one, and so forth. Eventually, the last background
|
|
||||||
worker sends the message back to the user backend. If the repeat count
|
|
||||||
is greater than one, the user backend then sends the message back to
|
|
||||||
the first worker. Once the message has been sent and received by all
|
|
||||||
the coordinating processes a number of times equal to the repeat count,
|
|
||||||
the user backend verifies that the message finally received matches the
|
|
||||||
one originally sent and throws an error if not.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<synopsis>
|
|
||||||
test_shm_mq_pipelined(queue_size int8, message text,
|
|
||||||
repeat_count int4 default 1, num_workers int4 default 1,
|
|
||||||
verify bool default true)
|
|
||||||
RETURNS void
|
|
||||||
</synopsis>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
This function sends the same message multiple times, as specified by the
|
|
||||||
repeat count, to the first background worker using a queue of the given
|
|
||||||
size. These messages are then forwarded to each background worker in
|
|
||||||
turn, in each case using a queue of the given size. Finally, the last
|
|
||||||
background worker sends the messages back to the user backend. The user
|
|
||||||
backend uses non-blocking sends and receives, so that it may begin receiving
|
|
||||||
copies of the message before it has finished sending all copies of the
|
|
||||||
message. The <literal>verify</> argument controls whether or not the
|
|
||||||
received copies are checked against the message that was sent. (This
|
|
||||||
takes nontrivial time so it may be useful to disable it for benchmarking
|
|
||||||
purposes.)
|
|
||||||
</para>
|
|
||||||
|
|
||||||
</sect2>
|
|
||||||
</sect1>
|
|
@ -12,6 +12,14 @@ subdir = src/test
|
|||||||
top_builddir = ../..
|
top_builddir = ../..
|
||||||
include $(top_builddir)/src/Makefile.global
|
include $(top_builddir)/src/Makefile.global
|
||||||
|
|
||||||
SUBDIRS = regress isolation
|
SUBDIRS = regress isolation modules
|
||||||
|
|
||||||
$(recurse)
|
# We want to recurse to all subdirs for all standard targets, except that
|
||||||
|
# installcheck and install should not recurse into the subdirectory "modules".
|
||||||
|
|
||||||
|
recurse_alldirs_targets := $(filter-out installcheck install, $(standard_targets))
|
||||||
|
installable_dirs := $(filter-out modules, $(SUBDIRS))
|
||||||
|
|
||||||
|
$(call recurse,$(recurse_alldirs_targets))
|
||||||
|
$(call recurse,installcheck, $(installable_dirs))
|
||||||
|
$(call recurse,install, $(installable_dirs))
|
||||||
|
13
src/test/modules/Makefile
Normal file
13
src/test/modules/Makefile
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
# src/test/modules/Makefile
|
||||||
|
|
||||||
|
subdir = src/test/modules
|
||||||
|
top_builddir = ../../..
|
||||||
|
include $(top_builddir)/src/Makefile.global
|
||||||
|
|
||||||
|
SUBDIRS = \
|
||||||
|
worker_spi \
|
||||||
|
dummy_seclabel \
|
||||||
|
test_shm_mq \
|
||||||
|
test_parser
|
||||||
|
|
||||||
|
$(recurse)
|
@ -1,4 +1,4 @@
|
|||||||
# contrib/dummy_seclabel/Makefile
|
# src/test/modules/dummy_seclabel/Makefile
|
||||||
|
|
||||||
MODULES = dummy_seclabel
|
MODULES = dummy_seclabel
|
||||||
PGFILEDESC = "dummy_seclabel - regression testing of the SECURITY LABEL statement"
|
PGFILEDESC = "dummy_seclabel - regression testing of the SECURITY LABEL statement"
|
||||||
@ -8,8 +8,8 @@ PG_CONFIG = pg_config
|
|||||||
PGXS := $(shell $(PG_CONFIG) --pgxs)
|
PGXS := $(shell $(PG_CONFIG) --pgxs)
|
||||||
include $(PGXS)
|
include $(PGXS)
|
||||||
else
|
else
|
||||||
subdir = contrib/dummy_seclabel
|
subdir = src/test/modules/dummy_seclabel
|
||||||
top_builddir = ../..
|
top_builddir = ../../../..
|
||||||
include $(top_builddir)/src/Makefile.global
|
include $(top_builddir)/src/Makefile.global
|
||||||
include $(top_srcdir)/contrib/contrib-global.mk
|
include $(top_srcdir)/contrib/contrib-global.mk
|
||||||
endif
|
endif
|
43
src/test/modules/dummy_seclabel/README
Normal file
43
src/test/modules/dummy_seclabel/README
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
The dummy_seclabel module exists only to support regression
|
||||||
|
testing of the SECURITY LABEL statement. It is not intended
|
||||||
|
to be used in production.
|
||||||
|
|
||||||
|
Rationale
|
||||||
|
=========
|
||||||
|
|
||||||
|
The SECURITY LABEL statement allows the user to assign security
|
||||||
|
labels to database objects; however, security labels can only be assigned
|
||||||
|
when specifically allowed by a loadable module, so this module is provided
|
||||||
|
to allow proper regression testing.
|
||||||
|
|
||||||
|
Security label providers intended to be used in production will typically be
|
||||||
|
dependent on a platform-specific feature such as
|
||||||
|
SE-Linux. This module is platform-independent,
|
||||||
|
and therefore better-suited to regression testing.
|
||||||
|
|
||||||
|
Usage
|
||||||
|
=====
|
||||||
|
|
||||||
|
Here's a simple example of usage:
|
||||||
|
|
||||||
|
# postgresql.conf
|
||||||
|
shared_preload_libraries = 'dummy_seclabel'
|
||||||
|
|
||||||
|
postgres=# CREATE TABLE t (a int, b text);
|
||||||
|
CREATE TABLE
|
||||||
|
postgres=# SECURITY LABEL ON TABLE t IS 'classified';
|
||||||
|
SECURITY LABEL
|
||||||
|
|
||||||
|
The dummy_seclabel module provides only four hardcoded
|
||||||
|
labels: unclassified, classified,
|
||||||
|
secret, and top secret.
|
||||||
|
It does not allow any other strings as security labels.
|
||||||
|
|
||||||
|
These labels are not used to enforce access controls. They are only used
|
||||||
|
to check whether the SECURITY LABEL statement works as expected,
|
||||||
|
or not.
|
||||||
|
|
||||||
|
Author
|
||||||
|
======
|
||||||
|
|
||||||
|
KaiGai Kohei <kaigai@ak.jp.nec.com>
|
@ -1,4 +1,4 @@
|
|||||||
# contrib/test_parser/Makefile
|
# src/test/modules/test_parser/Makefile
|
||||||
|
|
||||||
MODULE_big = test_parser
|
MODULE_big = test_parser
|
||||||
OBJS = test_parser.o $(WIN32RES)
|
OBJS = test_parser.o $(WIN32RES)
|
||||||
@ -14,8 +14,8 @@ PG_CONFIG = pg_config
|
|||||||
PGXS := $(shell $(PG_CONFIG) --pgxs)
|
PGXS := $(shell $(PG_CONFIG) --pgxs)
|
||||||
include $(PGXS)
|
include $(PGXS)
|
||||||
else
|
else
|
||||||
subdir = contrib/test_parser
|
subdir = src/test/modules/test_parser
|
||||||
top_builddir = ../..
|
top_builddir = ../../../..
|
||||||
include $(top_builddir)/src/Makefile.global
|
include $(top_builddir)/src/Makefile.global
|
||||||
include $(top_srcdir)/contrib/contrib-global.mk
|
include $(top_srcdir)/contrib/contrib-global.mk
|
||||||
endif
|
endif
|
61
src/test/modules/test_parser/README
Normal file
61
src/test/modules/test_parser/README
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
test_parser is an example of a custom parser for full-text
|
||||||
|
search. It doesn't do anything especially useful, but can serve as
|
||||||
|
a starting point for developing your own parser.
|
||||||
|
|
||||||
|
test_parser recognizes words separated by white space,
|
||||||
|
and returns just two token types:
|
||||||
|
|
||||||
|
mydb=# SELECT * FROM ts_token_type('testparser');
|
||||||
|
tokid | alias | description
|
||||||
|
-------+-------+---------------
|
||||||
|
3 | word | Word
|
||||||
|
12 | blank | Space symbols
|
||||||
|
(2 rows)
|
||||||
|
|
||||||
|
These token numbers have been chosen to be compatible with the default
|
||||||
|
parser's numbering. This allows us to use its headline()
|
||||||
|
function, thus keeping the example simple.
|
||||||
|
|
||||||
|
Usage
|
||||||
|
=====
|
||||||
|
|
||||||
|
Installing the test_parser extension creates a text search
|
||||||
|
parser testparser. It has no user-configurable parameters.
|
||||||
|
|
||||||
|
You can test the parser with, for example,
|
||||||
|
|
||||||
|
mydb=# SELECT * FROM ts_parse('testparser', 'That''s my first own parser');
|
||||||
|
tokid | token
|
||||||
|
-------+--------
|
||||||
|
3 | That's
|
||||||
|
12 |
|
||||||
|
3 | my
|
||||||
|
12 |
|
||||||
|
3 | first
|
||||||
|
12 |
|
||||||
|
3 | own
|
||||||
|
12 |
|
||||||
|
3 | parser
|
||||||
|
|
||||||
|
Real-world use requires setting up a text search configuration
|
||||||
|
that uses the parser. For example,
|
||||||
|
|
||||||
|
mydb=# CREATE TEXT SEARCH CONFIGURATION testcfg ( PARSER = testparser );
|
||||||
|
CREATE TEXT SEARCH CONFIGURATION
|
||||||
|
|
||||||
|
mydb=# ALTER TEXT SEARCH CONFIGURATION testcfg
|
||||||
|
mydb-# ADD MAPPING FOR word WITH english_stem;
|
||||||
|
ALTER TEXT SEARCH CONFIGURATION
|
||||||
|
|
||||||
|
mydb=# SELECT to_tsvector('testcfg', 'That''s my first own parser');
|
||||||
|
to_tsvector
|
||||||
|
-------------------------------
|
||||||
|
'that':1 'first':3 'parser':5
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
mydb=# SELECT ts_headline('testcfg', 'Supernovae stars are the brightest phenomena in galaxies',
|
||||||
|
mydb(# to_tsquery('testcfg', 'star'));
|
||||||
|
ts_headline
|
||||||
|
-----------------------------------------------------------------
|
||||||
|
Supernovae <b>stars</b> are the brightest phenomena in galaxies
|
||||||
|
(1 row)
|
@ -1,4 +1,4 @@
|
|||||||
/* contrib/test_parser/test_parser--1.0.sql */
|
/* src/test/modules/test_parser/test_parser--1.0.sql */
|
||||||
|
|
||||||
-- complain if script is sourced in psql, rather than via CREATE EXTENSION
|
-- complain if script is sourced in psql, rather than via CREATE EXTENSION
|
||||||
\echo Use "CREATE EXTENSION test_parser" to load this file. \quit
|
\echo Use "CREATE EXTENSION test_parser" to load this file. \quit
|
@ -1,4 +1,4 @@
|
|||||||
/* contrib/test_parser/test_parser--unpackaged--1.0.sql */
|
/* src/test/modules/test_parser/test_parser--unpackaged--1.0.sql */
|
||||||
|
|
||||||
-- complain if script is sourced in psql, rather than via CREATE EXTENSION
|
-- complain if script is sourced in psql, rather than via CREATE EXTENSION
|
||||||
\echo Use "CREATE EXTENSION test_parser FROM unpackaged" to load this file. \quit
|
\echo Use "CREATE EXTENSION test_parser FROM unpackaged" to load this file. \quit
|
@ -6,7 +6,7 @@
|
|||||||
* Copyright (c) 2007-2014, PostgreSQL Global Development Group
|
* Copyright (c) 2007-2014, PostgreSQL Global Development Group
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* contrib/test_parser/test_parser.c
|
* src/test/modules/test_parser/test_parser.c
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
@ -1,4 +1,4 @@
|
|||||||
# contrib/test_shm_mq/Makefile
|
# src/test/modules/test_shm_mq/Makefile
|
||||||
|
|
||||||
MODULE_big = test_shm_mq
|
MODULE_big = test_shm_mq
|
||||||
OBJS = test.o setup.o worker.o $(WIN32RES)
|
OBJS = test.o setup.o worker.o $(WIN32RES)
|
||||||
@ -14,8 +14,8 @@ PG_CONFIG = pg_config
|
|||||||
PGXS := $(shell $(PG_CONFIG) --pgxs)
|
PGXS := $(shell $(PG_CONFIG) --pgxs)
|
||||||
include $(PGXS)
|
include $(PGXS)
|
||||||
else
|
else
|
||||||
subdir = contrib/test_shm_mq
|
subdir = src/test/modules/test_shm_mq
|
||||||
top_builddir = ../..
|
top_builddir = ../../../..
|
||||||
include $(top_builddir)/src/Makefile.global
|
include $(top_builddir)/src/Makefile.global
|
||||||
include $(top_srcdir)/contrib/contrib-global.mk
|
include $(top_srcdir)/contrib/contrib-global.mk
|
||||||
endif
|
endif
|
49
src/test/modules/test_shm_mq/README
Normal file
49
src/test/modules/test_shm_mq/README
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
test_shm_mq is an example of how to use dynamic shared memory
|
||||||
|
and the shared memory message queue facilities to coordinate a user backend
|
||||||
|
with the efforts of one or more background workers. It is not intended to
|
||||||
|
do anything useful on its own; rather, it is a demonstration of how these
|
||||||
|
facilities can be used, and a unit test of those facilities.
|
||||||
|
|
||||||
|
The function is this extension send the same message repeatedly through
|
||||||
|
a loop of processes. The message payload, the size of the message queue
|
||||||
|
through which it is sent, and the number of processes in the loop are
|
||||||
|
configurable. At the end, the message may be verified to ensure that it
|
||||||
|
has not been corrupted in transmission.
|
||||||
|
|
||||||
|
Functions
|
||||||
|
=========
|
||||||
|
|
||||||
|
|
||||||
|
test_shm_mq(queue_size int8, message text,
|
||||||
|
repeat_count int4 default 1, num_workers int4 default 1)
|
||||||
|
RETURNS void
|
||||||
|
|
||||||
|
This function sends and receives messages synchronously. The user
|
||||||
|
backend sends the provided message to the first background worker using
|
||||||
|
a message queue of the given size. The first background worker sends
|
||||||
|
the message to the second background worker, if the number of workers
|
||||||
|
is greater than one, and so forth. Eventually, the last background
|
||||||
|
worker sends the message back to the user backend. If the repeat count
|
||||||
|
is greater than one, the user backend then sends the message back to
|
||||||
|
the first worker. Once the message has been sent and received by all
|
||||||
|
the coordinating processes a number of times equal to the repeat count,
|
||||||
|
the user backend verifies that the message finally received matches the
|
||||||
|
one originally sent and throws an error if not.
|
||||||
|
|
||||||
|
|
||||||
|
test_shm_mq_pipelined(queue_size int8, message text,
|
||||||
|
repeat_count int4 default 1, num_workers int4 default 1,
|
||||||
|
verify bool default true)
|
||||||
|
RETURNS void
|
||||||
|
|
||||||
|
This function sends the same message multiple times, as specified by the
|
||||||
|
repeat count, to the first background worker using a queue of the given
|
||||||
|
size. These messages are then forwarded to each background worker in
|
||||||
|
turn, in each case using a queue of the given size. Finally, the last
|
||||||
|
background worker sends the messages back to the user backend. The user
|
||||||
|
backend uses non-blocking sends and receives, so that it may begin receiving
|
||||||
|
copies of the message before it has finished sending all copies of the
|
||||||
|
message. The 'verify' argument controls whether or not the
|
||||||
|
received copies are checked against the message that was sent. (This
|
||||||
|
takes nontrivial time so it may be useful to disable it for benchmarking
|
||||||
|
purposes.)
|
@ -5,10 +5,10 @@
|
|||||||
* number of background workers for shared memory message queue
|
* number of background workers for shared memory message queue
|
||||||
* testing.
|
* testing.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2013, PostgreSQL Global Development Group
|
* Copyright (C) 2013-2014, PostgreSQL Global Development Group
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* contrib/test_shm_mq/setup.c
|
* src/test/modules/test_shm_mq/setup.c
|
||||||
*
|
*
|
||||||
* -------------------------------------------------------------------------
|
* -------------------------------------------------------------------------
|
||||||
*/
|
*/
|
@ -3,10 +3,10 @@
|
|||||||
* test.c
|
* test.c
|
||||||
* Test harness code for shared memory message queues.
|
* Test harness code for shared memory message queues.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2013, PostgreSQL Global Development Group
|
* Copyright (C) 2013-2014, PostgreSQL Global Development Group
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* contrib/test_shm_mq/test.c
|
* src/test/modules/test_shm_mq/test.c
|
||||||
*
|
*
|
||||||
* -------------------------------------------------------------------------
|
* -------------------------------------------------------------------------
|
||||||
*/
|
*/
|
@ -1,4 +1,4 @@
|
|||||||
/* contrib/test_shm_mq/test_shm_mq--1.0.sql */
|
/* src/test/modules/test_shm_mq/test_shm_mq--1.0.sql */
|
||||||
|
|
||||||
-- complain if script is sourced in psql, rather than via CREATE EXTENSION
|
-- complain if script is sourced in psql, rather than via CREATE EXTENSION
|
||||||
\echo Use "CREATE EXTENSION test_shm_mq" to load this file. \quit
|
\echo Use "CREATE EXTENSION test_shm_mq" to load this file. \quit
|
@ -6,7 +6,7 @@
|
|||||||
* Copyright (C) 2013, PostgreSQL Global Development Group
|
* Copyright (C) 2013, PostgreSQL Global Development Group
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* contrib/test_shm_mq/test_shm_mq.h
|
* src/test/modules/test_shm_mq/test_shm_mq.h
|
||||||
*
|
*
|
||||||
* -------------------------------------------------------------------------
|
* -------------------------------------------------------------------------
|
||||||
*/
|
*/
|
@ -9,10 +9,10 @@
|
|||||||
* but it should be possible to use much of the control logic just
|
* but it should be possible to use much of the control logic just
|
||||||
* as presented here.
|
* as presented here.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2013, PostgreSQL Global Development Group
|
* Copyright (C) 2013-2014, PostgreSQL Global Development Group
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* contrib/test_shm_mq/worker.c
|
* src/test/modules/test_shm_mq/worker.c
|
||||||
*
|
*
|
||||||
* -------------------------------------------------------------------------
|
* -------------------------------------------------------------------------
|
||||||
*/
|
*/
|
@ -1,4 +1,4 @@
|
|||||||
# contrib/worker_spi/Makefile
|
# src/test/modules/worker_spi/Makefile
|
||||||
|
|
||||||
MODULES = worker_spi
|
MODULES = worker_spi
|
||||||
|
|
||||||
@ -11,8 +11,8 @@ PG_CONFIG = pg_config
|
|||||||
PGXS := $(shell $(PG_CONFIG) --pgxs)
|
PGXS := $(shell $(PG_CONFIG) --pgxs)
|
||||||
include $(PGXS)
|
include $(PGXS)
|
||||||
else
|
else
|
||||||
subdir = contrib/worker_spi
|
subdir = src/test/modules/worker_spi
|
||||||
top_builddir = ../..
|
top_builddir = ../../../..
|
||||||
include $(top_builddir)/src/Makefile.global
|
include $(top_builddir)/src/Makefile.global
|
||||||
include $(top_srcdir)/contrib/contrib-global.mk
|
include $(top_srcdir)/contrib/contrib-global.mk
|
||||||
endif
|
endif
|
@ -1,4 +1,4 @@
|
|||||||
/* contrib/worker_spi/worker_spi--1.0.sql */
|
/* src/test/modules/worker_spi/worker_spi--1.0.sql */
|
||||||
|
|
||||||
-- complain if script is sourced in psql, rather than via CREATE EXTENSION
|
-- complain if script is sourced in psql, rather than via CREATE EXTENSION
|
||||||
\echo Use "CREATE EXTENSION worker_spi" to load this file. \quit
|
\echo Use "CREATE EXTENSION worker_spi" to load this file. \quit
|
@ -13,10 +13,10 @@
|
|||||||
* "delta" type. Delta rows will be deleted by this worker and their values
|
* "delta" type. Delta rows will be deleted by this worker and their values
|
||||||
* aggregated into the total.
|
* aggregated into the total.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2013, PostgreSQL Global Development Group
|
* Copyright (C) 2013-2014, PostgreSQL Global Development Group
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* contrib/worker_spi/worker_spi.c
|
* src/test/modules/worker_spi/worker_spi.c
|
||||||
*
|
*
|
||||||
* -------------------------------------------------------------------------
|
* -------------------------------------------------------------------------
|
||||||
*/
|
*/
|
@ -101,7 +101,7 @@ installdirs-tests: installdirs
|
|||||||
$(MKDIR_P) $(patsubst $(srcdir)/%/,'$(DESTDIR)$(pkglibdir)/regress/%',$(sort $(dir $(regress_data_files))))
|
$(MKDIR_P) $(patsubst $(srcdir)/%/,'$(DESTDIR)$(pkglibdir)/regress/%',$(sort $(dir $(regress_data_files))))
|
||||||
|
|
||||||
|
|
||||||
# Get some extra C modules from contrib/spi and contrib/dummy_seclabel...
|
# Get some extra C modules from contrib/spi and src/test/modules/dummy_seclabel...
|
||||||
|
|
||||||
all: refint$(DLSUFFIX) autoinc$(DLSUFFIX) dummy_seclabel$(DLSUFFIX)
|
all: refint$(DLSUFFIX) autoinc$(DLSUFFIX) dummy_seclabel$(DLSUFFIX)
|
||||||
|
|
||||||
@ -111,22 +111,22 @@ refint$(DLSUFFIX): $(top_builddir)/contrib/spi/refint$(DLSUFFIX)
|
|||||||
autoinc$(DLSUFFIX): $(top_builddir)/contrib/spi/autoinc$(DLSUFFIX)
|
autoinc$(DLSUFFIX): $(top_builddir)/contrib/spi/autoinc$(DLSUFFIX)
|
||||||
cp $< $@
|
cp $< $@
|
||||||
|
|
||||||
dummy_seclabel$(DLSUFFIX): $(top_builddir)/contrib/dummy_seclabel/dummy_seclabel$(DLSUFFIX)
|
dummy_seclabel$(DLSUFFIX): $(top_builddir)/src/test/modules/dummy_seclabel/dummy_seclabel$(DLSUFFIX)
|
||||||
cp $< $@
|
cp $< $@
|
||||||
|
|
||||||
$(top_builddir)/contrib/spi/refint$(DLSUFFIX): | submake-contrib-spi ;
|
$(top_builddir)/contrib/spi/refint$(DLSUFFIX): | submake-contrib-spi ;
|
||||||
|
|
||||||
$(top_builddir)/contrib/spi/autoinc$(DLSUFFIX): | submake-contrib-spi ;
|
$(top_builddir)/contrib/spi/autoinc$(DLSUFFIX): | submake-contrib-spi ;
|
||||||
|
|
||||||
$(top_builddir)/contrib/dummy_seclabel/dummy_seclabel$(DLSUFFIX): | submake-contrib-dummy_seclabel ;
|
$(top_builddir)/src/test/modules/dummy_seclabel/dummy_seclabel$(DLSUFFIX): | submake-dummy_seclabel ;
|
||||||
|
|
||||||
submake-contrib-spi:
|
submake-contrib-spi:
|
||||||
$(MAKE) -C $(top_builddir)/contrib/spi
|
$(MAKE) -C $(top_builddir)/contrib/spi
|
||||||
|
|
||||||
submake-contrib-dummy_seclabel:
|
submake-dummy_seclabel:
|
||||||
$(MAKE) -C $(top_builddir)/contrib/dummy_seclabel
|
$(MAKE) -C $(top_builddir)/src/test/modules/dummy_seclabel
|
||||||
|
|
||||||
.PHONY: submake-contrib-spi submake-contrib-dummy_seclabel
|
.PHONY: submake-contrib-spi submake-dummy_seclabel
|
||||||
|
|
||||||
# Tablespace setup
|
# Tablespace setup
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user