Index: doc/src/sgml/ref/pg_restore.sgml
===================================================================
RCS file: /cvsroot/pgsql/doc/src/sgml/ref/pg_restore.sgml,v
retrieving revision 1.25
diff -c -r1.25 pg_restore.sgml
*** doc/src/sgml/ref/pg_restore.sgml 10 May 2002 22:36:26 -0000 1.25
--- doc/src/sgml/ref/pg_restore.sgml 4 Jul 2002 02:56:19 -0000
***************
*** 33,39 ****
-L contents-file
-N -o -r
-O
! -P function-name
-R
-s
-S
--- 33,39 ----
-L contents-file
-N -o -r
-O
! -P function-name(argtype [, ...])
-R
-s
-S
***************
*** 276,283 ****
!
!
Specify a procedure or function to be restored.
--- 276,283 ----
!
!
Specify a procedure or function to be restored.
Index: src/bin/pg_dump/pg_backup_archiver.c
===================================================================
RCS file: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_archiver.c,v
retrieving revision 1.50
diff -c -r1.50 pg_backup_archiver.c
*** src/bin/pg_dump/pg_backup_archiver.c 2 Jul 2002 05:49:51 -0000 1.50
--- src/bin/pg_dump/pg_backup_archiver.c 4 Jul 2002 02:56:21 -0000
***************
*** 191,196 ****
--- 191,197 ----
* initially connected to, not the one we will create, which is very
* bad...
*/
+
if (ropt->create && ropt->noReconnect)
die_horribly(AH, modulename, "-C and -R are incompatible options\n");
Index: src/bin/pg_dump/pg_dump.c
===================================================================
RCS file: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v
retrieving revision 1.268
diff -c -r1.268 pg_dump.c
*** src/bin/pg_dump/pg_dump.c 2 Jul 2002 05:49:51 -0000 1.268
--- src/bin/pg_dump/pg_dump.c 4 Jul 2002 02:56:24 -0000
***************
*** 104,117 ****
static void dumpFuncACL(Archive *fout, FuncInfo *finfo);
static void dumpAggACL(Archive *fout, AggInfo *finfo);
static void dumpACL(Archive *fout, const char *type, const char *name,
! const char *nspname, const char *usename,
! const char *acl, const char *objoid);
static void dumpTriggers(Archive *fout, TableInfo *tblinfo, int numTables);
static void dumpRules(Archive *fout, TableInfo *tblinfo, int numTables);
static void formatStringLiteral(PQExpBuffer buf, const char *str,
const formatLiteralOptions opts);
! static char *format_function_signature(FuncInfo *finfo);
static void dumpOneFunc(Archive *fout, FuncInfo *finfo);
static void dumpOneOpr(Archive *fout, OprInfo *oprinfo,
OprInfo *g_oprinfo, int numOperators);
--- 104,117 ----
static void dumpFuncACL(Archive *fout, FuncInfo *finfo);
static void dumpAggACL(Archive *fout, AggInfo *finfo);
static void dumpACL(Archive *fout, const char *type, const char *name,
! const char *name_noquotes, const char *nspname,
! const char *usename, const char *acl, const char *objoid);
static void dumpTriggers(Archive *fout, TableInfo *tblinfo, int numTables);
static void dumpRules(Archive *fout, TableInfo *tblinfo, int numTables);
static void formatStringLiteral(PQExpBuffer buf, const char *str,
const formatLiteralOptions opts);
! static char *format_function_signature(FuncInfo *finfo, bool honor_quotes);
static void dumpOneFunc(Archive *fout, FuncInfo *finfo);
static void dumpOneOpr(Archive *fout, OprInfo *oprinfo,
OprInfo *g_oprinfo, int numOperators);
***************
*** 2721,2727 ****
if (strcmp(nspinfo->nspname, "public") == 0)
{
if (!aclsSkip && strcmp(nspinfo->nspacl, "{=UC}") != 0)
! dumpACL(fout, "SCHEMA", qnspname, NULL,
nspinfo->usename, nspinfo->nspacl,
nspinfo->oid);
}
--- 2721,2727 ----
if (strcmp(nspinfo->nspname, "public") == 0)
{
if (!aclsSkip && strcmp(nspinfo->nspacl, "{=UC}") != 0)
! dumpACL(fout, "SCHEMA", qnspname, nspinfo->nspname, NULL,
nspinfo->usename, nspinfo->nspacl,
nspinfo->oid);
}
***************
*** 2747,2753 ****
nspinfo->oid, "pg_namespace", 0, NULL);
if (!aclsSkip)
! dumpACL(fout, "SCHEMA", qnspname, NULL,
nspinfo->usename, nspinfo->nspacl,
nspinfo->oid);
}
--- 2747,2753 ----
nspinfo->oid, "pg_namespace", 0, NULL);
if (!aclsSkip)
! dumpACL(fout, "SCHEMA", qnspname, nspinfo->nspname, NULL,
nspinfo->usename, nspinfo->nspacl,
nspinfo->oid);
}
***************
*** 3291,3298 ****
if (!aclsSkip)
{
! char * tmp = strdup(fmtId(lanname, force_quotes));
! dumpACL(fout, "LANGUAGE", tmp, finfo[fidx].pronamespace->nspname,
NULL, lanacl, lanoid);
free(tmp);
}
--- 3291,3299 ----
if (!aclsSkip)
{
! char *tmp = strdup(fmtId(lanname, force_quotes));
! dumpACL(fout, "LANGUAGE", tmp, lanname,
! finfo[fidx].pronamespace->nspname,
NULL, lanacl, lanoid);
free(tmp);
}
***************
*** 3333,3345 ****
* is never qualified.
*/
static char *
! format_function_signature(FuncInfo *finfo)
{
PQExpBufferData fn;
int j;
initPQExpBuffer(&fn);
! appendPQExpBuffer(&fn, "%s (", fmtId(finfo->proname, force_quotes));
for (j = 0; j < finfo->nargs; j++)
{
char *typname;
--- 3334,3349 ----
* is never qualified.
*/
static char *
! format_function_signature(FuncInfo *finfo, bool honor_quotes)
{
PQExpBufferData fn;
int j;
initPQExpBuffer(&fn);
! if (honor_quotes)
! appendPQExpBuffer(&fn, "%s(", fmtId(finfo->proname, force_quotes));
! else
! appendPQExpBuffer(&fn, "%s(", finfo->proname);
for (j = 0; j < finfo->nargs; j++)
{
char *typname;
***************
*** 3358,3369 ****
static void
dumpFuncACL(Archive *fout, FuncInfo *finfo)
{
! char *funcsig;
! funcsig = format_function_signature(finfo);
! dumpACL(fout, "FUNCTION", funcsig, finfo->pronamespace->nspname,
finfo->usename, finfo->proacl, finfo->oid);
free(funcsig);
}
--- 3362,3376 ----
static void
dumpFuncACL(Archive *fout, FuncInfo *finfo)
{
! char *funcsig, *funcsig_noquotes;
! funcsig = format_function_signature(finfo, true);
! funcsig_noquotes = format_function_signature(finfo, false);
! dumpACL(fout, "FUNCTION", funcsig, funcsig_noquotes,
! finfo->pronamespace->nspname,
finfo->usename, finfo->proacl, finfo->oid);
free(funcsig);
+ free(funcsig_noquotes);
}
***************
*** 3380,3385 ****
--- 3387,3393 ----
PQExpBuffer asPart = createPQExpBuffer();
PGresult *res = NULL;
char *funcsig = NULL;
+ char *funcsig_noquotes = NULL;
int ntups;
char *proretset;
char *prosrc;
***************
*** 3487,3493 ****
}
}
! funcsig = format_function_signature(finfo);
/* DROP must be fully qualified in case same name appears in pg_catalog */
appendPQExpBuffer(delqry, "DROP FUNCTION %s.%s;\n",
--- 3495,3502 ----
}
}
! funcsig = format_function_signature(finfo, true);
! funcsig_noquotes = format_function_signature(finfo, false);
/* DROP must be fully qualified in case same name appears in pg_catalog */
appendPQExpBuffer(delqry, "DROP FUNCTION %s.%s;\n",
***************
*** 3517,3523 ****
finfo->proname);
exit_nicely();
}
! }
if (proimplicit[0] == 't')
appendPQExpBuffer(q, " IMPLICIT CAST");
--- 3526,3532 ----
finfo->proname);
exit_nicely();
}
! }
if (proimplicit[0] == 't')
appendPQExpBuffer(q, " IMPLICIT CAST");
***************
*** 3530,3536 ****
appendPQExpBuffer(q, ";\n");
! ArchiveEntry(fout, finfo->oid, funcsig, finfo->pronamespace->nspname,
finfo->usename, "FUNCTION", NULL,
q->data, delqry->data,
NULL, NULL, NULL);
--- 3539,3546 ----
appendPQExpBuffer(q, ";\n");
! ArchiveEntry(fout, finfo->oid, funcsig_noquotes,
! finfo->pronamespace->nspname,
finfo->usename, "FUNCTION", NULL,
q->data, delqry->data,
NULL, NULL, NULL);
***************
*** 3551,3556 ****
--- 3561,3567 ----
destroyPQExpBuffer(delqry);
destroyPQExpBuffer(asPart);
free(funcsig);
+ free(funcsig_noquotes);
}
/*
***************
*** 3939,3952 ****
* is never qualified.
*/
static char *
! format_aggregate_signature(AggInfo *agginfo, Archive *fout)
{
PQExpBufferData buf;
bool anybasetype;
initPQExpBuffer(&buf);
! appendPQExpBuffer(&buf, "%s",
fmtId(agginfo->aggname, force_quotes));
anybasetype = (strcmp(agginfo->aggbasetype, "0") == 0);
--- 3950,3966 ----
* is never qualified.
*/
static char *
! format_aggregate_signature(AggInfo *agginfo, Archive *fout, bool honor_quotes)
{
PQExpBufferData buf;
bool anybasetype;
initPQExpBuffer(&buf);
! if (honor_quotes)
! appendPQExpBuffer(&buf, "%s",
fmtId(agginfo->aggname, force_quotes));
+ else
+ appendPQExpBuffer(&buf, "%s", agginfo->aggname);
anybasetype = (strcmp(agginfo->aggbasetype, "0") == 0);
***************
*** 3974,3985 ****
static void
dumpAggACL(Archive *fout, AggInfo *finfo)
{
! char *aggsig;
! aggsig = format_aggregate_signature(finfo, fout);
! dumpACL(fout, "FUNCTION", aggsig, finfo->aggnamespace->nspname,
finfo->usename, finfo->aggacl, finfo->oid);
free(aggsig);
}
--- 3988,4002 ----
static void
dumpAggACL(Archive *fout, AggInfo *finfo)
{
! char *aggsig, *aggsig_noquotes;
! aggsig = format_aggregate_signature(finfo, fout, true);
! aggsig_noquotes = format_aggregate_signature(finfo, fout, false);
! dumpACL(fout, "FUNCTION", aggsig, aggsig_noquotes,
! finfo->aggnamespace->nspname,
finfo->usename, finfo->aggacl, finfo->oid);
free(aggsig);
+ free(aggsig_noquotes);
}
***************
*** 3994,4000 ****
PQExpBuffer q = createPQExpBuffer();
PQExpBuffer delq = createPQExpBuffer();
PQExpBuffer details = createPQExpBuffer();
! char *aggSig;
PGresult *res;
int ntups;
int i_aggtransfn;
--- 4011,4018 ----
PQExpBuffer q = createPQExpBuffer();
PQExpBuffer delq = createPQExpBuffer();
PQExpBuffer details = createPQExpBuffer();
! char *aggsig;
! char *aggsig_noquotes;
PGresult *res;
int ntups;
int i_aggtransfn;
***************
*** 4084,4099 ****
agginfo->fmtbasetype = strdup(PQgetvalue(res, 0, i_fmtbasetype));
convertok = (PQgetvalue(res, 0, i_convertok)[0] == 't');
! aggSig = format_aggregate_signature(agginfo, g_fout);
if (!convertok)
{
write_msg(NULL, "WARNING: aggregate function %s could not be dumped correctly for this database version; ignored\n",
! aggSig);
appendPQExpBuffer(q, "-- WARNING: aggregate function %s could not be dumped correctly for this database version; ignored\n",
! aggSig);
! ArchiveEntry(fout, agginfo->oid, aggSig,
agginfo->aggnamespace->nspname, agginfo->usename,
"WARNING", NULL,
q->data, "" /* Del */ ,
--- 4102,4118 ----
agginfo->fmtbasetype = strdup(PQgetvalue(res, 0, i_fmtbasetype));
convertok = (PQgetvalue(res, 0, i_convertok)[0] == 't');
! aggsig = format_aggregate_signature(agginfo, g_fout, true);
! aggsig_noquotes = format_aggregate_signature(agginfo, g_fout, false);
if (!convertok)
{
write_msg(NULL, "WARNING: aggregate function %s could not be dumped correctly for this database version; ignored\n",
! aggsig);
appendPQExpBuffer(q, "-- WARNING: aggregate function %s could not be dumped correctly for this database version; ignored\n",
! aggsig);
! ArchiveEntry(fout, agginfo->oid, aggsig_noquotes,
agginfo->aggnamespace->nspname, agginfo->usename,
"WARNING", NULL,
q->data, "" /* Del */ ,
***************
*** 4146,4158 ****
/* DROP must be fully qualified in case same name appears in pg_catalog */
appendPQExpBuffer(delq, "DROP AGGREGATE %s.%s;\n",
fmtId(agginfo->aggnamespace->nspname, force_quotes),
! aggSig);
appendPQExpBuffer(q, "CREATE AGGREGATE %s ( %s );\n",
fmtId(agginfo->aggname, force_quotes),
details->data);
! ArchiveEntry(fout, agginfo->oid, aggSig,
agginfo->aggnamespace->nspname, agginfo->usename,
"AGGREGATE", NULL,
q->data, delq->data,
--- 4165,4177 ----
/* DROP must be fully qualified in case same name appears in pg_catalog */
appendPQExpBuffer(delq, "DROP AGGREGATE %s.%s;\n",
fmtId(agginfo->aggnamespace->nspname, force_quotes),
! aggsig);
appendPQExpBuffer(q, "CREATE AGGREGATE %s ( %s );\n",
fmtId(agginfo->aggname, force_quotes),
details->data);
! ArchiveEntry(fout, agginfo->oid, aggsig_noquotes,
agginfo->aggnamespace->nspname, agginfo->usename,
"AGGREGATE", NULL,
q->data, delq->data,
***************
*** 4161,4167 ****
/*** Dump Aggregate Comments ***/
resetPQExpBuffer(q);
! appendPQExpBuffer(q, "AGGREGATE %s", aggSig);
if (g_fout->remoteVersion >= 70300)
dumpComment(fout, q->data,
agginfo->aggnamespace->nspname, agginfo->usename,
--- 4180,4186 ----
/*** Dump Aggregate Comments ***/
resetPQExpBuffer(q);
! appendPQExpBuffer(q, "AGGREGATE %s", aggsig);
if (g_fout->remoteVersion >= 70300)
dumpComment(fout, q->data,
agginfo->aggnamespace->nspname, agginfo->usename,
***************
*** 4177,4183 ****
destroyPQExpBuffer(q);
destroyPQExpBuffer(delq);
destroyPQExpBuffer(details);
! free(aggSig);
}
--- 4196,4203 ----
destroyPQExpBuffer(q);
destroyPQExpBuffer(delq);
destroyPQExpBuffer(details);
! free(aggsig);
! free(aggsig_noquotes);
}
***************
*** 4276,4282 ****
*/
static void
dumpACL(Archive *fout, const char *type, const char *name,
! const char *nspname, const char *usename,
const char *acls, const char *objoid)
{
char *aclbuf,
--- 4296,4302 ----
*/
static void
dumpACL(Archive *fout, const char *type, const char *name,
! const char *name_noquotes, const char *nspname, const char *usename,
const char *acls, const char *objoid)
{
char *aclbuf,
***************
*** 4390,4396 ****
appendPQExpBuffer(sql, "%s;\n", fmtId(usename, force_quotes));
}
! ArchiveEntry(fout, objoid, name, nspname, usename ? usename : "",
"ACL", NULL, sql->data, "", NULL, NULL, NULL);
free(aclbuf);
--- 4410,4416 ----
appendPQExpBuffer(sql, "%s;\n", fmtId(usename, force_quotes));
}
! ArchiveEntry(fout, objoid, name_noquotes, nspname, usename ? usename : "",
"ACL", NULL, sql->data, "", NULL, NULL, NULL);
free(aclbuf);
***************
*** 4401,4409 ****
static void
dumpTableACL(Archive *fout, TableInfo *tbinfo)
{
! char * tmp = strdup( fmtId(tbinfo->relname, force_quotes) );
! dumpACL(fout, "TABLE", tmp, tbinfo->relnamespace->nspname,
! tbinfo->usename, tbinfo->relacl,
tbinfo->viewoid != NULL ? tbinfo->viewoid : tbinfo->oid);
free(tmp);
}
--- 4421,4429 ----
static void
dumpTableACL(Archive *fout, TableInfo *tbinfo)
{
! char *tmp = strdup(fmtId(tbinfo->relname, force_quotes));
! dumpACL(fout, "TABLE", tmp, tbinfo->relname,
! tbinfo->relnamespace->nspname, tbinfo->usename, tbinfo->relacl,
tbinfo->viewoid != NULL ? tbinfo->viewoid : tbinfo->oid);
free(tmp);
}
***************
*** 5793,5812 ****
precision, scale);
}
}
-
/*
* char is an internal single-byte data type; Let's make sure we force
* it through with quotes. - thomas 1998-12-13
*/
else if (!strcmp(typname, "char"))
{
! appendPQExpBuffer(buf, "%s",
! fmtId(typname, true));
}
else
{
! appendPQExpBuffer(buf, "%s",
! fmtId(typname, false));
}
result = strdup(buf->data);
--- 5813,5829 ----
precision, scale);
}
}
/*
* char is an internal single-byte data type; Let's make sure we force
* it through with quotes. - thomas 1998-12-13
*/
else if (!strcmp(typname, "char"))
{
! appendPQExpBuffer(buf, "%s", fmtId(typname, true));
}
else
{
! appendPQExpBuffer(buf, "%s", fmtId(typname, false));
}
result = strdup(buf->data);
Index: src/bin/pg_dump/pg_restore.c
===================================================================
RCS file: /cvsroot/pgsql/src/bin/pg_dump/pg_restore.c,v
retrieving revision 1.34
diff -c -r1.34 pg_restore.c
*** src/bin/pg_dump/pg_restore.c 10 May 2002 22:36:27 -0000 1.34
--- src/bin/pg_dump/pg_restore.c 4 Jul 2002 02:56:25 -0000
***************
*** 65,70 ****
--- 65,71 ----
/* Forward decls */
static void usage(const char *progname);
static char *_cleanupName(char *name);
+ static char *_cleanupFuncName(char *name);
typedef struct option optType;
***************
*** 220,226 ****
case 'P': /* Function */
opts->selTypes = 1;
opts->selFunction = 1;
! opts->functionNames = optarg ? strdup(optarg) : NULL;
break;
case 'I': /* Index */
opts->selTypes = 1;
--- 221,227 ----
case 'P': /* Function */
opts->selTypes = 1;
opts->selFunction = 1;
! opts->functionNames = _cleanupFuncName(optarg);
break;
case 'I': /* Index */
opts->selTypes = 1;
***************
*** 392,398 ****
" -O, --no-owner do not reconnect to database to match\n"
" object owner\n"
" -p, --port=PORT server port number\n"
! " -P, --function=NAME restore named function\n"
" -r, --rearrange rearrange output to put indexes etc. at end\n"
" -R, --no-reconnect disallow ALL reconnections to the database\n"
" -s, --schema-only restore only the schema, no data\n"
--- 393,399 ----
" -O, --no-owner do not reconnect to database to match\n"
" object owner\n"
" -p, --port=PORT server port number\n"
! " -P, --function=NAME(args)restore named function\n"
" -r, --rearrange rearrange output to put indexes etc. at end\n"
" -R, --no-reconnect disallow ALL reconnections to the database\n"
" -s, --schema-only restore only the schema, no data\n"
***************
*** 430,436 ****
" -O do not reconnect to database to match\n"
" object owner\n"
" -p PORT server port number\n"
! " -P NAME restore named function\n"
" -r rearrange output to put indexes etc. at end\n"
" -R disallow ALL reconnections to the database\n"
" -s restore only the schema, no data\n"
--- 431,437 ----
" -O do not reconnect to database to match\n"
" object owner\n"
" -p PORT server port number\n"
! " -P NAME(args) restore named function\n"
" -r rearrange output to put indexes etc. at end\n"
" -R disallow ALL reconnections to the database\n"
" -s restore only the schema, no data\n"
***************
*** 476,480 ****
--- 477,529 ----
if (isupper((unsigned char) name[i]))
name[i] = tolower((unsigned char) name[i]);
}
+ return name;
+ }
+
+
+ static char *
+ _cleanupFuncName(char *name)
+ {
+ int i;
+ char *ch;
+
+ if (!name || !name[0])
+ return NULL;
+
+ name = strdup(name);
+
+ if (name[0] == '"')
+ {
+ strcpy(name, &name[1]);
+ if (strchr(name, '"') != NULL)
+ strcpy(strchr(name, '"'), strchr(name, '"')+1);
+ }
+ /* otherwise, convert function name to lowercase... */
+ else
+ {
+ for (i = 0; name[i]; i++)
+ if (isupper((unsigned char) name[i]))
+ name[i] = tolower((unsigned char) name[i]);
+ }
+
+ /* strip out any space before paren */
+ ch = strchr(name,'(');
+ while (ch && ch > name && *(ch-1) == ' ')
+ {
+ strcpy(ch - 1, ch);
+ ch--;
+ }
+
+ /*
+ * Strip out spaces after commas in parameter list.
+ * We can't remove all spaces because some types, like
+ * 'double precision' have spaces.
+ */
+ if ((ch = strchr(name,'(')) != NULL)
+ {
+ while ((ch = strstr(ch,", ")) != NULL)
+ strcpy(ch + 1, ch + 2);
+ }
+
return name;
}