@@ -257,31 +257,55 @@ fn create_built_in_window_expr(
257257 }
258258 }
259259 BuiltInWindowFunction :: Lag => {
260- let arg = Arc :: clone ( & args[ 0 ] ) ;
260+ let mut arg = Arc :: clone ( & args[ 0 ] ) ;
261261 let shift_offset = get_scalar_value_from_args ( args, 1 ) ?
262262 . map ( get_signed_integer)
263263 . map_or ( Ok ( None ) , |v| v. map ( Some ) ) ?;
264- let default_value =
265- get_casted_value ( get_scalar_value_from_args ( args, 2 ) ?, out_data_type) ?;
264+ // If value is NULL, we use default data type as output data type, no need to cast data type
265+ let default_value = match out_data_type {
266+ DataType :: Null => match get_scalar_value_from_args ( args, 2 ) ? {
267+ Some ( value) => {
268+ let null_value = ScalarValue :: try_from ( value. data_type ( ) ) ?;
269+ arg = Arc :: new ( Literal :: new ( null_value) ) ;
270+ value
271+ }
272+ None => ScalarValue :: try_from ( DataType :: Null ) ?,
273+ } ,
274+ _ => {
275+ get_casted_value ( get_scalar_value_from_args ( args, 2 ) ?, out_data_type) ?
276+ }
277+ } ;
266278 Arc :: new ( lag (
267279 name,
268- out_data_type . clone ( ) ,
280+ default_value . data_type ( ) . clone ( ) ,
269281 arg,
270282 shift_offset,
271283 default_value,
272284 ignore_nulls,
273285 ) )
274286 }
275287 BuiltInWindowFunction :: Lead => {
276- let arg = Arc :: clone ( & args[ 0 ] ) ;
288+ let mut arg = Arc :: clone ( & args[ 0 ] ) ;
277289 let shift_offset = get_scalar_value_from_args ( args, 1 ) ?
278290 . map ( get_signed_integer)
279291 . map_or ( Ok ( None ) , |v| v. map ( Some ) ) ?;
280- let default_value =
281- get_casted_value ( get_scalar_value_from_args ( args, 2 ) ?, out_data_type) ?;
292+ // If value is NULL, we use default data type as output data type, no need to cast data type
293+ let default_value = match out_data_type {
294+ DataType :: Null => match get_scalar_value_from_args ( args, 2 ) ? {
295+ Some ( value) => {
296+ let null_value = ScalarValue :: try_from ( value. data_type ( ) ) ?;
297+ arg = Arc :: new ( Literal :: new ( null_value) ) ;
298+ value
299+ }
300+ None => ScalarValue :: try_from ( DataType :: Null ) ?,
301+ } ,
302+ _ => {
303+ get_casted_value ( get_scalar_value_from_args ( args, 2 ) ?, out_data_type) ?
304+ }
305+ } ;
282306 Arc :: new ( lead (
283307 name,
284- out_data_type . clone ( ) ,
308+ default_value . data_type ( ) . clone ( ) ,
285309 arg,
286310 shift_offset,
287311 default_value,
0 commit comments