]> granicus.if.org Git - postgresql/commitdiff
Reorder language creation to restore constistently.
authorBruce Momjian <bruce@momjian.us>
Thu, 27 Mar 2003 16:39:17 +0000 (16:39 +0000)
committerBruce Momjian <bruce@momjian.us>
Thu, 27 Mar 2003 16:39:17 +0000 (16:39 +0000)
Laurent FAILLIE

src/bin/pg_dump/pg_dump.c

index d51f5f544da2d9ca6274b1338982f81e61919ed0..995144daae460d7cd6287854e8a0d7865a428870 100644 (file)
@@ -12,7 +12,7 @@
  *     by PostgreSQL
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.322 2003/03/20 07:05:21 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.323 2003/03/27 16:39:17 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -605,6 +605,14 @@ main(int argc, char **argv)
 
        /* Now sort the output nicely */
        SortTocByOID(g_fout);
+
+               /*
+                * Procedural languages have to be declared just after
+                * database and schema creation, before they are used.
+                */
+       MoveToStart(g_fout, "ACL LANGUAGE");
+       MoveToStart(g_fout, "PROCEDURAL LANGUAGE");
+       MoveToStart(g_fout, "FUNC PROCEDURAL LANGUAGE");
        MoveToStart(g_fout, "SCHEMA");
        MoveToStart(g_fout, "DATABASE");
        MoveToEnd(g_fout, "TABLE DATA");
@@ -3626,7 +3634,7 @@ dumpProcLangs(Archive *fout, FuncInfo finfo[], int numFuncs)
                {
                        char       *tmp = strdup(fmtId(lanname));
 
-                       dumpACL(fout, "LANGUAGE", tmp, lanname,
+                       dumpACL(fout, "ACL LANGUAGE", tmp, lanname,
                                        finfo[fidx].pronamespace->nspname,
                                        NULL, lanacl, lanoid);
                        free(tmp);
@@ -3732,6 +3740,7 @@ dumpOneFunc(Archive *fout, FuncInfo *finfo)
        char       *prosecdef;
        char       *lanname;
        char       *rettypename;
+       char       *funcproclang;       /* Boolean : is this function a PLang handler ? */
 
        if (finfo->dumped)
                goto done;
@@ -3747,7 +3756,8 @@ dumpOneFunc(Archive *fout, FuncInfo *finfo)
                appendPQExpBuffer(query,
                                                  "SELECT proretset, prosrc, probin, "
                                                  "provolatile, proisstrict, prosecdef, "
-                                                 "(SELECT lanname FROM pg_catalog.pg_language WHERE oid = prolang) as lanname "
+                                                 "(SELECT lanname FROM pg_catalog.pg_language WHERE oid = prolang) as lanname, "
+                                                 "exists (SELECT 'x' FROM pg_catalog.pg_language WHERE lanplcallfoid = pg_catalog.pg_proc.oid) as funcproclang "
                                                  "FROM pg_catalog.pg_proc "
                                                  "WHERE oid = '%s'::pg_catalog.oid",
                                                  finfo->oid);
@@ -3759,7 +3769,8 @@ dumpOneFunc(Archive *fout, FuncInfo *finfo)
                 "case when proiscachable then 'i' else 'v' end as provolatile, "
                                                  "proisstrict, "
                                                  "'f'::boolean as prosecdef, "
-                                                 "(SELECT lanname FROM pg_language WHERE oid = prolang) as lanname "
+                                                 "(SELECT lanname FROM pg_language WHERE oid = prolang) as lanname, "
+                                                 "exists (SELECT 'x' FROM pg_language WHERE lanplcallfoid = pg_proc.oid) as funcproclang "
                                                  "FROM pg_proc "
                                                  "WHERE oid = '%s'::oid",
                                                  finfo->oid);
@@ -3771,7 +3782,8 @@ dumpOneFunc(Archive *fout, FuncInfo *finfo)
                 "case when proiscachable then 'i' else 'v' end as provolatile, "
                                                  "'f'::boolean as proisstrict, "
                                                  "'f'::boolean as prosecdef, "
-                                                 "(SELECT lanname FROM pg_language WHERE oid = prolang) as lanname "
+                                                 "(SELECT lanname FROM pg_language WHERE oid = prolang) as lanname, "
+                                                 "exists (SELECT 'x' FROM pg_language WHERE lanplcallfoid = pg_proc.oid) as funcproclang "
                                                  "FROM pg_proc "
                                                  "WHERE oid = '%s'::oid",
                                                  finfo->oid);
@@ -3802,6 +3814,7 @@ dumpOneFunc(Archive *fout, FuncInfo *finfo)
        proisstrict = PQgetvalue(res, 0, PQfnumber(res, "proisstrict"));
        prosecdef = PQgetvalue(res, 0, PQfnumber(res, "prosecdef"));
        lanname = PQgetvalue(res, 0, PQfnumber(res, "lanname"));
+       funcproclang = PQgetvalue(res, 0, PQfnumber(res, "funcproclang"));
 
        /*
         * See backend/commands/define.c for details of how the 'AS' clause is
@@ -3872,7 +3885,7 @@ dumpOneFunc(Archive *fout, FuncInfo *finfo)
 
        ArchiveEntry(fout, finfo->oid, funcsig_tag,
                                 finfo->pronamespace->nspname,
-                                finfo->usename, "FUNCTION", NULL,
+                                finfo->usename, strcmp(funcproclang,"t")?"FUNCTION":"FUNC PROCEDURAL LANGUAGE", NULL,
                                 q->data, delqry->data,
                                 NULL, NULL, NULL);
 
@@ -5024,11 +5037,21 @@ dumpACL(Archive *fout, const char *type, const char *name,
        PQExpBuffer sql, grantee, grantor, privs, privswgo;
        bool            found_owner_privs = false;
 
+               /* acl_lang is a flag only true if we are dumping language's ACL,
+                * so we can set 'type' to a value that is suitable to build
+                * SQL requests as for other types.
+                */
+       bool       acl_lang = false;
+       if(!strcmp(type,"ACL LANGUAGE")){
+               type = "LANGUAGE";
+               acl_lang = true;
+       }
+
        if (strlen(acls) == 0)
                return;                                 /* object has default permissions */
 
 #define MKENTRY(grantor, command) \
-       ArchiveEntry(fout, objoid, tag, nspname, grantor ? grantor : "", "ACL", NULL, command, "", NULL, NULL, NULL)
+       ArchiveEntry(fout, objoid, tag, nspname, grantor ? grantor : "", acl_lang ? "ACL LANGUAGE" : "ACL" , NULL, command, "", NULL, NULL, NULL)
 
        sql = createPQExpBuffer();
        grantee = createPQExpBuffer();