diff --git a/dbms/tests/integration/test_concurrent_queries_for_user_restriction/__init__.py b/dbms/tests/integration/test_concurrent_queries_for_user_restriction/__init__.py
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/dbms/tests/integration/test_concurrent_queries_for_user_restriction/configs/remote_servers.xml b/dbms/tests/integration/test_concurrent_queries_for_user_restriction/configs/remote_servers.xml
new file mode 100644
index 00000000000..3593cbd7f36
--- /dev/null
+++ b/dbms/tests/integration/test_concurrent_queries_for_user_restriction/configs/remote_servers.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ node1
+ 9000
+
+
+ node2
+ 9000
+
+
+
+
+
diff --git a/dbms/tests/integration/test_concurrent_queries_for_user_restriction/configs/user_restrictions.xml b/dbms/tests/integration/test_concurrent_queries_for_user_restriction/configs/user_restrictions.xml
new file mode 100644
index 00000000000..bd91f1d495c
--- /dev/null
+++ b/dbms/tests/integration/test_concurrent_queries_for_user_restriction/configs/user_restrictions.xml
@@ -0,0 +1,38 @@
+
+
+
+ 10000000000
+ 0
+ random
+
+
+ 10000000000
+ 0
+ random
+ 2
+
+
+
+
+
+
+ ::/0
+
+ default
+ default
+
+
+
+
+ ::/0
+
+ good
+ default
+
+
+
+
+
+
+
+
diff --git a/dbms/tests/integration/test_concurrent_queries_for_user_restriction/test.py b/dbms/tests/integration/test_concurrent_queries_for_user_restriction/test.py
new file mode 100644
index 00000000000..665f0877586
--- /dev/null
+++ b/dbms/tests/integration/test_concurrent_queries_for_user_restriction/test.py
@@ -0,0 +1,54 @@
+import time
+
+import pytest
+
+from multiprocessing.dummy import Pool
+from helpers.cluster import ClickHouseCluster
+
+cluster = ClickHouseCluster(__file__)
+
+node1 = cluster.add_instance('node1', user_configs=['configs/user_restrictions.xml'], main_configs=['configs/remote_servers.xml'])
+node2 = cluster.add_instance('node2', user_configs=['configs/user_restrictions.xml'], main_configs=['configs/remote_servers.xml'])
+
+@pytest.fixture(scope="module")
+def started_cluster():
+ try:
+ cluster.start()
+ for num, node in enumerate([node1, node2]):
+ node.query("create table real_tbl (ID UInt64, Value String) ENGINE = MergeTree() order by tuple()")
+ node.query("insert into real_tbl values(0, '0000'), (1, '1111')")
+ node.query("create table distr_tbl (ID UInt64, Value String) ENGINE Distributed(test_cluster, default, real_tbl)")
+
+ node1.query("create table nums (number UInt64) ENGINE = MergeTree() order by tuple()")
+ node1.query("insert into nums values(0),(1)")
+
+ yield cluster
+ finally:
+ cluster.shutdown()
+
+def num_getter(num):
+ if num % 2 == 0:
+ return node1
+ else:
+ return node2
+
+@pytest.mark.parametrize("node_getter", [
+ (lambda _: node1),
+ (lambda _: node2),
+ (num_getter),
+])
+def test_exception_message(started_cluster, node_getter):
+ assert node1.query("select ID from distr_tbl order by ID") == "0\n1\n"
+ assert node1.query("select number from nums order by number") == "0\n1\n"
+ try:
+ p = Pool(10)
+ def query(num):
+ node = node_getter(num)
+ node.query(
+ "select sleep(2) from distr_tbl where ID GLOBAL IN (select number from remote('node1', 'default', 'nums'))",
+ user='good')
+
+ p.map(query, xrange(3))
+ except Exception as ex:
+ assert 'Too many simultaneous queries for user good.' in ex.message
+ print ex.message