SQL Client for exploring and submitting SQL programs to Flink
—
Interactive and non-interactive CLI for executing SQL statements with terminal support, result display, and command history. The CLI provides a rich interactive experience with auto-completion, syntax highlighting, and multiple result display formats.
Core CLI client implementation handling both interactive and non-interactive SQL execution.
public class CliClient implements AutoCloseable {
/**
* Create CLI client with terminal factory and session context
* @param terminalFactory Factory for creating terminal instances
* @param sessionId Session identifier for executor operations
* @param executor Executor instance for SQL operations
* @param historyFilePath Path to command history file
*/
public CliClient(Supplier<Terminal> terminalFactory, String sessionId, Executor executor, Path historyFilePath);
/**
* Create CLI client with input transformer for password masking
* @param terminalFactory Factory for creating terminal instances
* @param sessionId Session identifier for executor operations
* @param executor Executor instance for SQL operations
* @param historyFilePath Path to command history file
* @param inputTransformer Callback for transforming input (e.g., password masking)
*/
public CliClient(Supplier<Terminal> terminalFactory, String sessionId, Executor executor, Path historyFilePath, MaskingCallback inputTransformer);
}Opens interactive SQL shell with readline support, auto-completion, and command history.
/**
* Execute CLI in interactive mode with full terminal features
* Provides SQL auto-completion, command history, and result display
*/
public void executeInInteractiveMode();Usage Example:
import org.apache.flink.table.client.cli.CliClient;
import org.apache.flink.table.client.cli.TerminalUtils;
// Create CLI client and start interactive mode
try (CliClient cli = new CliClient(
TerminalUtils::createDefaultTerminal,
sessionId,
executor,
Paths.get(System.getProperty("user.home"), ".flink-sql-history")
)) {
cli.executeInInteractiveMode();
}Interactive mode features:
Executes SQL content from files or strings without interactive features.
/**
* Execute SQL content in non-interactive mode
* @param content SQL content to execute (file content or statement string)
*/
public void executeInNonInteractiveMode(String content);Usage Example:
// Execute SQL from file content
String sqlContent = Files.readString(Paths.get("queries.sql"));
cli.executeInNonInteractiveMode(sqlContent);
// Execute single statement
cli.executeInNonInteractiveMode("SELECT COUNT(*) FROM users");Non-interactive mode characteristics:
Executes initialization scripts with restricted operation support and silent output.
/**
* Execute initialization script content
* @param content SQL initialization script content
* @return true if initialization succeeded, false if any errors occurred
*/
public boolean executeInitialization(String content);Usage Example:
// Execute initialization script
String initScript = """
SET 'sql-client.execution.result-mode' = 'tableau';
CREATE CATALOG my_catalog WITH (...);
USE CATALOG my_catalog;
""";
boolean success = cli.executeInitialization(initScript);
if (!success) {
System.err.println("Initialization failed - check logs for details");
}Initialization mode restrictions:
Access and control terminal properties and display.
/**
* Get the current terminal instance
* @return Terminal instance for advanced terminal operations
*/
public Terminal getTerminal();
/**
* Clear terminal screen (platform-aware)
*/
public void clearTerminal();
/**
* Check if terminal supports advanced features
* @return true if terminal is plain/simple, false if it supports advanced features
*/
public boolean isPlainTerminal();
/**
* Get terminal width
* @return Terminal width in characters
*/
public int getWidth();
/**
* Get terminal height
* @return Terminal height in lines
*/
public int getHeight();Usage Example:
// Check terminal capabilities
if (cli.isPlainTerminal()) {
System.out.println("Using simple terminal mode");
} else {
System.out.printf("Terminal size: %dx%d%n", cli.getWidth(), cli.getHeight());
}
// Clear screen
cli.clearTerminal();Access underlying session and executor for advanced operations.
/**
* Get session identifier
* @return Current session ID
*/
public String getSessionId();
/**
* Get executor instance
* @return Executor instance for direct SQL operations
*/
public Executor getExecutor();Container for parsed command line arguments and configuration.
public class CliOptions {
/**
* Whether help should be displayed instead of starting client
* @return true if help flag was provided
*/
public boolean isPrintHelp();
/**
* Session identifier for this client instance
* @return session ID or null if not specified
*/
public String getSessionId();
/**
* Initialization script file URL
* @return URL to initialization script or null
*/
public URL getInitFile();
/**
* SQL script file URL for non-interactive execution
* @return URL to SQL script file or null
*/
public URL getSqlFile();
/**
* JAR dependency URLs to add to classpath
* @return List of JAR URLs
*/
public List<URL> getJars();
/**
* Library directory URLs for dependency resolution
* @return List of library directory URLs
*/
public List<URL> getLibraryDirs();
/**
* Single SQL statement for execution (deprecated, use getSqlFile)
* @return SQL statement string or null
*/
public String getUpdateStatement();
/**
* Command history file path
* @return Path to history file or null for default
*/
public String getHistoryFilePath();
/**
* Python-specific configuration
* @return Configuration for Python integration
*/
public Configuration getPythonConfiguration();
}Command line argument parser with static utilities for different modes.
public class CliOptionsParser {
/**
* Parse command line arguments for embedded mode
* @param args Command line arguments
* @return Parsed CliOptions instance
*/
public static CliOptions parseEmbeddedModeClient(String[] args);
/**
* Parse command line arguments for gateway mode client
* @param args Command line arguments
* @return Parsed CliOptions instance
*/
public static CliOptions parseGatewayModeClient(String[] args);
/**
* Print general client help information
*/
public static void printHelpClient();
/**
* Print embedded mode specific help
*/
public static void printHelpEmbeddedModeClient();
/**
* Validate file path accessibility
* @param filePath Path to validate
* @throws IllegalArgumentException if path is invalid
*/
public static void checkFilePath(String filePath);
}Usage Example:
// Parse embedded mode options
try {
CliOptions options = CliOptionsParser.parseEmbeddedModeClient(args);
if (options.isPrintHelp()) {
CliOptionsParser.printHelpEmbeddedModeClient();
return;
}
// Use options to configure client
} catch (Exception e) {
System.err.println("Invalid command line options: " + e.getMessage());
CliOptionsParser.printHelpEmbeddedModeClient();
}--help, -h: Display help information--session <sessionId>: Specify session identifier--init <file>: Initialization script file--file, -f <file>: SQL script file for non-interactive execution--jar <jar>: JAR files to add to classpath (can be repeated)--library <dir>: Library directories for dependencies (can be repeated)--history <file>: Command history file path--update, -u <statement>: Single SQL statement (use --file instead)The CLI handles various error conditions gracefully:
Example Error Display:
Flink SQL> SELECT * FROM non_existent_table;
[ERROR] Could not execute SQL statement. Reason:
org.apache.flink.table.api.TableException: Table 'non_existent_table' not found
Flink SQL>The CLI integrates with result display components:
Result display is automatically selected based on query type and configuration settings.
Install with Tessl CLI
npx tessl i tessl/maven-org-apache-flink--flink-sql-client-2-12