mirror of
https://github.com/postgres/postgres.git
synced 2026-01-27 21:43:08 +03:00
This commit implements the automatic conversion of 'x IN (VALUES ...)' into ScalarArrayOpExpr. That simplifies the query tree, eliminating the appearance of an unnecessary join. Since VALUES describes a relational table, and the value of such a list is a table row, the optimizer will likely face an underestimation problem due to the inability to estimate cardinality through MCV statistics. The cardinality evaluation mechanism can work with the array inclusion check operation. If the array is small enough (< 100 elements), it will perform a statistical evaluation element by element. We perform the transformation in the convert_ANY_sublink_to_join() if VALUES RTE is proper and the transformation is convertible. The conversion is only possible for operations on scalar values, not rows. Also, we currently support the transformation only when it ends up with a constant array. Otherwise, the evaluation of non-hashed SAOP might be slower than the corresponding Hash Join with VALUES. Discussion: https://postgr.es/m/0184212d-1248-4f1f-a42d-f5cb1c1976d2%40tantorlabs.com Author: Alena Rybakina <a.rybakina@postgrespro.ru> Author: Andrei Lepikhov <lepihov@gmail.com> Reviewed-by: Ivan Kush <ivan.kush@tantorlabs.com> Reviewed-by: Alexander Korotkov <aekorotkov@gmail.com>
47 lines
1.8 KiB
C
47 lines
1.8 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* subselect.h
|
|
* Planning routines for subselects.
|
|
*
|
|
* Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
*
|
|
* src/include/optimizer/subselect.h
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
#ifndef SUBSELECT_H
|
|
#define SUBSELECT_H
|
|
|
|
#include "nodes/pathnodes.h"
|
|
#include "nodes/plannodes.h"
|
|
|
|
extern void SS_process_ctes(PlannerInfo *root);
|
|
extern ScalarArrayOpExpr *convert_VALUES_to_ANY(PlannerInfo *root,
|
|
Node *testexpr,
|
|
Query *values);
|
|
extern JoinExpr *convert_ANY_sublink_to_join(PlannerInfo *root,
|
|
SubLink *sublink,
|
|
Relids available_rels);
|
|
extern JoinExpr *convert_EXISTS_sublink_to_join(PlannerInfo *root,
|
|
SubLink *sublink,
|
|
bool under_not,
|
|
Relids available_rels);
|
|
extern Node *SS_replace_correlation_vars(PlannerInfo *root, Node *expr);
|
|
extern Node *SS_process_sublinks(PlannerInfo *root, Node *expr, bool isQual);
|
|
extern void SS_identify_outer_params(PlannerInfo *root);
|
|
extern void SS_charge_for_initplans(PlannerInfo *root, RelOptInfo *final_rel);
|
|
extern void SS_compute_initplan_cost(List *init_plans,
|
|
Cost *initplan_cost_p,
|
|
bool *unsafe_initplans_p);
|
|
extern void SS_attach_initplans(PlannerInfo *root, Plan *plan);
|
|
extern void SS_finalize_plan(PlannerInfo *root, Plan *plan);
|
|
extern Param *SS_make_initplan_output_param(PlannerInfo *root,
|
|
Oid resulttype, int32 resulttypmod,
|
|
Oid resultcollation);
|
|
extern void SS_make_initplan_from_plan(PlannerInfo *root,
|
|
PlannerInfo *subroot, Plan *plan,
|
|
Param *prm);
|
|
|
|
#endif /* SUBSELECT_H */
|