@@ -161,10 +161,14 @@ fn can_apply_delta_binary_pack(
161
161
if num_rows == 0 {
162
162
return Ok ( false ) ;
163
163
}
164
- let col = col. value . convert_to_full_column ( & col. data_type , num_rows) ;
164
+ let col = col
165
+ . value
166
+ . convert_to_full_column ( & col. data_type , num_rows)
167
+ . remove_nullable ( ) ;
165
168
match col. data_type ( ) . remove_nullable ( ) {
166
169
DataType :: Number ( NumberDataType :: UInt8 ) => {
167
170
let mut max_delta = 0 ;
171
+ let mut min_delta = u8:: MAX ;
168
172
let col = col. as_number ( ) . unwrap ( ) . as_u_int8 ( ) . unwrap ( ) ;
169
173
let mut col_iter = col. iter ( ) ;
170
174
let mut prev = * col_iter. next ( ) . unwrap ( ) ;
@@ -173,12 +177,16 @@ fn can_apply_delta_binary_pack(
173
177
if delta > max_delta {
174
178
max_delta = delta;
175
179
}
180
+ if delta < min_delta {
181
+ min_delta = delta;
182
+ }
176
183
prev = v;
177
184
}
178
- Ok ( max_delta as i64 <= MAX_DELTA )
185
+ Ok ( ( max_delta - min_delta ) as i64 <= MAX_DELTA )
179
186
}
180
187
DataType :: Number ( NumberDataType :: UInt16 ) => {
181
188
let mut max_delta = 0 ;
189
+ let mut min_delta = u16:: MAX ;
182
190
let col = col. as_number ( ) . unwrap ( ) . as_u_int16 ( ) . unwrap ( ) ;
183
191
let mut col_iter = col. iter ( ) ;
184
192
let mut prev = * col_iter. next ( ) . unwrap ( ) ;
@@ -187,12 +195,16 @@ fn can_apply_delta_binary_pack(
187
195
if delta > max_delta {
188
196
max_delta = delta;
189
197
}
198
+ if delta < min_delta {
199
+ min_delta = delta;
200
+ }
190
201
prev = v;
191
202
}
192
- Ok ( max_delta as i64 <= MAX_DELTA )
203
+ Ok ( ( max_delta - min_delta ) as i64 <= MAX_DELTA )
193
204
}
194
205
DataType :: Number ( NumberDataType :: UInt32 ) => {
195
206
let mut max_delta = 0 ;
207
+ let mut min_delta = u32:: MAX ;
196
208
let col = col. as_number ( ) . unwrap ( ) . as_u_int32 ( ) . unwrap ( ) ;
197
209
let mut col_iter = col. iter ( ) ;
198
210
let mut prev = * col_iter. next ( ) . unwrap ( ) ;
@@ -201,12 +213,16 @@ fn can_apply_delta_binary_pack(
201
213
if delta > max_delta {
202
214
max_delta = delta;
203
215
}
216
+ if delta < min_delta {
217
+ min_delta = delta;
218
+ }
204
219
prev = v;
205
220
}
206
- Ok ( max_delta as i64 <= MAX_DELTA )
221
+ Ok ( ( max_delta - min_delta ) as i64 <= MAX_DELTA )
207
222
}
208
223
DataType :: Number ( NumberDataType :: UInt64 ) => {
209
224
let mut max_delta = 0 ;
225
+ let mut min_delta = u64:: MAX ;
210
226
let col = col. as_number ( ) . unwrap ( ) . as_u_int64 ( ) . unwrap ( ) ;
211
227
let mut col_iter = col. iter ( ) ;
212
228
let mut prev = * col_iter. next ( ) . unwrap ( ) ;
@@ -215,12 +231,16 @@ fn can_apply_delta_binary_pack(
215
231
if delta > max_delta {
216
232
max_delta = delta;
217
233
}
234
+ if delta < min_delta {
235
+ min_delta = delta;
236
+ }
218
237
prev = v;
219
238
}
220
- Ok ( max_delta as i64 <= MAX_DELTA )
239
+ Ok ( ( max_delta - min_delta ) <= MAX_DELTA as u64 )
221
240
}
222
241
DataType :: Number ( NumberDataType :: Int8 ) => {
223
242
let mut max_delta = 0 ;
243
+ let mut min_delta = i8:: MAX ;
224
244
let col = col. as_number ( ) . unwrap ( ) . as_int8 ( ) . unwrap ( ) ;
225
245
let mut col_iter = col. iter ( ) ;
226
246
let mut prev = * col_iter. next ( ) . unwrap ( ) ;
@@ -229,12 +249,16 @@ fn can_apply_delta_binary_pack(
229
249
if delta > max_delta {
230
250
max_delta = delta;
231
251
}
252
+ if delta < min_delta {
253
+ min_delta = delta;
254
+ }
232
255
prev = v;
233
256
}
234
- Ok ( max_delta as i64 <= MAX_DELTA )
257
+ Ok ( ( max_delta - min_delta ) as i64 <= MAX_DELTA )
235
258
}
236
259
DataType :: Number ( NumberDataType :: Int16 ) => {
237
260
let mut max_delta = 0 ;
261
+ let mut min_delta = i16:: MAX ;
238
262
let col = col. as_number ( ) . unwrap ( ) . as_int16 ( ) . unwrap ( ) ;
239
263
let mut col_iter = col. iter ( ) ;
240
264
let mut prev = * col_iter. next ( ) . unwrap ( ) ;
@@ -243,12 +267,16 @@ fn can_apply_delta_binary_pack(
243
267
if delta > max_delta {
244
268
max_delta = delta;
245
269
}
270
+ if delta < min_delta {
271
+ min_delta = delta;
272
+ }
246
273
prev = v;
247
274
}
248
- Ok ( max_delta as i64 <= MAX_DELTA )
275
+ Ok ( ( max_delta - min_delta ) as i64 <= MAX_DELTA )
249
276
}
250
277
DataType :: Number ( NumberDataType :: Int32 ) => {
251
278
let mut max_delta = 0 ;
279
+ let mut min_delta = i32:: MAX ;
252
280
let col = col. as_number ( ) . unwrap ( ) . as_int32 ( ) . unwrap ( ) ;
253
281
let mut col_iter = col. iter ( ) ;
254
282
let mut prev = * col_iter. next ( ) . unwrap ( ) ;
@@ -257,12 +285,16 @@ fn can_apply_delta_binary_pack(
257
285
if delta > max_delta {
258
286
max_delta = delta;
259
287
}
288
+ if delta < min_delta {
289
+ min_delta = delta;
290
+ }
260
291
prev = v;
261
292
}
262
- Ok ( max_delta as i64 <= MAX_DELTA )
293
+ Ok ( ( max_delta - min_delta ) as i64 <= MAX_DELTA )
263
294
}
264
295
DataType :: Number ( NumberDataType :: Int64 ) => {
265
296
let mut max_delta = 0 ;
297
+ let mut min_delta = i64:: MAX ;
266
298
let col = col. as_number ( ) . unwrap ( ) . as_int64 ( ) . unwrap ( ) ;
267
299
let mut col_iter = col. iter ( ) ;
268
300
let mut prev = * col_iter. next ( ) . unwrap ( ) ;
@@ -271,12 +303,16 @@ fn can_apply_delta_binary_pack(
271
303
if delta > max_delta {
272
304
max_delta = delta;
273
305
}
306
+ if delta < min_delta {
307
+ min_delta = delta;
308
+ }
274
309
prev = v;
275
310
}
276
- Ok ( max_delta <= MAX_DELTA )
311
+ Ok ( ( max_delta - min_delta ) <= MAX_DELTA )
277
312
}
278
313
DataType :: Decimal ( DecimalDataType :: Decimal128 ( _) ) => {
279
314
let mut max_delta = 0 ;
315
+ let mut min_delta = i128:: MAX ;
280
316
let ( col, _) = col. as_decimal ( ) . unwrap ( ) . as_decimal128 ( ) . unwrap ( ) ;
281
317
let mut col_iter = col. iter ( ) ;
282
318
let mut prev = * col_iter. next ( ) . unwrap ( ) ;
@@ -285,12 +321,16 @@ fn can_apply_delta_binary_pack(
285
321
if delta > max_delta {
286
322
max_delta = delta;
287
323
}
324
+ if delta < min_delta {
325
+ min_delta = delta;
326
+ }
288
327
prev = v;
289
328
}
290
- Ok ( max_delta <= MAX_DELTA as i128 )
329
+ Ok ( ( max_delta - min_delta ) <= MAX_DELTA as i128 )
291
330
}
292
331
DataType :: Decimal ( DecimalDataType :: Decimal256 ( _) ) => {
293
332
let mut max_delta: I256 = I256 :: ZERO ;
333
+ let mut min_delta = I256 :: MAX ;
294
334
let ( col, _) = col. as_decimal ( ) . unwrap ( ) . as_decimal256 ( ) . unwrap ( ) ;
295
335
let mut col_iter = col. iter ( ) ;
296
336
let mut prev = * col_iter. next ( ) . unwrap ( ) ;
@@ -299,12 +339,16 @@ fn can_apply_delta_binary_pack(
299
339
if delta > max_delta {
300
340
max_delta = delta;
301
341
}
342
+ if delta < min_delta {
343
+ min_delta = delta;
344
+ }
302
345
prev = v;
303
346
}
304
- Ok ( max_delta <= I256 :: from ( MAX_DELTA ) )
347
+ Ok ( max_delta - min_delta <= I256 :: from ( MAX_DELTA ) )
305
348
}
306
349
DataType :: Timestamp => {
307
350
let mut max_delta = 0 ;
351
+ let mut min_delta = i64:: MAX ;
308
352
let col = col. as_timestamp ( ) . unwrap ( ) ;
309
353
let mut col_iter = col. iter ( ) ;
310
354
let mut prev = * col_iter. next ( ) . unwrap ( ) ;
@@ -313,12 +357,16 @@ fn can_apply_delta_binary_pack(
313
357
if delta > max_delta {
314
358
max_delta = delta;
315
359
}
360
+ if delta < min_delta {
361
+ min_delta = delta;
362
+ }
316
363
prev = v;
317
364
}
318
- Ok ( max_delta <= MAX_DELTA )
365
+ Ok ( ( max_delta - min_delta ) <= MAX_DELTA )
319
366
}
320
367
DataType :: Date => {
321
368
let mut max_delta = 0 ;
369
+ let mut min_delta = i32:: MAX ;
322
370
let col = col. as_date ( ) . unwrap ( ) ;
323
371
let mut col_iter = col. iter ( ) ;
324
372
let mut prev = * col_iter. next ( ) . unwrap ( ) ;
@@ -327,9 +375,12 @@ fn can_apply_delta_binary_pack(
327
375
if delta > max_delta {
328
376
max_delta = delta;
329
377
}
378
+ if delta < min_delta {
379
+ min_delta = delta;
380
+ }
330
381
prev = v;
331
382
}
332
- Ok ( max_delta as i64 <= MAX_DELTA )
383
+ Ok ( ( max_delta - min_delta ) as i64 <= MAX_DELTA )
333
384
}
334
385
_ => Err ( ErrorCode :: Internal ( format ! (
335
386
"Unsupported data type for delta binary pack: {:?}" ,
0 commit comments