mirror of
https://github.com/postgres/postgres.git
synced 2025-06-30 21:42:05 +03:00
Improve error cursor positions for problems with partition bounds.
We failed to pass down the query string to check_new_partition_bound, so that its attempts to provide error cursor positions were for naught; one must have the query string to get parser_errposition to do anything. Adjust its API to require a ParseState to be passed down. Also, improve the logic inside check_new_partition_bound so that the cursor points at the partition bound for the specific column causing the issue, when one can be identified. That part is also for naught if we can't determine the query position of the column with the problem. Improve transformPartitionBoundValue so that it makes sure that const-simplified partition expressions will be properly labeled with positions. In passing, skip calling evaluate_expr if the value is already a Const, which is surely the most common case. Alexandra Wang, Ashwin Agrawal, Amit Langote; reviewed by Ashutosh Bapat Discussion: https://postgr.es/m/CACiyaSopZoqssfMzgHk6fAkp01cL6vnqBdmTw2C5_KJaFR_aMg@mail.gmail.com Discussion: https://postgr.es/m/CAJV4CdrZ5mKuaEsRSbLf2URQ3h6iMtKD=hik8MaF5WwdmC9uZw@mail.gmail.com
This commit is contained in:
@ -543,7 +543,8 @@ static void ComputePartitionAttrs(ParseState *pstate, Relation rel, List *partPa
|
||||
static void CreateInheritance(Relation child_rel, Relation parent_rel);
|
||||
static void RemoveInheritance(Relation child_rel, Relation parent_rel);
|
||||
static ObjectAddress ATExecAttachPartition(List **wqueue, Relation rel,
|
||||
PartitionCmd *cmd);
|
||||
PartitionCmd *cmd,
|
||||
AlterTableUtilityContext *context);
|
||||
static void AttachPartitionEnsureIndexes(Relation rel, Relation attachrel);
|
||||
static void QueuePartitionConstraintValidation(List **wqueue, Relation scanrel,
|
||||
List *partConstraint,
|
||||
@ -1007,7 +1008,7 @@ DefineRelation(CreateStmt *stmt, char relkind, Oid ownerId,
|
||||
* Check first that the new partition's bound is valid and does not
|
||||
* overlap with any of existing partitions of the parent.
|
||||
*/
|
||||
check_new_partition_bound(relname, parent, bound);
|
||||
check_new_partition_bound(relname, parent, bound, pstate);
|
||||
|
||||
/*
|
||||
* If the default partition exists, its partition constraints will
|
||||
@ -4718,7 +4719,8 @@ ATExecCmd(List **wqueue, AlteredTableInfo *tab, Relation rel,
|
||||
cur_pass, context);
|
||||
Assert(cmd != NULL);
|
||||
if (rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
|
||||
ATExecAttachPartition(wqueue, rel, (PartitionCmd *) cmd->def);
|
||||
ATExecAttachPartition(wqueue, rel, (PartitionCmd *) cmd->def,
|
||||
context);
|
||||
else
|
||||
ATExecAttachPartitionIdx(wqueue, rel,
|
||||
((PartitionCmd *) cmd->def)->name);
|
||||
@ -16280,7 +16282,8 @@ QueuePartitionConstraintValidation(List **wqueue, Relation scanrel,
|
||||
* Return the address of the newly attached partition.
|
||||
*/
|
||||
static ObjectAddress
|
||||
ATExecAttachPartition(List **wqueue, Relation rel, PartitionCmd *cmd)
|
||||
ATExecAttachPartition(List **wqueue, Relation rel, PartitionCmd *cmd,
|
||||
AlterTableUtilityContext *context)
|
||||
{
|
||||
Relation attachrel,
|
||||
catalog;
|
||||
@ -16295,6 +16298,9 @@ ATExecAttachPartition(List **wqueue, Relation rel, PartitionCmd *cmd)
|
||||
const char *trigger_name;
|
||||
Oid defaultPartOid;
|
||||
List *partBoundConstraint;
|
||||
ParseState *pstate = make_parsestate(NULL);
|
||||
|
||||
pstate->p_sourcetext = context->queryString;
|
||||
|
||||
/*
|
||||
* We must lock the default partition if one exists, because attaching a
|
||||
@ -16460,7 +16466,7 @@ ATExecAttachPartition(List **wqueue, Relation rel, PartitionCmd *cmd)
|
||||
* error.
|
||||
*/
|
||||
check_new_partition_bound(RelationGetRelationName(attachrel), rel,
|
||||
cmd->bound);
|
||||
cmd->bound, pstate);
|
||||
|
||||
/* OK to create inheritance. Rest of the checks performed there */
|
||||
CreateInheritance(attachrel, rel);
|
||||
|
Reference in New Issue
Block a user