]> granicus.if.org Git - postgresql/commitdiff
Error position support for defaults and check constraints
authorPeter Eisentraut <peter_e@gmx.net>
Wed, 22 Aug 2018 06:42:49 +0000 (08:42 +0200)
committerPeter Eisentraut <peter_e@gmx.net>
Thu, 30 Aug 2018 06:20:23 +0000 (08:20 +0200)
Add support for error position reporting for the expressions contained
in defaults and check constraint definitions.  This currently works only
for CREATE TABLE, not ALTER TABLE, because the latter is not set up to
pass around the original query string.

Reviewed-by: Fabien COELHO <coelho@cri.ensmp.fr>
src/backend/catalog/heap.c
src/backend/commands/tablecmds.c
src/include/catalog/heap.h
src/test/regress/output/constraints.source

index ac5a677c5f76c9e362696909de11f3b29f448164..910d3db063fd2444d7c7465ea4392214c09626ec 100644 (file)
@@ -2460,7 +2460,8 @@ AddRelationNewConstraints(Relation rel,
                                                  List *newConstraints,
                                                  bool allow_merge,
                                                  bool is_local,
-                                                 bool is_internal)
+                                                 bool is_internal,
+                                                 const char *queryString)
 {
        List       *cookedConstraints = NIL;
        TupleDesc       tupleDesc;
@@ -2489,6 +2490,7 @@ AddRelationNewConstraints(Relation rel,
         * rangetable entry.  We need a ParseState for transformExpr.
         */
        pstate = make_parsestate(NULL);
+       pstate->p_sourcetext = queryString;
        rte = addRangeTableEntryForRelation(pstate,
                                                                                rel,
                                                                                NULL,
index 2a12d64aeb7782ea667759d4418b6acdd4170dbc..552ad8c5929c7cc232de6c74f87cd9f41c8e85cd 100644 (file)
@@ -985,7 +985,7 @@ DefineRelation(CreateStmt *stmt, char relkind, Oid ownerId,
         */
        if (rawDefaults || stmt->constraints)
                AddRelationNewConstraints(rel, rawDefaults, stmt->constraints,
-                                                                 true, true, false);
+                                                                 true, true, false, queryString);
 
        ObjectAddressSet(address, RelationRelationId, relationId);
 
@@ -5587,7 +5587,7 @@ ATExecAddColumn(List **wqueue, AlteredTableInfo *tab, Relation rel,
                 * _list_ of defaults, but we just do one.
                 */
                AddRelationNewConstraints(rel, list_make1(rawEnt), NIL,
-                                                                 false, true, false);
+                                                                 false, true, false, NULL);
 
                /* Make the additional catalog changes visible */
                CommandCounterIncrement();
@@ -6178,7 +6178,7 @@ ATExecColumnDefault(Relation rel, const char *colName,
                 * _list_ of defaults, but we just do one.
                 */
                AddRelationNewConstraints(rel, list_make1(rawEnt), NIL,
-                                                                 false, true, false);
+                                                                 false, true, false, NULL);
        }
 
        ObjectAddressSubSet(address, RelationRelationId,
@@ -7215,7 +7215,8 @@ ATAddCheckConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
                                                                                list_make1(copyObject(constr)),
                                                                                recursing | is_readd,   /* allow_merge */
                                                                                !recursing, /* is_local */
-                                                                               is_readd);      /* is_internal */
+                                                                               is_readd,       /* is_internal */
+                                                                               NULL);          /* queryString not available here */
 
        /* we don't expect more than one constraint here */
        Assert(list_length(newcons) <= 1);
index c5e40ff017ddc2bce1cbc76f9973d207fc09b42b..b3e8fdd9c604cece887c10a4545cc6ca9ae61043 100644 (file)
@@ -102,7 +102,8 @@ extern List *AddRelationNewConstraints(Relation rel,
                                                  List *newConstraints,
                                                  bool allow_merge,
                                                  bool is_local,
-                                                 bool is_internal);
+                                                 bool is_internal,
+                                                 const char *queryString);
 
 extern void RelationClearMissing(Relation rel);
 extern void SetAttrMissing(Oid relid, char *attname, char *value);
index a6a1df18e7396c1777eb1740977bb7a35afe742e..e8389064b0a8eed9bc67b3ac96f217abfebd864d 100644 (file)
@@ -228,6 +228,8 @@ CREATE TABLE SYS_COL_CHECK_TBL (city text, state text, is_capital bool,
                   altitude int,
                                  CHECK (NOT (is_capital AND ctid::text = 'sys_col_check_tbl')));
 ERROR:  system column "ctid" reference in check constraint is invalid
+LINE 3:       CHECK (NOT (is_capital AND ctid::text = 'sys_col_check...
+                                         ^
 --
 -- Check inheritance of defaults and constraints
 --