Thread: C language function dump problem
It seems some code disappeared from pg_dump.c between 7.0.2 and current, I think in the following revisions: revision 1.148 date: 2000/05/28 20:34:52; author: tgl; state: Exp; lines: +21 -42 Miscellaneous cleanups of places that needed to account for new pg_language entries. ---------------------------- revision 1.147 date: 2000/04/14 01:34:24; author: tgl; state: Exp; lines: +2 -2 Another static-vs-not-static error. The code is: ...in dumpOneFunc.... if (finfo[i].dumped) return; else finfo[i].dumped = 1; /* becomeUser(fout, finfo[i].usename); */ if (finfo[i].lang == INTERNALlanguageId) { func_def = finfo[i].prosrc; strcpy(func_lang, "INTERNAL"); } else if (finfo[i].lang == ClanguageId) { func_def = finfo[i].probin; strcpy(func_lang, "C"); } elseif (finfo[i].lang == SQLlanguageId) { func_def = finfo[i].prosrc; strcpy(func_lang, "SQL"); } else { and without this code, the dumps for plpgsql call handlers do not work (at least for me). It may be that I have messed something up in the code, but I don't think so. Any light you can shed on this would be great. P.S. The specific problem is that it now uses plsrc as the definition for all functions, whereas the (C language) plpgsql call handler requires plbin to be used. ---------------------------------------------------------------- Philip Warner | __---_____ Albatross Consulting Pty. Ltd. |----/ - \ (A.C.N. 008 659 498) | /(@) ______---_ Tel: (+61) 0500 83 82 81 | _________ \ Fax: (+61) 0500 83 82 82 | ___________ | Http://www.rhyme.com.au | / \| | --________-- PGP key available upon request, | / and from pgp5.ai.mit.edu:11371 |/
Philip Warner <pjw@rhyme.com.au> writes: > It seems some code disappeared from pg_dump.c between 7.0.2 and current, > ... > P.S. The specific problem is that it now uses plsrc as the definition for > all functions, whereas the (C language) plpgsql call handler requires plbin > to be used. Looks like I broke it :-(. Didn't read the code carefully enough, I guess, and thought that the selection of language name was the only useful thing it was accomplishing. So I figured the default path would handle all cases just as easily. Now that I think about it, the code was actually broken before that, because for a C-language function it needs to produce two AS items specifying the link symbol and the library path. Looks like we neglected to update pg_dump when that feature was added. Basically you need to make pg_dump do the inverse of interpret_AS_clause() in src/backend/commands/define.c. Note that there are now two OIDs that need to be handled this way, ClanguageId and NEWClanguageId. regards, tom lane
At 13:25 9/07/00 -0400, Tom Lane wrote: >Philip Warner <pjw@rhyme.com.au> writes: >> It seems some code disappeared from pg_dump.c between 7.0.2 and current, >> ... >> P.S. The specific problem is that it now uses plsrc as the definition for >> all functions, whereas the (C language) plpgsql call handler requires plbin >> to be used. > >Now that I think about it, the code was actually broken before that, >because for a C-language function it needs to produce two AS items >specifying the link symbol and the library path. Looks like we >neglected to update pg_dump when that feature was added. > Looking at the code, it *seems* that I should be able to (in pseudo-code): if ( finfo[i].probin != "-") defn = defn || "AS " || finfo[i].probin; if ( finfo[i].prosrc != "-") defn = defn || "AS " || finfo[i].prosrc; ie. Use probin is it is not "-", and use prosrc if it is not "-". This gets around hard coding for C & newC, so reduces the chance of problems in the future...I think. Does that sound reasonable to everyone? ---------------------------------------------------------------- Philip Warner | __---_____ Albatross Consulting Pty. Ltd. |----/ - \ (A.C.N. 008 659 498) | /(@) ______---_ Tel: (+61) 0500 83 82 81 | _________ \ Fax: (+61) 0500 83 82 82 | ___________ | Http://www.rhyme.com.au | / \| | --________-- PGP key available upon request, | / and from pgp5.ai.mit.edu:11371 |/
Philip Warner <pjw@rhyme.com.au> writes: > Looking at the code, it *seems* that I should be able to (in pseudo-code): > if ( finfo[i].probin != "-") > defn = defn || "AS " || finfo[i].probin; > if ( finfo[i].prosrc != "-") > defn = defn || "AS " || finfo[i].prosrc; Not quite; I think the correct syntax for C functions is AS 'probin', 'prosrc' Also I'm not real sure that the unused field will be "-" for all the other languages --- but if that's true you could make it work. Not hardwiring the language OIDs would definitely be a Good Thing. regards, tom lane
At 21:13 9/07/00 -0400, Tom Lane wrote: > >Also I'm not real sure that the unused field will be "-" for all the >other languages --- but if that's true you could make it work. Not >hardwiring the language OIDs would definitely be a Good Thing. > Done. In backend/commands/define.c unused field is set to '-' for the moment. A patch for CVS is attached, and I have amended my BLOB dumping version appropriately. ---------------------------------------------------------------- Philip Warner | __---_____ Albatross Consulting Pty. Ltd. |----/ - \ (A.C.N. 008 659 498) | /(@) ______---_ Tel: (+61) 0500 83 82 81 | _________ \ Fax: (+61) 0500 83 82 82 | ___________ | Http://www.rhyme.com.au | / \| | --________-- PGP key available upon request, | / and from pgp5.ai.mit.edu:11371 |/
I take it back. I did have this. I was looking for pg_dump in the subject. Searching for Warner, I found it. Sorry for the confusion. Applied. > At 21:13 9/07/00 -0400, Tom Lane wrote: > > > >Also I'm not real sure that the unused field will be "-" for all the > >other languages --- but if that's true you could make it work. Not > >hardwiring the language OIDs would definitely be a Good Thing. > > > > Done. In backend/commands/define.c unused field is set to '-' for the moment. > > A patch for CVS is attached, and I have amended my BLOB dumping version > appropriately. > [ Attachment, skipping... ] > > ---------------------------------------------------------------- > Philip Warner | __---_____ > Albatross Consulting Pty. Ltd. |----/ - \ > (A.C.N. 008 659 498) | /(@) ______---_ > Tel: (+61) 0500 83 82 81 | _________ \ > Fax: (+61) 0500 83 82 82 | ___________ | > Http://www.rhyme.com.au | / \| > | --________-- > PGP key available upon request, | / > and from pgp5.ai.mit.edu:11371 |/ -- Bruce Momjian | http://candle.pha.pa.us pgman@candle.pha.pa.us | (610) 853-3000+ If your life is a hard drive, | 830 Blythe Avenue + Christ can be your backup. | Drexel Hill, Pennsylvania19026