Skip to content

[FLINK-39764] Support dynamic table options in Table API#28266

Open
HundalTaran wants to merge 1 commit into
apache:masterfrom
coder1592084:issue39764
Open

[FLINK-39764] Support dynamic table options in Table API#28266
HundalTaran wants to merge 1 commit into
apache:masterfrom
coder1592084:issue39764

Conversation

@HundalTaran
Copy link
Copy Markdown
Contributor

What is the purpose of the change

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) - no
  • 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?

Yes, had taken help from kiro.

@flinkbot
Copy link
Copy Markdown
Collaborator

flinkbot commented May 27, 2026

CI report:

Bot commands The @flinkbot bot supports the following commands:
  • @flinkbot run azure re-run the last Azure build

* @param path The path of a table API object to scan.
* @param dynamicOptions A map of option key-value pairs to override on the table.
* @return The {@link Table} object describing the pipeline for further transformations.
* @throws ValidationException if the table is not found, is a view, or dynamic options are
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.

what about materialized tables?

* @param path The path of a table API object to scan.
* @param dynamicOptions A map of option key-value pairs to override on the table.
* @return The {@link Table} object describing the pipeline for further transformations.
* @throws ValidationException if the table is not found, is a view, or dynamic options are
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.

what happens if the options specified are not valid - I assume this would be a validation error as well.

* @throws ValidationException if the table is not found, is a view, or dynamic options are
* disabled.
*/
Table from(String path, Map<String, String> dynamicOptions);
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.

are all dynamic options Strings?

Table from(String path);

/**
* Reads a registered table and applies dynamic options, returning the corresponding {@link
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.

We should update the documentation to describe this and why the user would want to do this with examples.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants