Highlights
-
Oracle and SingleStore support for LIKE-pattern Expectations — The four LIKE-pattern Expectations (ExpectColumnValuesToMatchLikePattern, ExpectColumnValuesToMatchLikePatternList, ExpectColumnValuesToNotMatchLikePattern, ExpectColumnValuesToNotMatchLikePatternList) now run on Oracle and SingleStore, where they previously raised NotImplementedError. MySQL support now covers every SQLAlchemy MySQL dialect, SingleStore gets the same backslash translation of
escapethat BigQuery and ClickHouse use, and dialects that cannot run LIKE patterns now raise a NotImplementedError with the dialect name rather than failing with an AttributeError. (#12274)import great_expectations.expectations as gxe batch.validate( gxe.ExpectColumnValuesToMatchLikePattern( column="name", like_pattern="a!_b", escape="!", ) )
-
The LIKE
escapecharacter now works on BigQuery and ClickHouse — BigQuery and ClickHouse have no ESCAPE clause, so the LIKE-pattern Expectations used to refuse anescapeargument on those dialects. The pattern is now rewritten into the backslash form both engines understand, matching the same rows asESCAPEdoes on PostgreSQL. A trailing unpaired escape character raises a ValueError before any SQL is sent, and patterns withoutescapeare still passed through verbatim. (#12291)import great_expectations.expectations as gxe # On BigQuery or ClickHouse: matches only the literal value "a_c" batch.validate( gxe.ExpectColumnValuesToMatchLikePattern( column="col", like_pattern="a!_c", escape="!", ) )
-
Snowflake key-pair authentication works again on snowflake-sqlalchemy 2.x — Creating an engine for a Snowflake datasource that uses key-pair authentication failed with a TypeError on snowflake-sqlalchemy 2.x. The private key is now handed to the connector through connect_args rather than the connection URL, so key-pair datasources connect again and credential material no longer appears in a URL. A private key supplied directly via connect_args still takes precedence, and password authentication is unchanged. (#12326)
-
Spark S3 assets honor recursive_file_lookup when discovering files — A Spark S3 asset configured with
recursive_file_lookup=Truenow finds objects in subfolders of itss3_prefixinstead of failing its connection check.s3_recursive_file_discoveryfalls back to the asset'srecursive_file_lookupwhen it is not set explicitly, and the test-connection error message reports the effective value. (#12292)asset = datasource.add_directory_parquet_asset( name="my_asset", s3_prefix="data/", recursive_file_lookup=True, )
-
No more pandas 3.1 deprecation warnings from internal calls — On pandas 3.1, internal uses of the deprecated
inplacekeyword caused Pandas4Warning deprecation warnings and, in environments that escalate warnings to errors, outright failures in metric resolution and inValidator.head(). Those calls now use the reassignment form pandas recommends, with identical results. (#12335)
Changes
Features
- The LIKE-pattern Expectations now accept an
escapecharacter on BigQuery and ClickHouse, rewriting the pattern into the backslash form those engines understand instead of refusing it; an unpaired trailing escape raises a ValueError before any SQL is sent. (#12291)
Bug fixes
- The four LIKE-pattern Expectations now work on Oracle and SingleStore instead of raising NotImplementedError, recognize every SQLAlchemy MySQL dialect, translate
escapeinto SingleStore's backslash form, and raise a NotImplementedError naming the dialect when LIKE patterns are genuinely unsupported. (#12274) - An unexpected_rows_query against SQL Server or Oracle no longer corrupts column names that begin with "true" (such as
true_positive) when theWHERE trueliteral is rewritten, so valid queries no longer fail with a syntax error. (#12235) - Spark S3 file and directory assets now derive S3 file discovery from
recursive_file_lookupwhens3_recursive_file_discoveryis not set, so assets whose files live in subfolders of their prefix connect and discover those files; an explicits3_recursive_file_discoverystill takes precedence and the connection error reports the effective value. (#12292) - Snowflake key-pair authentication passes
private_keyto the connector through connect_args instead of the connection URL, so engine creation succeeds again on snowflake-sqlalchemy 2.x and the key is kept out of the URL; a key supplied via connect_args still wins. (#12326) - ExpectColumnKLDivergenceToBeLessThan now returns a plain Python bool for
success, so printing a result or serializing it with json.dumps no longer raises "Object of type bool is not JSON serializable". (#12248)
Maintenance
- Bump the follow-redirects docs dependency from 1.16.0 to 1.16.1. (#12327)
- Bump the shell-quote docs dependency from 1.9.0 to 1.12.0. (#12305)
- Replace internal pandas calls that use the
inplacekeyword deprecated in pandas 3.1, so GX no longer emits deprecation warnings or fails metric resolution andValidator.head()in environments that turn warnings into errors. (#12335) - Bring the modules under great_expectations/expectations/core/ into the type check, with no public signature or behavior changes. (#12287)
- Filter the google.api_core Python-version FutureWarning by category and module so test collection no longer errors on Python 3.10, and cap pyarrow below 26 in the NumPy 1 minimum-version lanes. (#12312)
- Remove the notify_on_release CI job, which failed on every tag push and masked real release failures. No user-visible change. (#12307)
Contributors
Thanks to @KoksalBerkay (first contribution), @feiiiiii5, @LuisFigueroaG (first contribution), @nanjeshramesh.