Module visit

Source
Expand description

Traversal of an immutable AST.

Each method of the Visit trait is a hook that can be overridden to customize the behavior when visiting the corresponding type of node. By default, every method recursively visits the substructure of the input by invoking the right visitor method of each of its fields.

pub trait Visit<'ast, T: AstInfo> {
    /* ... */

    fn visit_function(&mut self, node: &'ast Function<T>) {
        visit_function(self, node);
    }

    /* ... */
}

pub fn visit_function<'ast, V, T: AstInfo>(visitor: &mut V, node: &'ast Function<T>)
where
    V: Visit<'ast, T> + ?Sized,
{
    visitor.visit_item_name(&node.name);
    visitor.visit_function_args(&node.args);
    if let Some(filter) = &node.filter {
        visitor.visit_expr(&*filter);
    }
    if let Some(over) = &node.over {
        visitor.visit_window_spec(over);
    }
}

See also the visit_mut module for traversing mutable ASTs.

§Examples

This visitor will count the number of subqueries in a SQL statement.

use std::error::Error;

use mz_sql_parser::ast::{AstInfo, Query, Raw};
use mz_sql_parser::ast::visit::{self, Visit};

struct SubqueryCounter {
    count: usize,
}

impl<'ast> Visit<'ast, Raw> for SubqueryCounter {
    fn visit_query(&mut self, query: &'ast Query<Raw>) {
        self.count += 1;

        // Delegate to the default implementation to visit any nested
        // subqueries. Placing this call at the end of the method results
        // in a pre-order traversal. Place it at the beginning for a
        // post-order traversal instead.
        visit::visit_query(self, query);
    }
}

fn main() -> Result<(), Box<dyn Error>> {
    let sql = "SELECT (SELECT 1) FROM (SELECT 1) WHERE EXISTS (SELECT (SELECT 1))";
    let stmts = mz_sql_parser::parser::parse_statements(sql.into())?;

    let mut counter = SubqueryCounter { count: 0 };
    for stmt in &stmts {
        counter.visit_statement(&stmt.ast);
    }
    assert_eq!(counter.count, 5);
    Ok(())
}

The 'ast lifetime on the input references means that the syntax tree outlives the complete recursive visit call, so the visitor is allowed to hold on to references into the syntax tree.

use std::error::Error;

use mz_sql_parser::ast::{Ident, Raw, AstInfo, RawItemName};
use mz_sql_parser::ast::visit::{self, Visit};

struct IdentCollector<'ast> {
    idents: Vec<&'ast Ident>,
}

impl<'ast> Visit<'ast, Raw> for IdentCollector<'ast> {
    fn visit_ident(&mut self, node: &'ast Ident) {
        self.idents.push(node);
        visit::visit_ident(self, node);
    }
    fn visit_item_name(&mut self, name: &'ast <Raw as AstInfo>::ItemName) {
        match name {
            RawItemName::Name(n) | RawItemName::Id(_, n, _) => {
                for node in &n.0 {
                    self.idents.push(node);
                    visit::visit_ident(self, node);
                }
            }
        }
    }
}

fn main() -> Result<(), Box<dyn Error>> {
    let sql = "SELECT a FROM b.c WHERE 1 + d(e)";
    let stmts = mz_sql_parser::parser::parse_statements(sql.into())?;

    let mut collector = IdentCollector { idents: vec![] };
    for stmt in &stmts {
        collector.visit_statement(&stmt.ast);
    }
    assert_eq!(collector.idents, &[
        &Ident::new_unchecked("a"), &Ident::new_unchecked("b"),
        &Ident::new_unchecked("c"), &Ident::new_unchecked("d"),
        &Ident::new_unchecked("e"),
    ]);
    Ok(())
}

The VisitNode trait is implemented for every node in the AST and can be used to write generic functions that apply a Visit implementation to any node in the AST.

§Implementation notes

This module is automatically generated by the crate’s build script. Changes to the AST will be automatically propagated to the visitor.

This approach to AST visitors is inspired by the syn crate. These module docs are directly derived from the syn::visit module docs.

Traits§

Visit
VisitNode

Functions§

visit_abbreviated_grant_or_revoke_statement
visit_abbreviated_grant_statement
visit_abbreviated_revoke_statement
visit_alter_cluster_action
visit_alter_cluster_statement
visit_alter_connection_action
visit_alter_connection_option
visit_alter_connection_option_name
visit_alter_connection_statement
visit_alter_default_privileges_statement
visit_alter_index_action
visit_alter_index_statement
visit_alter_network_policy_statement
visit_alter_object_rename_statement
visit_alter_object_swap_statement
visit_alter_owner_statement
visit_alter_retain_history_statement
visit_alter_role_option
visit_alter_role_statement
visit_alter_secret_statement
visit_alter_set_cluster_statement
visit_alter_sink_action
visit_alter_sink_statement
visit_alter_source_action
visit_alter_source_add_subsource_option
visit_alter_source_add_subsource_option_name
visit_alter_source_statement
visit_alter_system_reset_all_statement
visit_alter_system_reset_statement
visit_alter_system_set_statement
visit_alter_table_add_column_statement
visit_as_of
visit_assignment
visit_avro_doc_on
visit_avro_schema
visit_avro_schema_option
visit_avro_schema_option_name
visit_catalog_name
visit_close_statement
visit_cluster_alter_option
visit_cluster_alter_option_name
visit_cluster_alter_option_value
visit_cluster_alter_until_ready_option
visit_cluster_alter_until_ready_option_name
visit_cluster_feature
visit_cluster_feature_name
visit_cluster_name
visit_cluster_option
visit_cluster_option_name
visit_cluster_schedule_option_value
visit_column_def
visit_column_name
visit_column_option
visit_column_option_def
visit_column_reference
visit_column_versioned
visit_comment_object_type
visit_comment_statement
visit_commit_statement
visit_connection_default_aws_privatelink
visit_connection_option
visit_connection_option_name
visit_continual_task_option
visit_continual_task_option_name
visit_continual_task_stmt
visit_copy_direction
visit_copy_option
visit_copy_option_name
visit_copy_relation
visit_copy_statement
visit_copy_target
visit_create_cluster_replica_statement
visit_create_cluster_statement
visit_create_connection_option
visit_create_connection_option_name
visit_create_connection_statement
visit_create_connection_type
visit_create_continual_task_statement
visit_create_continual_task_sugar
visit_create_database_statement
visit_create_index_statement
visit_create_materialized_view_statement
visit_create_network_policy_statement
visit_create_role_statement
visit_create_schema_statement
visit_create_secret_statement
visit_create_sink_connection
visit_create_sink_option
visit_create_sink_option_name
visit_create_sink_statement
visit_create_source_connection
visit_create_source_option
visit_create_source_option_name
visit_create_source_statement
visit_create_subsource_option
visit_create_subsource_option_name
visit_create_subsource_statement
visit_create_table_from_source_statement
visit_create_table_statement
visit_create_type_as
visit_create_type_list_option
visit_create_type_list_option_name
visit_create_type_map_option
visit_create_type_map_option_name
visit_create_type_statement
visit_create_view_statement
visit_create_webhook_source_body
visit_create_webhook_source_check
visit_create_webhook_source_check_options
visit_create_webhook_source_filter_header
visit_create_webhook_source_header
visit_create_webhook_source_include_headers
visit_create_webhook_source_map_header
visit_create_webhook_source_secret
visit_create_webhook_source_statement
visit_csr_config_option
visit_csr_config_option_name
visit_csr_connection
visit_csr_connection_avro
visit_csr_connection_protobuf
visit_csr_seed_avro
visit_csr_seed_protobuf
visit_csr_seed_protobuf_schema
visit_csv_columns
visit_cte
visit_cte_block
visit_cte_id
visit_cte_mut_rec
visit_cte_mut_rec_column_def
visit_data_type
visit_database_name
visit_date_time_field
visit_deallocate_statement
visit_declare_statement
visit_deferred_item_name
visit_delete_statement
visit_discard_statement
visit_discard_target
visit_distinct
visit_doc_on_identifier
visit_doc_on_schema
visit_drop_objects_statement
visit_drop_owned_statement
visit_execute_statement
visit_explain_analyze_computation_property
visit_explain_analyze_property
visit_explain_analyze_statement
visit_explain_format
visit_explain_plan_option
visit_explain_plan_option_name
visit_explain_plan_statement
visit_explain_pushdown_statement
visit_explain_sink_schema_for
visit_explain_sink_schema_statement
visit_explain_stage
visit_explain_timestamp_statement
visit_explainee
visit_expr
visit_external_reference_export
visit_external_references
visit_fetch_direction
visit_fetch_option
visit_fetch_option_name
visit_fetch_statement
visit_format
visit_format_specifier
visit_function
visit_function_args
visit_grant_privileges_statement
visit_grant_role_statement
visit_grant_target_all_specification
visit_grant_target_specification
visit_grant_target_specification_inner
visit_homogenizing_function
visit_ident
visit_ident_error
visit_if_exists_behavior
visit_index_option
visit_index_option_name
visit_insert_source
visit_insert_statement
visit_inspect_shard_statement
visit_interval_value
visit_is_expr_construct
visit_item_name
visit_join
visit_join_constraint
visit_join_operator
visit_kafka_broker
visit_kafka_broker_aws_privatelink
visit_kafka_broker_aws_privatelink_option
visit_kafka_broker_aws_privatelink_option_name
visit_kafka_broker_tunnel
visit_kafka_sink_config_option
visit_kafka_sink_config_option_name
visit_kafka_sink_key
visit_kafka_source_config_option
visit_kafka_source_config_option_name
visit_key_constraint
visit_limit
visit_load_generator
visit_load_generator_option
visit_load_generator_option_name
visit_map_entry
visit_materialized_view_option
visit_materialized_view_option_name
visit_mut_rec_block
visit_mut_rec_block_option
visit_mut_rec_block_option_name
visit_my_sql_config_option
visit_my_sql_config_option_name
visit_named_plan
visit_nested_statement
visit_network_policy_name
visit_network_policy_option
visit_network_policy_option_name
visit_network_policy_rule_definition
visit_network_policy_rule_option
visit_network_policy_rule_option_name
visit_notice_severity
visit_object_name
visit_object_type
visit_op
visit_order_by_expr
visit_pg_config_option
visit_pg_config_option_name
visit_prepare_statement
visit_privilege
visit_privilege_specification
visit_protobuf_schema
visit_qualified_replica
visit_query
visit_raise_statement
visit_reader_schema_selection_strategy
visit_reassign_owned_statement
visit_refresh_at_option_value
visit_refresh_every_option_value
visit_refresh_option_value
visit_replica_definition
visit_replica_option
visit_replica_option_name
visit_reset_variable_statement
visit_revoke_privileges_statement
visit_revoke_role_statement
visit_role_attribute
visit_role_name
visit_rollback_statement
visit_schema
visit_schema_name
visit_select
visit_select_item
visit_select_option
visit_select_option_name
visit_select_statement
visit_set_expr
visit_set_operator
visit_set_role_var
visit_set_transaction_statement
visit_set_variable_statement
visit_set_variable_to
visit_set_variable_value
visit_show_columns_statement
visit_show_create_cluster_statement
visit_show_create_connection_statement
visit_show_create_index_statement
visit_show_create_materialized_view_statement
visit_show_create_sink_statement
visit_show_create_source_statement
visit_show_create_table_statement
visit_show_create_view_statement
visit_show_object_type
visit_show_objects_statement
visit_show_statement
visit_show_statement_filter
visit_show_variable_statement
visit_sink_envelope
visit_source_envelope
visit_source_error_policy
visit_source_include_metadata
visit_sql_server_config_option
visit_sql_server_config_option_name
visit_start_transaction_statement
visit_statement
visit_subscribe_option
visit_subscribe_option_name
visit_subscribe_output
visit_subscribe_relation
visit_subscribe_statement
visit_subscript_position
visit_system_object_type
visit_table_alias
visit_table_constraint
visit_table_factor
visit_table_from_source_columns
visit_table_from_source_option
visit_table_from_source_option_name
visit_table_option
visit_table_option_name
visit_table_with_joins
visit_target_role_specification
visit_transaction_access_mode
visit_transaction_isolation_level
visit_transaction_mode
visit_unresolved_database_name
visit_unresolved_item_name
visit_unresolved_object_name
visit_unresolved_schema_name
visit_update_statement
visit_validate_connection_statement
visit_value
visit_value_error
visit_values
visit_version
visit_view_definition
visit_window_frame
visit_window_frame_bound
visit_window_frame_units
visit_window_spec
visit_with_option_value