Skip to content

Commit c063da1

Browse files
committed
Add parse location fields to NullTest and BooleanTest structs.
We did not need a location tag on NullTest or BooleanTest before, because no error messages referred directly to their locations. That's planned to change though, so add these fields in a separate housekeeping commit. Catversion bump because stored rules may change.
1 parent 6a75562 commit c063da1

File tree

14 files changed

+44
-5
lines changed

14 files changed

+44
-5
lines changed

src/backend/nodes/copyfuncs.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1693,6 +1693,7 @@ _copyNullTest(const NullTest *from)
16931693
COPY_NODE_FIELD(arg);
16941694
COPY_SCALAR_FIELD(nulltesttype);
16951695
COPY_SCALAR_FIELD(argisrow);
1696+
COPY_LOCATION_FIELD(location);
16961697

16971698
return newnode;
16981699
}
@@ -1707,6 +1708,7 @@ _copyBooleanTest(const BooleanTest *from)
17071708

17081709
COPY_NODE_FIELD(arg);
17091710
COPY_SCALAR_FIELD(booltesttype);
1711+
COPY_LOCATION_FIELD(location);
17101712

17111713
return newnode;
17121714
}

src/backend/nodes/equalfuncs.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -622,6 +622,7 @@ _equalNullTest(const NullTest *a, const NullTest *b)
622622
COMPARE_NODE_FIELD(arg);
623623
COMPARE_SCALAR_FIELD(nulltesttype);
624624
COMPARE_SCALAR_FIELD(argisrow);
625+
COMPARE_LOCATION_FIELD(location);
625626

626627
return true;
627628
}
@@ -631,6 +632,7 @@ _equalBooleanTest(const BooleanTest *a, const BooleanTest *b)
631632
{
632633
COMPARE_NODE_FIELD(arg);
633634
COMPARE_SCALAR_FIELD(booltesttype);
635+
COMPARE_LOCATION_FIELD(location);
634636

635637
return true;
636638
}

src/backend/nodes/nodeFuncs.c

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1346,12 +1346,22 @@ exprLocation(const Node *expr)
13461346
}
13471347
break;
13481348
case T_NullTest:
1349-
/* just use argument's location */
1350-
loc = exprLocation((Node *) ((const NullTest *) expr)->arg);
1349+
{
1350+
const NullTest *nexpr = (const NullTest *) expr;
1351+
1352+
/* Much as above */
1353+
loc = leftmostLoc(nexpr->location,
1354+
exprLocation((Node *) nexpr->arg));
1355+
}
13511356
break;
13521357
case T_BooleanTest:
1353-
/* just use argument's location */
1354-
loc = exprLocation((Node *) ((const BooleanTest *) expr)->arg);
1358+
{
1359+
const BooleanTest *bexpr = (const BooleanTest *) expr;
1360+
1361+
/* Much as above */
1362+
loc = leftmostLoc(bexpr->location,
1363+
exprLocation((Node *) bexpr->arg));
1364+
}
13551365
break;
13561366
case T_CoerceToDomain:
13571367
{

src/backend/nodes/outfuncs.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1370,6 +1370,7 @@ _outNullTest(StringInfo str, const NullTest *node)
13701370
WRITE_NODE_FIELD(arg);
13711371
WRITE_ENUM_FIELD(nulltesttype, NullTestType);
13721372
WRITE_BOOL_FIELD(argisrow);
1373+
WRITE_LOCATION_FIELD(location);
13731374
}
13741375

13751376
static void
@@ -1379,6 +1380,7 @@ _outBooleanTest(StringInfo str, const BooleanTest *node)
13791380

13801381
WRITE_NODE_FIELD(arg);
13811382
WRITE_ENUM_FIELD(booltesttype, BoolTestType);
1383+
WRITE_LOCATION_FIELD(location);
13821384
}
13831385

13841386
static void

src/backend/nodes/readfuncs.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1044,6 +1044,7 @@ _readNullTest(void)
10441044
READ_NODE_FIELD(arg);
10451045
READ_ENUM_FIELD(nulltesttype, NullTestType);
10461046
READ_BOOL_FIELD(argisrow);
1047+
READ_LOCATION_FIELD(location);
10471048

10481049
READ_DONE();
10491050
}
@@ -1058,6 +1059,7 @@ _readBooleanTest(void)
10581059

10591060
READ_NODE_FIELD(arg);
10601061
READ_ENUM_FIELD(booltesttype, BoolTestType);
1062+
READ_LOCATION_FIELD(location);
10611063

10621064
READ_DONE();
10631065
}

src/backend/optimizer/plan/planagg.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -449,6 +449,7 @@ build_minmax_path(PlannerInfo *root, MinMaxAggInfo *mminfo,
449449
ntest->arg = copyObject(mminfo->target);
450450
/* we checked it wasn't a rowtype in find_minmax_aggs_walker */
451451
ntest->argisrow = false;
452+
ntest->location = -1;
452453

453454
/* User might have had that in WHERE already */
454455
if (!list_member((List *) parse->jointree->quals, ntest))

src/backend/optimizer/prep/prepqual.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,7 @@ negate_clause(Node *node)
212212
newexpr->nulltesttype = (expr->nulltesttype == IS_NULL ?
213213
IS_NOT_NULL : IS_NULL);
214214
newexpr->argisrow = expr->argisrow;
215+
newexpr->location = expr->location;
215216
return (Node *) newexpr;
216217
}
217218
}
@@ -247,6 +248,7 @@ negate_clause(Node *node)
247248
(int) expr->booltesttype);
248249
break;
249250
}
251+
newexpr->location = expr->location;
250252
return (Node *) newexpr;
251253
}
252254
break;

src/backend/optimizer/util/clauses.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3305,6 +3305,7 @@ eval_const_expressions_mutator(Node *node,
33053305
newntest->arg = (Expr *) relem;
33063306
newntest->nulltesttype = ntest->nulltesttype;
33073307
newntest->argisrow = type_is_rowtype(exprType(relem));
3308+
newntest->location = ntest->location;
33083309
newargs = lappend(newargs, newntest);
33093310
}
33103311
/* If all the inputs were constants, result is TRUE */
@@ -3343,6 +3344,7 @@ eval_const_expressions_mutator(Node *node,
33433344
newntest->arg = (Expr *) arg;
33443345
newntest->nulltesttype = ntest->nulltesttype;
33453346
newntest->argisrow = ntest->argisrow;
3347+
newntest->location = ntest->location;
33463348
return (Node *) newntest;
33473349
}
33483350
case T_BooleanTest:
@@ -3395,6 +3397,7 @@ eval_const_expressions_mutator(Node *node,
33953397
newbtest = makeNode(BooleanTest);
33963398
newbtest->arg = (Expr *) arg;
33973399
newbtest->booltesttype = btest->booltesttype;
3400+
newbtest->location = btest->location;
33983401
return (Node *) newbtest;
33993402
}
34003403
case T_PlaceHolderVar:

src/backend/optimizer/util/plancat.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -720,6 +720,7 @@ get_relation_constraints(PlannerInfo *root,
720720
0);
721721
ntest->nulltesttype = IS_NOT_NULL;
722722
ntest->argisrow = type_is_rowtype(att->atttypid);
723+
ntest->location = -1;
723724
result = lappend(result, ntest);
724725
}
725726
}

src/backend/parser/gram.y

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11299,27 +11299,31 @@ a_expr: c_expr { $$ = $1; }
1129911299
NullTest *n = makeNode(NullTest);
1130011300
n->arg = (Expr *) $1;
1130111301
n->nulltesttype = IS_NULL;
11302+
n->location = @2;
1130211303
$$ = (Node *)n;
1130311304
}
1130411305
| a_expr ISNULL
1130511306
{
1130611307
NullTest *n = makeNode(NullTest);
1130711308
n->arg = (Expr *) $1;
1130811309
n->nulltesttype = IS_NULL;
11310+
n->location = @2;
1130911311
$$ = (Node *)n;
1131011312
}
1131111313
| a_expr IS NOT NULL_P %prec IS
1131211314
{
1131311315
NullTest *n = makeNode(NullTest);
1131411316
n->arg = (Expr *) $1;
1131511317
n->nulltesttype = IS_NOT_NULL;
11318+
n->location = @2;
1131611319
$$ = (Node *)n;
1131711320
}
1131811321
| a_expr NOTNULL
1131911322
{
1132011323
NullTest *n = makeNode(NullTest);
1132111324
n->arg = (Expr *) $1;
1132211325
n->nulltesttype = IS_NOT_NULL;
11326+
n->location = @2;
1132311327
$$ = (Node *)n;
1132411328
}
1132511329
| row OVERLAPS row
@@ -11343,41 +11347,47 @@ a_expr: c_expr { $$ = $1; }
1134311347
BooleanTest *b = makeNode(BooleanTest);
1134411348
b->arg = (Expr *) $1;
1134511349
b->booltesttype = IS_TRUE;
11350+
b->location = @2;
1134611351
$$ = (Node *)b;
1134711352
}
1134811353
| a_expr IS NOT TRUE_P %prec IS
1134911354
{
1135011355
BooleanTest *b = makeNode(BooleanTest);
1135111356
b->arg = (Expr *) $1;
1135211357
b->booltesttype = IS_NOT_TRUE;
11358+
b->location = @2;
1135311359
$$ = (Node *)b;
1135411360
}
1135511361
| a_expr IS FALSE_P %prec IS
1135611362
{
1135711363
BooleanTest *b = makeNode(BooleanTest);
1135811364
b->arg = (Expr *) $1;
1135911365
b->booltesttype = IS_FALSE;
11366+
b->location = @2;
1136011367
$$ = (Node *)b;
1136111368
}
1136211369
| a_expr IS NOT FALSE_P %prec IS
1136311370
{
1136411371
BooleanTest *b = makeNode(BooleanTest);
1136511372
b->arg = (Expr *) $1;
1136611373
b->booltesttype = IS_NOT_FALSE;
11374+
b->location = @2;
1136711375
$$ = (Node *)b;
1136811376
}
1136911377
| a_expr IS UNKNOWN %prec IS
1137011378
{
1137111379
BooleanTest *b = makeNode(BooleanTest);
1137211380
b->arg = (Expr *) $1;
1137311381
b->booltesttype = IS_UNKNOWN;
11382+
b->location = @2;
1137411383
$$ = (Node *)b;
1137511384
}
1137611385
| a_expr IS NOT UNKNOWN %prec IS
1137711386
{
1137811387
BooleanTest *b = makeNode(BooleanTest);
1137911388
b->arg = (Expr *) $1;
1138011389
b->booltesttype = IS_NOT_UNKNOWN;
11390+
b->location = @2;
1138111391
$$ = (Node *)b;
1138211392
}
1138311393
| a_expr IS DISTINCT FROM a_expr %prec IS

src/backend/parser/parse_expr.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -789,6 +789,7 @@ transformAExprOp(ParseState *pstate, A_Expr *a)
789789
NullTest *n = makeNode(NullTest);
790790

791791
n->nulltesttype = IS_NULL;
792+
n->location = a->location;
792793

793794
if (exprIsNullConstant(lexpr))
794795
n->arg = (Expr *) rexpr;

src/backend/rewrite/rewriteManip.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1023,6 +1023,7 @@ AddInvertedQual(Query *parsetree, Node *qual)
10231023
invqual = makeNode(BooleanTest);
10241024
invqual->arg = (Expr *) qual;
10251025
invqual->booltesttype = IS_NOT_TRUE;
1026+
invqual->location = -1;
10261027

10271028
AddQual(parsetree, (Node *) invqual);
10281029
}

src/include/catalog/catversion.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,6 @@
5353
*/
5454

5555
/* yyyymmddN */
56-
#define CATALOG_VERSION_NO 201502191
56+
#define CATALOG_VERSION_NO 201502221
5757

5858
#endif

src/include/nodes/primnodes.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1050,6 +1050,7 @@ typedef struct NullTest
10501050
Expr *arg; /* input expression */
10511051
NullTestType nulltesttype; /* IS NULL, IS NOT NULL */
10521052
bool argisrow; /* T if input is of a composite type */
1053+
int location; /* token location, or -1 if unknown */
10531054
} NullTest;
10541055

10551056
/*
@@ -1071,6 +1072,7 @@ typedef struct BooleanTest
10711072
Expr xpr;
10721073
Expr *arg; /* input expression */
10731074
BoolTestType booltesttype; /* test type */
1075+
int location; /* token location, or -1 if unknown */
10741076
} BooleanTest;
10751077

10761078
/*

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy