@@ -52,7 +52,7 @@ def action_execute_query_atomic(self: QueryMixinHost) -> None:
5252 self .notify ("Connect to a server to execute queries" , severity = "warning" )
5353 return
5454
55- query = self .query_input . text . strip ()
55+ query = self ._get_query_to_execute ()
5656
5757 if not query :
5858 self .notify ("No query to execute" , severity = "warning" )
@@ -113,13 +113,36 @@ def _proceed() -> None:
113113
114114 self ._maybe_confirm_query (statement , _proceed )
115115
116+ def _get_query_to_execute (self : QueryMixinHost ) -> str :
117+ """Return selected text if present, otherwise the full query."""
118+ selection = self .query_input .selection
119+ if selection .start != selection .end :
120+ from sqlit .domains .query .editing import get_selection_text
121+
122+ start = selection .start
123+ end = selection .end
124+ if start > end :
125+ start , end = end , start
126+
127+ selected_sql = get_selection_text (
128+ self .query_input .text ,
129+ start [0 ],
130+ start [1 ],
131+ end [0 ],
132+ end [1 ],
133+ )
134+ if selected_sql and selected_sql .strip ():
135+ return selected_sql .strip ()
136+
137+ return self .query_input .text .strip ()
138+
116139 def _execute_query_common (self : QueryMixinHost , keep_insert_mode : bool ) -> None :
117140 """Common query execution logic."""
118141 if self .current_connection is None or self .current_provider is None :
119142 self .notify ("Connect to a server to execute queries" , severity = "warning" )
120143 return
121144
122- query = self .query_input . text . strip ()
145+ query = self ._get_query_to_execute ()
123146
124147 if not query :
125148 self .notify ("No query to execute" , severity = "warning" )
@@ -148,6 +171,7 @@ def _maybe_confirm_query(self: QueryMixinHost, query: str, proceed: Callable[[],
148171 format_alert_mode ,
149172 should_confirm ,
150173 )
174+ from sqlit .domains .query .app .multi_statement import get_executable_sql
151175 from sqlit .shared .ui .screens .confirm import ConfirmScreen
152176
153177 raw_mode = getattr (self .services .runtime , "query_alert_mode" , 0 ) or 0
@@ -160,7 +184,14 @@ def _maybe_confirm_query(self: QueryMixinHost, query: str, proceed: Callable[[],
160184 proceed ()
161185 return
162186
163- severity = classify_query_alert (query )
187+ # Get the SQL that will actually execute (without comment-only statements)
188+ executable_sql = get_executable_sql (query )
189+ if not executable_sql :
190+ # Nothing to execute after filtering comments
191+ proceed ()
192+ return
193+
194+ severity = classify_query_alert (executable_sql )
164195 if severity == AlertSeverity .NONE or not should_confirm (mode , severity ):
165196 proceed ()
166197 return
@@ -171,13 +202,6 @@ def _maybe_confirm_query(self: QueryMixinHost, query: str, proceed: Callable[[],
171202 elif severity == AlertSeverity .WRITE :
172203 title = "Confirm write query"
173204
174- description = None
175- snippet = query .strip ().splitlines ()[0 ] if query .strip () else ""
176- if snippet :
177- if len (snippet ) > 120 :
178- snippet = snippet [:117 ] + "..."
179- description = snippet
180-
181205 def _on_result (confirmed : bool | None ) -> None :
182206 if confirmed :
183207 proceed ()
@@ -188,7 +212,7 @@ def _on_result(confirmed: bool | None) -> None:
188212 )
189213
190214 self .push_screen (
191- ConfirmScreen (title , description , yes_label = "Run " , no_label = "Cancel " ),
215+ ConfirmScreen (title , executable_sql , yes_label = "Yes " , no_label = "No " ),
192216 _on_result ,
193217 )
194218
@@ -386,17 +410,20 @@ async def _run_query_async(self: QueryMixinHost, query: str, keep_insert_mode: b
386410
387411 # Use TransactionExecutor for transaction-aware query execution
388412 executor = self ._get_transaction_executor (config , provider )
389- # Check if this is a multi-statement query
413+ # Check if this is a multi-statement query (after filtering comment-only statements)
414+ from sqlit .domains .query .editing .comments import is_comment_only_statement
415+
390416 statements = split_statements (query )
391- is_multi_statement = len (statements ) > 1
417+ executable_statements = [s for s in statements if not is_comment_only_statement (s )]
418+ is_multi_statement = len (executable_statements ) > 1
392419
393420 try :
394421 start_time = time .perf_counter ()
395422 max_rows = self .services .runtime .max_rows or MAX_FETCH_ROWS
396423
397424 use_process_worker = self ._use_process_worker (provider )
398- if use_process_worker and statements :
399- statement = statements [0 ].strip ()
425+ if use_process_worker and executable_statements :
426+ statement = executable_statements [0 ].strip ()
400427 if self .in_transaction or is_transaction_start (statement ) or is_transaction_end (statement ):
401428 use_process_worker = False
402429
0 commit comments