@@ -22,19 +22,29 @@ use databend_common_base::base::tokio::sync::Semaphore;
22
22
use databend_common_base:: base:: ProgressValues ;
23
23
use databend_common_base:: runtime:: GlobalIORuntime ;
24
24
use databend_common_base:: runtime:: TrySpawn ;
25
+ use databend_common_catalog:: plan:: gen_mutation_stream_meta;
25
26
use databend_common_catalog:: plan:: Projection ;
27
+ use databend_common_catalog:: plan:: StreamColumn ;
28
+ use databend_common_catalog:: table:: Table ;
26
29
use databend_common_catalog:: table_context:: TableContext ;
27
30
use databend_common_exception:: ErrorCode ;
28
31
use databend_common_exception:: Result ;
32
+ use databend_common_expression:: types:: DataType ;
33
+ use databend_common_expression:: types:: NumberDataType ;
34
+ use databend_common_expression:: types:: UInt64Type ;
35
+ use databend_common_expression:: BlockEntry ;
36
+ use databend_common_expression:: Column ;
29
37
use databend_common_expression:: ColumnId ;
30
38
use databend_common_expression:: ComputedExpr ;
31
39
use databend_common_expression:: DataBlock ;
32
40
use databend_common_expression:: FieldIndex ;
41
+ use databend_common_expression:: FromData ;
33
42
use databend_common_expression:: Scalar ;
34
- use databend_common_expression:: TableSchema ;
43
+ use databend_common_expression:: Value ;
35
44
use databend_common_metrics:: storage:: * ;
36
45
use databend_common_sql:: evaluator:: BlockOperator ;
37
46
use databend_common_sql:: executor:: physical_plans:: OnConflictField ;
47
+ use databend_common_sql:: gen_mutation_stream_operator;
38
48
use databend_storages_common_cache:: LoadParams ;
39
49
use databend_storages_common_index:: filters:: Filter ;
40
50
use databend_storages_common_index:: filters:: Xor8Filter ;
@@ -68,6 +78,7 @@ use crate::operations::replace_into::meta::MergeIntoOperation;
68
78
use crate :: operations:: replace_into:: meta:: UniqueKeyDigest ;
69
79
use crate :: operations:: replace_into:: mutator:: row_hash_of_columns;
70
80
use crate :: operations:: replace_into:: mutator:: DeletionAccumulator ;
81
+ use crate :: FuseTable ;
71
82
72
83
struct AggregationContext {
73
84
segment_locations : AHashMap < SegmentIndex , Location > ,
@@ -90,6 +101,8 @@ struct AggregationContext {
90
101
block_builder : BlockBuilder ,
91
102
io_request_semaphore : Arc < Semaphore > ,
92
103
query_id : String ,
104
+ stream_columns : Vec < StreamColumn > ,
105
+ stream_operators : Vec < BlockOperator > ,
93
106
}
94
107
95
108
// Apply MergeIntoOperations to segments
@@ -107,13 +120,16 @@ impl MergeIntoOperationAggregator {
107
120
bloom_filter_column_indexes : Vec < FieldIndex > ,
108
121
segment_locations : Vec < ( SegmentIndex , Location ) > ,
109
122
block_slots : Option < BlockSlotDescription > ,
110
- data_accessor : Operator ,
111
- table_schema : Arc < TableSchema > ,
112
- write_settings : WriteSettings ,
123
+ table : & FuseTable ,
113
124
read_settings : ReadSettings ,
114
125
block_builder : BlockBuilder ,
115
126
io_request_semaphore : Arc < Semaphore > ,
116
127
) -> Result < Self > {
128
+ let data_accessor = table. get_operator ( ) ;
129
+ let table_schema = table. schema_with_stream ( ) ;
130
+ let write_settings = table. get_write_settings ( ) ;
131
+ let update_stream_columns = table. change_tracking_enabled ( ) ;
132
+
117
133
let deletion_accumulator = DeletionAccumulator :: default ( ) ;
118
134
let segment_reader =
119
135
MetaReaders :: segment_info_reader ( data_accessor. clone ( ) , table_schema. clone ( ) ) ;
@@ -145,7 +161,7 @@ impl MergeIntoOperationAggregator {
145
161
table_schema. clone ( ) ,
146
162
projection,
147
163
false ,
148
- false ,
164
+ update_stream_columns ,
149
165
false ,
150
166
)
151
167
} ?;
@@ -158,16 +174,23 @@ impl MergeIntoOperationAggregator {
158
174
let reader = BlockReader :: create (
159
175
ctx. clone ( ) ,
160
176
data_accessor. clone ( ) ,
161
- table_schema,
177
+ table_schema. clone ( ) ,
162
178
projection,
163
179
false ,
164
- false ,
180
+ update_stream_columns ,
165
181
false ,
166
182
) ?;
167
183
Some ( reader)
168
184
}
169
185
} ;
170
186
let query_id = ctx. get_id ( ) ;
187
+
188
+ let ( stream_columns, stream_operators) = if update_stream_columns {
189
+ gen_mutation_stream_operator ( table_schema, table. get_table_info ( ) . ident . seq , true ) ?
190
+ } else {
191
+ ( vec ! [ ] , vec ! [ ] )
192
+ } ;
193
+
171
194
Ok ( Self {
172
195
ctx,
173
196
deletion_accumulator,
@@ -186,6 +209,8 @@ impl MergeIntoOperationAggregator {
186
209
block_builder,
187
210
io_request_semaphore,
188
211
query_id,
212
+ stream_columns,
213
+ stream_operators,
189
214
} ) ,
190
215
} )
191
216
}
@@ -471,7 +496,7 @@ impl AggregationContext {
471
496
let bitmap = bitmap. into ( ) ;
472
497
let mut key_columns_data_after_deletion = key_columns_data. filter_with_bitmap ( & bitmap) ?;
473
498
474
- let new_block = match & self . remain_column_reader {
499
+ let mut new_block = match & self . remain_column_reader {
475
500
None => key_columns_data_after_deletion,
476
501
Some ( remain_columns_reader) => {
477
502
metrics_inc_replace_block_number_totally_loaded ( 1 ) ;
@@ -505,6 +530,31 @@ impl AggregationContext {
505
530
}
506
531
} ;
507
532
533
+ if self . key_column_reader . update_stream_columns {
534
+ // generate row id column
535
+ let mut row_ids = Vec :: with_capacity ( num_rows) ;
536
+ for i in 0 ..num_rows {
537
+ row_ids. push ( i as u64 ) ;
538
+ }
539
+ let value = Value :: Column ( Column :: filter ( & UInt64Type :: from_data ( row_ids) , & bitmap) ) ;
540
+ let row_num = BlockEntry :: new (
541
+ DataType :: Nullable ( Box :: new ( DataType :: Number ( NumberDataType :: UInt64 ) ) ) ,
542
+ value. wrap_nullable ( None ) ,
543
+ ) ;
544
+ new_block. add_column ( row_num) ;
545
+
546
+ let stream_meta = gen_mutation_stream_meta ( None , & block_meta. location . 0 ) ?;
547
+ for stream_column in self . stream_columns . iter ( ) {
548
+ let entry = stream_column. generate_column_values ( & stream_meta, num_rows) ;
549
+ new_block. add_column ( entry) ;
550
+ }
551
+ let func_ctx = self . block_builder . ctx . get_function_context ( ) ?;
552
+ new_block = self
553
+ . stream_operators
554
+ . iter ( )
555
+ . try_fold ( new_block, |input, op| op. execute ( & func_ctx, input) ) ?;
556
+ }
557
+
508
558
// serialization and compression is cpu intensive, send them to dedicated thread pool
509
559
// and wait (asyncly, which will NOT block the executor thread)
510
560
let block_builder = self . block_builder . clone ( ) ;
@@ -749,6 +799,7 @@ mod tests {
749
799
use databend_common_expression:: types:: NumberScalar ;
750
800
use databend_common_expression:: TableDataType ;
751
801
use databend_common_expression:: TableField ;
802
+ use databend_common_expression:: TableSchema ;
752
803
753
804
use super :: * ;
754
805
0 commit comments