@@ -83,6 +83,7 @@ static void handle_binary_opexpr_param(const PartRelationInfo *prel, WrapperNode
8383static WrapperNode * handle_opexpr (const OpExpr * expr ,WalkerContext * context );
8484static WrapperNode * handle_boolexpr (const BoolExpr * expr ,WalkerContext * context );
8585static WrapperNode * handle_arrexpr (const ScalarArrayOpExpr * expr ,WalkerContext * context );
86+ static double estimate_paramsel_using_prel (const PartRelationInfo * prel ,int strategy );
8687static RestrictInfo * rebuild_restrictinfo (Node * clause ,RestrictInfo * old_rinfo );
8788static 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,
11891190uint32 idx = hash_to_part_index (DatumGetInt32 (value ),
11901191PrelChildrenCount (prel ));
11911192
1193+ result -> paramsel = estimate_paramsel_using_prel (prel ,strategy );
11921194result -> rangeset = list_make1_irange (make_irange (idx ,idx , true));
11931195
11941196return ;/* exit on equal */
@@ -1203,6 +1205,7 @@ handle_binary_opexpr(WalkerContext *context, WrapperNode *result,
12031205PrelChildrenCount (context -> prel ),
12041206strategy ,
12051207result );
1208+ result -> paramsel = estimate_paramsel_using_prel (prel ,strategy );
12061209return ;
12071210}
12081211
@@ -1237,19 +1240,25 @@ handle_binary_opexpr_param(const PartRelationInfo *prel,
12371240strategy = get_op_opfamily_strategy (expr -> opno ,tce -> btree_opf );
12381241
12391242result -> 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 */
12411253if (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 */
12451257else 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{
13251334const PartRelationInfo * prel = context -> prel ;
13261335WrapperNode * result = (WrapperNode * )palloc (sizeof (WrapperNode ));
1336+ int strategy = BTEqualStrategyNumber ;
13271337
13281338result -> orig = (const Node * )c ;
13291339
@@ -1348,6 +1358,8 @@ handle_const(const Const *c, WalkerContext *context)
13481358Datum value = OidFunctionCall1 (prel -> hash_proc ,c -> constvalue );
13491359uint32 idx = hash_to_part_index (DatumGetInt32 (value ),
13501360PrelChildrenCount (prel ));
1361+
1362+ result -> paramsel = estimate_paramsel_using_prel (prel ,strategy );
13511363result -> rangeset = list_make1_irange (make_irange (idx ,idx , true));
13521364}
13531365break ;
@@ -1362,8 +1374,10 @@ handle_const(const Const *c, WalkerContext *context)
13621374& tce -> cmp_proc_finfo ,
13631375PrelGetRangesArray (context -> prel ),
13641376PrelChildrenCount (context -> prel ),
1365- BTEqualStrategyNumber ,
1377+ strategy ,
13661378result );
1379+
1380+ result -> paramsel = estimate_paramsel_using_prel (prel ,strategy );
13671381}
13681382break ;
13691383