From 92954579da2dd85044ab42c4ed6b05d1d71b2e92 Mon Sep 17 00:00:00 2001 From: wangjili8417 Date: Sun, 12 Mar 2023 12:22:13 +0800 Subject: [PATCH 1/4] fix(functions):fix function version with MySQL client --- .../src/servers/http/clickhouse_federated.rs | 27 ----------- .../src/servers/http/clickhouse_handler.rs | 48 ------------------- .../src/servers/mysql/mysql_federated.rs | 7 --- src/query/service/src/sessions/query_ctx.rs | 14 +++++- 4 files changed, 13 insertions(+), 83 deletions(-) diff --git a/src/query/service/src/servers/http/clickhouse_federated.rs b/src/query/service/src/servers/http/clickhouse_federated.rs index 663c46f789cec..61c1ecab27103 100644 --- a/src/query/service/src/servers/http/clickhouse_federated.rs +++ b/src/query/service/src/servers/http/clickhouse_federated.rs @@ -12,19 +12,9 @@ // See the License for the specific language governing permissions and // limitations under the License. -use common_expression::types::StringType; -use common_expression::utils::FromData; -use common_expression::DataBlock; -use common_expression::TableDataType; -use common_expression::TableField; -use common_expression::TableSchemaRef; -use common_expression::TableSchemaRefExt; use ctor::ctor; use regex::Regex; -use crate::servers::federated_helper::FederatedHelper; -use crate::servers::http::CLICKHOUSE_VERSION; - pub struct ClickHouseFederated {} #[ctor] @@ -35,13 +25,6 @@ impl ClickHouseFederated { // Format: // |function_name()| // |value| - fn select_function_block(name: &str, value: &str) -> Option<(TableSchemaRef, DataBlock)> { - let schema = TableSchemaRefExt::create(vec![TableField::new(name, TableDataType::String)]); - let block = DataBlock::new_from_columns(vec![StringType::from_data(vec![ - value.as_bytes().to_vec(), - ])]); - Some((schema, block)) - } pub fn get_format(query: &str) -> Option { match FORMAT_REGEX.captures(query) { @@ -49,14 +32,4 @@ impl ClickHouseFederated { None => None, } } - - pub fn check(query: &str) -> Option<(TableSchemaRef, DataBlock)> { - #[ctor] - static SELECT_VERSION_RULES: Vec<(Regex, Option<(TableSchemaRef, DataBlock)>)> = vec![( - Regex::new(r".*(?i)SELECT\s*VERSION\(\)\s*;?$").unwrap(), - ClickHouseFederated::select_function_block("version()", CLICKHOUSE_VERSION), - )]; - - FederatedHelper::block_match_rule(query, &SELECT_VERSION_RULES) - } } diff --git a/src/query/service/src/servers/http/clickhouse_handler.rs b/src/query/service/src/servers/http/clickhouse_handler.rs index f135a15f82ec1..d124c7fe2f947 100644 --- a/src/query/service/src/servers/http/clickhouse_handler.rs +++ b/src/query/service/src/servers/http/clickhouse_handler.rs @@ -25,8 +25,6 @@ use common_exception::ErrorCode; use common_exception::Result; use common_exception::ToErrorCode; use common_expression::infer_table_schema; -use common_expression::DataBlock; -use common_expression::TableSchemaRef; use common_formats::ClickhouseFormatType; use common_formats::FileFormatOptionsExt; use common_formats::FileFormatTypeExt; @@ -57,7 +55,6 @@ use tracing::info; use crate::interpreters::InterpreterFactory; use crate::interpreters::InterpreterPtr; use crate::servers::http::v1::HttpQueryContext; -use crate::servers::http::ClickHouseFederated; use crate::sessions::QueryContext; use crate::sessions::SessionType; use crate::sessions::TableContext; @@ -241,18 +238,6 @@ pub async fn clickhouse_handler_get( let default_format = get_default_format(¶ms, headers).map_err(BadRequest)?; let sql = params.query(); - if let Some((schema, block)) = ClickHouseFederated::check(&sql) { - return serialize_one_block( - context.clone(), - schema, - block, - &sql, - ¶ms, - default_format, - ) - .map_err(InternalServerError); - } - let mut planner = Planner::new(context.clone()); let (plan, _, fmt) = planner .plan_sql(&sql) @@ -312,11 +297,6 @@ pub async fn clickhouse_handler_post( }; info!("receive clickhouse http post, (query + body) = {}", &msg); - if let Some((schema, block)) = ClickHouseFederated::check(&sql) { - return serialize_one_block(ctx.clone(), schema, block, &sql, ¶ms, default_format) - .map_err(InternalServerError); - } - let mut planner = Planner::new(ctx.clone()); let (mut plan, _, fmt) = planner .plan_sql(&sql) @@ -484,34 +464,6 @@ fn compress_block(input: Vec) -> Result> { } } -fn serialize_one_block( - ctx: Arc, - schema: TableSchemaRef, - block: DataBlock, - sql: &str, - params: &StatementHandlerParams, - default_format: ClickhouseFormatType, -) -> Result> { - let format = match ClickHouseFederated::get_format(sql) { - Some(format) => ClickhouseFormatType::parse_clickhouse_format(&format)?, - None => default_format, - }; - let format_typ = format.typ.clone(); - let mut output_format = FileFormatOptionsExt::get_output_format_from_clickhouse_format( - format, - schema, - &ctx.get_settings(), - )?; - let mut res = output_format.serialize_prefix()?; - let mut data = output_format.serialize_block(&block)?; - if params.compress() { - data = compress_block(data)?; - } - res.append(&mut data); - res.append(&mut output_format.finalize()?); - Ok(Body::from(res).with_content_type(format_typ.get_content_type())) -} - fn get_default_format( params: &StatementHandlerParams, headers: &HeaderMap, diff --git a/src/query/service/src/servers/mysql/mysql_federated.rs b/src/query/service/src/servers/mysql/mysql_federated.rs index 532391bfbbf09..3b487de8d049e 100644 --- a/src/query/service/src/servers/mysql/mysql_federated.rs +++ b/src/query/service/src/servers/mysql/mysql_federated.rs @@ -198,13 +198,6 @@ impl MySQLFederated { fn federated_mixed_check(&self, query: &str) -> Option<(TableSchemaRef, DataBlock)> { #[ctor] static MIXED_RULES: Vec<(Regex, Option<(TableSchemaRef, DataBlock)>)> = vec![ - ( - Regex::new(r"(?i)^(SELECT VERSION\(\s*\))").unwrap(), - MySQLFederated::select_function_block( - "version()", - format!("{}-{}", MYSQL_VERSION, DATABEND_COMMIT_VERSION.clone()).as_str(), - ), - ), // Txn. (Regex::new("(?i)^(ROLLBACK(.*))").unwrap(), None), (Regex::new("(?i)^(COMMIT(.*))").unwrap(), None), diff --git a/src/query/service/src/sessions/query_ctx.rs b/src/query/service/src/sessions/query_ctx.rs index efdb79265fa46..4653931bf7457 100644 --- a/src/query/service/src/sessions/query_ctx.rs +++ b/src/query/service/src/sessions/query_ctx.rs @@ -69,11 +69,16 @@ use crate::sessions::ProcessInfo; use crate::sessions::QueryContextShared; use crate::sessions::Session; use crate::sessions::SessionManager; +use crate::sessions::SessionType; use crate::storages::Table; +const MYSQL_VERSION: &str = "8.0.26"; +const CLICKHOUSE_VERSION: &str = "8.12.14"; #[derive(Clone)] pub struct QueryContext { version: String, + mysql_version: String, + clickhouse_version: String, partition_queue: Arc>>, shared: Arc, fragment_id: Arc, @@ -90,6 +95,8 @@ impl QueryContext { Arc::new(QueryContext { partition_queue: Arc::new(RwLock::new(VecDeque::new())), version: format!("DatabendQuery {}", *DATABEND_COMMIT_VERSION), + mysql_version: format!("{}-{}", MYSQL_VERSION, *DATABEND_COMMIT_VERSION), + clickhouse_version: CLICKHOUSE_VERSION.to_string(), shared, fragment_id: Arc::new(AtomicUsize::new(0)), }) @@ -344,7 +351,12 @@ impl TableContext for QueryContext { } fn get_fuse_version(&self) -> String { - self.version.clone() + let session = self.get_current_session(); + match session.get_type() { + SessionType::Clickhouse => self.clickhouse_version.clone(), + SessionType::MySQL => self.mysql_version.clone(), + _ => self.version.clone(), + } } fn get_format_settings(&self) -> Result { From e2c429f479ba66f08d4b7862ada1a40da3b53368 Mon Sep 17 00:00:00 2001 From: wangjili8417 Date: Sun, 12 Mar 2023 16:21:10 +0800 Subject: [PATCH 2/4] fix(functions):fix function version MySQL client --- src/query/service/src/servers/http/clickhouse_federated.rs | 5 ----- src/query/service/src/sessions/query_ctx.rs | 2 +- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/src/query/service/src/servers/http/clickhouse_federated.rs b/src/query/service/src/servers/http/clickhouse_federated.rs index 61c1ecab27103..d0b2ca0d80c8e 100644 --- a/src/query/service/src/servers/http/clickhouse_federated.rs +++ b/src/query/service/src/servers/http/clickhouse_federated.rs @@ -21,11 +21,6 @@ pub struct ClickHouseFederated {} static FORMAT_REGEX: Regex = Regex::new(r".*(?i)FORMAT\s*([[:alpha:]]*)\s*;?$").unwrap(); impl ClickHouseFederated { - // Build block for select function. - // Format: - // |function_name()| - // |value| - pub fn get_format(query: &str) -> Option { match FORMAT_REGEX.captures(query) { Some(x) => x.get(1).map(|s| s.as_str().to_owned()), diff --git a/src/query/service/src/sessions/query_ctx.rs b/src/query/service/src/sessions/query_ctx.rs index 4653931bf7457..d10e18ada6aa2 100644 --- a/src/query/service/src/sessions/query_ctx.rs +++ b/src/query/service/src/sessions/query_ctx.rs @@ -353,7 +353,7 @@ impl TableContext for QueryContext { fn get_fuse_version(&self) -> String { let session = self.get_current_session(); match session.get_type() { - SessionType::Clickhouse => self.clickhouse_version.clone(), + SessionType::ClickHouseHttpHandler => self.clickhouse_version.clone(), SessionType::MySQL => self.mysql_version.clone(), _ => self.version.clone(), } From 86a510eb661225e834a277292ec4e49a4a9c4028 Mon Sep 17 00:00:00 2001 From: wangjili8417 Date: Sun, 12 Mar 2023 20:52:52 +0800 Subject: [PATCH 3/4] fix test --- .../tests/it/servers/mysql/mysql_federated.rs | 14 -------------- .../suites/query/case_sensitivity/query.test | 7 +++++++ 2 files changed, 7 insertions(+), 14 deletions(-) diff --git a/src/query/service/tests/it/servers/mysql/mysql_federated.rs b/src/query/service/tests/it/servers/mysql/mysql_federated.rs index b8b560fe67b67..19d17b235e684 100644 --- a/src/query/service/tests/it/servers/mysql/mysql_federated.rs +++ b/src/query/service/tests/it/servers/mysql/mysql_federated.rs @@ -27,20 +27,6 @@ fn test_mysql_federated() -> Result<()> { assert!(result.is_none()); } - // select version() - { - let query = "select version()"; - let result = federated.check(query); - assert!(result.is_some()); - - if let Some(block) = result { - assert!(!block.1.is_empty()) - } - - let query = "select versiona"; - let result = federated.check(query); - assert!(result.is_none()); - } // variables { diff --git a/tests/sqllogictests/suites/query/case_sensitivity/query.test b/tests/sqllogictests/suites/query/case_sensitivity/query.test index 9c371f3ea183b..277b61ab745cc 100644 --- a/tests/sqllogictests/suites/query/case_sensitivity/query.test +++ b/tests/sqllogictests/suites/query/case_sensitivity/query.test @@ -58,3 +58,10 @@ query I select A.* from (WITH source2 AS (select 1 as e) SELECT * FROM source2) A ---- 1 + +onlyif mysql +query T +select substr(version(), 1, 6); +---- +8.0.26 + From 67a2a161ff34f2842968eb2914e278d879573a90 Mon Sep 17 00:00:00 2001 From: wangjili8417 Date: Sun, 12 Mar 2023 22:43:09 +0800 Subject: [PATCH 4/4] fix test --- src/query/service/tests/it/servers/mysql/mysql_federated.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/query/service/tests/it/servers/mysql/mysql_federated.rs b/src/query/service/tests/it/servers/mysql/mysql_federated.rs index 19d17b235e684..f6bb7e3dae7fe 100644 --- a/src/query/service/tests/it/servers/mysql/mysql_federated.rs +++ b/src/query/service/tests/it/servers/mysql/mysql_federated.rs @@ -27,7 +27,6 @@ fn test_mysql_federated() -> Result<()> { assert!(result.is_none()); } - // variables { let query = "select @@tx_isolation, @@session.tx_isolation";