(&self, args: ScalarFunctionArgs)
| 97 | } |
| 98 | |
| 99 | fn invoke_with_args(&self, args: ScalarFunctionArgs) -> Result<ColumnarValue> { |
| 100 | let return_type = args.return_field.data_type().clone(); |
| 101 | let [string_arg, count_arg] = take_function_args(self.name(), args.args)?; |
| 102 | |
| 103 | // Early return if either argument is a scalar null |
| 104 | if let ColumnarValue::Scalar(s) = &string_arg |
| 105 | && s.is_null() |
| 106 | { |
| 107 | return Ok(ColumnarValue::Scalar(ScalarValue::try_from(&return_type)?)); |
| 108 | } |
| 109 | if let ColumnarValue::Scalar(c) = &count_arg |
| 110 | && c.is_null() |
| 111 | { |
| 112 | return Ok(ColumnarValue::Scalar(ScalarValue::try_from(&return_type)?)); |
| 113 | } |
| 114 | |
| 115 | match (&string_arg, &count_arg) { |
| 116 | ( |
| 117 | ColumnarValue::Scalar(string_scalar), |
| 118 | ColumnarValue::Scalar(count_scalar), |
| 119 | ) => { |
| 120 | let count = match count_scalar { |
| 121 | ScalarValue::Int64(Some(n)) => *n, |
| 122 | _ => { |
| 123 | return internal_err!( |
| 124 | "Unexpected data type {:?} for repeat count", |
| 125 | count_scalar.data_type() |
| 126 | ); |
| 127 | } |
| 128 | }; |
| 129 | |
| 130 | let result = match string_scalar { |
| 131 | ScalarValue::Utf8View(Some(s)) => ScalarValue::Utf8View(Some( |
| 132 | compute_repeat(s, count, i32::MAX as usize)?, |
| 133 | )), |
| 134 | ScalarValue::Utf8(Some(s)) => ScalarValue::Utf8(Some( |
| 135 | compute_repeat(s, count, i32::MAX as usize)?, |
| 136 | )), |
| 137 | ScalarValue::LargeUtf8(Some(s)) => ScalarValue::LargeUtf8(Some( |
| 138 | compute_repeat(s, count, i64::MAX as usize)?, |
| 139 | )), |
| 140 | _ => { |
| 141 | return internal_err!( |
| 142 | "Unexpected data type {:?} for function repeat", |
| 143 | string_scalar.data_type() |
| 144 | ); |
| 145 | } |
| 146 | }; |
| 147 | |
| 148 | Ok(ColumnarValue::Scalar(result)) |
| 149 | } |
| 150 | _ => { |
| 151 | let string_array = string_arg.to_array(args.number_rows)?; |
| 152 | let count_array = count_arg.to_array(args.number_rows)?; |
| 153 | Ok(ColumnarValue::Array(repeat(&string_array, &count_array)?)) |
| 154 | } |
| 155 | } |
| 156 | } |
nothing calls this directly
no test coverage detected