mirror of
https://github.com/postgres/postgres.git
synced 2025-09-02 04:21:28 +03:00
Implement the DO statement to support execution of PL code without having
to create a function for it. Procedural languages now have an additional entry point, namely a function to execute an inline code block. This seemed a better design than trying to hide the transient-ness of the code from the PL. As of this patch, only plpgsql has an inline handler, but probably people will soon write handlers for the other standard PLs. In passing, remove the long-dead LANCOMPILER option of CREATE LANGUAGE. Petr Jelinek
This commit is contained in:
@@ -12,7 +12,7 @@
|
||||
* by PostgreSQL
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/bin/pg_dump/pg_dump.c,v 1.547 2009/09/11 19:17:04 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/bin/pg_dump/pg_dump.c,v 1.548 2009/09/22 23:43:38 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -4445,6 +4445,7 @@ getProcLangs(int *numProcLangs)
|
||||
int i_lanname;
|
||||
int i_lanpltrusted;
|
||||
int i_lanplcallfoid;
|
||||
int i_laninline;
|
||||
int i_lanvalidator;
|
||||
int i_lanacl;
|
||||
int i_lanowner;
|
||||
@@ -4452,7 +4453,19 @@ getProcLangs(int *numProcLangs)
|
||||
/* Make sure we are in proper schema */
|
||||
selectSourceSchema("pg_catalog");
|
||||
|
||||
if (g_fout->remoteVersion >= 80300)
|
||||
if (g_fout->remoteVersion >= 80500)
|
||||
{
|
||||
/* pg_language has a laninline column */
|
||||
appendPQExpBuffer(query, "SELECT tableoid, oid, "
|
||||
"lanname, lanpltrusted, lanplcallfoid, "
|
||||
"laninline, lanvalidator, lanacl, "
|
||||
"(%s lanowner) AS lanowner "
|
||||
"FROM pg_language "
|
||||
"WHERE lanispl "
|
||||
"ORDER BY oid",
|
||||
username_subquery);
|
||||
}
|
||||
else if (g_fout->remoteVersion >= 80300)
|
||||
{
|
||||
/* pg_language has a lanowner column */
|
||||
appendPQExpBuffer(query, "SELECT tableoid, oid, "
|
||||
@@ -4515,6 +4528,7 @@ getProcLangs(int *numProcLangs)
|
||||
i_lanpltrusted = PQfnumber(res, "lanpltrusted");
|
||||
i_lanplcallfoid = PQfnumber(res, "lanplcallfoid");
|
||||
/* these may fail and return -1: */
|
||||
i_laninline = PQfnumber(res, "laninline");
|
||||
i_lanvalidator = PQfnumber(res, "lanvalidator");
|
||||
i_lanacl = PQfnumber(res, "lanacl");
|
||||
i_lanowner = PQfnumber(res, "lanowner");
|
||||
@@ -4529,6 +4543,10 @@ getProcLangs(int *numProcLangs)
|
||||
planginfo[i].dobj.name = strdup(PQgetvalue(res, i, i_lanname));
|
||||
planginfo[i].lanpltrusted = *(PQgetvalue(res, i, i_lanpltrusted)) == 't';
|
||||
planginfo[i].lanplcallfoid = atooid(PQgetvalue(res, i, i_lanplcallfoid));
|
||||
if (i_laninline >= 0)
|
||||
planginfo[i].laninline = atooid(PQgetvalue(res, i, i_laninline));
|
||||
else
|
||||
planginfo[i].laninline = InvalidOid;
|
||||
if (i_lanvalidator >= 0)
|
||||
planginfo[i].lanvalidator = atooid(PQgetvalue(res, i, i_lanvalidator));
|
||||
else
|
||||
@@ -6994,6 +7012,7 @@ dumpProcLang(Archive *fout, ProcLangInfo *plang)
|
||||
char *qlanname;
|
||||
char *lanschema;
|
||||
FuncInfo *funcInfo;
|
||||
FuncInfo *inlineInfo = NULL;
|
||||
FuncInfo *validatorInfo = NULL;
|
||||
|
||||
if (dataOnly)
|
||||
@@ -7011,6 +7030,13 @@ dumpProcLang(Archive *fout, ProcLangInfo *plang)
|
||||
if (funcInfo != NULL && !funcInfo->dobj.dump)
|
||||
funcInfo = NULL; /* treat not-dumped same as not-found */
|
||||
|
||||
if (OidIsValid(plang->laninline))
|
||||
{
|
||||
inlineInfo = findFuncByOid(plang->laninline);
|
||||
if (inlineInfo != NULL && !inlineInfo->dobj.dump)
|
||||
inlineInfo = NULL;
|
||||
}
|
||||
|
||||
if (OidIsValid(plang->lanvalidator))
|
||||
{
|
||||
validatorInfo = findFuncByOid(plang->lanvalidator);
|
||||
@@ -7024,6 +7050,7 @@ dumpProcLang(Archive *fout, ProcLangInfo *plang)
|
||||
* dump it.
|
||||
*/
|
||||
useParams = (funcInfo != NULL &&
|
||||
(inlineInfo != NULL || !OidIsValid(plang->laninline)) &&
|
||||
(validatorInfo != NULL || !OidIsValid(plang->lanvalidator)));
|
||||
|
||||
if (!useParams && !shouldDumpProcLangs())
|
||||
@@ -7054,6 +7081,16 @@ dumpProcLang(Archive *fout, ProcLangInfo *plang)
|
||||
{
|
||||
appendPQExpBuffer(defqry, " HANDLER %s",
|
||||
fmtId(funcInfo->dobj.name));
|
||||
if (OidIsValid(plang->laninline))
|
||||
{
|
||||
appendPQExpBuffer(defqry, " INLINE ");
|
||||
/* Cope with possibility that inline is in different schema */
|
||||
if (inlineInfo->dobj.namespace != funcInfo->dobj.namespace)
|
||||
appendPQExpBuffer(defqry, "%s.",
|
||||
fmtId(inlineInfo->dobj.namespace->dobj.name));
|
||||
appendPQExpBuffer(defqry, "%s",
|
||||
fmtId(inlineInfo->dobj.name));
|
||||
}
|
||||
if (OidIsValid(plang->lanvalidator))
|
||||
{
|
||||
appendPQExpBuffer(defqry, " VALIDATOR ");
|
||||
|
Reference in New Issue
Block a user