@@ -124,48 +124,54 @@ impl ScalarUDFImpl for ConcatWsFunc {
124124
125125 // Scalar
126126 if array_len. is_none ( ) {
127- let sep = match & args[ 0 ] {
128- ColumnarValue :: Scalar ( ScalarValue :: Utf8 ( Some ( s) ) )
129- | ColumnarValue :: Scalar ( ScalarValue :: Utf8View ( Some ( s) ) )
130- | ColumnarValue :: Scalar ( ScalarValue :: LargeUtf8 ( Some ( s) ) ) => s,
131- ColumnarValue :: Scalar ( ScalarValue :: Utf8 ( None ) )
132- | ColumnarValue :: Scalar ( ScalarValue :: Utf8View ( None ) )
133- | ColumnarValue :: Scalar ( ScalarValue :: LargeUtf8 ( None ) ) => {
127+ let ColumnarValue :: Scalar ( scalar) = & args[ 0 ] else {
128+ // loop above checks for all args being scalar
129+ unreachable ! ( )
130+ } ;
131+ let sep = match scalar. try_as_str ( ) {
132+ Some ( Some ( s) ) => s,
133+ Some ( None ) => {
134+ // null literal string
134135 return Ok ( ColumnarValue :: Scalar ( ScalarValue :: Utf8 ( None ) ) ) ;
135136 }
136- _ => unreachable ! ( ) ,
137+ None => return internal_err ! ( "Expected string literal, got {scalar:?}" ) ,
137138 } ;
138139
139140 let mut result = String :: new ( ) ;
140- let iter = & mut args[ 1 ..] . iter ( ) ;
141-
142- for arg in iter. by_ref ( ) {
143- match arg {
144- ColumnarValue :: Scalar ( ScalarValue :: Utf8 ( Some ( s) ) )
145- | ColumnarValue :: Scalar ( ScalarValue :: Utf8View ( Some ( s) ) )
146- | ColumnarValue :: Scalar ( ScalarValue :: LargeUtf8 ( Some ( s) ) ) => {
141+ // iterator over Option<str>
142+ let iter = & mut args[ 1 ..] . iter ( ) . map ( |arg| {
143+ let ColumnarValue :: Scalar ( scalar) = arg else {
144+ // loop above checks for all args being scalar
145+ unreachable ! ( )
146+ } ;
147+ scalar. try_as_str ( )
148+ } ) ;
149+
150+ // append first non null arg
151+ for scalar in iter. by_ref ( ) {
152+ match scalar {
153+ Some ( Some ( s) ) => {
147154 result. push_str ( s) ;
148155 break ;
149156 }
150- ColumnarValue :: Scalar ( ScalarValue :: Utf8 ( None ) )
151- | ColumnarValue :: Scalar ( ScalarValue :: Utf8View ( None ) )
152- | ColumnarValue :: Scalar ( ScalarValue :: LargeUtf8 ( None ) ) => { }
153- _ => unreachable ! ( ) ,
157+ Some ( None ) => { } // null literal string
158+ None => {
159+ return internal_err ! ( "Expected string literal, got {scalar:?}" )
160+ }
154161 }
155162 }
156163
157- for arg in iter. by_ref ( ) {
158- match arg {
159- ColumnarValue :: Scalar ( ScalarValue :: Utf8 ( Some ( s) ) )
160- | ColumnarValue :: Scalar ( ScalarValue :: Utf8View ( Some ( s) ) )
161- | ColumnarValue :: Scalar ( ScalarValue :: LargeUtf8 ( Some ( s) ) ) => {
164+ // handle subsequent non null args
165+ for scalar in iter. by_ref ( ) {
166+ match scalar {
167+ Some ( Some ( s) ) => {
162168 result. push_str ( sep) ;
163169 result. push_str ( s) ;
164170 }
165- ColumnarValue :: Scalar ( ScalarValue :: Utf8 ( None ) )
166- | ColumnarValue :: Scalar ( ScalarValue :: Utf8View ( None ) )
167- | ColumnarValue :: Scalar ( ScalarValue :: LargeUtf8 ( None ) ) => { }
168- _ => unreachable ! ( ) ,
171+ Some ( None ) => { } // null literal string
172+ None => {
173+ return internal_err ! ( "Expected string literal, got {scalar:?}" )
174+ }
169175 }
170176 }
171177
0 commit comments