99 *
1010 *-------------------------------------------------------------------------
1111 */
12-
1312#include "postgres_fe.h"
13+
1414#include "common.h"
1515#include "print.h"
1616
@@ -47,18 +47,6 @@ main(int argc, char *argv[])
4747 bool echo = false;
4848 char * langname = NULL ;
4949 char * p ;
50- Oid lanplcallfoid ;
51- Oid laninline ;
52- Oid lanvalidator ;
53- char * handler ;
54- char * inline_handler ;
55- char * validator ;
56- char * handler_ns ;
57- char * inline_ns ;
58- char * validator_ns ;
59- bool keephandler ;
60- bool keepinline ;
61- bool keepvalidator ;
6250 PQExpBufferData sql ;
6351 PGconn * conn ;
6452 PGresult * result ;
@@ -190,10 +178,9 @@ main(int argc, char *argv[])
190178 executeCommand (conn , "SET search_path = pg_catalog;" , progname , echo );
191179
192180 /*
193- * Make sure the language is installed and find the OIDs of the language
194- * support functions
181+ * Make sure the language is installed
195182 */
196- printfPQExpBuffer (& sql , "SELECT lanplcallfoid, laninline, lanvalidator "
183+ printfPQExpBuffer (& sql , "SELECT oid "
197184 "FROM pg_language WHERE lanname = '%s' AND lanispl;" ,
198185 langname );
199186 result = executeQuery (conn , sql .data , progname , echo );
@@ -205,151 +192,14 @@ main(int argc, char *argv[])
205192 progname , langname , dbname );
206193 exit (1 );
207194 }
208- lanplcallfoid = atooid (PQgetvalue (result , 0 , 0 ));
209- laninline = atooid (PQgetvalue (result , 0 , 1 ));
210- lanvalidator = atooid (PQgetvalue (result , 0 , 2 ));
211- PQclear (result );
212-
213- /*
214- * Check that there are no functions left defined in that language
215- */
216- printfPQExpBuffer (& sql , "SELECT count(proname) FROM pg_proc P, "
217- "pg_language L WHERE P.prolang = L.oid "
218- "AND L.lanname = '%s';" , langname );
219- result = executeQuery (conn , sql .data , progname , echo );
220- if (strcmp (PQgetvalue (result , 0 , 0 ), "0" ) != 0 )
221- {
222- PQfinish (conn );
223- fprintf (stderr ,
224- _ ("%s: still %s functions declared in language \"%s\"; "
225- "language not removed\n" ),
226- progname , PQgetvalue (result , 0 , 0 ), langname );
227- exit (1 );
228- }
229195 PQclear (result );
230196
231197 /*
232- * Check that the handler function isn't used by some other language
198+ * Attempt to drop the language. We do not use CASCADE, so that
199+ * the drop will fail if there are any functions in the language.
233200 */
234- printfPQExpBuffer (& sql , "SELECT count(*) FROM pg_language "
235- "WHERE lanplcallfoid = %u AND lanname <> '%s';" ,
236- lanplcallfoid , langname );
237- result = executeQuery (conn , sql .data , progname , echo );
238- if (strcmp (PQgetvalue (result , 0 , 0 ), "0" ) == 0 )
239- keephandler = false;
240- else
241- keephandler = true;
242- PQclear (result );
201+ printfPQExpBuffer (& sql , "DROP EXTENSION \"%s\";\n" , langname );
243202
244- /*
245- * Find the handler name
246- */
247- if (!keephandler )
248- {
249- printfPQExpBuffer (& sql , "SELECT proname, (SELECT nspname "
250- "FROM pg_namespace ns WHERE ns.oid = pronamespace) "
251- "AS prons FROM pg_proc WHERE oid = %u;" ,
252- lanplcallfoid );
253- result = executeQuery (conn , sql .data , progname , echo );
254- handler = strdup (PQgetvalue (result , 0 , 0 ));
255- handler_ns = strdup (PQgetvalue (result , 0 , 1 ));
256- PQclear (result );
257- }
258- else
259- {
260- handler = NULL ;
261- handler_ns = NULL ;
262- }
263-
264- /*
265- * Check that the inline function isn't used by some other language
266- */
267- if (OidIsValid (laninline ))
268- {
269- printfPQExpBuffer (& sql , "SELECT count(*) FROM pg_language "
270- "WHERE laninline = %u AND lanname <> '%s';" ,
271- laninline , langname );
272- result = executeQuery (conn , sql .data , progname , echo );
273- if (strcmp (PQgetvalue (result , 0 , 0 ), "0" ) == 0 )
274- keepinline = false;
275- else
276- keepinline = true;
277- PQclear (result );
278- }
279- else
280- keepinline = true; /* don't try to delete it */
281-
282- /*
283- * Find the inline handler name
284- */
285- if (!keepinline )
286- {
287- printfPQExpBuffer (& sql , "SELECT proname, (SELECT nspname "
288- "FROM pg_namespace ns WHERE ns.oid = pronamespace) "
289- "AS prons FROM pg_proc WHERE oid = %u;" ,
290- laninline );
291- result = executeQuery (conn , sql .data , progname , echo );
292- inline_handler = strdup (PQgetvalue (result , 0 , 0 ));
293- inline_ns = strdup (PQgetvalue (result , 0 , 1 ));
294- PQclear (result );
295- }
296- else
297- {
298- inline_handler = NULL ;
299- inline_ns = NULL ;
300- }
301-
302- /*
303- * Check that the validator function isn't used by some other language
304- */
305- if (OidIsValid (lanvalidator ))
306- {
307- printfPQExpBuffer (& sql , "SELECT count(*) FROM pg_language "
308- "WHERE lanvalidator = %u AND lanname <> '%s';" ,
309- lanvalidator , langname );
310- result = executeQuery (conn , sql .data , progname , echo );
311- if (strcmp (PQgetvalue (result , 0 , 0 ), "0" ) == 0 )
312- keepvalidator = false;
313- else
314- keepvalidator = true;
315- PQclear (result );
316- }
317- else
318- keepvalidator = true; /* don't try to delete it */
319-
320- /*
321- * Find the validator name
322- */
323- if (!keepvalidator )
324- {
325- printfPQExpBuffer (& sql , "SELECT proname, (SELECT nspname "
326- "FROM pg_namespace ns WHERE ns.oid = pronamespace) "
327- "AS prons FROM pg_proc WHERE oid = %u;" ,
328- lanvalidator );
329- result = executeQuery (conn , sql .data , progname , echo );
330- validator = strdup (PQgetvalue (result , 0 , 0 ));
331- validator_ns = strdup (PQgetvalue (result , 0 , 1 ));
332- PQclear (result );
333- }
334- else
335- {
336- validator = NULL ;
337- validator_ns = NULL ;
338- }
339-
340- /*
341- * Drop the language and the functions
342- */
343- printfPQExpBuffer (& sql , "DROP LANGUAGE \"%s\";\n" , langname );
344- if (!keephandler )
345- appendPQExpBuffer (& sql , "DROP FUNCTION \"%s\".\"%s\" ();\n" ,
346- handler_ns , handler );
347- if (!keepinline )
348- appendPQExpBuffer (& sql , "DROP FUNCTION \"%s\".\"%s\" (internal);\n" ,
349- inline_ns , inline_handler );
350- if (!keepvalidator )
351- appendPQExpBuffer (& sql , "DROP FUNCTION \"%s\".\"%s\" (oid);\n" ,
352- validator_ns , validator );
353203 if (echo )
354204 printf ("%s" , sql .data );
355205 result = PQexec (conn , sql .data );
0 commit comments