diff --git a/src/frontend/src/instance.rs b/src/frontend/src/instance.rs index 3743a5e84d..e1a4236159 100644 --- a/src/frontend/src/instance.rs +++ b/src/frontend/src/instance.rs @@ -383,6 +383,13 @@ impl SqlQueryHandler for Instance { .and_then(|stmts| query_interceptor.post_parsing(stmts, query_ctx.clone())) { Ok(stmts) => { + if stmts.is_empty() { + return vec![InvalidSqlSnafu { + err_msg: "empty statements", + } + .fail()]; + } + let mut results = Vec::with_capacity(stmts.len()); for stmt in stmts { if let Err(e) = checker diff --git a/tests-integration/tests/sql.rs b/tests-integration/tests/sql.rs index 8cc9f80dd5..e975882bbc 100644 --- a/tests-integration/tests/sql.rs +++ b/tests-integration/tests/sql.rs @@ -152,6 +152,16 @@ pub async fn test_mysql_stmts(store_type: StorageType) { conn.execute("SET TRANSACTION READ ONLY").await.unwrap(); + // empty statements + let err = conn.execute(" ------- ;").await.unwrap_err(); + assert!(err.to_string().contains("empty statements")); + let err = conn.execute("----------\n;").await.unwrap_err(); + assert!(err.to_string().contains("empty statements")); + let err = conn.execute(" ;").await.unwrap_err(); + assert!(err.to_string().contains("empty statements")); + let err = conn.execute(" \n ;").await.unwrap_err(); + assert!(err.to_string().contains("empty statements")); + let _ = fe_mysql_server.shutdown().await; guard.remove_all().await; }