diff --git a/doc/src/sgml/ref/createlang.sgml b/doc/src/sgml/ref/createlang.sgml
index 36bd318e1d..0bc1976c15 100644
--- a/doc/src/sgml/ref/createlang.sgml
+++ b/doc/src/sgml/ref/createlang.sgml
@@ -12,7 +12,7 @@ PostgreSQL documentation
createlang
- define a new PostgreSQL procedural language
+ install a PostgreSQL procedural language
@@ -40,12 +40,22 @@ PostgreSQL documentation
Description
- createlang is a utility for adding a new
- programming language to a PostgreSQL database.
- createlang is just a wrapper around the
-
- command.
+ createlang is a utility for adding a
+ procedural language to a PostgreSQL database.
+
+
+ createlang is just a wrapper around the
+ SQL command.
+
+
+
+
+ createlang is deprecated and may be removed
+ in a future PostgreSQL release. Direct use
+ of the CREATE EXTENSION> command is recommended instead.
+
+
@@ -60,8 +70,7 @@ PostgreSQL documentation
langname
- Specifies the name of the procedural programming language to be
- defined.
+ Specifies the name of the procedural language to be installed.
@@ -273,6 +282,7 @@ PostgreSQL documentation
+
diff --git a/doc/src/sgml/ref/droplang.sgml b/doc/src/sgml/ref/droplang.sgml
index c9d034a4c1..810c78e521 100644
--- a/doc/src/sgml/ref/droplang.sgml
+++ b/doc/src/sgml/ref/droplang.sgml
@@ -42,19 +42,22 @@ PostgreSQL documentation
droplang is a utility for removing an
- existing programming language from a
+ existing procedural language from a
PostgreSQL database.
- droplang can drop any procedural language,
- even those not supplied by the PostgreSQL> distribution.
+
- Although backend programming languages can be removed directly using
- several SQL commands, it is recommended to use
- droplang because it performs a number
- of checks and is much easier to use. See
-
- for more.
+ droplang is just a wrapper around the
+ SQL command.
+
+
+
+ droplang is deprecated and may be removed
+ in a future PostgreSQL release. Direct use
+ of the DROP EXTENSION> command is recommended instead.
+
+
@@ -69,7 +72,7 @@ PostgreSQL documentation
langname
- Specifies the name of the backend programming language to be removed.
+ Specifies the name of the procedural language to be removed.
@@ -277,6 +280,7 @@ PostgreSQL documentation
+
diff --git a/src/bin/scripts/createlang.c b/src/bin/scripts/createlang.c
index 3c68400528..c2153db630 100644
--- a/src/bin/scripts/createlang.c
+++ b/src/bin/scripts/createlang.c
@@ -188,7 +188,15 @@ main(int argc, char *argv[])
}
PQclear(result);
- printfPQExpBuffer(&sql, "CREATE LANGUAGE \"%s\";\n", langname);
+ /*
+ * 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\";\n", langname);
+ else
+ printfPQExpBuffer(&sql, "CREATE LANGUAGE \"%s\";\n", langname);
if (echo)
printf("%s", sql.data);
diff --git a/src/bin/scripts/droplang.c b/src/bin/scripts/droplang.c
index 0d03d3c4b7..83c1b531c7 100644
--- a/src/bin/scripts/droplang.c
+++ b/src/bin/scripts/droplang.c
@@ -9,8 +9,8 @@
*
*-------------------------------------------------------------------------
*/
-
#include "postgres_fe.h"
+
#include "common.h"
#include "print.h"
@@ -47,18 +47,6 @@ main(int argc, char *argv[])
bool echo = false;
char *langname = NULL;
char *p;
- Oid lanplcallfoid;
- Oid laninline;
- Oid lanvalidator;
- char *handler;
- char *inline_handler;
- char *validator;
- char *handler_ns;
- char *inline_ns;
- char *validator_ns;
- bool keephandler;
- bool keepinline;
- bool keepvalidator;
PQExpBufferData sql;
PGconn *conn;
PGresult *result;
@@ -190,10 +178,9 @@ main(int argc, char *argv[])
executeCommand(conn, "SET search_path = pg_catalog;", progname, echo);
/*
- * Make sure the language is installed and find the OIDs of the language
- * support functions
+ * Make sure the language is installed
*/
- printfPQExpBuffer(&sql, "SELECT lanplcallfoid, laninline, lanvalidator "
+ printfPQExpBuffer(&sql, "SELECT oid "
"FROM pg_language WHERE lanname = '%s' AND lanispl;",
langname);
result = executeQuery(conn, sql.data, progname, echo);
@@ -205,151 +192,14 @@ main(int argc, char *argv[])
progname, langname, dbname);
exit(1);
}
- lanplcallfoid = atooid(PQgetvalue(result, 0, 0));
- laninline = atooid(PQgetvalue(result, 0, 1));
- lanvalidator = atooid(PQgetvalue(result, 0, 2));
PQclear(result);
/*
- * Check that there are no functions left defined in that language
+ * 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, "SELECT count(proname) FROM pg_proc P, "
- "pg_language L WHERE P.prolang = L.oid "
- "AND L.lanname = '%s';", langname);
- result = executeQuery(conn, sql.data, progname, echo);
- if (strcmp(PQgetvalue(result, 0, 0), "0") != 0)
- {
- PQfinish(conn);
- fprintf(stderr,
- _("%s: still %s functions declared in language \"%s\"; "
- "language not removed\n"),
- progname, PQgetvalue(result, 0, 0), langname);
- exit(1);
- }
- PQclear(result);
+ printfPQExpBuffer(&sql, "DROP EXTENSION \"%s\";\n", langname);
- /*
- * Check that the handler function isn't used by some other language
- */
- printfPQExpBuffer(&sql, "SELECT count(*) FROM pg_language "
- "WHERE lanplcallfoid = %u AND lanname <> '%s';",
- lanplcallfoid, langname);
- result = executeQuery(conn, sql.data, progname, echo);
- if (strcmp(PQgetvalue(result, 0, 0), "0") == 0)
- keephandler = false;
- else
- keephandler = true;
- PQclear(result);
-
- /*
- * Find the handler name
- */
- if (!keephandler)
- {
- printfPQExpBuffer(&sql, "SELECT proname, (SELECT nspname "
- "FROM pg_namespace ns WHERE ns.oid = pronamespace) "
- "AS prons FROM pg_proc WHERE oid = %u;",
- lanplcallfoid);
- result = executeQuery(conn, sql.data, progname, echo);
- handler = strdup(PQgetvalue(result, 0, 0));
- handler_ns = strdup(PQgetvalue(result, 0, 1));
- PQclear(result);
- }
- else
- {
- handler = NULL;
- handler_ns = NULL;
- }
-
- /*
- * Check that the inline function isn't used by some other language
- */
- if (OidIsValid(laninline))
- {
- printfPQExpBuffer(&sql, "SELECT count(*) FROM pg_language "
- "WHERE laninline = %u AND lanname <> '%s';",
- laninline, langname);
- result = executeQuery(conn, sql.data, progname, echo);
- if (strcmp(PQgetvalue(result, 0, 0), "0") == 0)
- keepinline = false;
- else
- keepinline = true;
- PQclear(result);
- }
- else
- keepinline = true; /* don't try to delete it */
-
- /*
- * Find the inline handler name
- */
- if (!keepinline)
- {
- printfPQExpBuffer(&sql, "SELECT proname, (SELECT nspname "
- "FROM pg_namespace ns WHERE ns.oid = pronamespace) "
- "AS prons FROM pg_proc WHERE oid = %u;",
- laninline);
- result = executeQuery(conn, sql.data, progname, echo);
- inline_handler = strdup(PQgetvalue(result, 0, 0));
- inline_ns = strdup(PQgetvalue(result, 0, 1));
- PQclear(result);
- }
- else
- {
- inline_handler = NULL;
- inline_ns = NULL;
- }
-
- /*
- * Check that the validator function isn't used by some other language
- */
- if (OidIsValid(lanvalidator))
- {
- printfPQExpBuffer(&sql, "SELECT count(*) FROM pg_language "
- "WHERE lanvalidator = %u AND lanname <> '%s';",
- lanvalidator, langname);
- result = executeQuery(conn, sql.data, progname, echo);
- if (strcmp(PQgetvalue(result, 0, 0), "0") == 0)
- keepvalidator = false;
- else
- keepvalidator = true;
- PQclear(result);
- }
- else
- keepvalidator = true; /* don't try to delete it */
-
- /*
- * Find the validator name
- */
- if (!keepvalidator)
- {
- printfPQExpBuffer(&sql, "SELECT proname, (SELECT nspname "
- "FROM pg_namespace ns WHERE ns.oid = pronamespace) "
- "AS prons FROM pg_proc WHERE oid = %u;",
- lanvalidator);
- result = executeQuery(conn, sql.data, progname, echo);
- validator = strdup(PQgetvalue(result, 0, 0));
- validator_ns = strdup(PQgetvalue(result, 0, 1));
- PQclear(result);
- }
- else
- {
- validator = NULL;
- validator_ns = NULL;
- }
-
- /*
- * Drop the language and the functions
- */
- printfPQExpBuffer(&sql, "DROP LANGUAGE \"%s\";\n", langname);
- if (!keephandler)
- appendPQExpBuffer(&sql, "DROP FUNCTION \"%s\".\"%s\" ();\n",
- handler_ns, handler);
- if (!keepinline)
- appendPQExpBuffer(&sql, "DROP FUNCTION \"%s\".\"%s\" (internal);\n",
- inline_ns, inline_handler);
- if (!keepvalidator)
- appendPQExpBuffer(&sql, "DROP FUNCTION \"%s\".\"%s\" (oid);\n",
- validator_ns, validator);
if (echo)
printf("%s", sql.data);
result = PQexec(conn, sql.data);