From 1816353610c6af345f72f4753cdb629c5304123d Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Wed, 22 Aug 2018 08:42:49 +0200 Subject: [PATCH v2 1/3] Error position support for defaults and check constraints 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. --- src/backend/catalog/heap.c | 4 +++- src/backend/commands/tablecmds.c | 9 +++++---- src/include/catalog/heap.h | 3 ++- src/test/regress/output/constraints.source | 2 ++ 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c index ac5a677c5f..910d3db063 100644 --- a/src/backend/catalog/heap.c +++ b/src/backend/catalog/heap.c @@ -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, diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 2a12d64aeb..552ad8c592 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -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); diff --git a/src/include/catalog/heap.h b/src/include/catalog/heap.h index c5e40ff017..b3e8fdd9c6 100644 --- a/src/include/catalog/heap.h +++ b/src/include/catalog/heap.h @@ -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); diff --git a/src/test/regress/output/constraints.source b/src/test/regress/output/constraints.source index a6a1df18e7..e8389064b0 100644 --- a/src/test/regress/output/constraints.source +++ b/src/test/regress/output/constraints.source @@ -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 -- -- 2.18.0