mirror of
https://github.com/GreptimeTeam/greptimedb.git
synced 2026-05-27 02:10:38 +00:00
feat: allow multiple sql statements in query string (#699)
* feat: allow multiple sql statement in query string * test: add a test for multiple statement call * feat: add temprary workaround for standalone mode * fix: resolve sql parser issue temporarily * Update src/datanode/src/instance/sql.rs Co-authored-by: Yingwen <realevenyag@gmail.com> * fix: adopt new sql handler * refactor: revert changes in query engine * refactor: assume sql-statement 1-1 on datanode * test: use frontend for integration test * refactor: add statement execution api for explicit single statement call * fix: typo * refactor: rename query method * test: add test case for error * test: data type change adoption * chore: add todo from review * chore: remove obsolete comments * fix: resolve resolve issues Co-authored-by: Yingwen <realevenyag@gmail.com>
This commit is contained in:
@@ -33,7 +33,7 @@ use common_telemetry::timer;
|
||||
use datafusion::physical_plan::coalesce_partitions::CoalescePartitionsExec;
|
||||
use datafusion::physical_plan::ExecutionPlan;
|
||||
use session::context::QueryContextRef;
|
||||
use snafu::{OptionExt, ResultExt};
|
||||
use snafu::{ensure, OptionExt, ResultExt};
|
||||
use sql::dialect::GenericDialect;
|
||||
use sql::parser::ParserContext;
|
||||
use sql::statements::statement::Statement;
|
||||
@@ -72,8 +72,7 @@ impl QueryEngine for DatafusionQueryEngine {
|
||||
fn sql_to_statement(&self, sql: &str) -> Result<Statement> {
|
||||
let mut statement = ParserContext::create_with_dialect(sql, &GenericDialect {})
|
||||
.context(error::ParseSqlSnafu)?;
|
||||
// TODO(dennis): supports multi statement in one sql?
|
||||
assert!(1 == statement.len());
|
||||
ensure!(1 == statement.len(), error::MultipleStatementsSnafu { sql });
|
||||
Ok(statement.remove(0))
|
||||
}
|
||||
|
||||
@@ -280,6 +279,7 @@ mod tests {
|
||||
.sql_to_plan(sql, Arc::new(QueryContext::new()))
|
||||
.unwrap();
|
||||
|
||||
// TODO(sunng87): do not rely on to_string for compare
|
||||
assert_eq!(
|
||||
format!("{:?}", plan),
|
||||
r#"DfPlan(Limit: skip=0, fetch=20
|
||||
@@ -297,6 +297,7 @@ mod tests {
|
||||
let plan = engine
|
||||
.sql_to_plan(sql, Arc::new(QueryContext::new()))
|
||||
.unwrap();
|
||||
|
||||
let output = engine.execute(&plan).await.unwrap();
|
||||
|
||||
match output {
|
||||
|
||||
@@ -40,6 +40,9 @@ pub enum InnerError {
|
||||
source: sql::error::Error,
|
||||
},
|
||||
|
||||
#[snafu(display("The SQL string has multiple statements, sql: {}", sql))]
|
||||
MultipleStatements { sql: String, backtrace: Backtrace },
|
||||
|
||||
#[snafu(display("Cannot plan SQL: {}, source: {}", sql, source))]
|
||||
PlanSql {
|
||||
sql: String,
|
||||
@@ -90,6 +93,7 @@ impl ErrorExt for InnerError {
|
||||
PlanSql { .. } => StatusCode::PlanQuery,
|
||||
ConvertDfRecordBatchStream { source } => source.status_code(),
|
||||
ExecutePhysicalPlan { source } => source.status_code(),
|
||||
MultipleStatements { .. } => StatusCode::InvalidArguments,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user