]> granicus.if.org Git - postgresql/commitdiff
Fix unvalidated check constraints on domains, too
authorAlvaro Herrera <alvherre@alvh.no-ip.org>
Fri, 25 Nov 2011 20:56:55 +0000 (17:56 -0300)
committerAlvaro Herrera <alvherre@alvh.no-ip.org>
Fri, 25 Nov 2011 21:19:18 +0000 (18:19 -0300)
Same bug as reported by Thom Brown for check constraints on tables: the
constraint must be dumped separately from the domain, otherwise it is
restored before the data and thus prevents potentially-violating data
from being loaded in the first place.

Per Dean Rasheed

src/bin/pg_dump/pg_dump.c

index 76ff4d17e2c34a18594a54109aee5f6756789616..e11ba4db749142b6964dbe928d2ca7e27582ed0d 100644 (file)
@@ -4867,16 +4867,27 @@ getDomainConstraints(TypeInfo *tyinfo)
 
        query = createPQExpBuffer();
 
-       if (g_fout->remoteVersion >= 70400)
+       if (g_fout->remoteVersion >= 90100)
+               appendPQExpBuffer(query, "SELECT tableoid, oid, conname, "
+                                                 "pg_catalog.pg_get_constraintdef(oid) AS consrc, "
+                                                 "convalidated "
+                                                 "FROM pg_catalog.pg_constraint "
+                                                 "WHERE contypid = '%u'::pg_catalog.oid "
+                                                 "ORDER BY conname",
+                                                 tyinfo->dobj.catId.oid);
+
+       else if (g_fout->remoteVersion >= 70400)
                appendPQExpBuffer(query, "SELECT tableoid, oid, conname, "
-                                                 "pg_catalog.pg_get_constraintdef(oid) AS consrc "
+                                                 "pg_catalog.pg_get_constraintdef(oid) AS consrc, "
+                                                 "true as convalidated "
                                                  "FROM pg_catalog.pg_constraint "
                                                  "WHERE contypid = '%u'::pg_catalog.oid "
                                                  "ORDER BY conname",
                                                  tyinfo->dobj.catId.oid);
        else
                appendPQExpBuffer(query, "SELECT tableoid, oid, conname, "
-                                                 "'CHECK (' || consrc || ')' AS consrc "
+                                                 "'CHECK (' || consrc || ')' AS consrc, "
+                                                 "true as convalidated "
                                                  "FROM pg_catalog.pg_constraint "
                                                  "WHERE contypid = '%u'::pg_catalog.oid "
                                                  "ORDER BY conname",
@@ -4899,6 +4910,8 @@ getDomainConstraints(TypeInfo *tyinfo)
 
        for (i = 0; i < ntups; i++)
        {
+               bool    validated = PQgetvalue(res, i, 4)[0] == 't';
+
                constrinfo[i].dobj.objType = DO_CONSTRAINT;
                constrinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
                constrinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
@@ -4914,14 +4927,18 @@ getDomainConstraints(TypeInfo *tyinfo)
                constrinfo[i].condeferrable = false;
                constrinfo[i].condeferred = false;
                constrinfo[i].conislocal = true;
-               constrinfo[i].separate = false;
+
+               constrinfo[i].separate = !validated;
 
                /*
                 * Make the domain depend on the constraint, ensuring it won't be
-                * output till any constraint dependencies are OK.
+                * output till any constraint dependencies are OK.  If the constraint
+                * has not been validated, it's going to be dumped after the domain
+                * anyway, so this doesn't matter.
                 */
-               addObjectDependency(&tyinfo->dobj,
-                                                       constrinfo[i].dobj.dumpId);
+               if (validated)
+                       addObjectDependency(&tyinfo->dobj,
+                                                               constrinfo[i].dobj.dumpId);
        }
 
        PQclear(res);