mirror of
https://github.com/postgres/postgres.git
synced 2025-06-14 18:42:34 +03:00
Don't produce bogus COPY command when there are no undropped columns
in a table.
This commit is contained in:
@ -12,7 +12,7 @@
|
|||||||
* by PostgreSQL
|
* by PostgreSQL
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.310 2002/12/01 18:44:00 tgl Exp $
|
* $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.311 2002/12/12 21:03:24 tgl Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -827,6 +827,9 @@ dumpClasses_nodumpData(Archive *fout, char *oid, void *dctxv)
|
|||||||
* possibility of retrieving data in the wrong column order. (The
|
* possibility of retrieving data in the wrong column order. (The
|
||||||
* default column ordering of COPY will not be what we want in certain
|
* default column ordering of COPY will not be what we want in certain
|
||||||
* corner cases involving ADD COLUMN and inheritance.)
|
* corner cases involving ADD COLUMN and inheritance.)
|
||||||
|
*
|
||||||
|
* NB: caller should have already determined that there are dumpable
|
||||||
|
* columns, so that fmtCopyColumnList will return something.
|
||||||
*/
|
*/
|
||||||
if (g_fout->remoteVersion >= 70300)
|
if (g_fout->remoteVersion >= 70300)
|
||||||
column_list = fmtCopyColumnList(tbinfo);
|
column_list = fmtCopyColumnList(tbinfo);
|
||||||
@ -1140,10 +1143,16 @@ dumpClasses(const TableInfo *tblinfo, const int numTables, Archive *fout,
|
|||||||
|
|
||||||
if (tblinfo[i].dump)
|
if (tblinfo[i].dump)
|
||||||
{
|
{
|
||||||
|
const char *column_list;
|
||||||
|
|
||||||
if (g_verbose)
|
if (g_verbose)
|
||||||
write_msg(NULL, "preparing to dump the contents of table %s\n",
|
write_msg(NULL, "preparing to dump the contents of table %s\n",
|
||||||
classname);
|
classname);
|
||||||
|
|
||||||
|
/* Get column list first to check for zero-column table */
|
||||||
|
column_list = fmtCopyColumnList(&(tblinfo[i]));
|
||||||
|
if (column_list)
|
||||||
|
{
|
||||||
dumpCtx = (DumpContext *) malloc(sizeof(DumpContext));
|
dumpCtx = (DumpContext *) malloc(sizeof(DumpContext));
|
||||||
dumpCtx->tblinfo = (TableInfo *) tblinfo;
|
dumpCtx->tblinfo = (TableInfo *) tblinfo;
|
||||||
dumpCtx->tblidx = i;
|
dumpCtx->tblidx = i;
|
||||||
@ -1152,10 +1161,7 @@ dumpClasses(const TableInfo *tblinfo, const int numTables, Archive *fout,
|
|||||||
if (!dumpData)
|
if (!dumpData)
|
||||||
{
|
{
|
||||||
/* Dump/restore using COPY */
|
/* Dump/restore using COPY */
|
||||||
const char *column_list;
|
|
||||||
|
|
||||||
dumpFn = dumpClasses_nodumpData;
|
dumpFn = dumpClasses_nodumpData;
|
||||||
column_list = fmtCopyColumnList(&(tblinfo[i]));
|
|
||||||
resetPQExpBuffer(copyBuf);
|
resetPQExpBuffer(copyBuf);
|
||||||
appendPQExpBuffer(copyBuf, "COPY %s %s %sFROM stdin;\n",
|
appendPQExpBuffer(copyBuf, "COPY %s %s %sFROM stdin;\n",
|
||||||
fmtId(tblinfo[i].relname),
|
fmtId(tblinfo[i].relname),
|
||||||
@ -1171,11 +1177,13 @@ dumpClasses(const TableInfo *tblinfo, const int numTables, Archive *fout,
|
|||||||
}
|
}
|
||||||
|
|
||||||
ArchiveEntry(fout, tblinfo[i].oid, tblinfo[i].relname,
|
ArchiveEntry(fout, tblinfo[i].oid, tblinfo[i].relname,
|
||||||
tblinfo[i].relnamespace->nspname, tblinfo[i].usename,
|
tblinfo[i].relnamespace->nspname,
|
||||||
|
tblinfo[i].usename,
|
||||||
"TABLE DATA", NULL, "", "", copyStmt,
|
"TABLE DATA", NULL, "", "", copyStmt,
|
||||||
dumpFn, dumpCtx);
|
dumpFn, dumpCtx);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
destroyPQExpBuffer(copyBuf);
|
destroyPQExpBuffer(copyBuf);
|
||||||
}
|
}
|
||||||
@ -3220,13 +3228,16 @@ dumpOneDomain(Archive *fout, TypeInfo *tinfo)
|
|||||||
if (typdefault)
|
if (typdefault)
|
||||||
appendPQExpBuffer(q, " DEFAULT %s", typdefault);
|
appendPQExpBuffer(q, " DEFAULT %s", typdefault);
|
||||||
|
|
||||||
/* Fetch and process CHECK Constraints */
|
PQclear(res);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Fetch and process CHECK constraints for the domain
|
||||||
|
*/
|
||||||
appendPQExpBuffer(chkquery, "SELECT conname, consrc "
|
appendPQExpBuffer(chkquery, "SELECT conname, consrc "
|
||||||
"FROM pg_catalog.pg_constraint "
|
"FROM pg_catalog.pg_constraint "
|
||||||
"WHERE contypid = '%s'::pg_catalog.oid",
|
"WHERE contypid = '%s'::pg_catalog.oid",
|
||||||
tinfo->oid);
|
tinfo->oid);
|
||||||
|
|
||||||
PQclear(res);
|
|
||||||
res = PQexec(g_conn, chkquery->data);
|
res = PQexec(g_conn, chkquery->data);
|
||||||
if (!res ||
|
if (!res ||
|
||||||
PQresultStatus(res) != PGRES_TUPLES_OK)
|
PQresultStatus(res) != PGRES_TUPLES_OK)
|
||||||
@ -3236,7 +3247,6 @@ dumpOneDomain(Archive *fout, TypeInfo *tinfo)
|
|||||||
exit_nicely();
|
exit_nicely();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Expecting a single result only */
|
|
||||||
ntups = PQntuples(res);
|
ntups = PQntuples(res);
|
||||||
for (i = 0; i < ntups; i++)
|
for (i = 0; i < ntups; i++)
|
||||||
{
|
{
|
||||||
@ -3246,7 +3256,8 @@ dumpOneDomain(Archive *fout, TypeInfo *tinfo)
|
|||||||
conname = PQgetvalue(res, i, PQfnumber(res, "conname"));
|
conname = PQgetvalue(res, i, PQfnumber(res, "conname"));
|
||||||
consrc = PQgetvalue(res, i, PQfnumber(res, "consrc"));
|
consrc = PQgetvalue(res, i, PQfnumber(res, "consrc"));
|
||||||
|
|
||||||
appendPQExpBuffer(q, " CONSTRAINT %s CHECK %s", fmtId(conname), consrc);
|
appendPQExpBuffer(q, "\n\tCONSTRAINT %s CHECK %s",
|
||||||
|
fmtId(conname), consrc);
|
||||||
}
|
}
|
||||||
|
|
||||||
appendPQExpBuffer(q, ";\n");
|
appendPQExpBuffer(q, ";\n");
|
||||||
@ -6744,7 +6755,10 @@ fmtQualifiedId(const char *schema, const char *id)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* return a column list clause for the given relation.
|
* Return a column list clause for the given relation.
|
||||||
|
*
|
||||||
|
* Special case: if there are no undropped columns in the relation, return
|
||||||
|
* NULL, not an invalid "()" column list.
|
||||||
*/
|
*/
|
||||||
static const char *
|
static const char *
|
||||||
fmtCopyColumnList(const TableInfo *ti)
|
fmtCopyColumnList(const TableInfo *ti)
|
||||||
@ -6772,6 +6786,10 @@ fmtCopyColumnList(const TableInfo *ti)
|
|||||||
appendPQExpBuffer(q, "%s", fmtId(attnames[i]));
|
appendPQExpBuffer(q, "%s", fmtId(attnames[i]));
|
||||||
needComma = true;
|
needComma = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!needComma)
|
||||||
|
return NULL; /* no undropped columns */
|
||||||
|
|
||||||
appendPQExpBuffer(q, ")");
|
appendPQExpBuffer(q, ")");
|
||||||
return q->data;
|
return q->data;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user