polyglot_sql/optimizer/
mod.rs1pub mod annotate_types;
8pub mod canonicalize;
10pub mod eliminate_ctes;
12pub mod eliminate_joins;
14pub mod isolate_table_selects;
16pub mod normalize;
18pub mod normalize_identifiers;
20pub mod optimize_joins;
22pub mod optimizer;
24pub mod pushdown_predicates;
26pub mod pushdown_projections;
28pub mod qualify_columns;
30pub mod qualify_tables;
32pub(crate) mod set_operation_types;
34pub mod simplify;
36pub mod subquery;
38
39pub use annotate_types::{annotate_types, TypeAnnotator, TypeCoercionClass};
41pub use canonicalize::canonicalize;
43pub use eliminate_ctes::{eliminate_ctes, is_cte_referenced};
45pub use eliminate_joins::eliminate_joins;
47pub use isolate_table_selects::isolate_table_selects;
49pub use normalize::{
51 normalization_distance, normalize, normalized, NormalizeError, DEFAULT_MAX_DISTANCE,
52};
53pub use normalize_identifiers::{
55 get_normalization_strategy, is_case_sensitive, normalize_identifier, normalize_identifiers,
56 NormalizationStrategy,
57};
58pub use optimize_joins::{is_reorderable, normalize_joins, optimize_joins, reorder_joins};
60pub use optimizer::{
62 optimize, optimize_with_rules, quick_optimize, OptimizationRule, OptimizerConfig, DEFAULT_RULES,
63};
64pub use pushdown_predicates::{pushdown_predicates, replace_aliases};
66pub use pushdown_projections::{default_selection, pushdown_projections};
68pub use qualify_columns::{
70 qualify_columns, qualify_outputs, quote_identifiers, validate_qualify_columns,
71 QualifyColumnsError, QualifyColumnsOptions,
72};
73pub use qualify_tables::{qualify_tables, QualifyTablesOptions};
75pub use simplify::{always_false, always_true, is_false, is_null, is_zero, simplify, Simplifier};
77pub use subquery::{is_correlated, is_mergeable, merge_subqueries, unnest_subqueries};
79
80fn structural_identity_key(expr: &crate::expressions::Expression) -> String {
83 fn remove_spans(value: &mut serde_json::Value) {
84 match value {
85 serde_json::Value::Object(fields) => {
86 fields.remove("span");
87 for value in fields.values_mut() {
88 remove_spans(value);
89 }
90 }
91 serde_json::Value::Array(values) => {
92 for value in values {
93 remove_spans(value);
94 }
95 }
96 _ => {}
97 }
98 }
99 let mut value = serde_json::to_value(expr).expect("expression serializes");
100 remove_spans(&mut value);
101 value.to_string()
102}
103
104pub(crate) fn qualify_schema_aware_expression(
110 expression: crate::expressions::Expression,
111 schema: &dyn crate::schema::Schema,
112 dialect: Option<crate::dialects::DialectType>,
113) -> Result<crate::expressions::Expression, QualifyColumnsError> {
114 let effective_dialect = dialect.or_else(|| schema.dialect());
115 let mut table_options = QualifyTablesOptions::new()
116 .with_alias_unaliased_tables(false)
117 .with_alias_unaliased_subqueries(true)
118 .with_normalize_set_operation_subqueries(false);
119 let mut column_options = QualifyColumnsOptions::new().with_allow_partial(true);
120
121 if let Some(dialect) = effective_dialect {
122 table_options = table_options.with_dialect(dialect);
123 column_options = column_options.with_dialect(dialect);
124 }
125
126 let expression = qualify_tables(expression, &table_options);
127 qualify_columns(expression, schema, &column_options)
128}