Skip to content

fix(security): Add input validation to cancel_query_id to prevent injection#36722

Open
ColeMurray wants to merge 4 commits into
apache:masterfrom
ColeMurray:security/cancel-query-input-validation
Open

fix(security): Add input validation to cancel_query_id to prevent injection#36722
ColeMurray wants to merge 4 commits into
apache:masterfrom
ColeMurray:security/cancel-query-input-validation

Conversation

@ColeMurray

@ColeMurray ColeMurray commented Dec 18, 2025

Copy link
Copy Markdown

User description

Summary

This PR adds defense-in-depth input validation for the cancel_query_id parameter in all database engine specs that use string interpolation in SQL/command execution.

While cancel_query_id typically comes from trusted database sources (e.g., CONNECTION_ID()), adding validation ensures safety even if the data source is compromised or if future code changes introduce user-controlled input.

Changes

  • Add validate_cancel_query_id() static method to BaseEngineSpec for reusable validation
  • Add input validation to cancel_query() in:
    • MySQLEngineSpec - numeric validation
    • SingleStoreSpec - space-separated numerics (CONNECTION_ID + AGGREGATOR_ID)
    • PostgresEngineSpec - numeric validation (PID)
    • RedshiftEngineSpec - numeric validation (PID)
    • SnowflakeEngineSpec - numeric validation (session ID)
    • TrinoEngineSpec - alphanumeric with underscores (query ID format)
    • ImpalaEngineSpec - hex format with colon (GUID format)
    • OcientEngineSpec - alphanumeric with dashes
  • Add comprehensive test suite with 22 test cases covering:
    • Valid input acceptance
    • SQL injection payload rejection
    • URL injection payload rejection (for Impala HTTP-based cancellation)
    • Edge cases (None, empty string, special characters)

Security Impact

This addresses potential SQL injection vulnerabilities in cancel_query implementations by ensuring cancel_query_id matches expected format before use in:

  • KILL CONNECTION {id} (MySQL, SingleStore)
  • SELECT SYSTEM$CANCEL_ALL_QUERIES({id}) (Snowflake)
  • SELECT pg_terminate_backend(pid) WHERE pid='{id}' (PostgreSQL)
  • SELECT pg_cancel_backend(procpid) WHERE procpid='{id}' (Redshift)
  • CALL system.runtime.kill_query(query_id => '{id}', ...) (Trino)
  • HTTP requests with query_id={id} (Impala)
  • CANCEL {id} (Ocient)

Test Plan

  • Added unit tests for validate_cancel_query_id() base method
  • Added unit tests for each affected engine spec
  • All 22 tests pass
  • Manual testing with actual database connections

Related Issues

This is a defense-in-depth security improvement. While there is no currently known exploitable path to inject malicious cancel_query_id values (as they come from database functions), this validation provides protection against:

  1. Future code changes that might introduce user input
  2. Compromised data sources
  3. Security audit findings for using f-string interpolation in SQL

CodeAnt-AI Description

Validate cancel_query_id to block injection in DB cancel operations

What Changed

  • A reusable validation function was added to check cancel_query_id formats before use.
  • Database cancel operations now reject malformed or malicious identifiers for MySQL, SingleStore, Postgres, Redshift, Snowflake, Trino, Impala, and Ocient; cancellation attempts with invalid IDs return false and do not execute cancel commands or HTTP calls.
  • New unit tests cover valid formats, SQL injection payloads, URL injection cases (Impala), and several edge cases.

Impact

✅ Fewer SQL/URL injection attempts succeeding during query cancellation
✅ Safer remote cancel requests (invalid IDs are rejected before execution)
✅ Clearer cancellation failures when identifiers are malformed

💡 Usage Guide

Checking Your Pull Request

Every time you make a pull request, our system automatically looks through it. We check for security issues, mistakes in how you're setting up your infrastructure, and common code problems. We do this to make sure your changes are solid and won't cause any trouble later.

Talking to CodeAnt AI

Got a question or need a hand with something in your pull request? You can easily get in touch with CodeAnt AI right here. Just type the following in a comment on your pull request, and replace "Your question here" with whatever you want to ask:

@codeant-ai ask: Your question here

This lets you have a chat with CodeAnt AI about your pull request, making it easier to understand and improve your code.

Example

@codeant-ai ask: Can you suggest a safer alternative to storing this secret?

Preserve Org Learnings with CodeAnt

You can record team preferences so CodeAnt AI applies them in future reviews. Reply directly to the specific CodeAnt AI suggestion (in the same thread) and replace "Your feedback here" with your input:

@codeant-ai: Your feedback here

This helps CodeAnt AI learn and adapt to your team's coding style and standards.

Example

@codeant-ai: Do not flag unused imports.

Retrigger review

Ask CodeAnt AI to review the PR again, by typing:

@codeant-ai: review

Check Your Repository Health

To analyze the health of your code repository, visit our dashboard at https://app.codeant.ai. This tool helps you identify potential issues and areas for improvement in your codebase, ensuring your repository maintains high standards of code health.

@codeant-ai-for-open-source

Copy link
Copy Markdown
Contributor

CodeAnt AI is reviewing your PR.


Thanks for using CodeAnt! 🎉

We're free for open-source projects. if you're enjoying it, help us grow by sharing.

Share on X ·
Reddit ·
LinkedIn

@bito-code-review

bito-code-review Bot commented Dec 18, 2025

Copy link
Copy Markdown
Contributor

Code Review Agent Run #80cdee

Actionable Suggestions - 0
Additional Suggestions - 3
  • superset/db_engine_specs/mysql.py - 1
    • Incorrect regex allows invalid '0' · Line 298-298
      The regex r"^\d+$" allows "0", but MySQL connection IDs start from 1. Although input is typically trusted, this validation should be precise for defense-in-depth.
  • superset/db_engine_specs/ocient.py - 1
    • Outdated comment on query ID format · Line 386-386
      The comment on line 386 states that Ocient query IDs are 'typically numeric', but Ocient documentation confirms they are UUIDs (e.g., 'ac4dd039-e385-400b-a428-fd1fdcd02e30'). This outdated comment should be corrected to avoid confusion, as 'typically' is also time-specific language per project guidelines.
  • superset/db_engine_specs/impala.py - 1
    • Regex pattern inconsistency · Line 195-195
      The regex pattern allows variable-length hex strings, but the code generates exactly 16:16 format IDs and the comment specifies 32 hex chars. While this doesn't break functionality, tightening it to exact lengths improves precision and matches the implementation.
Review Details
  • Files reviewed - 10 · Commit Range: b7d8564..b7d8564
    • superset/db_engine_specs/base.py
    • superset/db_engine_specs/impala.py
    • superset/db_engine_specs/mysql.py
    • superset/db_engine_specs/ocient.py
    • superset/db_engine_specs/postgres.py
    • superset/db_engine_specs/redshift.py
    • superset/db_engine_specs/singlestore.py
    • superset/db_engine_specs/snowflake.py
    • superset/db_engine_specs/trino.py
    • tests/unit_tests/db_engine_specs/test_cancel_query_validation.py
  • Files skipped - 0
  • Tools
    • Whispers (Secret Scanner) - ✔︎ Successful
    • Detect-secrets (Secret Scanner) - ✔︎ Successful
    • MyPy (Static Code Analysis) - ✔︎ Successful
    • Astral Ruff (Static Code Analysis) - ✔︎ Successful

Bito Usage Guide

Commands

Type the following command in the pull request comment and save the comment.

  • /review - Manually triggers a full AI review.

  • /pause - Pauses automatic reviews on this pull request.

  • /resume - Resumes automatic reviews.

  • /resolve - Marks all Bito-posted review comments as resolved.

  • /abort - Cancels all in-progress reviews.

Refer to the documentation for additional commands.

Configuration

This repository uses Default Agent You can customize the agent settings here or contact your Bito workspace admin at evan@preset.io.

Documentation & Help

AI Code Review powered by Bito Logo

@dosubot dosubot Bot added the change:backend Requires changing the backend label Dec 18, 2025
@codeant-ai-for-open-source codeant-ai-for-open-source Bot added the size:L This PR changes 100-499 lines, ignoring generated files label Dec 18, 2025
@codeant-ai-for-open-source

Copy link
Copy Markdown
Contributor

Nitpicks 🔍

🔒 No security issues identified
⚡ Recommended areas for review

  • Possible SQL injection
    The PR adds validation for cancel_query_id (numeric), but the cancel SQL is still built using Python string interpolation (f-string).
    Relying solely on validation increases risk if the validation is ever changed or bypassed. Prefer using a parameterized query to remove interpolation entirely.

  • SQL injection risk
    The code still uses string interpolation to build the SQL executed by the cursor:
    cursor.execute(f"SELECT SYSTEM$CANCEL_ALL_QUERIES({cancel_query_id})"). Although the new validation reduces risk, relying on a regex and an f-string leaves a surface where future changes to the pattern or a missed validation could reintroduce injection. Prefer parameterized execution where the DB-API/driver supports it.

  • SQL string interpolation
    The code still constructs the CALL statement with f-string interpolation of cancel_query_id. Even with validation this is fragile. Prefer using parameterized execution or the driver's native cancellation API to avoid accidental injection if validation or patterns change.

  • Residual SQL injection risk
    The function still constructs the cancel SQL using string interpolation. Although the new validation reduces risk, using interpolated SQL literals can be fragile if validation changes or is bypassed. Prefer parameterized queries or explicit type coercion to eliminate string interpolation entirely.

  • Interpolated SQL still risky
    The code validates cancel_query_id with a regex but still injects the (string) value into SQL via an f-string. If validation is ever bypassed or the pattern is changed, this interpolation could be exploited. Stronger sanitization (e.g., explicit integer casting of each whitespace-separated token) or constructing the command from integers should be used to guarantee safety.

…ection

Add defense-in-depth validation for cancel_query_id parameter in all
database engine specs that use string interpolation in SQL/command
execution. While cancel_query_id typically comes from trusted database
sources (e.g., CONNECTION_ID()), validation ensures safety even if the
data source is compromised.

Changes:
- Add validate_cancel_query_id() static method to BaseEngineSpec
- Add input validation to cancel_query() in:
  - MySQLEngineSpec (numeric validation)
  - SingleStoreSpec (space-separated numerics)
  - PostgresEngineSpec (numeric validation)
  - RedshiftEngineSpec (numeric validation)
  - SnowflakeEngineSpec (numeric validation)
  - TrinoEngineSpec (alphanumeric with underscores)
  - ImpalaEngineSpec (hex format with colon)
  - OcientEngineSpec (alphanumeric with dashes)
- Add comprehensive test suite for validation

Security: This addresses potential SQL injection and URL injection
vulnerabilities in cancel_query implementations by ensuring
cancel_query_id matches expected format before use.

Signed-off-by: ColeMurray <cole@waclaude.com>
@ColeMurray ColeMurray force-pushed the security/cancel-query-input-validation branch from b7d8564 to e9f4c21 Compare December 18, 2025 04:41
Comment thread superset/db_engine_specs/base.py Outdated
Comment thread superset/db_engine_specs/impala.py Outdated

try:
impala_host = query.database.url_object.host
url = f"http://{impala_host}:25000/cancel_query?query_id={cancel_query_id}"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion: The code assumes query.database.url_object.host is present; if impala_host is None or empty the constructed URL will be invalid (e.g., "http://None:25000") and may lead to unexpected requests or errors, so check the host and return False early when missing. [null pointer]

Severity Level: Minor ⚠️

Suggested change
url = f"http://{impala_host}:25000/cancel_query?query_id={cancel_query_id}"
if not impala_host:
return False
Why it matters? ⭐

Verifying impala_host before building the URL avoids attempting an HTTP call to an invalid
host (e.g. "None") and prevents unnecessary DNS resolution/network errors. The current try/except
would catch those failures, but an explicit guard is clearer and avoids making a doomed request.

Prompt for AI Agent 🤖
This is a comment left during a code review.

**Path:** superset/db_engine_specs/impala.py
**Line:** 200:200
**Comment:**
	*Null Pointer: The code assumes `query.database.url_object.host` is present; if `impala_host` is None or empty the constructed URL will be invalid (e.g., "http://None:25000") and may lead to unexpected requests or errors, so check the host and return False early when missing.

Validate the correctness of the flagged issue. If correct, How can I resolve this? If you propose a fix, implement it and please make it concise.

Comment thread superset/db_engine_specs/mysql.py
Comment thread superset/db_engine_specs/redshift.py
# Validate cancel_query_id to prevent SQL injection
# SingleStore format: "CONNECTION_ID AGGREGATOR_ID" (two space-separated integers)
if not cls.validate_cancel_query_id(cancel_query_id, r"^\d+(\s+\d+)?$"):
return False

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion: When validation fails the method returns False silently; log a warning with the invalid cancel_query_id to aid debugging and alert operators rather than failing quietly. [possible bug]

Severity Level: Critical 🚨

Suggested change
return False
logger.warning("cancel_query called with invalid cancel_query_id: %r", cancel_query_id)
Why it matters? ⭐

Returning False silently on validation failure makes debugging harder. Emitting a logger.warning with the invalid value (non-sensitive) improves observability and helps operators triage issues; this is a non-invasive, useful change.

Prompt for AI Agent 🤖
This is a comment left during a code review.

**Path:** superset/db_engine_specs/singlestore.py
**Line:** 547:547
**Comment:**
	*Possible Bug: When validation fails the method returns False silently; log a warning with the invalid `cancel_query_id` to aid debugging and alert operators rather than failing quietly.

Validate the correctness of the flagged issue. If correct, How can I resolve this? If you propose a fix, implement it and please make it concise.

Comment on lines +96 to +103
@patch("sqlalchemy.engine.Engine.connect")
def test_cancel_query_valid_id(self, engine_mock: Mock) -> None:
"""Test that valid MySQL connection ID works"""
from superset.db_engine_specs.mysql import MySQLEngineSpec
from superset.models.sql_lab import Query

query = Query()
cursor_mock = engine_mock.return_value.__enter__.return_value

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion: Tests patching "sqlalchemy.engine.Engine.connect" but then derive a cursor via the patch's return value; this is unnecessary and fragile for unit tests that directly call engine-spec cancel_query implementations. Create an explicit Mock cursor instead and remove the patch decorator/parameter to avoid coupling tests to SQLAlchemy internals and to ensure the cursor contract is explicit. [possible bug]

Severity Level: Critical 🚨

Suggested change
@patch("sqlalchemy.engine.Engine.connect")
def test_cancel_query_valid_id(self, engine_mock: Mock) -> None:
"""Test that valid MySQL connection ID works"""
from superset.db_engine_specs.mysql import MySQLEngineSpec
from superset.models.sql_lab import Query
query = Query()
cursor_mock = engine_mock.return_value.__enter__.return_value
def test_cancel_query_valid_id(self) -> None:
"""Test that valid MySQL connection ID works"""
from superset.db_engine_specs.mysql import MySQLEngineSpec
from superset.models.sql_lab import Query
query = Query()
cursor_mock = Mock()
cursor_mock.execute = Mock()
Why it matters? ⭐

The current test unnecessarily ties itself to SQLAlchemy internals by patching
Engine.connect only to extract a cursor mock. Replacing that with an explicit
Mock cursor makes the test clearer and less brittle without changing behavior.
The improved code is executable and simplifies intent; it's a valid test robustness improvement.

Prompt for AI Agent 🤖
This is a comment left during a code review.

**Path:** tests/unit_tests/db_engine_specs/test_cancel_query_validation.py
**Line:** 96:103
**Comment:**
	*Possible Bug: Tests patching "sqlalchemy.engine.Engine.connect" but then derive a cursor via the patch's return value; this is unnecessary and fragile for unit tests that directly call engine-spec `cancel_query` implementations. Create an explicit `Mock` cursor instead and remove the patch decorator/parameter to avoid coupling tests to SQLAlchemy internals and to ensure the cursor contract is explicit.

Validate the correctness of the flagged issue. If correct, How can I resolve this? If you propose a fix, implement it and please make it concise.

@@ -381,7 +381,13 @@ def handle_cursor(cls, cursor: Any, query: Query) -> None:
def cancel_query(cls, cursor: Any, query: Query, cancel_query_id: str) -> bool:
with OcientEngineSpec.query_id_mapping_lock:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion: The code holds query_id_mapping_lock while calling cursor.execute(...); this performs I/O while a global lock is held, which can cause contention or deadlocks. Fetch and validate the mapping under the lock, release the lock before executing the CANCEL command, then reacquire the lock to remove the mapping (use a safe removal like pop). [race condition]

Severity Level: Minor ⚠️

"""
# Validate cancel_query_id to prevent SQL injection
# PostgreSQL pg_backend_pid() returns an integer
if not cls.validate_cancel_query_id(cancel_query_id, r"^\d+$"):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion: cancel_query_id may not be an integer type; converting it to int when executing the parameterized query can raise ValueError if the value isn't numeric — validate and convert to an integer first and only call execute if conversion succeeds. [type error]

Severity Level: Minor ⚠️

@codeant-ai-for-open-source

Copy link
Copy Markdown
Contributor

CodeAnt AI finished reviewing your PR.

- Change re.match to re.fullmatch for more explicit matching
- Tighten Impala regex to require exactly 16 hex chars per side
- Add null check for impala_host before making HTTP request
- Update tests to reflect stricter Impala format validation
- Add test for null host case

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR adds defense-in-depth input validation for the cancel_query_id parameter across multiple database engine specifications to prevent potential SQL/command injection vulnerabilities. A reusable validate_cancel_query_id() static method is added to BaseEngineSpec and applied consistently across eight database engines that use string interpolation in their cancel operations.

Key Changes:

  • Implemented centralized validation logic in BaseEngineSpec using re.fullmatch() for strict pattern matching
  • Added format-specific validation to MySQL, SingleStore, PostgreSQL, Redshift, Snowflake, Trino, Impala, and Ocient engine specs
  • Added comprehensive test suite with 23 test cases covering valid inputs, SQL injection payloads, and edge cases

Reviewed changes

Copilot reviewed 10 out of 10 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
superset/db_engine_specs/base.py Adds reusable validate_cancel_query_id() static method using re.fullmatch() for pattern validation
superset/db_engine_specs/mysql.py Validates MySQL connection IDs as numeric before KILL CONNECTION command
superset/db_engine_specs/singlestore.py Validates space-separated numeric IDs (connection + aggregator) for SingleStore
superset/db_engine_specs/postgres.py Validates PostgreSQL PIDs as numeric before query termination
superset/db_engine_specs/redshift.py Validates Redshift PIDs as numeric before query cancellation
superset/db_engine_specs/snowflake.py Validates alphanumeric session IDs for Snowflake's cancel operation
superset/db_engine_specs/trino.py Validates Trino query IDs (alphanumeric with underscores) before cancel call
superset/db_engine_specs/impala.py Validates hex-formatted query IDs and adds null host check for HTTP-based cancellation
superset/db_engine_specs/ocient.py Validates query IDs from internal mapping before cancel command
tests/unit_tests/db_engine_specs/test_cancel_query_validation.py Comprehensive test suite covering validation behavior, injection attempts, and edge cases

Comment thread superset/db_engine_specs/ocient.py Outdated
cursor.execute(f"CANCEL {OcientEngineSpec.query_id_mapping[query.id]}")
ocient_query_id = OcientEngineSpec.query_id_mapping[query.id]
# Validate query ID to prevent SQL injection (defense-in-depth)
# Ocient query IDs are typically numeric

Copilot AI Jan 6, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The comment states "Ocient query IDs are typically numeric" but the validation pattern r"^[\w\-]+$" allows alphanumeric characters, underscores, and dashes. This inconsistency is confusing. The pattern should either be updated to match the comment (if query IDs are truly numeric: r"^\d+$"), or the comment should be updated to accurately describe the allowed format (e.g., "alphanumeric with underscores and dashes").

Suggested change
# Ocient query IDs are typically numeric
# Ocient query IDs are validated as alphanumeric and may include
# underscores and dashes (see validation pattern below).

Copilot uses AI. Check for mistakes.

from unittest.mock import Mock, patch

import pytest

Copilot AI Jan 6, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The pytest import on line 27 is unused. It should be removed to keep the imports clean.

Suggested change
import pytest

Copilot uses AI. Check for mistakes.
Comment on lines +2197 to +2199
if cancel_query_id is None:
return False
return bool(re.fullmatch(pattern, str(cancel_query_id)))

Copilot AI Jan 6, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The regex patterns are inconsistent in their use of anchors. Some patterns include ^ and $ anchors (e.g., MySQL, PostgreSQL, Redshift, Snowflake, Trino, SingleStore, Ocient) while others don't (e.g., Impala). Since validate_cancel_query_id uses re.fullmatch() which implicitly anchors the pattern, the explicit anchors are redundant. For consistency and clarity, either:

  1. Remove anchors from all patterns (recommended, since fullmatch handles this), or
  2. Add anchors to the Impala pattern

Recommended: Remove ^ and $ from all patterns since fullmatch already ensures the entire string matches.

Copilot uses AI. Check for mistakes.
None, query, "abc123def4567890:789abc123def4567"
)
assert result is False
requests_mock.assert_not_called()

Copilot AI Jan 6, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The Ocient engine spec has been modified to add input validation for cancel_query_id, but there are no corresponding unit tests added for OcientEngineSpec. The PR description mentions "22 test cases" but Ocient is missing from the test suite. Tests should be added to verify that:

  1. Valid Ocient query IDs pass validation
  2. SQL injection payloads are blocked
  3. Invalid formats are rejected

The test class should follow the same pattern as the other engine specs (e.g., TestMySQLCancelQueryValidation, TestImpalaCancelQueryValidation, etc.).

Copilot uses AI. Check for mistakes.
@rusackas

Copy link
Copy Markdown
Member

Thanks @ColeMurray. Sorry your PR description seems to have been overwritten by the bot back when it was new. Anyway, there are a LOT of bot comments to take into consideration on this thread, but it looks like a solid defense-in-depth hardening with good test coverage across the engine specs. If you can resolve some of the issues the bots point out, if relevant, I think we can get this one to land soon. Sorry it didn't get more attention sooner.

@codecov

codecov Bot commented Jun 13, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 8.00000% with 23 lines in your changes missing coverage. Please review.
✅ Project coverage is 55.60%. Comparing base (b05fe48) to head (8404cc8).
⚠️ Report is 3 commits behind head on master.

Files with missing lines Patch % Lines
superset/db_engine_specs/impala.py 0.00% 4 Missing ⚠️
superset/db_engine_specs/ocient.py 0.00% 4 Missing ⚠️
superset/db_engine_specs/base.py 40.00% 3 Missing ⚠️
superset/db_engine_specs/mysql.py 0.00% 2 Missing ⚠️
superset/db_engine_specs/postgres.py 0.00% 2 Missing ⚠️
superset/db_engine_specs/redshift.py 0.00% 2 Missing ⚠️
superset/db_engine_specs/singlestore.py 0.00% 2 Missing ⚠️
superset/db_engine_specs/snowflake.py 0.00% 2 Missing ⚠️
superset/db_engine_specs/trino.py 0.00% 2 Missing ⚠️

❗ There is a different number of reports uploaded between BASE (b05fe48) and HEAD (8404cc8). Click for more details.

HEAD has 101 uploads less than BASE
Flag BASE (b05fe48) HEAD (8404cc8)
python 79 2
presto 13 1
hive 13 1
Additional details and impacted files
@@            Coverage Diff             @@
##           master   #36722      +/-   ##
==========================================
- Coverage   64.28%   55.60%   -8.69%     
==========================================
  Files        2659     2659              
  Lines      144304   144331      +27     
  Branches    33260    33270      +10     
==========================================
- Hits        92773    80257   -12516     
- Misses      49902    63351   +13449     
+ Partials     1629      723     -906     
Flag Coverage Δ
hive 39.42% <8.00%> (-0.01%) ⬇️
mysql ?
postgres ?
presto 41.00% <8.00%> (-0.02%) ⬇️
python 41.07% <8.00%> (-18.64%) ⬇️
sqlite ?
unit ?

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

- Wrap over-long comment lines in impala/singlestore/trino specs (E501)
- ruff-format the test file and drop the unused `pytest` import
- Anchor the Impala regex (^...$) for consistency with the other specs
  (re.fullmatch already anchors, so behavior is unchanged)
- Correct the Ocient comment to match its actual `[\w-]` pattern
- Add the missing Ocient cancel_query validation tests

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@rusackas rusackas added the merge-if-green If approved and tests are green, please go ahead and merge it for me label Jun 13, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

change:backend Requires changing the backend merge-if-green If approved and tests are green, please go ahead and merge it for me size:L This PR changes 100-499 lines, ignoring generated files size/XL

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants