!1528 Fixes wrong planning for MOT queries
Merge pull request !1528 from Vinoth Veeraraghavan/master
This commit is contained in:
@ -1005,7 +1005,7 @@ static bool StorageEngineUsedWalker(Node* node, RTEDetectorContext* context)
|
|||||||
if (rte->rtekind == RTE_RELATION) {
|
if (rte->rtekind == RTE_RELATION) {
|
||||||
if (rte->relkind == RELKIND_FOREIGN_TABLE && isMOTFromTblOid(rte->relid)) {
|
if (rte->relkind == RELKIND_FOREIGN_TABLE && isMOTFromTblOid(rte->relid)) {
|
||||||
context->isMotTable = true;
|
context->isMotTable = true;
|
||||||
} else {
|
} else if (!is_sys_table(rte->relid)) {
|
||||||
context->isPageTable = true;
|
context->isPageTable = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1049,7 +1049,7 @@ void CheckTablesStorageEngine(Query* qry, StorageEngineType* type)
|
|||||||
if (rte->rtekind == RTE_RELATION) {
|
if (rte->rtekind == RTE_RELATION) {
|
||||||
if (rte->relkind == RELKIND_FOREIGN_TABLE && isMOTFromTblOid(rte->relid)) {
|
if (rte->relkind == RELKIND_FOREIGN_TABLE && isMOTFromTblOid(rte->relid)) {
|
||||||
context.isMotTable = true;
|
context.isMotTable = true;
|
||||||
} else {
|
} else if (!is_sys_table(rte->relid)) {
|
||||||
context.isPageTable = true;
|
context.isPageTable = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2204,6 +2204,41 @@ inline bool GetKeyOperation(OpExpr* op, KEY_OPER& oper)
|
|||||||
return (oper != KEY_OPER::READ_INVALID);
|
return (oper != KEY_OPER::READ_INVALID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool IsSameRelation(Expr* expr, uint32_t id)
|
||||||
|
{
|
||||||
|
switch (expr->type) {
|
||||||
|
case T_Param:
|
||||||
|
case T_Const: {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
case T_Var: {
|
||||||
|
return (((Var*)expr)->varno == id);
|
||||||
|
}
|
||||||
|
case T_OpExpr: {
|
||||||
|
OpExpr* op = (OpExpr*)expr;
|
||||||
|
bool l = IsSameRelation((Expr*)linitial(op->args), id);
|
||||||
|
bool r = IsSameRelation((Expr*)lsecond(op->args), id);
|
||||||
|
return (l || r);
|
||||||
|
}
|
||||||
|
case T_FuncExpr: {
|
||||||
|
FuncExpr* func = (FuncExpr*)expr;
|
||||||
|
|
||||||
|
if (func->funcformat == COERCE_IMPLICIT_CAST || func->funcformat == COERCE_EXPLICIT_CAST) {
|
||||||
|
return IsSameRelation((Expr*)linitial(func->args), id);
|
||||||
|
} else if (list_length(func->args) == 0) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case T_RelabelType: {
|
||||||
|
return IsSameRelation(((RelabelType*)expr)->arg, id);
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool IsMOTExpr(RelOptInfo* baserel, MOTFdwStateSt* state, MatchIndexArr* marr, Expr* expr, Expr** result, bool setLocal)
|
bool IsMOTExpr(RelOptInfo* baserel, MOTFdwStateSt* state, MatchIndexArr* marr, Expr* expr, Expr** result, bool setLocal)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
@ -2261,6 +2296,10 @@ bool IsMOTExpr(RelOptInfo* baserel, MOTFdwStateSt* state, MatchIndexArr* marr, E
|
|||||||
// we have to choose as Expr t2.a cause it will be replaced later with a Param type
|
// we have to choose as Expr t2.a cause it will be replaced later with a Param type
|
||||||
if (IsA(l, Var)) {
|
if (IsA(l, Var)) {
|
||||||
if (!IsA(r, Var)) {
|
if (!IsA(r, Var)) {
|
||||||
|
if (IsSameRelation(r, ((Var*)l)->varno)) {
|
||||||
|
isOperatorMOTReady = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
v = (Var*)l;
|
v = (Var*)l;
|
||||||
e = r;
|
e = r;
|
||||||
} else {
|
} else {
|
||||||
@ -2276,6 +2315,10 @@ bool IsMOTExpr(RelOptInfo* baserel, MOTFdwStateSt* state, MatchIndexArr* marr, E
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (IsA(r, Var)) {
|
} else if (IsA(r, Var)) {
|
||||||
|
if (IsSameRelation(l, ((Var*)r)->varno)) {
|
||||||
|
isOperatorMOTReady = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
v = (Var*)r;
|
v = (Var*)r;
|
||||||
e = l;
|
e = l;
|
||||||
RevertKeyOperation(oper);
|
RevertKeyOperation(oper);
|
||||||
|
Reference in New Issue
Block a user