Module sql::plan [−][src]
Expand description
Modules
This module houses a pretty printer for HirRelationExpr
,
which is the SQL-specific relation expression (as opposed to expr::MirRelationExpr
).
See also expr::explain
.
This file houses a representation of a SQL plan that is parallel to that found in src/expr/relation/mod.rs, but represents an earlier phase of planning. It’s structurally very similar to that file, with some differences which are noted below. It gets turned into that representation via a call to decorrelate().
Lowering is the process of transforming a sql::expr::HirRelationExpr
into a expr::MirRelationExpr
.
Helper code used throughout the planner.
SQL Query
s are the declarative, computational part of SQL.
This module turns Query
s into HirRelationExpr
s - a more explicit, algebraic way of describing computation.
Functions named plan_* are typically responsible for handling a single node of the SQL ast. Eg plan_query
is responsible for handling sqlparser::ast::Query
.
plan_* functions which correspond to operations on relations typically return a HirRelationExpr
.
plan_* functions which correspond to operations on scalars typically return a HirScalarExpr
and a ScalarType
. (The latter is because it’s not always possible to infer from a HirScalarExpr
what the intended type is - notably in the case of decimals where the scale/precision are encoded only in the type).
Aggregates are particularly twisty.
In SQL, a GROUP BY turns any columns not in the group key into vectors of values. Then anywhere later in the scope, an aggregate function can be applied to that group. Inside the arguments of an aggregate function, other normal functions are applied element-wise over the vectors. Thus SELECT sum(foo.x + foo.y) FROM foo GROUP BY x
means adding the scalar x
to the vector y
and summing the results.
In HirRelationExpr
, aggregates can only be applied immediately at the time of grouping.
To deal with this, whenever we see a SQL GROUP BY we look ahead for aggregates and precompute them in the HirRelationExpr::Reduce
. When we reach the same aggregates during normal planning later on, we look them up in an ExprContext
to find the precomputed versions.
Handles SQL’s scoping rules.
Statement planning.
Transformations of SQL ASTs.
Transformations of SQL IR, before decorrelation.
Maintains a catalog of valid casts between repr::ScalarType
s, as well as
other cast-related functions.
Structs
Generated by ALTER ... IF EXISTS
if the named object did not exist.
An Explanation
facilitates pretty-printing of a HirRelationExpr
.
Feature flags for the HirRelationExpr::optimize_and_lower()
logic.
A vector of values to which parameter references should be bound.
Controls planning of a SQL query.
The state required when planning a Query
.
Immutable state that applies to the planning of an entire Statement
.
Describes the output of a SQL statement.
Enums
Just like MirRelationExpr, except where otherwise noted below.
Just like expr::MirScalarExpr, except where otherwise noted below.
Specifies when a Peek
should occur.
Instructions for executing a SQL query.
Specifies how long a query will live. This impacts whether the query is
allowed to reason about the time at which it is running, e.g., by calling
the now()
function.
Functions
Creates a description of the purified statement stmt
.