Skip to content

Commit 56707be

Browse files
authored
Merge pull request #295 fix keep dataquery in local cache
2 parents d345b91 + be71e4d commit 56707be

File tree

2 files changed

+22
-0
lines changed

2 files changed

+22
-0
lines changed

tests/table/table_test.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,20 @@
22
import ydb
33

44

5+
class TestSession:
6+
def test_keep_in_cache_dataquery(self, driver_sync):
7+
# Keep prepared query for keep_in_cache only, not store query_id if client query cache disabled
8+
tc_settings = ydb.TableClientSettings().with_client_query_cache(enabled=False)
9+
table_client = ydb.TableClient(driver_sync, tc_settings)
10+
data_query = ydb.DataQuery("select 1", {})
11+
session = ydb.retry_operation_sync(lambda: table_client.session().create())
12+
session.transaction().execute(data_query, commit_tx=True)
13+
assert session.has_prepared("select 1")
14+
assert session._state.lookup("select 1")[1] is None
15+
assert session.has_prepared(data_query)
16+
assert session._state.lookup(data_query)[1] is None
17+
18+
519
class TestSessionPool:
620
def test_checkout_from_stopped_pool(self, driver_sync):
721
pool = ydb.SessionPool(driver_sync, 1)

ydb/_tx_ctx_impl.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,8 @@ def execute_request_factory(session_state, tx_state, query, parameters, commit_t
110110
data_query, query_id = session_state.lookup(query)
111111
parameters_types = {}
112112

113+
is_data_query = False
114+
113115
if query_id is not None:
114116
query_pb = _apis.ydb_table.Query(id=query_id)
115117
parameters_types = data_query.parameters_types
@@ -118,9 +120,11 @@ def execute_request_factory(session_state, tx_state, query, parameters, commit_t
118120
# client cache disabled for send query text every time
119121
yql_text = data_query.yql_text
120122
parameters_types = data_query.parameters_types
123+
is_data_query = True
121124
elif isinstance(query, types.DataQuery):
122125
yql_text = query.yql_text
123126
parameters_types = query.parameters_types
127+
is_data_query = True
124128
else:
125129
yql_text = query
126130
query_pb = _apis.ydb_table.Query(yql_text=yql_text)
@@ -133,6 +137,8 @@ def execute_request_factory(session_state, tx_state, query, parameters, commit_t
133137
keep_in_cache = settings.keep_in_cache
134138
elif parameters:
135139
keep_in_cache = True
140+
elif is_data_query:
141+
keep_in_cache = True
136142
else:
137143
keep_in_cache = False
138144

@@ -159,5 +165,7 @@ def wrap_result_and_tx_id(rpc_state, response_pb, session_state, tx_state, query
159165
issues._process_response(response_pb.operation)
160166
message = _apis.ydb_table.ExecuteQueryResult()
161167
response_pb.operation.result.Unpack(message)
168+
if message.query_meta.id and isinstance(query, types.DataQuery):
169+
session_state.keep(query, message.query_meta.id)
162170
tx_state.tx_id = None if not message.tx_meta.id else message.tx_meta.id
163171
return convert.ResultSets(message.result_sets, session_state.table_client_settings)

0 commit comments

Comments
 (0)