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 (
4445 CorrelationId ,
4546 columns_to_types_all_known ,
@@ -835,6 +836,7 @@ def _create_table_from_source_queries(
835836 table_description : t .Optional [str ] = None ,
836837 column_descriptions : t .Optional [t .Dict [str , str ]] = None ,
837838 table_kind : t .Optional [str ] = None ,
839+ track_row_count : bool = True ,
838840 ** kwargs : t .Any ,
839841 ) -> None :
840842 table = exp .to_table (table_name )
@@ -880,11 +882,15 @@ def _create_table_from_source_queries(
880882 replace = replace ,
881883 table_description = table_description ,
882884 table_kind = table_kind ,
885+ track_row_count = track_row_count ,
883886 ** kwargs ,
884887 )
885888 else :
886889 self ._insert_append_query (
887- table_name , query , target_columns_to_types or self .columns (table )
890+ table_name ,
891+ query ,
892+ target_columns_to_types or self .columns (table ),
893+ track_row_count = track_row_count ,
888894 )
889895
890896 # Register comments with commands if the engine supports comments and we weren't able to
@@ -908,6 +914,7 @@ def _create_table(
908914 table_description : t .Optional [str ] = None ,
909915 column_descriptions : t .Optional [t .Dict [str , str ]] = None ,
910916 table_kind : t .Optional [str ] = None ,
917+ track_row_count : bool = True ,
911918 ** kwargs : t .Any ,
912919 ) -> None :
913920 self .execute (
@@ -924,7 +931,8 @@ def _create_table(
924931 ),
925932 table_kind = table_kind ,
926933 ** kwargs ,
927- )
934+ ),
935+ track_row_count = track_row_count ,
928936 )
929937
930938 def _build_create_table_exp (
@@ -1399,6 +1407,7 @@ def insert_append(
13991407 table_name : TableName ,
14001408 query_or_df : QueryOrDF ,
14011409 target_columns_to_types : t .Optional [t .Dict [str , exp .DataType ]] = None ,
1410+ track_row_count : bool = True ,
14021411 source_columns : t .Optional [t .List [str ]] = None ,
14031412 ) -> None :
14041413 source_queries , target_columns_to_types = self ._get_source_queries_and_columns_to_types (
@@ -1407,30 +1416,39 @@ def insert_append(
14071416 target_table = table_name ,
14081417 source_columns = source_columns ,
14091418 )
1410- self ._insert_append_source_queries (table_name , source_queries , target_columns_to_types )
1419+ self ._insert_append_source_queries (
1420+ table_name , source_queries , target_columns_to_types , track_row_count
1421+ )
14111422
14121423 def _insert_append_source_queries (
14131424 self ,
14141425 table_name : TableName ,
14151426 source_queries : t .List [SourceQuery ],
14161427 target_columns_to_types : t .Optional [t .Dict [str , exp .DataType ]] = None ,
1428+ track_row_count : bool = True ,
14171429 ) -> None :
14181430 with self .transaction (condition = len (source_queries ) > 0 ):
14191431 target_columns_to_types = target_columns_to_types or self .columns (table_name )
14201432 for source_query in source_queries :
14211433 with source_query as query :
1422- self ._insert_append_query (table_name , query , target_columns_to_types )
1434+ self ._insert_append_query (
1435+ table_name , query , target_columns_to_types , track_row_count = track_row_count
1436+ )
14231437
14241438 def _insert_append_query (
14251439 self ,
14261440 table_name : TableName ,
14271441 query : Query ,
14281442 target_columns_to_types : t .Dict [str , exp .DataType ],
14291443 order_projections : bool = True ,
1444+ track_row_count : bool = True ,
14301445 ) -> None :
14311446 if order_projections :
14321447 query = self ._order_projections_and_filter (query , target_columns_to_types )
1433- self .execute (exp .insert (query , table_name , columns = list (target_columns_to_types )))
1448+ self .execute (
1449+ exp .insert (query , table_name , columns = list (target_columns_to_types )),
1450+ track_row_count = track_row_count ,
1451+ )
14341452
14351453 def insert_overwrite_by_partition (
14361454 self ,
@@ -1572,7 +1590,7 @@ def _insert_overwrite_by_condition(
15721590 )
15731591 if insert_overwrite_strategy .is_replace_where :
15741592 insert_exp .set ("where" , where or exp .true ())
1575- self .execute (insert_exp )
1593+ self .execute (insert_exp , track_row_count = True )
15761594
15771595 def update_table (
15781596 self ,
@@ -1593,7 +1611,7 @@ def _merge(
15931611 using = exp .alias_ (
15941612 exp .Subquery (this = query ), alias = MERGE_SOURCE_ALIAS , copy = False , table = True
15951613 )
1596- self .execute (exp .Merge (this = this , using = using , on = on , whens = whens ))
1614+ self .execute (exp .Merge (this = this , using = using , on = on , whens = whens ), track_row_count = True )
15971615
15981616 def scd_type_2_by_time (
15991617 self ,
@@ -2342,6 +2360,7 @@ def execute(
23422360 expressions : t .Union [str , exp .Expression , t .Sequence [exp .Expression ]],
23432361 ignore_unsupported_errors : bool = False ,
23442362 quote_identifiers : bool = True ,
2363+ track_row_count : bool = False ,
23452364 ** kwargs : t .Any ,
23462365 ) -> None :
23472366 """Execute a sql query."""
@@ -2363,7 +2382,7 @@ def execute(
23632382 expression = e if isinstance (e , exp .Expression ) else None ,
23642383 quote_identifiers = quote_identifiers ,
23652384 )
2366- self ._execute (sql , ** kwargs )
2385+ self ._execute (sql , track_row_count , ** kwargs )
23672386
23682387 def _attach_correlation_id (self , sql : str ) -> str :
23692388 if self .ATTACH_CORRELATION_ID and self .correlation_id :
@@ -2388,9 +2407,20 @@ def _log_sql(
23882407
23892408 logger .log (self ._execute_log_level , "Executing SQL: %s" , sql_to_log )
23902409
2391- def _execute (self , sql : str , ** kwargs : t .Any ) -> None :
2410+ def _execute (self , sql : str , track_row_count : bool = False , ** kwargs : t .Any ) -> None :
23922411 self .cursor .execute (sql , ** kwargs )
23932412
2413+ if track_row_count :
2414+ rowcount_raw = getattr (self .cursor , "rowcount" , None )
2415+ rowcount = None
2416+ if rowcount_raw is not None :
2417+ try :
2418+ rowcount = int (rowcount_raw )
2419+ except (TypeError , ValueError ):
2420+ pass
2421+
2422+ track_execution_record (sql , rowcount )
2423+
23942424 @contextlib .contextmanager
23952425 def temp_table (
23962426 self ,
@@ -2435,6 +2465,7 @@ def temp_table(
24352465 exists = True ,
24362466 table_description = None ,
24372467 column_descriptions = None ,
2468+ track_row_count = False ,
24382469 ** kwargs ,
24392470 )
24402471
@@ -2686,7 +2717,7 @@ def _replace_by_key(
26862717 insert_statement .set ("where" , delete_filter )
26872718 insert_statement .set ("this" , exp .to_table (target_table ))
26882719
2689- self .execute (insert_statement )
2720+ self .execute (insert_statement , track_row_count = True )
26902721 finally :
26912722 self .drop_table (temp_table )
26922723
0 commit comments