diff --git a/src/query/catalog/src/table_context.rs b/src/query/catalog/src/table_context.rs index 9b772430d69a8..91ad1edac23fa 100644 --- a/src/query/catalog/src/table_context.rs +++ b/src/query/catalog/src/table_context.rs @@ -111,5 +111,7 @@ pub trait TableContext: Send + Sync { // Get user manager api. fn get_user_manager(&self) -> Arc; fn get_cluster(&self) -> Arc; + async fn get_table(&self, catalog: &str, database: &str, table: &str) + -> Result>; async fn get_processes_info(&self) -> Vec; } diff --git a/src/query/service/src/api/http/v1/logs.rs b/src/query/service/src/api/http/v1/logs.rs index 671a58337921e..e541a92082a89 100644 --- a/src/query/service/src/api/http/v1/logs.rs +++ b/src/query/service/src/api/http/v1/logs.rs @@ -25,6 +25,7 @@ use tokio_stream::StreamExt; use crate::sessions::QueryContext; use crate::sessions::SessionManager; use crate::sessions::SessionType; +use crate::sessions::TableContext; use crate::storages::TableStreamReadWrap; use crate::storages::ToReadDataSourcePlan; diff --git a/src/query/service/src/interpreters/interpreter_table_describe.rs b/src/query/service/src/interpreters/interpreter_table_describe.rs index 70fd03282a054..cf093116c966b 100644 --- a/src/query/service/src/interpreters/interpreter_table_describe.rs +++ b/src/query/service/src/interpreters/interpreter_table_describe.rs @@ -24,6 +24,7 @@ use common_streams::SendableDataBlockStream; use crate::interpreters::Interpreter; use crate::sessions::QueryContext; +use crate::sessions::TableContext; use crate::sql::executor::PhysicalScalar; use crate::sql::PlanParser; use crate::storages::view::view_table::QUERY; diff --git a/src/query/service/src/interpreters/interpreter_table_exists.rs b/src/query/service/src/interpreters/interpreter_table_exists.rs index 7f97bddeb4cc9..8604a3450c9df 100644 --- a/src/query/service/src/interpreters/interpreter_table_exists.rs +++ b/src/query/service/src/interpreters/interpreter_table_exists.rs @@ -24,6 +24,7 @@ use common_streams::SendableDataBlockStream; use crate::interpreters::Interpreter; use crate::sessions::QueryContext; +use crate::sessions::TableContext; pub struct ExistsTableInterpreter { ctx: Arc, diff --git a/src/query/service/src/interpreters/interpreter_table_truncate.rs b/src/query/service/src/interpreters/interpreter_table_truncate.rs index f421b7ceaaec2..13556395bde37 100644 --- a/src/query/service/src/interpreters/interpreter_table_truncate.rs +++ b/src/query/service/src/interpreters/interpreter_table_truncate.rs @@ -23,6 +23,7 @@ use common_streams::SendableDataBlockStream; use crate::interpreters::Interpreter; use crate::sessions::QueryContext; +use crate::sessions::TableContext; pub struct TruncateTableInterpreter { ctx: Arc, diff --git a/src/query/service/src/optimizers/optimizer_statistics_exact.rs b/src/query/service/src/optimizers/optimizer_statistics_exact.rs index 20e59dcde3089..ab571f9bdff4e 100644 --- a/src/query/service/src/optimizers/optimizer_statistics_exact.rs +++ b/src/query/service/src/optimizers/optimizer_statistics_exact.rs @@ -27,6 +27,7 @@ use common_legacy_planners::PlanRewriter; use crate::optimizers::Optimizer; use crate::sessions::QueryContext; +use crate::sessions::TableContext; use crate::storages::ToReadDataSourcePlan; struct StatisticsExactImpl<'a> { diff --git a/src/query/service/src/sessions/query_ctx.rs b/src/query/service/src/sessions/query_ctx.rs index 25979d8159459..185268666efd1 100644 --- a/src/query/service/src/sessions/query_ctx.rs +++ b/src/query/service/src/sessions/query_ctx.rs @@ -125,22 +125,6 @@ impl QueryContext { StageTable::try_create(table_info.clone()) } - /// Fetch a Table by db and table name. - /// - /// It guaranteed to return a consistent result for multiple calls, in a same query. - /// E.g.: - /// ```sql - /// SELECT * FROM (SELECT * FROM db.table_name) as subquery_1, (SELECT * FROM db.table_name) AS subquery_2 - /// ``` - pub async fn get_table( - &self, - catalog: &str, - database: &str, - table: &str, - ) -> Result> { - self.shared.get_table(catalog, database, table).await - } - pub async fn set_current_database(&self, new_database_name: String) -> Result<()> { let tenant_id = self.get_tenant(); let catalog = self.get_catalog(self.get_current_catalog().as_str())?; @@ -418,6 +402,22 @@ impl TableContext for QueryContext { self.shared.get_cluster() } + /// Fetch a Table by db and table name. + /// + /// It guaranteed to return a consistent result for multiple calls, in a same query. + /// E.g.: + /// ```sql + /// SELECT * FROM (SELECT * FROM db.table_name) as subquery_1, (SELECT * FROM db.table_name) AS subquery_2 + /// ``` + async fn get_table( + &self, + catalog: &str, + database: &str, + table: &str, + ) -> Result> { + self.shared.get_table(catalog, database, table).await + } + // Get all the processes list info. async fn get_processes_info(&self) -> Vec { SessionManager::instance().processes_info().await diff --git a/src/query/service/src/sql/optimizer/heuristic/mod.rs b/src/query/service/src/sql/optimizer/heuristic/mod.rs index be69c4a3311bc..caee14aa285d6 100644 --- a/src/query/service/src/sql/optimizer/heuristic/mod.rs +++ b/src/query/service/src/sql/optimizer/heuristic/mod.rs @@ -26,7 +26,7 @@ use once_cell::sync::Lazy; use super::rule::RuleID; use super::ColumnSet; -use crate::sessions::QueryContext; +use crate::sessions::TableContext; use crate::sql::optimizer::heuristic::decorrelate::decorrelate_subquery; use crate::sql::optimizer::heuristic::implement::HeuristicImplementor; pub use crate::sql::optimizer::heuristic::rule_list::RuleList; @@ -65,14 +65,14 @@ pub struct HeuristicOptimizer { rules: RuleList, implementor: HeuristicImplementor, - _ctx: Arc, + _ctx: Arc, bind_context: Box, metadata: MetadataRef, } impl HeuristicOptimizer { pub fn new( - ctx: Arc, + ctx: Arc, bind_context: Box, metadata: MetadataRef, rules: RuleList, diff --git a/src/query/service/src/sql/optimizer/mod.rs b/src/query/service/src/sql/optimizer/mod.rs index 45db9d0c839dc..a591efd35b4da 100644 --- a/src/query/service/src/sql/optimizer/mod.rs +++ b/src/query/service/src/sql/optimizer/mod.rs @@ -50,7 +50,7 @@ use self::util::contains_local_table_scan; use self::util::validate_distributed_query; use super::plans::Plan; use super::BindContext; -use crate::sessions::QueryContext; +use crate::sessions::TableContext; pub use crate::sql::optimizer::heuristic::RuleList; pub use crate::sql::optimizer::rule::RuleID; use crate::sql::optimizer::rule::RuleSet; @@ -74,7 +74,7 @@ impl OptimizerContext { } pub fn optimize( - ctx: Arc, + ctx: Arc, opt_ctx: Arc, plan: Plan, ) -> Result { @@ -130,7 +130,7 @@ pub fn optimize( } pub fn optimize_query( - ctx: Arc, + ctx: Arc, opt_ctx: Arc, metadata: MetadataRef, bind_context: Box, diff --git a/src/query/service/src/sql/planner/binder/copy.rs b/src/query/service/src/sql/planner/binder/copy.rs index 08fd1879b12c2..5131a8ab99735 100644 --- a/src/query/service/src/sql/planner/binder/copy.rs +++ b/src/query/service/src/sql/planner/binder/copy.rs @@ -31,7 +31,6 @@ use common_meta_types::UserStageInfo; use common_storage::parse_uri_location; use common_storage::UriLocation; -use crate::sessions::TableContext; use crate::sql::binder::Binder; use crate::sql::normalize_identifier; use crate::sql::plans::CopyPlanV2; diff --git a/src/query/service/src/sql/planner/binder/ddl/account.rs b/src/query/service/src/sql/planner/binder/ddl/account.rs index 1b93d34d5737f..6fa3a1bdac2c0 100644 --- a/src/query/service/src/sql/planner/binder/ddl/account.rs +++ b/src/query/service/src/sql/planner/binder/ddl/account.rs @@ -30,7 +30,6 @@ use common_meta_types::GrantObject; use common_meta_types::UserOption; use common_meta_types::UserPrivilegeSet; -use crate::sessions::TableContext; use crate::sql::plans::Plan; use crate::sql::Binder; diff --git a/src/query/service/src/sql/planner/binder/ddl/database.rs b/src/query/service/src/sql/planner/binder/ddl/database.rs index 16d7e5a814a87..7434736fab005 100644 --- a/src/query/service/src/sql/planner/binder/ddl/database.rs +++ b/src/query/service/src/sql/planner/binder/ddl/database.rs @@ -39,7 +39,6 @@ use common_legacy_planners::UndropDatabasePlan; use common_meta_app::schema::DatabaseMeta; use common_meta_app::share::ShareNameIdent; -use crate::sessions::TableContext; use crate::sql::binder::Binder; use crate::sql::planner::semantic::normalize_identifier; use crate::sql::plans::Plan; diff --git a/src/query/service/src/sql/planner/binder/ddl/share.rs b/src/query/service/src/sql/planner/binder/ddl/share.rs index 3c8c83dc633db..5058edaf9170a 100644 --- a/src/query/service/src/sql/planner/binder/ddl/share.rs +++ b/src/query/service/src/sql/planner/binder/ddl/share.rs @@ -16,7 +16,6 @@ use common_ast::ast::*; use common_exception::Result; use itertools::Itertools; -use crate::sessions::TableContext; use crate::sql::binder::Binder; use crate::sql::normalize_identifier; use crate::sql::plans::AlterShareTenantsPlan; diff --git a/src/query/service/src/sql/planner/binder/ddl/stage.rs b/src/query/service/src/sql/planner/binder/ddl/stage.rs index 6f0e70007b1a5..f7ea6f42ddff5 100644 --- a/src/query/service/src/sql/planner/binder/ddl/stage.rs +++ b/src/query/service/src/sql/planner/binder/ddl/stage.rs @@ -26,7 +26,6 @@ use common_meta_types::UserStageInfo; use common_storage::parse_uri_location; use common_storage::UriLocation; -use crate::sessions::TableContext; use crate::sql::binder::Binder; use crate::sql::plans::Plan; use crate::sql::statements::parse_copy_file_format_options; diff --git a/src/query/service/src/sql/planner/binder/ddl/table.rs b/src/query/service/src/sql/planner/binder/ddl/table.rs index 7715913395848..cd3fbe61c890e 100644 --- a/src/query/service/src/sql/planner/binder/ddl/table.rs +++ b/src/query/service/src/sql/planner/binder/ddl/table.rs @@ -39,7 +39,6 @@ use common_meta_app::schema::TableMeta; use tracing::debug; use crate::catalogs::DatabaseCatalog; -use crate::sessions::TableContext; use crate::sql::binder::scalar::ScalarBinder; use crate::sql::binder::Binder; use crate::sql::binder::Visibility; diff --git a/src/query/service/src/sql/planner/binder/ddl/view.rs b/src/query/service/src/sql/planner/binder/ddl/view.rs index a99f838dad6c0..de65c0a692c59 100644 --- a/src/query/service/src/sql/planner/binder/ddl/view.rs +++ b/src/query/service/src/sql/planner/binder/ddl/view.rs @@ -20,7 +20,6 @@ use common_legacy_planners::AlterViewPlan; use common_legacy_planners::CreateViewPlan; use common_legacy_planners::DropViewPlan; -use crate::sessions::TableContext; use crate::sql::binder::Binder; use crate::sql::planner::semantic::normalize_identifier; use crate::sql::plans::Plan; diff --git a/src/query/service/src/sql/planner/binder/delete.rs b/src/query/service/src/sql/planner/binder/delete.rs index 6de2b7c986bc7..53298a7f60f31 100644 --- a/src/query/service/src/sql/planner/binder/delete.rs +++ b/src/query/service/src/sql/planner/binder/delete.rs @@ -22,7 +22,6 @@ use common_legacy_planners::DeletePlan; use common_legacy_planners::Expression; use common_legacy_planners::Projection; -use crate::sessions::TableContext; use crate::sql::binder::Binder; use crate::sql::binder::ScalarBinder; use crate::sql::executor::ExpressionBuilderWithoutRenaming; diff --git a/src/query/service/src/sql/planner/binder/insert.rs b/src/query/service/src/sql/planner/binder/insert.rs index 81e9f80a61a94..cdff7896fe7d4 100644 --- a/src/query/service/src/sql/planner/binder/insert.rs +++ b/src/query/service/src/sql/planner/binder/insert.rs @@ -43,7 +43,6 @@ use crate::clusters::ClusterHelper; use crate::evaluator::EvalNode; use crate::evaluator::Evaluator; use crate::pipelines::processors::transforms::ExpressionTransformV2; -use crate::sessions::QueryContext; use crate::sessions::TableContext; use crate::sql::binder::Binder; use crate::sql::binder::ScalarBinder; @@ -198,7 +197,7 @@ impl<'a> Binder { } pub struct ValueSourceV2<'a> { - ctx: Arc, + ctx: Arc, name_resolution_ctx: &'a NameResolutionContext, bind_context: &'a BindContext, schema: DataSchemaRef, @@ -207,7 +206,7 @@ pub struct ValueSourceV2<'a> { impl<'a> ValueSourceV2<'a> { pub fn new( - ctx: Arc, + ctx: Arc, name_resolution_ctx: &'a NameResolutionContext, bind_context: &'a BindContext, schema: DataSchemaRef, @@ -446,7 +445,7 @@ fn fill_default_value( async fn exprs_to_datavalue<'a>( exprs: Vec>, schema: &DataSchemaRef, - ctx: Arc, + ctx: Arc, name_resolution_ctx: &NameResolutionContext, bind_context: &BindContext, metadata: MetadataRef, diff --git a/src/query/service/src/sql/planner/binder/join.rs b/src/query/service/src/sql/planner/binder/join.rs index f3732f413fe98..e85034607f7d3 100644 --- a/src/query/service/src/sql/planner/binder/join.rs +++ b/src/query/service/src/sql/planner/binder/join.rs @@ -24,7 +24,7 @@ use common_datavalues::wrap_nullable; use common_exception::ErrorCode; use common_exception::Result; -use crate::sessions::QueryContext; +use crate::sessions::TableContext; use crate::sql::binder::scalar_common::split_conjunctions; use crate::sql::binder::scalar_common::split_equivalent_predicate; use crate::sql::binder::scalar_common::wrap_cast_if_needed; @@ -235,7 +235,7 @@ pub fn check_duplicate_join_tables( } struct JoinConditionResolver<'a> { - ctx: Arc, + ctx: Arc, name_resolution_ctx: &'a NameResolutionContext, metadata: MetadataRef, @@ -247,7 +247,7 @@ struct JoinConditionResolver<'a> { impl<'a> JoinConditionResolver<'a> { pub fn new( - ctx: Arc, + ctx: Arc, name_resolution_ctx: &'a NameResolutionContext, metadata: MetadataRef, left_context: &'a BindContext, diff --git a/src/query/service/src/sql/planner/binder/mod.rs b/src/query/service/src/sql/planner/binder/mod.rs index 16dede858361f..bc858bff97a56 100644 --- a/src/query/service/src/sql/planner/binder/mod.rs +++ b/src/query/service/src/sql/planner/binder/mod.rs @@ -42,7 +42,7 @@ use super::plans::Plan; use super::plans::RewriteKind; use super::semantic::NameResolutionContext; use crate::catalogs::CatalogManager; -use crate::sessions::QueryContext; +use crate::sessions::TableContext; use crate::sql::planner::metadata::MetadataRef; mod aggregate; @@ -75,7 +75,7 @@ mod table; /// - Validate expressions /// - Build `Metadata` pub struct Binder { - ctx: Arc, + ctx: Arc, catalogs: Arc, name_resolution_ctx: NameResolutionContext, metadata: MetadataRef, @@ -83,7 +83,7 @@ pub struct Binder { impl<'a> Binder { pub fn new( - ctx: Arc, + ctx: Arc, catalogs: Arc, name_resolution_ctx: NameResolutionContext, metadata: MetadataRef, diff --git a/src/query/service/src/sql/planner/binder/scalar.rs b/src/query/service/src/sql/planner/binder/scalar.rs index 0f6063ab3fee9..06d4a58dce0a1 100644 --- a/src/query/service/src/sql/planner/binder/scalar.rs +++ b/src/query/service/src/sql/planner/binder/scalar.rs @@ -18,7 +18,7 @@ use common_ast::ast::Expr; use common_datavalues::DataTypeImpl; use common_exception::Result; -use crate::sessions::QueryContext; +use crate::sessions::TableContext; use crate::sql::planner::binder::BindContext; use crate::sql::planner::metadata::MetadataRef; use crate::sql::planner::semantic::NameResolutionContext; @@ -28,7 +28,7 @@ use crate::sql::plans::Scalar; /// Helper for binding scalar expression with `BindContext`. pub struct ScalarBinder<'a> { bind_context: &'a BindContext, - ctx: Arc, + ctx: Arc, name_resolution_ctx: &'a NameResolutionContext, metadata: MetadataRef, aliases: &'a [(String, Scalar)], @@ -37,7 +37,7 @@ pub struct ScalarBinder<'a> { impl<'a> ScalarBinder<'a> { pub fn new( bind_context: &'a BindContext, - ctx: Arc, + ctx: Arc, name_resolution_ctx: &'a NameResolutionContext, metadata: MetadataRef, aliases: &'a [(String, Scalar)], diff --git a/src/query/service/src/sql/planner/binder/sort.rs b/src/query/service/src/sql/planner/binder/sort.rs index 1fa7b7899fefe..23a51dcccaa98 100644 --- a/src/query/service/src/sql/planner/binder/sort.rs +++ b/src/query/service/src/sql/planner/binder/sort.rs @@ -23,7 +23,6 @@ use common_exception::ErrorCode; use common_exception::Result; use super::bind_context::NameResolutionResult; -use crate::sessions::TableContext; use crate::sql::binder::scalar::ScalarBinder; use crate::sql::binder::select::SelectList; use crate::sql::binder::Binder; diff --git a/src/query/service/src/sql/planner/binder/table.rs b/src/query/service/src/sql/planner/binder/table.rs index cac430cf16f1c..0f247f32070d3 100644 --- a/src/query/service/src/sql/planner/binder/table.rs +++ b/src/query/service/src/sql/planner/binder/table.rs @@ -32,7 +32,6 @@ use common_exception::ErrorCode; use common_exception::Result; use common_legacy_planners::Expression; -use crate::sessions::TableContext; use crate::sql::binder::scalar::ScalarBinder; use crate::sql::binder::Binder; use crate::sql::binder::ColumnBinding; diff --git a/src/query/service/src/sql/planner/mod.rs b/src/query/service/src/sql/planner/mod.rs index 33d481d0904f7..47d23c7b01f2d 100644 --- a/src/query/service/src/sql/planner/mod.rs +++ b/src/query/service/src/sql/planner/mod.rs @@ -24,7 +24,6 @@ use parking_lot::RwLock; pub use plans::ScalarExpr; use crate::clusters::ClusterHelper; -use crate::sessions::QueryContext; use crate::sql::optimizer::optimize; pub use crate::sql::planner::binder::BindContext; @@ -56,11 +55,11 @@ const PROBE_INSERT_INITIAL_TOKENS: usize = 128; const PROBE_INSERT_MAX_TOKENS: usize = 128 * 8; pub struct Planner { - ctx: Arc, + ctx: Arc, } impl Planner { - pub fn new(ctx: Arc) -> Self { + pub fn new(ctx: Arc) -> Self { Planner { ctx } } diff --git a/src/query/service/src/sql/planner/semantic/type_check.rs b/src/query/service/src/sql/planner/semantic/type_check.rs index 00b8c102f2e55..331c0a1b55bdf 100644 --- a/src/query/service/src/sql/planner/semantic/type_check.rs +++ b/src/query/service/src/sql/planner/semantic/type_check.rs @@ -56,7 +56,6 @@ use common_legacy_planners::validate_function_arg; use super::name_resolution::NameResolutionContext; use super::normalize_identifier; use crate::evaluator::Evaluator; -use crate::sessions::QueryContext; use crate::sessions::TableContext; use crate::sql::binder::wrap_cast_if_needed; use crate::sql::binder::Binder; @@ -90,7 +89,7 @@ use crate::sql::ScalarExpr; /// argument types of expressions, or unresolvable columns. pub struct TypeChecker<'a> { bind_context: &'a BindContext, - ctx: Arc, + ctx: Arc, name_resolution_ctx: &'a NameResolutionContext, metadata: MetadataRef, @@ -104,7 +103,7 @@ pub struct TypeChecker<'a> { impl<'a> TypeChecker<'a> { pub fn new( bind_context: &'a BindContext, - ctx: Arc, + ctx: Arc, name_resolution_ctx: &'a NameResolutionContext, metadata: MetadataRef, aliases: &'a [(String, Scalar)], diff --git a/src/query/service/src/sql/statements/statement_common.rs b/src/query/service/src/sql/statements/statement_common.rs index 75d53521a68a7..75f245bef086a 100644 --- a/src/query/service/src/sql/statements/statement_common.rs +++ b/src/query/service/src/sql/statements/statement_common.rs @@ -53,7 +53,7 @@ use crate::sessions::TableContext; /// /// - @internal/abc => (internal, "/stage/internal/abc") pub async fn parse_stage_location( - ctx: &Arc, + ctx: &Arc, location: &str, ) -> Result<(UserStageInfo, String)> { let mgr = ctx.get_user_manager(); @@ -75,7 +75,7 @@ pub async fn parse_stage_location( /// /// Difference is input location has already been parsed by parser. pub async fn parse_stage_location_v2( - ctx: &Arc, + ctx: &Arc, name: &str, path: &str, ) -> Result<(UserStageInfo, String)> { diff --git a/src/query/service/tests/it/sql/statements/statement_common.rs b/src/query/service/tests/it/sql/statements/statement_common.rs index bd1f3382dfed9..5a03ff4ea4006 100644 --- a/src/query/service/tests/it/sql/statements/statement_common.rs +++ b/src/query/service/tests/it/sql/statements/statement_common.rs @@ -12,6 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +use std::sync::Arc; + use common_base::base::tokio; use common_exception::Result; use common_meta_types::StageType; @@ -50,7 +52,8 @@ async fn test_parse_stage_location_internal() -> Result<()> { ]; for (name, input, expected) in cases { - let (stage, path) = parse_stage_location(&ctx, input).await?; + let table_context: Arc = ctx.clone(); + let (stage, path) = parse_stage_location(&table_context, input).await?; assert_eq!(stage, stage_info, "{}", name); assert_eq!(path, expected, "{}", name); @@ -83,7 +86,8 @@ async fn test_parse_stage_location_external() -> Result<()> { ]; for (name, input, expected) in cases { - let (stage, path) = parse_stage_location(&ctx, input).await?; + let table_context: Arc = ctx.clone(); + let (stage, path) = parse_stage_location(&table_context, input).await?; assert_eq!(stage, stage_info, "{}", name); assert_eq!(path, expected, "{}", name);