You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Currently, dynamic table options (e.g., overriding scan.startup.mode at query time) are only available through the SQL API via OPTIONS hints:
sql: SELECT id, name FROM kafka_table1 /*+ OPTIONS('scan.startup.mode'='earliest-offset') */;
Table API users who want to override table options dynamically have no equivalent mechanism. They are forced to drop into tEnv.executeSql() with raw SQL strings, which negates the purpose of using the type-safe Table API.
Brief change log
Add a new overloaded method from(String path, Map<String, String> dynamicOptions) to the TableEnvironment interface. This provides Table API users with the same dynamic option override capability that SQL users have via OPTIONS hints.
Verifying this change
Added 6 test methods: testFromWithDynamicOptions : Verifies dynamic options are merged with existing table options testFromWithDynamicOptionsOverridesExisting : Verifies dynamic options override static options on key conflict | testFromWithEmptyDynamicOptions : Verifies empty map is a no-op, original options preserved | testFromWithDynamicOptionsOnViewThrows : Verifies ValidationException when applied to a view testFromWithDynamicOptionsDisabledThrows : Verifies ValidationException when config is disabled testFromWithDynamicOptionsTableNotFound : Verifies ValidationException for non-existent table
Does this pull request potentially affect one of the following parts:
Dependencies (does it add or upgrade a dependency): (yes / no) - no
The public API, i.e., is any changed class annotated with @Public(Evolving): (yes / no) - yes
The serializers: (yes / no / don't know) - no
The runtime per-record code paths (performance sensitive): (yes / no / don't know) - no
Anything that affects deployment or recovery: JobManager (and its components), Checkpointing, Kubernetes/Yarn, ZooKeeper: (yes / no / don't know) - no
The S3 file system connector: (yes / no / don't know) - no
Documentation
Does this pull request introduce a new feature? (yes / no) - no
If yes, how is the feature documented? (not applicable / docs / JavaDocs / not documented) - no
Was generative AI tooling used to co-author this PR?
Thanks for the review @davidradl! I've updated the Javadoc to address all your points:
Materialized tables – clarified that the method supports both regular catalog tables and materialized tables (the implementation in ContextResolvedTable.copy() already handles this case). Only views are rejected.
Invalid options – added a paragraph explaining that option validation is lazy (happens at planning/execution time, not at from() call time), consistent with how SQL OPTIONS hints work.
Why Map<String, String> – added an explanation that this is consistent with the entire Table/SQL ecosystem (CatalogTable.getOptions(), DDL WITH clauses, SQL OPTIONS hints all use string key-value pairs). Typed values are parsed by the connector factory.
Documentation – added a section to the Table API docs (common.md) with examples showing why and how to use this feature.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What is the purpose of the change
Currently, dynamic table options (e.g., overriding
scan.startup.modeat query time) are only available through the SQL API viaOPTIONShints:sql: SELECT id, name FROM kafka_table1 /*+ OPTIONS('scan.startup.mode'='earliest-offset') */;
Table API users who want to override table options dynamically have no equivalent mechanism. They are forced to drop into
tEnv.executeSql()with raw SQL strings, which negates the purpose of using the type-safe Table API.Brief change log
Add a new overloaded method
from(String path, Map<String, String> dynamicOptions)to theTableEnvironmentinterface. This provides Table API users with the same dynamic option override capability that SQL users have viaOPTIONShints.Verifying this change
Added 6 test methods:
testFromWithDynamicOptions: Verifies dynamic options are merged with existing table optionstestFromWithDynamicOptionsOverridesExisting: Verifies dynamic options override static options on key conflict |testFromWithEmptyDynamicOptions: Verifies empty map is a no-op, original options preserved |testFromWithDynamicOptionsOnViewThrows: VerifiesValidationExceptionwhen applied to a viewtestFromWithDynamicOptionsDisabledThrows: VerifiesValidationExceptionwhen config is disabledtestFromWithDynamicOptionsTableNotFound: VerifiesValidationExceptionfor non-existent tableDoes this pull request potentially affect one of the following parts:
@Public(Evolving): (yes / no) - yesDocumentation
Was generative AI tooling used to co-author this PR?
Yes, had taken help from kiro.