diff --git a/CHANGELOG.md b/CHANGELOG.md
index e96957d2035764d2731c0fa627e0890cdf0d9ca7..72ef7717420fbebedd1dcd91e9410d287e939364 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -12,6 +12,8 @@ with the `YY.0M.MICRO` scheme.
 
 ### Features
 
+- _Clusterwide SQL_ now availiable via `\set language sql` in interactive console.
+
 - Allow specifying `picodata connect [user@][host][:port]` format. It
   overrides the `--user` option.
 
@@ -46,7 +48,7 @@ with the `YY.0M.MICRO` scheme.
 
 - Update `pico.LUA_API_VERSION`: `1.0.0` -> `2.2.0`
 - New semantics of `pico.create_space()`. It's idempotent now.
-- `pico.create_space()` has new optional parameter: `engine`. 
+- `pico.create_space()` has new optional parameter: `engine`.
   Note: global spaces can only have memtx engine.
 - Add `pico.drop_space()`
 - Add `pico.create_user()`, `pico.drop_user()`
diff --git a/src/lib.rs b/src/lib.rs
index b543ad89ba6debb4dfb66115eaba47364207f15d..95b33208f2fc0967e1afd211758ede24f6aa11c6 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -243,6 +243,17 @@ fn set_console_prompt() {
     .expect("setting prompt should never fail")
 }
 
+fn redirect_interactive_sql() {
+    tarantool::exec(
+        r#"
+        local console = require('console')
+        assert(pico.sql)
+        console.set_sql_executor(pico.sql)
+        "#,
+    )
+    .expect("overriding sql executor shouldn't fail")
+}
+
 #[allow(clippy::enum_variant_names)]
 #[derive(Debug, Serialize, Deserialize)]
 pub enum Entrypoint {
@@ -285,6 +296,7 @@ fn init_common(args: &args::Run, cfg: &tarantool::Cfg) -> (Clusterwide, RaftSpac
     init_sbroad();
 
     set_console_prompt();
+    redirect_interactive_sql();
     init_handlers();
     traft::event::init();
 
diff --git a/tarantool-sys b/tarantool-sys
index d148e51958d2fb07daeeb9f1431e7756a84303e0..23fb9d4fe53631b360a94abca0d875b51aeea5a7 160000
--- a/tarantool-sys
+++ b/tarantool-sys
@@ -1 +1 @@
-Subproject commit d148e51958d2fb07daeeb9f1431e7756a84303e0
+Subproject commit 23fb9d4fe53631b360a94abca0d875b51aeea5a7
diff --git a/test/int/test_sql.py b/test/int/test_sql.py
index a6917acd323f05880eda6d48ed8a13394bb6218e..3ccbb15ceb24dd0061f49db030e1feac35880114 100644
--- a/test/int/test_sql.py
+++ b/test/int/test_sql.py
@@ -333,3 +333,49 @@ def test_sql_limits(cluster: Cluster):
         select * from "t" option(vtable_max_rows=1, sql_vdbe_max_steps=50)
     """
         )
+
+
+def test_distributed_sql_via_set_language(cluster: Cluster):
+    cluster.deploy(instance_count=2)
+    i1, i2 = cluster.instances
+
+    prelude = """
+        local console = require('console')
+        console.eval([[\\ set language sql]])
+        console.eval([[\\ set delimiter ;]])
+    """
+
+    i1.eval(
+        f"""
+        {prelude}
+        return console.eval('create table t \
+            (a integer not null, b int not null, primary key (a)) \
+                using memtx distributed by (b) option (timeout = 3);')
+    """
+    )
+
+    i1.eval(
+        f"""
+        {prelude}
+        return console.eval('insert into t values (22, 8);')
+    """
+    )
+
+    select_from_second_instance = i2.eval(
+        f"""
+        {prelude}
+        return console.eval('select * from t where a = 22;')
+    """
+    )
+
+    assert (
+        select_from_second_instance
+        == """---
+- metadata:
+  - {'name': 'A', 'type': 'integer'}
+  - {'name': 'B', 'type': 'integer'}
+  rows:
+  - [22, 8]
+...
+"""
+    )