12
12
*by PostgreSQL
13
13
*
14
14
* 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 $
16
16
*
17
17
*-------------------------------------------------------------------------
18
18
*/
@@ -605,6 +605,14 @@ main(int argc, char **argv)
605
605
606
606
/* Now sort the output nicely */
607
607
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" );
608
616
MoveToStart (g_fout ,"SCHEMA" );
609
617
MoveToStart (g_fout ,"DATABASE" );
610
618
MoveToEnd (g_fout ,"TABLE DATA" );
@@ -3626,7 +3634,7 @@ dumpProcLangs(Archive *fout, FuncInfo finfo[], int numFuncs)
3626
3634
{
3627
3635
char * tmp = strdup (fmtId (lanname ));
3628
3636
3629
- dumpACL (fout ,"LANGUAGE" ,tmp ,lanname ,
3637
+ dumpACL (fout ,"ACL LANGUAGE" ,tmp ,lanname ,
3630
3638
finfo [fidx ].pronamespace -> nspname ,
3631
3639
NULL ,lanacl ,lanoid );
3632
3640
free (tmp );
@@ -3732,6 +3740,7 @@ dumpOneFunc(Archive *fout, FuncInfo *finfo)
3732
3740
char * prosecdef ;
3733
3741
char * lanname ;
3734
3742
char * rettypename ;
3743
+ char * funcproclang ;/* Boolean : is this function a PLang handler ? */
3735
3744
3736
3745
if (finfo -> dumped )
3737
3746
gotodone ;
@@ -3747,7 +3756,8 @@ dumpOneFunc(Archive *fout, FuncInfo *finfo)
3747
3756
appendPQExpBuffer (query ,
3748
3757
"SELECT proretset, prosrc, probin, "
3749
3758
"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 "
3751
3761
"FROM pg_catalog.pg_proc "
3752
3762
"WHERE oid = '%s'::pg_catalog.oid" ,
3753
3763
finfo -> oid );
@@ -3759,7 +3769,8 @@ dumpOneFunc(Archive *fout, FuncInfo *finfo)
3759
3769
"case when proiscachable then 'i' else 'v' end as provolatile, "
3760
3770
"proisstrict, "
3761
3771
"'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 "
3763
3774
"FROM pg_proc "
3764
3775
"WHERE oid = '%s'::oid" ,
3765
3776
finfo -> oid );
@@ -3771,7 +3782,8 @@ dumpOneFunc(Archive *fout, FuncInfo *finfo)
3771
3782
"case when proiscachable then 'i' else 'v' end as provolatile, "
3772
3783
"'f'::boolean as proisstrict, "
3773
3784
"'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 "
3775
3787
"FROM pg_proc "
3776
3788
"WHERE oid = '%s'::oid" ,
3777
3789
finfo -> oid );
@@ -3802,6 +3814,7 @@ dumpOneFunc(Archive *fout, FuncInfo *finfo)
3802
3814
proisstrict = PQgetvalue (res ,0 ,PQfnumber (res ,"proisstrict" ));
3803
3815
prosecdef = PQgetvalue (res ,0 ,PQfnumber (res ,"prosecdef" ));
3804
3816
lanname = PQgetvalue (res ,0 ,PQfnumber (res ,"lanname" ));
3817
+ funcproclang = PQgetvalue (res ,0 ,PQfnumber (res ,"funcproclang" ));
3805
3818
3806
3819
/*
3807
3820
* See backend/commands/define.c for details of how the 'AS' clause is
@@ -3872,7 +3885,7 @@ dumpOneFunc(Archive *fout, FuncInfo *finfo)
3872
3885
3873
3886
ArchiveEntry (fout ,finfo -> oid ,funcsig_tag ,
3874
3887
finfo -> pronamespace -> nspname ,
3875
- finfo -> usename ," FUNCTION" ,NULL ,
3888
+ finfo -> usename ,strcmp ( funcproclang , "t" )? " FUNCTION" : "FUNC PROCEDURAL LANGUAGE " ,NULL ,
3876
3889
q -> data ,delqry -> data ,
3877
3890
NULL ,NULL ,NULL );
3878
3891
@@ -5024,11 +5037,21 @@ dumpACL(Archive *fout, const char *type, const char *name,
5024
5037
PQExpBuffer sql ,grantee ,grantor ,privs ,privswgo ;
5025
5038
bool found_owner_privs = false;
5026
5039
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
+
5027
5050
if (strlen (acls )== 0 )
5028
5051
return ;/* object has default permissions */
5029
5052
5030
5053
#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)
5032
5055
5033
5056
sql = createPQExpBuffer ();
5034
5057
grantee = createPQExpBuffer ();