File: test_query_info.py

package info (click to toggle)
python-clickhouse-driver 0.2.5-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,516 kB
  • sloc: python: 10,950; pascal: 42; makefile: 31; sh: 3
file content (152 lines) | stat: -rw-r--r-- 5,665 bytes parent folder | download | duplicates (3)
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)