1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
|
from contextlib import contextmanager
from clickhouse_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)
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)
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)
self.assertEqual(last_query.elapsed, 0)
def test_last_query_progress_total_rows(self):
self.client.execute('SELECT max(number) FROM numbers(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)
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)
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.assertGreater(last_query.progress.rows, 100000000)
self.assertGreater(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)
self.assertGreater(last_query.elapsed, 0)
|