mirror of
https://github.com/postgres/postgres.git
synced 2025-04-21 12:05:57 +03:00
Playing around with pg_dump for a while resulted in some
fixes, enhancements and some found bugs not yet fixed. After all I was able to get useful results when dumping/reloading the regression database. Jan
This commit is contained in:
parent
57d57d9500
commit
803204bd1e
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteDefine.c,v 1.22 1998/10/02 16:27:46 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteDefine.c,v 1.23 1998/10/06 22:14:14 momjian Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -243,6 +243,7 @@ DefineQueryRewrite(RuleStmt *stmt)
|
|||||||
Form_pg_attribute attr;
|
Form_pg_attribute attr;
|
||||||
char *attname;
|
char *attname;
|
||||||
int i;
|
int i;
|
||||||
|
char expected_name[NAMEDATALEN + 5];
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* So there cannot be INSTEAD NOTHING, ...
|
* So there cannot be INSTEAD NOTHING, ...
|
||||||
@ -269,7 +270,7 @@ DefineQueryRewrite(RuleStmt *stmt)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* ... the targetlist of the SELECT action must
|
* ... the targetlist of the SELECT action must
|
||||||
* exactly match the event relation ...
|
* exactly match the event relation, ...
|
||||||
*/
|
*/
|
||||||
event_relation = heap_openr(event_obj->relname);
|
event_relation = heap_openr(event_obj->relname);
|
||||||
if (event_relation == NULL)
|
if (event_relation == NULL)
|
||||||
@ -295,8 +296,8 @@ DefineQueryRewrite(RuleStmt *stmt)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ... and final there must not be another ON SELECT
|
* ... there must not be another ON SELECT
|
||||||
* rule already.
|
* rule already ...
|
||||||
*/
|
*/
|
||||||
if (event_relation->rd_rules != NULL) {
|
if (event_relation->rd_rules != NULL) {
|
||||||
for (i = 0; i < event_relation->rd_rules->numLocks; i++) {
|
for (i = 0; i < event_relation->rd_rules->numLocks; i++) {
|
||||||
@ -309,6 +310,15 @@ DefineQueryRewrite(RuleStmt *stmt)
|
|||||||
}
|
}
|
||||||
|
|
||||||
heap_close(event_relation);
|
heap_close(event_relation);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ... and finally the rule must be named _RETviewname.
|
||||||
|
*/
|
||||||
|
sprintf(expected_name, "_RET%s", event_obj->relname);
|
||||||
|
if (strcmp(expected_name, stmt->rulename) != 0) {
|
||||||
|
elog(ERROR, "view rule for %s must be named %s",
|
||||||
|
event_obj->relname, expected_name);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
* out of it's tuple
|
* out of it's tuple
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/utils/adt/ruleutils.c,v 1.4 1998/10/02 16:27:51 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/utils/adt/ruleutils.c,v 1.5 1998/10/06 22:14:16 momjian Exp $
|
||||||
*
|
*
|
||||||
* This software is copyrighted by Jan Wieck - Hamburg.
|
* This software is copyrighted by Jan Wieck - Hamburg.
|
||||||
*
|
*
|
||||||
@ -415,7 +415,7 @@ pg_get_indexdef(Oid indexrelid)
|
|||||||
* Start the index definition
|
* Start the index definition
|
||||||
* ----------
|
* ----------
|
||||||
*/
|
*/
|
||||||
sprintf(buf, "CREATE %sINDEX %s ON %s USING %s (",
|
sprintf(buf, "CREATE %sINDEX \"%s\" ON \"%s\" USING %s (",
|
||||||
idxrec->indisunique ? "UNIQUE " : "",
|
idxrec->indisunique ? "UNIQUE " : "",
|
||||||
nameout(&(idxrelrec->relname)),
|
nameout(&(idxrelrec->relname)),
|
||||||
nameout(&(indrelrec->relname)),
|
nameout(&(indrelrec->relname)),
|
||||||
@ -439,11 +439,13 @@ pg_get_indexdef(Oid indexrelid)
|
|||||||
* Add the indexed field name
|
* Add the indexed field name
|
||||||
* ----------
|
* ----------
|
||||||
*/
|
*/
|
||||||
|
strcat(keybuf, "\"");
|
||||||
if (idxrec->indkey[keyno] == ObjectIdAttributeNumber - 1)
|
if (idxrec->indkey[keyno] == ObjectIdAttributeNumber - 1)
|
||||||
strcat(keybuf, "oid");
|
strcat(keybuf, "oid");
|
||||||
else
|
else
|
||||||
strcat(keybuf, get_attribute_name(idxrec->indrelid,
|
strcat(keybuf, get_attribute_name(idxrec->indrelid,
|
||||||
idxrec->indkey[keyno]));
|
idxrec->indkey[keyno]));
|
||||||
|
strcat(keybuf, "\"");
|
||||||
|
|
||||||
/* ----------
|
/* ----------
|
||||||
* If not a functional index, add the operator class name
|
* If not a functional index, add the operator class name
|
||||||
@ -462,8 +464,9 @@ pg_get_indexdef(Oid indexrelid)
|
|||||||
spi_tup = SPI_tuptable->vals[0];
|
spi_tup = SPI_tuptable->vals[0];
|
||||||
spi_ttc = SPI_tuptable->tupdesc;
|
spi_ttc = SPI_tuptable->tupdesc;
|
||||||
spi_fno = SPI_fnumber(spi_ttc, "opcname");
|
spi_fno = SPI_fnumber(spi_ttc, "opcname");
|
||||||
strcat(keybuf, " ");
|
strcat(keybuf, " \"");
|
||||||
strcat(keybuf, SPI_getvalue(spi_tup, spi_ttc, spi_fno));
|
strcat(keybuf, SPI_getvalue(spi_tup, spi_ttc, spi_fno));
|
||||||
|
strcat(keybuf, "\"");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -482,8 +485,9 @@ pg_get_indexdef(Oid indexrelid)
|
|||||||
elog(ERROR, "cache lookup for proc %d failed", idxrec->indproc);
|
elog(ERROR, "cache lookup for proc %d failed", idxrec->indproc);
|
||||||
|
|
||||||
procStruct = (Form_pg_proc) GETSTRUCT(proctup);
|
procStruct = (Form_pg_proc) GETSTRUCT(proctup);
|
||||||
|
strcat(buf, "\"");
|
||||||
strcat(buf, nameout(&(procStruct->proname)));
|
strcat(buf, nameout(&(procStruct->proname)));
|
||||||
strcat(buf, " (");
|
strcat(buf, "\" (");
|
||||||
strcat(buf, keybuf);
|
strcat(buf, keybuf);
|
||||||
strcat(buf, ") ");
|
strcat(buf, ") ");
|
||||||
|
|
||||||
@ -498,7 +502,9 @@ pg_get_indexdef(Oid indexrelid)
|
|||||||
spi_tup = SPI_tuptable->vals[0];
|
spi_tup = SPI_tuptable->vals[0];
|
||||||
spi_ttc = SPI_tuptable->tupdesc;
|
spi_ttc = SPI_tuptable->tupdesc;
|
||||||
spi_fno = SPI_fnumber(spi_ttc, "opcname");
|
spi_fno = SPI_fnumber(spi_ttc, "opcname");
|
||||||
|
strcat(buf, "\"");
|
||||||
strcat(buf, SPI_getvalue(spi_tup, spi_ttc, spi_fno));
|
strcat(buf, SPI_getvalue(spi_tup, spi_ttc, spi_fno));
|
||||||
|
strcat(buf, "\"");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
/* ----------
|
/* ----------
|
||||||
@ -628,29 +634,29 @@ make_ruledef(HeapTuple ruletup, TupleDesc rulettc)
|
|||||||
* Build the rules definition text
|
* Build the rules definition text
|
||||||
* ----------
|
* ----------
|
||||||
*/
|
*/
|
||||||
strcpy(buf, "CREATE RULE ");
|
strcpy(buf, "CREATE RULE \"");
|
||||||
|
|
||||||
/* The rule name */
|
/* The rule name */
|
||||||
strcat(buf, rulename);
|
strcat(buf, rulename);
|
||||||
strcat(buf, " AS ON ");
|
strcat(buf, "\" AS ON ");
|
||||||
|
|
||||||
/* The event the rule is fired for */
|
/* The event the rule is fired for */
|
||||||
switch (ev_type)
|
switch (ev_type)
|
||||||
{
|
{
|
||||||
case '1':
|
case '1':
|
||||||
strcat(buf, "SELECT TO ");
|
strcat(buf, "SELECT TO \"");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '2':
|
case '2':
|
||||||
strcat(buf, "UPDATE TO ");
|
strcat(buf, "UPDATE TO \"");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '3':
|
case '3':
|
||||||
strcat(buf, "INSERT TO ");
|
strcat(buf, "INSERT TO \"");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '4':
|
case '4':
|
||||||
strcat(buf, "DELETE TO ");
|
strcat(buf, "DELETE TO \"");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@ -661,10 +667,12 @@ make_ruledef(HeapTuple ruletup, TupleDesc rulettc)
|
|||||||
|
|
||||||
/* The relation the rule is fired on */
|
/* The relation the rule is fired on */
|
||||||
strcat(buf, get_relation_name(ev_class));
|
strcat(buf, get_relation_name(ev_class));
|
||||||
|
strcat(buf, "\"");
|
||||||
if (ev_attr > 0)
|
if (ev_attr > 0)
|
||||||
{
|
{
|
||||||
strcat(buf, ".");
|
strcat(buf, ".\"");
|
||||||
strcat(buf, get_attribute_name(ev_class, ev_attr));
|
strcat(buf, get_attribute_name(ev_class, ev_attr));
|
||||||
|
strcat(buf, "\"");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If the rule has an event qualification, add it */
|
/* If the rule has an event qualification, add it */
|
||||||
@ -941,8 +949,9 @@ get_select_query_def(Query *query, QryHier *qh)
|
|||||||
/* and do if so */
|
/* and do if so */
|
||||||
if (tell_as)
|
if (tell_as)
|
||||||
{
|
{
|
||||||
strcat(buf, " AS ");
|
strcat(buf, " AS \"");
|
||||||
strcat(buf, tle->resdom->resname);
|
strcat(buf, tle->resdom->resname);
|
||||||
|
strcat(buf, "\"");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -967,11 +976,14 @@ get_select_query_def(Query *query, QryHier *qh)
|
|||||||
|
|
||||||
strcat(buf, sep);
|
strcat(buf, sep);
|
||||||
sep = ", ";
|
sep = ", ";
|
||||||
|
strcat(buf, "\"");
|
||||||
strcat(buf, rte->relname);
|
strcat(buf, rte->relname);
|
||||||
|
strcat(buf, "\"");
|
||||||
if (strcmp(rte->relname, rte->refname) != 0)
|
if (strcmp(rte->relname, rte->refname) != 0)
|
||||||
{
|
{
|
||||||
strcat(buf, " ");
|
strcat(buf, " \"");
|
||||||
strcat(buf, rte->refname);
|
strcat(buf, rte->refname);
|
||||||
|
strcat(buf, "\"");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1071,8 +1083,9 @@ get_insert_query_def(Query *query, QryHier *qh)
|
|||||||
* ----------
|
* ----------
|
||||||
*/
|
*/
|
||||||
rte = (RangeTblEntry *) nth(query->resultRelation - 1, query->rtable);
|
rte = (RangeTblEntry *) nth(query->resultRelation - 1, query->rtable);
|
||||||
strcpy(buf, "INSERT INTO ");
|
strcpy(buf, "INSERT INTO \"");
|
||||||
strcat(buf, rte->relname);
|
strcat(buf, rte->relname);
|
||||||
|
strcat(buf, "\"");
|
||||||
|
|
||||||
/* Add the target list */
|
/* Add the target list */
|
||||||
sep = " (";
|
sep = " (";
|
||||||
@ -1082,7 +1095,9 @@ get_insert_query_def(Query *query, QryHier *qh)
|
|||||||
|
|
||||||
strcat(buf, sep);
|
strcat(buf, sep);
|
||||||
sep = ", ";
|
sep = ", ";
|
||||||
|
strcat(buf, "\"");
|
||||||
strcat(buf, tle->resdom->resname);
|
strcat(buf, tle->resdom->resname);
|
||||||
|
strcat(buf, "\"");
|
||||||
}
|
}
|
||||||
strcat(buf, ") ");
|
strcat(buf, ") ");
|
||||||
|
|
||||||
@ -1142,8 +1157,9 @@ get_update_query_def(Query *query, QryHier *qh)
|
|||||||
|
|
||||||
strcat(buf, sep);
|
strcat(buf, sep);
|
||||||
sep = ", ";
|
sep = ", ";
|
||||||
|
strcat(buf, "\"");
|
||||||
strcat(buf, tle->resdom->resname);
|
strcat(buf, tle->resdom->resname);
|
||||||
strcat(buf, " = ");
|
strcat(buf, "\" = ");
|
||||||
strcat(buf, get_tle_expr(qh, query->resultRelation,
|
strcat(buf, get_tle_expr(qh, query->resultRelation,
|
||||||
tle, TRUE));
|
tle, TRUE));
|
||||||
}
|
}
|
||||||
@ -1179,8 +1195,9 @@ get_delete_query_def(Query *query, QryHier *qh)
|
|||||||
* ----------
|
* ----------
|
||||||
*/
|
*/
|
||||||
rte = (RangeTblEntry *) nth(query->resultRelation - 1, query->rtable);
|
rte = (RangeTblEntry *) nth(query->resultRelation - 1, query->rtable);
|
||||||
strcpy(buf, "DELETE FROM ");
|
strcpy(buf, "DELETE FROM \"");
|
||||||
strcat(buf, rte->relname);
|
strcat(buf, rte->relname);
|
||||||
|
strcat(buf, "\"");
|
||||||
|
|
||||||
/* Add a WHERE clause if given */
|
/* Add a WHERE clause if given */
|
||||||
if (query->qual != NULL)
|
if (query->qual != NULL)
|
||||||
@ -1232,8 +1249,9 @@ get_rule_expr(QryHier *qh, int rt_index, Node *node, bool varprefix)
|
|||||||
{
|
{
|
||||||
Aggreg *agg = (Aggreg *) node;
|
Aggreg *agg = (Aggreg *) node;
|
||||||
|
|
||||||
|
strcat(buf, "\"");
|
||||||
strcat(buf, agg->aggname);
|
strcat(buf, agg->aggname);
|
||||||
strcat(buf, "(");
|
strcat(buf, "\"(");
|
||||||
strcat(buf, get_rule_expr(qh, rt_index,
|
strcat(buf, get_rule_expr(qh, rt_index,
|
||||||
(Node *) (agg->target), varprefix));
|
(Node *) (agg->target), varprefix));
|
||||||
strcat(buf, ")");
|
strcat(buf, ")");
|
||||||
@ -1328,10 +1346,8 @@ get_rule_expr(QryHier *qh, int rt_index, Node *node, bool varprefix)
|
|||||||
int sup = var->varlevelsup;
|
int sup = var->varlevelsup;
|
||||||
|
|
||||||
while(sup-- > 0) qh = qh->parent;
|
while(sup-- > 0) qh = qh->parent;
|
||||||
rte = (RangeTblEntry *) nth(var->varno - 1, qh->query->rtable);
|
|
||||||
|
|
||||||
if (qh->parent == NULL && var->varlevelsup > 0)
|
rte = (RangeTblEntry *) nth(var->varno - 1, qh->query->rtable);
|
||||||
rte = (RangeTblEntry *) nth(var->varno + 1, qh->query->rtable);
|
|
||||||
|
|
||||||
if (!strcmp(rte->refname, "*NEW*"))
|
if (!strcmp(rte->refname, "*NEW*"))
|
||||||
strcat(buf, "new.");
|
strcat(buf, "new.");
|
||||||
@ -1343,12 +1359,15 @@ get_rule_expr(QryHier *qh, int rt_index, Node *node, bool varprefix)
|
|||||||
{
|
{
|
||||||
if (strcmp(rte->relname, rte->refname) != 0)
|
if (strcmp(rte->relname, rte->refname) != 0)
|
||||||
{
|
{
|
||||||
|
strcat(buf, "\"");
|
||||||
strcat(buf, rte->refname);
|
strcat(buf, rte->refname);
|
||||||
strcat(buf, ".");
|
strcat(buf, "\".");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
strcat(buf, "\"");
|
||||||
strcat(buf, get_attribute_name(rte->relid, var->varattno));
|
strcat(buf, get_attribute_name(rte->relid, var->varattno));
|
||||||
|
strcat(buf, "\"");
|
||||||
|
|
||||||
return pstrdup(buf);
|
return pstrdup(buf);
|
||||||
}
|
}
|
||||||
@ -1433,8 +1452,9 @@ get_func_expr(QryHier *qh, int rt_index, Expr *expr, bool varprefix)
|
|||||||
* Build a string of proname(args)
|
* Build a string of proname(args)
|
||||||
* ----------
|
* ----------
|
||||||
*/
|
*/
|
||||||
strcpy(buf, proname);
|
strcpy(buf, "\"");
|
||||||
strcat(buf, "(");
|
strcat(buf, proname);
|
||||||
|
strcat(buf, "\"(");
|
||||||
sep = "";
|
sep = "";
|
||||||
foreach(l, expr->args)
|
foreach(l, expr->args)
|
||||||
{
|
{
|
||||||
@ -1561,7 +1581,7 @@ get_const_expr(Const *constval)
|
|||||||
extval = (char *) (*fmgr_faddr(&finfo_output)) (constval->constvalue,
|
extval = (char *) (*fmgr_faddr(&finfo_output)) (constval->constvalue,
|
||||||
&isnull, -1);
|
&isnull, -1);
|
||||||
|
|
||||||
sprintf(namebuf, "::%s", nameout(&(typeStruct->typname)));
|
sprintf(namebuf, "::\"%s\"", nameout(&(typeStruct->typname)));
|
||||||
if (strcmp(namebuf, "::unknown") == 0)
|
if (strcmp(namebuf, "::unknown") == 0)
|
||||||
namebuf[0] = '\0';
|
namebuf[0] = '\0';
|
||||||
sprintf(buf, "'%s'%s", extval, namebuf);
|
sprintf(buf, "'%s'%s", extval, namebuf);
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/bin/pg_dump/common.c,v 1.26 1998/10/02 16:43:38 thomas Exp $
|
* $Header: /cvsroot/pgsql/src/bin/pg_dump/common.c,v 1.27 1998/10/06 22:14:17 momjian Exp $
|
||||||
*
|
*
|
||||||
* Modifications - 6/12/96 - dave@bensoft.com - version 1.13.dhb.2
|
* Modifications - 6/12/96 - dave@bensoft.com - version 1.13.dhb.2
|
||||||
*
|
*
|
||||||
@ -304,6 +304,14 @@ dumpSchema(FILE *fout,
|
|||||||
tinfo, numTypes, tablename, acls);
|
tinfo, numTypes, tablename, acls);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!tablename && fout)
|
||||||
|
{
|
||||||
|
if (g_verbose)
|
||||||
|
fprintf(stderr, "%s dumping out user-defined procedural languages %s\n",
|
||||||
|
g_comment_start, g_comment_end);
|
||||||
|
dumpProcLangs(fout, finfo, numFuncs, tinfo, numTypes);
|
||||||
|
}
|
||||||
|
|
||||||
if (!tablename && fout)
|
if (!tablename && fout)
|
||||||
{
|
{
|
||||||
if (g_verbose)
|
if (g_verbose)
|
||||||
@ -315,7 +323,7 @@ dumpSchema(FILE *fout,
|
|||||||
if (!tablename && fout)
|
if (!tablename && fout)
|
||||||
{
|
{
|
||||||
if (g_verbose)
|
if (g_verbose)
|
||||||
fprintf(stderr, "%s dumping out user-defined functions %s\n",
|
fprintf(stderr, "%s dumping out user-defined aggregates %s\n",
|
||||||
g_comment_start, g_comment_end);
|
g_comment_start, g_comment_end);
|
||||||
dumpAggs(fout, agginfo, numAggregates, tinfo, numTypes);
|
dumpAggs(fout, agginfo, numAggregates, tinfo, numTypes);
|
||||||
}
|
}
|
||||||
|
@ -21,7 +21,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.90 1998/10/06 05:35:42 thomas Exp $
|
* $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.91 1998/10/06 22:14:19 momjian Exp $
|
||||||
*
|
*
|
||||||
* Modifications - 6/10/96 - dave@bensoft.com - version 1.13.dhb
|
* Modifications - 6/10/96 - dave@bensoft.com - version 1.13.dhb
|
||||||
*
|
*
|
||||||
@ -82,6 +82,8 @@ static void dumpSequence(FILE *fout, TableInfo tbinfo);
|
|||||||
static void dumpACL(FILE *fout, TableInfo tbinfo);
|
static void dumpACL(FILE *fout, TableInfo tbinfo);
|
||||||
static void dumpTriggers(FILE *fout, const char *tablename,
|
static void dumpTriggers(FILE *fout, const char *tablename,
|
||||||
TableInfo *tblinfo, int numTables);
|
TableInfo *tblinfo, int numTables);
|
||||||
|
static void dumpRules(FILE *fout, const char *tablename,
|
||||||
|
TableInfo *tblinfo, int numTables);
|
||||||
static char *checkForQuote(const char *s);
|
static char *checkForQuote(const char *s);
|
||||||
static void clearTableInfo(TableInfo *, int);
|
static void clearTableInfo(TableInfo *, int);
|
||||||
static void dumpOneFunc(FILE *fout, FuncInfo *finfo, int i,
|
static void dumpOneFunc(FILE *fout, FuncInfo *finfo, int i,
|
||||||
@ -190,6 +192,7 @@ isViewRule(char *relname)
|
|||||||
|
|
||||||
sprintf(query, "select relname from pg_class, pg_rewrite "
|
sprintf(query, "select relname from pg_class, pg_rewrite "
|
||||||
"where pg_class.oid = ev_class "
|
"where pg_class.oid = ev_class "
|
||||||
|
"and pg_rewrite.ev_type = '1' "
|
||||||
"and rulename = '_RET%s'", relname);
|
"and rulename = '_RET%s'", relname);
|
||||||
|
|
||||||
res = PQexec(g_conn, query);
|
res = PQexec(g_conn, query);
|
||||||
@ -698,6 +701,7 @@ main(int argc, char **argv)
|
|||||||
{
|
{
|
||||||
dumpSchemaIdx(g_fout, tablename, tblinfo, numTables);
|
dumpSchemaIdx(g_fout, tablename, tblinfo, numTables);
|
||||||
dumpTriggers(g_fout, tablename, tblinfo, numTables);
|
dumpTriggers(g_fout, tablename, tblinfo, numTables);
|
||||||
|
dumpRules(g_fout, tablename, tblinfo, numTables);
|
||||||
}
|
}
|
||||||
|
|
||||||
fflush(g_fout);
|
fflush(g_fout);
|
||||||
@ -1384,7 +1388,7 @@ getFuncs(int *numFuncs)
|
|||||||
TableInfo *
|
TableInfo *
|
||||||
getTables(int *numTables, FuncInfo *finfo, int numFuncs)
|
getTables(int *numTables, FuncInfo *finfo, int numFuncs)
|
||||||
{
|
{
|
||||||
PGresult *res, *viewres;
|
PGresult *res;
|
||||||
int ntups;
|
int ntups;
|
||||||
int i;
|
int i;
|
||||||
char query[MAXQUERYLEN];
|
char query[MAXQUERYLEN];
|
||||||
@ -1415,8 +1419,6 @@ getTables(int *numTables, FuncInfo *finfo, int numFuncs)
|
|||||||
}
|
}
|
||||||
PQclear(res);
|
PQclear(res);
|
||||||
|
|
||||||
/* NOTE, when outer joins are here, change this query to get the
|
|
||||||
view definition all in one go. */
|
|
||||||
sprintf(query,
|
sprintf(query,
|
||||||
"SELECT pg_class.oid, relname, relkind, relacl, usename, "
|
"SELECT pg_class.oid, relname, relkind, relacl, usename, "
|
||||||
"relchecks, reltriggers "
|
"relchecks, reltriggers "
|
||||||
@ -1457,39 +1459,6 @@ view definition all in one go. */
|
|||||||
tblinfo[i].ncheck = atoi(PQgetvalue(res, i, i_relchecks));
|
tblinfo[i].ncheck = atoi(PQgetvalue(res, i, i_relchecks));
|
||||||
tblinfo[i].ntrig = atoi(PQgetvalue(res, i, i_reltriggers));
|
tblinfo[i].ntrig = atoi(PQgetvalue(res, i, i_reltriggers));
|
||||||
|
|
||||||
/* NOTE that at such time as left outer joins become avaliable,
|
|
||||||
then this will no longer be needed, and can be done in the
|
|
||||||
above query. */
|
|
||||||
|
|
||||||
sprintf(query,
|
|
||||||
"select definition from pg_views where viewname = '%s';",
|
|
||||||
tblinfo[i].relname);
|
|
||||||
|
|
||||||
viewres = PQexec(g_conn, query);
|
|
||||||
if (!viewres ||
|
|
||||||
PQresultStatus(res) != PGRES_TUPLES_OK)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "getTables(): SELECT for views failed\n");
|
|
||||||
exit_nicely(g_conn);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* NOTE: Tryed to use isViewRule here, but it does it's own
|
|
||||||
BEGIN and END so messed things up.
|
|
||||||
This also needs redone should we ever get outer joins.
|
|
||||||
*/
|
|
||||||
if ( PQntuples(viewres) > 0 )
|
|
||||||
{
|
|
||||||
if ( PQntuples(viewres) != 1 )
|
|
||||||
{
|
|
||||||
fprintf(stderr, "getTables(): failed to get view definition.\n");
|
|
||||||
exit_nicely(g_conn);
|
|
||||||
}
|
|
||||||
|
|
||||||
tblinfo[i].viewdef = strdup(PQgetvalue(viewres, 0, 0));
|
|
||||||
}
|
|
||||||
|
|
||||||
PQclear(viewres);
|
|
||||||
|
|
||||||
/* Get CHECK constraints */
|
/* Get CHECK constraints */
|
||||||
if (tblinfo[i].ncheck > 0)
|
if (tblinfo[i].ncheck > 0)
|
||||||
{
|
{
|
||||||
@ -1596,7 +1565,6 @@ view definition all in one go. */
|
|||||||
for (findx = 0; findx < numFuncs; findx++)
|
for (findx = 0; findx < numFuncs; findx++)
|
||||||
{
|
{
|
||||||
if (strcmp(finfo[findx].oid, tgfunc) == 0 &&
|
if (strcmp(finfo[findx].oid, tgfunc) == 0 &&
|
||||||
finfo[findx].lang == ClanguageId &&
|
|
||||||
finfo[findx].nargs == 0 &&
|
finfo[findx].nargs == 0 &&
|
||||||
strcmp(finfo[findx].prorettype, "0") == 0)
|
strcmp(finfo[findx].prorettype, "0") == 0)
|
||||||
break;
|
break;
|
||||||
@ -2035,6 +2003,88 @@ dumpTypes(FILE *fout, FuncInfo *finfo, int numFuncs,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* dumpProcLangs
|
||||||
|
* writes out to fout the queries to recreate user-defined procedural languages
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
dumpProcLangs(FILE *fout, FuncInfo *finfo, int numFuncs,
|
||||||
|
TypeInfo *tinfo, int numTypes)
|
||||||
|
{
|
||||||
|
PGresult *res;
|
||||||
|
char query[MAXQUERYLEN];
|
||||||
|
int ntups;
|
||||||
|
int i_lanname;
|
||||||
|
int i_lanpltrusted;
|
||||||
|
int i_lanplcallfoid;
|
||||||
|
int i_lancompiler;
|
||||||
|
char *lanname;
|
||||||
|
char *lancompiler;
|
||||||
|
char *lanplcallfoid;
|
||||||
|
int i,
|
||||||
|
fidx;
|
||||||
|
|
||||||
|
res = PQexec(g_conn, "begin");
|
||||||
|
if (!res ||
|
||||||
|
PQresultStatus(res) != PGRES_COMMAND_OK)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "BEGIN command failed\n");
|
||||||
|
exit_nicely(g_conn);
|
||||||
|
}
|
||||||
|
|
||||||
|
sprintf(query, "SELECT * FROM pg_language "
|
||||||
|
"WHERE lanispl "
|
||||||
|
"ORDER BY oid");
|
||||||
|
res = PQexec(g_conn, query);
|
||||||
|
if (!res ||
|
||||||
|
PQresultStatus(res) != PGRES_TUPLES_OK)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "dumpProcLangs(): SELECT failed\n");
|
||||||
|
exit_nicely(g_conn);
|
||||||
|
}
|
||||||
|
ntups = PQntuples(res);
|
||||||
|
|
||||||
|
i_lanname = PQfnumber(res, "lanname");
|
||||||
|
i_lanpltrusted = PQfnumber(res, "lanpltrusted");
|
||||||
|
i_lanplcallfoid = PQfnumber(res, "lanplcallfoid");
|
||||||
|
i_lancompiler = PQfnumber(res, "lancompiler");
|
||||||
|
|
||||||
|
for (i = 0; i < ntups; i++) {
|
||||||
|
lanplcallfoid = PQgetvalue(res, i, i_lanplcallfoid);
|
||||||
|
for (fidx = 0; fidx < numFuncs; fidx++)
|
||||||
|
{
|
||||||
|
if (!strcmp(finfo[fidx].oid, lanplcallfoid))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (fidx >= numFuncs)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "dumpProcLangs(): handler procedure for language %s not found\n", PQgetvalue(res, i, i_lanname));
|
||||||
|
exit_nicely(g_conn);
|
||||||
|
}
|
||||||
|
|
||||||
|
dumpOneFunc(fout, finfo, fidx, tinfo, numTypes);
|
||||||
|
|
||||||
|
lanname = checkForQuote(PQgetvalue(res, i, i_lanname));
|
||||||
|
lancompiler = checkForQuote(PQgetvalue(res, i, i_lancompiler));
|
||||||
|
|
||||||
|
fprintf(fout, "CREATE %sPROCEDURAL LANGUAGE '%s' "
|
||||||
|
"HANDLER %s LANCOMPILER '%s';\n",
|
||||||
|
(PQgetvalue(res, i, i_lanpltrusted)[0] == 't') ? "TRUSTED " : "",
|
||||||
|
lanname,
|
||||||
|
fmtId(finfo[fidx].proname),
|
||||||
|
lancompiler);
|
||||||
|
|
||||||
|
free(lanname);
|
||||||
|
free(lancompiler);
|
||||||
|
}
|
||||||
|
|
||||||
|
PQclear(res);
|
||||||
|
|
||||||
|
res = PQexec(g_conn, "end");
|
||||||
|
PQclear(res);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* dumpFuncs
|
* dumpFuncs
|
||||||
* writes out to fout the queries to recreate all the user-defined functions
|
* writes out to fout the queries to recreate all the user-defined functions
|
||||||
@ -2063,6 +2113,8 @@ dumpOneFunc(FILE *fout, FuncInfo *finfo, int i,
|
|||||||
{
|
{
|
||||||
char q[MAXQUERYLEN];
|
char q[MAXQUERYLEN];
|
||||||
int j;
|
int j;
|
||||||
|
char *func_def;
|
||||||
|
char func_lang[NAMEDATALEN + 1];
|
||||||
|
|
||||||
if (finfo[i].dumped)
|
if (finfo[i].dumped)
|
||||||
return;
|
return;
|
||||||
@ -2071,6 +2123,66 @@ dumpOneFunc(FILE *fout, FuncInfo *finfo, int i,
|
|||||||
|
|
||||||
becomeUser(fout, finfo[i].usename);
|
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");
|
||||||
|
}
|
||||||
|
else if (finfo[i].lang == SQLlanguageId)
|
||||||
|
{
|
||||||
|
func_def = finfo[i].prosrc;
|
||||||
|
strcpy(func_lang, "SQL");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
PGresult *res;
|
||||||
|
int nlangs;
|
||||||
|
int i_lanname;
|
||||||
|
char query[256];
|
||||||
|
|
||||||
|
res = PQexec(g_conn, "begin");
|
||||||
|
if (!res ||
|
||||||
|
PQresultStatus(res) != PGRES_COMMAND_OK)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "dumpOneFunc(): BEGIN command failed\n");
|
||||||
|
exit_nicely(g_conn);
|
||||||
|
}
|
||||||
|
PQclear(res);
|
||||||
|
|
||||||
|
sprintf(query, "SELECT lanname FROM pg_language "
|
||||||
|
"WHERE oid = %d",
|
||||||
|
finfo[i].lang);
|
||||||
|
res = PQexec(g_conn, query);
|
||||||
|
if (!res ||
|
||||||
|
PQresultStatus(res) != PGRES_TUPLES_OK)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "dumpOneFunc(): SELECT for procedural language failed\n");
|
||||||
|
exit_nicely(g_conn);
|
||||||
|
}
|
||||||
|
nlangs = PQntuples(res);
|
||||||
|
|
||||||
|
if (nlangs != 1)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "dumpOneFunc(): procedural language for function %s not found\n", finfo[i].proname);
|
||||||
|
exit_nicely(g_conn);
|
||||||
|
}
|
||||||
|
|
||||||
|
i_lanname = PQfnumber(res, "lanname");
|
||||||
|
|
||||||
|
func_def = finfo[i].prosrc;
|
||||||
|
strcpy(func_lang, PQgetvalue(res, 0, i_lanname));
|
||||||
|
|
||||||
|
PQclear(res);
|
||||||
|
|
||||||
|
res = PQexec(g_conn, "end");
|
||||||
|
PQclear(res);
|
||||||
|
}
|
||||||
|
|
||||||
sprintf(q, "CREATE FUNCTION %s (", fmtId(finfo[i].proname));
|
sprintf(q, "CREATE FUNCTION %s (", fmtId(finfo[i].proname));
|
||||||
for (j = 0; j < finfo[i].nargs; j++)
|
for (j = 0; j < finfo[i].nargs; j++)
|
||||||
{
|
{
|
||||||
@ -2086,12 +2198,7 @@ dumpOneFunc(FILE *fout, FuncInfo *finfo, int i,
|
|||||||
q,
|
q,
|
||||||
(finfo[i].retset) ? " SETOF " : "",
|
(finfo[i].retset) ? " SETOF " : "",
|
||||||
fmtId(findTypeByOid(tinfo, numTypes, finfo[i].prorettype)),
|
fmtId(findTypeByOid(tinfo, numTypes, finfo[i].prorettype)),
|
||||||
(finfo[i].lang == INTERNALlanguageId) ? finfo[i].prosrc :
|
func_def, func_lang);
|
||||||
(finfo[i].lang == ClanguageId) ? finfo[i].probin :
|
|
||||||
(finfo[i].lang == SQLlanguageId) ? finfo[i].prosrc : "unknown",
|
|
||||||
(finfo[i].lang == INTERNALlanguageId) ? "INTERNAL" :
|
|
||||||
(finfo[i].lang == ClanguageId) ? "C" :
|
|
||||||
(finfo[i].lang == SQLlanguageId) ? "SQL" : "unknown");
|
|
||||||
|
|
||||||
fputs(q, fout);
|
fputs(q, fout);
|
||||||
|
|
||||||
@ -2504,17 +2611,12 @@ dumpTables(FILE *fout, TableInfo *tblinfo, int numTables,
|
|||||||
if (!tablename || (!strcmp(tblinfo[i].relname, tablename)))
|
if (!tablename || (!strcmp(tblinfo[i].relname, tablename)))
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Dump VIEW relations also !-) */
|
/* Skip VIEW relations */
|
||||||
|
/*
|
||||||
if (isViewRule(tblinfo[i].relname))
|
if (isViewRule(tblinfo[i].relname))
|
||||||
{
|
continue;
|
||||||
becomeUser(fout, tblinfo[i].usename);
|
*/
|
||||||
|
|
||||||
sprintf(q, "CREATE VIEW %s AS %s\n",
|
|
||||||
fmtId(tblinfo[i].relname),
|
|
||||||
tblinfo[i].viewdef);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
parentRels = tblinfo[i].parentRels;
|
parentRels = tblinfo[i].parentRels;
|
||||||
numParents = tblinfo[i].numParents;
|
numParents = tblinfo[i].numParents;
|
||||||
|
|
||||||
@ -2594,12 +2696,12 @@ dumpTables(FILE *fout, TableInfo *tblinfo, int numTables,
|
|||||||
}
|
}
|
||||||
strcat(q, ")");
|
strcat(q, ")");
|
||||||
}
|
}
|
||||||
strcat(q, ";\n");
|
|
||||||
} /* end of if view ... else .... */
|
|
||||||
|
|
||||||
|
strcat(q, ";\n");
|
||||||
fputs(q, fout);
|
fputs(q, fout);
|
||||||
if (acls)
|
if (acls)
|
||||||
dumpACL(fout, tblinfo[i]);
|
dumpACL(fout, tblinfo[i]);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2744,7 +2846,7 @@ dumpIndices(FILE *fout, IndInfo *indinfo, int numIndices,
|
|||||||
if (funcname)
|
if (funcname)
|
||||||
{
|
{
|
||||||
sprintf(q, "%s %s (%s) %s );\n",
|
sprintf(q, "%s %s (%s) %s );\n",
|
||||||
q, funcname, attlist, fmtId(classname[0]));
|
q, fmtId(funcname), attlist, fmtId(classname[0]));
|
||||||
free(funcname);
|
free(funcname);
|
||||||
free(classname[0]);
|
free(classname[0]);
|
||||||
}
|
}
|
||||||
@ -3039,6 +3141,75 @@ dumpTriggers(FILE *fout, const char *tablename,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
dumpRules(FILE *fout, const char *tablename,
|
||||||
|
TableInfo *tblinfo, int numTables)
|
||||||
|
{
|
||||||
|
PGresult *res;
|
||||||
|
int nrules;
|
||||||
|
int i,
|
||||||
|
t;
|
||||||
|
char query[MAXQUERYLEN];
|
||||||
|
|
||||||
|
int i_definition;
|
||||||
|
|
||||||
|
if (g_verbose)
|
||||||
|
fprintf(stderr, "%s dumping out rules %s\n",
|
||||||
|
g_comment_start, g_comment_end);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* For each table we dump
|
||||||
|
*/
|
||||||
|
for (t = 0; t < numTables; t++)
|
||||||
|
{
|
||||||
|
if (tablename && strcmp(tblinfo[t].relname, tablename))
|
||||||
|
continue;
|
||||||
|
res = PQexec(g_conn, "begin");
|
||||||
|
if (!res ||
|
||||||
|
PQresultStatus(res) != PGRES_COMMAND_OK)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "BEGIN command failed\n");
|
||||||
|
exit_nicely(g_conn);
|
||||||
|
}
|
||||||
|
PQclear(res);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Get all rules defined for this table
|
||||||
|
*/
|
||||||
|
sprintf(query, "SELECT pg_get_ruledef(pg_rewrite.rulename) "
|
||||||
|
"AS definition FROM pg_rewrite, pg_class "
|
||||||
|
"WHERE pg_class.relname = '%s' "
|
||||||
|
"AND pg_rewrite.ev_class = pg_class.oid "
|
||||||
|
"ORDER BY pg_rewrite.oid",
|
||||||
|
tblinfo[t].relname);
|
||||||
|
res = PQexec(g_conn, query);
|
||||||
|
if (!res ||
|
||||||
|
PQresultStatus(res) != PGRES_TUPLES_OK)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "dumpRules(): SELECT failed for table %s\n",
|
||||||
|
tblinfo[t].relname);
|
||||||
|
exit_nicely(g_conn);
|
||||||
|
}
|
||||||
|
|
||||||
|
nrules = PQntuples(res);
|
||||||
|
i_definition = PQfnumber(res, "definition");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Dump them out
|
||||||
|
*/
|
||||||
|
for (i = 0; i < nrules; i++)
|
||||||
|
{
|
||||||
|
fprintf(fout, "%s\n", PQgetvalue(res, i, i_definition));
|
||||||
|
}
|
||||||
|
|
||||||
|
PQclear(res);
|
||||||
|
|
||||||
|
res = PQexec(g_conn, "end");
|
||||||
|
PQclear(res);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Issue a psql \connect command to become the specified user.
|
/* Issue a psql \connect command to become the specified user.
|
||||||
* We want to do this only if we are dumping ACLs,
|
* We want to do this only if we are dumping ACLs,
|
||||||
* and only if the new username is different from the last one
|
* and only if the new username is different from the last one
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
*
|
*
|
||||||
* Copyright (c) 1994, Regents of the University of California
|
* Copyright (c) 1994, Regents of the University of California
|
||||||
*
|
*
|
||||||
* $Id: pg_dump.h,v 1.34 1998/10/06 03:09:01 momjian Exp $
|
* $Id: pg_dump.h,v 1.35 1998/10/06 22:14:21 momjian Exp $
|
||||||
*
|
*
|
||||||
* Modifications - 6/12/96 - dave@bensoft.com - version 1.13.dhb.2
|
* Modifications - 6/12/96 - dave@bensoft.com - version 1.13.dhb.2
|
||||||
*
|
*
|
||||||
@ -66,7 +66,6 @@ typedef struct _tableInfo
|
|||||||
{
|
{
|
||||||
char *oid;
|
char *oid;
|
||||||
char *relname;
|
char *relname;
|
||||||
char *viewdef;
|
|
||||||
char *relacl;
|
char *relacl;
|
||||||
bool sequence;
|
bool sequence;
|
||||||
int numatts; /* number of attributes */
|
int numatts; /* number of attributes */
|
||||||
@ -223,6 +222,8 @@ extern void getTableAttrs(TableInfo *tbinfo, int numTables);
|
|||||||
extern IndInfo *getIndices(int *numIndices);
|
extern IndInfo *getIndices(int *numIndices);
|
||||||
extern void dumpTypes(FILE *fout, FuncInfo *finfo, int numFuncs,
|
extern void dumpTypes(FILE *fout, FuncInfo *finfo, int numFuncs,
|
||||||
TypeInfo *tinfo, int numTypes);
|
TypeInfo *tinfo, int numTypes);
|
||||||
|
extern void dumpProcLangs(FILE *fout, FuncInfo *finfo, int numFuncs,
|
||||||
|
TypeInfo *tinfo, int numTypes);
|
||||||
extern void dumpFuncs(FILE *fout, FuncInfo *finfo, int numFuncs,
|
extern void dumpFuncs(FILE *fout, FuncInfo *finfo, int numFuncs,
|
||||||
TypeInfo *tinfo, int numTypes);
|
TypeInfo *tinfo, int numTypes);
|
||||||
extern void dumpAggs(FILE *fout, AggInfo *agginfo, int numAggregates,
|
extern void dumpAggs(FILE *fout, AggInfo *agginfo, int numAggregates,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user