Обсуждение: Solution for bug #899

Поиск
Список
Период
Сортировка

Solution for bug #899

От
Laurent FAILLIE
Дата:
Hi,

I have patched pg_dump.c to have a correct output file
when the database use procedure langages.

Bye

Laurent

PS: I have tryed to send the full source code as
attachement but my message never appear in this ML, so
I hope this diff file is enought ...

**** diff ****

603a604,606
>     MoveToStart(g_fout, "ACL LANGUAGE");
>     MoveToStart(g_fout, "PROCEDURAL LANGUAGE");
>     MoveToStart(g_fout, "FUNC PROCEDURAL LANGUAGE");
3522c3525
<             dumpACL(fout, "LANGUAGE", tmp, lanname,
---
>             dumpACL(fout, "ACL LANGUAGE", tmp, lanname,
3526a3530,3531
>
>
3627a3633
>     char       *funcproclang;
3643c3649,3650
<                           "(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 "
3655c3662,3663
<                           "(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 "
3667c3675,3676
<                           "(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 "
3697a3707
>     funcproclang = PQgetvalue(res, 0, PQfnumber(res,
"funcproclang"));
3768c3778
<                  finfo->usename, "FUNCTION", NULL,
---
>                  finfo->usename,
strcmp(funcproclang,"t")?"FUNCTION":"FUNC PROCEDURAL
LANGUAGE", NULL,
4874a4885,4886
>     char       acl_lang=0;
>
4877a4890,4894
>     if(!strcmp(type,"ACL LANGUAGE")){
>         type = "LANGUAGE";
>         acl_lang = 1;
>     }
>
4992c5009
<                  "ACL", NULL, sql->data, "", NULL, NULL, NULL);
---
>                 acl_lang ? "ACL LANGUAGE" : "ACL", NULL,
sql->data, "", NULL, NULL, NULL);


=====
The misspelling master is on the Web.  _________    100 % Dictionnary Free ! /        /(/  Dico  / /    Pleins d'autres
fautessur 
/________/ /    http://go.to/destroyedlolo
(#######( /    http://destroyedlolo.homeunix.org:8080
Quoi, des fautes d'orthographe! Pas possible ;-D.

___________________________________________________________
Do You Yahoo!? -- Une adresse @yahoo.fr gratuite et en français !
Yahoo! Mail : http://fr.mail.yahoo.com


Re: Solution for bug #899

От
Bruce Momjian
Дата:
Can I get a context diff (diff -c) of this?  What exactly did you
change and why?

---------------------------------------------------------------------------

Laurent FAILLIE wrote:
> Hi,
>
> I have patched pg_dump.c to have a correct output file
> when the database use procedure langages.
>
> Bye
>
> Laurent
>
> PS: I have tryed to send the full source code as
> attachement but my message never appear in this ML, so
> I hope this diff file is enought ...
>
> **** diff ****
>
> 603a604,606
> >     MoveToStart(g_fout, "ACL LANGUAGE");
> >     MoveToStart(g_fout, "PROCEDURAL LANGUAGE");
> >     MoveToStart(g_fout, "FUNC PROCEDURAL LANGUAGE");
> 3522c3525
> <             dumpACL(fout, "LANGUAGE", tmp, lanname,
> ---
> >             dumpACL(fout, "ACL LANGUAGE", tmp, lanname,
> 3526a3530,3531
> >
> >
> 3627a3633
> >     char       *funcproclang;
> 3643c3649,3650
> <                           "(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 "
> 3655c3662,3663
> <                           "(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 "
> 3667c3675,3676
> <                           "(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 "
> 3697a3707
> >     funcproclang = PQgetvalue(res, 0, PQfnumber(res,
> "funcproclang"));
> 3768c3778
> <                  finfo->usename, "FUNCTION", NULL,
> ---
> >                  finfo->usename,
> strcmp(funcproclang,"t")?"FUNCTION":"FUNC PROCEDURAL
> LANGUAGE", NULL,
> 4874a4885,4886
> >     char       acl_lang=0;
> >
> 4877a4890,4894
> >     if(!strcmp(type,"ACL LANGUAGE")){
> >         type = "LANGUAGE";
> >         acl_lang = 1;
> >     }
> >
> 4992c5009
> <                  "ACL", NULL, sql->data, "", NULL, NULL, NULL);
> ---
> >                 acl_lang ? "ACL LANGUAGE" : "ACL", NULL,
> sql->data, "", NULL, NULL, NULL);
>
>
> =====
> The misspelling master is on the Web.
>    _________    100 % Dictionnary Free !
>   /        /(
>  /  Dico  / /    Pleins d'autres fautes sur
> /________/ /    http://go.to/destroyedlolo
> (#######( /    http://destroyedlolo.homeunix.org:8080
> Quoi, des fautes d'orthographe! Pas possible ;-D.
>
> ___________________________________________________________
> Do You Yahoo!? -- Une adresse @yahoo.fr gratuite et en fran?ais !
> Yahoo! Mail : http://fr.mail.yahoo.com
>
> ---------------------------(end of broadcast)---------------------------
> TIP 1: subscribe and unsubscribe commands go to majordomo@postgresql.org
>

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073

Re: Solution for bug #899

От
Laurent FAILLIE
Дата:
--- Bruce Momjian <pgman@candle.pha.pa.us> a écrit :
>
> Can I get a context diff (diff -c) of this?

Ok, but you have to wait 'till end of next week
because I'm on hollidays (SSSskkkkkkiiiii :-)))) ).

> What
> exactly did you
> change and why?

Ok, some explanations :
> > 603a604,606
> > >     MoveToStart(g_fout, "ACL LANGUAGE");
> > >     MoveToStart(g_fout, "PROCEDURAL LANGUAGE");
> > >     MoveToStart(g_fout, "FUNC PROCEDURAL
> LANGUAGE");

-> Move all Languages stuffs in the beggining of the
listing, juste after database creation. In order :
- handler of the language,
- language declaration,
- ACL for them.

> > 3522c3525
> > <             dumpACL(fout, "LANGUAGE", tmp, lanname,
> > ---
> > >             dumpACL(fout, "ACL LANGUAGE", tmp, lanname,

-> it's not a "normal" ACL, but it's for procedural
language. We need to have a specific signature, "ACL
LANGUAGE", to make differences w/ other ACL.

> > 3526a3530,3531
> > >
> > >
> > 3627a3633
> > >     char       *funcproclang;
> > 3643c3649,3650
> > <                           "(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 "
> > 3655c3662,3663
> > <                           "(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 "
> > 3667c3675,3676
> > <                           "(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 "
> > 3697a3707
> > >     funcproclang = PQgetvalue(res, 0,
> PQfnumber(res,
> > "funcproclang"));
> > 3768c3778

=> add a new flags, funcproclang, which is true only
if the record is for an handler for procedural
language.

> > <                  finfo->usename, "FUNCTION", NULL,
> > ---
> > >                  finfo->usename,
> > strcmp(funcproclang,"t")?"FUNCTION":"FUNC
> PROCEDURAL
> > LANGUAGE", NULL,

=> Change the signature for handler, according to
funcproclang.

> > 4874a4885,4886
> > >     char       acl_lang=0;
> > >
> > 4877a4890,4894
> > >     if(!strcmp(type,"ACL LANGUAGE")){
> > >         type = "LANGUAGE";
> > >         acl_lang = 1;
> > >     }
> > >
> > 4992c5009
> > <                  "ACL", NULL, sql->data, "", NULL, NULL,
> NULL);
> > ---
> > >                 acl_lang ? "ACL LANGUAGE" : "ACL", NULL,
> > sql->data, "", NULL, NULL, NULL);

=> We have changed the signature of language ACL. But,
dumpACL()'s code use this signature to build requests
to take informations inside the database, and,
obviously, it doesn't work w/ my new one.
So, my solution was to use a flag, acl_lang, about
dumping language ACL, and reset type to the standard
"LANGUAGE".
The last step is to store ACL w/ the right signature
according to this flag ...

That's all, I hope my poor english will be
understandable ;-D

Bye

Laurent


=====
The misspelling master is on the Web.  _________    100 % Dictionnary Free ! /        /(/  Dico  / /    Pleins d'autres
fautessur 
/________/ /    http://go.to/destroyedlolo
(#######( /    http://destroyedlolo.homeunix.org:8080
Quoi, des fautes d'orthographe! Pas possible ;-D.

___________________________________________________________
Do You Yahoo!? -- Une adresse @yahoo.fr gratuite et en français !
Yahoo! Mail : http://fr.mail.yahoo.com


Re: Solution for bug #899

От
Laurent FAILLIE
Дата:
Ok there is the context diff of my modification :

Bye

Laurent

-------------------

*** postgresql-7.3.2/src/bin/pg_dump/pg_dump.c    Fri Dec
27 18:10:55 2002
--- postgresql-7.3.2/src/bin/pg_dump/pg_dump.c.new    Wed
Mar  5 12:12:32 2003
***************
*** 601,606 ****
--- 601,609 ----      /* Now sort the output nicely */     SortTocByOID(g_fout);
+     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"); 
***************
*** 3519,3529 ****         {             char       *tmp = strdup(fmtId(lanname));
!             dumpACL(fout, "LANGUAGE", tmp, lanname,                     finfo[fidx].pronamespace->nspname,
        NULL, lanacl, lanoid);             free(tmp);         }     }      PQclear(res); 
--- 3522,3534 ----         {             char       *tmp = strdup(fmtId(lanname));
!             dumpACL(fout, "ACL LANGUAGE", tmp, lanname,                     finfo[fidx].pronamespace->nspname,
            NULL, lanacl, lanoid);             free(tmp);         } 
+
+              }      PQclear(res);
***************
*** 3625,3630 ****
--- 3630,3636 ----     char       *prosecdef;     char       *lanname;     char       *rettypename;
+     char       *funcproclang;      if (finfo->dumped)         goto done;
***************
*** 3640,3646 ****         appendPQExpBuffer(query,                           "SELECT proretset, prosrc, probin, "
                    "provolatile, proisstrict, prosecdef, " 
!                           "(SELECT lanname FROM pg_catalog.pg_language
WHERE oid = prolang) as lanname "                           "FROM pg_catalog.pg_proc "                           "WHERE
oid= '%s'::pg_catalog.oid",                           finfo->oid); 
--- 3646,3653 ----         appendPQExpBuffer(query,                           "SELECT proretset, prosrc, probin, "
                    "provolatile, proisstrict, prosecdef, " 
!                           "(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); 
***************
*** 3652,3658 ****          "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 "                           "FROM pg_proc "                           "WHERE oid = '%s'::oid",
                      finfo->oid); 
--- 3659,3666 ----          "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, "
!                           "exists (SELECT 'x' FROM pg_language WHERE
lanplcallfoid = pg_proc.oid) as funcproclang "                           "FROM pg_proc "
"WHEREoid = '%s'::oid",                           finfo->oid); 
***************
*** 3664,3670 ****          "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 "                           "FROM pg_proc "                           "WHERE oid = '%s'::oid",
                      finfo->oid); 
--- 3672,3679 ----          "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, "
!                           "exists (SELECT 'x' FROM pg_language WHERE
lanplcallfoid = pg_proc.oid) as funcproclang "                           "FROM pg_proc "
"WHEREoid = '%s'::oid",                           finfo->oid); 
***************
*** 3695,3700 ****
--- 3704,3710 ----     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
***************
*** 3765,3771 ****      ArchiveEntry(fout, finfo->oid, funcsig_tag,                  finfo->pronamespace->nspname,
!                  finfo->usename, "FUNCTION", NULL,                  q->data, delqry->data,                  NULL,
NULL,NULL);  
--- 3775,3781 ----      ArchiveEntry(fout, finfo->oid, funcsig_tag,                  finfo->pronamespace->nspname,
!                  finfo->usename,
strcmp(funcproclang,"t")?"FUNCTION":"FUNC PROCEDURAL
LANGUAGE", NULL,                  q->data, delqry->data,                  NULL, NULL, NULL);
***************
*** 4872,4880 ****
--- 4882,4897 ----                *tok,                *eqpos,                *priv;
+     char       acl_lang=0;
+      PQExpBuffer sql;     bool        found_owner_privs = false;
+     if(!strcmp(type,"ACL LANGUAGE")){
+         type = "LANGUAGE";
+         acl_lang = 1;
+     }
+      if (strlen(acls) == 0)         return;                    /* object has default permissions */
***************
*** 4989,4995 ****     }      ArchiveEntry(fout, objoid, tag, nspname, usename ?
usename : "",
!                  "ACL", NULL, sql->data, "", NULL, NULL, NULL);      free(aclbuf);     destroyPQExpBuffer(sql);
--- 5006,5012 ----     }      ArchiveEntry(fout, objoid, tag, nspname, usename ?
usename : "",
!                 acl_lang ? "ACL LANGUAGE" : "ACL", NULL,
sql->data, "", NULL, NULL, NULL);      free(aclbuf);     destroyPQExpBuffer(sql);


=====
The misspelling master is on the Web.  _________    100 % Dictionnary Free ! /        /(/  Dico  / /    Pleins d'autres
fautessur 
/________/ /    http://go.to/destroyedlolo
(#######( /    http://destroyedlolo.homeunix.org:8080
Quoi, des fautes d'orthographe! Pas possible ;-D.

___________________________________________________________
Do You Yahoo!? -- Une adresse @yahoo.fr gratuite et en français !
Yahoo! Mail : http://fr.mail.yahoo.com


Re: Solution for bug #899

От
Bruce Momjian
Дата:
Your patch has been added to the PostgreSQL unapplied patches list at:

    http://momjian.postgresql.org/cgi-bin/pgpatches

I will try to apply it within the next 48 hours.

---------------------------------------------------------------------------


Laurent FAILLIE wrote:
> Ok there is the context diff of my modification :
>
> Bye
>
> Laurent
>
> -------------------
>
> *** postgresql-7.3.2/src/bin/pg_dump/pg_dump.c    Fri Dec
> 27 18:10:55 2002
> --- postgresql-7.3.2/src/bin/pg_dump/pg_dump.c.new    Wed
> Mar  5 12:12:32 2003
> ***************
> *** 601,606 ****
> --- 601,609 ----
>
>       /* Now sort the output nicely */
>       SortTocByOID(g_fout);
> +     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");
> ***************
> *** 3519,3529 ****
>           {
>               char       *tmp = strdup(fmtId(lanname));
>
> !             dumpACL(fout, "LANGUAGE", tmp, lanname,
>                       finfo[fidx].pronamespace->nspname,
>                       NULL, lanacl, lanoid);
>               free(tmp);
>           }
>       }
>
>       PQclear(res);
> --- 3522,3534 ----
>           {
>               char       *tmp = strdup(fmtId(lanname));
>
> !             dumpACL(fout, "ACL LANGUAGE", tmp, lanname,
>                       finfo[fidx].pronamespace->nspname,
>                       NULL, lanacl, lanoid);
>               free(tmp);
>           }
> +
> +
>       }
>
>       PQclear(res);
> ***************
> *** 3625,3630 ****
> --- 3630,3636 ----
>       char       *prosecdef;
>       char       *lanname;
>       char       *rettypename;
> +     char       *funcproclang;
>
>       if (finfo->dumped)
>           goto done;
> ***************
> *** 3640,3646 ****
>           appendPQExpBuffer(query,
>                             "SELECT proretset, prosrc, probin, "
>                             "provolatile, proisstrict, prosecdef, "
> !                           "(SELECT lanname FROM pg_catalog.pg_language
> WHERE oid = prolang) as lanname "
>                             "FROM pg_catalog.pg_proc "
>                             "WHERE oid = '%s'::pg_catalog.oid",
>                             finfo->oid);
> --- 3646,3653 ----
>           appendPQExpBuffer(query,
>                             "SELECT proretset, prosrc, probin, "
>                             "provolatile, proisstrict, prosecdef, "
> !                           "(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);
> ***************
> *** 3652,3658 ****
>            "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 "
>                             "FROM pg_proc "
>                             "WHERE oid = '%s'::oid",
>                             finfo->oid);
> --- 3659,3666 ----
>            "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, "
> !                           "exists (SELECT 'x' FROM pg_language WHERE
> lanplcallfoid = pg_proc.oid) as funcproclang "
>                             "FROM pg_proc "
>                             "WHERE oid = '%s'::oid",
>                             finfo->oid);
> ***************
> *** 3664,3670 ****
>            "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 "
>                             "FROM pg_proc "
>                             "WHERE oid = '%s'::oid",
>                             finfo->oid);
> --- 3672,3679 ----
>            "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, "
> !                           "exists (SELECT 'x' FROM pg_language WHERE
> lanplcallfoid = pg_proc.oid) as funcproclang "
>                             "FROM pg_proc "
>                             "WHERE oid = '%s'::oid",
>                             finfo->oid);
> ***************
> *** 3695,3700 ****
> --- 3704,3710 ----
>       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
> ***************
> *** 3765,3771 ****
>
>       ArchiveEntry(fout, finfo->oid, funcsig_tag,
>                    finfo->pronamespace->nspname,
> !                  finfo->usename, "FUNCTION", NULL,
>                    q->data, delqry->data,
>                    NULL, NULL, NULL);
>
> --- 3775,3781 ----
>
>       ArchiveEntry(fout, finfo->oid, funcsig_tag,
>                    finfo->pronamespace->nspname,
> !                  finfo->usename,
> strcmp(funcproclang,"t")?"FUNCTION":"FUNC PROCEDURAL
> LANGUAGE", NULL,
>                    q->data, delqry->data,
>                    NULL, NULL, NULL);
>
> ***************
> *** 4872,4880 ****
> --- 4882,4897 ----
>                  *tok,
>                  *eqpos,
>                  *priv;
> +     char       acl_lang=0;
> +
>       PQExpBuffer sql;
>       bool        found_owner_privs = false;
>
> +     if(!strcmp(type,"ACL LANGUAGE")){
> +         type = "LANGUAGE";
> +         acl_lang = 1;
> +     }
> +
>       if (strlen(acls) == 0)
>           return;                    /* object has default permissions */
>
> ***************
> *** 4989,4995 ****
>       }
>
>       ArchiveEntry(fout, objoid, tag, nspname, usename ?
> usename : "",
> !                  "ACL", NULL, sql->data, "", NULL, NULL, NULL);
>
>       free(aclbuf);
>       destroyPQExpBuffer(sql);
> --- 5006,5012 ----
>       }
>
>       ArchiveEntry(fout, objoid, tag, nspname, usename ?
> usename : "",
> !                 acl_lang ? "ACL LANGUAGE" : "ACL", NULL,
> sql->data, "", NULL, NULL, NULL);
>
>       free(aclbuf);
>       destroyPQExpBuffer(sql);
>
>
> =====
> The misspelling master is on the Web.
>    _________    100 % Dictionnary Free !
>   /        /(
>  /  Dico  / /    Pleins d'autres fautes sur
> /________/ /    http://go.to/destroyedlolo
> (#######( /    http://destroyedlolo.homeunix.org:8080
> Quoi, des fautes d'orthographe! Pas possible ;-D.
>
> ___________________________________________________________
> Do You Yahoo!? -- Une adresse @yahoo.fr gratuite et en fran?ais !
> Yahoo! Mail : http://fr.mail.yahoo.com
>
> ---------------------------(end of broadcast)---------------------------
> TIP 2: you can get off all lists at once with the unregister command
>     (send "unregister YourEmailAddressHere" to majordomo@postgresql.org)
>

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073

Re: Solution for bug #899

От
Laurent FAILLIE
Дата:
--- Bruce Momjian <pgman@candle.pha.pa.us> a écrit :
>
> Your patch has been added to the PostgreSQL
> unapplied patches list at:
>
>     http://momjian.postgresql.org/cgi-bin/pgpatches
>
> I will try to apply it within the next 48 hours.

Ok, thanks a lot.

Have a nice day.

Laurent


=====
The misspelling master is on the Web.  _________    100 % Dictionnary Free ! /        /(/  Dico  / /    Pleins d'autres
fautessur 
/________/ /    http://go.to/destroyedlolo
(#######( /    http://destroyedlolo.homeunix.org:8080
Quoi, des fautes d'orthographe! Pas possible ;-D.

___________________________________________________________
Do You Yahoo!? -- Une adresse @yahoo.fr gratuite et en français !
Yahoo! Mail : http://fr.mail.yahoo.com


Re: Solution for bug #899

От
Bruce Momjian
Дата:
This patch can't be applied to CVS.  The pg_dump code has changed too
much since 7.3.X.   Would you supply a new patch for this?  Thanks.  You
can grab the current CVS or a snapshot from our ftp server.

Also, would you add a comment of how you are manipulating the ACL tags,
and its purpose.  Thanks.

---------------------------------------------------------------------------

Laurent FAILLIE wrote:
> Ok there is the context diff of my modification :
>
> Bye
>
> Laurent
>
> -------------------
>
> *** postgresql-7.3.2/src/bin/pg_dump/pg_dump.c    Fri Dec
> 27 18:10:55 2002
> --- postgresql-7.3.2/src/bin/pg_dump/pg_dump.c.new    Wed
> Mar  5 12:12:32 2003
> ***************
> *** 601,606 ****
> --- 601,609 ----
>
>       /* Now sort the output nicely */
>       SortTocByOID(g_fout);
> +     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");
> ***************
> *** 3519,3529 ****
>           {
>               char       *tmp = strdup(fmtId(lanname));
>
> !             dumpACL(fout, "LANGUAGE", tmp, lanname,
>                       finfo[fidx].pronamespace->nspname,
>                       NULL, lanacl, lanoid);
>               free(tmp);
>           }
>       }
>
>       PQclear(res);
> --- 3522,3534 ----
>           {
>               char       *tmp = strdup(fmtId(lanname));
>
> !             dumpACL(fout, "ACL LANGUAGE", tmp, lanname,
>                       finfo[fidx].pronamespace->nspname,
>                       NULL, lanacl, lanoid);
>               free(tmp);
>           }
> +
> +
>       }
>
>       PQclear(res);
> ***************
> *** 3625,3630 ****
> --- 3630,3636 ----
>       char       *prosecdef;
>       char       *lanname;
>       char       *rettypename;
> +     char       *funcproclang;
>
>       if (finfo->dumped)
>           goto done;
> ***************
> *** 3640,3646 ****
>           appendPQExpBuffer(query,
>                             "SELECT proretset, prosrc, probin, "
>                             "provolatile, proisstrict, prosecdef, "
> !                           "(SELECT lanname FROM pg_catalog.pg_language
> WHERE oid = prolang) as lanname "
>                             "FROM pg_catalog.pg_proc "
>                             "WHERE oid = '%s'::pg_catalog.oid",
>                             finfo->oid);
> --- 3646,3653 ----
>           appendPQExpBuffer(query,
>                             "SELECT proretset, prosrc, probin, "
>                             "provolatile, proisstrict, prosecdef, "
> !                           "(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);
> ***************
> *** 3652,3658 ****
>            "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 "
>                             "FROM pg_proc "
>                             "WHERE oid = '%s'::oid",
>                             finfo->oid);
> --- 3659,3666 ----
>            "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, "
> !                           "exists (SELECT 'x' FROM pg_language WHERE
> lanplcallfoid = pg_proc.oid) as funcproclang "
>                             "FROM pg_proc "
>                             "WHERE oid = '%s'::oid",
>                             finfo->oid);
> ***************
> *** 3664,3670 ****
>            "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 "
>                             "FROM pg_proc "
>                             "WHERE oid = '%s'::oid",
>                             finfo->oid);
> --- 3672,3679 ----
>            "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, "
> !                           "exists (SELECT 'x' FROM pg_language WHERE
> lanplcallfoid = pg_proc.oid) as funcproclang "
>                             "FROM pg_proc "
>                             "WHERE oid = '%s'::oid",
>                             finfo->oid);
> ***************
> *** 3695,3700 ****
> --- 3704,3710 ----
>       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
> ***************
> *** 3765,3771 ****
>
>       ArchiveEntry(fout, finfo->oid, funcsig_tag,
>                    finfo->pronamespace->nspname,
> !                  finfo->usename, "FUNCTION", NULL,
>                    q->data, delqry->data,
>                    NULL, NULL, NULL);
>
> --- 3775,3781 ----
>
>       ArchiveEntry(fout, finfo->oid, funcsig_tag,
>                    finfo->pronamespace->nspname,
> !                  finfo->usename,
> strcmp(funcproclang,"t")?"FUNCTION":"FUNC PROCEDURAL
> LANGUAGE", NULL,
>                    q->data, delqry->data,
>                    NULL, NULL, NULL);
>
> ***************
> *** 4872,4880 ****
> --- 4882,4897 ----
>                  *tok,
>                  *eqpos,
>                  *priv;
> +     char       acl_lang=0;
> +
>       PQExpBuffer sql;
>       bool        found_owner_privs = false;
>
> +     if(!strcmp(type,"ACL LANGUAGE")){
> +         type = "LANGUAGE";
> +         acl_lang = 1;
> +     }
> +
>       if (strlen(acls) == 0)
>           return;                    /* object has default permissions */
>
> ***************
> *** 4989,4995 ****
>       }
>
>       ArchiveEntry(fout, objoid, tag, nspname, usename ?
> usename : "",
> !                  "ACL", NULL, sql->data, "", NULL, NULL, NULL);
>
>       free(aclbuf);
>       destroyPQExpBuffer(sql);
> --- 5006,5012 ----
>       }
>
>       ArchiveEntry(fout, objoid, tag, nspname, usename ?
> usename : "",
> !                 acl_lang ? "ACL LANGUAGE" : "ACL", NULL,
> sql->data, "", NULL, NULL, NULL);
>
>       free(aclbuf);
>       destroyPQExpBuffer(sql);
>
>
> =====
> The misspelling master is on the Web.
>    _________    100 % Dictionnary Free !
>   /        /(
>  /  Dico  / /    Pleins d'autres fautes sur
> /________/ /    http://go.to/destroyedlolo
> (#######( /    http://destroyedlolo.homeunix.org:8080
> Quoi, des fautes d'orthographe! Pas possible ;-D.
>
> ___________________________________________________________
> Do You Yahoo!? -- Une adresse @yahoo.fr gratuite et en fran?ais !
> Yahoo! Mail : http://fr.mail.yahoo.com
>
> ---------------------------(end of broadcast)---------------------------
> TIP 2: you can get off all lists at once with the unregister command
>     (send "unregister YourEmailAddressHere" to majordomo@postgresql.org)
>

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073

Re: Solution for bug #899

От
Laurent FAILLIE
Дата:
Hello Bruce,

there is a contextual diff of my patch w/ the current
(I hope) snapshot of postgresql.

I test it on my own database, but I found another bug
w/ SEQUENCE this time. I have created a new ticket,
#918 for this as it's totaly a separate problem.

Bye

Laurent

------

*** pg_dump.c.org    Tue Mar 25 10:33:01 2003
--- pg_dump.c    Tue Mar 25 11:42:17 2003
***************
*** 605,610 ****
--- 605,618 ----      /* 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,3632 ****         {             char       *tmp = strdup(fmtId(lanname));
!             dumpACL(fout, "LANGUAGE", tmp, lanname,                     finfo[fidx].pronamespace->nspname,
        NULL, lanacl, lanoid);             free(tmp); 
--- 3634,3640 ----         {             char       *tmp = strdup(fmtId(lanname));
!             dumpACL(fout, "ACL LANGUAGE", tmp, lanname,                     finfo[fidx].pronamespace->nspname,
            NULL, lanacl, lanoid);             free(tmp); 
***************
*** 3732,3737 ****
--- 3740,3746 ----     char       *prosecdef;     char       *lanname;     char       *rettypename;
+     char       *funcproclang;    /* Boolean : is this
function a PLang handler ? */      if (finfo->dumped)         goto done;
***************
*** 3747,3753 ****         appendPQExpBuffer(query,                           "SELECT proretset, prosrc, probin, "
                    "provolatile, proisstrict, prosecdef, " 
!                           "(SELECT lanname FROM pg_catalog.pg_language
WHERE oid = prolang) as lanname "                           "FROM pg_catalog.pg_proc "                           "WHERE
oid= '%s'::pg_catalog.oid",                           finfo->oid); 
--- 3756,3763 ----         appendPQExpBuffer(query,                           "SELECT proretset, prosrc, probin, "
                    "provolatile, proisstrict, prosecdef, " 
!                           "(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,3765 ****          "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 "                           "FROM pg_proc "                           "WHERE oid = '%s'::oid",
                      finfo->oid); 
--- 3769,3776 ----          "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, "
!                           "exists (SELECT 'x' FROM pg_language WHERE
lanplcallfoid = pg_proc.oid) as funcproclang "                           "FROM pg_proc "
"WHEREoid = '%s'::oid",                           finfo->oid); 
***************
*** 3771,3777 ****          "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 "                           "FROM pg_proc "                           "WHERE oid = '%s'::oid",
                      finfo->oid); 
--- 3782,3789 ----          "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, "
!                           "exists (SELECT 'x' FROM pg_language WHERE
lanplcallfoid = pg_proc.oid) as funcproclang "                           "FROM pg_proc "
"WHEREoid = '%s'::oid",                           finfo->oid); 
***************
*** 3802,3807 ****
--- 3814,3820 ----     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,3878 ****      ArchiveEntry(fout, finfo->oid, funcsig_tag,                  finfo->pronamespace->nspname,
!                  finfo->usename, "FUNCTION", NULL,                  q->data, delqry->data,                  NULL,
NULL,NULL);  
--- 3885,3891 ----      ArchiveEntry(fout, finfo->oid, funcsig_tag,                  finfo->pronamespace->nspname,
!                  finfo->usename,
strcmp(funcproclang,"t")?"FUNCTION":"FUNC PROCEDURAL
LANGUAGE", NULL,                  q->data, delqry->data,                  NULL, NULL, NULL);
***************
*** 5024,5034 ****     PQExpBuffer sql, grantee, grantor, privs, privswgo;     bool        found_owner_privs = false;
  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)      sql = createPQExpBuffer();     grantee = createPQExpBuffer();
--- 5037,5057 ----     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_lang ? "ACL LANGUAGE" : "ACL" ,
NULL, command, "", NULL, NULL, NULL)      sql = createPQExpBuffer();     grantee = createPQExpBuffer();


=====
The misspelling master is on the Web.  _________    100 % Dictionnary Free ! /        /(/  Dico  / /    Pleins d'autres
fautessur 
/________/ /    http://go.to/destroyedlolo
(#######( /    http://destroyedlolo.homeunix.org:8080
Quoi, des fautes d'orthographe! Pas possible ;-D.

___________________________________________________________
Do You Yahoo!? -- Une adresse @yahoo.fr gratuite et en français !
Yahoo! Mail : http://fr.mail.yahoo.com



Re: Solution for bug #899

От
Bruce Momjian
Дата:
Your patch has been added to the PostgreSQL unapplied patches list at:

    http://momjian.postgresql.org/cgi-bin/pgpatches

I will try to apply it within the next 48 hours.

---------------------------------------------------------------------------


Laurent FAILLIE wrote:
> Hello Bruce,
>
> there is a contextual diff of my patch w/ the current
> (I hope) snapshot of postgresql.
>
> I test it on my own database, but I found another bug
> w/ SEQUENCE this time. I have created a new ticket,
> #918 for this as it's totaly a separate problem.
>
> Bye
>
> Laurent
>
> ------
>
> *** pg_dump.c.org    Tue Mar 25 10:33:01 2003
> --- pg_dump.c    Tue Mar 25 11:42:17 2003
> ***************
> *** 605,610 ****
> --- 605,618 ----
>
>       /* 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,3632 ****
>           {
>               char       *tmp = strdup(fmtId(lanname));
>
> !             dumpACL(fout, "LANGUAGE", tmp, lanname,
>                       finfo[fidx].pronamespace->nspname,
>                       NULL, lanacl, lanoid);
>               free(tmp);
> --- 3634,3640 ----
>           {
>               char       *tmp = strdup(fmtId(lanname));
>
> !             dumpACL(fout, "ACL LANGUAGE", tmp, lanname,
>                       finfo[fidx].pronamespace->nspname,
>                       NULL, lanacl, lanoid);
>               free(tmp);
> ***************
> *** 3732,3737 ****
> --- 3740,3746 ----
>       char       *prosecdef;
>       char       *lanname;
>       char       *rettypename;
> +     char       *funcproclang;    /* Boolean : is this
> function a PLang handler ? */
>
>       if (finfo->dumped)
>           goto done;
> ***************
> *** 3747,3753 ****
>           appendPQExpBuffer(query,
>                             "SELECT proretset, prosrc, probin, "
>                             "provolatile, proisstrict, prosecdef, "
> !                           "(SELECT lanname FROM pg_catalog.pg_language
> WHERE oid = prolang) as lanname "
>                             "FROM pg_catalog.pg_proc "
>                             "WHERE oid = '%s'::pg_catalog.oid",
>                             finfo->oid);
> --- 3756,3763 ----
>           appendPQExpBuffer(query,
>                             "SELECT proretset, prosrc, probin, "
>                             "provolatile, proisstrict, prosecdef, "
> !                           "(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,3765 ****
>            "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 "
>                             "FROM pg_proc "
>                             "WHERE oid = '%s'::oid",
>                             finfo->oid);
> --- 3769,3776 ----
>            "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, "
> !                           "exists (SELECT 'x' FROM pg_language WHERE
> lanplcallfoid = pg_proc.oid) as funcproclang "
>                             "FROM pg_proc "
>                             "WHERE oid = '%s'::oid",
>                             finfo->oid);
> ***************
> *** 3771,3777 ****
>            "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 "
>                             "FROM pg_proc "
>                             "WHERE oid = '%s'::oid",
>                             finfo->oid);
> --- 3782,3789 ----
>            "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, "
> !                           "exists (SELECT 'x' FROM pg_language WHERE
> lanplcallfoid = pg_proc.oid) as funcproclang "
>                             "FROM pg_proc "
>                             "WHERE oid = '%s'::oid",
>                             finfo->oid);
> ***************
> *** 3802,3807 ****
> --- 3814,3820 ----
>       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,3878 ****
>
>       ArchiveEntry(fout, finfo->oid, funcsig_tag,
>                    finfo->pronamespace->nspname,
> !                  finfo->usename, "FUNCTION", NULL,
>                    q->data, delqry->data,
>                    NULL, NULL, NULL);
>
> --- 3885,3891 ----
>
>       ArchiveEntry(fout, finfo->oid, funcsig_tag,
>                    finfo->pronamespace->nspname,
> !                  finfo->usename,
> strcmp(funcproclang,"t")?"FUNCTION":"FUNC PROCEDURAL
> LANGUAGE", NULL,
>                    q->data, delqry->data,
>                    NULL, NULL, NULL);
>
> ***************
> *** 5024,5034 ****
>       PQExpBuffer sql, grantee, grantor, privs, privswgo;
>       bool        found_owner_privs = false;
>
>       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)
>
>       sql = createPQExpBuffer();
>       grantee = createPQExpBuffer();
> --- 5037,5057 ----
>       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_lang ? "ACL LANGUAGE" : "ACL" ,
> NULL, command, "", NULL, NULL, NULL)
>
>       sql = createPQExpBuffer();
>       grantee = createPQExpBuffer();
>
>
> =====
> The misspelling master is on the Web.
>    _________    100 % Dictionnary Free !
>   /        /(
>  /  Dico  / /    Pleins d'autres fautes sur
> /________/ /    http://go.to/destroyedlolo
> (#######( /    http://destroyedlolo.homeunix.org:8080
> Quoi, des fautes d'orthographe! Pas possible ;-D.
>
> ___________________________________________________________
> Do You Yahoo!? -- Une adresse @yahoo.fr gratuite et en fran?ais !
> Yahoo! Mail : http://fr.mail.yahoo.com
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 3: if posting/reading through Usenet, please send an appropriate
> subscribe-nomail command to majordomo@postgresql.org so that your
> message can get through to the mailing list cleanly
>

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073

Re: Solution for bug #899

От
Bruce Momjian
Дата:
Patch applied.  Thanks.

---------------------------------------------------------------------------


Laurent FAILLIE wrote:
> Hello Bruce,
>
> there is a contextual diff of my patch w/ the current
> (I hope) snapshot of postgresql.
>
> I test it on my own database, but I found another bug
> w/ SEQUENCE this time. I have created a new ticket,
> #918 for this as it's totaly a separate problem.
>
> Bye
>
> Laurent
>
> ------
>
> *** pg_dump.c.org    Tue Mar 25 10:33:01 2003
> --- pg_dump.c    Tue Mar 25 11:42:17 2003
> ***************
> *** 605,610 ****
> --- 605,618 ----
>
>       /* 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,3632 ****
>           {
>               char       *tmp = strdup(fmtId(lanname));
>
> !             dumpACL(fout, "LANGUAGE", tmp, lanname,
>                       finfo[fidx].pronamespace->nspname,
>                       NULL, lanacl, lanoid);
>               free(tmp);
> --- 3634,3640 ----
>           {
>               char       *tmp = strdup(fmtId(lanname));
>
> !             dumpACL(fout, "ACL LANGUAGE", tmp, lanname,
>                       finfo[fidx].pronamespace->nspname,
>                       NULL, lanacl, lanoid);
>               free(tmp);
> ***************
> *** 3732,3737 ****
> --- 3740,3746 ----
>       char       *prosecdef;
>       char       *lanname;
>       char       *rettypename;
> +     char       *funcproclang;    /* Boolean : is this
> function a PLang handler ? */
>
>       if (finfo->dumped)
>           goto done;
> ***************
> *** 3747,3753 ****
>           appendPQExpBuffer(query,
>                             "SELECT proretset, prosrc, probin, "
>                             "provolatile, proisstrict, prosecdef, "
> !                           "(SELECT lanname FROM pg_catalog.pg_language
> WHERE oid = prolang) as lanname "
>                             "FROM pg_catalog.pg_proc "
>                             "WHERE oid = '%s'::pg_catalog.oid",
>                             finfo->oid);
> --- 3756,3763 ----
>           appendPQExpBuffer(query,
>                             "SELECT proretset, prosrc, probin, "
>                             "provolatile, proisstrict, prosecdef, "
> !                           "(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,3765 ****
>            "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 "
>                             "FROM pg_proc "
>                             "WHERE oid = '%s'::oid",
>                             finfo->oid);
> --- 3769,3776 ----
>            "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, "
> !                           "exists (SELECT 'x' FROM pg_language WHERE
> lanplcallfoid = pg_proc.oid) as funcproclang "
>                             "FROM pg_proc "
>                             "WHERE oid = '%s'::oid",
>                             finfo->oid);
> ***************
> *** 3771,3777 ****
>            "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 "
>                             "FROM pg_proc "
>                             "WHERE oid = '%s'::oid",
>                             finfo->oid);
> --- 3782,3789 ----
>            "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, "
> !                           "exists (SELECT 'x' FROM pg_language WHERE
> lanplcallfoid = pg_proc.oid) as funcproclang "
>                             "FROM pg_proc "
>                             "WHERE oid = '%s'::oid",
>                             finfo->oid);
> ***************
> *** 3802,3807 ****
> --- 3814,3820 ----
>       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,3878 ****
>
>       ArchiveEntry(fout, finfo->oid, funcsig_tag,
>                    finfo->pronamespace->nspname,
> !                  finfo->usename, "FUNCTION", NULL,
>                    q->data, delqry->data,
>                    NULL, NULL, NULL);
>
> --- 3885,3891 ----
>
>       ArchiveEntry(fout, finfo->oid, funcsig_tag,
>                    finfo->pronamespace->nspname,
> !                  finfo->usename,
> strcmp(funcproclang,"t")?"FUNCTION":"FUNC PROCEDURAL
> LANGUAGE", NULL,
>                    q->data, delqry->data,
>                    NULL, NULL, NULL);
>
> ***************
> *** 5024,5034 ****
>       PQExpBuffer sql, grantee, grantor, privs, privswgo;
>       bool        found_owner_privs = false;
>
>       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)
>
>       sql = createPQExpBuffer();
>       grantee = createPQExpBuffer();
> --- 5037,5057 ----
>       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_lang ? "ACL LANGUAGE" : "ACL" ,
> NULL, command, "", NULL, NULL, NULL)
>
>       sql = createPQExpBuffer();
>       grantee = createPQExpBuffer();
>
>
> =====
> The misspelling master is on the Web.
>    _________    100 % Dictionnary Free !
>   /        /(
>  /  Dico  / /    Pleins d'autres fautes sur
> /________/ /    http://go.to/destroyedlolo
> (#######( /    http://destroyedlolo.homeunix.org:8080
> Quoi, des fautes d'orthographe! Pas possible ;-D.
>
> ___________________________________________________________
> Do You Yahoo!? -- Une adresse @yahoo.fr gratuite et en fran?ais !
> Yahoo! Mail : http://fr.mail.yahoo.com
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 3: if posting/reading through Usenet, please send an appropriate
> subscribe-nomail command to majordomo@postgresql.org so that your
> message can get through to the mailing list cleanly
>

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073

Re: Solution for bug #899

От
Tom Lane
Дата:
Bruce Momjian <pgman@candle.pha.pa.us> writes:
> Patch applied.  Thanks.

Did you do anything to address my complaints about this patch?

            regards, tom lane

Re: Solution for bug #899

От
Bruce Momjian
Дата:
>Tom Lane wrote:
> Bruce Momjian <pgman@candle.pha.pa.us> writes:
> > Patch applied.  Thanks.
>
> Did you do anything to address my complaints about this patch?

Yes.  It is a new version of the patch, with comments in each section.

I am attaching the patch --- any other changes?

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073
Hello Bruce,

there is a contextual diff of my patch w/ the current
(I hope) snapshot of postgresql.

I test it on my own database, but I found another bug
w/ SEQUENCE this time. I have created a new ticket,
#918 for this as it's totaly a separate problem.

Bye

Laurent

------

*** pg_dump.c.org    Tue Mar 25 10:33:01 2003
--- pg_dump.c    Tue Mar 25 11:42:17 2003
***************
*** 605,610 ****
--- 605,618 ----
  
      /* 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,3632 ****
          {
              char       *tmp = strdup(fmtId(lanname));
  
!             dumpACL(fout, "LANGUAGE", tmp, lanname,
                      finfo[fidx].pronamespace->nspname,
                      NULL, lanacl, lanoid);
              free(tmp);
--- 3634,3640 ----
          {
              char       *tmp = strdup(fmtId(lanname));
  
!             dumpACL(fout, "ACL LANGUAGE", tmp, lanname,
                      finfo[fidx].pronamespace->nspname,
                      NULL, lanacl, lanoid);
              free(tmp);
***************
*** 3732,3737 ****
--- 3740,3746 ----
      char       *prosecdef;
      char       *lanname;
      char       *rettypename;
+     char       *funcproclang;    /* Boolean : is this function a PLang handler ? */
  
      if (finfo->dumped)
          goto done;
***************
*** 3747,3753 ****
          appendPQExpBuffer(query,
                            "SELECT proretset, prosrc, probin, "
                            "provolatile, proisstrict, prosecdef, "
!                           "(SELECT lanname FROM pg_catalog.pg_language WHERE oid = prolang) as lanname "
                            "FROM pg_catalog.pg_proc "
                            "WHERE oid = '%s'::pg_catalog.oid",
                            finfo->oid);
--- 3756,3763 ----
          appendPQExpBuffer(query,
                            "SELECT proretset, prosrc, probin, "
                            "provolatile, proisstrict, prosecdef, "
!                           "(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,3765 ****
           "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 "
                            "FROM pg_proc "
                            "WHERE oid = '%s'::oid",
                            finfo->oid);
--- 3769,3776 ----
           "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, "
!                           "exists (SELECT 'x' FROM pg_language WHERE lanplcallfoid = pg_proc.oid) as funcproclang "
                            "FROM pg_proc "
                            "WHERE oid = '%s'::oid",
                            finfo->oid);
***************
*** 3771,3777 ****
           "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 "
                            "FROM pg_proc "
                            "WHERE oid = '%s'::oid",
                            finfo->oid);
--- 3782,3789 ----
           "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, "
!                           "exists (SELECT 'x' FROM pg_language WHERE lanplcallfoid = pg_proc.oid) as funcproclang "
                            "FROM pg_proc "
                            "WHERE oid = '%s'::oid",
                            finfo->oid);
***************
*** 3802,3807 ****
--- 3814,3820 ----
      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,3878 ****
  
      ArchiveEntry(fout, finfo->oid, funcsig_tag,
                   finfo->pronamespace->nspname,
!                  finfo->usename, "FUNCTION", NULL,
                   q->data, delqry->data,
                   NULL, NULL, NULL);
  
--- 3885,3891 ----
  
      ArchiveEntry(fout, finfo->oid, funcsig_tag,
                   finfo->pronamespace->nspname,
!                  finfo->usename, strcmp(funcproclang,"t")?"FUNCTION":"FUNC PROCEDURAL LANGUAGE", NULL,
                   q->data, delqry->data,
                   NULL, NULL, NULL);
  
***************
*** 5024,5034 ****
      PQExpBuffer sql, grantee, grantor, privs, privswgo;
      bool        found_owner_privs = false;
  
      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)
  
      sql = createPQExpBuffer();
      grantee = createPQExpBuffer();
--- 5037,5057 ----
      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_lang ? "ACL LANGUAGE" : "ACL" , NULL,
command,"", NULL, NULL, NULL)
 
  
      sql = createPQExpBuffer();
      grantee = createPQExpBuffer();


=====
The misspelling master is on the Web.
   _________    100 % Dictionnary Free !
  /        /(
 /  Dico  / /    Pleins d'autres fautes sur
/________/ /    http://go.to/destroyedlolo
(#######( /    http://destroyedlolo.homeunix.org:8080
Quoi, des fautes d'orthographe! Pas possible ;-D.

___________________________________________________________
Do You Yahoo!? -- Une adresse @yahoo.fr gratuite et en fran�ais !
Yahoo! Mail : http://fr.mail.yahoo.com


---------------------------(end of broadcast)---------------------------
TIP 3: if posting/reading through Usenet, please send an appropriate
subscribe-nomail command to majordomo@postgresql.org so that your
message can get through to the mailing list cleanly