From 3ae8367b933d02246a305432a411236d309a2060 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter_e@gmx.net>
Date: Sat, 18 Mar 2017 23:34:52 -0400
Subject: [PATCH] Remove createlang and droplang

They have been deprecated since PostgreSQL 9.1.
---
 doc/src/sgml/installation.sgml        |  12 +-
 doc/src/sgml/plperl.sgml              |   3 +-
 doc/src/sgml/plpython.sgml            |   3 +-
 doc/src/sgml/pltcl.sgml               |   7 +-
 doc/src/sgml/ref/allfiles.sgml        |   2 -
 doc/src/sgml/ref/create_function.sgml |   1 -
 doc/src/sgml/ref/create_language.sgml |  15 +-
 doc/src/sgml/ref/createlang.sgml      | 291 ----------------------------------
 doc/src/sgml/ref/drop_language.sgml   |   1 -
 doc/src/sgml/ref/droplang.sgml        | 288 ---------------------------------
 doc/src/sgml/reference.sgml           |   2 -
 doc/src/sgml/release-9.1.sgml         |   4 +-
 doc/src/sgml/xplang.sgml              |   9 +-
 src/bin/scripts/.gitignore            |   2 -
 src/bin/scripts/Makefile              |   6 +-
 src/bin/scripts/createlang.c          | 251 -----------------------------
 src/bin/scripts/droplang.c            | 250 -----------------------------
 src/bin/scripts/nls.mk                |   4 +-
 src/bin/scripts/t/030_createlang.pl   |  25 ---
 src/bin/scripts/t/060_droplang.pl     |  23 ---
 src/tools/msvc/Install.pm             |   4 +-
 21 files changed, 21 insertions(+), 1182 deletions(-)
 delete mode 100644 doc/src/sgml/ref/createlang.sgml
 delete mode 100644 doc/src/sgml/ref/droplang.sgml
 delete mode 100644 src/bin/scripts/createlang.c
 delete mode 100644 src/bin/scripts/droplang.c
 delete mode 100644 src/bin/scripts/t/030_createlang.pl
 delete mode 100644 src/bin/scripts/t/060_droplang.pl

diff --git a/doc/src/sgml/installation.sgml b/doc/src/sgml/installation.sgml
index 79201b78e3..f8a222e637 100644
--- a/doc/src/sgml/installation.sgml
+++ b/doc/src/sgml/installation.sgml
@@ -2256,17 +2256,17 @@ <title>Memory Management</title>
      memory management.  You can have a server with many multiples of
      gigabytes of RAM free, but still get out of memory or address
      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:
 <screen>
--bash-3.00$ createlang plperl template1
-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.
+=# CREATE EXTENSION plperl;
+ERROR:  could not load library "/opt/dbs/pgsql/lib/plperl.so": A memory address is not in the address space for the process.
 </screen>
     Running as a non-owner in the group possessing the PostgreSQL
     installation:
 <screen>
--bash-3.00$ createlang plperl template1
-createlang: language installation failed: ERROR:  could not load library "/opt/dbs/pgsql748/lib/plperl.so": Bad address
+=# CREATE EXTENSION plperl;
+ERROR:  could not load library "/opt/dbs/pgsql/lib/plperl.so": Bad address
 </screen>
      Another example is out of memory errors in the PostgreSQL server
      logs, with every memory allocation near or greater than 256 MB
@@ -2284,7 +2284,7 @@ <title>Memory Management</title>
     </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
      PostgreSQL installation.  The binaries involved in that example
      were 32-bit and installed as mode 750 instead of 755.  Due to the
diff --git a/doc/src/sgml/plperl.sgml b/doc/src/sgml/plperl.sgml
index 9117769125..dd2ffbc6ce 100644
--- a/doc/src/sgml/plperl.sgml
+++ b/doc/src/sgml/plperl.sgml
@@ -27,8 +27,7 @@ <title>PL/Perl - Perl Procedural Language</title>
 
   <para>
    To install PL/Perl in a particular database, use
-   <literal>CREATE EXTENSION plperl</>, or from the shell command line use
-   <literal>createlang plperl <replaceable>dbname</></literal>.
+   <literal>CREATE EXTENSION plperl</>.
   </para>
 
   <tip>
diff --git a/doc/src/sgml/plpython.sgml b/doc/src/sgml/plpython.sgml
index 46397781be..fb5d336efc 100644
--- a/doc/src/sgml/plpython.sgml
+++ b/doc/src/sgml/plpython.sgml
@@ -14,8 +14,7 @@ <title>PL/Python - Python Procedural Language</title>
 
  <para>
   To install PL/Python in a particular database, use
-  <literal>CREATE EXTENSION plpythonu</>, or from the shell command line use
-  <literal>createlang plpythonu <replaceable>dbname</></literal> (but
+  <literal>CREATE EXTENSION plpythonu</> (but
   see also <xref linkend="plpython-python23">).
  </para>
 
diff --git a/doc/src/sgml/pltcl.sgml b/doc/src/sgml/pltcl.sgml
index ed745a7481..ba4af2aec5 100644
--- a/doc/src/sgml/pltcl.sgml
+++ b/doc/src/sgml/pltcl.sgml
@@ -66,10 +66,9 @@ <title>Overview</title>
     directory if Tcl support is specified in the configuration step of
     the installation procedure.  To install <application>PL/Tcl</>
     and/or <application>PL/TclU</> in a particular database, use the
-    <command>CREATE EXTENSION</> command or the
-    <command>createlang</command> program, for example
-    <literal>createlang pltcl <replaceable>dbname</></literal> or
-    <literal>createlang pltclu <replaceable>dbname</></literal>.
+    <command>CREATE EXTENSION</> command, for example
+    <literal>CREATE EXTENSION pltcl</literal> or
+    <literal>CREATE EXTENSION pltclu</literal>.
    </para>
   </sect1>
 
diff --git a/doc/src/sgml/ref/allfiles.sgml b/doc/src/sgml/ref/allfiles.sgml
index 2bc4d9fd64..974e1b74e4 100644
--- a/doc/src/sgml/ref/allfiles.sgml
+++ b/doc/src/sgml/ref/allfiles.sgml
@@ -182,10 +182,8 @@
 <!-- applications and utilities -->
 <!ENTITY clusterdb          SYSTEM "clusterdb.sgml">
 <!ENTITY createdb           SYSTEM "createdb.sgml">
-<!ENTITY createlang         SYSTEM "createlang.sgml">
 <!ENTITY createuser         SYSTEM "createuser.sgml">
 <!ENTITY dropdb             SYSTEM "dropdb.sgml">
-<!ENTITY droplang           SYSTEM "droplang.sgml">
 <!ENTITY dropuser           SYSTEM "dropuser.sgml">
 <!ENTITY ecpgRef            SYSTEM "ecpg-ref.sgml">
 <!ENTITY initdb             SYSTEM "initdb.sgml">
diff --git a/doc/src/sgml/ref/create_function.sgml b/doc/src/sgml/ref/create_function.sgml
index e7057789d3..bd89b5baa2 100644
--- a/doc/src/sgml/ref/create_function.sgml
+++ b/doc/src/sgml/ref/create_function.sgml
@@ -847,7 +847,6 @@ <title>See Also</title>
    <member><xref linkend="sql-grant"></member>
    <member><xref linkend="sql-load"></member>
    <member><xref linkend="sql-revoke"></member>
-   <member><xref linkend="app-createlang"></member>
   </simplelist>
  </refsect1>
 
diff --git a/doc/src/sgml/ref/create_language.sgml b/doc/src/sgml/ref/create_language.sgml
index 41da16d977..75165b677f 100644
--- a/doc/src/sgml/ref/create_language.sgml
+++ b/doc/src/sgml/ref/create_language.sgml
@@ -230,21 +230,14 @@ <title>Parameters</title>
   <title>Notes</title>
 
   <para>
-   The <xref linkend="app-createlang"> program is a simple wrapper around
-   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.
+   Use <xref linkend="sql-droplanguage"> to drop procedural languages.
   </para>
 
   <para>
    The system catalog <classname>pg_language</classname> (see <xref
    linkend="catalog-pg-language">) records information about the
-   currently installed languages.  Also, <command>createlang</command>
-   has an option to list the installed languages.
+   currently installed languages.  Also, the <application>psql</application>
+   command <command>\dL</command> lists the installed languages.
   </para>
 
   <para>
@@ -325,8 +318,6 @@ <title>See Also</title>
    <member><xref linkend="sql-droplanguage"></member>
    <member><xref linkend="sql-grant"></member>
    <member><xref linkend="sql-revoke"></member>
-   <member><xref linkend="app-createlang"></member>
-   <member><xref linkend="app-droplang"></member>
   </simplelist>
  </refsect1>
 </refentry>
diff --git a/doc/src/sgml/ref/createlang.sgml b/doc/src/sgml/ref/createlang.sgml
deleted file mode 100644
index e9c95d3278..0000000000
--- a/doc/src/sgml/ref/createlang.sgml
+++ /dev/null
@@ -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>
diff --git a/doc/src/sgml/ref/drop_language.sgml b/doc/src/sgml/ref/drop_language.sgml
index 0facc62876..f014a74d45 100644
--- a/doc/src/sgml/ref/drop_language.sgml
+++ b/doc/src/sgml/ref/drop_language.sgml
@@ -120,7 +120,6 @@ <title>See Also</title>
   <simplelist type="inline">
    <member><xref linkend="sql-alterlanguage"></member>
    <member><xref linkend="sql-createlanguage"></member>
-   <member><xref linkend="app-droplang"></member>
   </simplelist>
  </refsect1>
 
diff --git a/doc/src/sgml/ref/droplang.sgml b/doc/src/sgml/ref/droplang.sgml
deleted file mode 100644
index 86f05d6b05..0000000000
--- a/doc/src/sgml/ref/droplang.sgml
+++ /dev/null
@@ -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>
diff --git a/doc/src/sgml/reference.sgml b/doc/src/sgml/reference.sgml
index c8191de9fe..3d8ad232fa 100644
--- a/doc/src/sgml/reference.sgml
+++ b/doc/src/sgml/reference.sgml
@@ -233,10 +233,8 @@ <title>PostgreSQL Client Applications</title>
 
    &clusterdb;
    &createdb;
-   &createlang;
    &createuser;
    &dropdb;
-   &droplang;
    &dropuser;
    &ecpgRef;
    &pgBasebackup;
diff --git a/doc/src/sgml/release-9.1.sgml b/doc/src/sgml/release-9.1.sgml
index eb2d6ac278..2d0540c39e 100644
--- a/doc/src/sgml/release-9.1.sgml
+++ b/doc/src/sgml/release-9.1.sgml
@@ -10860,9 +10860,7 @@ <title>Client Applications</title>
 
      <listitem>
       <para>
-        Mark <link
-        linkend="APP-CREATELANG"><application>createlang</></link>
-        and <link linkend="APP-DROPLANG"><application>droplang</></link>
+        Mark <application>createlang</> and <application>droplang</>
         as deprecated now that they just invoke extension commands (Tom
         Lane)
       </para>
diff --git a/doc/src/sgml/xplang.sgml b/doc/src/sgml/xplang.sgml
index 9fa97d4c70..4460c8f361 100644
--- a/doc/src/sgml/xplang.sgml
+++ b/doc/src/sgml/xplang.sgml
@@ -56,14 +56,7 @@ <title>Installing Procedural Languages</title>
     For the languages supplied with the standard distribution, it is
     only necessary to execute <command>CREATE EXTENSION</>
     <replaceable>language_name</> to install the language into the
-    current database.  Alternatively, the program <xref
-    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>
+    current database.
     The manual procedure described below is only recommended for
     installing languages that have not been packaged as extensions.
    </para>
diff --git a/src/bin/scripts/.gitignore b/src/bin/scripts/.gitignore
index 40998d9670..0f23fe0004 100644
--- a/src/bin/scripts/.gitignore
+++ b/src/bin/scripts/.gitignore
@@ -1,9 +1,7 @@
 /clusterdb
 /createdb
-/createlang
 /createuser
 /dropdb
-/droplang
 /dropuser
 /reindexdb
 /vacuumdb
diff --git a/src/bin/scripts/Makefile b/src/bin/scripts/Makefile
index 2f911e05ba..45ac492cfd 100644
--- a/src/bin/scripts/Makefile
+++ b/src/bin/scripts/Makefile
@@ -16,7 +16,7 @@ subdir = src/bin/scripts
 top_builddir = ../../..
 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)
 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)
 
 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
 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
 clusterdb: clusterdb.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_PROGRAM) createdb$(X)   '$(DESTDIR)$(bindir)'/createdb$(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) dropuser$(X)   '$(DESTDIR)$(bindir)'/dropuser$(X)
 	$(INSTALL_PROGRAM) clusterdb$(X)  '$(DESTDIR)$(bindir)'/clusterdb$(X)
diff --git a/src/bin/scripts/createlang.c b/src/bin/scripts/createlang.c
deleted file mode 100644
index 5897bfe747..0000000000
--- a/src/bin/scripts/createlang.c
+++ /dev/null
@@ -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"));
-}
diff --git a/src/bin/scripts/droplang.c b/src/bin/scripts/droplang.c
deleted file mode 100644
index 97d1de43ae..0000000000
--- a/src/bin/scripts/droplang.c
+++ /dev/null
@@ -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"));
-}
diff --git a/src/bin/scripts/nls.mk b/src/bin/scripts/nls.mk
index 9156d08a80..ef64083f5f 100644
--- a/src/bin/scripts/nls.mk
+++ b/src/bin/scripts/nls.mk
@@ -1,8 +1,8 @@
 # src/bin/scripts/nls.mk
 CATALOG_NAME     = pgscripts
 AVAIL_LANGUAGES  = cs de es fr it ja ko pl pt_BR ru sv zh_CN
-GETTEXT_FILES    = createdb.c createlang.c createuser.c \
-                   dropdb.c droplang.c dropuser.c \
+GETTEXT_FILES    = createdb.c createuser.c \
+                   dropdb.c dropuser.c \
                    clusterdb.c vacuumdb.c reindexdb.c \
                    pg_isready.c \
                    common.c \
diff --git a/src/bin/scripts/t/030_createlang.pl b/src/bin/scripts/t/030_createlang.pl
deleted file mode 100644
index ffbd35dcc5..0000000000
--- a/src/bin/scripts/t/030_createlang.pl
+++ /dev/null
@@ -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');
diff --git a/src/bin/scripts/t/060_droplang.pl b/src/bin/scripts/t/060_droplang.pl
deleted file mode 100644
index 904cea2d4b..0000000000
--- a/src/bin/scripts/t/060_droplang.pl
+++ /dev/null
@@ -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');
diff --git a/src/tools/msvc/Install.pm b/src/tools/msvc/Install.pm
index 0aa1422b9f..b81f4dd809 100644
--- a/src/tools/msvc/Install.pm
+++ b/src/tools/msvc/Install.pm
@@ -20,8 +20,8 @@ our (@ISA, @EXPORT_OK);
 my $insttype;
 my @client_contribs = ('oid2name', 'pgbench', 'vacuumlo');
 my @client_program_files = (
-	'clusterdb',     'createdb',       'createlang', 'createuser',
-	'dropdb',        'droplang',       'dropuser',   'ecpg',
+	'clusterdb',     'createdb',       'createuser',
+	'dropdb',        'dropuser',       'ecpg',
 	'libecpg',       'libecpg_compat', 'libpgtypes', 'libpq',
 	'pg_basebackup', 'pg_config',      'pg_dump',    'pg_dumpall',
 	'pg_isready',    'pg_receivewal', 'pg_recvlogical', 'pg_restore',
-- 
2.12.0

