mirror of
https://github.com/hanzo-ds/driver.git
synced 2026-10-30 20:32:40 +00:00
Imports read `datastore_driver`, distribution `datastore-driver`, so nothing has to import another product's name to talk to Hanzo Datastore. Cut from upstream 0.2.9 — the version this stack already ran — rather than from upstream HEAD, so it is a PURE RENAME with no behaviour change. Forking from HEAD would have dragged versions along with the name (connect alone jumped 0.8.17 -> 1.6.0, a major), which is a different and much riskier change wearing a rename's clothes. X-ClickHouse-* headers are untouched: they are wire protocol the server sends and expects, and a different token shape from the module name.
165 lines
6.2 KiB
Python
165 lines
6.2 KiB
Python
from contextlib import contextmanager
|
|
|
|
from datastore_driver import errors
|
|
from tests.testcase import BaseTestCase
|
|
|
|
|
|
class QueryInfoTestCase(BaseTestCase):
|
|
|
|
@property
|
|
def sample_query(self):
|
|
return 'SELECT * FROM test GROUP BY foo ORDER BY foo DESC LIMIT 5'
|
|
|
|
@contextmanager
|
|
def sample_table(self):
|
|
with self.create_table('foo UInt8'):
|
|
self.client.execute('INSERT INTO test (foo) VALUES',
|
|
[(i,) for i in range(42)])
|
|
self.client.reset_last_query()
|
|
yield
|
|
|
|
def test_default_value(self):
|
|
self.assertIsNone(self.client.last_query)
|
|
|
|
def test_store_last_query_after_execute(self):
|
|
with self.sample_table():
|
|
self.client.execute(self.sample_query)
|
|
|
|
last_query = self.client.last_query
|
|
self.assertIsNotNone(last_query)
|
|
self.assertIsNotNone(last_query.profile_info)
|
|
self.assertEqual(last_query.profile_info.rows_before_limit, 42)
|
|
|
|
self.assertIsNotNone(last_query.progress)
|
|
self.assertEqual(last_query.progress.rows, 42)
|
|
self.assertEqual(last_query.progress.bytes, 42)
|
|
self.assertEqual(last_query.progress.total_rows, 0)
|
|
if self.server_version > (22, 8):
|
|
self.assertGreater(last_query.progress.elapsed_ns, 0)
|
|
|
|
self.assertGreater(last_query.elapsed, 0)
|
|
|
|
def test_last_query_after_execute_iter(self):
|
|
with self.sample_table():
|
|
list(self.client.execute_iter(self.sample_query))
|
|
|
|
last_query = self.client.last_query
|
|
self.assertIsNotNone(last_query)
|
|
self.assertIsNotNone(last_query.profile_info)
|
|
self.assertEqual(last_query.profile_info.rows_before_limit, 42)
|
|
|
|
self.assertIsNotNone(last_query.progress)
|
|
self.assertEqual(last_query.progress.rows, 42)
|
|
self.assertEqual(last_query.progress.bytes, 42)
|
|
self.assertEqual(last_query.progress.total_rows, 0)
|
|
if self.server_version > (22, 8):
|
|
self.assertGreater(last_query.progress.elapsed_ns, 0)
|
|
|
|
self.assertEqual(last_query.elapsed, 0)
|
|
|
|
def test_last_query_after_execute_with_progress(self):
|
|
with self.sample_table():
|
|
progress = self.client.execute_with_progress(self.sample_query)
|
|
list(progress)
|
|
progress.get_result()
|
|
|
|
last_query = self.client.last_query
|
|
self.assertIsNotNone(last_query)
|
|
self.assertIsNotNone(last_query.profile_info)
|
|
self.assertEqual(last_query.profile_info.rows_before_limit, 42)
|
|
|
|
self.assertIsNotNone(last_query.progress)
|
|
self.assertEqual(last_query.progress.rows, 42)
|
|
self.assertEqual(last_query.progress.bytes, 42)
|
|
self.assertEqual(last_query.progress.total_rows, 0)
|
|
if self.server_version > (22, 8):
|
|
self.assertGreater(last_query.progress.elapsed_ns, 0)
|
|
|
|
self.assertEqual(last_query.elapsed, 0)
|
|
|
|
def test_last_query_progress_total_rows(self):
|
|
self.client.execute('SELECT number FROM numbers(10) LIMIT 10')
|
|
|
|
last_query = self.client.last_query
|
|
self.assertIsNotNone(last_query)
|
|
self.assertIsNotNone(last_query.profile_info)
|
|
self.assertEqual(last_query.profile_info.rows_before_limit, 10)
|
|
|
|
self.assertIsNotNone(last_query.progress)
|
|
self.assertEqual(last_query.progress.rows, 10)
|
|
self.assertEqual(last_query.progress.bytes, 80)
|
|
|
|
total_rows = 10 if self.server_version > (19, 4) else 0
|
|
self.assertEqual(last_query.progress.total_rows, total_rows)
|
|
if self.server_version > (22, 8):
|
|
self.assertGreater(last_query.progress.elapsed_ns, 0)
|
|
|
|
self.assertGreater(last_query.elapsed, 0)
|
|
|
|
def test_last_query_after_execute_insert(self):
|
|
with self.sample_table():
|
|
self.client.execute('INSERT INTO test (foo) VALUES',
|
|
[(i,) for i in range(42)])
|
|
|
|
last_query = self.client.last_query
|
|
self.assertIsNotNone(last_query)
|
|
self.assertIsNotNone(last_query.progress)
|
|
self.assertEqual(last_query.progress.rows, 0)
|
|
self.assertEqual(last_query.progress.bytes, 0)
|
|
if self.server_version > (22, 8):
|
|
self.assertEqual(last_query.progress.elapsed_ns, 0)
|
|
|
|
self.assertGreater(last_query.elapsed, 0)
|
|
|
|
def test_override_after_subsequent_queries(self):
|
|
query = 'SELECT * FROM test WHERE foo < %(i)s ORDER BY foo LIMIT 5'
|
|
with self.sample_table():
|
|
for i in range(1, 10):
|
|
self.client.execute(query, {'i': i})
|
|
|
|
profile_info = self.client.last_query.profile_info
|
|
self.assertEqual(profile_info.rows_before_limit, i)
|
|
|
|
def test_reset_last_query(self):
|
|
with self.sample_table():
|
|
self.client.execute(self.sample_query)
|
|
|
|
self.assertIsNotNone(self.client.last_query)
|
|
self.client.reset_last_query()
|
|
self.assertIsNone(self.client.last_query)
|
|
|
|
def test_reset_on_query_error(self):
|
|
with self.assertRaises(errors.ServerException):
|
|
self.client.execute('SELECT answer FROM universe')
|
|
|
|
self.assertIsNone(self.client.last_query)
|
|
|
|
def test_progress_info_increment(self):
|
|
self.client.execute(
|
|
'SELECT x FROM ('
|
|
'SELECT number AS x FROM numbers(100000000)'
|
|
') ORDER BY x ASC LIMIT 10'
|
|
)
|
|
|
|
last_query = self.client.last_query
|
|
self.assertIsNotNone(last_query)
|
|
self.assertIsNotNone(last_query.progress)
|
|
self.assertGreaterEqual(last_query.progress.rows, 100000000)
|
|
self.assertGreaterEqual(last_query.progress.bytes, 800000000)
|
|
|
|
total_rows = 100000000 if self.server_version > (19, 4) else 0
|
|
self.assertEqual(last_query.progress.total_rows, total_rows)
|
|
|
|
def test_progress_info_ddl(self):
|
|
self.client.execute('DROP TABLE IF EXISTS foo')
|
|
|
|
last_query = self.client.last_query
|
|
self.assertIsNotNone(last_query)
|
|
self.assertIsNotNone(last_query.progress)
|
|
self.assertEqual(last_query.progress.rows, 0)
|
|
self.assertEqual(last_query.progress.bytes, 0)
|
|
if self.server_version > (22, 8):
|
|
self.assertEqual(last_query.progress.elapsed_ns, 0)
|
|
|
|
self.assertGreater(last_query.elapsed, 0)
|