Commit 50c956ad authored by Peter Eisentraut's avatar Peter Eisentraut

Remove createlang and droplang

They have been deprecated since PostgreSQL 9.1.
Reviewed-by: default avatarMagnus Hagander <magnus@hagander.net>
Reviewed-by: default avatarDaniel Gustafsson <daniel@yesql.se>
parent 691b8d59
...@@ -2256,17 +2256,17 @@ hosts=local4,bind4 ...@@ -2256,17 +2256,17 @@ hosts=local4,bind4
memory management. You can have a server with many multiples of memory management. You can have a server with many multiples of
gigabytes of RAM free, but still get out of memory or address gigabytes of RAM free, but still get out of memory or address
space errors when running applications. One example space errors when running applications. One example
is <command>createlang</command> failing with unusual errors. is loading of extensions failing with unusual errors.
For example, running as the owner of the PostgreSQL installation: For example, running as the owner of the PostgreSQL installation:
<screen> <screen>
-bash-3.00$ createlang plperl template1 =# CREATE EXTENSION plperl;
createlang: language installation failed: ERROR: could not load library "/opt/dbs/pgsql748/lib/plperl.so": A memory address is not in the address space for the process. ERROR: could not load library "/opt/dbs/pgsql/lib/plperl.so": A memory address is not in the address space for the process.
</screen> </screen>
Running as a non-owner in the group possessing the PostgreSQL Running as a non-owner in the group possessing the PostgreSQL
installation: installation:
<screen> <screen>
-bash-3.00$ createlang plperl template1 =# CREATE EXTENSION plperl;
createlang: language installation failed: ERROR: could not load library "/opt/dbs/pgsql748/lib/plperl.so": Bad address ERROR: could not load library "/opt/dbs/pgsql/lib/plperl.so": Bad address
</screen> </screen>
Another example is out of memory errors in the PostgreSQL server Another example is out of memory errors in the PostgreSQL server
logs, with every memory allocation near or greater than 256 MB logs, with every memory allocation near or greater than 256 MB
...@@ -2284,7 +2284,7 @@ createlang: language installation failed: ERROR: could not load library "/opt/d ...@@ -2284,7 +2284,7 @@ createlang: language installation failed: ERROR: could not load library "/opt/d
</para> </para>
<para> <para>
In the case of the <command>createlang</command> example, above, In the case of the <literal>plperl</literal> example, above,
check your umask and the permissions of the binaries in your check your umask and the permissions of the binaries in your
PostgreSQL installation. The binaries involved in that example PostgreSQL installation. The binaries involved in that example
were 32-bit and installed as mode 750 instead of 755. Due to the were 32-bit and installed as mode 750 instead of 755. Due to the
......
...@@ -27,8 +27,7 @@ ...@@ -27,8 +27,7 @@
<para> <para>
To install PL/Perl in a particular database, use To install PL/Perl in a particular database, use
<literal>CREATE EXTENSION plperl</>, or from the shell command line use <literal>CREATE EXTENSION plperl</>.
<literal>createlang plperl <replaceable>dbname</></literal>.
</para> </para>
<tip> <tip>
......
...@@ -14,8 +14,7 @@ ...@@ -14,8 +14,7 @@
<para> <para>
To install PL/Python in a particular database, use To install PL/Python in a particular database, use
<literal>CREATE EXTENSION plpythonu</>, or from the shell command line use <literal>CREATE EXTENSION plpythonu</> (but
<literal>createlang plpythonu <replaceable>dbname</></literal> (but
see also <xref linkend="plpython-python23">). see also <xref linkend="plpython-python23">).
</para> </para>
......
...@@ -66,10 +66,9 @@ ...@@ -66,10 +66,9 @@
directory if Tcl support is specified in the configuration step of directory if Tcl support is specified in the configuration step of
the installation procedure. To install <application>PL/Tcl</> the installation procedure. To install <application>PL/Tcl</>
and/or <application>PL/TclU</> in a particular database, use the and/or <application>PL/TclU</> in a particular database, use the
<command>CREATE EXTENSION</> command or the <command>CREATE EXTENSION</> command, for example
<command>createlang</command> program, for example <literal>CREATE EXTENSION pltcl</literal> or
<literal>createlang pltcl <replaceable>dbname</></literal> or <literal>CREATE EXTENSION pltclu</literal>.
<literal>createlang pltclu <replaceable>dbname</></literal>.
</para> </para>
</sect1> </sect1>
......
...@@ -182,10 +182,8 @@ Complete list of usable sgml source files in this directory. ...@@ -182,10 +182,8 @@ Complete list of usable sgml source files in this directory.
<!-- applications and utilities --> <!-- applications and utilities -->
<!ENTITY clusterdb SYSTEM "clusterdb.sgml"> <!ENTITY clusterdb SYSTEM "clusterdb.sgml">
<!ENTITY createdb SYSTEM "createdb.sgml"> <!ENTITY createdb SYSTEM "createdb.sgml">
<!ENTITY createlang SYSTEM "createlang.sgml">
<!ENTITY createuser SYSTEM "createuser.sgml"> <!ENTITY createuser SYSTEM "createuser.sgml">
<!ENTITY dropdb SYSTEM "dropdb.sgml"> <!ENTITY dropdb SYSTEM "dropdb.sgml">
<!ENTITY droplang SYSTEM "droplang.sgml">
<!ENTITY dropuser SYSTEM "dropuser.sgml"> <!ENTITY dropuser SYSTEM "dropuser.sgml">
<!ENTITY ecpgRef SYSTEM "ecpg-ref.sgml"> <!ENTITY ecpgRef SYSTEM "ecpg-ref.sgml">
<!ENTITY initdb SYSTEM "initdb.sgml"> <!ENTITY initdb SYSTEM "initdb.sgml">
......
...@@ -847,7 +847,6 @@ COMMIT; ...@@ -847,7 +847,6 @@ COMMIT;
<member><xref linkend="sql-grant"></member> <member><xref linkend="sql-grant"></member>
<member><xref linkend="sql-load"></member> <member><xref linkend="sql-load"></member>
<member><xref linkend="sql-revoke"></member> <member><xref linkend="sql-revoke"></member>
<member><xref linkend="app-createlang"></member>
</simplelist> </simplelist>
</refsect1> </refsect1>
......
...@@ -230,21 +230,14 @@ CREATE [ OR REPLACE ] [ TRUSTED ] [ PROCEDURAL ] LANGUAGE <replaceable class="pa ...@@ -230,21 +230,14 @@ CREATE [ OR REPLACE ] [ TRUSTED ] [ PROCEDURAL ] LANGUAGE <replaceable class="pa
<title>Notes</title> <title>Notes</title>
<para> <para>
The <xref linkend="app-createlang"> program is a simple wrapper around Use <xref linkend="sql-droplanguage"> to drop procedural languages.
the <command>CREATE LANGUAGE</> command. It eases
installation of procedural languages from the shell command line.
</para>
<para>
Use <xref linkend="sql-droplanguage">, or better yet the <xref
linkend="app-droplang"> program, to drop procedural languages.
</para> </para>
<para> <para>
The system catalog <classname>pg_language</classname> (see <xref The system catalog <classname>pg_language</classname> (see <xref
linkend="catalog-pg-language">) records information about the linkend="catalog-pg-language">) records information about the
currently installed languages. Also, <command>createlang</command> currently installed languages. Also, the <application>psql</application>
has an option to list the installed languages. command <command>\dL</command> lists the installed languages.
</para> </para>
<para> <para>
...@@ -325,8 +318,6 @@ CREATE LANGUAGE plsample ...@@ -325,8 +318,6 @@ CREATE LANGUAGE plsample
<member><xref linkend="sql-droplanguage"></member> <member><xref linkend="sql-droplanguage"></member>
<member><xref linkend="sql-grant"></member> <member><xref linkend="sql-grant"></member>
<member><xref linkend="sql-revoke"></member> <member><xref linkend="sql-revoke"></member>
<member><xref linkend="app-createlang"></member>
<member><xref linkend="app-droplang"></member>
</simplelist> </simplelist>
</refsect1> </refsect1>
</refentry> </refentry>
<!--
doc/src/sgml/ref/createlang.sgml
PostgreSQL documentation
-->
<refentry id="APP-CREATELANG">
<indexterm zone="app-createlang">
<primary>createlang</primary>
</indexterm>
<refmeta>
<refentrytitle><application>createlang</application></refentrytitle>
<manvolnum>1</manvolnum>
<refmiscinfo>Application</refmiscinfo>
</refmeta>
<refnamediv>
<refname>createlang</refname>
<refpurpose>install a <productname>PostgreSQL</productname> procedural language</refpurpose>
</refnamediv>
<refsynopsisdiv>
<cmdsynopsis>
<command>createlang</command>
<arg rep="repeat"><replaceable>connection-option</replaceable></arg>
<arg choice="plain"><replaceable>langname</replaceable></arg>
<arg choice="opt"><replaceable>dbname</replaceable></arg>
</cmdsynopsis>
<cmdsynopsis>
<command>createlang</command>
<arg rep="repeat"><replaceable>connection-option</replaceable></arg>
<group choice="plain"><arg choice="plain"><option>--list</option></arg><arg choice="plain"><option>-l</option></arg></group>
<arg choice="opt"><replaceable>dbname</replaceable></arg>
</cmdsynopsis>
</refsynopsisdiv>
<refsect1>
<title>Description</title>
<para>
<application>createlang</application> is a utility for adding a
procedural language to a <productname>PostgreSQL</productname> database.
</para>
<para>
<application>createlang</application> is just a wrapper around the
<xref linkend="sql-createextension"> SQL command.
</para>
<caution>
<para>
<application>createlang</application> is deprecated and may be removed
in a future <productname>PostgreSQL</productname> release. Direct use
of the <command>CREATE EXTENSION</> command is recommended instead.
</para>
</caution>
</refsect1>
<refsect1>
<title>Options</title>
<para>
<application>createlang</application> accepts the following command-line arguments:
<variablelist>
<varlistentry>
<term><replaceable class="parameter">langname</replaceable></term>
<listitem>
<para>
Specifies the name of the procedural language to be
installed. (This name is lower-cased.)
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option><optional>-d</> <replaceable class="parameter">dbname</replaceable></></term>
<term><option><optional>--dbname=</><replaceable class="parameter">dbname</replaceable></></term>
<listitem>
<para>
Specifies the database to which the language should be added.
The default is to use the database with the same name as the
current system user.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>-e</></term>
<term><option>--echo</></term>
<listitem>
<para>
Display SQL commands as they are executed.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>-l</></term>
<term><option>--list</></term>
<listitem>
<para>
Show a list of already installed languages in the target database.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>-V</></term>
<term><option>--version</></term>
<listitem>
<para>
Print the <application>createlang</application> version and exit.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>-?</></term>
<term><option>--help</></term>
<listitem>
<para>
Show help about <application>createlang</application> command line
arguments, and exit.
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
<para>
<application>createlang</application> also accepts
the following command-line arguments for connection parameters:
<variablelist>
<varlistentry>
<term><option>-h <replaceable class="parameter">host</replaceable></></term>
<term><option>--host=<replaceable class="parameter">host</replaceable></></term>
<listitem>
<para>
Specifies the host name of the machine on which the
server
is running. If the value begins with a slash, it is used
as the directory for the Unix domain socket.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>-p <replaceable class="parameter">port</replaceable></></term>
<term><option>--port=<replaceable class="parameter">port</replaceable></></term>
<listitem>
<para>
Specifies the TCP port or local Unix domain socket file
extension on which the server
is listening for connections.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>-U <replaceable class="parameter">username</replaceable></></term>
<term><option>--username=<replaceable class="parameter">username</replaceable></></term>
<listitem>
<para>
User name to connect as.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>-w</></term>
<term><option>--no-password</></term>
<listitem>
<para>
Never issue a password prompt. If the server requires
password authentication and a password is not available by
other means such as a <filename>.pgpass</filename> file, the
connection attempt will fail. This option can be useful in
batch jobs and scripts where no user is present to enter a
password.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>-W</></term>
<term><option>--password</></term>
<listitem>
<para>
Force <application>createlang</application> to prompt for a
password before connecting to a database.
</para>
<para>
This option is never essential, since
<application>createlang</application> will automatically prompt
for a password if the server demands password authentication.
However, <application>createlang</application> will waste a
connection attempt finding out that the server wants a password.
In some cases it is worth typing <option>-W</> to avoid the extra
connection attempt.
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</refsect1>
<refsect1>
<title>Environment</title>
<variablelist>
<varlistentry>
<term><envar>PGDATABASE</envar></term>
<term><envar>PGHOST</envar></term>
<term><envar>PGPORT</envar></term>
<term><envar>PGUSER</envar></term>
<listitem>
<para>
Default connection parameters
</para>
</listitem>
</varlistentry>
</variablelist>
<para>
This utility, like most other <productname>PostgreSQL</> utilities,
also uses the environment variables supported by <application>libpq</>
(see <xref linkend="libpq-envars">).
</para>
</refsect1>
<refsect1>
<title>Diagnostics</title>
<para>
Most error messages are self-explanatory. If not, run
<application>createlang</application> with the <option>--echo</option>
option and see the respective <acronym>SQL</acronym> command
for details. Also, any default connection settings and environment
variables used by the <application>libpq</application> front-end
library will apply.
</para>
</refsect1>
<refsect1>
<title>Notes</title>
<para>
Use <xref linkend="app-droplang"> to remove a language.
</para>
</refsect1>
<refsect1>
<title>Examples</title>
<para>
To install the language <literal>pltcl</literal> into the database
<literal>template1</literal>:
<screen>
<prompt>$ </prompt><userinput>createlang pltcl template1</userinput>
</screen>
Note that installing the language into <literal>template1</literal>
will cause it to be automatically installed into subsequently-created
databases as well.
</para>
</refsect1>
<refsect1>
<title>See Also</title>
<simplelist type="inline">
<member><xref linkend="app-droplang"></member>
<member><xref linkend="sql-createextension"></member>
<member><xref linkend="sql-createlanguage"></member>
</simplelist>
</refsect1>
</refentry>
...@@ -120,7 +120,6 @@ DROP LANGUAGE plsample; ...@@ -120,7 +120,6 @@ DROP LANGUAGE plsample;
<simplelist type="inline"> <simplelist type="inline">
<member><xref linkend="sql-alterlanguage"></member> <member><xref linkend="sql-alterlanguage"></member>
<member><xref linkend="sql-createlanguage"></member> <member><xref linkend="sql-createlanguage"></member>
<member><xref linkend="app-droplang"></member>
</simplelist> </simplelist>
</refsect1> </refsect1>
......
<!--
doc/src/sgml/ref/droplang.sgml
PostgreSQL documentation
-->
<refentry id="APP-DROPLANG">
<indexterm zone="app-droplang">
<primary>droplang</primary>
</indexterm>
<refmeta>
<refentrytitle><application>droplang</application></refentrytitle>
<manvolnum>1</manvolnum>
<refmiscinfo>Application</refmiscinfo>
</refmeta>
<refnamediv>
<refname>droplang</refname>
<refpurpose>remove a <productname>PostgreSQL</productname> procedural language</refpurpose>
</refnamediv>
<refsynopsisdiv>
<cmdsynopsis>
<command>droplang</command>
<arg rep="repeat"><replaceable>connection-option</replaceable></arg>
<arg choice="plain"><replaceable>langname</replaceable></arg>
<arg choice="opt"><replaceable>dbname</replaceable></arg>
</cmdsynopsis>
<cmdsynopsis>
<command>droplang</command>
<arg rep="repeat"><replaceable>connection-option</replaceable></arg>
<group choice="plain"><arg choice="plain"><option>--list</option></arg><arg choice="plain"><option>-l</option></arg></group>
<arg choice="opt"><replaceable>dbname</replaceable></arg>
</cmdsynopsis>
</refsynopsisdiv>
<refsect1 id="R1-APP-DROPLANG-1">
<title>
Description
</title>
<para>
<application>droplang</application> is a utility for removing an
existing procedural language from a
<productname>PostgreSQL</productname> database.
</para>
<para>
<application>droplang</application> is just a wrapper around the
<xref linkend="sql-dropextension"> SQL command.
</para>
<caution>
<para>
<application>droplang</application> is deprecated and may be removed
in a future <productname>PostgreSQL</productname> release. Direct use
of the <command>DROP EXTENSION</> command is recommended instead.
</para>
</caution>
</refsect1>
<refsect1>
<title>Options</title>
<para>
<application>droplang</application> accepts the following command line arguments:
<variablelist>
<varlistentry>
<term><replaceable class="parameter">langname</replaceable></term>
<listitem>
<para>
Specifies the name of the procedural language to be removed.
(This name is lower-cased.)
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option><optional>-d</> <replaceable class="parameter">dbname</replaceable></></term>
<term><option><optional>--dbname=</><replaceable class="parameter">dbname</replaceable></></term>
<listitem>
<para>
Specifies from which database the language should be removed.
The default is to use the database with the same name as the
current system user.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>-e</></term>
<term><option>--echo</></term>
<listitem>
<para>
Display SQL commands as they are executed.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>-l</></term>
<term><option>--list</></term>
<listitem>
<para>
Show a list of already installed languages in the target database.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>-V</></term>
<term><option>--version</></term>
<listitem>
<para>
Print the <application>droplang</application> version and exit.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>-?</></term>
<term><option>--help</></term>
<listitem>
<para>
Show help about <application>droplang</application> command line
arguments, and exit.
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
<para>
<application>droplang</application> also accepts
the following command line arguments for connection parameters:
<variablelist>
<varlistentry>
<term><option>-h <replaceable class="parameter">host</replaceable></></term>
<term><option>--host=<replaceable class="parameter">host</replaceable></></term>
<listitem>
<para>
Specifies the host name of the machine on which the
server
is running. If host begins with a slash, it is used
as the directory for the Unix domain socket.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>-p <replaceable class="parameter">port</replaceable></></term>
<term><option>--port=<replaceable class="parameter">port</replaceable></></term>
<listitem>
<para>
Specifies the Internet TCP/IP port or local Unix domain socket file
extension on which the server
is listening for connections.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>-U <replaceable class="parameter">username</replaceable></></term>
<term><option>--username=<replaceable class="parameter">username</replaceable></></term>
<listitem>
<para>
User name to connect as.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>-w</></term>
<term><option>--no-password</></term>
<listitem>
<para>
Never issue a password prompt. If the server requires
password authentication and a password is not available by
other means such as a <filename>.pgpass</filename> file, the
connection attempt will fail. This option can be useful in
batch jobs and scripts where no user is present to enter a
password.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>-W</></term>
<term><option>--password</></term>
<listitem>
<para>
Force <application>droplang</application> to prompt for a
password before connecting to a database.
</para>
<para>
This option is never essential, since
<application>droplang</application> will automatically prompt
for a password if the server demands password authentication.
However, <application>droplang</application> will waste a
connection attempt finding out that the server wants a password.
In some cases it is worth typing <option>-W</> to avoid the extra
connection attempt.
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</refsect1>
<refsect1>
<title>Environment</title>
<variablelist>
<varlistentry>
<term><envar>PGDATABASE</envar></term>
<term><envar>PGHOST</envar></term>
<term><envar>PGPORT</envar></term>
<term><envar>PGUSER</envar></term>
<listitem>
<para>
Default connection parameters
</para>
</listitem>
</varlistentry>
</variablelist>
<para>
This utility, like most other <productname>PostgreSQL</> utilities,
also uses the environment variables supported by <application>libpq</>
(see <xref linkend="libpq-envars">).
</para>
</refsect1>
<refsect1>
<title>Diagnostics</title>
<para>
Most error messages are self-explanatory. If not, run
<application>droplang</application> with the <option>--echo</option>
option and see under the respective <acronym>SQL</acronym> command
for details. Also, any default connection settings and environment
variables used by the <application>libpq</application> front-end
library will apply.
</para>
</refsect1>
<refsect1>
<title>Notes</title>
<para>
Use <xref linkend="app-createlang"> to add a language.
</para>
</refsect1>
<refsect1>
<title>Examples</title>
<para>
To remove the language <literal>pltcl</literal>:
<screen>
<prompt>$ </prompt><userinput>droplang pltcl dbname</userinput>
</screen></para>
</refsect1>
<refsect1>
<title>See Also</title>
<simplelist type="inline">
<member><xref linkend="app-createlang"></member>
<member><xref linkend="sql-dropextension"></member>
<member><xref linkend="sql-droplanguage"></member>
</simplelist>
</refsect1>
</refentry>
...@@ -233,10 +233,8 @@ ...@@ -233,10 +233,8 @@
&clusterdb; &clusterdb;
&createdb; &createdb;
&createlang;
&createuser; &createuser;
&dropdb; &dropdb;
&droplang;
&dropuser; &dropuser;
&ecpgRef; &ecpgRef;
&pgBasebackup; &pgBasebackup;
......
...@@ -10860,9 +10860,7 @@ SELECT * FROM places ORDER BY location <-> point '(101,456)' LIMIT 10; ...@@ -10860,9 +10860,7 @@ SELECT * FROM places ORDER BY location <-> point '(101,456)' LIMIT 10;
<listitem> <listitem>
<para> <para>
Mark <link Mark <application>createlang</> and <application>droplang</>
linkend="APP-CREATELANG"><application>createlang</></link>
and <link linkend="APP-DROPLANG"><application>droplang</></link>
as deprecated now that they just invoke extension commands (Tom as deprecated now that they just invoke extension commands (Tom
Lane) Lane)
</para> </para>
......
...@@ -56,14 +56,7 @@ ...@@ -56,14 +56,7 @@
For the languages supplied with the standard distribution, it is For the languages supplied with the standard distribution, it is
only necessary to execute <command>CREATE EXTENSION</> only necessary to execute <command>CREATE EXTENSION</>
<replaceable>language_name</> to install the language into the <replaceable>language_name</> to install the language into the
current database. Alternatively, the program <xref current database.
linkend="app-createlang"> can be used to do this from the shell
command line. For example, to install the language
<application>PL/Perl</application> into the database
<literal>template1</>, use:
<programlisting>
createlang plperl template1
</programlisting>
The manual procedure described below is only recommended for The manual procedure described below is only recommended for
installing languages that have not been packaged as extensions. installing languages that have not been packaged as extensions.
</para> </para>
......
/clusterdb /clusterdb
/createdb /createdb
/createlang
/createuser /createuser
/dropdb /dropdb
/droplang
/dropuser /dropuser
/reindexdb /reindexdb
/vacuumdb /vacuumdb
......
...@@ -16,7 +16,7 @@ subdir = src/bin/scripts ...@@ -16,7 +16,7 @@ subdir = src/bin/scripts
top_builddir = ../../.. top_builddir = ../../..
include $(top_builddir)/src/Makefile.global include $(top_builddir)/src/Makefile.global
PROGRAMS = createdb createlang createuser dropdb droplang dropuser clusterdb vacuumdb reindexdb pg_isready PROGRAMS = createdb createuser dropdb dropuser clusterdb vacuumdb reindexdb pg_isready
override CPPFLAGS := -I$(libpq_srcdir) $(CPPFLAGS) override CPPFLAGS := -I$(libpq_srcdir) $(CPPFLAGS)
LDFLAGS += -L$(top_builddir)/src/fe_utils -lpgfeutils -lpq LDFLAGS += -L$(top_builddir)/src/fe_utils -lpgfeutils -lpq
...@@ -27,10 +27,8 @@ all: $(PROGRAMS) ...@@ -27,10 +27,8 @@ all: $(PROGRAMS)
$(CC) $(CFLAGS) $^ $(libpq_pgport) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X) $(CC) $(CFLAGS) $^ $(libpq_pgport) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
createdb: createdb.o common.o | submake-libpq submake-libpgport submake-libpgfeutils createdb: createdb.o common.o | submake-libpq submake-libpgport submake-libpgfeutils
createlang: createlang.o common.o | submake-libpq submake-libpgport submake-libpgfeutils
createuser: createuser.o common.o | submake-libpq submake-libpgport submake-libpgfeutils createuser: createuser.o common.o | submake-libpq submake-libpgport submake-libpgfeutils
dropdb: dropdb.o common.o | submake-libpq submake-libpgport submake-libpgfeutils dropdb: dropdb.o common.o | submake-libpq submake-libpgport submake-libpgfeutils
droplang: droplang.o common.o | submake-libpq submake-libpgport submake-libpgfeutils
dropuser: dropuser.o common.o | submake-libpq submake-libpgport submake-libpgfeutils dropuser: dropuser.o common.o | submake-libpq submake-libpgport submake-libpgfeutils
clusterdb: clusterdb.o common.o | submake-libpq submake-libpgport submake-libpgfeutils clusterdb: clusterdb.o common.o | submake-libpq submake-libpgport submake-libpgfeutils
vacuumdb: vacuumdb.o common.o | submake-libpq submake-libpgport submake-libpgfeutils vacuumdb: vacuumdb.o common.o | submake-libpq submake-libpgport submake-libpgfeutils
...@@ -40,8 +38,6 @@ pg_isready: pg_isready.o common.o | submake-libpq submake-libpgport submake-libp ...@@ -40,8 +38,6 @@ pg_isready: pg_isready.o common.o | submake-libpq submake-libpgport submake-libp
install: all installdirs install: all installdirs
$(INSTALL_PROGRAM) createdb$(X) '$(DESTDIR)$(bindir)'/createdb$(X) $(INSTALL_PROGRAM) createdb$(X) '$(DESTDIR)$(bindir)'/createdb$(X)
$(INSTALL_PROGRAM) dropdb$(X) '$(DESTDIR)$(bindir)'/dropdb$(X) $(INSTALL_PROGRAM) dropdb$(X) '$(DESTDIR)$(bindir)'/dropdb$(X)
$(INSTALL_PROGRAM) createlang$(X) '$(DESTDIR)$(bindir)'/createlang$(X)
$(INSTALL_PROGRAM) droplang$(X) '$(DESTDIR)$(bindir)'/droplang$(X)
$(INSTALL_PROGRAM) createuser$(X) '$(DESTDIR)$(bindir)'/createuser$(X) $(INSTALL_PROGRAM) createuser$(X) '$(DESTDIR)$(bindir)'/createuser$(X)
$(INSTALL_PROGRAM) dropuser$(X) '$(DESTDIR)$(bindir)'/dropuser$(X) $(INSTALL_PROGRAM) dropuser$(X) '$(DESTDIR)$(bindir)'/dropuser$(X)
$(INSTALL_PROGRAM) clusterdb$(X) '$(DESTDIR)$(bindir)'/clusterdb$(X) $(INSTALL_PROGRAM) clusterdb$(X) '$(DESTDIR)$(bindir)'/clusterdb$(X)
......
/*-------------------------------------------------------------------------
*
* createlang
*
* Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/bin/scripts/createlang.c
*
*-------------------------------------------------------------------------
*/
#include "postgres_fe.h"
#include "common.h"
#include "fe_utils/print.h"
static void help(const char *progname);
int
main(int argc, char *argv[])
{
static struct option long_options[] = {
{"list", no_argument, NULL, 'l'},
{"host", required_argument, NULL, 'h'},
{"port", required_argument, NULL, 'p'},
{"username", required_argument, NULL, 'U'},
{"no-password", no_argument, NULL, 'w'},
{"password", no_argument, NULL, 'W'},
{"dbname", required_argument, NULL, 'd'},
{"echo", no_argument, NULL, 'e'},
{NULL, 0, NULL, 0}
};
const char *progname;
int optindex;
int c;
bool listlangs = false;
const char *dbname = NULL;
char *host = NULL;
char *port = NULL;
char *username = NULL;
enum trivalue prompt_password = TRI_DEFAULT;
bool echo = false;
char *langname = NULL;
char *p;
PQExpBufferData sql;
PGconn *conn;
PGresult *result;
progname = get_progname(argv[0]);
set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pgscripts"));
handle_help_version_opts(argc, argv, "createlang", help);
while ((c = getopt_long(argc, argv, "lh:p:U:wWd:e", long_options, &optindex)) != -1)
{
switch (c)
{
case 'l':
listlangs = true;
break;
case 'h':
host = pg_strdup(optarg);
break;
case 'p':
port = pg_strdup(optarg);
break;
case 'U':
username = pg_strdup(optarg);
break;
case 'w':
prompt_password = TRI_NO;
break;
case 'W':
prompt_password = TRI_YES;
break;
case 'd':
dbname = pg_strdup(optarg);
break;
case 'e':
echo = true;
break;
default:
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
exit(1);
}
}
/*
* We set dbname from positional arguments if it is not already set by
* option arguments -d. If not doing listlangs, positional dbname must
* follow positional langname.
*/
if (argc - optind > 0)
{
if (listlangs)
{
if (dbname == NULL)
dbname = argv[optind++];
}
else
{
langname = argv[optind++];
if (argc - optind > 0 && dbname == NULL)
dbname = argv[optind++];
}
}
if (argc - optind > 0)
{
fprintf(stderr, _("%s: too many command-line arguments (first is \"%s\")\n"),
progname, argv[optind]);
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
exit(1);
}
if (dbname == NULL)
{
if (getenv("PGDATABASE"))
dbname = getenv("PGDATABASE");
else if (getenv("PGUSER"))
dbname = getenv("PGUSER");
else
dbname = get_user_name_or_exit(progname);
}
initPQExpBuffer(&sql);
/*
* List option
*/
if (listlangs)
{
printQueryOpt popt;
static const bool translate_columns[] = {false, true};
conn = connectDatabase(dbname, host, port, username, prompt_password,
progname, false, false);
printfPQExpBuffer(&sql, "SELECT lanname as \"%s\", "
"(CASE WHEN lanpltrusted THEN '%s' ELSE '%s' END) as \"%s\" "
"FROM pg_catalog.pg_language WHERE lanispl;",
gettext_noop("Name"),
gettext_noop("yes"), gettext_noop("no"),
gettext_noop("Trusted?"));
result = executeQuery(conn, sql.data, progname, echo);
memset(&popt, 0, sizeof(popt));
popt.topt.format = PRINT_ALIGNED;
popt.topt.border = 1;
popt.topt.start_table = true;
popt.topt.stop_table = true;
popt.topt.encoding = PQclientEncoding(conn);
popt.title = _("Procedural Languages");
popt.translate_header = true;
popt.translate_columns = translate_columns;
popt.n_translate_columns = lengthof(translate_columns);
printQuery(result, &popt, stdout, false, NULL);
PQfinish(conn);
exit(0);
}
if (langname == NULL)
{
fprintf(stderr, _("%s: missing required argument language name\n"), progname);
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
exit(1);
}
/* lower case language name */
for (p = langname; *p; p++)
if (*p >= 'A' && *p <= 'Z')
*p += ('a' - 'A');
conn = connectDatabase(dbname, host, port, username, prompt_password,
progname, false, false);
/*
* Make sure the language isn't already installed
*/
printfPQExpBuffer(&sql,
"SELECT oid FROM pg_catalog.pg_language WHERE lanname = '%s';",
langname);
result = executeQuery(conn, sql.data, progname, echo);
if (PQntuples(result) > 0)
{
fprintf(stderr,
_("%s: language \"%s\" is already installed in database \"%s\"\n"),
progname, langname, PQdb(conn));
PQfinish(conn);
/* separate exit status for "already installed" */
exit(2);
}
PQclear(result);
/*
* In 9.1 and up, assume that languages should be installed using CREATE
* EXTENSION. However, it's possible this tool could be used against an
* older server, and it's easy enough to continue supporting the old way.
*/
if (PQserverVersion(conn) >= 90100)
printfPQExpBuffer(&sql, "CREATE EXTENSION \"%s\";", langname);
else
printfPQExpBuffer(&sql, "CREATE LANGUAGE \"%s\";", langname);
if (echo)
printf("%s\n", sql.data);
result = PQexec(conn, sql.data);
if (PQresultStatus(result) != PGRES_COMMAND_OK)
{
fprintf(stderr, _("%s: language installation failed: %s"),
progname, PQerrorMessage(conn));
PQfinish(conn);
exit(1);
}
PQclear(result);
PQfinish(conn);
exit(0);
}
static void
help(const char *progname)
{
printf(_("%s installs a procedural language into a PostgreSQL database.\n\n"), progname);
printf(_("Usage:\n"));
printf(_(" %s [OPTION]... LANGNAME [DBNAME]\n"), progname);
printf(_("\nOptions:\n"));
printf(_(" -d, --dbname=DBNAME database to install language in\n"));
printf(_(" -e, --echo show the commands being sent to the server\n"));
printf(_(" -l, --list show a list of currently installed languages\n"));
printf(_(" -V, --version output version information, then exit\n"));
printf(_(" -?, --help show this help, then exit\n"));
printf(_("\nConnection options:\n"));
printf(_(" -h, --host=HOSTNAME database server host or socket directory\n"));
printf(_(" -p, --port=PORT database server port\n"));
printf(_(" -U, --username=USERNAME user name to connect as\n"));
printf(_(" -w, --no-password never prompt for password\n"));
printf(_(" -W, --password force password prompt\n"));
printf(_("\nReport bugs to <pgsql-bugs@postgresql.org>.\n"));
}
/*-------------------------------------------------------------------------
*
* droplang
*
* Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/bin/scripts/droplang.c
*
*-------------------------------------------------------------------------
*/
#include "postgres_fe.h"
#include "common.h"
#include "fe_utils/print.h"
static void help(const char *progname);
int
main(int argc, char *argv[])
{
static struct option long_options[] = {
{"list", no_argument, NULL, 'l'},
{"host", required_argument, NULL, 'h'},
{"port", required_argument, NULL, 'p'},
{"username", required_argument, NULL, 'U'},
{"no-password", no_argument, NULL, 'w'},
{"password", no_argument, NULL, 'W'},
{"dbname", required_argument, NULL, 'd'},
{"echo", no_argument, NULL, 'e'},
{NULL, 0, NULL, 0}
};
const char *progname;
int optindex;
int c;
bool listlangs = false;
const char *dbname = NULL;
char *host = NULL;
char *port = NULL;
char *username = NULL;
enum trivalue prompt_password = TRI_DEFAULT;
bool echo = false;
char *langname = NULL;
char *p;
PQExpBufferData sql;
PGconn *conn;
PGresult *result;
progname = get_progname(argv[0]);
set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pgscripts"));
handle_help_version_opts(argc, argv, "droplang", help);
while ((c = getopt_long(argc, argv, "lh:p:U:wWd:e", long_options, &optindex)) != -1)
{
switch (c)
{
case 'l':
listlangs = true;
break;
case 'h':
host = pg_strdup(optarg);
break;
case 'p':
port = pg_strdup(optarg);
break;
case 'U':
username = pg_strdup(optarg);
break;
case 'w':
prompt_password = TRI_NO;
break;
case 'W':
prompt_password = TRI_YES;
break;
case 'd':
dbname = pg_strdup(optarg);
break;
case 'e':
echo = true;
break;
default:
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
exit(1);
}
}
/*
* We set dbname from positional arguments if it is not already set by
* option arguments -d. If not doing listlangs, positional dbname must
* follow positional langname.
*/
if (argc - optind > 0)
{
if (listlangs)
{
if (dbname == NULL)
dbname = argv[optind++];
}
else
{
langname = argv[optind++];
if (argc - optind > 0 && dbname == NULL)
dbname = argv[optind++];
}
}
if (argc - optind > 0)
{
fprintf(stderr, _("%s: too many command-line arguments (first is \"%s\")\n"),
progname, argv[optind]);
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
exit(1);
}
if (dbname == NULL)
{
if (getenv("PGDATABASE"))
dbname = getenv("PGDATABASE");
else if (getenv("PGUSER"))
dbname = getenv("PGUSER");
else
dbname = get_user_name_or_exit(progname);
}
initPQExpBuffer(&sql);
/*
* List option
*/
if (listlangs)
{
printQueryOpt popt;
static const bool translate_columns[] = {false, true};
conn = connectDatabase(dbname, host, port, username, prompt_password,
progname, false, false);
printfPQExpBuffer(&sql, "SELECT lanname as \"%s\", "
"(CASE WHEN lanpltrusted THEN '%s' ELSE '%s' END) as \"%s\" "
"FROM pg_catalog.pg_language WHERE lanispl;",
gettext_noop("Name"),
gettext_noop("yes"), gettext_noop("no"),
gettext_noop("Trusted?"));
result = executeQuery(conn, sql.data, progname, echo);
memset(&popt, 0, sizeof(popt));
popt.topt.format = PRINT_ALIGNED;
popt.topt.border = 1;
popt.topt.start_table = true;
popt.topt.stop_table = true;
popt.topt.encoding = PQclientEncoding(conn);
popt.title = _("Procedural Languages");
popt.translate_header = true;
popt.translate_columns = translate_columns;
popt.n_translate_columns = lengthof(translate_columns);
printQuery(result, &popt, stdout, false, NULL);
PQfinish(conn);
exit(0);
}
if (langname == NULL)
{
fprintf(stderr, _("%s: missing required argument language name\n"),
progname);
fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
progname);
exit(1);
}
/* lower case language name */
for (p = langname; *p; p++)
if (*p >= 'A' && *p <= 'Z')
*p += ('a' - 'A');
conn = connectDatabase(dbname, host, port, username, prompt_password,
progname, false, false);
/*
* Force schema search path to be just pg_catalog, so that we don't have
* to be paranoid about search paths below.
*/
executeCommand(conn, "SET search_path = pg_catalog;", progname, echo);
/*
* Make sure the language is installed
*/
printfPQExpBuffer(&sql, "SELECT oid "
"FROM pg_language WHERE lanname = '%s' AND lanispl;",
langname);
result = executeQuery(conn, sql.data, progname, echo);
if (PQntuples(result) == 0)
{
fprintf(stderr, _("%s: language \"%s\" is not installed in "
"database \"%s\"\n"),
progname, langname, PQdb(conn));
PQfinish(conn);
exit(1);
}
PQclear(result);
/*
* Attempt to drop the language. We do not use CASCADE, so that the drop
* will fail if there are any functions in the language.
*/
printfPQExpBuffer(&sql, "DROP EXTENSION \"%s\";", langname);
if (echo)
printf("%s\n", sql.data);
result = PQexec(conn, sql.data);
if (PQresultStatus(result) != PGRES_COMMAND_OK)
{
fprintf(stderr, _("%s: language removal failed: %s"),
progname, PQerrorMessage(conn));
PQfinish(conn);
exit(1);
}
PQclear(result);
PQfinish(conn);
exit(0);
}
static void
help(const char *progname)
{
printf(_("%s removes a procedural language from a database.\n\n"), progname);
printf(_("Usage:\n"));
printf(_(" %s [OPTION]... LANGNAME [DBNAME]\n"), progname);
printf(_("\nOptions:\n"));
printf(_(" -d, --dbname=DBNAME database from which to remove the language\n"));
printf(_(" -e, --echo show the commands being sent to the server\n"));
printf(_(" -l, --list show a list of currently installed languages\n"));
printf(_(" -V, --version output version information, then exit\n"));
printf(_(" -?, --help show this help, then exit\n"));
printf(_("\nConnection options:\n"));
printf(_(" -h, --host=HOSTNAME database server host or socket directory\n"));
printf(_(" -p, --port=PORT database server port\n"));
printf(_(" -U, --username=USERNAME user name to connect as\n"));
printf(_(" -w, --no-password never prompt for password\n"));
printf(_(" -W, --password force password prompt\n"));
printf(_("\nReport bugs to <pgsql-bugs@postgresql.org>.\n"));
}
# src/bin/scripts/nls.mk # src/bin/scripts/nls.mk
CATALOG_NAME = pgscripts CATALOG_NAME = pgscripts
AVAIL_LANGUAGES = cs de es fr it ja ko pl pt_BR ru sv zh_CN AVAIL_LANGUAGES = cs de es fr it ja ko pl pt_BR ru sv zh_CN
GETTEXT_FILES = createdb.c createlang.c createuser.c \ GETTEXT_FILES = createdb.c createuser.c \
dropdb.c droplang.c dropuser.c \ dropdb.c dropuser.c \
clusterdb.c vacuumdb.c reindexdb.c \ clusterdb.c vacuumdb.c reindexdb.c \
pg_isready.c \ pg_isready.c \
common.c \ common.c \
......
use strict;
use warnings;
use PostgresNode;
use TestLib;
use Test::More tests => 14;
program_help_ok('createlang');
program_version_ok('createlang');
program_options_handling_ok('createlang');
my $node = get_new_node('main');
$node->init;
$node->start;
$node->command_fails([ 'createlang', 'plpgsql' ],
'fails if language already exists');
$node->safe_psql('postgres', 'DROP EXTENSION plpgsql');
$node->issues_sql_like(
[ 'createlang', 'plpgsql' ],
qr/statement: CREATE EXTENSION "plpgsql"/,
'SQL CREATE EXTENSION run');
$node->command_like([ 'createlang', '--list' ], qr/plpgsql/, 'list output');
use strict;
use warnings;
use PostgresNode;
use TestLib;
use Test::More tests => 11;
program_help_ok('droplang');
program_version_ok('droplang');
program_options_handling_ok('droplang');
my $node = get_new_node('main');
$node->init;
$node->start;
$node->issues_sql_like(
[ 'droplang', 'plpgsql', 'postgres' ],
qr/statement: DROP EXTENSION "plpgsql"/,
'SQL DROP EXTENSION run');
$node->command_fails(
[ 'droplang', 'nonexistent', 'postgres' ],
'fails with nonexistent language');
...@@ -20,8 +20,8 @@ our (@ISA, @EXPORT_OK); ...@@ -20,8 +20,8 @@ our (@ISA, @EXPORT_OK);
my $insttype; my $insttype;
my @client_contribs = ('oid2name', 'pgbench', 'vacuumlo'); my @client_contribs = ('oid2name', 'pgbench', 'vacuumlo');
my @client_program_files = ( my @client_program_files = (
'clusterdb', 'createdb', 'createlang', 'createuser', 'clusterdb', 'createdb', 'createuser',
'dropdb', 'droplang', 'dropuser', 'ecpg', 'dropdb', 'dropuser', 'ecpg',
'libecpg', 'libecpg_compat', 'libpgtypes', 'libpq', 'libecpg', 'libecpg_compat', 'libpgtypes', 'libpq',
'pg_basebackup', 'pg_config', 'pg_dump', 'pg_dumpall', 'pg_basebackup', 'pg_config', 'pg_dump', 'pg_dumpall',
'pg_isready', 'pg_receivewal', 'pg_recvlogical', 'pg_restore', 'pg_isready', 'pg_receivewal', 'pg_recvlogical', 'pg_restore',
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment