From 50c956add83963d7bbb367dd0b879fccddebd623 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Thu, 23 Mar 2017 14:16:45 -0400 Subject: [PATCH] Remove createlang and droplang They have been deprecated since PostgreSQL 9.1. Reviewed-by: Magnus Hagander Reviewed-by: Daniel Gustafsson --- 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 @@ hosts=local4,bind4 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 createlang failing with unusual errors. + is loading of extensions failing with unusual errors. For example, running as the owner of the PostgreSQL installation: --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. Running as a non-owner in the group possessing the PostgreSQL installation: --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 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 @@ createlang: language installation failed: ERROR: could not load library "/opt/d - In the case of the createlang example, above, + In the case of the plperl 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 @@ To install PL/Perl in a particular database, use - CREATE EXTENSION plperl, or from the shell command line use - createlang plperl dbname. + CREATE EXTENSION plperl. 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 @@ To install PL/Python in a particular database, use - CREATE EXTENSION plpythonu, or from the shell command line use - createlang plpythonu dbname (but + CREATE EXTENSION plpythonu (but see also ). 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 @@ directory if Tcl support is specified in the configuration step of the installation procedure. To install PL/Tcl and/or PL/TclU in a particular database, use the - CREATE EXTENSION command or the - createlang program, for example - createlang pltcl dbname or - createlang pltclu dbname. + CREATE EXTENSION command, for example + CREATE EXTENSION pltcl or + CREATE EXTENSION pltclu. 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 @@ Complete list of usable sgml source files in this directory. - - diff --git a/doc/src/sgml/ref/create_function.sgml b/doc/src/sgml/ref/create_function.sgml index 9d0d2f4beb..3f86141f80 100644 --- a/doc/src/sgml/ref/create_function.sgml +++ b/doc/src/sgml/ref/create_function.sgml @@ -847,7 +847,6 @@ COMMIT; - 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 @@ CREATE [ OR REPLACE ] [ TRUSTED ] [ PROCEDURAL ] LANGUAGE program is a simple wrapper around - the CREATE LANGUAGE command. It eases - installation of procedural languages from the shell command line. - - - - Use , or better yet the program, to drop procedural languages. + Use to drop procedural languages. The system catalog pg_language (see ) records information about the - currently installed languages. Also, createlang - has an option to list the installed languages. + currently installed languages. Also, the psql + command \dL lists the installed languages. @@ -325,8 +318,6 @@ CREATE LANGUAGE plsample - - 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 @@ - - - - - createlang - - - - createlang - 1 - Application - - - - createlang - install a PostgreSQL procedural language - - - - - createlang - connection-option - langname - dbname - - - - createlang - connection-option - - dbname - - - - - - Description - - - 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. - - - - - - - Options - - - createlang accepts the following command-line arguments: - - - - langname - - - Specifies the name of the procedural language to be - installed. (This name is lower-cased.) - - - - - - - - - - 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. - - - - - - - - - - Display SQL commands as they are executed. - - - - - - - - - - Show a list of already installed languages in the target database. - - - - - - - - - - Print the createlang version and exit. - - - - - - - - - - Show help about createlang command line - arguments, and exit. - - - - - - - - - createlang also accepts - the following command-line arguments for connection parameters: - - - - - - - - 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. - - - - - - - - - - Specifies the TCP port or local Unix domain socket file - extension on which the server - is listening for connections. - - - - - - - - - - User name to connect as. - - - - - - - - - - Never issue a password prompt. If the server requires - password authentication and a password is not available by - other means such as a .pgpass 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. - - - - - - - - - - Force createlang to prompt for a - password before connecting to a database. - - - - This option is never essential, since - createlang will automatically prompt - for a password if the server demands password authentication. - However, createlang will waste a - connection attempt finding out that the server wants a password. - In some cases it is worth typing - - - - - - - - - - Environment - - - - PGDATABASE - PGHOST - PGPORT - PGUSER - - - - Default connection parameters - - - - - - - This utility, like most other PostgreSQL utilities, - also uses the environment variables supported by libpq - (see ). - - - - - - - Diagnostics - - - Most error messages are self-explanatory. If not, run - createlang with the - option and see the respective SQL command - for details. Also, any default connection settings and environment - variables used by the libpq front-end - library will apply. - - - - - - Notes - - - Use to remove a language. - - - - - - Examples - - - To install the language pltcl into the database - template1: - -$ createlang pltcl template1 - - Note that installing the language into template1 - will cause it to be automatically installed into subsequently-created - databases as well. - - - - - See Also - - - - - - - - - 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 @@ DROP LANGUAGE plsample; - 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 @@ - - - - - droplang - - - - droplang - 1 - Application - - - - droplang - remove a PostgreSQL procedural language - - - - - droplang - connection-option - langname - dbname - - - - droplang - connection-option - - dbname - - - - - - Description - - - - droplang is a utility for removing an - existing procedural language from a - PostgreSQL database. - - - - 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. - - - - - - - Options - - - droplang accepts the following command line arguments: - - - - langname - - - Specifies the name of the procedural language to be removed. - (This name is lower-cased.) - - - - - - - - - - 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. - - - - - - - - - - Display SQL commands as they are executed. - - - - - - - - - - Show a list of already installed languages in the target database. - - - - - - - - - - Print the droplang version and exit. - - - - - - - - - - Show help about droplang command line - arguments, and exit. - - - - - - - - - droplang also accepts - the following command line arguments for connection parameters: - - - - - - - - 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. - - - - - - - - - - Specifies the Internet TCP/IP port or local Unix domain socket file - extension on which the server - is listening for connections. - - - - - - - - - - User name to connect as. - - - - - - - - - - Never issue a password prompt. If the server requires - password authentication and a password is not available by - other means such as a .pgpass 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. - - - - - - - - - - Force droplang to prompt for a - password before connecting to a database. - - - - This option is never essential, since - droplang will automatically prompt - for a password if the server demands password authentication. - However, droplang will waste a - connection attempt finding out that the server wants a password. - In some cases it is worth typing - - - - - - - - - - Environment - - - - PGDATABASE - PGHOST - PGPORT - PGUSER - - - - Default connection parameters - - - - - - - This utility, like most other PostgreSQL utilities, - also uses the environment variables supported by libpq - (see ). - - - - - - - Diagnostics - - - Most error messages are self-explanatory. If not, run - droplang with the - option and see under the respective SQL command - for details. Also, any default connection settings and environment - variables used by the libpq front-end - library will apply. - - - - - - Notes - - - Use to add a language. - - - - - - Examples - - - To remove the language pltcl: - -$ droplang pltcl dbname - - - - - See Also - - - - - - - - - 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 @@ &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 @@ SELECT * FROM places ORDER BY location <-> point '(101,456)' LIMIT 10; - Mark createlang - and droplang + Mark createlang and droplang as deprecated now that they just invoke extension commands (Tom Lane) 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 @@ For the languages supplied with the standard distribution, it is only necessary to execute CREATE EXTENSION language_name to install the language into the - current database. Alternatively, the program can be used to do this from the shell - command line. For example, to install the language - PL/Perl into the database - template1, use: - -createlang plperl template1 - + current database. The manual procedure described below is only recommended for installing languages that have not been packaged as extensions. 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 .\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 .\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',