Skip to content

Commit 06a2bae

Browse files
committed
fix garbage paramsel (pathman core)
1 parent 625173b commit 06a2bae

File tree

1 file changed

+25
-11
lines changed

1 file changed

+25
-11
lines changed

src/pg_pathman.c

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ static void handle_binary_opexpr_param(const PartRelationInfo *prel, WrapperNode
8383
static WrapperNode *handle_opexpr(const OpExpr *expr, WalkerContext *context);
8484
static WrapperNode *handle_boolexpr(const BoolExpr *expr, WalkerContext *context);
8585
static WrapperNode *handle_arrexpr(const ScalarArrayOpExpr *expr, WalkerContext *context);
86+
static double estimate_paramsel_using_prel(const PartRelationInfo *prel, int strategy);
8687
static RestrictInfo *rebuild_restrictinfo(Node *clause, RestrictInfo *old_rinfo);
8788
static bool pull_var_param(const WalkerContext *ctx, const OpExpr *expr, Node **var_ptr, Node **param_ptr);
8889

@@ -1189,6 +1190,7 @@ handle_binary_opexpr(WalkerContext *context, WrapperNode *result,
11891190
uint32 idx = hash_to_part_index(DatumGetInt32(value),
11901191
PrelChildrenCount(prel));
11911192

1193+
result->paramsel = estimate_paramsel_using_prel(prel, strategy);
11921194
result->rangeset = list_make1_irange(make_irange(idx, idx, true));
11931195

11941196
return; /* exit on equal */
@@ -1203,6 +1205,7 @@ handle_binary_opexpr(WalkerContext *context, WrapperNode *result,
12031205
PrelChildrenCount(context->prel),
12041206
strategy,
12051207
result);
1208+
result->paramsel = estimate_paramsel_using_prel(prel, strategy);
12061209
return;
12071210
}
12081211

@@ -1237,19 +1240,25 @@ handle_binary_opexpr_param(const PartRelationInfo *prel,
12371240
strategy = get_op_opfamily_strategy(expr->opno, tce->btree_opf);
12381241

12391242
result->rangeset = list_make1_irange(make_irange(0, PrelLastChild(prel), true));
1243+
result->paramsel = estimate_paramsel_using_prel(prel, strategy);
1244+
}
12401245

1246+
/*
1247+
* Extracted common 'paramsel' estimator.
1248+
*/
1249+
static double
1250+
estimate_paramsel_using_prel(const PartRelationInfo *prel, int strategy)
1251+
{
1252+
/* If it's "=", divide by partitions number */
12411253
if (strategy == BTEqualStrategyNumber)
1242-
{
1243-
result->paramsel = 1.0 / (double) PrelChildrenCount(prel);
1244-
}
1254+
return 1.0 / (double) PrelChildrenCount(prel);
1255+
1256+
/* Default selectivity estimate for inequalities */
12451257
else if (prel->parttype == PT_RANGE && strategy > 0)
1246-
{
1247-
result->paramsel = DEFAULT_INEQ_SEL;
1248-
}
1249-
else
1250-
{
1251-
result->paramsel = 1.0;
1252-
}
1258+
return DEFAULT_INEQ_SEL;
1259+
1260+
/* Else there's not much to do */
1261+
else return 1.0;
12531262
}
12541263

12551264
/*
@@ -1324,6 +1333,7 @@ handle_const(const Const *c, WalkerContext *context)
13241333
{
13251334
const PartRelationInfo *prel = context->prel;
13261335
WrapperNode *result = (WrapperNode *) palloc(sizeof(WrapperNode));
1336+
int strategy = BTEqualStrategyNumber;
13271337

13281338
result->orig = (const Node *) c;
13291339

@@ -1348,6 +1358,8 @@ handle_const(const Const *c, WalkerContext *context)
13481358
Datum value = OidFunctionCall1(prel->hash_proc, c->constvalue);
13491359
uint32 idx = hash_to_part_index(DatumGetInt32(value),
13501360
PrelChildrenCount(prel));
1361+
1362+
result->paramsel = estimate_paramsel_using_prel(prel, strategy);
13511363
result->rangeset = list_make1_irange(make_irange(idx, idx, true));
13521364
}
13531365
break;
@@ -1362,8 +1374,10 @@ handle_const(const Const *c, WalkerContext *context)
13621374
&tce->cmp_proc_finfo,
13631375
PrelGetRangesArray(context->prel),
13641376
PrelChildrenCount(context->prel),
1365-
BTEqualStrategyNumber,
1377+
strategy,
13661378
result);
1379+
1380+
result->paramsel = estimate_paramsel_using_prel(prel, strategy);
13671381
}
13681382
break;
13691383

0 commit comments

Comments
 (0)