diff options
| author | Peter Eisentraut <peter_e@gmx.net> | 2010-01-28 23:21:13 +0000 |
|---|---|---|
| committer | Peter Eisentraut <peter_e@gmx.net> | 2010-01-28 23:21:13 +0000 |
| commit | e7b3349a8ad7afaad565c573fbd65fb46af6abbe (patch) | |
| tree | f1140afea215e53e2f4430adbb0c666ffdec4752 /src/bin/pg_dump | |
| parent | 1f98cccb941823d241120ca86df264d7ebbcaec5 (diff) | |
| download | postgresql-e7b3349a8ad7afaad565c573fbd65fb46af6abbe.tar.gz | |
Type table feature
This adds the CREATE TABLE name OF type command, per SQL standard.
Diffstat (limited to 'src/bin/pg_dump')
| -rw-r--r-- | src/bin/pg_dump/pg_dump.c | 105 | ||||
| -rw-r--r-- | src/bin/pg_dump/pg_dump.h | 3 |
2 files changed, 86 insertions, 22 deletions
diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index b0764279e8..ae04b6f287 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -12,7 +12,7 @@ * by PostgreSQL * * IDENTIFICATION - * $PostgreSQL: pgsql/src/bin/pg_dump/pg_dump.c,v 1.568 2010/01/22 16:40:19 rhaas Exp $ + * $PostgreSQL: pgsql/src/bin/pg_dump/pg_dump.c,v 1.569 2010/01/28 23:21:12 petere Exp $ * *------------------------------------------------------------------------- */ @@ -3441,6 +3441,7 @@ getTables(int *numTables) int i_reltablespace; int i_reloptions; int i_toastreloptions; + int i_reloftype; /* Make sure we are in proper schema */ selectSourceSchema("pg_catalog"); @@ -3465,7 +3466,7 @@ getTables(int *numTables) * we cannot correctly identify inherited columns, owned sequences, etc. */ - if (g_fout->remoteVersion >= 80400) + if (g_fout->remoteVersion >= 80500) { /* * Left join to pick up dependency info linking sequences to their @@ -3478,6 +3479,40 @@ getTables(int *numTables) "c.relchecks, c.relhastriggers, " "c.relhasindex, c.relhasrules, c.relhasoids, " "c.relfrozenxid, " + "CASE WHEN c.reloftype <> 0 THEN c.reloftype::pg_catalog.regtype ELSE NULL END AS reloftype, " + "d.refobjid AS owning_tab, " + "d.refobjsubid AS owning_col, " + "(SELECT spcname FROM pg_tablespace t WHERE t.oid = c.reltablespace) AS reltablespace, " + "array_to_string(c.reloptions, ', ') AS reloptions, " + "array_to_string(array(SELECT 'toast.' || x FROM unnest(tc.reloptions) x), ', ') AS toast_reloptions " + "FROM pg_class c " + "LEFT JOIN pg_depend d ON " + "(c.relkind = '%c' AND " + "d.classid = c.tableoid AND d.objid = c.oid AND " + "d.objsubid = 0 AND " + "d.refclassid = c.tableoid AND d.deptype = 'a') " + "LEFT JOIN pg_class tc ON (c.reltoastrelid = tc.oid) " + "WHERE c.relkind in ('%c', '%c', '%c', '%c') " + "ORDER BY c.oid", + username_subquery, + RELKIND_SEQUENCE, + RELKIND_RELATION, RELKIND_SEQUENCE, + RELKIND_VIEW, RELKIND_COMPOSITE_TYPE); + } + else if (g_fout->remoteVersion >= 80400) + { + /* + * Left join to pick up dependency info linking sequences to their + * owning column, if any (note this dependency is AUTO as of 8.2) + */ + appendPQExpBuffer(query, + "SELECT c.tableoid, c.oid, c.relname, " + "c.relacl, c.relkind, c.relnamespace, " + "(%s c.relowner) AS rolname, " + "c.relchecks, c.relhastriggers, " + "c.relhasindex, c.relhasrules, c.relhasoids, " + "c.relfrozenxid, " + "NULL AS reloftype, " "d.refobjid AS owning_tab, " "d.refobjsubid AS owning_col, " "(SELECT spcname FROM pg_tablespace t WHERE t.oid = c.reltablespace) AS reltablespace, " @@ -3510,6 +3545,7 @@ getTables(int *numTables) "relchecks, (reltriggers <> 0) AS relhastriggers, " "relhasindex, relhasrules, relhasoids, " "relfrozenxid, " + "NULL AS reloftype, " "d.refobjid AS owning_tab, " "d.refobjsubid AS owning_col, " "(SELECT spcname FROM pg_tablespace t WHERE t.oid = c.reltablespace) AS reltablespace, " @@ -3541,6 +3577,7 @@ getTables(int *numTables) "relchecks, (reltriggers <> 0) AS relhastriggers, " "relhasindex, relhasrules, relhasoids, " "0 AS relfrozenxid, " + "NULL AS reloftype, " "d.refobjid AS owning_tab, " "d.refobjsubid AS owning_col, " "(SELECT spcname FROM pg_tablespace t WHERE t.oid = c.reltablespace) AS reltablespace, " @@ -3572,6 +3609,7 @@ getTables(int *numTables) "relchecks, (reltriggers <> 0) AS relhastriggers, " "relhasindex, relhasrules, relhasoids, " "0 AS relfrozenxid, " + "NULL AS reloftype, " "d.refobjid AS owning_tab, " "d.refobjsubid AS owning_col, " "NULL AS reltablespace, " @@ -3599,6 +3637,7 @@ getTables(int *numTables) "relchecks, (reltriggers <> 0) AS relhastriggers, " "relhasindex, relhasrules, relhasoids, " "0 AS relfrozenxid, " + "NULL AS reloftype, " "NULL::oid AS owning_tab, " "NULL::int4 AS owning_col, " "NULL AS reltablespace, " @@ -3621,6 +3660,7 @@ getTables(int *numTables) "relhasindex, relhasrules, " "'t'::bool AS relhasoids, " "0 AS relfrozenxid, " + "NULL AS reloftype, " "NULL::oid AS owning_tab, " "NULL::int4 AS owning_col, " "NULL AS reltablespace, " @@ -3653,6 +3693,7 @@ getTables(int *numTables) "relhasindex, relhasrules, " "'t'::bool AS relhasoids, " "0 as relfrozenxid, " + "NULL AS reloftype, " "NULL::oid AS owning_tab, " "NULL::int4 AS owning_col, " "NULL AS reltablespace, " @@ -3702,6 +3743,7 @@ getTables(int *numTables) i_reltablespace = PQfnumber(res, "reltablespace"); i_reloptions = PQfnumber(res, "reloptions"); i_toastreloptions = PQfnumber(res, "toast_reloptions"); + i_reloftype = PQfnumber(res, "reloftype"); if (lockWaitTimeout && g_fout->remoteVersion >= 70300) { @@ -3735,6 +3777,10 @@ getTables(int *numTables) tblinfo[i].hastriggers = (strcmp(PQgetvalue(res, i, i_relhastriggers), "t") == 0); tblinfo[i].hasoids = (strcmp(PQgetvalue(res, i, i_relhasoids), "t") == 0); tblinfo[i].frozenxid = atooid(PQgetvalue(res, i, i_relfrozenxid)); + if (PQgetisnull(res, i, i_reloftype)) + tblinfo[i].reloftype = NULL; + else + tblinfo[i].reloftype = strdup(PQgetvalue(res, i, i_reloftype)); tblinfo[i].ncheck = atoi(PQgetvalue(res, i, i_relchecks)); if (PQgetisnull(res, i, i_owning_tab)) { @@ -10552,8 +10598,10 @@ dumpTableSchema(Archive *fout, TableInfo *tbinfo) if (binary_upgrade) binary_upgrade_set_relfilenodes(q, tbinfo->dobj.catId.oid, false); - appendPQExpBuffer(q, "CREATE TABLE %s (", + appendPQExpBuffer(q, "CREATE TABLE %s", fmtId(tbinfo->dobj.name)); + if (tbinfo->reloftype) + appendPQExpBuffer(q, " OF %s", tbinfo->reloftype); actual_atts = 0; for (j = 0; j < tbinfo->numatts; j++) { @@ -10564,8 +10612,28 @@ dumpTableSchema(Archive *fout, TableInfo *tbinfo) if ((!tbinfo->inhAttrs[j] && !tbinfo->attisdropped[j]) || binary_upgrade) { + /* + * Default value --- suppress if inherited (except in + * binary-upgrade case, where we're not doing normal + * inheritance) or if it's to be printed separately. + */ + bool has_default = (tbinfo->attrdefs[j] != NULL + && (!tbinfo->inhAttrDef[j] || binary_upgrade) + && !tbinfo->attrdefs[j]->separate); + /* + * Not Null constraint --- suppress if inherited, except + * in binary-upgrade case. + */ + bool has_notnull = (tbinfo->notnull[j] + && (!tbinfo->inhNotNull[j] || binary_upgrade)); + + if (tbinfo->reloftype && !has_default && !has_notnull) + continue; + /* Format properly if not first attr */ - if (actual_atts > 0) + if (actual_atts == 0) + appendPQExpBuffer(q, " ("); + else appendPQExpBuffer(q, ","); appendPQExpBuffer(q, "\n "); actual_atts++; @@ -10587,7 +10655,11 @@ dumpTableSchema(Archive *fout, TableInfo *tbinfo) } /* Attribute type */ - if (g_fout->remoteVersion >= 70100) + if (tbinfo->reloftype) + { + appendPQExpBuffer(q, "WITH OPTIONS"); + } + else if (g_fout->remoteVersion >= 70100) { appendPQExpBuffer(q, "%s", tbinfo->atttypnames[j]); @@ -10600,23 +10672,11 @@ dumpTableSchema(Archive *fout, TableInfo *tbinfo) tbinfo->atttypmod[j])); } - /* - * Default value --- suppress if inherited (except in - * binary-upgrade case, where we're not doing normal - * inheritance) or if it's to be printed separately. - */ - if (tbinfo->attrdefs[j] != NULL && - (!tbinfo->inhAttrDef[j] || binary_upgrade) && - !tbinfo->attrdefs[j]->separate) + if (has_default) appendPQExpBuffer(q, " DEFAULT %s", tbinfo->attrdefs[j]->adef_expr); - /* - * Not Null constraint --- suppress if inherited, except - * in binary-upgrade case. - */ - if (tbinfo->notnull[j] && - (!tbinfo->inhNotNull[j] || binary_upgrade)) + if (has_notnull) appendPQExpBuffer(q, " NOT NULL"); } } @@ -10631,7 +10691,9 @@ dumpTableSchema(Archive *fout, TableInfo *tbinfo) if (constr->separate || !constr->conislocal) continue; - if (actual_atts > 0) + if (actual_atts == 0) + appendPQExpBuffer(q, " (\n "); + else appendPQExpBuffer(q, ",\n "); appendPQExpBuffer(q, "CONSTRAINT %s ", @@ -10641,7 +10703,8 @@ dumpTableSchema(Archive *fout, TableInfo *tbinfo) actual_atts++; } - appendPQExpBuffer(q, "\n)"); + if (actual_atts) + appendPQExpBuffer(q, "\n)"); if (numParents > 0 && !binary_upgrade) { diff --git a/src/bin/pg_dump/pg_dump.h b/src/bin/pg_dump/pg_dump.h index 0537c43671..fa5972a55f 100644 --- a/src/bin/pg_dump/pg_dump.h +++ b/src/bin/pg_dump/pg_dump.h @@ -6,7 +6,7 @@ * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/bin/pg_dump/pg_dump.h,v 1.161 2010/01/22 16:40:19 rhaas Exp $ + * $PostgreSQL: pgsql/src/bin/pg_dump/pg_dump.h,v 1.162 2010/01/28 23:21:12 petere Exp $ * *------------------------------------------------------------------------- */ @@ -229,6 +229,7 @@ typedef struct _tableInfo bool hasoids; /* does it have OIDs? */ uint32 frozenxid; /* for restore frozen xid */ int ncheck; /* # of CHECK expressions */ + char *reloftype; /* underlying type for typed table */ /* these two are set only if table is a sequence owned by a column: */ Oid owning_tab; /* OID of table owning sequence */ int owning_col; /* attr # of column owning sequence */ |
