|
7 | 7 |
|
8 | 8 | ydb.interceptor.monkey_patch_event_handler() |
9 | 9 |
|
10 | | -supported_pk_types = [ |
11 | | - "Int64", |
12 | | - "Uint64", |
13 | | - "Int32", |
14 | | - "Uint32", |
15 | | - "Int16", |
16 | | - "Uint16", |
17 | | - "Int8", |
18 | | - "Uint8", |
19 | | - "Bool", |
20 | | - "Decimal(1,0)", |
21 | | - "Decimal(22,9)", |
22 | | - "Decimal(35,10)", |
23 | | - "DyNumber", |
24 | | - |
25 | | - "String", |
26 | | - "Utf8", |
27 | | - "Uuid", |
28 | | - |
29 | | - "Date", |
30 | | - "Datetime", |
31 | | - "Timestamp", |
32 | | - "Interval", |
33 | | - "Date32", |
34 | | - "Datetime64", |
35 | | - "Timestamp64", |
36 | | - "Interval64" |
37 | | -] |
38 | | - |
39 | | -supported_types = supported_pk_types + [ |
40 | | - "Float", |
41 | | - "Double", |
42 | | - "Json", |
43 | | - "JsonDocument", |
44 | | - "Yson" |
45 | | -] |
46 | | - |
47 | | -null_types = [ |
48 | | - "Int64", |
49 | | - "Decimal(22,9)", |
50 | | - "Decimal(35,10)", |
51 | | - "String", |
52 | | -] |
| 10 | +digits = 2 # should be consistent with format string below |
| 11 | +pk_types = { |
| 12 | + "Int64": "CAST({} AS Int64)", |
| 13 | + "Uint64": "CAST({} AS Uint64)", |
| 14 | + "Int32": "CAST({} AS Int32)", |
| 15 | + "Uint32": "CAST({} AS Uint32)", |
| 16 | + "Int16": "CAST({} AS Int16)", |
| 17 | + "Uint16": "CAST({} AS Uint16)", |
| 18 | + "Int8": "CAST({} AS Int8)", |
| 19 | + "Uint8": "CAST({} AS Uint8)", |
| 20 | + "Bool": "CAST({} AS Bool)", |
| 21 | + "Decimal(15,0)": "CAST('{}.0' AS Decimal(15,0))", |
| 22 | + "Decimal(22,9)": "CAST('{}.123' AS Decimal(22,9))", |
| 23 | + "Decimal(35,10)": "CAST('{}.123456' AS Decimal(35,10))", |
| 24 | + "DyNumber": "CAST('{}E1' AS DyNumber)", |
| 25 | + |
| 26 | + "String": "'String {}'", |
| 27 | + "Utf8": "'Uft8 {}'", |
| 28 | + "Uuid": "CAST('{:2}345678-e89b-12d3-a456-556642440000' AS UUID)", |
| 29 | + |
| 30 | + "Date": "CAST('20{:02}-01-01' AS Date)", |
| 31 | + "Datetime": "CAST('20{:02}-10-02T11:00:00Z' AS Datetime)", |
| 32 | + "Timestamp": "CAST(169624{:02}00000000 AS Timestamp)", |
| 33 | + "Interval": "CAST({} AS Interval)", |
| 34 | + "Date32": "CAST('20{:02}-01-01' AS Date32)", |
| 35 | + "Datetime64": "CAST('20{:02}-10-02T11:00:00Z' AS Datetime64)", |
| 36 | + "Timestamp64": "CAST(169624{:02}00000000 AS Timestamp64)", |
| 37 | + "Interval64": "CAST({} AS Interval64)" |
| 38 | +} |
| 39 | + |
| 40 | +non_pk_types = { |
| 41 | + "Float": "CAST('{}.1' AS Float)", |
| 42 | + "Double": "CAST('{}.2' AS Double)", |
| 43 | + "Json": "CAST('{{\"another_key\":{}}}' AS Json)", |
| 44 | + "JsonDocument": "CAST('{{\"another_doc_key\":{}}}' AS JsonDocument)", |
| 45 | + "Yson": "CAST('[{}]' AS Yson)" |
| 46 | +} |
| 47 | + |
| 48 | +null_types = { |
| 49 | + "Int64": "CAST({} AS Int64)", |
| 50 | + "Decimal(22,9)": "CAST('{}.123' AS Decimal(22,9))", |
| 51 | + "Decimal(35,10)": "CAST('{}.123456' AS Decimal(35,10))", |
| 52 | + "String": "'{}'", |
| 53 | +} |
| 54 | + |
| 55 | + |
| 56 | +def cleanup_type_name(type_name): |
| 57 | + return type_name.replace('(', '').replace(')', '').replace(',', '') |
53 | 58 |
|
54 | 59 |
|
55 | 60 | class WorkloadInsertDeleteAllTypes(WorkloadBase): |
56 | 61 | def __init__(self, client, prefix, stop): |
57 | 62 | super().__init__(client, prefix, "insert_delete_all_types", stop) |
58 | 63 | self.inserted = 0 |
59 | | - self.current = 0 |
60 | 64 | self.table_name = "table" |
61 | 65 | self.lock = threading.Lock() |
62 | 66 |
|
63 | 67 | def get_stat(self): |
64 | 68 | with self.lock: |
65 | | - return f"Inserted: {self.inserted}, Current: {self.current}" |
| 69 | + return f"Inserted: {self.inserted}" |
66 | 70 |
|
67 | 71 | def _loop(self): |
68 | 72 | table_path = self.get_table_path(self.table_name) |
69 | 73 | create_sql = f""" |
70 | 74 | CREATE TABLE `{table_path}` ( |
71 | | - {", ".join(["pk" + str(i) + " " + supported_pk_types[i] for i in range(len(supported_pk_types))])}, |
72 | | - {", ".join(["null_pk" + str(i) + " " + null_types[i] for i in range(len(null_types))])}, |
73 | | - {", ".join(["col" + str(i) + " " + supported_types[i] for i in range(len(supported_types))])}, |
74 | | - {", ".join(["null_col" + str(i) + " " + null_types[i] for i in range(len(null_types))])}, |
| 75 | + pk Uint64, |
| 76 | + {", ".join(["pk_" + cleanup_type_name(type_name) + " " + type_name for type_name in pk_types.keys()])}, |
| 77 | + {", ".join(["null_pk_" + cleanup_type_name(type_name) + " " + type_name for type_name in null_types.keys()])}, |
| 78 | + {", ".join(["col_" + cleanup_type_name(type_name) + " " + type_name for type_name in non_pk_types.keys()])}, |
| 79 | + {", ".join(["null_col_" + cleanup_type_name(type_name) + " " + type_name for type_name in null_types.keys()])}, |
75 | 80 | PRIMARY KEY( |
76 | | - {", ".join(["pk" + str(i) for i in range(len(supported_pk_types))])}, |
77 | | - {", ".join(["null_pk" + str(i) for i in range(len(null_types))])} |
| 81 | + {", ".join(["pk_" + cleanup_type_name(type_name) for type_name in pk_types.keys()])}, |
| 82 | + {", ".join(["null_pk_" + cleanup_type_name(type_name) for type_name in null_types.keys()])} |
78 | 83 | ) |
79 | 84 | ) |
80 | 85 | """ |
81 | | - # print(create_sql) |
82 | 86 |
|
83 | 87 | self.client.query(create_sql, True,) |
84 | | - i = 1 |
| 88 | + inflight = 10 |
| 89 | + i = 0 |
| 90 | + sum = 0 |
85 | 91 | while not self.is_stop_requested(): |
| 92 | + value = i % 100 |
86 | 93 | insert_sql = f""" |
87 | 94 | INSERT INTO `{table_path}` ( |
88 | | - {", ".join(["pk" + str(i) for i in range(len(supported_pk_types))])}, |
89 | | - {", ".join(["null_pk" + str(i) for i in range(len(null_types))])}, |
90 | | - {", ".join(["col" + str(i) for i in range(len(supported_types))])}, |
91 | | - {", ".join(["null_col" + str(i) for i in range(len(null_types))])} |
| 95 | + pk, |
| 96 | + {", ".join(["pk_" + cleanup_type_name(type_name) for type_name in pk_types.keys()])}, |
| 97 | + {", ".join(["null_pk_" + cleanup_type_name(type_name) for type_name in null_types.keys()])}, |
| 98 | + {", ".join(["col_" + cleanup_type_name(type_name) for type_name in non_pk_types.keys()])}, |
| 99 | + {", ".join(["null_col_" + cleanup_type_name(type_name) for type_name in null_types.keys()])} |
92 | 100 | ) |
93 | 101 | VALUES |
94 | | - ({i * 2}, {i * 10}, |
95 | | - -2147483648, 0, -32768, 0, -128, 0, false, |
96 | | - CAST('1' AS Decimal(1,0)), CAST('1234567890123456789.000000001' AS Decimal(22,9)), CAST('1234567890123456789123456789.000000001' AS Decimal(35,10)), |
97 | | - CAST('-1.234' AS DyNumber), 'AnotherString', 'AnotherUtf8', CAST('123e4567-e89b-12d3-a456-556642440000' AS Uuid), |
98 | | - CAST('2023-10-02' AS Date), CAST('2023-10-02T11:00:00' AS Datetime), CAST(1696243200000000 AS Timestamp), CAST(-86400 AS Interval), |
99 | | - Date32('998-06-02'), CAST('2023-10-02T11:00:00.654321' AS Datetime64), Timestamp64('0998-06-02T12:30:00.123456Z'),Interval64('PT2S'), |
100 | | - NULL, NULL, NULL, NULL, |
101 | | - -2000000, {i * 10}, -222, 222, -22, 22, -2, 2, true, |
102 | | - CAST('2' AS Decimal(1,0)), CAST('2234567890123456789.000000001' AS Decimal(22,9)), CAST('2234567890123456789123456789.000000001' AS Decimal(35,10)), |
103 | | - CAST('123E4' AS DyNumber), 'SampleString', 'SampleUtf8', CAST('550e8400-e29b-41d4-a716-446655440000' AS Uuid), |
104 | | - CAST('2023-10-01' AS Date), CAST('2023-10-01T10:00:00' AS Datetime), CAST(1696156800000000 AS Timestamp), CAST(3600 AS Interval), |
105 | | - Date32('998-06-01'), CAST('2023-10-01T10:00:00.123456' AS Datetime64), Timestamp64('0998-06-02T12:30:00.678901Z'),Interval64('-PT2S'), 3.14f, 2.71828, |
106 | | - CAST('{{"json_key":"json_value"}}' AS Json), CAST('{{"doc_key":"doc_value"}}' AS JsonDocument), CAST('<yson><key1>value1</key1></yson>' AS Yson), |
107 | | - NULL, NULL, NULL, NULL), |
108 | | - ({i * 2 + 1}, {i * 10 + 1}, |
109 | | - 2147483647, 4294967295, 32767, 65535, 127, 255, true, |
110 | | - CAST('3' AS Decimal(1,0)), CAST('3234567890123456789.000000001' AS Decimal(22,9)), CAST('3234567890123456789123456789.000000001' AS Decimal(35,10)), |
111 | | - CAST('4.567E-3' AS DyNumber), 'ExampleString', 'ExampleUtf8', CAST('00112233-4455-6677-8899-aabbccddeeff' AS Uuid), |
112 | | - CAST('2022-12-31' AS Date), CAST('2022-12-31T23:59:59' AS Datetime), CAST(1672444799000000 AS Timestamp), CAST(172800 AS Interval), |
113 | | - Date32('1000-01-01'), CAST('2022-12-31T23:59:59.999999' AS Datetime64), Timestamp64('1000-01-01T00:00:00.000000Z'), Interval64('PT1440M'), |
114 | | - NULL, NULL, NULL, NULL, |
115 | | - -4000000, {i * 10 + 1}, -444, 444, -44, 44, -4, 4, false, |
116 | | - CAST('4' AS Decimal(1,0)), CAST('4234567890123456789.000000001' AS Decimal(22,9)), CAST('4234567890123456789123456789.000000001' AS Decimal(35,10)), |
117 | | - CAST('-987E-4' AS DyNumber), 'NewString', 'NewUtf8', CAST('01234567-89ab-cdef-0123-456789abcdef' AS Uuid), |
118 | | - CAST('1980-03-15' AS Date), CAST('1980-03-15T08:00:00' AS Datetime), CAST(315532800000000 AS Timestamp), CAST(-31536000 AS Interval), |
119 | | - Date32('2000-02-29'), CAST('1980-03-15T08:00:00.123456' AS Datetime64), Timestamp64('2000-02-29T12:30:00.999999Z'), Interval64('-PT600S'), -0.123f, 2.71828, |
120 | | - CAST('{{"another_key":"another_value"}}' AS Json), CAST('{{"another_doc_key":"another_doc_value"}}' AS JsonDocument), CAST('<yson><key2>value2</key2></yson>' AS Yson), |
121 | | - NULL, NULL, NULL, NULL); |
| 102 | + ( |
| 103 | + {i}, |
| 104 | + {", ".join([pk_types[type_name].format(value) for type_name in pk_types.keys()])}, |
| 105 | + {", ".join(['NULL' for type_name in null_types.keys()])}, |
| 106 | + {", ".join([non_pk_types[type_name].format(value) for type_name in non_pk_types.keys()])}, |
| 107 | + {", ".join(['NULL' for type_name in null_types.keys()])} |
| 108 | + ) |
| 109 | + ; |
122 | 110 | """ |
123 | | - # print(insert_sql) |
124 | 111 | self.client.query(insert_sql, False,) |
125 | | - |
126 | | - self.client.query( |
127 | | - f""" |
128 | | - DELETE FROM `{table_path}` |
129 | | - WHERE col1 % 2 == 1 AND null_pk0 IS NULL |
130 | | - """, |
131 | | - False, |
132 | | - ) |
133 | | - |
134 | | - actual = self.client.query( |
135 | | - f""" |
136 | | - SELECT COUNT(*) as cnt, SUM(col1) as vals, SUM(pk0) as ids FROM `{table_path}` |
137 | | - """, |
138 | | - False, |
139 | | - )[0].rows[0] |
140 | | - expected = {"cnt": i, "vals": i * (i + 1) * 5, "ids": i * (i + 1)} |
141 | | - if actual != expected: |
142 | | - raise Exception(f"Incorrect result: expected:{expected}, actual:{actual}") |
| 112 | + sum += i |
| 113 | + |
| 114 | + if (i >= inflight): |
| 115 | + self.client.query( |
| 116 | + f""" |
| 117 | + DELETE FROM `{table_path}` |
| 118 | + WHERE pk == {i - inflight} AND null_pk_Int64 IS NULL |
| 119 | + """, |
| 120 | + False, |
| 121 | + ) |
| 122 | + sum -= (i - inflight) |
| 123 | + |
| 124 | + actual = self.client.query( |
| 125 | + f""" |
| 126 | + SELECT COUNT(*) as cnt, SUM(pk) as sum FROM `{table_path}` |
| 127 | + """, |
| 128 | + False, |
| 129 | + )[0].rows[0] |
| 130 | + expected = {"cnt": inflight, "sum": sum} |
| 131 | + if actual != expected: |
| 132 | + raise Exception(f"Incorrect result: expected:{expected}, actual:{actual}") |
143 | 133 | i += 1 |
144 | 134 | with self.lock: |
145 | | - self.inserted += 2 |
146 | | - self.current = actual["cnt"] |
| 135 | + self.inserted += 1 |
147 | 136 |
|
148 | 137 | def get_workload_thread_funcs(self): |
149 | 138 | return [self._loop] |
@@ -188,4 +177,4 @@ def run(self): |
188 | 177 | print("Waiting for stop...") |
189 | 178 | for w in workloads: |
190 | 179 | w.join() |
191 | | - print("Waiting for stop... stopped") |
| 180 | + print("Stopped") |
0 commit comments