Skip to content

Commit 5712514

Browse files
committed
metadata: conditionally skip triggers query for ScyllaDB
ScyllaDB doesn't support triggers, so skip the triggers query when connected to ScyllaDB. This is detected by checking if the connection has shard awareness (shard_id is not None). Changes: - Added _is_scylla() method to SchemaParserV3 to detect ScyllaDB - Modified _query_all() to conditionally append triggers query - Modified get_table() to conditionally query triggers - SchemaParserV4 remains unchanged (DSE has triggers support)
1 parent a0cde2e commit 5712514

1 file changed

Lines changed: 69 additions & 30 deletions

File tree

cassandra/metadata.py

Lines changed: 69 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -2577,6 +2577,10 @@ class SchemaParserV3(SchemaParserV22):
25772577
_SELECT_AGGREGATES = "SELECT * FROM system_schema.aggregates"
25782578
_SELECT_VIEWS = "SELECT * FROM system_schema.views"
25792579

2580+
def _is_not_scylla(self):
2581+
"""Check if NOT connected to ScyllaDB by checking for shard awareness."""
2582+
return getattr(getattr(self.connection, 'features', None), 'shard_id', None) is None
2583+
25802584
_table_name_col = 'table_name'
25812585

25822586
_function_agg_arument_type_col = 'argument_types'
@@ -2627,27 +2631,44 @@ def get_table(self, keyspaces, keyspace, table):
26272631
indexes_query = QueryMessage(
26282632
query=maybe_add_timeout_to_query(self._SELECT_INDEXES + where_clause, self.metadata_request_timeout),
26292633
consistency_level=cl, fetch_size=fetch_size)
2630-
triggers_query = QueryMessage(
2631-
query=maybe_add_timeout_to_query(self._SELECT_TRIGGERS + where_clause, self.metadata_request_timeout),
2632-
consistency_level=cl, fetch_size=fetch_size)
2634+
2635+
# ScyllaDB doesn't have triggers, skip the query
2636+
if self._is_not_scylla():
2637+
triggers_query = QueryMessage(
2638+
query=maybe_add_timeout_to_query(self._SELECT_TRIGGERS + where_clause, self.metadata_request_timeout),
2639+
consistency_level=cl, fetch_size=fetch_size)
26332640

26342641
# in protocol v4 we don't know if this event is a view or a table, so we look for both
26352642
where_clause = bind_params(" WHERE keyspace_name = %s AND view_name = %s", (keyspace, table), _encoder)
26362643
view_query = QueryMessage(
26372644
query=maybe_add_timeout_to_query(self._SELECT_VIEWS + where_clause, self.metadata_request_timeout),
26382645
consistency_level=cl, fetch_size=fetch_size)
2639-
((cf_success, cf_result), (col_success, col_result),
2640-
(indexes_sucess, indexes_result), (triggers_success, triggers_result),
2641-
(view_success, view_result)) = (
2642-
self.connection.wait_for_responses(
2643-
cf_query, col_query, indexes_query, triggers_query,
2644-
view_query, timeout=self.timeout, fail_on_error=False)
2645-
)
2646+
2647+
if self._is_not_scylla():
2648+
((cf_success, cf_result), (col_success, col_result),
2649+
(indexes_sucess, indexes_result), (triggers_success, triggers_result),
2650+
(view_success, view_result)) = (
2651+
self.connection.wait_for_responses(
2652+
cf_query, col_query, indexes_query, triggers_query,
2653+
view_query, timeout=self.timeout, fail_on_error=False)
2654+
)
2655+
else:
2656+
((cf_success, cf_result), (col_success, col_result),
2657+
(indexes_sucess, indexes_result),
2658+
(view_success, view_result)) = (
2659+
self.connection.wait_for_responses(
2660+
cf_query, col_query, indexes_query,
2661+
view_query, timeout=self.timeout, fail_on_error=False)
2662+
)
2663+
26462664
table_result = self._handle_results(cf_success, cf_result, query_msg=cf_query)
26472665
col_result = self._handle_results(col_success, col_result, query_msg=col_query)
26482666
if table_result:
26492667
indexes_result = self._handle_results(indexes_sucess, indexes_result, query_msg=indexes_query)
2650-
triggers_result = self._handle_results(triggers_success, triggers_result, query_msg=triggers_query)
2668+
if self._is_not_scylla():
2669+
triggers_result = self._handle_results(triggers_success, triggers_result, query_msg=triggers_query)
2670+
else:
2671+
triggers_result = None
26512672
return self._build_table_metadata(table_result[0], col_result, triggers_result, indexes_result)
26522673

26532674
view_result = self._handle_results(view_success, view_result, query_msg=view_query)
@@ -2696,9 +2717,10 @@ def _build_table_metadata(self, row, col_rows=None, trigger_rows=None, index_row
26962717

26972718
self._build_table_columns(table_meta, col_rows, compact_static, is_dense, virtual)
26982719

2699-
for trigger_row in trigger_rows:
2700-
trigger_meta = self._build_trigger_metadata(table_meta, trigger_row)
2701-
table_meta.triggers[trigger_meta.name] = trigger_meta
2720+
if self._is_not_scylla():
2721+
for trigger_row in trigger_rows:
2722+
trigger_meta = self._build_trigger_metadata(table_meta, trigger_row)
2723+
table_meta.triggers[trigger_meta.name] = trigger_meta
27022724

27032725
for index_row in index_rows:
27042726
index_meta = self._build_index_metadata(table_meta, index_row)
@@ -2793,6 +2815,7 @@ def _build_trigger_metadata(table_metadata, row):
27932815
trigger_meta = TriggerMetadata(table_metadata, name, options)
27942816
return trigger_meta
27952817

2818+
27962819
def _query_all(self):
27972820
cl = ConsistencyLevel.ONE
27982821
fetch_size = self.fetch_size
@@ -2809,35 +2832,51 @@ def _query_all(self):
28092832
fetch_size=fetch_size, consistency_level=cl),
28102833
QueryMessage(query=maybe_add_timeout_to_query(self._SELECT_AGGREGATES, self.metadata_request_timeout),
28112834
fetch_size=fetch_size, consistency_level=cl),
2812-
QueryMessage(query=maybe_add_timeout_to_query(self._SELECT_TRIGGERS, self.metadata_request_timeout),
2813-
fetch_size=fetch_size, consistency_level=cl),
28142835
QueryMessage(query=maybe_add_timeout_to_query(self._SELECT_INDEXES, self.metadata_request_timeout),
28152836
fetch_size=fetch_size, consistency_level=cl),
28162837
QueryMessage(query=maybe_add_timeout_to_query(self._SELECT_VIEWS, self.metadata_request_timeout),
28172838
fetch_size=fetch_size, consistency_level=cl),
28182839
]
28192840

2820-
((ks_success, ks_result),
2821-
(table_success, table_result),
2822-
(col_success, col_result),
2823-
(types_success, types_result),
2824-
(functions_success, functions_result),
2825-
(aggregates_success, aggregates_result),
2826-
(triggers_success, triggers_result),
2827-
(indexes_success, indexes_result),
2828-
(views_success, views_result)) = self.connection.wait_for_responses(
2829-
*queries, timeout=self.timeout, fail_on_error=False
2830-
)
2841+
# ScyllaDB doesn't have triggers, skip the query
2842+
if self._is_not_scylla():
2843+
queries.append(QueryMessage(query=maybe_add_timeout_to_query(self._SELECT_TRIGGERS, self.metadata_request_timeout),
2844+
fetch_size=fetch_size, consistency_level=cl))
2845+
2846+
responses = self.connection.wait_for_responses(*queries, timeout=self.timeout, fail_on_error=False)
2847+
2848+
if self._is_not_scylla():
2849+
((ks_success, ks_result),
2850+
(table_success, table_result),
2851+
(col_success, col_result),
2852+
(types_success, types_result),
2853+
(functions_success, functions_result),
2854+
(aggregates_success, aggregates_result),
2855+
(indexes_success, indexes_result),
2856+
(views_success, views_result),
2857+
(triggers_success, triggers_result)) = responses
2858+
else:
2859+
((ks_success, ks_result),
2860+
(table_success, table_result),
2861+
(col_success, col_result),
2862+
(types_success, types_result),
2863+
(functions_success, functions_result),
2864+
(aggregates_success, aggregates_result),
2865+
(indexes_success, indexes_result),
2866+
(views_success, views_result)) = responses
28312867

28322868
self.keyspaces_result = self._handle_results(ks_success, ks_result, query_msg=queries[0])
28332869
self.tables_result = self._handle_results(table_success, table_result, query_msg=queries[1])
28342870
self.columns_result = self._handle_results(col_success, col_result, query_msg=queries[2])
2835-
self.triggers_result = self._handle_results(triggers_success, triggers_result, query_msg=queries[6])
28362871
self.types_result = self._handle_results(types_success, types_result, query_msg=queries[3])
28372872
self.functions_result = self._handle_results(functions_success, functions_result, query_msg=queries[4])
28382873
self.aggregates_result = self._handle_results(aggregates_success, aggregates_result, query_msg=queries[5])
2839-
self.indexes_result = self._handle_results(indexes_success, indexes_result, query_msg=queries[7])
2840-
self.views_result = self._handle_results(views_success, views_result, query_msg=queries[8])
2874+
self.indexes_result = self._handle_results(indexes_success, indexes_result, query_msg=queries[6])
2875+
self.views_result = self._handle_results(views_success, views_result, query_msg=queries[7])
2876+
if self._is_not_scylla():
2877+
self.triggers_result = self._handle_results(triggers_success, triggers_result, query_msg=queries[8])
2878+
else:
2879+
self.triggers_result = []
28412880

28422881
self._aggregate_results()
28432882

0 commit comments

Comments
 (0)