4040)
4141from sqlmesh .core .model .kind import TimeColumn
4242from sqlmesh .core .schema_diff import SchemaDiffer
43+ from sqlmesh .core .execution_tracker import record_execution as track_execution_record
4344from sqlmesh .utils import CorrelationId , columns_to_types_all_known , random_id
4445from sqlmesh .utils .connection_pool import ConnectionPool , create_connection_pool
4546from sqlmesh .utils .date import TimeLike , make_inclusive , to_time_column
@@ -759,6 +760,7 @@ def _create_table_from_source_queries(
759760 table_description : t .Optional [str ] = None ,
760761 column_descriptions : t .Optional [t .Dict [str , str ]] = None ,
761762 table_kind : t .Optional [str ] = None ,
763+ track_row_count : bool = True ,
762764 ** kwargs : t .Any ,
763765 ) -> None :
764766 table = exp .to_table (table_name )
@@ -802,11 +804,15 @@ def _create_table_from_source_queries(
802804 replace = replace ,
803805 table_description = table_description ,
804806 table_kind = table_kind ,
807+ track_row_count = track_row_count ,
805808 ** kwargs ,
806809 )
807810 else :
808811 self ._insert_append_query (
809- table_name , query , columns_to_types or self .columns (table )
812+ table_name ,
813+ query ,
814+ columns_to_types or self .columns (table ),
815+ track_row_count = track_row_count ,
810816 )
811817
812818 # Register comments with commands if the engine supports comments and we weren't able to
@@ -830,6 +836,7 @@ def _create_table(
830836 table_description : t .Optional [str ] = None ,
831837 column_descriptions : t .Optional [t .Dict [str , str ]] = None ,
832838 table_kind : t .Optional [str ] = None ,
839+ track_row_count : bool = True ,
833840 ** kwargs : t .Any ,
834841 ) -> None :
835842 self .execute (
@@ -846,7 +853,8 @@ def _create_table(
846853 ),
847854 table_kind = table_kind ,
848855 ** kwargs ,
849- )
856+ ),
857+ track_row_count = track_row_count ,
850858 )
851859
852860 def _build_create_table_exp (
@@ -1308,34 +1316,44 @@ def insert_append(
13081316 table_name : TableName ,
13091317 query_or_df : QueryOrDF ,
13101318 columns_to_types : t .Optional [t .Dict [str , exp .DataType ]] = None ,
1319+ track_row_count : bool = True ,
13111320 ) -> None :
13121321 source_queries , columns_to_types = self ._get_source_queries_and_columns_to_types (
13131322 query_or_df , columns_to_types , target_table = table_name
13141323 )
1315- self ._insert_append_source_queries (table_name , source_queries , columns_to_types )
1324+ self ._insert_append_source_queries (
1325+ table_name , source_queries , columns_to_types , track_row_count
1326+ )
13161327
13171328 def _insert_append_source_queries (
13181329 self ,
13191330 table_name : TableName ,
13201331 source_queries : t .List [SourceQuery ],
13211332 columns_to_types : t .Optional [t .Dict [str , exp .DataType ]] = None ,
1333+ track_row_count : bool = True ,
13221334 ) -> None :
13231335 with self .transaction (condition = len (source_queries ) > 0 ):
13241336 columns_to_types = columns_to_types or self .columns (table_name )
13251337 for source_query in source_queries :
13261338 with source_query as query :
1327- self ._insert_append_query (table_name , query , columns_to_types )
1339+ self ._insert_append_query (
1340+ table_name , query , columns_to_types , track_row_count = track_row_count
1341+ )
13281342
13291343 def _insert_append_query (
13301344 self ,
13311345 table_name : TableName ,
13321346 query : Query ,
13331347 columns_to_types : t .Dict [str , exp .DataType ],
13341348 order_projections : bool = True ,
1349+ track_row_count : bool = True ,
13351350 ) -> None :
13361351 if order_projections :
13371352 query = self ._order_projections_and_filter (query , columns_to_types )
1338- self .execute (exp .insert (query , table_name , columns = list (columns_to_types )))
1353+ self .execute (
1354+ exp .insert (query , table_name , columns = list (columns_to_types )),
1355+ track_row_count = track_row_count ,
1356+ )
13391357
13401358 def insert_overwrite_by_partition (
13411359 self ,
@@ -1459,7 +1477,7 @@ def _insert_overwrite_by_condition(
14591477 )
14601478 if insert_overwrite_strategy .is_replace_where :
14611479 insert_exp .set ("where" , where or exp .true ())
1462- self .execute (insert_exp )
1480+ self .execute (insert_exp , track_row_count = True )
14631481
14641482 def update_table (
14651483 self ,
@@ -1480,7 +1498,7 @@ def _merge(
14801498 using = exp .alias_ (
14811499 exp .Subquery (this = query ), alias = MERGE_SOURCE_ALIAS , copy = False , table = True
14821500 )
1483- self .execute (exp .Merge (this = this , using = using , on = on , whens = whens ))
1501+ self .execute (exp .Merge (this = this , using = using , on = on , whens = whens ), track_row_count = True )
14841502
14851503 def scd_type_2_by_time (
14861504 self ,
@@ -2214,6 +2232,7 @@ def execute(
22142232 expressions : t .Union [str , exp .Expression , t .Sequence [exp .Expression ]],
22152233 ignore_unsupported_errors : bool = False ,
22162234 quote_identifiers : bool = True ,
2235+ track_row_count : bool = False ,
22172236 ** kwargs : t .Any ,
22182237 ) -> None :
22192238 """Execute a sql query."""
@@ -2235,7 +2254,7 @@ def execute(
22352254 expression = e if isinstance (e , exp .Expression ) else None ,
22362255 quote_identifiers = quote_identifiers ,
22372256 )
2238- self ._execute (sql , ** kwargs )
2257+ self ._execute (sql , track_row_count , ** kwargs )
22392258
22402259 def _attach_correlation_id (self , sql : str ) -> str :
22412260 if self .ATTACH_CORRELATION_ID and self .correlation_id :
@@ -2260,9 +2279,20 @@ def _log_sql(
22602279
22612280 logger .log (self ._execute_log_level , "Executing SQL: %s" , sql_to_log )
22622281
2263- def _execute (self , sql : str , ** kwargs : t .Any ) -> None :
2282+ def _execute (self , sql : str , track_row_count : bool = False , ** kwargs : t .Any ) -> None :
22642283 self .cursor .execute (sql , ** kwargs )
22652284
2285+ if track_row_count :
2286+ rowcount_raw = getattr (self .cursor , "rowcount" , None )
2287+ rowcount = None
2288+ if rowcount_raw is not None :
2289+ try :
2290+ rowcount = int (rowcount_raw )
2291+ except (TypeError , ValueError ):
2292+ pass
2293+
2294+ track_execution_record (sql , rowcount )
2295+
22662296 @contextlib .contextmanager
22672297 def temp_table (
22682298 self ,
@@ -2303,6 +2333,7 @@ def temp_table(
23032333 exists = True ,
23042334 table_description = None ,
23052335 column_descriptions = None ,
2336+ track_row_count = False ,
23062337 ** kwargs ,
23072338 )
23082339
@@ -2547,7 +2578,7 @@ def _replace_by_key(
25472578 insert_statement .set ("where" , delete_filter )
25482579 insert_statement .set ("this" , exp .to_table (target_table ))
25492580
2550- self .execute (insert_statement )
2581+ self .execute (insert_statement , track_row_count = True )
25512582 finally :
25522583 self .drop_table (temp_table )
25532584
0 commit comments