Module sql::plan[][src]

Expand description

SQL planning.

SQL planning is the process of taking the abstract syntax tree of a Statement and turning it into a Plan that the dataflow layer can execute.

Statements must be purified before they can be planned. See the pure module for details.

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 Querys are the declarative, computational part of SQL. This module turns Querys into HirRelationExprs - 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::ScalarTypes, 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.

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.

Produces a Plan from the purified statement stmt.