@@ -22,21 +22,21 @@ use datafusion::sql::TableReference;
2222use datafusion:: sql:: planner:: { PlannerContext , SqlToRel } ;
2323use datafusion:: sql:: sqlparser:: ast;
2424use datafusion:: sql:: sqlparser:: ast:: CreateTable as SqlCreateTable ;
25+ use datafusion:: sql:: sqlparser:: ast:: Statement as DfStatement ;
2526use datafusion_expr:: ExprSchemable ;
2627use tracing:: warn;
2728
28- use super :: ast_utils:: AstUtils ;
29- use crate :: coordinator:: tool:: ConnectorOptions ;
30- use crate :: sql:: analysis:: StreamSchemaProvider ;
31- use crate :: sql:: common:: constants:: { connection_table_role, connector_type, sql_field} ;
32- use crate :: sql:: common:: with_option_keys as opt;
33- use crate :: sql:: common:: { BadData , Format , Framing , JsonCompression , JsonFormat } ;
34- use crate :: sql:: connector:: registry:: REGISTRY ;
35- use crate :: sql:: schema:: ColumnDescriptor ;
36- use crate :: sql:: schema:: catalog:: { ExternalTable , LookupTable , SourceTable } ;
37- use crate :: sql:: schema:: data_encoding_format:: DataEncodingFormat ;
38- use crate :: sql:: schema:: table_role:: { apply_adapter_specific_rules, validate_adapter_availability} ;
39- use crate :: sql:: schema:: temporal_pipeline_config:: TemporalPipelineConfig ;
29+ use crate :: common:: ast_utils:: AstUtils ;
30+ use crate :: common:: constants:: { connection_table_role, connector_type, sql_field} ;
31+ use crate :: common:: with_option_keys as opt;
32+ use crate :: common:: { BadData , ConnectorOptions , Format , Framing , JsonCompression , JsonFormat } ;
33+ use crate :: connector:: registry:: REGISTRY ;
34+ use crate :: schema:: ColumnDescriptor ;
35+ use crate :: schema:: catalog:: { ExternalTable , LookupTable , SourceTable } ;
36+ use crate :: schema:: data_encoding_format:: DataEncodingFormat ;
37+ use crate :: schema:: schema_provider:: StreamSchemaProvider ;
38+ use crate :: schema:: table_role:: { apply_adapter_specific_rules, validate_adapter_availability} ;
39+ use crate :: schema:: temporal_pipeline_config:: TemporalPipelineConfig ;
4040
4141pub struct DdlCompiler < ' a > {
4242 schema_provider : & ' a StreamSchemaProvider ,
@@ -293,6 +293,30 @@ impl<'a> DdlCompiler<'a> {
293293 }
294294}
295295
296+ /// If `stmt` is `CREATE TABLE ... WITH (connector = ...)`, compile it to [`ExternalTable`].
297+ pub fn try_compile_connector_create_table (
298+ schema_provider : & StreamSchemaProvider ,
299+ stmt : & DfStatement ,
300+ ) -> Option < Result < ( ExternalTable , bool ) > > {
301+ let DfStatement :: CreateTable ( ast_node) = stmt else {
302+ return None ;
303+ } ;
304+ if ast_node. query . is_some ( ) {
305+ return None ;
306+ }
307+ if !AstUtils :: contains_connector_property ( & ast_node. with_options ) {
308+ return None ;
309+ }
310+ let declared_role = AstUtils :: peek_table_role ( & ast_node. with_options ) ;
311+ let if_not_exists = ast_node. if_not_exists ;
312+ let compiler = DdlCompiler :: new ( schema_provider) ;
313+ Some (
314+ compiler
315+ . compile ( ast_node, declared_role. as_deref ( ) )
316+ . map ( |table| ( table, if_not_exists) ) ,
317+ )
318+ }
319+
296320fn resolve_source_watermark (
297321 table_identifier : & str ,
298322 columns : & mut Vec < ColumnDescriptor > ,
0 commit comments