Documentation
¶
Overview ¶
Package logical provides logical query plan representation and optimization.
Index ¶
- Constants
- Variables
- func ExpandStarProjections(n *Node)
- func HasHiddenProjection(projs []Projection) bool
- func HasRemainingSubqueries(n *Node) bool
- func HasStarProjection(n *Node) bool
- func IsHiddenSortColumn(name string) bool
- func NodeColumnRefs(n *Node) []string
- func SetSemiPushdownEnabled(on bool) bool
- func SubstitutePreComputedAggregates(root *Node, sigs []PreComputedAggregate) (map[string]bool, error)
- type AggExpr
- type ColumnPolicy
- type DecimalMeta
- type HistogramStats
- type MergeInfo
- type Node
- func BuildFromSelect(info *plansql.SelectInfo) (*Node, error)
- func BuildFromSelectWithCTEs(info *plansql.SelectInfo, ctes []plansql.CTEDef) (*Node, error)
- func InjectColumnPolicies(plan *Node, tableName string, policies []ColumnPolicy) *Node
- func InjectRowFilter(plan *Node, tableName, filterSQL string) *Node
- func NewAggregate(child *Node, groupBy []string, aggs []AggExpr) *Node
- func NewDistinct(child *Node) *Node
- func NewExcept(left, right *Node, all bool) *Node
- func NewFilter(child *Node, predicates []Predicate) *Node
- func NewIntersect(left, right *Node, all bool) *Node
- func NewJoin(left, right *Node, joinType, condition string) *Node
- func NewLimit(child *Node, limit, offset int) *Node
- func NewProject(child *Node, projections []Projection) *Node
- func NewScan(table, alias string) *Node
- func NewSort(child *Node, orderBy []OrderExpr) *Node
- func NewUnion(left, right *Node, all bool) *Node
- func NewWindow(child *Node, exprs []WindowExpr) *Node
- func Optimize(plan *Node, annotators ...func(*Node)) *Node
- func StripTopSortLimit(plan *Node) *Node
- type NodeType
- type OrderExpr
- type PreComputedAggregate
- type Predicate
- type Projection
- type RelStats
- type ScanColumnStats
- type WindowBound
- type WindowExpr
- type WindowFrameSpec
Constants ¶
const NoLimit = -1
NoLimit is the LimitVal of a Limit node that only skips rows: `OFFSET n` with no LIMIT, which is what a paginating client sends for the last page. Every row past the offset passes. Consumers must test `LimitVal != NoLimit` before using it as a row bound — never `LimitVal > 0`, which mistakes a real `LIMIT 0` for "unbounded" and was the root cause of #481 (`ORDER BY ... LIMIT 0` returning every row). An unbounded node has no bound to push down; a LimitVal of exactly 0 is a real, meaningful bound.
const RowCountOnlyColumn = "__rowcount_only__"
RowCountOnlyColumn is the sentinel required-column emitted for scans that only need a row count (bare COUNT(*) / literal-only projections). The physical scan drops it when any real column is required and otherwise projects the narrowest schema column instead of all columns. The "__" prefix keeps it flowing through sanitizeScanNeeds and makes the distributed worker's all-or-nothing projection guard fall back to full width (safe) if it ever reaches that path.
Variables ¶
var BushyJoinReorder atomic.Bool
BushyJoinReorder enables bushy subset-partition transitions in the DP join reorder (docs/design/bushy-join-cbo.md §3.2). Process-wide, set once at startup from --bushy-join-reorder / wadjet.Config; default off. Read at plan time, so tests may toggle it around a planning call.
var BushyJoinsPlanned atomic.Int64
BushyJoinsPlanned counts queries whose FINAL chosen join order contains at least one bushy join (a join of two composite intermediates). Mechanism marker for A/B runs: a nonzero count proves the enumeration actually changed a plan; dormancy tests assert it stays zero with the flag off.
var ScalarAggSemijoin atomic.Bool
ScalarAggSemijoin gates reduceDecorrelatedScalarAggs. Kill switch: WADJET_SCALAR_AGG_SEMIJOIN=0 (mirrors WADJET_SCALAR_DEFER / WADJET_EXCHANGE_ELIDE). Default on. Exported as an atomic (the BushyJoinReorder pattern) so tests that exercise the UNreduced decorrelated shape — aggregate-shuffle and dynamic-filter fixtures built on Q17/Q20 — can flip it with a defer-restore.
Functions ¶
func ExpandStarProjections ¶
func ExpandStarProjections(n *Node)
ExpandStarProjections rewrites every `*` / `alias.*` select item into one projection per column of the star's source, in schema order.
A star that shares its SELECT list with another item — `SELECT t.*, ctid` is how DataGrip opens a table — reaches the planner as a Projection carrying the literal expression "*" and no column reference at all. That is why it must be expanded HERE, before computeRequiredColumns: the pruner collects the columns each Project names, the star named none, so the scan below was narrowed to the SIBLING item's columns and every column the star contributed read back NULL. The single-process path returned those NULLs (#315); the distributed path only escaped because an unknown name trips the worker's all-or-nothing parquet projection guard, which falls back to full width.
A star's source columns come from the scan's catalog-annotated schema (ScanColumns, populated by physical.AnnotateScanColumns), so this resolves only when a single base-table scan sits below the projection — the shape clients send. A star over a join or a derived table is left alone: its column set is not knowable here, and guessing it would silently change which columns a query returns.
func HasHiddenProjection ¶
func HasHiddenProjection(projs []Projection) bool
HasHiddenProjection reports whether any of projs was materialized for a sort key rather than selected by the user.
func HasRemainingSubqueries ¶
HasRemainingSubqueries walks an optimized logical plan and returns true if any filter predicate still contains un-decorrelated subquery references (EXISTS, NOT EXISTS, IN (SELECT), scalar subqueries). After successful decorrelation these become semi/anti join nodes and the predicates are removed. If this returns false, the scan-node structure is deterministic and safe for distributed execution.
func HasStarProjection ¶
HasStarProjection reports whether node is a Project that still carries an unexpanded `*` or `alias.*` select item.
func IsHiddenSortColumn ¶
IsHiddenSortColumn reports whether name is a materialized ORDER BY term.
func NodeColumnRefs ¶
NodeColumnRefs returns the column names referenced by a node's own expressions (filter predicates, sort keys, projections, ...) — the same collection column pruning uses, exported for the physical planner's top-N late-materialization rewrite.
func SetSemiPushdownEnabled ¶
SetSemiPushdownEnabled toggles the rewrite (tests that pin plan shapes downstream of the legacy join order run with it off). Returns the previous value so callers can restore it.
func SubstitutePreComputedAggregates ¶
func SubstitutePreComputedAggregates(root *Node, sigs []PreComputedAggregate) (map[string]bool, error)
SubstitutePreComputedAggregates walks the plan tree and replaces each Aggregate node whose shape matches one of sigs with a synthetic Scan. Returns the set of substitutions actually performed (alias → signature), so the caller can verify every pre-computed input was consumed. A signature that never matched is logged by the caller; this pass does not error on unmatched signatures (the worker may have re-planned a shape that no longer contains the aggregate, in which case falling back to the in-pipeline execution is correct).
Matching is conservative: a signature must match on GroupByCols (order and content) AND on the full set of AggExpr output names. Any other cases fall through untouched.
Types ¶
type AggExpr ¶
type AggExpr struct {
Func string // sum, count, min, max, avg
InputCol string
OutputCol string
Distinct bool // COUNT(DISTINCT col)
InputExpr plansql.Node // AST for aggregate argument (nil for simple column refs)
// InputCol2, Separator and Percentile hold the arguments after the
// first, for the functions that take more than one: the second column
// of CORR/COVAR_SAMP/COVAR_POP and the ordering column of
// MIN_BY/MAX_BY, STRING_AGG's separator literal, and
// PERCENTILE_CONT/PERCENTILE_DISC's fraction. See parseAggExtraArgs.
//
// InputCol stays a single column name throughout: column pruning and
// requiredColumns read it as one, and InputCol2 is registered beside
// it rather than packed into the same string.
InputCol2 string
Separator string
Percentile float64
}
AggExpr is an aggregation expression.
type ColumnPolicy ¶
type ColumnPolicy struct {
Column string
Denied bool // true = column excluded from results
MaskExpr string // non-empty = column replaced with this value (e.g., "'***'", "0")
}
ColumnPolicy describes a column-level security policy for plan-level enforcement.
type DecimalMeta ¶ added in v0.18.1
DecimalMeta carries a DECIMAL column's declared precision and scale — the two facts a bare parquet.TypeID cannot express. See Node.ScanColDecimal.
type HistogramStats ¶
type HistogramStats interface {
SelectivityLE(v any) float64
SelectivityLT(v any) float64
SelectivityRange(lo, hi any) float64
SelectivityEQ(v any) float64
}
HistogramStats is the interface a per-column histogram must implement to participate in selectivity estimation. catalog.Histogram satisfies it. Kept as an interface so the logical package stays free of a catalog dependency.
type MergeInfo ¶
type MergeInfo struct {
GroupBy []string
AggExprs []AggExpr
OrderBy []OrderExpr
// Limit is the top-level LIMIT value; meaningful only when HasLimit is
// true. HasLimit is false both when the statement has no LIMIT at all
// and when it has only an OFFSET (NoLimit) — a companion bool rather
// than folding NoLimit into Limit itself, because the many test
// literals that construct a MergeInfo{} directly (never touching
// Limit) must keep meaning "unbounded" by leaving both fields at their
// zero value. Before HasLimit existed, `Limit > 0` doubled as that
// same test, so a probe-split merge for `... LIMIT 0` silently kept
// every row instead of zero (#481) — test HasLimit, never `Limit > 0`.
Limit int
HasLimit bool
// Offset is the top-level OFFSET. Rows to keep are [Offset, Offset+Limit)
// — a merge that truncates to Limit before skipping Offset returns the
// first page for every page (#337).
Offset int
HasAggregate bool
HasDistinct bool // DISTINCT requires deduplication across partials
}
MergeInfo describes how to merge probe-split partial results.
func ExtractMergeInfo ¶
ExtractMergeInfo extracts the top-level aggregate and sort/limit information needed to merge probe-split partial results. Returns nil if the plan doesn't have a top-level aggregate (probe-split merge not needed).
func (*MergeInfo) KeepRows ¶
KeepRows is the number of rows a merge step must hold on to before the offset is applied: everything up to Offset+Limit. Returns NoLimit (-1) when unbounded — never 0, which is itself a real, meaningful "keep nothing" answer for a top-level `LIMIT 0` (#481). Callers must test `KeepRows() >= 0`, never `KeepRows() > 0`.
type Node ¶
type Node struct {
Type NodeType
Children []*Node
// Scan
TableName string
TableAlias string
ScanColumns []string // column names available from this scan (populated by physical planner)
RequiredColumns []string // columns actually needed from this scan (set by optimizer column pruning)
PartitionFilter map[string]string // extracted partition key filters (year, month, day, hour)
ScanPredicates []Predicate // pushed-down filter predicates for row group pruning
ScanRowEstimate int64 // estimated row count from manifest (0 = unknown)
ScanColStats map[string]ScanColumnStats // aggregated column stats from catalog (nil = unavailable)
// ScanColTypes maps this scan's lower-cased column names to their
// catalog types (populated by physical.AnnotateScanColumns alongside
// ScanColumns). It is what lets the planner declare a MIN/MAX output
// type, which follows the input column rather than the function.
ScanColTypes map[string]parquet.TypeID
// ScanColDecimal maps this scan's lower-cased column names to their
// DECIMAL precision/scale — entries exist only for TypeDecimal columns.
// Populated by physical.AnnotateScanColumns alongside ScanColTypes. It is
// what lets a zero-row DECIMAL result declare the same PostgreSQL typmod
// a non-empty one does: ScanColTypes alone carries the bare TypeID, which
// left every declared-schema DECIMAL column at Precision=0 (typmod -1,
// "unconstrained") even when the underlying column had a real (p,s)
// (#458).
ScanColDecimal map[string]DecimalMeta
FilterOnlyColumns []string // columns needed ONLY by the filter directly above this scan (candidates for scan-level filter evaluation without materialization)
ShapeOnlyColumns []string // byte-array columns whose EVERY use in the plan reads shape, not contents (LENGTH/IS NULL/= ”/COUNT) — the scan decodes them as lengths, see shape_only_columns.go
SampleMethod string // TABLESAMPLE method: BERNOULLI, SYSTEM
SamplePercent float64 // percentage for TABLESAMPLE (0-100)
// Table Function (e.g., read_json, read_csv, unnest)
IsTableFunc bool // true if this scan reads from a table function
FuncName string // function name (e.g., "read_json")
FuncArgs []string // positional arguments (e.g., URL/path)
FuncNamedArgs map[string]string // named arguments (e.g., delimiter="|")
WithOrdinality bool // UNNEST(...) WITH ORDINALITY
FuncColAliases []string // AS alias(col1, col2, ...)
// Filter
Predicates []Predicate
// Project
Projections []Projection
// SecurityBarrier marks a projection injected by ABAC column-policy
// enforcement (InjectColumnPolicies): masked columns replaced with
// literal expressions, denied columns absent. The physical planner
// must APPLY it at the scan (distributed walkStages treats ordinary
// Projects as passthrough — a dropped barrier would leak raw values).
SecurityBarrier bool
// Aggregate
// PreservesAggOutputs marks a synthetic Project inserted by a rewrite
// directly above an Aggregate that passes every aggregate output
// through under its original name (possibly adding finalizations,
// e.g. the two-level AVG division). The physical builder's
// aggregate-ancestor resolution walks through such projections so
// SELECT-list aggregate references still resolve by output name.
PreservesAggOutputs bool
// ScanStrictIntCols marks scan columns whose vectors are plain
// Int64/Int32 at runtime — exactly the set expr.BinOpNumeric resolves
// to integer arithmetic. Planner-side int typing must stay a subset
// of the runtime rule (a declared-int column over a float-mode expr
// would read as NULL through the typed getter), so this is
// deliberately narrower than ScanIntCols' int-class set.
ScanStrictIntCols map[string]bool
// ScanIntCols marks scan columns whose types land on the typed
// integer aggregation paths (set by physical.AnnotateScanColumns;
// consumed by the two-level distinct rewrite's cost gate).
ScanIntCols map[string]bool
GroupBy []string
GroupByExprs []plansql.Node // AST for GROUP BY expressions (may be nil)
AggExprs []AggExpr
GroupingSetNulls []string // columns that should be NULL in this grouping set (legacy, per-node)
GroupingSets [][]string // single-pass grouping sets: each entry lists the columns in that set
// Sort
OrderBy []OrderExpr
// Limit
LimitVal int
OffsetVal int
// Join
JoinType string // inner, left, right, full, cross, semi, anti
JoinCond string
JoinFilter string // non-equality join conditions for semi/anti join
LeftKeys []string
RightKeys []string
NeededColumns []string // columns the parent needs from this join's output (set by optimizer)
// Window
WindowExprs []WindowExpr
// Union
UnionAll bool // true = UNION ALL, false = UNION (dedup)
// CTEs — stored on the root node so the physical planner can resolve
// CTE references inside scalar subqueries (e.g., Q15's HAVING/WHERE
// subquery that references a CTE defined in the outer WITH clause).
CTEs []plansql.CTEDef
// CTEName — set on the root of a CTE sub-plan so the physical planner
// can detect and materialize multi-referenced CTEs.
CTEName string
// decorrelateScalarSubqueries (children[1] is the grouped aggregate
// materializing the subquery result). reduceDecorrelatedScalarAggs
// uses it after predicate pushdown to semijoin-reduce the aggregate's
// input by the outer plan's key-source branch.
ScalarDecorrelated bool
// BuildSideDedup marks a Distinct the PLANNER inserted, not one the
// user wrote. Two passes create them: dedupSemiAntiBuildSide bounds a
// semi/anti join's build hashtable by NDV, and scalar_agg_semijoin
// builds a decorrelated semijoin's key source. Neither carries
// user-visible semantics — a semi/anti join's result does not depend
// on whether its build side has duplicates — and the physical planner
// has dedicated handling for the shape (estimateDistinctKeyBytes sizes
// Distinct(Project) subtrees by key count; the distinct-pair semi/anti
// build fast path matches on it).
//
// rewriteDistinctAsGroupBy therefore leaves a marked Distinct alone and
// rewrites every UNMARKED one — those are user SELECT DISTINCTs, and
// each is an answer the engine has to actually compute (#466).
BuildSideDedup bool
}
Node is a node in the logical query plan tree.
func BuildFromSelect ¶
func BuildFromSelect(info *plansql.SelectInfo) (*Node, error)
BuildFromSelect constructs a logical plan from a parsed SELECT query.
func BuildFromSelectWithCTEs ¶
BuildFromSelectWithCTEs constructs a logical plan, resolving CTE references to inline sub-plans instead of table scans.
func InjectColumnPolicies ¶
func InjectColumnPolicies(plan *Node, tableName string, policies []ColumnPolicy) *Node
InjectColumnPolicies walks the logical plan and inserts a security projection above Scan nodes for the given table. Denied columns are removed and masked columns are replaced with literal expressions. This ensures restricted data never enters the execution pipeline.
func InjectRowFilter ¶
InjectRowFilter walks the logical plan tree and wraps Scan nodes for the given table with an additional Filter node containing the row filter predicate. This is used by row-level security policies to restrict which rows a role can see.
func NewAggregate ¶
NewAggregate creates an aggregate node.
func NewExcept ¶
NewExcept creates an except node. Returns rows from left that are not in right. If all is true (EXCEPT ALL), preserves duplicates; otherwise deduplicates.
func NewIntersect ¶
NewIntersect creates an intersect node. Returns only rows present in both sides. If all is true (INTERSECT ALL), preserves duplicates; otherwise deduplicates.
func NewProject ¶
func NewProject(child *Node, projections []Projection) *Node
NewProject creates a projection node.
func NewUnion ¶
NewUnion creates a union node. If all is true, it represents UNION ALL (no deduplication); otherwise it represents UNION (with deduplication).
func NewWindow ¶
func NewWindow(child *Node, exprs []WindowExpr) *Node
NewWindow creates a window node.
func Optimize ¶
Optimize applies logical optimizations to the plan tree.
An optional ScanAnnotator function may be provided to populate scan metadata (ScanColumns) on newly created scan nodes after IN-to-SemiJoin conversion. This enables subsequent scalar subquery decorrelation to resolve unqualified column references. Without an annotator, scalar decorrelation may fail for subqueries that use unqualified outer column references.
func StripTopSortLimit ¶
StripTopSortLimit removes the outermost Sort and Limit nodes from a logical plan. Used by probe-split pipeline: each worker produces partial aggregates without ordering or truncation; the coordinator merges and applies final sort + limit.
func (*Node) PrettyPrint ¶
PrettyPrint returns a formatted string representation of the plan tree.
type OrderExpr ¶
type OrderExpr struct {
Column string
Desc bool
NullsFirst *bool // nil = default, true = NULLS FIRST, false = NULLS LAST
}
OrderExpr is a sort expression.
type PreComputedAggregate ¶
type PreComputedAggregate struct {
InputTable string
GroupByCols []string
AggOutputCols []string // OutputCol names from each AggSpec, in order
SyntheticAlias string // unique scan alias to substitute
}
PreComputedAggregate is a signature describing a derived aggregate whose result is already materialized elsewhere. When a logical-plan Aggregate node matches a signature, SubstitutePreComputedAggregates replaces it with a Scan node bearing SyntheticAlias; the caller (worker) is expected to wire SyntheticAlias → CacheFiles into the physical planner's StreamingSources map so the scan reads the cached rows directly.
Phase 1 matches only aggregates that are GROUP BY GroupByCols over a single Scan of InputTable (no filters on the scan, no nested joins). More general shapes are rejected and left in-plan.
type Predicate ¶
type Predicate struct {
Column string
Op string // =, !=, <, <=, >, >=, is_null, is_not_null, in, between
Value any
// ValueText is a numeric Value's exact source text. Value is boxed for
// arithmetic and a float64 cannot hold a DECIMAL past ~15-16 significant
// digits, so the text is what the scan's prune and the row-at-a-time
// filter convert at the column's own scale (#452). Empty when Value did
// not come from a numeric literal.
ValueText string
Raw string // raw SQL expression
ASTExpr plansql.Node // compiled AST expression node
// PruneOnly marks predicates attached solely for storage-level pruning
// (row-group stats / dictionary probes). The cardinality estimator
// ignores them: attaching AST-decomposed conjuncts must not shift
// distributed plan choices (Q08's orders join flipped shuffle →
// broadcast off a 0.33^n selectivity guess the moment they appeared).
// Estimate-visible attachment is a separate, SF100-validated change.
PruneOnly bool
}
Predicate is a filter condition.
func SplitConjunctsForPushdown ¶
SplitConjunctsForPushdown decomposes an AST filter into top-level AND-conjuncts and partitions them: structured `column <op> literal` comparisons (as Predicates) and everything else (residual ASTs). The physical planner uses this to push eligible conjuncts into the scan and compile only the residue as the exec filter.
type Projection ¶
type Projection struct {
Column string // column reference
Alias string // output name
Expr string // raw expression
IsAgg bool
ASTExpr plansql.Node // compiled AST expression node (nil for aggregates)
// Hidden marks a projection the planner added for its own use rather
// than one the user selected: the materialized value of an ORDER BY term
// the SELECT list does not carry (#320). It computes and sorts like any
// other projection, and is dropped before the rows reach the client —
// extractOutputRenames leaves it out of the DAG's output schema, and
// hiddenSortTrimOp drops it on the single-process pipeline.
Hidden bool
}
Projection is a column expression in a SELECT.
func VisibleProjections ¶
func VisibleProjections(projs []Projection) []Projection
VisibleProjections returns projs without the columns the planner materialized for its own use. Returns projs itself when there are none, so the common plan costs no allocation.
type RelStats ¶
type RelStats struct {
Rows float64
ColNDV map[string]float64 // lowercase unqualified column name → estimated NDV
// ColHist carries opaque histogram pointers (*catalog.Histogram) for
// columns that have one in the catalog. Used by estimatePredSelectivity
// to compute range/equality selectivity from real data distributions.
// Stored as any to keep the logical package free of catalog imports.
ColHist map[string]any
}
RelStats holds estimated statistics for a plan subtree.
func RelStatsOf ¶
RelStatsOf returns CBO-derived statistics for the given subtree. Exported so the physical planner can consult cardinality-driven estimates when making structural decisions (broadcast vs shuffle, dynamic-filter eligibility, etc.) without re-implementing the recursion.
type ScanColumnStats ¶
type ScanColumnStats struct {
MinValue any
MaxValue any
NullCount int64
TotalRows int64
// NDV is the catalog's merged HyperLogLog estimate of distinct values
// across all files of this column. Zero means HLL wasn't collected
// (legacy files / pre-ANALYZE state); planner falls back to the
// min/max-range heuristic. When >0 it's preferred — orders of
// magnitude more accurate for sparse-int / string columns where the
// range overstates true cardinality.
NDV int64
// Histogram is the catalog's equi-depth histogram for this column,
// merged across files from reservoir samples. Nil when not collected.
// Used by estimatePredSelectivity to compute range/equality
// selectivity from real value distributions instead of hardcoded
// fractions (0.33 for <, 0.1 for =). The opaque any allows the
// logical package to receive *catalog.Histogram without importing
// the catalog package (avoids circular import).
Histogram any
}
ScanColumnStats holds aggregated column statistics from the catalog.
type WindowBound ¶
type WindowBound struct {
Type string // "unbounded_preceding", "preceding", "current_row", "following", "unbounded_following"
Offset int
}
WindowBound describes one end of a window frame.
type WindowExpr ¶
type WindowExpr struct {
Func string // row_number, rank, dense_rank, sum, count, avg, min, max
InputCol string // the argument list, verbatim — see InputColumn
OutputCol string
PartitionBy []string
OrderBy []OrderExpr
Frame *WindowFrameSpec
}
WindowExpr is a window function expression.
func (WindowExpr) InputColumn ¶
func (w WindowExpr) InputColumn() string
InputColumn returns the COLUMN argument of a window expression.
InputCol carries the whole argument list as one string, so LAG, LEAD and NTH_VALUE spell their column alongside an offset, a default or an N — "l_quantity, 2, 0". The column is everything before the first comma; everything after belongs to the function, not to any table. NTILE's single argument is a bucket count and names no column at all.
Every consumer needs the same answer: the column-pruning rule needs it to keep the column readable, and the physical planner needs it to type the output. Taking the raw string for a column name pruned the real one out of the scan, and the window operator then found no input vector and nil-dereferenced it — a crash, not a wrong answer.
type WindowFrameSpec ¶
type WindowFrameSpec struct {
Mode string // "rows" or "range"
Start WindowBound
End WindowBound
}
WindowFrameSpec describes a window frame specification.
Source Files
¶
- agg_extra_args.go
- builder.go
- comma_join_lift.go
- const_arith_agg.go
- count_distinct_rewrite.go
- distinct_rewrite.go
- filter_project_pushdown.go
- join_predicates.go
- optimizer.go
- order_by_keys.go
- plan.go
- precomputed_aggregate.go
- scalar_agg_semijoin.go
- semi_anti_dedup.go
- semi_pushdown.go
- shape_only_columns.go
- star_expansion.go
- stats.go