Re: "dumpProcLangs(): handler procedure for language

Started by Daniel Kalchevabout 23 years ago1 messages
#1Daniel Kalchev
daniel@digsys.bg
1 attachment(s)

I have had similar troubles, related to oid overflow. I had to modify pg_dump
to properly cast queries that contain oids. This is against 7.1.3 source. The
patch was hacked quickly, in order to get a corrupted database reloaded, and
this while I was traveling in another country... so it is far from perfect but
saved my database(s). It also fixes other oid-related troubles of pg_dump.

See attached file.

Daniel

Show quoted text

Brian Fujito said:

Thanks for your input--

I've tried both ways:

createlang/droplang from the command line as user postgres

and:

CREATE FUNCTION plpgsql_call_handler () RETURNS OPAQUE AS
'/usr/lib/pgsql/plpgsql.so' LANGUAGE 'C';

CREATE TRUSTED PROCEDURAL LANGUAGE 'plpgsql'
HANDLER plpgsql_call_handler
LANCOMPILER 'PL/pgSQL';

I'm using pg_dump (not pg_dumpall) on the specific database on which
I created the language.

I realize 7.0.3 is ancient (same with 7.1)... I just don't have the
time to deal with an upgrade quite yet. Soon enough :) In the mean
time, a stop-gap solution would definitely be appreciated.

Thank you,
Brian

On Mon, 2002-12-09 at 14:28, Tom Lane wrote:

Brian Fujito <brian@lightsource.com> writes:

I'm running postgres-7.0.3 on RH7.1 using RedHat RPMs.
I recently added plpgsql as a language to one of my databases,
and now when I try to do a pg_dump, I get:

"dumpProcLangs(): handler procedure for language plpgsql not found"

If I drop the language, pg_dump works fine, but if I add it back (and
even if I restart postgres), I get the same error.

What exactly are you doing to drop and re-add the language? I should
think CREATE LANGUAGE would fail if the handler proc isn't there.

(Also, are you doing pg_dump or pg_dumpall? If the latter, maybe the
failure is occurring in a different database than the one you are
changing.)

But having said that, 7.0.3 is ancient history ... you really are
overdue for an upgrade. With my Red Hat fedora on, I'd say the same
about your choice of OS version too.

regards, tom lane

---------------------------(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

Attachments:

pg_dump.c.difftext/plain; charset=us-ascii; name=pg_dump.c.diffDownload
*** pg_dump.c.orig	Mon Apr 15 09:45:58 2002
--- pg_dump.c	Tue Jun 25 00:23:53 2002
***************
*** 2006,2012 ****
  		finfo[i].prorettype = strdup(PQgetvalue(res, i, i_prorettype));
  		finfo[i].retset = (strcmp(PQgetvalue(res, i, i_proretset), "t") == 0);
  		finfo[i].nargs = atoi(PQgetvalue(res, i, i_pronargs));
! 		finfo[i].lang = atoi(PQgetvalue(res, i, i_prolang));
  		finfo[i].usename = strdup(PQgetvalue(res, i, i_usename));
  		finfo[i].iscachable = (strcmp(PQgetvalue(res, i, i_iscachable), "t") == 0);
  		finfo[i].isstrict = (strcmp(PQgetvalue(res, i, i_isstrict), "t") == 0);
--- 2006,2012 ----
  		finfo[i].prorettype = strdup(PQgetvalue(res, i, i_prorettype));
  		finfo[i].retset = (strcmp(PQgetvalue(res, i, i_proretset), "t") == 0);
  		finfo[i].nargs = atoi(PQgetvalue(res, i, i_pronargs));
! 		finfo[i].lang = atooid(PQgetvalue(res, i, i_prolang));
  		finfo[i].usename = strdup(PQgetvalue(res, i, i_usename));
  		finfo[i].iscachable = (strcmp(PQgetvalue(res, i, i_iscachable), "t") == 0);
  		finfo[i].isstrict = (strcmp(PQgetvalue(res, i, i_isstrict), "t") == 0);
***************
*** 2289,2295 ****
  
  			resetPQExpBuffer(query);
  			appendPQExpBuffer(query,
! 							  "SELECT Oid FROM pg_index i WHERE i.indisprimary AND i.indrelid = %s ",
  							  tblinfo[i].oid);
  			res2 = PQexec(g_conn, query->data);
  			if (!res2 || PQresultStatus(res2) != PGRES_TUPLES_OK)
--- 2289,2295 ----
  
  			resetPQExpBuffer(query);
  			appendPQExpBuffer(query,
! 							  "SELECT Oid FROM pg_index i WHERE i.indisprimary AND i.indrelid = oid(%s) ",
  							  tblinfo[i].oid);
  			res2 = PQexec(g_conn, query->data);
  			if (!res2 || PQresultStatus(res2) != PGRES_TUPLES_OK)
***************
*** 2328,2340 ****
  				appendPQExpBuffer(query,
  							  "  SELECT c.relname "
  							  "    FROM pg_index i, pg_class c "
! 							  "    WHERE     i.indrelid = %s"
  							  "        AND   i.indisprimary "
  							  "        AND   c.oid = i.indexrelid"
  							  " UNION ALL "
  							  "  SELECT NULL "
  							  "    FROM pg_index i "
! 							  "    WHERE i.indrelid = %s"
  							  "    AND   i.indisprimary "
  							  "    And NOT Exists(Select * From pg_class c Where c.oid = i.indexrelid)",
  							  tblinfo[i].oid, tblinfo[i].oid);
--- 2328,2340 ----
  				appendPQExpBuffer(query,
  							  "  SELECT c.relname "
  							  "    FROM pg_index i, pg_class c "
! 							  "    WHERE     i.indrelid = oid(%s)"
  							  "        AND   i.indisprimary "
  							  "        AND   c.oid = i.indexrelid"
  							  " UNION ALL "
  							  "  SELECT NULL "
  							  "    FROM pg_index i "
! 							  "    WHERE i.indrelid = oid(%s)"
  							  "    AND   i.indisprimary "
  							  "    And NOT Exists(Select * From pg_class c Where c.oid = i.indexrelid)",
  							  tblinfo[i].oid, tblinfo[i].oid);
***************
*** 2343,2349 ****
  				appendPQExpBuffer(query,
  							  "SELECT c.relname "
  							  "FROM pg_index i LEFT OUTER JOIN pg_class c ON c.oid = i.indexrelid "
! 							  "WHERE i.indrelid = %s"
  							  "AND   i.indisprimary ",
  							  tblinfo[i].oid);
  			}
--- 2343,2349 ----
  				appendPQExpBuffer(query,
  							  "SELECT c.relname "
  							  "FROM pg_index i LEFT OUTER JOIN pg_class c ON c.oid = i.indexrelid "
! 							  "WHERE i.indrelid = oid(%s)"
  							  "AND   i.indisprimary ",
  							  tblinfo[i].oid);
  			}
***************
*** 3035,3040 ****
--- 3035,3041 ----
  	query = createPQExpBuffer();
  	appendPQExpBuffer(query, "SELECT description FROM pg_description WHERE objoid = ");
  	appendPQExpBuffer(query, oid);
+ 	appendPQExpBuffer(query, "::oid");
  
  	/*** Execute query ***/
  
***************
*** 3394,3400 ****
  
  	/* becomeUser(fout, finfo[i].usename); */
  
! 	sprintf(query, "SELECT lanname FROM pg_language WHERE oid = %u",
  			finfo[i].lang);
  	res = PQexec(g_conn, query);
  	if (!res ||
--- 3395,3401 ----
  
  	/* becomeUser(fout, finfo[i].usename); */
  
! 	sprintf(query, "SELECT lanname FROM pg_language WHERE oid = oid(%u)",
  			finfo[i].lang);
  	res = PQexec(g_conn, query);
  	if (!res ||