@ -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 lanplcallf oid, 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
*/
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 ) ;
/*
* 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
* Attempt to drop the language . We do not use CASCADE , so that
* the drop will fail if there are any functions in the language .
*/
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 ;
}
printfPQExpBuffer ( & sql , " DROP EXTENSION \" %s \" ; \n " , langname ) ;
/*
* 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 ) ;