@@ -186,23 +186,18 @@ void registerOperator(BuiltinFunctionName functionName, SqlOperator operator) {
186186 // Only the composite operand type checker for UDFs are concerned here.
187187 if (operator instanceof SqlUserDefinedFunction
188188 && typeChecker instanceof CompositeOperandTypeChecker compositeTypeChecker ) {
189- register (functionName , createCompositeFunctionImp (operator , compositeTypeChecker ));
189+ // UDFs implement their own composite type checkers, which always use OR logic for argument
190+ // types. Verifying the composition type would require accessing a protected field in
191+ // CompositeOperandTypeChecker. If access to this field is not allowed, type checking will
192+ // be skipped, so we avoid checking the composition type here.
193+ register (functionName , createCompositeFunctionImp (operator , compositeTypeChecker , false ));
190194 } else if (typeChecker instanceof ImplicitCastOperandTypeChecker implicitCastTypeChecker ) {
191195 register (functionName , createImplicitCastFunctionImp (operator , implicitCastTypeChecker ));
192196 } else if (typeChecker instanceof CompositeOperandTypeChecker compositeTypeChecker ) {
193- try {
194- // If compositeTypeChecker contains operand checkers other than family type checkers or
195- // other than OR compositions, this will throw an IllegalArgumentException.
196- register (functionName , createCompositeFunctionImp (operator , compositeTypeChecker ));
197- } catch (IllegalArgumentException e ) {
198- // register without type checker
199- logger .debug (
200- "Cannot create composite type checker for function: {}. Will skip its type checking" ,
201- functionName );
202- register (
203- functionName ,
204- (RexBuilder builder , RexNode ... node ) -> builder .makeCall (operator , node ));
205- }
197+ // If compositeTypeChecker contains operand checkers other than family type checkers or
198+ // other than OR compositions, the function with be registered with a null type checker,
199+ // which means the function will not be type checked.
200+ register (functionName , createCompositeFunctionImp (operator , compositeTypeChecker , true ));
206201 } else {
207202 logger .debug (
208203 "Cannot create type checker for function: {}. Will skip its type checking" ,
@@ -221,7 +216,9 @@ private static SqlOperandTypeChecker extractTypeCheckerFromUDF(
221216 }
222217
223218 private static FunctionImp createCompositeFunctionImp (
224- SqlOperator operator , CompositeOperandTypeChecker typeChecker ) {
219+ SqlOperator operator ,
220+ CompositeOperandTypeChecker typeChecker ,
221+ boolean checkCompositionType ) {
225222 return new FunctionImp () {
226223 @ Override
227224 public RexNode resolve (RexBuilder builder , RexNode ... args ) {
@@ -230,7 +227,17 @@ public RexNode resolve(RexBuilder builder, RexNode... args) {
230227
231228 @ Override
232229 public PPLTypeChecker getTypeChecker () {
233- return wrapComposite (typeChecker );
230+ try {
231+ return wrapComposite (typeChecker , checkCompositionType );
232+ } catch (IllegalArgumentException | UnsupportedOperationException e ) {
233+ logger .debug (
234+ String .format (
235+ "Failed to create composite type checker for operator: %s. Will skip its type"
236+ + " checking" ,
237+ operator .getName ()),
238+ e );
239+ return null ;
240+ }
234241 }
235242 };
236243 }
@@ -250,6 +257,36 @@ public PPLTypeChecker getTypeChecker() {
250257 };
251258 }
252259
260+ private static FunctionImp createFunctionImpWithTypeChecker (
261+ BiFunction <RexBuilder , RexNode , RexNode > resolver , PPLTypeChecker typeChecker ) {
262+ return new FunctionImp1 () {
263+ @ Override
264+ public RexNode resolve (RexBuilder builder , RexNode arg1 ) {
265+ return resolver .apply (builder , arg1 );
266+ }
267+
268+ @ Override
269+ public PPLTypeChecker getTypeChecker () {
270+ return typeChecker ;
271+ }
272+ };
273+ }
274+
275+ private static FunctionImp createFunctionImpWithTypeChecker (
276+ TriFunction <RexBuilder , RexNode , RexNode , RexNode > resolver , PPLTypeChecker typeChecker ) {
277+ return new FunctionImp2 () {
278+ @ Override
279+ public RexNode resolve (RexBuilder builder , RexNode arg1 , RexNode arg2 ) {
280+ return resolver .apply (builder , arg1 , arg2 );
281+ }
282+
283+ @ Override
284+ public PPLTypeChecker getTypeChecker () {
285+ return typeChecker ;
286+ }
287+ };
288+ }
289+
253290 void populate () {
254291 // Register std operator
255292 registerOperator (AND , SqlStdOperatorTable .AND );
@@ -537,34 +574,4 @@ public PPLTypeChecker getTypeChecker() {
537574 return family (booleanFamily , booleanFamily );
538575 }
539576 }
540-
541- private static FunctionImp createFunctionImpWithTypeChecker (
542- BiFunction <RexBuilder , RexNode , RexNode > resolver , PPLTypeChecker typeChecker ) {
543- return new FunctionImp1 () {
544- @ Override
545- public RexNode resolve (RexBuilder builder , RexNode arg1 ) {
546- return resolver .apply (builder , arg1 );
547- }
548-
549- @ Override
550- public PPLTypeChecker getTypeChecker () {
551- return typeChecker ;
552- }
553- };
554- }
555-
556- private static FunctionImp createFunctionImpWithTypeChecker (
557- TriFunction <RexBuilder , RexNode , RexNode , RexNode > resolver , PPLTypeChecker typeChecker ) {
558- return new FunctionImp2 () {
559- @ Override
560- public RexNode resolve (RexBuilder builder , RexNode arg1 , RexNode arg2 ) {
561- return resolver .apply (builder , arg1 , arg2 );
562- }
563-
564- @ Override
565- public PPLTypeChecker getTypeChecker () {
566- return typeChecker ;
567- }
568- };
569- }
570577}
0 commit comments