Skip to content

Commit b099d9e

Browse files
committed
Reorder language creation to restore constistently.
Laurent FAILLIE
1 parent 7a3e7b6 commit b099d9e

File tree

1 file changed

+30
-7
lines changed

1 file changed

+30
-7
lines changed

src/bin/pg_dump/pg_dump.c

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
* by PostgreSQL
1313
*
1414
* IDENTIFICATION
15-
* $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.322 2003/03/20 07:05:21 momjian Exp $
15+
* $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.323 2003/03/27 16:39:17 momjian Exp $
1616
*
1717
*-------------------------------------------------------------------------
1818
*/
@@ -605,6 +605,14 @@ main(int argc, char **argv)
605605

606606
/* Now sort the output nicely */
607607
SortTocByOID(g_fout);
608+
609+
/*
610+
* Procedural languages have to be declared just after
611+
* database and schema creation, before they are used.
612+
*/
613+
MoveToStart(g_fout, "ACL LANGUAGE");
614+
MoveToStart(g_fout, "PROCEDURAL LANGUAGE");
615+
MoveToStart(g_fout, "FUNC PROCEDURAL LANGUAGE");
608616
MoveToStart(g_fout, "SCHEMA");
609617
MoveToStart(g_fout, "DATABASE");
610618
MoveToEnd(g_fout, "TABLE DATA");
@@ -3626,7 +3634,7 @@ dumpProcLangs(Archive *fout, FuncInfo finfo[], int numFuncs)
36263634
{
36273635
char *tmp = strdup(fmtId(lanname));
36283636

3629-
dumpACL(fout, "LANGUAGE", tmp, lanname,
3637+
dumpACL(fout, "ACL LANGUAGE", tmp, lanname,
36303638
finfo[fidx].pronamespace->nspname,
36313639
NULL, lanacl, lanoid);
36323640
free(tmp);
@@ -3732,6 +3740,7 @@ dumpOneFunc(Archive *fout, FuncInfo *finfo)
37323740
char *prosecdef;
37333741
char *lanname;
37343742
char *rettypename;
3743+
char *funcproclang; /* Boolean : is this function a PLang handler ? */
37353744

37363745
if (finfo->dumped)
37373746
goto done;
@@ -3747,7 +3756,8 @@ dumpOneFunc(Archive *fout, FuncInfo *finfo)
37473756
appendPQExpBuffer(query,
37483757
"SELECT proretset, prosrc, probin, "
37493758
"provolatile, proisstrict, prosecdef, "
3750-
"(SELECT lanname FROM pg_catalog.pg_language WHERE oid = prolang) as lanname "
3759+
"(SELECT lanname FROM pg_catalog.pg_language WHERE oid = prolang) as lanname, "
3760+
"exists (SELECT 'x' FROM pg_catalog.pg_language WHERE lanplcallfoid = pg_catalog.pg_proc.oid) as funcproclang "
37513761
"FROM pg_catalog.pg_proc "
37523762
"WHERE oid = '%s'::pg_catalog.oid",
37533763
finfo->oid);
@@ -3759,7 +3769,8 @@ dumpOneFunc(Archive *fout, FuncInfo *finfo)
37593769
"case when proiscachable then 'i' else 'v' end as provolatile, "
37603770
"proisstrict, "
37613771
"'f'::boolean as prosecdef, "
3762-
"(SELECT lanname FROM pg_language WHERE oid = prolang) as lanname "
3772+
"(SELECT lanname FROM pg_language WHERE oid = prolang) as lanname, "
3773+
"exists (SELECT 'x' FROM pg_language WHERE lanplcallfoid = pg_proc.oid) as funcproclang "
37633774
"FROM pg_proc "
37643775
"WHERE oid = '%s'::oid",
37653776
finfo->oid);
@@ -3771,7 +3782,8 @@ dumpOneFunc(Archive *fout, FuncInfo *finfo)
37713782
"case when proiscachable then 'i' else 'v' end as provolatile, "
37723783
"'f'::boolean as proisstrict, "
37733784
"'f'::boolean as prosecdef, "
3774-
"(SELECT lanname FROM pg_language WHERE oid = prolang) as lanname "
3785+
"(SELECT lanname FROM pg_language WHERE oid = prolang) as lanname, "
3786+
"exists (SELECT 'x' FROM pg_language WHERE lanplcallfoid = pg_proc.oid) as funcproclang "
37753787
"FROM pg_proc "
37763788
"WHERE oid = '%s'::oid",
37773789
finfo->oid);
@@ -3802,6 +3814,7 @@ dumpOneFunc(Archive *fout, FuncInfo *finfo)
38023814
proisstrict = PQgetvalue(res, 0, PQfnumber(res, "proisstrict"));
38033815
prosecdef = PQgetvalue(res, 0, PQfnumber(res, "prosecdef"));
38043816
lanname = PQgetvalue(res, 0, PQfnumber(res, "lanname"));
3817+
funcproclang = PQgetvalue(res, 0, PQfnumber(res, "funcproclang"));
38053818

38063819
/*
38073820
* See backend/commands/define.c for details of how the 'AS' clause is
@@ -3872,7 +3885,7 @@ dumpOneFunc(Archive *fout, FuncInfo *finfo)
38723885

38733886
ArchiveEntry(fout, finfo->oid, funcsig_tag,
38743887
finfo->pronamespace->nspname,
3875-
finfo->usename, "FUNCTION", NULL,
3888+
finfo->usename, strcmp(funcproclang,"t")?"FUNCTION":"FUNC PROCEDURAL LANGUAGE", NULL,
38763889
q->data, delqry->data,
38773890
NULL, NULL, NULL);
38783891

@@ -5024,11 +5037,21 @@ dumpACL(Archive *fout, const char *type, const char *name,
50245037
PQExpBuffer sql, grantee, grantor, privs, privswgo;
50255038
bool found_owner_privs = false;
50265039

5040+
/* acl_lang is a flag only true if we are dumping language's ACL,
5041+
* so we can set 'type' to a value that is suitable to build
5042+
* SQL requests as for other types.
5043+
*/
5044+
bool acl_lang = false;
5045+
if(!strcmp(type,"ACL LANGUAGE")){
5046+
type = "LANGUAGE";
5047+
acl_lang = true;
5048+
}
5049+
50275050
if (strlen(acls) == 0)
50285051
return; /* object has default permissions */
50295052

50305053
#define MKENTRY(grantor, command) \
5031-
ArchiveEntry(fout, objoid, tag, nspname, grantor ? grantor : "", "ACL", NULL, command, "", NULL, NULL, NULL)
5054+
ArchiveEntry(fout, objoid, tag, nspname, grantor ? grantor : "", acl_lang ? "ACL LANGUAGE" : "ACL" , NULL, command, "", NULL, NULL, NULL)
50325055

50335056
sql = createPQExpBuffer();
50345057
grantee = createPQExpBuffer();

0 commit comments

Comments
 (0)