From 4362502bb5975a7895abd3e3bd3d643962c83214 Mon Sep 17 00:00:00 2001 From: Nils Dijk Date: Thu, 21 Jan 2021 13:52:21 +0100 Subject: [PATCH] generic way of matching fields for Var/Const --- .../distributed/planner/path_based_planner.c | 2 +- .../distributed/planner/pattern_match.h | 38 ++++++++++++------- 2 files changed, 25 insertions(+), 15 deletions(-) diff --git a/src/backend/distributed/planner/path_based_planner.c b/src/backend/distributed/planner/path_based_planner.c index 3c47f79bf..53fd581b2 100644 --- a/src/backend/distributed/planner/path_based_planner.c +++ b/src/backend/distributed/planner/path_based_planner.c @@ -791,7 +791,7 @@ GeoOverlapJoin(PlannerInfo *root, Path *originalPath) MatchVar(NoCapture), MatchConst( &match.stdwithinDistanceConst, - MatchConstType(FLOAT8OID))))), + MatchConstFields(consttype == FLOAT8OID))))), /* match inner path in join */ SkipReadThrough( NoCapture, diff --git a/src/include/distributed/planner/pattern_match.h b/src/include/distributed/planner/pattern_match.h index 23f234ab4..d5e5439a8 100644 --- a/src/include/distributed/planner/pattern_match.h +++ b/src/include/distributed/planner/pattern_match.h @@ -14,8 +14,8 @@ #define CONCATENATE1(arg1, arg2) CONCATENATE2(arg1, arg2) #define CONCATENATE2(arg1, arg2) arg1##arg2 -#define FOR_EACH_0(what, index) (void); -#define FOR_EACH_1(what, index, x) what((index), x); +#define FOR_EACH_0(what, index, x) ; +#define FOR_EACH_1(what, index, x) what((index), x); FOR_EACH_0(what, index+1, __VA_ARGS__); #define FOR_EACH_2(what, index, x, ...) what((index), x); FOR_EACH_1(what, index+1, __VA_ARGS__); #define FOR_EACH_3(what, index, x, ...) what((index), x); FOR_EACH_2(what, index+1, __VA_ARGS__); #define FOR_EACH_4(what, index, x, ...) what((index), x); FOR_EACH_3(what, index+1, __VA_ARGS__); @@ -71,7 +71,6 @@ \ { \ bool skipped = true; \ - int skipCount = 0; \ while (skipped) { \ switch(pathToMatch->type) \ { \ @@ -87,12 +86,7 @@ break; \ } \ } \ - if (skipped) \ - { \ - skipCount++; \ - } \ } \ - ereport(DEBUG1, (errmsg("skipped %d read through nodes", skipCount))); \ } \ \ matcher; \ @@ -102,7 +96,6 @@ #define MatchJoin(capture, joinType, conditionMatcher, innerMatcher, outerMatcher) \ { \ - ereport(DEBUG1, (errmsg("initiate join matcher"))); \ { \ bool m = false; \ switch (pathToMatch->type) \ @@ -196,11 +189,9 @@ do \ MakeStack(Path, pathToMatch, path); \ InitializeCapture; \ \ - ereport(DEBUG1, (errmsg("initiate matcher DSL"))); \ matcher; \ \ VerifyStack(pathToMatch); \ - ereport(DEBUG1, (errmsg("pattern matched"))); \ matched = true; \ break; \ } \ @@ -310,6 +301,19 @@ if (matched) } +#define MatchVarValuesInternal(index, check) \ +{ \ + if (!(castNode(Var, clause)->check)) \ + { \ + MatchFailed; \ + } \ +} + + +#define MatchVarFields(...) \ + FOR_EACH(MatchVarValuesInternal, __VA_ARGS__); + + #define MatchVar(capture, ...) \ { \ if (!IsA(clause, Var)) \ @@ -321,13 +325,19 @@ if (matched) } -#define MatchConstType(constType) \ -if (!(castNode(Const, clause)->consttype == constType)) \ +#define MatchConstValuesInternal(index, check) \ { \ - MatchFailed; \ + if (!(castNode(Const, clause)->check)) \ + { \ + MatchFailed; \ + } \ } +#define MatchConstFields(...) \ + FOR_EACH(MatchConstValuesInternal, __VA_ARGS__); + + #define MatchConst(capture, ...) \ { \ if (!IsA(clause, Const)) \