]> granicus.if.org Git - postgresql/commitdiff
Fix pg_get_constraintdef() to ensure CHECK constraints are always shown
authorTom Lane <tgl@sss.pgh.pa.us>
Sat, 4 Oct 2003 18:22:59 +0000 (18:22 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Sat, 4 Oct 2003 18:22:59 +0000 (18:22 +0000)
with required outer parentheses.  Breakage seems to be leftover from
domain-constraint patches.  This could be smarter about suppressing
extra parens, but at this stage of the release cycle I want certainty
not cuteness.

src/backend/utils/adt/ruleutils.c
src/backend/utils/cache/lsyscache.c
src/include/utils/lsyscache.h

index 0b13dcd03535a91580be9827df035d91e05b556e..d3269e11067b731397a4446a1cc45cf210e733da 100644 (file)
@@ -3,7 +3,7 @@
  *                             back to source text
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/utils/adt/ruleutils.c,v 1.156 2003/10/02 22:24:54 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/utils/adt/ruleutils.c,v 1.157 2003/10/04 18:22:59 tgl Exp $
  *
  *       This software is copyrighted by Jan Wieck - Hamburg.
  *
@@ -1048,23 +1048,11 @@ pg_get_constraintdef_worker(Oid constraintId, int prettyFlags)
                                Node       *expr;
                                List       *context;
 
-                               /* Start off the constraint definition */
-
-                               /*
-                                * The consrc for CHECK constraints always seems to be
-                                * bracketed, so we don't add extra brackets here.
-                                */
-                               appendStringInfo(&buf, "CHECK ");
-
-                               /* If we're pretty-printing we need to add brackets */
-                               if (prettyFlags != 0)
-                                       appendStringInfo(&buf, "(");
-
-                               /* Fetch constraint source */
+                               /* Fetch constraint expression in parsetree form */
                                val = heap_getattr(tup, Anum_pg_constraint_conbin,
                                                                   RelationGetDescr(conDesc), &isnull);
                                if (isnull)
-                                       elog(ERROR, "null consrc for constraint %u",
+                                       elog(ERROR, "null conbin for constraint %u",
                                                 constraintId);
 
                                conbin = DatumGetCString(DirectFunctionCall1(textout, val));
@@ -1078,29 +1066,32 @@ pg_get_constraintdef_worker(Oid constraintId, int prettyFlags)
                                if (expr && IsA(expr, List))
                                        expr = (Node *) make_ands_explicit((List *) expr);
 
+                               /* Set up deparsing context for Var nodes in constraint */
                                if (conForm->conrelid != InvalidOid)
-                                       /* It's a Relation */
+                               {
+                                       /* relation constraint */
                                        context = deparse_context_for(get_rel_name(conForm->conrelid),
                                                                                                  conForm->conrelid);
+                               }
                                else
-
-                                       /*
-                                        * Since VARNOs aren't allowed in domain constraints,
-                                        * relation context isn't required as anything other
-                                        * than a shell.
-                                        */
-                                       context = deparse_context_for(get_typname(conForm->contypid),
-                                                                                                 InvalidOid);
+                               {
+                                       /* domain constraint --- can't have Vars */
+                                       context = NIL;
+                               }
 
                                consrc = deparse_expression_pretty(expr, context, false, false,
                                                                                                   prettyFlags, 0);
 
-                               /* Append the constraint source */
-                               appendStringInfoString(&buf, consrc);
-
-                               /* If we're pretty-printing we need to add brackets */
-                               if (prettyFlags != 0)
-                                       appendStringInfo(&buf, ")");
+                               /*
+                                * Now emit the constraint definition.  There are cases where
+                                * the constraint expression will be fully parenthesized and
+                                * we don't need the outer parens ... but there are other
+                                * cases where we do need 'em.  Be conservative for now.
+                                *
+                                * Note that simply checking for leading '(' and trailing ')'
+                                * would NOT be good enough, consider "(x > 0) AND (y > 0)".
+                                */
+                               appendStringInfo(&buf, "CHECK (%s)", consrc);
 
                                break;
                        }
index 3864a2fa52b4f1bdc5bfeeff45cb02169bc9e746..992be3ca4e3b74a6583c91bf7dac1059d1d4970c 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/utils/cache/lsyscache.c,v 1.107 2003/08/17 19:58:06 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/utils/cache/lsyscache.c,v 1.108 2003/10/04 18:22:59 tgl Exp $
  *
  * NOTES
  *       Eventually, the index information should go through here, too.
@@ -1469,37 +1469,6 @@ get_typtype(Oid typid)
                return '\0';
 }
 
-/*
- * get_typname
- *             Returns the name of a given type.
- *
- * Returns a palloc'd copy of the string, or NULL if no such type.
- *
- * NOTE: since type name is not unique, be wary of code that uses this
- * for anything except preparing error messages.
- */
-char *
-get_typname(Oid typid)
-{
-       HeapTuple       tp;
-
-       tp = SearchSysCache(TYPEOID,
-                                               ObjectIdGetDatum(typid),
-                                               0, 0, 0);
-       if (HeapTupleIsValid(tp))
-       {
-               Form_pg_type typtup = (Form_pg_type) GETSTRUCT(tp);
-               char       *result;
-
-               result = pstrdup(NameStr(typtup->typname));
-               ReleaseSysCache(tp);
-               return result;
-       }
-       else
-               return NULL;
-}
-
-
 /*
  * get_typ_typrelid
  *
index 927190e35d9bc7c5f49ac931f864e881c09a4caf..d6aaf2c1c2513381298897c8a73e60a90e0d814f 100644 (file)
@@ -6,7 +6,7 @@
  * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: lsyscache.h,v 1.81 2003/08/17 19:58:06 tgl Exp $
+ * $Id: lsyscache.h,v 1.82 2003/10/04 18:22:59 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -83,7 +83,6 @@ extern char get_typtype(Oid typid);
 extern Oid     get_typ_typrelid(Oid typid);
 extern Oid     get_element_type(Oid typid);
 extern Oid     get_array_type(Oid typid);
-extern char *get_typname(Oid relid);
 extern void getTypeInputInfo(Oid type, Oid *typInput, Oid *typElem);
 extern void getTypeOutputInfo(Oid type, Oid *typOutput, Oid *typElem,
                                  bool *typIsVarlena);