4040)
4141from sqlmesh .core .model .kind import TimeColumn
4242from sqlmesh .core .schema_diff import SchemaDiffer , TableAlterOperation
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 ,
@@ -854,6 +855,7 @@ def _create_table_from_source_queries(
854855 table_description : t .Optional [str ] = None ,
855856 column_descriptions : t .Optional [t .Dict [str , str ]] = None ,
856857 table_kind : t .Optional [str ] = None ,
858+ track_row_count : bool = True ,
857859 ** kwargs : t .Any ,
858860 ) -> None :
859861 table = exp .to_table (table_name )
@@ -899,11 +901,15 @@ def _create_table_from_source_queries(
899901 replace = replace ,
900902 table_description = table_description ,
901903 table_kind = table_kind ,
904+ track_row_count = track_row_count ,
902905 ** kwargs ,
903906 )
904907 else :
905908 self ._insert_append_query (
906- table_name , query , target_columns_to_types or self .columns (table )
909+ table_name ,
910+ query ,
911+ target_columns_to_types or self .columns (table ),
912+ track_row_count = track_row_count ,
907913 )
908914
909915 # Register comments with commands if the engine supports comments and we weren't able to
@@ -927,6 +933,7 @@ def _create_table(
927933 table_description : t .Optional [str ] = None ,
928934 column_descriptions : t .Optional [t .Dict [str , str ]] = None ,
929935 table_kind : t .Optional [str ] = None ,
936+ track_row_count : bool = True ,
930937 ** kwargs : t .Any ,
931938 ) -> None :
932939 self .execute (
@@ -943,7 +950,8 @@ def _create_table(
943950 ),
944951 table_kind = table_kind ,
945952 ** kwargs ,
946- )
953+ ),
954+ track_row_count = track_row_count ,
947955 )
948956
949957 def _build_create_table_exp (
@@ -1431,6 +1439,7 @@ def insert_append(
14311439 table_name : TableName ,
14321440 query_or_df : QueryOrDF ,
14331441 target_columns_to_types : t .Optional [t .Dict [str , exp .DataType ]] = None ,
1442+ track_row_count : bool = True ,
14341443 source_columns : t .Optional [t .List [str ]] = None ,
14351444 ) -> None :
14361445 source_queries , target_columns_to_types = self ._get_source_queries_and_columns_to_types (
@@ -1439,30 +1448,39 @@ def insert_append(
14391448 target_table = table_name ,
14401449 source_columns = source_columns ,
14411450 )
1442- self ._insert_append_source_queries (table_name , source_queries , target_columns_to_types )
1451+ self ._insert_append_source_queries (
1452+ table_name , source_queries , target_columns_to_types , track_row_count
1453+ )
14431454
14441455 def _insert_append_source_queries (
14451456 self ,
14461457 table_name : TableName ,
14471458 source_queries : t .List [SourceQuery ],
14481459 target_columns_to_types : t .Optional [t .Dict [str , exp .DataType ]] = None ,
1460+ track_row_count : bool = True ,
14491461 ) -> None :
14501462 with self .transaction (condition = len (source_queries ) > 0 ):
14511463 target_columns_to_types = target_columns_to_types or self .columns (table_name )
14521464 for source_query in source_queries :
14531465 with source_query as query :
1454- self ._insert_append_query (table_name , query , target_columns_to_types )
1466+ self ._insert_append_query (
1467+ table_name , query , target_columns_to_types , track_row_count = track_row_count
1468+ )
14551469
14561470 def _insert_append_query (
14571471 self ,
14581472 table_name : TableName ,
14591473 query : Query ,
14601474 target_columns_to_types : t .Dict [str , exp .DataType ],
14611475 order_projections : bool = True ,
1476+ track_row_count : bool = True ,
14621477 ) -> None :
14631478 if order_projections :
14641479 query = self ._order_projections_and_filter (query , target_columns_to_types )
1465- self .execute (exp .insert (query , table_name , columns = list (target_columns_to_types )))
1480+ self .execute (
1481+ exp .insert (query , table_name , columns = list (target_columns_to_types )),
1482+ track_row_count = track_row_count ,
1483+ )
14661484
14671485 def insert_overwrite_by_partition (
14681486 self ,
@@ -1604,7 +1622,7 @@ def _insert_overwrite_by_condition(
16041622 )
16051623 if insert_overwrite_strategy .is_replace_where :
16061624 insert_exp .set ("where" , where or exp .true ())
1607- self .execute (insert_exp )
1625+ self .execute (insert_exp , track_row_count = True )
16081626
16091627 def update_table (
16101628 self ,
@@ -1625,7 +1643,7 @@ def _merge(
16251643 using = exp .alias_ (
16261644 exp .Subquery (this = query ), alias = MERGE_SOURCE_ALIAS , copy = False , table = True
16271645 )
1628- self .execute (exp .Merge (this = this , using = using , on = on , whens = whens ))
1646+ self .execute (exp .Merge (this = this , using = using , on = on , whens = whens ), track_row_count = True )
16291647
16301648 def scd_type_2_by_time (
16311649 self ,
@@ -2374,6 +2392,7 @@ def execute(
23742392 expressions : t .Union [str , exp .Expression , t .Sequence [exp .Expression ]],
23752393 ignore_unsupported_errors : bool = False ,
23762394 quote_identifiers : bool = True ,
2395+ track_row_count : bool = False ,
23772396 ** kwargs : t .Any ,
23782397 ) -> None :
23792398 """Execute a sql query."""
@@ -2395,7 +2414,7 @@ def execute(
23952414 expression = e if isinstance (e , exp .Expression ) else None ,
23962415 quote_identifiers = quote_identifiers ,
23972416 )
2398- self ._execute (sql , ** kwargs )
2417+ self ._execute (sql , track_row_count , ** kwargs )
23992418
24002419 def _attach_correlation_id (self , sql : str ) -> str :
24012420 if self .ATTACH_CORRELATION_ID and self .correlation_id :
@@ -2420,9 +2439,20 @@ def _log_sql(
24202439
24212440 logger .log (self ._execute_log_level , "Executing SQL: %s" , sql_to_log )
24222441
2423- def _execute (self , sql : str , ** kwargs : t .Any ) -> None :
2442+ def _execute (self , sql : str , track_row_count : bool = False , ** kwargs : t .Any ) -> None :
24242443 self .cursor .execute (sql , ** kwargs )
24252444
2445+ if track_row_count :
2446+ rowcount_raw = getattr (self .cursor , "rowcount" , None )
2447+ rowcount = None
2448+ if rowcount_raw is not None :
2449+ try :
2450+ rowcount = int (rowcount_raw )
2451+ except (TypeError , ValueError ):
2452+ pass
2453+
2454+ track_execution_record (sql , rowcount )
2455+
24262456 @contextlib .contextmanager
24272457 def temp_table (
24282458 self ,
@@ -2467,6 +2497,7 @@ def temp_table(
24672497 exists = True ,
24682498 table_description = None ,
24692499 column_descriptions = None ,
2500+ track_row_count = False ,
24702501 ** kwargs ,
24712502 )
24722503
@@ -2718,7 +2749,7 @@ def _replace_by_key(
27182749 insert_statement .set ("where" , delete_filter )
27192750 insert_statement .set ("this" , exp .to_table (target_table ))
27202751
2721- self .execute (insert_statement )
2752+ self .execute (insert_statement , track_row_count = True )
27222753 finally :
27232754 self .drop_table (temp_table )
27242755
0 commit comments