Thread
-
FOR PORTION OF gram.y target_location seems wrong
jian he <jian.universality@gmail.com> — 2026-04-24T01:10:47Z
Hi. | FOR PORTION OF ColId FROM a_expr TO a_expr { ForPortionOfClause *n = makeNode(ForPortionOfClause); n->range_name = $4; n->location = @4; n->target_start = $6; n->target_end = $8; n->target_location = @5; $$ = (Node *) n; } n->target_location = @5; Should be n->target_location = @6; It's not reachable because of queries like: UPDATE for_portion_of_test FOR PORTION OF valid_at FROM NULL TO NULL SET name = 'NULL to NULL'; won't reach ereport(ERROR, (errmsg("FOR PORTION OF target was null")), executor_errposition(estate, forPortionOf->targetLocation)); typedef struct ForPortionOfClause { NodeTag type; char *range_name; /* column name of the range/multirange */ ParseLoc location; /* token location, or -1 if unknown */ ParseLoc target_location; /* token location, or -1 if unknown */ Node *target; /* Expr from FOR PORTION OF col (...) syntax */ Node *target_start; /* Expr from FROM ... TO ... syntax */ Node *target_end; /* Expr from FROM ... TO ... syntax */ } ForPortionOfClause; Generally, we place ParseLoc at the end of the node, putting it elsewhere should be fine. But here, we have two comments, ``/* token location, or -1 if unknown */``. The "token" is ambiguous, perhaps it's worth the trouble to enhance it? -- jian https://www.enterprisedb.com/ -
Re: FOR PORTION OF gram.y target_location seems wrong
Peter Eisentraut <peter@eisentraut.org> — 2026-04-27T10:04:54Z
On 24.04.26 03:10, jian he wrote: > Hi. > > | FOR PORTION OF ColId FROM a_expr TO a_expr > { > ForPortionOfClause *n = makeNode(ForPortionOfClause); > n->range_name = $4; > n->location = @4; > n->target_start = $6; > n->target_end = $8; > n->target_location = @5; > $$ = (Node *) n; > } > > n->target_location = @5; > > Should be > > n->target_location = @6; I think the existing code is fine. The target consists of the start and the end value. If we pointed to @6 then one could be confused into thinking that only the start value is meant.