9
9
*
10
10
*-------------------------------------------------------------------------
11
11
*/
12
-
13
12
#include "postgres_fe.h"
13
+
14
14
#include "common.h"
15
15
#include "print.h"
16
16
@@ -47,18 +47,6 @@ main(int argc, char *argv[])
47
47
bool echo = false;
48
48
char * langname = NULL ;
49
49
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 ;
62
50
PQExpBufferData sql ;
63
51
PGconn * conn ;
64
52
PGresult * result ;
@@ -190,10 +178,9 @@ main(int argc, char *argv[])
190
178
executeCommand (conn , "SET search_path = pg_catalog;" , progname , echo );
191
179
192
180
/*
193
- * Make sure the language is installed and find the OIDs of the language
194
- * support functions
181
+ * Make sure the language is installed
195
182
*/
196
- printfPQExpBuffer (& sql , "SELECT lanplcallfoid, laninline, lanvalidator "
183
+ printfPQExpBuffer (& sql , "SELECT oid "
197
184
"FROM pg_language WHERE lanname = '%s' AND lanispl;" ,
198
185
langname );
199
186
result = executeQuery (conn , sql .data , progname , echo );
@@ -205,151 +192,14 @@ main(int argc, char *argv[])
205
192
progname , langname , dbname );
206
193
exit (1 );
207
194
}
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
- }
229
195
PQclear (result );
230
196
231
197
/*
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.
233
200
*/
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 );
243
202
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 );
353
203
if (echo )
354
204
printf ("%s" , sql .data );
355
205
result = PQexec (conn , sql .data );
0 commit comments