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)
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