diff --git a/benches/engine.rs b/benches/engine.rs
index b4ea51dc6b3d89c7419f77bc6f315811fd037d9c..99aaa109cce9d51d2f8f786f6ea0ee0b4f7d6909 100644
--- a/benches/engine.rs
+++ b/benches/engine.rs
@@ -422,6 +422,10 @@ impl Coordinator for RouterRuntimeMock {
         Ok(Box::new(result))
     }
 
+    fn explain_format(&self, explain: String) -> Result<Box<dyn Any>, QueryPlannerError> {
+        Ok(Box::new(explain))
+    }
+
     fn extract_sharding_keys_from_map<'engine, 'rec>(
         &'engine self,
         space: String,
diff --git a/cartridge/roles/sbroad-router.lua b/cartridge/roles/sbroad-router.lua
index 6f0b62ba843823f2cf24f9500f983dc515e57fb4..6f9956a34c3a9df0691567f3557b8f74e97e90e7 100644
--- a/cartridge/roles/sbroad-router.lua
+++ b/cartridge/roles/sbroad-router.lua
@@ -7,7 +7,6 @@ local function init(opts) -- luacheck: no unused args
     end
 
     _G.sbroad.calculate_bucket_id = sbroad_router.calculate_bucket_id
-    _G.sbroad.explain = sbroad_router.explain
     _G.sbroad.execute = sbroad_router.execute
     _G.sbroad.trace = sbroad_router.trace
 
diff --git a/src/api.rs b/src/api.rs
index 4ded46305aa211b94c8903a188447fce02776e6e..c22ec750985f02cf6b8a49cc033703697fcc88b0 100644
--- a/src/api.rs
+++ b/src/api.rs
@@ -7,6 +7,5 @@ thread_local!(static SEGMENT_ENGINE: RefCell<StorageRuntime> = RefCell::new(Stor
 
 pub mod calculate_bucket_id;
 pub mod exec_query;
-pub mod explain;
 mod helper;
 pub mod invalidate_cached_schema;
diff --git a/src/api/explain.rs b/src/api/explain.rs
deleted file mode 100644
index 67b9966e0b8a41342efb13a59f28c23187aed799..0000000000000000000000000000000000000000
--- a/src/api/explain.rs
+++ /dev/null
@@ -1,68 +0,0 @@
-use std::os::raw::c_int;
-
-use serde::{Deserialize, Serialize};
-use tarantool::tuple::{FunctionArgs, FunctionCtx, Tuple};
-
-use crate::api::helper::load_config;
-use crate::api::COORDINATOR_ENGINE;
-use crate::error;
-use crate::errors::QueryPlannerError;
-use crate::executor::Query;
-use crate::log::tarantool_error;
-
-#[derive(Serialize, Deserialize)]
-/// Lua function params
-struct Args {
-    /// Target sql query
-    query: String,
-}
-
-impl TryFrom<FunctionArgs> for Args {
-    type Error = QueryPlannerError;
-
-    fn try_from(value: FunctionArgs) -> Result<Self, Self::Error> {
-        Tuple::from(value)
-            .decode::<Args>()
-            .map_err(|e| QueryPlannerError::CustomError(format!("Parsing args error: {:?}", e)))
-    }
-}
-
-/// Print query explain.
-#[no_mangle]
-pub extern "C" fn explain(ctx: FunctionCtx, args: FunctionArgs) -> c_int {
-    let lua_params = match Args::try_from(args) {
-        Ok(param) => param,
-        Err(e) => return tarantool_error(&e.to_string()),
-    };
-
-    let ret_code = load_config(&COORDINATOR_ENGINE);
-    if ret_code != 0 {
-        return ret_code;
-    }
-    COORDINATOR_ENGINE.with(|engine| {
-        let runtime = match engine.try_borrow() {
-            Ok(runtime) => runtime,
-            Err(e) => {
-                return tarantool_error(&format!(
-                    "Failed to borrow runtime while explaining the query: {}",
-                    e
-                ));
-            }
-        };
-        let query = match Query::new(&*runtime, &lua_params.query, vec![]) {
-            Ok(q) => q,
-            Err(e) => {
-                error!(Option::from("explain"), &format!("{:?}", e));
-                return tarantool_error(&e.to_string());
-            }
-        };
-
-        match query.explain() {
-            Ok(q) => {
-                ctx.return_mp(&q).unwrap();
-                0
-            }
-            Err(e) => tarantool_error(&e.to_string()),
-        }
-    })
-}
diff --git a/src/executor.rs b/src/executor.rs
index 9b42c88cc2519d182de00de3fc295ef8545f0bd8..14a455179bf9f8d4bab5406d523ccd25b8961ca9 100644
--- a/src/executor.rs
+++ b/src/executor.rs
@@ -72,6 +72,8 @@ pub struct Query<'a, C>
 where
     C: Coordinator,
 {
+    /// Explain flag
+    is_explain: bool,
     /// Execution plan
     exec_plan: ExecutionPlan,
     /// Coordinator runtime
@@ -117,6 +119,7 @@ where
         plan.bind_params(params)?;
         plan.optimize()?;
         let query = Query {
+            is_explain: plan.is_expain(),
             exec_plan: ExecutionPlan::from(plan),
             coordinator,
             bucket_map: HashMap::new(),
@@ -145,6 +148,10 @@ where
     /// - Failed to get plan top.
     #[otm_child_span("query.dispatch")]
     pub fn dispatch(&mut self) -> Result<Box<dyn Any>, QueryPlannerError> {
+        if self.is_explain() {
+            return self.coordinator.explain_format(self.to_explain()?);
+        }
+
         let slices = self.exec_plan.get_ir_plan().clone_slices();
         if let Some(slices) = slices {
             for slice in slices {
@@ -281,9 +288,14 @@ where
     ///
     /// # Errors
     /// - Failed to build explain
-    pub fn explain(&self) -> Result<String, QueryPlannerError> {
+    pub fn to_explain(&self) -> Result<String, QueryPlannerError> {
         self.exec_plan.get_ir_plan().as_explain()
     }
+
+    /// Checks that query is explain and have not to be executed
+    fn is_explain(&self) -> bool {
+        self.is_explain
+    }
 }
 
 #[cfg(test)]
diff --git a/src/executor/engine.rs b/src/executor/engine.rs
index eb2f5e4a55eb5f512d2505bb8a8eb9bba5bedc46..8b4c8ce113d138c8fefb4a243893ebec3084450c 100644
--- a/src/executor/engine.rs
+++ b/src/executor/engine.rs
@@ -117,6 +117,12 @@ pub trait Coordinator: Configuration {
         buckets: &Buckets,
     ) -> Result<Box<dyn Any>, QueryPlannerError>;
 
+    /// Setup output format of query explain
+    ///
+    /// # Errors
+    /// - internal executor errors
+    fn explain_format(&self, explain: String) -> Result<Box<dyn Any>, QueryPlannerError>;
+
     /// Extract a list of the sharding keys from a map for the given space.
     ///
     /// # Errors
diff --git a/src/executor/engine/cartridge/router.rs b/src/executor/engine/cartridge/router.rs
index 96afa0657572270a116f3074cde0e5d845ec3418..a142b0b442052ba9ccfcda6adf44fa28d5b36104 100644
--- a/src/executor/engine/cartridge/router.rs
+++ b/src/executor/engine/cartridge/router.rs
@@ -232,6 +232,18 @@ impl Coordinator for RouterRuntime {
         self.exec_on_all(&pattern_with_params, is_data_modifier)
     }
 
+    fn explain_format(&self, explain: String) -> Result<Box<dyn Any>, QueryPlannerError> {
+        let e = explain.lines().collect::<Vec<&str>>();
+
+        match Tuple::new(&vec![e]) {
+            Ok(t) => Ok(Box::new(t)),
+            Err(e) => Err(QueryPlannerError::CustomError(format!(
+                "Tuple creation error: {}",
+                e
+            ))),
+        }
+    }
+
     /// Transform sub query results into a virtual table.
     #[otm_child_span("query.motion.materialize")]
     fn materialize_motion(
diff --git a/src/executor/engine/mock.rs b/src/executor/engine/mock.rs
index dbbdc6e8b49cd5394c35b11b6505fb62fb3ba25d..54014e48b51fcd6825e86d5443faa7b76d6f577b 100644
--- a/src/executor/engine/mock.rs
+++ b/src/executor/engine/mock.rs
@@ -300,6 +300,10 @@ impl Coordinator for RouterRuntimeMock {
         Ok(Box::new(result))
     }
 
+    fn explain_format(&self, explain: String) -> Result<Box<dyn Any>, QueryPlannerError> {
+        Ok(Box::new(explain))
+    }
+
     fn extract_sharding_keys_from_map<'engine, 'rec>(
         &'engine self,
         space: String,
diff --git a/src/executor/tests/frontend.rs b/src/executor/tests/frontend.rs
index 2c7242bc16a733034fbbdc4aea42787bd85d67da..9fd5f9c1c5b2e316824705b12114ca62a9cacd1f 100644
--- a/src/executor/tests/frontend.rs
+++ b/src/executor/tests/frontend.rs
@@ -70,3 +70,48 @@ fn front_invalid_sql4() {
         plan_err
     );
 }
+
+#[test]
+fn front_explain_select_sql1() {
+    let sql = r#"EXPLAIN SELECT "t"."identification_number" as "c1", "product_code" FROM "hash_testing" as "t""#;
+
+    let metadata = &RouterRuntimeMock::new();
+    let mut query = Query::new(metadata, sql, vec![]).unwrap();
+
+    let expected_explain = String::from(
+        r#"projection ("t"."identification_number" -> "c1", "t"."product_code" -> "product_code")
+    scan "hash_testing" -> "t"
+"#,
+    );
+
+    if let Ok(actual_explain) = query.dispatch().unwrap().downcast::<String>() {
+        assert_eq!(expected_explain, *actual_explain);
+    } else {
+        panic!("Explain must be string")
+    }
+}
+
+#[test]
+fn front_explain_select_sql2() {
+    let sql = r#"EXPLAIN SELECT "t"."identification_number" as "c1", "product_code" FROM "hash_testing" as "t"
+        UNION ALL
+        SELECT "t2"."identification_number", "product_code" FROM "hash_testing_hist" as "t2""#;
+
+    let metadata = &RouterRuntimeMock::new();
+    let mut query = Query::new(metadata, sql, vec![]).unwrap();
+
+    let expected_explain = format!(
+        "{}\n{}\n{}\n{}\n{}\n",
+        r#"union all"#,
+        r#"    projection ("t"."identification_number" -> "c1", "t"."product_code" -> "product_code")"#,
+        r#"        scan "hash_testing" -> "t""#,
+        r#"    projection ("t2"."identification_number" -> "identification_number", "t2"."product_code" -> "product_code")"#,
+        r#"        scan "hash_testing_hist" -> "t2""#,
+    );
+
+    if let Ok(actual_explain) = query.dispatch().unwrap().downcast::<String>() {
+        assert_eq!(expected_explain, *actual_explain);
+    } else {
+        panic!("Explain must be string")
+    }
+}
diff --git a/src/frontend/sql.rs b/src/frontend/sql.rs
index 35a310a630ebd5420695c26f969b57406b98a124..9b1f2848e7f801c84aa0eefc115d6159017c4864 100644
--- a/src/frontend/sql.rs
+++ b/src/frontend/sql.rs
@@ -729,6 +729,14 @@ impl Ast for AbstractSyntaxTree {
                     };
                     map.add(*id, plan_insert_id);
                 }
+                Type::Explain => {
+                    plan.mark_as_explain();
+
+                    let ast_child_id = node.children.first().ok_or_else(|| {
+                        QueryPlannerError::CustomError("Explain has no children.".into())
+                    })?;
+                    map.add(0, map.get(*ast_child_id)?);
+                }
                 Type::AliasName
                 | Type::ColumnName
                 | Type::ScanName
diff --git a/src/frontend/sql/ast.rs b/src/frontend/sql/ast.rs
index c25ddb70c38beb551f72a8b4422078152304c487..573464d87d587409dcc40477161a25135bc2dd7e 100644
--- a/src/frontend/sql/ast.rs
+++ b/src/frontend/sql/ast.rs
@@ -36,6 +36,7 @@ pub enum Type {
     Double,
     Eq,
     Except,
+    Explain,
     False,
     Gt,
     GtEq,
@@ -91,6 +92,7 @@ impl Type {
             Rule::Double => Ok(Type::Double),
             Rule::Eq => Ok(Type::Eq),
             Rule::Except => Ok(Type::Except),
+            Rule::Explain => Ok(Type::Explain),
             Rule::False => Ok(Type::False),
             Rule::Gt => Ok(Type::Gt),
             Rule::GtEq => Ok(Type::GtEq),
diff --git a/src/frontend/sql/ir.rs b/src/frontend/sql/ir.rs
index 2456a5128f3140571ee3fa7e31cdf51776d0d240..4d943ecf3133b512695aeebfa0b6c554b069da87 100644
--- a/src/frontend/sql/ir.rs
+++ b/src/frontend/sql/ir.rs
@@ -111,9 +111,10 @@ impl Translation {
 
     pub(super) fn get(&self, old: usize) -> Result<usize, QueryPlannerError> {
         self.map.get(&old).copied().ok_or_else(|| {
-            QueryPlannerError::CustomError(
-                "Could not find parse node in translation map".to_string(),
-            )
+            QueryPlannerError::CustomError(format!(
+                "Could not find parse node [{}] in translation map",
+                old
+            ))
         })
     }
 }
diff --git a/src/frontend/sql/query.pest b/src/frontend/sql/query.pest
index cd74e2ed33699a0bcf013f8a0e0e0b7df4aaba4a..49658ad558cb37e7a5ce10ba63f9767b56e06627 100644
--- a/src/frontend/sql/query.pest
+++ b/src/frontend/sql/query.pest
@@ -1,4 +1,7 @@
-Command = _{ SOI ~ Query ~ EOF }
+Command = _{ SOI ~ (ExplainQuery | Query) ~ EOF }
+
+ExplainQuery = _{ Explain }
+    Explain = { ^"explain" ~ Query }
 
 Query = _{ Except | UnionAll | Select | Values | Insert }
     Select = {
diff --git a/src/ir.rs b/src/ir.rs
index b7686b147f8c244489d4ad768cc5fc521d403cae..b77a02c444aa29094e69fff4be2b9b163e55cd17 100644
--- a/src/ir.rs
+++ b/src/ir.rs
@@ -107,6 +107,9 @@ pub struct Plan {
     /// We build the plan tree in a bottom-up manner, so the top would
     /// be added last. The plan without a top should be treated as invalid.
     top: Option<usize>,
+    /// The flag is enabled if user wants to get a query plan only.
+    /// In this case we don't need to execute query
+    is_explain: bool,
 }
 
 impl Default for Plan {
@@ -160,6 +163,7 @@ impl Plan {
             relations: None,
             slices: None,
             top: None,
+            is_explain: false,
         }
     }
 
@@ -312,6 +316,17 @@ impl Plan {
         param_set
     }
 
+    /// Marks plan as query explain
+    pub fn mark_as_explain(&mut self) {
+        self.is_explain = true;
+    }
+
+    /// Checks that plan is explain query
+    #[must_use]
+    pub fn is_expain(&self) -> bool {
+        self.is_explain
+    }
+
     /// Set top node of plan
     /// # Errors
     /// - top node doesn't exist in the plan.
diff --git a/src/router.lua b/src/router.lua
index ac5f414e650d9afc62a6feba6994afb0c5a83b1c..8bf48746d6ed329b9979e1d5afcca1a05d000c26 100644
--- a/src/router.lua
+++ b/src/router.lua
@@ -217,11 +217,6 @@ local function init()
         'libsbroad.dispatch_query',
         { if_not_exists = true, language = 'C' }
     )
-
-    box.schema.func.create(
-        'libsbroad.explain',
-        { if_not_exists = true, language = 'C' }
-    )
 end
 
 local function calculate_bucket_id(values, space_name) -- luacheck: no unused args
@@ -252,26 +247,6 @@ local function calculate_bucket_id(values, space_name) -- luacheck: no unused ar
     return result
 end
 
-
-local function explain(query)
-    local has_err, res = pcall(
-        function()
-            return box.func["libsbroad.explain"]:call({ query })
-        end
-    )
-
-    if has_err == false then
-        return nil, res
-    end
-
-    local res_lines = {}
-    for line in res:gmatch("[^\r\n]+") do
-        table.insert(res_lines, line)
-    end
-
-    return res_lines, nil
-end
-
 local function invalidate_cache ()
     box.func["libsbroad.invalidate_coordinator_cache"]:call({})
 end
@@ -295,7 +270,6 @@ local function execute(query, params)
 end
 
 return {
-    explain = explain,
     init=init,
     invalidate_cache = invalidate_cache,
     execute = execute,
diff --git a/test_app/test/integration/api_test.lua b/test_app/test/integration/api_test.lua
index 2b65b9e839506cbe850231be01c29a4bfdce8e49..5e724b2623ce3890fc39a0b87e7ae0b382706cfd 100644
--- a/test_app/test/integration/api_test.lua
+++ b/test_app/test/integration/api_test.lua
@@ -780,8 +780,8 @@ end
 g.test_motion_explain = function()
     local api = cluster:server("api-1").net_box
 
-    local r, err = api:call("sbroad.explain", { [[SELECT "id", "name" FROM "testing_space"
-    WHERE "id" in (SELECT "id" FROM "space_simple_shard_key_hist" WHERE "sysOp" < 0)]] })
+    local r, err = api:call("sbroad.execute", { [[EXPLAIN SELECT "id", "name" FROM "testing_space"
+    WHERE "id" in (SELECT "id" FROM "space_simple_shard_key_hist" WHERE "sysOp" < 0)]], {} })
     t.assert_equals(err, nil)
     t.assert_equals(
         r,
@@ -802,7 +802,7 @@ end
 g.test_join_explain = function()
     local api = cluster:server("api-1").net_box
 
-    local r, err = api:call("sbroad.explain", { [[SELECT *
+    local r, err = api:call("sbroad.execute", { [[EXPLAIN SELECT *
 FROM
     (SELECT "id", "name" FROM "space_simple_shard_key" WHERE "sysOp" < 1
      UNION ALL
@@ -810,7 +810,7 @@ FROM
 INNER JOIN
     (SELECT "id" as "tid"  FROM "testing_space" where "id" <> 1) AS "t8"
     ON "t3"."id" = "t8"."tid"
-WHERE "t3"."name" = '123']] })
+WHERE "t3"."name" = '123']], {} })
     t.assert_equals(err, nil)
     t.assert_equals(
         r,
@@ -839,12 +839,12 @@ end
 g.test_valid_explain = function()
     local api = cluster:server("api-1").net_box
 
-    local r, err = api:call("sbroad.explain", { [[SELECT * FROM (
+    local r, err = api:call("sbroad.execute", { [[EXPLAIN SELECT * FROM (
             SELECT "id", "name" FROM "space_simple_shard_key" WHERE "sysOp" < 0
             UNION ALL
             SELECT "id", "name" FROM "space_simple_shard_key_hist" WHERE "sysOp" > 0
         ) as "t1"
-        WHERE "id" = 1 ]] })
+        WHERE "id" = 1]], {} })
 
     t.assert_equals(err, nil)
     t.assert_equals(
diff --git a/tests/artifactory/backend/sql/tree/sql_order_selection.yaml b/tests/artifactory/backend/sql/tree/sql_order_selection.yaml
index b665225106605ff2ce6e0adaa270a927db2bd34e..19a2aa7daeef5e5f459f520980b57febe9a0e67e 100644
--- a/tests/artifactory/backend/sql/tree/sql_order_selection.yaml
+++ b/tests/artifactory/backend/sql/tree/sql_order_selection.yaml
@@ -112,3 +112,4 @@ relations:
     name: t
 slices: ~
 top: 16
+is_explain: false
diff --git a/tests/artifactory/ir/distribution/join_unite_keys.yaml b/tests/artifactory/ir/distribution/join_unite_keys.yaml
index b92f37b347fa353b3470fd9223808b91bb76fbd6..b1ac3d0077e06e447beb9e9321be7d4808625275 100644
--- a/tests/artifactory/ir/distribution/join_unite_keys.yaml
+++ b/tests/artifactory/ir/distribution/join_unite_keys.yaml
@@ -170,3 +170,4 @@ relations:
     name: t1
 slices: ~
 top: 28
+is_explain: false
diff --git a/tests/artifactory/ir/distribution/shrink_dist_key_1.yaml b/tests/artifactory/ir/distribution/shrink_dist_key_1.yaml
index 56f61733d9cf3afe2fab351b1b154a52914199b7..0646bb3bf3b0e7ae4461aa47063be71e55f424af 100644
--- a/tests/artifactory/ir/distribution/shrink_dist_key_1.yaml
+++ b/tests/artifactory/ir/distribution/shrink_dist_key_1.yaml
@@ -98,3 +98,4 @@ relations:
     name: t
 slices: ~
 top: 15
+is_explain: false
diff --git a/tests/artifactory/ir/distribution/shrink_dist_key_2.yaml b/tests/artifactory/ir/distribution/shrink_dist_key_2.yaml
index d90961f0fe34f3528797ca54be71708da4c10b12..82494146138c4e242088b64d849b7fe0c2a4f3d0 100644
--- a/tests/artifactory/ir/distribution/shrink_dist_key_2.yaml
+++ b/tests/artifactory/ir/distribution/shrink_dist_key_2.yaml
@@ -87,3 +87,4 @@ relations:
     name: t
 slices: ~
 top: 13
+is_explain: false
diff --git a/tests/artifactory/ir/distribution/shuffle_dist_key.yaml b/tests/artifactory/ir/distribution/shuffle_dist_key.yaml
index 0cda2266f7f2bf1361cbc9509718d8822e18c1b4..d2f81b5ca91593638c6e68dec69b5cc479a92d8f 100644
--- a/tests/artifactory/ir/distribution/shuffle_dist_key.yaml
+++ b/tests/artifactory/ir/distribution/shuffle_dist_key.yaml
@@ -98,3 +98,4 @@ relations:
     name: t
 slices: ~
 top: 15
+is_explain: false
diff --git a/tests/artifactory/ir/distribution/union_fallback_to_random.yaml b/tests/artifactory/ir/distribution/union_fallback_to_random.yaml
index ce2668b222861068fa15b04f104004a46fe00100..e10eccccdd87bb494eb81b58493d4c58e4f71e7c 100644
--- a/tests/artifactory/ir/distribution/union_fallback_to_random.yaml
+++ b/tests/artifactory/ir/distribution/union_fallback_to_random.yaml
@@ -114,3 +114,4 @@ relations:
     name: t2
 slices: ~
 top: 17
+is_explain: false
diff --git a/tests/artifactory/ir/distribution/union_preserve_dist.yaml b/tests/artifactory/ir/distribution/union_preserve_dist.yaml
index aa106e212f3fc182d9d821034cac604ee367f960..60ae5e3b6af972c0226ca3c8a5f8f4670d53df0c 100644
--- a/tests/artifactory/ir/distribution/union_preserve_dist.yaml
+++ b/tests/artifactory/ir/distribution/union_preserve_dist.yaml
@@ -114,3 +114,4 @@ relations:
     name: t2
 slices: ~
 top: 17
+is_explain: false
diff --git a/tests/artifactory/ir/operator/join.yaml b/tests/artifactory/ir/operator/join.yaml
index b92f37b347fa353b3470fd9223808b91bb76fbd6..b1ac3d0077e06e447beb9e9321be7d4808625275 100644
--- a/tests/artifactory/ir/operator/join.yaml
+++ b/tests/artifactory/ir/operator/join.yaml
@@ -170,3 +170,4 @@ relations:
     name: t1
 slices: ~
 top: 28
+is_explain: false
diff --git a/tests/artifactory/ir/operator/projection.yaml b/tests/artifactory/ir/operator/projection.yaml
index 03906c635f0fd72a5d24cd815423b891d7f3dc18..965a3d0c2aa87159fd07202d9a62364f74aab784 100644
--- a/tests/artifactory/ir/operator/projection.yaml
+++ b/tests/artifactory/ir/operator/projection.yaml
@@ -73,3 +73,4 @@ relations:
     name: t
 slices: ~
 top: 9
+is_explain: false
diff --git a/tests/artifactory/ir/operator/scan_rel.yaml b/tests/artifactory/ir/operator/scan_rel.yaml
index 110fac5fa21836c7b5458ff7078459308bdd4b37..314dc8b09ff502dffb40b681445ee9107251a692 100644
--- a/tests/artifactory/ir/operator/scan_rel.yaml
+++ b/tests/artifactory/ir/operator/scan_rel.yaml
@@ -72,3 +72,4 @@ relations:
     name: t
 slices: ~
 top: 9
+is_explain: false
diff --git a/tests/artifactory/ir/operator/selection.yaml b/tests/artifactory/ir/operator/selection.yaml
index d831a24cc8504559e88df17eee8c5846186d24c3..dafbec9d8d734b1b626725aece3f48c9c36a4e73 100644
--- a/tests/artifactory/ir/operator/selection.yaml
+++ b/tests/artifactory/ir/operator/selection.yaml
@@ -148,3 +148,4 @@ relations:
     name: t
 slices: ~
 top: 23
+is_explain: false
diff --git a/tests/artifactory/ir/operator/selection_with_sub_query.yaml b/tests/artifactory/ir/operator/selection_with_sub_query.yaml
index 929ed29eedaf48865f24ae7949b8d605a4330c09..323c7fce30f77a469b4c10495a0102a10974d3bd 100644
--- a/tests/artifactory/ir/operator/selection_with_sub_query.yaml
+++ b/tests/artifactory/ir/operator/selection_with_sub_query.yaml
@@ -149,3 +149,4 @@ relations:
     name: t2
 slices: ~
 top: 24
+is_explain: false
diff --git a/tests/artifactory/ir/operator/sub_query.yaml b/tests/artifactory/ir/operator/sub_query.yaml
index 728a05bfed9f5e6c09d2a30660895e1dcc2b1879..60b9c0588381157959fe24af234ddb8b89d7ff11 100644
--- a/tests/artifactory/ir/operator/sub_query.yaml
+++ b/tests/artifactory/ir/operator/sub_query.yaml
@@ -81,3 +81,4 @@ relations:
     name: t
 slices: ~
 top: 11
+is_explain: false
diff --git a/tests/artifactory/ir/plan_no_top.yaml b/tests/artifactory/ir/plan_no_top.yaml
index 67afa8eac421cf3abbb436f49aa6cecb7a22a06f..bb091a3b4fc9658dc5e9e6f153f9f525c16baf48 100644
--- a/tests/artifactory/ir/plan_no_top.yaml
+++ b/tests/artifactory/ir/plan_no_top.yaml
@@ -34,3 +34,4 @@ relations:
     name: t
 slices: ~
 top: ~
+is_explain: false
diff --git a/tests/artifactory/ir/plan_oor_top.yaml b/tests/artifactory/ir/plan_oor_top.yaml
index 0ffb626f1214cda1c40160115eb98084854aeba9..652b2be063343c5c8f27efe54bf973fa22f8769a 100644
--- a/tests/artifactory/ir/plan_oor_top.yaml
+++ b/tests/artifactory/ir/plan_oor_top.yaml
@@ -34,3 +34,4 @@ relations:
     name: t
 slices: ~
 top: 42
+is_explain: false
diff --git a/tests/artifactory/ir/transformation/redistribution/full_motion_less_for_sub_query.yaml b/tests/artifactory/ir/transformation/redistribution/full_motion_less_for_sub_query.yaml
index d65848c3597bf41282032c8bd5856ff673fc476c..7e7ab85177d06ec372c788ddda6e28355d725bcb 100644
--- a/tests/artifactory/ir/transformation/redistribution/full_motion_less_for_sub_query.yaml
+++ b/tests/artifactory/ir/transformation/redistribution/full_motion_less_for_sub_query.yaml
@@ -198,3 +198,4 @@ slices:
   - 
      - 30
 top: 26
+is_explain: false
diff --git a/tests/artifactory/ir/transformation/redistribution/full_motion_non_segment_outer_for_sub_query.yaml b/tests/artifactory/ir/transformation/redistribution/full_motion_non_segment_outer_for_sub_query.yaml
index 68a99daa2d49a467838826a707438b8fab635c7c..ddac69bf957cad7183dcb872d2e96e1e2191a874 100644
--- a/tests/artifactory/ir/transformation/redistribution/full_motion_non_segment_outer_for_sub_query.yaml
+++ b/tests/artifactory/ir/transformation/redistribution/full_motion_non_segment_outer_for_sub_query.yaml
@@ -217,3 +217,4 @@ slices:
   -
     - 32
 top: 28
+is_explain: false
diff --git a/tests/artifactory/ir/transformation/redistribution/local_sub_query.yaml b/tests/artifactory/ir/transformation/redistribution/local_sub_query.yaml
index 9bf9e58f6908f61045e4d5bd63c6064e23330712..c7fda607c315f77c9d62b4b99687da451a6f4de9 100644
--- a/tests/artifactory/ir/transformation/redistribution/local_sub_query.yaml
+++ b/tests/artifactory/ir/transformation/redistribution/local_sub_query.yaml
@@ -174,3 +174,4 @@ relations:
     name: t2
 slices: ~
 top: 24
+is_explain: false
diff --git a/tests/artifactory/ir/transformation/redistribution/multiple_sub_queries.yaml b/tests/artifactory/ir/transformation/redistribution/multiple_sub_queries.yaml
index 712c409c6d94349a4c2bc858d9f89003862e9a59..138593e3ab48c82b3034a71f736e78d4d36ec3c1 100644
--- a/tests/artifactory/ir/transformation/redistribution/multiple_sub_queries.yaml
+++ b/tests/artifactory/ir/transformation/redistribution/multiple_sub_queries.yaml
@@ -346,3 +346,4 @@ slices:
   - - 50
     - 54
 top: 46
+is_explain: false
diff --git a/tests/artifactory/ir/transformation/redistribution/segment_motion_for_sub_query.yaml b/tests/artifactory/ir/transformation/redistribution/segment_motion_for_sub_query.yaml
index 5be1c36c5b406804152a4bb5346827a203aeafca..bd8470931001d8df6445cf90379759c89869deb7 100644
--- a/tests/artifactory/ir/transformation/redistribution/segment_motion_for_sub_query.yaml
+++ b/tests/artifactory/ir/transformation/redistribution/segment_motion_for_sub_query.yaml
@@ -205,3 +205,4 @@ slices:
   -
     - 30
 top: 26
+is_explain: false