mirror of
https://github.com/postgres/postgres.git
synced 2025-06-16 06:01:02 +03:00
Remove createlang and droplang
They have been deprecated since PostgreSQL 9.1. Reviewed-by: Magnus Hagander <magnus@hagander.net> Reviewed-by: Daniel Gustafsson <daniel@yesql.se>
This commit is contained in:
@ -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
|
|||||||
</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 @@
|
|||||||
|
|
||||||
<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 @@
|
|||||||
|
|
||||||
<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 @@
|
|||||||
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.
|
|||||||
<!-- 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;
|
|||||||
<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
|
|||||||
<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
|
|||||||
<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>
|
||||||
|
@ -1,291 +0,0 @@
|
|||||||
<!--
|
|
||||||
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;
|
|||||||
<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>
|
||||||
|
|
||||||
|
@ -1,288 +0,0 @@
|
|||||||
<!--
|
|
||||||
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 @@
|
|||||||
|
|
||||||
&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;
|
|||||||
|
|
||||||
<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 @@
|
|||||||
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>
|
||||||
|
2
src/bin/scripts/.gitignore
vendored
2
src/bin/scripts/.gitignore
vendored
@ -1,9 +1,7 @@
|
|||||||
/clusterdb
|
/clusterdb
|
||||||
/createdb
|
/createdb
|
||||||
/createlang
|
|
||||||
/createuser
|
/createuser
|
||||||
/dropdb
|
/dropdb
|
||||||
/droplang
|
|
||||||
/dropuser
|
/dropuser
|
||||||
/reindexdb
|
/reindexdb
|
||||||
/vacuumdb
|
/vacuumdb
|
||||||
|
@ -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)
|
|||||||
$(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
|
|||||||
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)
|
||||||
|
@ -1,251 +0,0 @@
|
|||||||
/*-------------------------------------------------------------------------
|
|
||||||
*
|
|
||||||
* 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"));
|
|
||||||
}
|
|
@ -1,250 +0,0 @@
|
|||||||
/*-------------------------------------------------------------------------
|
|
||||||
*
|
|
||||||
* 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"));
|
|
||||||
}
|
|
@ -1,8 +1,8 @@
|
|||||||
# 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 \
|
||||||
|
@ -1,25 +0,0 @@
|
|||||||
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');
|
|
@ -1,23 +0,0 @@
|
|||||||
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);
|
|||||||
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',
|
||||||
|
Reference in New Issue
Block a user