ScalarBuiltins.java

// Licensed to the Apache Software Foundation (ASF) under one 
// or more contributor license agreements.  See the NOTICE file 
// distributed with this work for additional information 
// regarding copyright ownership.  The ASF licenses this file 
// to you under the Apache License, Version 2.0 (the 
// "License"); you may not use this file except in compliance 
// with the License.  You may obtain a copy of the License at 
// 
//  http://www.apache.org/licenses/LICENSE-2.0
// 
//  Unless required by applicable law or agreed to in writing, software
//  distributed under the License is distributed on an "AS IS" BASIS,
//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//  See the License for the specific language governing permissions and
//  limitations under the License.

// This is a generated file, DO NOT EDIT.
// To add new functions, see the generator at
// common/function-registry/gen_builtins_catalog.py or the function list at
// common/function-registry/doris_builtins_functions.py.

package org.apache.doris.builtins;

import org.apache.doris.catalog.ArrayType;
import org.apache.doris.catalog.MapType;
import org.apache.doris.catalog.StructType;
import org.apache.doris.catalog.TemplateType;
import org.apache.doris.catalog.Type;
import org.apache.doris.catalog.Function;
import org.apache.doris.catalog.FunctionSet;
import com.google.common.collect.Sets;
import java.util.Set;

public class ScalarBuiltins { 
    public static void initBuiltins(FunctionSet functionSet) { 
        initWidth_bucketBuiltins(functionSet);
        initJsonBuiltins(functionSet);
        initTokenizeBuiltins(functionSet);
        initArrayBuiltins(functionSet);
        initMathBuiltins(functionSet);
        initHashBuiltins(functionSet);
        initStructBuiltins(functionSet);
        initTimestampBuiltins(functionSet);
        initQuantileBuiltins(functionSet);
        initMultimatchBuiltins(functionSet);
        initNullalbeBuiltins(functionSet);
        initCompatableBuiltins(functionSet);
        initGeoBuiltins(functionSet);
        initMapBuiltins(functionSet);
        initSearchBuiltins(functionSet);
        initUrlBuiltins(functionSet);
        initIpBuiltins(functionSet);
        initVariantBuiltins(functionSet);
        initIgnoreBuiltins(functionSet);
        initNonnullalbeBuiltins(functionSet);
        initBitBuiltins(functionSet);
        initStringBuiltins(functionSet);
        initAesBuiltins(functionSet);
        initUuidBuiltins(functionSet);
        initConditionalBuiltins(functionSet);
        initBitmapBuiltins(functionSet);
        initHllBuiltins(functionSet);
        initUtilityBuiltins(functionSet);
        initGroupingBuiltins(functionSet);
        Set<String> funcNames = Sets.newHashSet();
        funcNames.add("str_to_date");
        funcNames.add("convert_tz");
        funcNames.add("pi");
        funcNames.add("e");
        funcNames.add("divide");
        funcNames.add("int_divide");
        funcNames.add("pmod");
        funcNames.add("mod");
        funcNames.add("fmod");
        funcNames.add("substr");
        funcNames.add("substring");
        funcNames.add("overlay");
        funcNames.add("strcmp");
        funcNames.add("append_trailing_char_if_absent");
        funcNames.add("ST_X");
        funcNames.add("ST_Y");
        funcNames.add("ST_AsText");
        funcNames.add("ST_GeometryFromText");
        funcNames.add("ST_LineFromText");
        funcNames.add("ST_Polygon");
        funcNames.add("ST_Contains");
        funcNames.add("from_unixtime");
        functionSet.buildNullResultWithOneNullParamFunction(funcNames);
        Set<String> nondeterministicFuncNames = Sets.newHashSet();
        nondeterministicFuncNames.add("rand");
        nondeterministicFuncNames.add("now");
        nondeterministicFuncNames.add("current_timestamp");
        nondeterministicFuncNames.add("localtime");
        nondeterministicFuncNames.add("localtimestamp");
        nondeterministicFuncNames.add("curdate");
        nondeterministicFuncNames.add("current_date");
        nondeterministicFuncNames.add("curtime");
        nondeterministicFuncNames.add("current_time");
        nondeterministicFuncNames.add("utc_timestamp");
        nondeterministicFuncNames.add("uuid");
        functionSet.buildNondeterministicFunctions(nondeterministicFuncNames);
    }

    private static void initWidth_bucketBuiltins(FunctionSet functionSet) {
        functionSet.addScalarAndVectorizedBuiltin("width_bucket", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.TINYINT, Type.TINYINT, Type.TINYINT, Type.TINYINT);
        functionSet.addScalarAndVectorizedBuiltin("width_bucket", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.SMALLINT, Type.SMALLINT, Type.SMALLINT, Type.SMALLINT);
        functionSet.addScalarAndVectorizedBuiltin("width_bucket", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.INT, Type.INT, Type.INT, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("width_bucket", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.BIGINT, Type.BIGINT, Type.BIGINT, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("width_bucket", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.FLOAT, Type.FLOAT, Type.FLOAT, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("width_bucket", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.DOUBLE, Type.DOUBLE, Type.DOUBLE, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("width_bucket", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.DECIMAL32, Type.DECIMAL32, Type.DECIMAL32, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("width_bucket", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.DECIMAL64, Type.DECIMAL64, Type.DECIMAL64, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("width_bucket", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.DECIMAL128, Type.DECIMAL128, Type.DECIMAL128, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("width_bucket", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.MAX_DECIMALV2_TYPE, Type.MAX_DECIMALV2_TYPE, Type.MAX_DECIMALV2_TYPE, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("width_bucket", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.DATE, Type.DATE, Type.DATE, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("width_bucket", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.DATEV2, Type.DATEV2, Type.DATEV2, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("width_bucket", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.DATETIME, Type.DATETIME, Type.DATETIME, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("width_bucket", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.DATETIMEV2, Type.DATETIMEV2, Type.DATETIMEV2, Type.BIGINT);
    }
    private static void initJsonBuiltins(FunctionSet functionSet) {
        functionSet.addScalarAndVectorizedBuiltin("jsonb_parse", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.JSONB, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("jsonb_parse_error_to_null", true, Function.NullableMode.ALWAYS_NULLABLE, Type.JSONB, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("jsonb_parse_error_to_value", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.JSONB, false, Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("jsonb_parse_error_to_invalid", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.JSONB, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("jsonb_parse_nullable", true, Function.NullableMode.ALWAYS_NULLABLE, Type.JSONB, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("jsonb_parse_nullable_error_to_null", true, Function.NullableMode.ALWAYS_NULLABLE, Type.JSONB, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("jsonb_parse_nullable_error_to_value", true, Function.NullableMode.ALWAYS_NULLABLE, Type.JSONB, false, Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("jsonb_parse_nullable_error_to_invalid", true, Function.NullableMode.ALWAYS_NULLABLE, Type.JSONB, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("jsonb_parse_notnull", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.JSONB, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("jsonb_parse_notnull_error_to_value", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.JSONB, false, Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("jsonb_parse_notnull_error_to_invalid", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.JSONB, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("jsonb_exists_path", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BOOLEAN, false, Type.JSONB, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("jsonb_exists_path", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BOOLEAN, false, Type.JSONB, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("jsonb_type", true, Function.NullableMode.ALWAYS_NULLABLE, Type.STRING, false, Type.JSONB, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("jsonb_type", true, Function.NullableMode.ALWAYS_NULLABLE, Type.STRING, false, Type.JSONB, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("jsonb_keys", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.STRING), false, Type.JSONB);
        functionSet.addScalarAndVectorizedBuiltin("jsonb_keys", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.STRING), false, Type.JSONB, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("json_keys", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.STRING), false, Type.JSONB);
        functionSet.addScalarAndVectorizedBuiltin("json_keys", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.STRING), false, Type.JSONB, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("jsonb_extract", true, Function.NullableMode.ALWAYS_NULLABLE, Type.JSONB, true, Type.JSONB, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("jsonb_extract", true, Function.NullableMode.ALWAYS_NULLABLE, Type.JSONB, true, Type.JSONB, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("jsonb_extract_isnull", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BOOLEAN, false, Type.JSONB, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("jsonb_extract_isnull", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BOOLEAN, false, Type.JSONB, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("jsonb_extract_bool", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BOOLEAN, false, Type.JSONB, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("jsonb_extract_bool", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BOOLEAN, false, Type.JSONB, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("jsonb_extract_int", true, Function.NullableMode.ALWAYS_NULLABLE, Type.INT, false, Type.JSONB, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("jsonb_extract_int", true, Function.NullableMode.ALWAYS_NULLABLE, Type.INT, false, Type.JSONB, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("jsonb_extract_bigint", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BIGINT, false, Type.JSONB, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("jsonb_extract_bigint", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BIGINT, false, Type.JSONB, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("jsonb_extract_largeint", true, Function.NullableMode.ALWAYS_NULLABLE, Type.LARGEINT, false, Type.JSONB, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("jsonb_extract_largeint", true, Function.NullableMode.ALWAYS_NULLABLE, Type.LARGEINT, false, Type.JSONB, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("jsonb_extract_double", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, Type.JSONB, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("jsonb_extract_double", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, Type.JSONB, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("jsonb_extract_string", true, Function.NullableMode.ALWAYS_NULLABLE, Type.STRING, false, Type.JSONB, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("jsonb_extract_string", true, Function.NullableMode.ALWAYS_NULLABLE, Type.STRING, false, Type.JSONB, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("json_parse", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.JSONB, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("json_parse_error_to_null", true, Function.NullableMode.ALWAYS_NULLABLE, Type.JSONB, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("json_parse_error_to_value", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.JSONB, false, Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("json_parse_error_to_invalid", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.JSONB, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("json_parse_nullable", true, Function.NullableMode.ALWAYS_NULLABLE, Type.JSONB, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("json_parse_nullable_error_to_null", true, Function.NullableMode.ALWAYS_NULLABLE, Type.JSONB, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("json_parse_nullable_error_to_value", true, Function.NullableMode.ALWAYS_NULLABLE, Type.JSONB, false, Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("json_parse_nullable_error_to_invalid", true, Function.NullableMode.ALWAYS_NULLABLE, Type.JSONB, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("json_parse_notnull", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.JSONB, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("json_parse_notnull_error_to_value", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.JSONB, false, Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("json_parse_notnull_error_to_invalid", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.JSONB, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("json_search", true, Function.NullableMode.ALWAYS_NULLABLE, Type.JSONB, false, Type.VARCHAR, Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("json_exists_path", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BOOLEAN, false, Type.JSONB, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("json_exists_path", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BOOLEAN, false, Type.JSONB, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("json_type", true, Function.NullableMode.ALWAYS_NULLABLE, Type.STRING, false, Type.JSONB, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("json_type", true, Function.NullableMode.ALWAYS_NULLABLE, Type.STRING, false, Type.JSONB, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("json_extract_isnull", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BOOLEAN, false, Type.JSONB, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("json_extract_isnull", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BOOLEAN, false, Type.JSONB, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("json_extract_bool", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BOOLEAN, false, Type.JSONB, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("json_extract_bool", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BOOLEAN, false, Type.JSONB, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("json_extract_int", true, Function.NullableMode.ALWAYS_NULLABLE, Type.INT, false, Type.JSONB, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("json_extract_int", true, Function.NullableMode.ALWAYS_NULLABLE, Type.INT, false, Type.JSONB, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("json_extract_bigint", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BIGINT, false, Type.JSONB, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("json_extract_bigint", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BIGINT, false, Type.JSONB, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("json_extract_largeint", true, Function.NullableMode.ALWAYS_NULLABLE, Type.LARGEINT, false, Type.JSONB, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("json_extract_largeint", true, Function.NullableMode.ALWAYS_NULLABLE, Type.LARGEINT, false, Type.JSONB, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("json_extract_double", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, Type.JSONB, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("json_extract_double", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, Type.JSONB, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("json_extract_string", true, Function.NullableMode.ALWAYS_NULLABLE, Type.STRING, false, Type.JSONB, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("json_extract_string", true, Function.NullableMode.ALWAYS_NULLABLE, Type.STRING, false, Type.JSONB, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("json_length", true, Function.NullableMode.ALWAYS_NULLABLE, Type.INT, false, Type.JSONB);
        functionSet.addScalarAndVectorizedBuiltin("json_length", true, Function.NullableMode.ALWAYS_NULLABLE, Type.INT, false, Type.JSONB, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("json_length", true, Function.NullableMode.ALWAYS_NULLABLE, Type.INT, false, Type.JSONB, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("json_contains", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BOOLEAN, false, Type.JSONB, Type.JSONB);
        functionSet.addScalarAndVectorizedBuiltin("json_contains", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BOOLEAN, false, Type.JSONB, Type.JSONB, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("json_contains", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BOOLEAN, false, Type.JSONB, Type.JSONB, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("get_json_int", true, Function.NullableMode.ALWAYS_NULLABLE, Type.INT, false, Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("get_json_double", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("get_json_string", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("get_json_int", true, Function.NullableMode.ALWAYS_NULLABLE, Type.INT, false, Type.STRING, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("get_json_double", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, Type.STRING, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("get_json_string", true, Function.NullableMode.ALWAYS_NULLABLE, Type.STRING, false, Type.STRING, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("get_json_bigint", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BIGINT, false, Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("get_json_bigint", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BIGINT, false, Type.STRING, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("get_json_string", true, Function.NullableMode.ALWAYS_NULLABLE, Type.STRING, false, Type.JSONB, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("get_json_string", true, Function.NullableMode.ALWAYS_NULLABLE, Type.STRING, false, Type.JSONB, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("get_json_int", true, Function.NullableMode.ALWAYS_NULLABLE, Type.INT, false, Type.JSONB, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("get_json_int", true, Function.NullableMode.ALWAYS_NULLABLE, Type.INT, false, Type.JSONB, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("get_json_double", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, Type.JSONB, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("get_json_double", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, Type.JSONB, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("get_json_bigint", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BIGINT, false, Type.JSONB, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("get_json_bigint", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BIGINT, false, Type.JSONB, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("json_array", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.VARCHAR, true, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("json_object", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.VARCHAR, true, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("json_quote", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("json_valid", true, Function.NullableMode.ALWAYS_NULLABLE, Type.INT, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("json_contains", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BOOLEAN, false, Type.VARCHAR, Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("json_unquote", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("json_extract", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, true, Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("json_extract", true, Function.NullableMode.ALWAYS_NULLABLE, Type.STRING, true, Type.STRING, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("json_insert", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, true, Type.VARCHAR, Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("json_replace", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, true, Type.VARCHAR, Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("json_set", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, true, Type.VARCHAR, Type.VARCHAR, Type.VARCHAR);
    }
    private static void initTokenizeBuiltins(FunctionSet functionSet) {
        functionSet.addScalarAndVectorizedBuiltin("tokenize", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.VARCHAR), false, Type.STRING, Type.STRING);
    }
    private static void initArrayBuiltins(FunctionSet functionSet) {
        functionSet.addScalarAndVectorizedBuiltin("array", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.ARRAY, true, Type.BOOLEAN);
        functionSet.addScalarAndVectorizedBuiltin("array", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.ARRAY, true, Type.TINYINT);
        functionSet.addScalarAndVectorizedBuiltin("array", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.ARRAY, true, Type.SMALLINT);
        functionSet.addScalarAndVectorizedBuiltin("array", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.ARRAY, true, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("array", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.ARRAY, true, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.ARRAY, true, Type.LARGEINT);
        functionSet.addScalarAndVectorizedBuiltin("array", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.ARRAY, true, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("array", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.ARRAY, true, Type.DATE);
        functionSet.addScalarAndVectorizedBuiltin("array", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.ARRAY, true, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("array", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.ARRAY, true, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("array", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.ARRAY, true, Type.MAX_DECIMALV2_TYPE);
        functionSet.addScalarAndVectorizedBuiltin("array", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.ARRAY, true, Type.DECIMAL32);
        functionSet.addScalarAndVectorizedBuiltin("array", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.ARRAY, true, Type.DECIMAL64);
        functionSet.addScalarAndVectorizedBuiltin("array", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.ARRAY, true, Type.DECIMAL128);
        functionSet.addScalarAndVectorizedBuiltin("array", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.ARRAY, true, Type.FLOAT);
        functionSet.addScalarAndVectorizedBuiltin("array", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.ARRAY, true, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("array", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.ARRAY, true, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("array", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.ARRAY, true, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("element_at", true, Function.NullableMode.ALWAYS_NULLABLE, new TemplateType("T"), false, new ArrayType(new TemplateType("T")), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("%element_extract%", true, Function.NullableMode.ALWAYS_NULLABLE, new TemplateType("T"), false, new ArrayType(new TemplateType("T")), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("l1_distance", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, new ArrayType(Type.TINYINT), new ArrayType(Type.TINYINT));
        functionSet.addScalarAndVectorizedBuiltin("l1_distance", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, new ArrayType(Type.SMALLINT), new ArrayType(Type.SMALLINT));
        functionSet.addScalarAndVectorizedBuiltin("l1_distance", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, new ArrayType(Type.INT), new ArrayType(Type.INT));
        functionSet.addScalarAndVectorizedBuiltin("l1_distance", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, new ArrayType(Type.BIGINT), new ArrayType(Type.BIGINT));
        functionSet.addScalarAndVectorizedBuiltin("l1_distance", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, new ArrayType(Type.LARGEINT), new ArrayType(Type.LARGEINT));
        functionSet.addScalarAndVectorizedBuiltin("l1_distance", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, new ArrayType(Type.FLOAT), new ArrayType(Type.FLOAT));
        functionSet.addScalarAndVectorizedBuiltin("l1_distance", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, new ArrayType(Type.DOUBLE), new ArrayType(Type.DOUBLE));
        functionSet.addScalarAndVectorizedBuiltin("l2_distance", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, new ArrayType(Type.TINYINT), new ArrayType(Type.TINYINT));
        functionSet.addScalarAndVectorizedBuiltin("l2_distance", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, new ArrayType(Type.SMALLINT), new ArrayType(Type.SMALLINT));
        functionSet.addScalarAndVectorizedBuiltin("l2_distance", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, new ArrayType(Type.INT), new ArrayType(Type.INT));
        functionSet.addScalarAndVectorizedBuiltin("l2_distance", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, new ArrayType(Type.BIGINT), new ArrayType(Type.BIGINT));
        functionSet.addScalarAndVectorizedBuiltin("l2_distance", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, new ArrayType(Type.LARGEINT), new ArrayType(Type.LARGEINT));
        functionSet.addScalarAndVectorizedBuiltin("l2_distance", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, new ArrayType(Type.FLOAT), new ArrayType(Type.FLOAT));
        functionSet.addScalarAndVectorizedBuiltin("l2_distance", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, new ArrayType(Type.DOUBLE), new ArrayType(Type.DOUBLE));
        functionSet.addScalarAndVectorizedBuiltin("cosine_distance", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, new ArrayType(Type.TINYINT), new ArrayType(Type.TINYINT));
        functionSet.addScalarAndVectorizedBuiltin("cosine_distance", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, new ArrayType(Type.SMALLINT), new ArrayType(Type.SMALLINT));
        functionSet.addScalarAndVectorizedBuiltin("cosine_distance", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, new ArrayType(Type.INT), new ArrayType(Type.INT));
        functionSet.addScalarAndVectorizedBuiltin("cosine_distance", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, new ArrayType(Type.BIGINT), new ArrayType(Type.BIGINT));
        functionSet.addScalarAndVectorizedBuiltin("cosine_distance", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, new ArrayType(Type.LARGEINT), new ArrayType(Type.LARGEINT));
        functionSet.addScalarAndVectorizedBuiltin("cosine_distance", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, new ArrayType(Type.FLOAT), new ArrayType(Type.FLOAT));
        functionSet.addScalarAndVectorizedBuiltin("cosine_distance", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, new ArrayType(Type.DOUBLE), new ArrayType(Type.DOUBLE));
        functionSet.addScalarAndVectorizedBuiltin("inner_product", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, new ArrayType(Type.TINYINT), new ArrayType(Type.TINYINT));
        functionSet.addScalarAndVectorizedBuiltin("inner_product", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, new ArrayType(Type.SMALLINT), new ArrayType(Type.SMALLINT));
        functionSet.addScalarAndVectorizedBuiltin("inner_product", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, new ArrayType(Type.INT), new ArrayType(Type.INT));
        functionSet.addScalarAndVectorizedBuiltin("inner_product", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, new ArrayType(Type.BIGINT), new ArrayType(Type.BIGINT));
        functionSet.addScalarAndVectorizedBuiltin("inner_product", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, new ArrayType(Type.LARGEINT), new ArrayType(Type.LARGEINT));
        functionSet.addScalarAndVectorizedBuiltin("inner_product", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, new ArrayType(Type.FLOAT), new ArrayType(Type.FLOAT));
        functionSet.addScalarAndVectorizedBuiltin("inner_product", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, new ArrayType(Type.DOUBLE), new ArrayType(Type.DOUBLE));
        functionSet.addScalarAndVectorizedBuiltin("arrays_overlap", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BOOLEAN, false, new ArrayType(Type.BOOLEAN), new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("arrays_overlap", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BOOLEAN, false, new ArrayType(Type.TINYINT), new ArrayType(Type.TINYINT));
        functionSet.addScalarAndVectorizedBuiltin("arrays_overlap", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BOOLEAN, false, new ArrayType(Type.SMALLINT), new ArrayType(Type.SMALLINT));
        functionSet.addScalarAndVectorizedBuiltin("arrays_overlap", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BOOLEAN, false, new ArrayType(Type.INT), new ArrayType(Type.INT));
        functionSet.addScalarAndVectorizedBuiltin("arrays_overlap", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BOOLEAN, false, new ArrayType(Type.BIGINT), new ArrayType(Type.BIGINT));
        functionSet.addScalarAndVectorizedBuiltin("arrays_overlap", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BOOLEAN, false, new ArrayType(Type.LARGEINT), new ArrayType(Type.LARGEINT));
        functionSet.addScalarAndVectorizedBuiltin("arrays_overlap", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BOOLEAN, false, new ArrayType(Type.DATETIME), new ArrayType(Type.DATETIME));
        functionSet.addScalarAndVectorizedBuiltin("arrays_overlap", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BOOLEAN, false, new ArrayType(Type.DATE), new ArrayType(Type.DATE));
        functionSet.addScalarAndVectorizedBuiltin("arrays_overlap", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BOOLEAN, false, new ArrayType(Type.DATETIMEV2), new ArrayType(Type.DATETIMEV2));
        functionSet.addScalarAndVectorizedBuiltin("arrays_overlap", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BOOLEAN, false, new ArrayType(Type.DATEV2), new ArrayType(Type.DATEV2));
        functionSet.addScalarAndVectorizedBuiltin("arrays_overlap", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BOOLEAN, false, new ArrayType(Type.FLOAT), new ArrayType(Type.FLOAT));
        functionSet.addScalarAndVectorizedBuiltin("arrays_overlap", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BOOLEAN, false, new ArrayType(Type.DOUBLE), new ArrayType(Type.DOUBLE));
        functionSet.addScalarAndVectorizedBuiltin("arrays_overlap", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BOOLEAN, false, new ArrayType(Type.MAX_DECIMALV2_TYPE), new ArrayType(Type.MAX_DECIMALV2_TYPE));
        functionSet.addScalarAndVectorizedBuiltin("arrays_overlap", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BOOLEAN, false, new ArrayType(Type.DECIMAL32), new ArrayType(Type.DECIMAL32));
        functionSet.addScalarAndVectorizedBuiltin("arrays_overlap", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BOOLEAN, false, new ArrayType(Type.DECIMAL64), new ArrayType(Type.DECIMAL64));
        functionSet.addScalarAndVectorizedBuiltin("arrays_overlap", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BOOLEAN, false, new ArrayType(Type.DECIMAL128), new ArrayType(Type.DECIMAL128));
        functionSet.addScalarAndVectorizedBuiltin("arrays_overlap", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BOOLEAN, false, new ArrayType(Type.VARCHAR), new ArrayType(Type.VARCHAR));
        functionSet.addScalarAndVectorizedBuiltin("arrays_overlap", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BOOLEAN, false, new ArrayType(Type.STRING), new ArrayType(Type.STRING));
        functionSet.addScalarAndVectorizedBuiltin("array_contains_all", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BOOLEAN, false, new ArrayType(new TemplateType("T")), new ArrayType(new TemplateType("T")));
        functionSet.addScalarAndVectorizedBuiltin("array_contains", true, Function.NullableMode.CUSTOM, Type.BOOLEAN, false, new ArrayType(new TemplateType("T")), new TemplateType("T"));
        functionSet.addScalarAndVectorizedBuiltin("array_cum_sum", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), false, new ArrayType(Type.TINYINT));
        functionSet.addScalarAndVectorizedBuiltin("array_cum_sum", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), false, new ArrayType(Type.SMALLINT));
        functionSet.addScalarAndVectorizedBuiltin("array_cum_sum", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), false, new ArrayType(Type.INT));
        functionSet.addScalarAndVectorizedBuiltin("array_cum_sum", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), false, new ArrayType(Type.BIGINT));
        functionSet.addScalarAndVectorizedBuiltin("array_cum_sum", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.LARGEINT), false, new ArrayType(Type.LARGEINT));
        functionSet.addScalarAndVectorizedBuiltin("array_cum_sum", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DOUBLE), false, new ArrayType(Type.FLOAT));
        functionSet.addScalarAndVectorizedBuiltin("array_cum_sum", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DOUBLE), false, new ArrayType(Type.DOUBLE));
        functionSet.addScalarAndVectorizedBuiltin("array_cum_sum", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.MAX_DECIMALV2_TYPE), false, new ArrayType(Type.MAX_DECIMALV2_TYPE));
        functionSet.addScalarAndVectorizedBuiltin("array_cum_sum", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL128), false, new ArrayType(Type.DECIMAL32));
        functionSet.addScalarAndVectorizedBuiltin("array_cum_sum", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL128), false, new ArrayType(Type.DECIMAL64));
        functionSet.addScalarAndVectorizedBuiltin("array_cum_sum", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL128), false, new ArrayType(Type.DECIMAL128));
        functionSet.addScalarAndVectorizedBuiltin("array_enumerate", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), false, new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_enumerate", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), false, new ArrayType(Type.TINYINT));
        functionSet.addScalarAndVectorizedBuiltin("array_enumerate", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), false, new ArrayType(Type.SMALLINT));
        functionSet.addScalarAndVectorizedBuiltin("array_enumerate", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), false, new ArrayType(Type.INT));
        functionSet.addScalarAndVectorizedBuiltin("array_enumerate", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), false, new ArrayType(Type.BIGINT));
        functionSet.addScalarAndVectorizedBuiltin("array_enumerate", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), false, new ArrayType(Type.LARGEINT));
        functionSet.addScalarAndVectorizedBuiltin("array_enumerate", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), false, new ArrayType(Type.DATETIME));
        functionSet.addScalarAndVectorizedBuiltin("array_enumerate", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), false, new ArrayType(Type.DATE));
        functionSet.addScalarAndVectorizedBuiltin("array_enumerate", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), false, new ArrayType(Type.DATETIMEV2));
        functionSet.addScalarAndVectorizedBuiltin("array_enumerate", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), false, new ArrayType(Type.DATEV2));
        functionSet.addScalarAndVectorizedBuiltin("array_enumerate", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), false, new ArrayType(Type.FLOAT));
        functionSet.addScalarAndVectorizedBuiltin("array_enumerate", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), false, new ArrayType(Type.DOUBLE));
        functionSet.addScalarAndVectorizedBuiltin("array_enumerate", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), false, new ArrayType(Type.MAX_DECIMALV2_TYPE));
        functionSet.addScalarAndVectorizedBuiltin("array_enumerate", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), false, new ArrayType(Type.DECIMAL32));
        functionSet.addScalarAndVectorizedBuiltin("array_enumerate", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), false, new ArrayType(Type.DECIMAL64));
        functionSet.addScalarAndVectorizedBuiltin("array_enumerate", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), false, new ArrayType(Type.DECIMAL128));
        functionSet.addScalarAndVectorizedBuiltin("array_enumerate", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), false, new ArrayType(Type.VARCHAR));
        functionSet.addScalarAndVectorizedBuiltin("array_enumerate", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), false, new ArrayType(Type.STRING));
        functionSet.addScalarAndVectorizedBuiltin("array_enumerate_uniq", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), true, new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_enumerate_uniq", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), true, new ArrayType(Type.TINYINT));
        functionSet.addScalarAndVectorizedBuiltin("array_enumerate_uniq", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), true, new ArrayType(Type.SMALLINT));
        functionSet.addScalarAndVectorizedBuiltin("array_enumerate_uniq", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), true, new ArrayType(Type.INT));
        functionSet.addScalarAndVectorizedBuiltin("array_enumerate_uniq", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), true, new ArrayType(Type.BIGINT));
        functionSet.addScalarAndVectorizedBuiltin("array_enumerate_uniq", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), true, new ArrayType(Type.LARGEINT));
        functionSet.addScalarAndVectorizedBuiltin("array_enumerate_uniq", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), true, new ArrayType(Type.DATETIME));
        functionSet.addScalarAndVectorizedBuiltin("array_enumerate_uniq", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), true, new ArrayType(Type.DATE));
        functionSet.addScalarAndVectorizedBuiltin("array_enumerate_uniq", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), true, new ArrayType(Type.DATETIMEV2));
        functionSet.addScalarAndVectorizedBuiltin("array_enumerate_uniq", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), true, new ArrayType(Type.DATEV2));
        functionSet.addScalarAndVectorizedBuiltin("array_enumerate_uniq", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), true, new ArrayType(Type.FLOAT));
        functionSet.addScalarAndVectorizedBuiltin("array_enumerate_uniq", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), true, new ArrayType(Type.DOUBLE));
        functionSet.addScalarAndVectorizedBuiltin("array_enumerate_uniq", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), true, new ArrayType(Type.MAX_DECIMALV2_TYPE));
        functionSet.addScalarAndVectorizedBuiltin("array_enumerate_uniq", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), true, new ArrayType(Type.DECIMAL32));
        functionSet.addScalarAndVectorizedBuiltin("array_enumerate_uniq", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), true, new ArrayType(Type.DECIMAL64));
        functionSet.addScalarAndVectorizedBuiltin("array_enumerate_uniq", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), true, new ArrayType(Type.DECIMAL128));
        functionSet.addScalarAndVectorizedBuiltin("array_enumerate_uniq", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), true, new ArrayType(Type.VARCHAR));
        functionSet.addScalarAndVectorizedBuiltin("array_enumerate_uniq", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), true, new ArrayType(Type.STRING));
        functionSet.addScalarAndVectorizedBuiltin("countequal", true, Function.NullableMode.CUSTOM, Type.BIGINT, false, new ArrayType(Type.BOOLEAN), Type.BOOLEAN);
        functionSet.addScalarAndVectorizedBuiltin("countequal", true, Function.NullableMode.CUSTOM, Type.BIGINT, false, new ArrayType(Type.TINYINT), Type.TINYINT);
        functionSet.addScalarAndVectorizedBuiltin("countequal", true, Function.NullableMode.CUSTOM, Type.BIGINT, false, new ArrayType(Type.SMALLINT), Type.SMALLINT);
        functionSet.addScalarAndVectorizedBuiltin("countequal", true, Function.NullableMode.CUSTOM, Type.BIGINT, false, new ArrayType(Type.INT), Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("countequal", true, Function.NullableMode.CUSTOM, Type.BIGINT, false, new ArrayType(Type.BIGINT), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("countequal", true, Function.NullableMode.CUSTOM, Type.BIGINT, false, new ArrayType(Type.LARGEINT), Type.LARGEINT);
        functionSet.addScalarAndVectorizedBuiltin("countequal", true, Function.NullableMode.CUSTOM, Type.BIGINT, false, new ArrayType(Type.DATETIME), Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("countequal", true, Function.NullableMode.CUSTOM, Type.BIGINT, false, new ArrayType(Type.DATE), Type.DATE);
        functionSet.addScalarAndVectorizedBuiltin("countequal", true, Function.NullableMode.CUSTOM, Type.BIGINT, false, new ArrayType(Type.DATETIMEV2), Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("countequal", true, Function.NullableMode.CUSTOM, Type.BIGINT, false, new ArrayType(Type.DATEV2), Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("countequal", true, Function.NullableMode.CUSTOM, Type.BIGINT, false, new ArrayType(Type.FLOAT), Type.FLOAT);
        functionSet.addScalarAndVectorizedBuiltin("countequal", true, Function.NullableMode.CUSTOM, Type.BIGINT, false, new ArrayType(Type.DOUBLE), Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("countequal", true, Function.NullableMode.CUSTOM, Type.BIGINT, false, new ArrayType(Type.MAX_DECIMALV2_TYPE), Type.MAX_DECIMALV2_TYPE);
        functionSet.addScalarAndVectorizedBuiltin("countequal", true, Function.NullableMode.CUSTOM, Type.BIGINT, false, new ArrayType(Type.DECIMAL32), Type.DECIMAL32);
        functionSet.addScalarAndVectorizedBuiltin("countequal", true, Function.NullableMode.CUSTOM, Type.BIGINT, false, new ArrayType(Type.DECIMAL64), Type.DECIMAL64);
        functionSet.addScalarAndVectorizedBuiltin("countequal", true, Function.NullableMode.CUSTOM, Type.BIGINT, false, new ArrayType(Type.DECIMAL128), Type.DECIMAL128);
        functionSet.addScalarAndVectorizedBuiltin("countequal", true, Function.NullableMode.CUSTOM, Type.BIGINT, false, new ArrayType(Type.VARCHAR), Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("countequal", true, Function.NullableMode.CUSTOM, Type.BIGINT, false, new ArrayType(Type.STRING), Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("array_position", true, Function.NullableMode.CUSTOM, Type.BIGINT, false, new ArrayType(Type.BOOLEAN), Type.BOOLEAN);
        functionSet.addScalarAndVectorizedBuiltin("array_position", true, Function.NullableMode.CUSTOM, Type.BIGINT, false, new ArrayType(Type.TINYINT), Type.TINYINT);
        functionSet.addScalarAndVectorizedBuiltin("array_position", true, Function.NullableMode.CUSTOM, Type.BIGINT, false, new ArrayType(Type.SMALLINT), Type.SMALLINT);
        functionSet.addScalarAndVectorizedBuiltin("array_position", true, Function.NullableMode.CUSTOM, Type.BIGINT, false, new ArrayType(Type.INT), Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("array_position", true, Function.NullableMode.CUSTOM, Type.BIGINT, false, new ArrayType(Type.BIGINT), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_position", true, Function.NullableMode.CUSTOM, Type.BIGINT, false, new ArrayType(Type.LARGEINT), Type.LARGEINT);
        functionSet.addScalarAndVectorizedBuiltin("array_position", true, Function.NullableMode.CUSTOM, Type.BIGINT, false, new ArrayType(Type.DATETIME), Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("array_position", true, Function.NullableMode.CUSTOM, Type.BIGINT, false, new ArrayType(Type.DATE), Type.DATE);
        functionSet.addScalarAndVectorizedBuiltin("array_position", true, Function.NullableMode.CUSTOM, Type.BIGINT, false, new ArrayType(Type.DATETIMEV2), Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("array_position", true, Function.NullableMode.CUSTOM, Type.BIGINT, false, new ArrayType(Type.DATEV2), Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("array_position", true, Function.NullableMode.CUSTOM, Type.BIGINT, false, new ArrayType(Type.FLOAT), Type.FLOAT);
        functionSet.addScalarAndVectorizedBuiltin("array_position", true, Function.NullableMode.CUSTOM, Type.BIGINT, false, new ArrayType(Type.DOUBLE), Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("array_position", true, Function.NullableMode.CUSTOM, Type.BIGINT, false, new ArrayType(Type.MAX_DECIMALV2_TYPE), Type.MAX_DECIMALV2_TYPE);
        functionSet.addScalarAndVectorizedBuiltin("array_position", true, Function.NullableMode.CUSTOM, Type.BIGINT, false, new ArrayType(Type.DECIMAL32), Type.DECIMAL32);
        functionSet.addScalarAndVectorizedBuiltin("array_position", true, Function.NullableMode.CUSTOM, Type.BIGINT, false, new ArrayType(Type.DECIMAL64), Type.DECIMAL64);
        functionSet.addScalarAndVectorizedBuiltin("array_position", true, Function.NullableMode.CUSTOM, Type.BIGINT, false, new ArrayType(Type.DECIMAL128), Type.DECIMAL128);
        functionSet.addScalarAndVectorizedBuiltin("array_position", true, Function.NullableMode.CUSTOM, Type.BIGINT, false, new ArrayType(Type.VARCHAR), Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("array_position", true, Function.NullableMode.CUSTOM, Type.BIGINT, false, new ArrayType(Type.STRING), Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("cardinality", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, new ArrayType(new TemplateType("T")));
        functionSet.addScalarAndVectorizedBuiltin("size", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, new ArrayType(new TemplateType("T")));
        functionSet.addScalarAndVectorizedBuiltin("array_size", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, new ArrayType(new TemplateType("T")));
        functionSet.addScalarAndVectorizedBuiltin("array_distinct", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BOOLEAN), false, new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_distinct", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.TINYINT), false, new ArrayType(Type.TINYINT));
        functionSet.addScalarAndVectorizedBuiltin("array_distinct", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.SMALLINT), false, new ArrayType(Type.SMALLINT));
        functionSet.addScalarAndVectorizedBuiltin("array_distinct", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.INT), false, new ArrayType(Type.INT));
        functionSet.addScalarAndVectorizedBuiltin("array_distinct", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), false, new ArrayType(Type.BIGINT));
        functionSet.addScalarAndVectorizedBuiltin("array_distinct", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.LARGEINT), false, new ArrayType(Type.LARGEINT));
        functionSet.addScalarAndVectorizedBuiltin("array_distinct", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATETIME), false, new ArrayType(Type.DATETIME));
        functionSet.addScalarAndVectorizedBuiltin("array_distinct", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATE), false, new ArrayType(Type.DATE));
        functionSet.addScalarAndVectorizedBuiltin("array_distinct", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATETIMEV2), false, new ArrayType(Type.DATETIMEV2));
        functionSet.addScalarAndVectorizedBuiltin("array_distinct", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATEV2), false, new ArrayType(Type.DATEV2));
        functionSet.addScalarAndVectorizedBuiltin("array_distinct", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.FLOAT), false, new ArrayType(Type.FLOAT));
        functionSet.addScalarAndVectorizedBuiltin("array_distinct", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DOUBLE), false, new ArrayType(Type.DOUBLE));
        functionSet.addScalarAndVectorizedBuiltin("array_distinct", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.MAX_DECIMALV2_TYPE), false, new ArrayType(Type.MAX_DECIMALV2_TYPE));
        functionSet.addScalarAndVectorizedBuiltin("array_distinct", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL32), false, new ArrayType(Type.DECIMAL32));
        functionSet.addScalarAndVectorizedBuiltin("array_distinct", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL64), false, new ArrayType(Type.DECIMAL64));
        functionSet.addScalarAndVectorizedBuiltin("array_distinct", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL128), false, new ArrayType(Type.DECIMAL128));
        functionSet.addScalarAndVectorizedBuiltin("array_distinct", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.VARCHAR), false, new ArrayType(Type.VARCHAR));
        functionSet.addScalarAndVectorizedBuiltin("array_distinct", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.STRING), false, new ArrayType(Type.STRING));
        functionSet.addScalarAndVectorizedBuiltin("array_difference", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.SMALLINT), false, new ArrayType(Type.TINYINT));
        functionSet.addScalarAndVectorizedBuiltin("array_difference", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.INT), false, new ArrayType(Type.SMALLINT));
        functionSet.addScalarAndVectorizedBuiltin("array_difference", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), false, new ArrayType(Type.INT));
        functionSet.addScalarAndVectorizedBuiltin("array_difference", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.LARGEINT), false, new ArrayType(Type.BIGINT));
        functionSet.addScalarAndVectorizedBuiltin("array_difference", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.LARGEINT), false, new ArrayType(Type.LARGEINT));
        functionSet.addScalarAndVectorizedBuiltin("array_difference", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DOUBLE), false, new ArrayType(Type.FLOAT));
        functionSet.addScalarAndVectorizedBuiltin("array_difference", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DOUBLE), false, new ArrayType(Type.DOUBLE));
        functionSet.addScalarAndVectorizedBuiltin("array_difference", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.MAX_DECIMALV2_TYPE), false, new ArrayType(Type.MAX_DECIMALV2_TYPE));
        functionSet.addScalarAndVectorizedBuiltin("array_difference", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL32), false, new ArrayType(Type.DECIMAL32));
        functionSet.addScalarAndVectorizedBuiltin("array_difference", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL64), false, new ArrayType(Type.DECIMAL64));
        functionSet.addScalarAndVectorizedBuiltin("array_difference", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL128), false, new ArrayType(Type.DECIMAL128));
        functionSet.addScalarAndVectorizedBuiltin("array_sort", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BOOLEAN), false, new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_sort", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.TINYINT), false, new ArrayType(Type.TINYINT));
        functionSet.addScalarAndVectorizedBuiltin("array_sort", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.SMALLINT), false, new ArrayType(Type.SMALLINT));
        functionSet.addScalarAndVectorizedBuiltin("array_sort", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.INT), false, new ArrayType(Type.INT));
        functionSet.addScalarAndVectorizedBuiltin("array_sort", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), false, new ArrayType(Type.BIGINT));
        functionSet.addScalarAndVectorizedBuiltin("array_sort", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.LARGEINT), false, new ArrayType(Type.LARGEINT));
        functionSet.addScalarAndVectorizedBuiltin("array_sort", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATETIME), false, new ArrayType(Type.DATETIME));
        functionSet.addScalarAndVectorizedBuiltin("array_sort", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATE), false, new ArrayType(Type.DATE));
        functionSet.addScalarAndVectorizedBuiltin("array_sort", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATETIMEV2), false, new ArrayType(Type.DATETIMEV2));
        functionSet.addScalarAndVectorizedBuiltin("array_sort", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATEV2), false, new ArrayType(Type.DATEV2));
        functionSet.addScalarAndVectorizedBuiltin("array_sort", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.FLOAT), false, new ArrayType(Type.FLOAT));
        functionSet.addScalarAndVectorizedBuiltin("array_sort", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DOUBLE), false, new ArrayType(Type.DOUBLE));
        functionSet.addScalarAndVectorizedBuiltin("array_sort", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.MAX_DECIMALV2_TYPE), false, new ArrayType(Type.MAX_DECIMALV2_TYPE));
        functionSet.addScalarAndVectorizedBuiltin("array_sort", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL32), false, new ArrayType(Type.DECIMAL32));
        functionSet.addScalarAndVectorizedBuiltin("array_sort", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL64), false, new ArrayType(Type.DECIMAL64));
        functionSet.addScalarAndVectorizedBuiltin("array_sort", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL128), false, new ArrayType(Type.DECIMAL128));
        functionSet.addScalarAndVectorizedBuiltin("array_sort", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.VARCHAR), false, new ArrayType(Type.VARCHAR));
        functionSet.addScalarAndVectorizedBuiltin("array_sort", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.STRING), false, new ArrayType(Type.STRING));
        functionSet.addScalarAndVectorizedBuiltin("array_reverse_sort", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BOOLEAN), false, new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_reverse_sort", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.TINYINT), false, new ArrayType(Type.TINYINT));
        functionSet.addScalarAndVectorizedBuiltin("array_reverse_sort", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.SMALLINT), false, new ArrayType(Type.SMALLINT));
        functionSet.addScalarAndVectorizedBuiltin("array_reverse_sort", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.INT), false, new ArrayType(Type.INT));
        functionSet.addScalarAndVectorizedBuiltin("array_reverse_sort", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), false, new ArrayType(Type.BIGINT));
        functionSet.addScalarAndVectorizedBuiltin("array_reverse_sort", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.LARGEINT), false, new ArrayType(Type.LARGEINT));
        functionSet.addScalarAndVectorizedBuiltin("array_reverse_sort", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATETIME), false, new ArrayType(Type.DATETIME));
        functionSet.addScalarAndVectorizedBuiltin("array_reverse_sort", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATE), false, new ArrayType(Type.DATE));
        functionSet.addScalarAndVectorizedBuiltin("array_reverse_sort", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATETIMEV2), false, new ArrayType(Type.DATETIMEV2));
        functionSet.addScalarAndVectorizedBuiltin("array_reverse_sort", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATEV2), false, new ArrayType(Type.DATEV2));
        functionSet.addScalarAndVectorizedBuiltin("array_reverse_sort", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.FLOAT), false, new ArrayType(Type.FLOAT));
        functionSet.addScalarAndVectorizedBuiltin("array_reverse_sort", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DOUBLE), false, new ArrayType(Type.DOUBLE));
        functionSet.addScalarAndVectorizedBuiltin("array_reverse_sort", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.MAX_DECIMALV2_TYPE), false, new ArrayType(Type.MAX_DECIMALV2_TYPE));
        functionSet.addScalarAndVectorizedBuiltin("array_reverse_sort", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL32), false, new ArrayType(Type.DECIMAL32));
        functionSet.addScalarAndVectorizedBuiltin("array_reverse_sort", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL64), false, new ArrayType(Type.DECIMAL64));
        functionSet.addScalarAndVectorizedBuiltin("array_reverse_sort", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL128), false, new ArrayType(Type.DECIMAL128));
        functionSet.addScalarAndVectorizedBuiltin("array_reverse_sort", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.VARCHAR), false, new ArrayType(Type.VARCHAR));
        functionSet.addScalarAndVectorizedBuiltin("array_reverse_sort", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.STRING), false, new ArrayType(Type.STRING));
        functionSet.addScalarAndVectorizedBuiltin("array_join", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, new ArrayType(Type.BOOLEAN), Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("array_join", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, new ArrayType(Type.TINYINT), Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("array_join", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, new ArrayType(Type.SMALLINT), Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("array_join", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, new ArrayType(Type.INT), Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("array_join", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, new ArrayType(Type.BIGINT), Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("array_join", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, new ArrayType(Type.LARGEINT), Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("array_join", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, new ArrayType(Type.DATETIME), Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("array_join", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, new ArrayType(Type.DATE), Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("array_join", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, new ArrayType(Type.DATETIMEV2), Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("array_join", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, new ArrayType(Type.DATEV2), Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("array_join", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, new ArrayType(Type.FLOAT), Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("array_join", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, new ArrayType(Type.DOUBLE), Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("array_join", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, new ArrayType(Type.MAX_DECIMALV2_TYPE), Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("array_join", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, new ArrayType(Type.DECIMAL32), Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("array_join", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, new ArrayType(Type.DECIMAL64), Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("array_join", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, new ArrayType(Type.DECIMAL128), Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("array_join", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, new ArrayType(Type.VARCHAR), Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("array_join", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, new ArrayType(Type.STRING), Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("array_join", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, new ArrayType(Type.BOOLEAN), Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("array_join", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, new ArrayType(Type.TINYINT), Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("array_join", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, new ArrayType(Type.SMALLINT), Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("array_join", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, new ArrayType(Type.INT), Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("array_join", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, new ArrayType(Type.BIGINT), Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("array_join", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, new ArrayType(Type.LARGEINT), Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("array_join", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, new ArrayType(Type.DATETIME), Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("array_join", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, new ArrayType(Type.DATE), Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("array_join", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, new ArrayType(Type.DATETIMEV2), Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("array_join", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, new ArrayType(Type.DATEV2), Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("array_join", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, new ArrayType(Type.FLOAT), Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("array_join", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, new ArrayType(Type.DOUBLE), Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("array_join", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, new ArrayType(Type.MAX_DECIMALV2_TYPE), Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("array_join", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, new ArrayType(Type.DECIMAL32), Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("array_join", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, new ArrayType(Type.DECIMAL64), Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("array_join", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, new ArrayType(Type.DECIMAL128), Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("array_join", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, new ArrayType(Type.VARCHAR), Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("array_join", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, new ArrayType(Type.STRING), Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("array_min", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BOOLEAN, false, new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_min", true, Function.NullableMode.ALWAYS_NULLABLE, Type.TINYINT, false, new ArrayType(Type.TINYINT));
        functionSet.addScalarAndVectorizedBuiltin("array_min", true, Function.NullableMode.ALWAYS_NULLABLE, Type.SMALLINT, false, new ArrayType(Type.SMALLINT));
        functionSet.addScalarAndVectorizedBuiltin("array_min", true, Function.NullableMode.ALWAYS_NULLABLE, Type.INT, false, new ArrayType(Type.INT));
        functionSet.addScalarAndVectorizedBuiltin("array_min", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BIGINT, false, new ArrayType(Type.BIGINT));
        functionSet.addScalarAndVectorizedBuiltin("array_min", true, Function.NullableMode.ALWAYS_NULLABLE, Type.LARGEINT, false, new ArrayType(Type.LARGEINT));
        functionSet.addScalarAndVectorizedBuiltin("array_min", true, Function.NullableMode.ALWAYS_NULLABLE, Type.FLOAT, false, new ArrayType(Type.FLOAT));
        functionSet.addScalarAndVectorizedBuiltin("array_min", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, new ArrayType(Type.DOUBLE));
        functionSet.addScalarAndVectorizedBuiltin("array_min", true, Function.NullableMode.ALWAYS_NULLABLE, Type.MAX_DECIMALV2_TYPE, false, new ArrayType(Type.MAX_DECIMALV2_TYPE));
        functionSet.addScalarAndVectorizedBuiltin("array_min", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DECIMAL32, false, new ArrayType(Type.DECIMAL32));
        functionSet.addScalarAndVectorizedBuiltin("array_min", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DECIMAL64, false, new ArrayType(Type.DECIMAL64));
        functionSet.addScalarAndVectorizedBuiltin("array_min", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DECIMAL128, false, new ArrayType(Type.DECIMAL128));
        functionSet.addScalarAndVectorizedBuiltin("array_min", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATE, false, new ArrayType(Type.DATE));
        functionSet.addScalarAndVectorizedBuiltin("array_min", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, new ArrayType(Type.DATETIME));
        functionSet.addScalarAndVectorizedBuiltin("array_min", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATEV2, false, new ArrayType(Type.DATEV2));
        functionSet.addScalarAndVectorizedBuiltin("array_min", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, new ArrayType(Type.DATETIMEV2));
        functionSet.addScalarAndVectorizedBuiltin("array_max", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BOOLEAN, false, new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_max", true, Function.NullableMode.ALWAYS_NULLABLE, Type.TINYINT, false, new ArrayType(Type.TINYINT));
        functionSet.addScalarAndVectorizedBuiltin("array_max", true, Function.NullableMode.ALWAYS_NULLABLE, Type.SMALLINT, false, new ArrayType(Type.SMALLINT));
        functionSet.addScalarAndVectorizedBuiltin("array_max", true, Function.NullableMode.ALWAYS_NULLABLE, Type.INT, false, new ArrayType(Type.INT));
        functionSet.addScalarAndVectorizedBuiltin("array_max", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BIGINT, false, new ArrayType(Type.BIGINT));
        functionSet.addScalarAndVectorizedBuiltin("array_max", true, Function.NullableMode.ALWAYS_NULLABLE, Type.LARGEINT, false, new ArrayType(Type.LARGEINT));
        functionSet.addScalarAndVectorizedBuiltin("array_max", true, Function.NullableMode.ALWAYS_NULLABLE, Type.FLOAT, false, new ArrayType(Type.FLOAT));
        functionSet.addScalarAndVectorizedBuiltin("array_max", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, new ArrayType(Type.DOUBLE));
        functionSet.addScalarAndVectorizedBuiltin("array_max", true, Function.NullableMode.ALWAYS_NULLABLE, Type.MAX_DECIMALV2_TYPE, false, new ArrayType(Type.MAX_DECIMALV2_TYPE));
        functionSet.addScalarAndVectorizedBuiltin("array_max", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DECIMAL32, false, new ArrayType(Type.DECIMAL32));
        functionSet.addScalarAndVectorizedBuiltin("array_max", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DECIMAL64, false, new ArrayType(Type.DECIMAL64));
        functionSet.addScalarAndVectorizedBuiltin("array_max", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DECIMAL128, false, new ArrayType(Type.DECIMAL128));
        functionSet.addScalarAndVectorizedBuiltin("array_max", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATE, false, new ArrayType(Type.DATE));
        functionSet.addScalarAndVectorizedBuiltin("array_max", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, new ArrayType(Type.DATETIME));
        functionSet.addScalarAndVectorizedBuiltin("array_max", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATEV2, false, new ArrayType(Type.DATEV2));
        functionSet.addScalarAndVectorizedBuiltin("array_max", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, new ArrayType(Type.DATETIMEV2));
        functionSet.addScalarAndVectorizedBuiltin("array_sum", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BIGINT, false, new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_sum", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BIGINT, false, new ArrayType(Type.TINYINT));
        functionSet.addScalarAndVectorizedBuiltin("array_sum", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BIGINT, false, new ArrayType(Type.SMALLINT));
        functionSet.addScalarAndVectorizedBuiltin("array_sum", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BIGINT, false, new ArrayType(Type.INT));
        functionSet.addScalarAndVectorizedBuiltin("array_sum", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BIGINT, false, new ArrayType(Type.BIGINT));
        functionSet.addScalarAndVectorizedBuiltin("array_sum", true, Function.NullableMode.ALWAYS_NULLABLE, Type.LARGEINT, false, new ArrayType(Type.LARGEINT));
        functionSet.addScalarAndVectorizedBuiltin("array_sum", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, new ArrayType(Type.FLOAT));
        functionSet.addScalarAndVectorizedBuiltin("array_sum", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, new ArrayType(Type.DOUBLE));
        functionSet.addScalarAndVectorizedBuiltin("array_sum", true, Function.NullableMode.ALWAYS_NULLABLE, Type.MAX_DECIMALV2_TYPE, false, new ArrayType(Type.MAX_DECIMALV2_TYPE));
        functionSet.addScalarAndVectorizedBuiltin("array_sum", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DECIMAL128, false, new ArrayType(Type.DECIMAL32));
        functionSet.addScalarAndVectorizedBuiltin("array_sum", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DECIMAL128, false, new ArrayType(Type.DECIMAL64));
        functionSet.addScalarAndVectorizedBuiltin("array_sum", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DECIMAL128, false, new ArrayType(Type.DECIMAL128));
        functionSet.addScalarAndVectorizedBuiltin("array_avg", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_avg", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, new ArrayType(Type.TINYINT));
        functionSet.addScalarAndVectorizedBuiltin("array_avg", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, new ArrayType(Type.SMALLINT));
        functionSet.addScalarAndVectorizedBuiltin("array_avg", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, new ArrayType(Type.INT));
        functionSet.addScalarAndVectorizedBuiltin("array_avg", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, new ArrayType(Type.BIGINT));
        functionSet.addScalarAndVectorizedBuiltin("array_avg", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, new ArrayType(Type.LARGEINT));
        functionSet.addScalarAndVectorizedBuiltin("array_avg", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, new ArrayType(Type.FLOAT));
        functionSet.addScalarAndVectorizedBuiltin("array_avg", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, new ArrayType(Type.DOUBLE));
        functionSet.addScalarAndVectorizedBuiltin("array_avg", true, Function.NullableMode.ALWAYS_NULLABLE, Type.MAX_DECIMALV2_TYPE, false, new ArrayType(Type.MAX_DECIMALV2_TYPE));
        functionSet.addScalarAndVectorizedBuiltin("array_avg", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DECIMAL128, false, new ArrayType(Type.DECIMAL32));
        functionSet.addScalarAndVectorizedBuiltin("array_avg", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DECIMAL128, false, new ArrayType(Type.DECIMAL64));
        functionSet.addScalarAndVectorizedBuiltin("array_avg", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DECIMAL128, false, new ArrayType(Type.DECIMAL128));
        functionSet.addScalarAndVectorizedBuiltin("array_product", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_product", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, new ArrayType(Type.TINYINT));
        functionSet.addScalarAndVectorizedBuiltin("array_product", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, new ArrayType(Type.SMALLINT));
        functionSet.addScalarAndVectorizedBuiltin("array_product", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, new ArrayType(Type.INT));
        functionSet.addScalarAndVectorizedBuiltin("array_product", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, new ArrayType(Type.BIGINT));
        functionSet.addScalarAndVectorizedBuiltin("array_product", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, new ArrayType(Type.LARGEINT));
        functionSet.addScalarAndVectorizedBuiltin("array_product", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, new ArrayType(Type.FLOAT));
        functionSet.addScalarAndVectorizedBuiltin("array_product", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, new ArrayType(Type.DOUBLE));
        functionSet.addScalarAndVectorizedBuiltin("array_product", true, Function.NullableMode.ALWAYS_NULLABLE, Type.MAX_DECIMALV2_TYPE, false, new ArrayType(Type.MAX_DECIMALV2_TYPE));
        functionSet.addScalarAndVectorizedBuiltin("array_product", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DECIMAL128, false, new ArrayType(Type.DECIMAL32));
        functionSet.addScalarAndVectorizedBuiltin("array_product", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DECIMAL128, false, new ArrayType(Type.DECIMAL64));
        functionSet.addScalarAndVectorizedBuiltin("array_product", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DECIMAL128, false, new ArrayType(Type.DECIMAL128));
        functionSet.addScalarAndVectorizedBuiltin("array_remove", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BOOLEAN), false, new ArrayType(Type.BOOLEAN), Type.BOOLEAN);
        functionSet.addScalarAndVectorizedBuiltin("array_remove", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.TINYINT), false, new ArrayType(Type.TINYINT), Type.TINYINT);
        functionSet.addScalarAndVectorizedBuiltin("array_remove", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.SMALLINT), false, new ArrayType(Type.SMALLINT), Type.SMALLINT);
        functionSet.addScalarAndVectorizedBuiltin("array_remove", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.INT), false, new ArrayType(Type.INT), Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("array_remove", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), false, new ArrayType(Type.BIGINT), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_remove", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.LARGEINT), false, new ArrayType(Type.LARGEINT), Type.LARGEINT);
        functionSet.addScalarAndVectorizedBuiltin("array_remove", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.FLOAT), false, new ArrayType(Type.FLOAT), Type.FLOAT);
        functionSet.addScalarAndVectorizedBuiltin("array_remove", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DOUBLE), false, new ArrayType(Type.DOUBLE), Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("array_remove", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.MAX_DECIMALV2_TYPE), false, new ArrayType(Type.MAX_DECIMALV2_TYPE), Type.MAX_DECIMALV2_TYPE);
        functionSet.addScalarAndVectorizedBuiltin("array_remove", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL32), false, new ArrayType(Type.DECIMAL32), Type.DECIMAL32);
        functionSet.addScalarAndVectorizedBuiltin("array_remove", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL64), false, new ArrayType(Type.DECIMAL64), Type.DECIMAL64);
        functionSet.addScalarAndVectorizedBuiltin("array_remove", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL128), false, new ArrayType(Type.DECIMAL128), Type.DECIMAL128);
        functionSet.addScalarAndVectorizedBuiltin("array_remove", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATETIME), false, new ArrayType(Type.DATETIME), Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("array_remove", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATE), false, new ArrayType(Type.DATE), Type.DATE);
        functionSet.addScalarAndVectorizedBuiltin("array_remove", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATETIMEV2), false, new ArrayType(Type.DATETIMEV2), Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("array_remove", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATEV2), false, new ArrayType(Type.DATEV2), Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("array_remove", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.VARCHAR), false, new ArrayType(Type.VARCHAR), Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("array_remove", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.STRING), false, new ArrayType(Type.STRING), Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("array_union", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BOOLEAN), true, new ArrayType(Type.BOOLEAN), new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_union", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.TINYINT), true, new ArrayType(Type.TINYINT), new ArrayType(Type.TINYINT));
        functionSet.addScalarAndVectorizedBuiltin("array_union", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.SMALLINT), true, new ArrayType(Type.SMALLINT), new ArrayType(Type.SMALLINT));
        functionSet.addScalarAndVectorizedBuiltin("array_union", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.INT), true, new ArrayType(Type.INT), new ArrayType(Type.INT));
        functionSet.addScalarAndVectorizedBuiltin("array_union", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), true, new ArrayType(Type.BIGINT), new ArrayType(Type.BIGINT));
        functionSet.addScalarAndVectorizedBuiltin("array_union", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.LARGEINT), true, new ArrayType(Type.LARGEINT), new ArrayType(Type.LARGEINT));
        functionSet.addScalarAndVectorizedBuiltin("array_union", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.FLOAT), true, new ArrayType(Type.FLOAT), new ArrayType(Type.FLOAT));
        functionSet.addScalarAndVectorizedBuiltin("array_union", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DOUBLE), true, new ArrayType(Type.DOUBLE), new ArrayType(Type.DOUBLE));
        functionSet.addScalarAndVectorizedBuiltin("array_union", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.MAX_DECIMALV2_TYPE), true, new ArrayType(Type.MAX_DECIMALV2_TYPE), new ArrayType(Type.MAX_DECIMALV2_TYPE));
        functionSet.addScalarAndVectorizedBuiltin("array_union", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL32), true, new ArrayType(Type.DECIMAL32), new ArrayType(Type.DECIMAL32));
        functionSet.addScalarAndVectorizedBuiltin("array_union", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL64), true, new ArrayType(Type.DECIMAL64), new ArrayType(Type.DECIMAL64));
        functionSet.addScalarAndVectorizedBuiltin("array_union", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL128), true, new ArrayType(Type.DECIMAL128), new ArrayType(Type.DECIMAL128));
        functionSet.addScalarAndVectorizedBuiltin("array_union", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATETIME), true, new ArrayType(Type.DATETIME), new ArrayType(Type.DATETIME));
        functionSet.addScalarAndVectorizedBuiltin("array_union", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATE), true, new ArrayType(Type.DATE), new ArrayType(Type.DATE));
        functionSet.addScalarAndVectorizedBuiltin("array_union", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATETIMEV2), true, new ArrayType(Type.DATETIMEV2), new ArrayType(Type.DATETIMEV2));
        functionSet.addScalarAndVectorizedBuiltin("array_union", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATEV2), true, new ArrayType(Type.DATEV2), new ArrayType(Type.DATEV2));
        functionSet.addScalarAndVectorizedBuiltin("array_union", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.VARCHAR), true, new ArrayType(Type.VARCHAR), new ArrayType(Type.VARCHAR));
        functionSet.addScalarAndVectorizedBuiltin("array_union", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.STRING), true, new ArrayType(Type.STRING), new ArrayType(Type.STRING));
        functionSet.addScalarAndVectorizedBuiltin("array_apply", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BOOLEAN), false, new ArrayType(Type.BOOLEAN), Type.VARCHAR, Type.BOOLEAN);
        functionSet.addScalarAndVectorizedBuiltin("array_apply", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.TINYINT), false, new ArrayType(Type.TINYINT), Type.VARCHAR, Type.TINYINT);
        functionSet.addScalarAndVectorizedBuiltin("array_apply", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.SMALLINT), false, new ArrayType(Type.SMALLINT), Type.VARCHAR, Type.SMALLINT);
        functionSet.addScalarAndVectorizedBuiltin("array_apply", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.INT), false, new ArrayType(Type.INT), Type.VARCHAR, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("array_apply", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), false, new ArrayType(Type.BIGINT), Type.VARCHAR, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_apply", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.LARGEINT), false, new ArrayType(Type.LARGEINT), Type.VARCHAR, Type.LARGEINT);
        functionSet.addScalarAndVectorizedBuiltin("array_apply", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.FLOAT), false, new ArrayType(Type.FLOAT), Type.VARCHAR, Type.FLOAT);
        functionSet.addScalarAndVectorizedBuiltin("array_apply", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DOUBLE), false, new ArrayType(Type.DOUBLE), Type.VARCHAR, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("array_apply", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.MAX_DECIMALV2_TYPE), false, new ArrayType(Type.MAX_DECIMALV2_TYPE), Type.VARCHAR, Type.MAX_DECIMALV2_TYPE);
        functionSet.addScalarAndVectorizedBuiltin("array_apply", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL32), false, new ArrayType(Type.DECIMAL32), Type.VARCHAR, Type.DECIMAL32);
        functionSet.addScalarAndVectorizedBuiltin("array_apply", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL64), false, new ArrayType(Type.DECIMAL64), Type.VARCHAR, Type.DECIMAL64);
        functionSet.addScalarAndVectorizedBuiltin("array_apply", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL128), false, new ArrayType(Type.DECIMAL128), Type.VARCHAR, Type.DECIMAL128);
        functionSet.addScalarAndVectorizedBuiltin("array_apply", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATETIME), false, new ArrayType(Type.DATETIME), Type.VARCHAR, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("array_apply", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATE), false, new ArrayType(Type.DATE), Type.VARCHAR, Type.DATE);
        functionSet.addScalarAndVectorizedBuiltin("array_apply", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATETIMEV2), false, new ArrayType(Type.DATETIMEV2), Type.VARCHAR, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("array_apply", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATEV2), false, new ArrayType(Type.DATEV2), Type.VARCHAR, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("array_concat", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BOOLEAN), true, new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_concat", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.TINYINT), true, new ArrayType(Type.TINYINT));
        functionSet.addScalarAndVectorizedBuiltin("array_concat", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.SMALLINT), true, new ArrayType(Type.SMALLINT));
        functionSet.addScalarAndVectorizedBuiltin("array_concat", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.INT), true, new ArrayType(Type.INT));
        functionSet.addScalarAndVectorizedBuiltin("array_concat", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), true, new ArrayType(Type.BIGINT));
        functionSet.addScalarAndVectorizedBuiltin("array_concat", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.LARGEINT), true, new ArrayType(Type.LARGEINT));
        functionSet.addScalarAndVectorizedBuiltin("array_concat", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.FLOAT), true, new ArrayType(Type.FLOAT));
        functionSet.addScalarAndVectorizedBuiltin("array_concat", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DOUBLE), true, new ArrayType(Type.DOUBLE));
        functionSet.addScalarAndVectorizedBuiltin("array_concat", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.MAX_DECIMALV2_TYPE), true, new ArrayType(Type.MAX_DECIMALV2_TYPE));
        functionSet.addScalarAndVectorizedBuiltin("array_concat", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL32), true, new ArrayType(Type.DECIMAL32));
        functionSet.addScalarAndVectorizedBuiltin("array_concat", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL64), true, new ArrayType(Type.DECIMAL64));
        functionSet.addScalarAndVectorizedBuiltin("array_concat", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL128), true, new ArrayType(Type.DECIMAL128));
        functionSet.addScalarAndVectorizedBuiltin("array_concat", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATETIME), true, new ArrayType(Type.DATETIME));
        functionSet.addScalarAndVectorizedBuiltin("array_concat", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATE), true, new ArrayType(Type.DATE));
        functionSet.addScalarAndVectorizedBuiltin("array_concat", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATETIMEV2), true, new ArrayType(Type.DATETIMEV2));
        functionSet.addScalarAndVectorizedBuiltin("array_concat", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATEV2), true, new ArrayType(Type.DATEV2));
        functionSet.addScalarAndVectorizedBuiltin("array_concat", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.VARCHAR), true, new ArrayType(Type.VARCHAR));
        functionSet.addScalarAndVectorizedBuiltin("array_concat", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.STRING), true, new ArrayType(Type.STRING));
        functionSet.addScalarAndVectorizedBuiltin("array_except", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BOOLEAN), false, new ArrayType(Type.BOOLEAN), new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_except", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.TINYINT), false, new ArrayType(Type.TINYINT), new ArrayType(Type.TINYINT));
        functionSet.addScalarAndVectorizedBuiltin("array_except", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.SMALLINT), false, new ArrayType(Type.SMALLINT), new ArrayType(Type.SMALLINT));
        functionSet.addScalarAndVectorizedBuiltin("array_except", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.INT), false, new ArrayType(Type.INT), new ArrayType(Type.INT));
        functionSet.addScalarAndVectorizedBuiltin("array_except", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), false, new ArrayType(Type.BIGINT), new ArrayType(Type.BIGINT));
        functionSet.addScalarAndVectorizedBuiltin("array_except", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.LARGEINT), false, new ArrayType(Type.LARGEINT), new ArrayType(Type.LARGEINT));
        functionSet.addScalarAndVectorizedBuiltin("array_except", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.FLOAT), false, new ArrayType(Type.FLOAT), new ArrayType(Type.FLOAT));
        functionSet.addScalarAndVectorizedBuiltin("array_except", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DOUBLE), false, new ArrayType(Type.DOUBLE), new ArrayType(Type.DOUBLE));
        functionSet.addScalarAndVectorizedBuiltin("array_except", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.MAX_DECIMALV2_TYPE), false, new ArrayType(Type.MAX_DECIMALV2_TYPE), new ArrayType(Type.MAX_DECIMALV2_TYPE));
        functionSet.addScalarAndVectorizedBuiltin("array_except", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL32), false, new ArrayType(Type.DECIMAL32), new ArrayType(Type.DECIMAL32));
        functionSet.addScalarAndVectorizedBuiltin("array_except", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL64), false, new ArrayType(Type.DECIMAL64), new ArrayType(Type.DECIMAL64));
        functionSet.addScalarAndVectorizedBuiltin("array_except", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL128), false, new ArrayType(Type.DECIMAL128), new ArrayType(Type.DECIMAL128));
        functionSet.addScalarAndVectorizedBuiltin("array_except", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATETIME), false, new ArrayType(Type.DATETIME), new ArrayType(Type.DATETIME));
        functionSet.addScalarAndVectorizedBuiltin("array_except", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATE), false, new ArrayType(Type.DATE), new ArrayType(Type.DATE));
        functionSet.addScalarAndVectorizedBuiltin("array_except", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATETIMEV2), false, new ArrayType(Type.DATETIMEV2), new ArrayType(Type.DATETIMEV2));
        functionSet.addScalarAndVectorizedBuiltin("array_except", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATEV2), false, new ArrayType(Type.DATEV2), new ArrayType(Type.DATEV2));
        functionSet.addScalarAndVectorizedBuiltin("array_except", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.VARCHAR), false, new ArrayType(Type.VARCHAR), new ArrayType(Type.VARCHAR));
        functionSet.addScalarAndVectorizedBuiltin("array_except", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.STRING), false, new ArrayType(Type.STRING), new ArrayType(Type.STRING));
        functionSet.addScalarAndVectorizedBuiltin("array_compact", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BOOLEAN), false, new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_compact", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.TINYINT), false, new ArrayType(Type.TINYINT));
        functionSet.addScalarAndVectorizedBuiltin("array_compact", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.SMALLINT), false, new ArrayType(Type.SMALLINT));
        functionSet.addScalarAndVectorizedBuiltin("array_compact", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.INT), false, new ArrayType(Type.INT));
        functionSet.addScalarAndVectorizedBuiltin("array_compact", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), false, new ArrayType(Type.BIGINT));
        functionSet.addScalarAndVectorizedBuiltin("array_compact", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.LARGEINT), false, new ArrayType(Type.LARGEINT));
        functionSet.addScalarAndVectorizedBuiltin("array_compact", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATETIME), false, new ArrayType(Type.DATETIME));
        functionSet.addScalarAndVectorizedBuiltin("array_compact", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATE), false, new ArrayType(Type.DATE));
        functionSet.addScalarAndVectorizedBuiltin("array_compact", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATETIMEV2), false, new ArrayType(Type.DATETIMEV2));
        functionSet.addScalarAndVectorizedBuiltin("array_compact", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATEV2), false, new ArrayType(Type.DATEV2));
        functionSet.addScalarAndVectorizedBuiltin("array_compact", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.FLOAT), false, new ArrayType(Type.FLOAT));
        functionSet.addScalarAndVectorizedBuiltin("array_compact", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DOUBLE), false, new ArrayType(Type.DOUBLE));
        functionSet.addScalarAndVectorizedBuiltin("array_compact", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.MAX_DECIMALV2_TYPE), false, new ArrayType(Type.MAX_DECIMALV2_TYPE));
        functionSet.addScalarAndVectorizedBuiltin("array_compact", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL32), false, new ArrayType(Type.DECIMAL32));
        functionSet.addScalarAndVectorizedBuiltin("array_compact", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL64), false, new ArrayType(Type.DECIMAL64));
        functionSet.addScalarAndVectorizedBuiltin("array_compact", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL128), false, new ArrayType(Type.DECIMAL128));
        functionSet.addScalarAndVectorizedBuiltin("array_compact", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.VARCHAR), false, new ArrayType(Type.VARCHAR));
        functionSet.addScalarAndVectorizedBuiltin("array_intersect", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BOOLEAN), true, new ArrayType(Type.BOOLEAN), new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_intersect", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.TINYINT), true, new ArrayType(Type.TINYINT), new ArrayType(Type.TINYINT));
        functionSet.addScalarAndVectorizedBuiltin("array_intersect", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.SMALLINT), true, new ArrayType(Type.SMALLINT), new ArrayType(Type.SMALLINT));
        functionSet.addScalarAndVectorizedBuiltin("array_intersect", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.INT), true, new ArrayType(Type.INT), new ArrayType(Type.INT));
        functionSet.addScalarAndVectorizedBuiltin("array_intersect", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), true, new ArrayType(Type.BIGINT), new ArrayType(Type.BIGINT));
        functionSet.addScalarAndVectorizedBuiltin("array_intersect", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.LARGEINT), true, new ArrayType(Type.LARGEINT), new ArrayType(Type.LARGEINT));
        functionSet.addScalarAndVectorizedBuiltin("array_intersect", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.FLOAT), true, new ArrayType(Type.FLOAT), new ArrayType(Type.FLOAT));
        functionSet.addScalarAndVectorizedBuiltin("array_intersect", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DOUBLE), true, new ArrayType(Type.DOUBLE), new ArrayType(Type.DOUBLE));
        functionSet.addScalarAndVectorizedBuiltin("array_intersect", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.MAX_DECIMALV2_TYPE), true, new ArrayType(Type.MAX_DECIMALV2_TYPE), new ArrayType(Type.MAX_DECIMALV2_TYPE));
        functionSet.addScalarAndVectorizedBuiltin("array_intersect", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL32), true, new ArrayType(Type.DECIMAL32), new ArrayType(Type.DECIMAL32));
        functionSet.addScalarAndVectorizedBuiltin("array_intersect", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL64), true, new ArrayType(Type.DECIMAL64), new ArrayType(Type.DECIMAL64));
        functionSet.addScalarAndVectorizedBuiltin("array_intersect", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL128), true, new ArrayType(Type.DECIMAL128), new ArrayType(Type.DECIMAL128));
        functionSet.addScalarAndVectorizedBuiltin("array_intersect", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATETIME), true, new ArrayType(Type.DATETIME), new ArrayType(Type.DATETIME));
        functionSet.addScalarAndVectorizedBuiltin("array_intersect", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATE), true, new ArrayType(Type.DATE), new ArrayType(Type.DATE));
        functionSet.addScalarAndVectorizedBuiltin("array_intersect", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATETIMEV2), true, new ArrayType(Type.DATETIMEV2), new ArrayType(Type.DATETIMEV2));
        functionSet.addScalarAndVectorizedBuiltin("array_intersect", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATEV2), true, new ArrayType(Type.DATEV2), new ArrayType(Type.DATEV2));
        functionSet.addScalarAndVectorizedBuiltin("array_intersect", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.VARCHAR), true, new ArrayType(Type.VARCHAR), new ArrayType(Type.VARCHAR));
        functionSet.addScalarAndVectorizedBuiltin("array_intersect", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.STRING), true, new ArrayType(Type.STRING), new ArrayType(Type.STRING));
        functionSet.addScalarAndVectorizedBuiltin("array_slice", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BOOLEAN), false, new ArrayType(Type.BOOLEAN), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("%element_slice%", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BOOLEAN), false, new ArrayType(Type.BOOLEAN), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_slice", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.TINYINT), false, new ArrayType(Type.TINYINT), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("%element_slice%", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.TINYINT), false, new ArrayType(Type.TINYINT), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_slice", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.SMALLINT), false, new ArrayType(Type.SMALLINT), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("%element_slice%", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.SMALLINT), false, new ArrayType(Type.SMALLINT), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_slice", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.INT), false, new ArrayType(Type.INT), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("%element_slice%", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.INT), false, new ArrayType(Type.INT), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_slice", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), false, new ArrayType(Type.BIGINT), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("%element_slice%", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), false, new ArrayType(Type.BIGINT), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_slice", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.LARGEINT), false, new ArrayType(Type.LARGEINT), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("%element_slice%", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.LARGEINT), false, new ArrayType(Type.LARGEINT), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_slice", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATETIME), false, new ArrayType(Type.DATETIME), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("%element_slice%", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATETIME), false, new ArrayType(Type.DATETIME), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_slice", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATE), false, new ArrayType(Type.DATE), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("%element_slice%", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATE), false, new ArrayType(Type.DATE), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_slice", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATETIMEV2), false, new ArrayType(Type.DATETIMEV2), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("%element_slice%", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATETIMEV2), false, new ArrayType(Type.DATETIMEV2), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_slice", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATEV2), false, new ArrayType(Type.DATEV2), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("%element_slice%", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATEV2), false, new ArrayType(Type.DATEV2), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_slice", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.FLOAT), false, new ArrayType(Type.FLOAT), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("%element_slice%", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.FLOAT), false, new ArrayType(Type.FLOAT), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_slice", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DOUBLE), false, new ArrayType(Type.DOUBLE), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("%element_slice%", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DOUBLE), false, new ArrayType(Type.DOUBLE), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_slice", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.MAX_DECIMALV2_TYPE), false, new ArrayType(Type.MAX_DECIMALV2_TYPE), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("%element_slice%", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.MAX_DECIMALV2_TYPE), false, new ArrayType(Type.MAX_DECIMALV2_TYPE), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_slice", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL32), false, new ArrayType(Type.DECIMAL32), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("%element_slice%", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL32), false, new ArrayType(Type.DECIMAL32), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_slice", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL64), false, new ArrayType(Type.DECIMAL64), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("%element_slice%", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL64), false, new ArrayType(Type.DECIMAL64), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_slice", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL128), false, new ArrayType(Type.DECIMAL128), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("%element_slice%", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL128), false, new ArrayType(Type.DECIMAL128), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_slice", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.VARCHAR), false, new ArrayType(Type.VARCHAR), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("%element_slice%", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.VARCHAR), false, new ArrayType(Type.VARCHAR), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_slice", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.STRING), false, new ArrayType(Type.STRING), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("%element_slice%", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.STRING), false, new ArrayType(Type.STRING), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_slice", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BOOLEAN), false, new ArrayType(Type.BOOLEAN), Type.BIGINT, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("%element_slice%", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BOOLEAN), false, new ArrayType(Type.BOOLEAN), Type.BIGINT, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_slice", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.TINYINT), false, new ArrayType(Type.TINYINT), Type.BIGINT, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("%element_slice%", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.TINYINT), false, new ArrayType(Type.TINYINT), Type.BIGINT, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_slice", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.SMALLINT), false, new ArrayType(Type.SMALLINT), Type.BIGINT, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("%element_slice%", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.SMALLINT), false, new ArrayType(Type.SMALLINT), Type.BIGINT, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_slice", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.INT), false, new ArrayType(Type.INT), Type.BIGINT, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("%element_slice%", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.INT), false, new ArrayType(Type.INT), Type.BIGINT, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_slice", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), false, new ArrayType(Type.BIGINT), Type.BIGINT, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("%element_slice%", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), false, new ArrayType(Type.BIGINT), Type.BIGINT, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_slice", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.LARGEINT), false, new ArrayType(Type.LARGEINT), Type.BIGINT, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("%element_slice%", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.LARGEINT), false, new ArrayType(Type.LARGEINT), Type.BIGINT, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_slice", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATETIME), false, new ArrayType(Type.DATETIME), Type.BIGINT, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("%element_slice%", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATETIME), false, new ArrayType(Type.DATETIME), Type.BIGINT, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_slice", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATE), false, new ArrayType(Type.DATE), Type.BIGINT, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("%element_slice%", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATE), false, new ArrayType(Type.DATE), Type.BIGINT, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_slice", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATETIMEV2), false, new ArrayType(Type.DATETIMEV2), Type.BIGINT, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("%element_slice%", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATETIMEV2), false, new ArrayType(Type.DATETIMEV2), Type.BIGINT, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_slice", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATEV2), false, new ArrayType(Type.DATEV2), Type.BIGINT, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("%element_slice%", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATEV2), false, new ArrayType(Type.DATEV2), Type.BIGINT, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_slice", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.FLOAT), false, new ArrayType(Type.FLOAT), Type.BIGINT, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("%element_slice%", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.FLOAT), false, new ArrayType(Type.FLOAT), Type.BIGINT, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_slice", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DOUBLE), false, new ArrayType(Type.DOUBLE), Type.BIGINT, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("%element_slice%", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DOUBLE), false, new ArrayType(Type.DOUBLE), Type.BIGINT, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_slice", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.MAX_DECIMALV2_TYPE), false, new ArrayType(Type.MAX_DECIMALV2_TYPE), Type.BIGINT, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("%element_slice%", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.MAX_DECIMALV2_TYPE), false, new ArrayType(Type.MAX_DECIMALV2_TYPE), Type.BIGINT, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_slice", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL32), false, new ArrayType(Type.DECIMAL32), Type.BIGINT, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("%element_slice%", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL32), false, new ArrayType(Type.DECIMAL32), Type.BIGINT, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_slice", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL64), false, new ArrayType(Type.DECIMAL64), Type.BIGINT, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("%element_slice%", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL64), false, new ArrayType(Type.DECIMAL64), Type.BIGINT, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_slice", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL128), false, new ArrayType(Type.DECIMAL128), Type.BIGINT, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("%element_slice%", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL128), false, new ArrayType(Type.DECIMAL128), Type.BIGINT, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_slice", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.VARCHAR), false, new ArrayType(Type.VARCHAR), Type.BIGINT, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("%element_slice%", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.VARCHAR), false, new ArrayType(Type.VARCHAR), Type.BIGINT, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_slice", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.STRING), false, new ArrayType(Type.STRING), Type.BIGINT, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("%element_slice%", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.STRING), false, new ArrayType(Type.STRING), Type.BIGINT, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_popback", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BOOLEAN), false, new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_popback", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.TINYINT), false, new ArrayType(Type.TINYINT));
        functionSet.addScalarAndVectorizedBuiltin("array_popback", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.SMALLINT), false, new ArrayType(Type.SMALLINT));
        functionSet.addScalarAndVectorizedBuiltin("array_popback", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.INT), false, new ArrayType(Type.INT));
        functionSet.addScalarAndVectorizedBuiltin("array_popback", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), false, new ArrayType(Type.BIGINT));
        functionSet.addScalarAndVectorizedBuiltin("array_popback", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.LARGEINT), false, new ArrayType(Type.LARGEINT));
        functionSet.addScalarAndVectorizedBuiltin("array_popback", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATETIME), false, new ArrayType(Type.DATETIME));
        functionSet.addScalarAndVectorizedBuiltin("array_popback", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATE), false, new ArrayType(Type.DATE));
        functionSet.addScalarAndVectorizedBuiltin("array_popback", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATETIMEV2), false, new ArrayType(Type.DATETIMEV2));
        functionSet.addScalarAndVectorizedBuiltin("array_popback", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATEV2), false, new ArrayType(Type.DATEV2));
        functionSet.addScalarAndVectorizedBuiltin("array_popback", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.FLOAT), false, new ArrayType(Type.FLOAT));
        functionSet.addScalarAndVectorizedBuiltin("array_popback", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DOUBLE), false, new ArrayType(Type.DOUBLE));
        functionSet.addScalarAndVectorizedBuiltin("array_popback", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.MAX_DECIMALV2_TYPE), false, new ArrayType(Type.MAX_DECIMALV2_TYPE));
        functionSet.addScalarAndVectorizedBuiltin("array_popback", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL32), false, new ArrayType(Type.DECIMAL32));
        functionSet.addScalarAndVectorizedBuiltin("array_popback", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL64), false, new ArrayType(Type.DECIMAL64));
        functionSet.addScalarAndVectorizedBuiltin("array_popback", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL128), false, new ArrayType(Type.DECIMAL128));
        functionSet.addScalarAndVectorizedBuiltin("array_popback", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.VARCHAR), false, new ArrayType(Type.VARCHAR));
        functionSet.addScalarAndVectorizedBuiltin("array_popback", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.STRING), false, new ArrayType(Type.STRING));
        functionSet.addScalarAndVectorizedBuiltin("array_popfront", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BOOLEAN), false, new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_popfront", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.TINYINT), false, new ArrayType(Type.TINYINT));
        functionSet.addScalarAndVectorizedBuiltin("array_popfront", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.SMALLINT), false, new ArrayType(Type.SMALLINT));
        functionSet.addScalarAndVectorizedBuiltin("array_popfront", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.INT), false, new ArrayType(Type.INT));
        functionSet.addScalarAndVectorizedBuiltin("array_popfront", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), false, new ArrayType(Type.BIGINT));
        functionSet.addScalarAndVectorizedBuiltin("array_popfront", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.LARGEINT), false, new ArrayType(Type.LARGEINT));
        functionSet.addScalarAndVectorizedBuiltin("array_popfront", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATETIME), false, new ArrayType(Type.DATETIME));
        functionSet.addScalarAndVectorizedBuiltin("array_popfront", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATE), false, new ArrayType(Type.DATE));
        functionSet.addScalarAndVectorizedBuiltin("array_popfront", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATETIMEV2), false, new ArrayType(Type.DATETIMEV2));
        functionSet.addScalarAndVectorizedBuiltin("array_popfront", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATEV2), false, new ArrayType(Type.DATEV2));
        functionSet.addScalarAndVectorizedBuiltin("array_popfront", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.FLOAT), false, new ArrayType(Type.FLOAT));
        functionSet.addScalarAndVectorizedBuiltin("array_popfront", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DOUBLE), false, new ArrayType(Type.DOUBLE));
        functionSet.addScalarAndVectorizedBuiltin("array_popfront", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.MAX_DECIMALV2_TYPE), false, new ArrayType(Type.MAX_DECIMALV2_TYPE));
        functionSet.addScalarAndVectorizedBuiltin("array_popfront", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL32), false, new ArrayType(Type.DECIMAL32));
        functionSet.addScalarAndVectorizedBuiltin("array_popfront", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL64), false, new ArrayType(Type.DECIMAL64));
        functionSet.addScalarAndVectorizedBuiltin("array_popfront", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL128), false, new ArrayType(Type.DECIMAL128));
        functionSet.addScalarAndVectorizedBuiltin("array_popfront", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.VARCHAR), false, new ArrayType(Type.VARCHAR));
        functionSet.addScalarAndVectorizedBuiltin("array_popfront", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.STRING), false, new ArrayType(Type.STRING));
        functionSet.addScalarAndVectorizedBuiltin("array_filter", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BOOLEAN), false, new ArrayType(Type.BOOLEAN), new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_filter", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.TINYINT), false, new ArrayType(Type.TINYINT), new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_filter", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.SMALLINT), false, new ArrayType(Type.SMALLINT), new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_filter", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.INT), false, new ArrayType(Type.INT), new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_filter", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), false, new ArrayType(Type.BIGINT), new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_filter", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.LARGEINT), false, new ArrayType(Type.LARGEINT), new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_filter", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.FLOAT), false, new ArrayType(Type.FLOAT), new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_filter", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DOUBLE), false, new ArrayType(Type.DOUBLE), new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_filter", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.VARCHAR), false, new ArrayType(Type.VARCHAR), new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_filter", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.STRING), false, new ArrayType(Type.STRING), new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_filter", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.MAX_DECIMALV2_TYPE), false, new ArrayType(Type.MAX_DECIMALV2_TYPE), new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_filter", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL32), false, new ArrayType(Type.DECIMAL32), new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_filter", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL64), false, new ArrayType(Type.DECIMAL64), new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_filter", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL128), false, new ArrayType(Type.DECIMAL128), new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_filter", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATETIME), false, new ArrayType(Type.DATETIME), new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_filter", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATE), false, new ArrayType(Type.DATE), new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_filter", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATETIMEV2), false, new ArrayType(Type.DATETIMEV2), new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_filter", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATEV2), false, new ArrayType(Type.DATEV2), new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_sortby", true, Function.NullableMode.CUSTOM, new ArrayType(new TemplateType("K")), false, new ArrayType(new TemplateType("K")), new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_sortby", true, Function.NullableMode.CUSTOM, new ArrayType(new TemplateType("K")), false, new ArrayType(new TemplateType("K")), new ArrayType(Type.TINYINT));
        functionSet.addScalarAndVectorizedBuiltin("array_sortby", true, Function.NullableMode.CUSTOM, new ArrayType(new TemplateType("K")), false, new ArrayType(new TemplateType("K")), new ArrayType(Type.SMALLINT));
        functionSet.addScalarAndVectorizedBuiltin("array_sortby", true, Function.NullableMode.CUSTOM, new ArrayType(new TemplateType("K")), false, new ArrayType(new TemplateType("K")), new ArrayType(Type.INT));
        functionSet.addScalarAndVectorizedBuiltin("array_sortby", true, Function.NullableMode.CUSTOM, new ArrayType(new TemplateType("K")), false, new ArrayType(new TemplateType("K")), new ArrayType(Type.BIGINT));
        functionSet.addScalarAndVectorizedBuiltin("array_sortby", true, Function.NullableMode.CUSTOM, new ArrayType(new TemplateType("K")), false, new ArrayType(new TemplateType("K")), new ArrayType(Type.LARGEINT));
        functionSet.addScalarAndVectorizedBuiltin("array_sortby", true, Function.NullableMode.CUSTOM, new ArrayType(new TemplateType("K")), false, new ArrayType(new TemplateType("K")), new ArrayType(Type.FLOAT));
        functionSet.addScalarAndVectorizedBuiltin("array_sortby", true, Function.NullableMode.CUSTOM, new ArrayType(new TemplateType("K")), false, new ArrayType(new TemplateType("K")), new ArrayType(Type.DOUBLE));
        functionSet.addScalarAndVectorizedBuiltin("array_sortby", true, Function.NullableMode.CUSTOM, new ArrayType(new TemplateType("K")), false, new ArrayType(new TemplateType("K")), new ArrayType(Type.VARCHAR));
        functionSet.addScalarAndVectorizedBuiltin("array_sortby", true, Function.NullableMode.CUSTOM, new ArrayType(new TemplateType("K")), false, new ArrayType(new TemplateType("K")), new ArrayType(Type.STRING));
        functionSet.addScalarAndVectorizedBuiltin("array_sortby", true, Function.NullableMode.CUSTOM, new ArrayType(new TemplateType("K")), false, new ArrayType(new TemplateType("K")), new ArrayType(Type.MAX_DECIMALV2_TYPE));
        functionSet.addScalarAndVectorizedBuiltin("array_sortby", true, Function.NullableMode.CUSTOM, new ArrayType(new TemplateType("K")), false, new ArrayType(new TemplateType("K")), new ArrayType(Type.DECIMAL32));
        functionSet.addScalarAndVectorizedBuiltin("array_sortby", true, Function.NullableMode.CUSTOM, new ArrayType(new TemplateType("K")), false, new ArrayType(new TemplateType("K")), new ArrayType(Type.DECIMAL64));
        functionSet.addScalarAndVectorizedBuiltin("array_sortby", true, Function.NullableMode.CUSTOM, new ArrayType(new TemplateType("K")), false, new ArrayType(new TemplateType("K")), new ArrayType(Type.DECIMAL128));
        functionSet.addScalarAndVectorizedBuiltin("array_sortby", true, Function.NullableMode.CUSTOM, new ArrayType(new TemplateType("K")), false, new ArrayType(new TemplateType("K")), new ArrayType(Type.DATETIME));
        functionSet.addScalarAndVectorizedBuiltin("array_sortby", true, Function.NullableMode.CUSTOM, new ArrayType(new TemplateType("K")), false, new ArrayType(new TemplateType("K")), new ArrayType(Type.DATE));
        functionSet.addScalarAndVectorizedBuiltin("array_sortby", true, Function.NullableMode.CUSTOM, new ArrayType(new TemplateType("K")), false, new ArrayType(new TemplateType("K")), new ArrayType(Type.DATETIMEV2));
        functionSet.addScalarAndVectorizedBuiltin("array_sortby", true, Function.NullableMode.CUSTOM, new ArrayType(new TemplateType("K")), false, new ArrayType(new TemplateType("K")), new ArrayType(Type.DATEV2));
        functionSet.addScalarAndVectorizedBuiltin("array_exists", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BOOLEAN), false, new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_exists", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BOOLEAN), false, new ArrayType(Type.TINYINT));
        functionSet.addScalarAndVectorizedBuiltin("array_exists", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BOOLEAN), false, new ArrayType(Type.SMALLINT));
        functionSet.addScalarAndVectorizedBuiltin("array_exists", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BOOLEAN), false, new ArrayType(Type.INT));
        functionSet.addScalarAndVectorizedBuiltin("array_exists", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BOOLEAN), false, new ArrayType(Type.BIGINT));
        functionSet.addScalarAndVectorizedBuiltin("array_exists", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BOOLEAN), false, new ArrayType(Type.LARGEINT));
        functionSet.addScalarAndVectorizedBuiltin("array_exists", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BOOLEAN), false, new ArrayType(Type.DATETIME));
        functionSet.addScalarAndVectorizedBuiltin("array_exists", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BOOLEAN), false, new ArrayType(Type.DATE));
        functionSet.addScalarAndVectorizedBuiltin("array_exists", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BOOLEAN), false, new ArrayType(Type.DATETIMEV2));
        functionSet.addScalarAndVectorizedBuiltin("array_exists", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BOOLEAN), false, new ArrayType(Type.DATEV2));
        functionSet.addScalarAndVectorizedBuiltin("array_exists", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BOOLEAN), false, new ArrayType(Type.FLOAT));
        functionSet.addScalarAndVectorizedBuiltin("array_exists", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BOOLEAN), false, new ArrayType(Type.DOUBLE));
        functionSet.addScalarAndVectorizedBuiltin("array_exists", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BOOLEAN), false, new ArrayType(Type.MAX_DECIMALV2_TYPE));
        functionSet.addScalarAndVectorizedBuiltin("array_exists", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BOOLEAN), false, new ArrayType(Type.DECIMAL32));
        functionSet.addScalarAndVectorizedBuiltin("array_exists", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BOOLEAN), false, new ArrayType(Type.DECIMAL64));
        functionSet.addScalarAndVectorizedBuiltin("array_exists", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BOOLEAN), false, new ArrayType(Type.DECIMAL128));
        functionSet.addScalarAndVectorizedBuiltin("array_exists", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BOOLEAN), false, new ArrayType(Type.VARCHAR));
        functionSet.addScalarAndVectorizedBuiltin("array_exists", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BOOLEAN), false, new ArrayType(Type.STRING));
        functionSet.addScalarAndVectorizedBuiltin("array_first_index", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BIGINT, false, new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_last_index", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BIGINT, false, new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_count", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BIGINT, false, new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BOOLEAN), false, new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BOOLEAN), false, new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.TINYINT), false, new ArrayType(Type.TINYINT));
        functionSet.addScalarAndVectorizedBuiltin("shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.TINYINT), false, new ArrayType(Type.TINYINT));
        functionSet.addScalarAndVectorizedBuiltin("array_shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.SMALLINT), false, new ArrayType(Type.SMALLINT));
        functionSet.addScalarAndVectorizedBuiltin("shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.SMALLINT), false, new ArrayType(Type.SMALLINT));
        functionSet.addScalarAndVectorizedBuiltin("array_shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.INT), false, new ArrayType(Type.INT));
        functionSet.addScalarAndVectorizedBuiltin("shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.INT), false, new ArrayType(Type.INT));
        functionSet.addScalarAndVectorizedBuiltin("array_shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), false, new ArrayType(Type.BIGINT));
        functionSet.addScalarAndVectorizedBuiltin("shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), false, new ArrayType(Type.BIGINT));
        functionSet.addScalarAndVectorizedBuiltin("array_shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.LARGEINT), false, new ArrayType(Type.LARGEINT));
        functionSet.addScalarAndVectorizedBuiltin("shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.LARGEINT), false, new ArrayType(Type.LARGEINT));
        functionSet.addScalarAndVectorizedBuiltin("array_shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATETIME), false, new ArrayType(Type.DATETIME));
        functionSet.addScalarAndVectorizedBuiltin("shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATETIME), false, new ArrayType(Type.DATETIME));
        functionSet.addScalarAndVectorizedBuiltin("array_shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATE), false, new ArrayType(Type.DATE));
        functionSet.addScalarAndVectorizedBuiltin("shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATE), false, new ArrayType(Type.DATE));
        functionSet.addScalarAndVectorizedBuiltin("array_shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATETIMEV2), false, new ArrayType(Type.DATETIMEV2));
        functionSet.addScalarAndVectorizedBuiltin("shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATETIMEV2), false, new ArrayType(Type.DATETIMEV2));
        functionSet.addScalarAndVectorizedBuiltin("array_shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATEV2), false, new ArrayType(Type.DATEV2));
        functionSet.addScalarAndVectorizedBuiltin("shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATEV2), false, new ArrayType(Type.DATEV2));
        functionSet.addScalarAndVectorizedBuiltin("array_shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.FLOAT), false, new ArrayType(Type.FLOAT));
        functionSet.addScalarAndVectorizedBuiltin("shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.FLOAT), false, new ArrayType(Type.FLOAT));
        functionSet.addScalarAndVectorizedBuiltin("array_shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DOUBLE), false, new ArrayType(Type.DOUBLE));
        functionSet.addScalarAndVectorizedBuiltin("shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DOUBLE), false, new ArrayType(Type.DOUBLE));
        functionSet.addScalarAndVectorizedBuiltin("array_shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.MAX_DECIMALV2_TYPE), false, new ArrayType(Type.MAX_DECIMALV2_TYPE));
        functionSet.addScalarAndVectorizedBuiltin("shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.MAX_DECIMALV2_TYPE), false, new ArrayType(Type.MAX_DECIMALV2_TYPE));
        functionSet.addScalarAndVectorizedBuiltin("array_shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL32), false, new ArrayType(Type.DECIMAL32));
        functionSet.addScalarAndVectorizedBuiltin("shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL32), false, new ArrayType(Type.DECIMAL32));
        functionSet.addScalarAndVectorizedBuiltin("array_shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL64), false, new ArrayType(Type.DECIMAL64));
        functionSet.addScalarAndVectorizedBuiltin("shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL64), false, new ArrayType(Type.DECIMAL64));
        functionSet.addScalarAndVectorizedBuiltin("array_shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL128), false, new ArrayType(Type.DECIMAL128));
        functionSet.addScalarAndVectorizedBuiltin("shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL128), false, new ArrayType(Type.DECIMAL128));
        functionSet.addScalarAndVectorizedBuiltin("array_shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.VARCHAR), false, new ArrayType(Type.VARCHAR));
        functionSet.addScalarAndVectorizedBuiltin("shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.VARCHAR), false, new ArrayType(Type.VARCHAR));
        functionSet.addScalarAndVectorizedBuiltin("array_shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.STRING), false, new ArrayType(Type.STRING));
        functionSet.addScalarAndVectorizedBuiltin("shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.STRING), false, new ArrayType(Type.STRING));
        functionSet.addScalarAndVectorizedBuiltin("array_shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BOOLEAN), false, new ArrayType(Type.BOOLEAN), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BOOLEAN), false, new ArrayType(Type.BOOLEAN), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.TINYINT), false, new ArrayType(Type.TINYINT), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.TINYINT), false, new ArrayType(Type.TINYINT), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.SMALLINT), false, new ArrayType(Type.SMALLINT), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.SMALLINT), false, new ArrayType(Type.SMALLINT), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.INT), false, new ArrayType(Type.INT), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.INT), false, new ArrayType(Type.INT), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), false, new ArrayType(Type.BIGINT), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), false, new ArrayType(Type.BIGINT), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.LARGEINT), false, new ArrayType(Type.LARGEINT), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.LARGEINT), false, new ArrayType(Type.LARGEINT), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATETIME), false, new ArrayType(Type.DATETIME), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATETIME), false, new ArrayType(Type.DATETIME), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATE), false, new ArrayType(Type.DATE), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATE), false, new ArrayType(Type.DATE), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATETIMEV2), false, new ArrayType(Type.DATETIMEV2), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATETIMEV2), false, new ArrayType(Type.DATETIMEV2), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATEV2), false, new ArrayType(Type.DATEV2), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATEV2), false, new ArrayType(Type.DATEV2), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.FLOAT), false, new ArrayType(Type.FLOAT), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.FLOAT), false, new ArrayType(Type.FLOAT), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DOUBLE), false, new ArrayType(Type.DOUBLE), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DOUBLE), false, new ArrayType(Type.DOUBLE), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.MAX_DECIMALV2_TYPE), false, new ArrayType(Type.MAX_DECIMALV2_TYPE), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.MAX_DECIMALV2_TYPE), false, new ArrayType(Type.MAX_DECIMALV2_TYPE), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL32), false, new ArrayType(Type.DECIMAL32), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL32), false, new ArrayType(Type.DECIMAL32), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL64), false, new ArrayType(Type.DECIMAL64), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL64), false, new ArrayType(Type.DECIMAL64), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL128), false, new ArrayType(Type.DECIMAL128), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL128), false, new ArrayType(Type.DECIMAL128), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.VARCHAR), false, new ArrayType(Type.VARCHAR), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.VARCHAR), false, new ArrayType(Type.VARCHAR), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.STRING), false, new ArrayType(Type.STRING), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("shuffle", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.STRING), false, new ArrayType(Type.STRING), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_pushfront", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.BOOLEAN), false, new ArrayType(Type.BOOLEAN), Type.BOOLEAN);
        functionSet.addScalarAndVectorizedBuiltin("array_pushfront", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.TINYINT), false, new ArrayType(Type.TINYINT), Type.TINYINT);
        functionSet.addScalarAndVectorizedBuiltin("array_pushfront", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.SMALLINT), false, new ArrayType(Type.SMALLINT), Type.SMALLINT);
        functionSet.addScalarAndVectorizedBuiltin("array_pushfront", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.INT), false, new ArrayType(Type.INT), Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("array_pushfront", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.BIGINT), false, new ArrayType(Type.BIGINT), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_pushfront", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.LARGEINT), false, new ArrayType(Type.LARGEINT), Type.LARGEINT);
        functionSet.addScalarAndVectorizedBuiltin("array_pushfront", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.DATETIME), false, new ArrayType(Type.DATETIME), Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("array_pushfront", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.DATE), false, new ArrayType(Type.DATE), Type.DATE);
        functionSet.addScalarAndVectorizedBuiltin("array_pushfront", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.DATETIMEV2), false, new ArrayType(Type.DATETIMEV2), Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("array_pushfront", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.DATEV2), false, new ArrayType(Type.DATEV2), Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("array_pushfront", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.FLOAT), false, new ArrayType(Type.FLOAT), Type.FLOAT);
        functionSet.addScalarAndVectorizedBuiltin("array_pushfront", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.DOUBLE), false, new ArrayType(Type.DOUBLE), Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("array_pushfront", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.MAX_DECIMALV2_TYPE), false, new ArrayType(Type.MAX_DECIMALV2_TYPE), Type.MAX_DECIMALV2_TYPE);
        functionSet.addScalarAndVectorizedBuiltin("array_pushfront", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.DECIMAL32), false, new ArrayType(Type.DECIMAL32), Type.DECIMAL32);
        functionSet.addScalarAndVectorizedBuiltin("array_pushfront", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.DECIMAL64), false, new ArrayType(Type.DECIMAL64), Type.DECIMAL64);
        functionSet.addScalarAndVectorizedBuiltin("array_pushfront", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.DECIMAL128), false, new ArrayType(Type.DECIMAL128), Type.DECIMAL128);
        functionSet.addScalarAndVectorizedBuiltin("array_pushfront", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.VARCHAR), false, new ArrayType(Type.VARCHAR), Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("array_pushfront", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.STRING), false, new ArrayType(Type.STRING), Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("array_pushback", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(new TemplateType("T")), false, new ArrayType(new TemplateType("T")), new TemplateType("T"));
        functionSet.addScalarAndVectorizedBuiltin("array_pushback", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.BOOLEAN), false, new ArrayType(Type.BOOLEAN), Type.BOOLEAN);
        functionSet.addScalarAndVectorizedBuiltin("array_pushback", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.TINYINT), false, new ArrayType(Type.TINYINT), Type.TINYINT);
        functionSet.addScalarAndVectorizedBuiltin("array_pushback", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.SMALLINT), false, new ArrayType(Type.SMALLINT), Type.SMALLINT);
        functionSet.addScalarAndVectorizedBuiltin("array_pushback", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.INT), false, new ArrayType(Type.INT), Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("array_pushback", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.BIGINT), false, new ArrayType(Type.BIGINT), Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_pushback", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.LARGEINT), false, new ArrayType(Type.LARGEINT), Type.LARGEINT);
        functionSet.addScalarAndVectorizedBuiltin("array_pushback", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.DATETIME), false, new ArrayType(Type.DATETIME), Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("array_pushback", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.DATE), false, new ArrayType(Type.DATE), Type.DATE);
        functionSet.addScalarAndVectorizedBuiltin("array_pushback", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.DATETIMEV2), false, new ArrayType(Type.DATETIMEV2), Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("array_pushback", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.DATEV2), false, new ArrayType(Type.DATEV2), Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("array_pushback", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.FLOAT), false, new ArrayType(Type.FLOAT), Type.FLOAT);
        functionSet.addScalarAndVectorizedBuiltin("array_pushback", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.DOUBLE), false, new ArrayType(Type.DOUBLE), Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("array_pushback", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.MAX_DECIMALV2_TYPE), false, new ArrayType(Type.MAX_DECIMALV2_TYPE), Type.MAX_DECIMALV2_TYPE);
        functionSet.addScalarAndVectorizedBuiltin("array_pushback", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.DECIMAL32), false, new ArrayType(Type.DECIMAL32), Type.DECIMAL32);
        functionSet.addScalarAndVectorizedBuiltin("array_pushback", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.DECIMAL64), false, new ArrayType(Type.DECIMAL64), Type.DECIMAL64);
        functionSet.addScalarAndVectorizedBuiltin("array_pushback", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.DECIMAL128), false, new ArrayType(Type.DECIMAL128), Type.DECIMAL128);
        functionSet.addScalarAndVectorizedBuiltin("array_pushback", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.VARCHAR), false, new ArrayType(Type.VARCHAR), Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("array_pushback", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.STRING), false, new ArrayType(Type.STRING), Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("array_with_constant", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, new ArrayType(Type.BOOLEAN), false, Type.BIGINT, Type.BOOLEAN);
        functionSet.addScalarAndVectorizedBuiltin("array_with_constant", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, new ArrayType(Type.TINYINT), false, Type.BIGINT, Type.TINYINT);
        functionSet.addScalarAndVectorizedBuiltin("array_with_constant", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, new ArrayType(Type.SMALLINT), false, Type.BIGINT, Type.SMALLINT);
        functionSet.addScalarAndVectorizedBuiltin("array_with_constant", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, new ArrayType(Type.INT), false, Type.BIGINT, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("array_with_constant", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, new ArrayType(Type.BIGINT), false, Type.BIGINT, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_with_constant", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, new ArrayType(Type.LARGEINT), false, Type.BIGINT, Type.LARGEINT);
        functionSet.addScalarAndVectorizedBuiltin("array_with_constant", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, new ArrayType(Type.DATETIME), false, Type.BIGINT, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("array_with_constant", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, new ArrayType(Type.DATE), false, Type.BIGINT, Type.DATE);
        functionSet.addScalarAndVectorizedBuiltin("array_with_constant", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, new ArrayType(Type.DATETIMEV2), false, Type.BIGINT, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("array_with_constant", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, new ArrayType(Type.DATEV2), false, Type.BIGINT, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("array_with_constant", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, new ArrayType(Type.FLOAT), false, Type.BIGINT, Type.FLOAT);
        functionSet.addScalarAndVectorizedBuiltin("array_with_constant", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, new ArrayType(Type.DOUBLE), false, Type.BIGINT, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("array_with_constant", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, new ArrayType(Type.MAX_DECIMALV2_TYPE), false, Type.BIGINT, Type.MAX_DECIMALV2_TYPE);
        functionSet.addScalarAndVectorizedBuiltin("array_with_constant", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, new ArrayType(Type.DECIMAL32), false, Type.BIGINT, Type.DECIMAL32);
        functionSet.addScalarAndVectorizedBuiltin("array_with_constant", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, new ArrayType(Type.DECIMAL64), false, Type.BIGINT, Type.DECIMAL64);
        functionSet.addScalarAndVectorizedBuiltin("array_with_constant", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, new ArrayType(Type.DECIMAL128), false, Type.BIGINT, Type.DECIMAL128);
        functionSet.addScalarAndVectorizedBuiltin("array_with_constant", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, new ArrayType(Type.VARCHAR), false, Type.BIGINT, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("array_with_constant", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, new ArrayType(Type.STRING), false, Type.BIGINT, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("array_repeat", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, new ArrayType(Type.BOOLEAN), false, Type.BOOLEAN, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_repeat", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, new ArrayType(Type.TINYINT), false, Type.TINYINT, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_repeat", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, new ArrayType(Type.SMALLINT), false, Type.SMALLINT, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_repeat", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, new ArrayType(Type.INT), false, Type.INT, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_repeat", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, new ArrayType(Type.BIGINT), false, Type.BIGINT, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_repeat", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, new ArrayType(Type.LARGEINT), false, Type.LARGEINT, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_repeat", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, new ArrayType(Type.DATETIME), false, Type.DATETIME, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_repeat", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, new ArrayType(Type.DATE), false, Type.DATE, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_repeat", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, new ArrayType(Type.DATETIMEV2), false, Type.DATETIMEV2, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_repeat", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, new ArrayType(Type.DATEV2), false, Type.DATEV2, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_repeat", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, new ArrayType(Type.FLOAT), false, Type.FLOAT, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_repeat", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, new ArrayType(Type.DOUBLE), false, Type.DOUBLE, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_repeat", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, new ArrayType(Type.MAX_DECIMALV2_TYPE), false, Type.MAX_DECIMALV2_TYPE, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_repeat", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, new ArrayType(Type.DECIMAL32), false, Type.DECIMAL32, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_repeat", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, new ArrayType(Type.DECIMAL64), false, Type.DECIMAL64, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_repeat", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, new ArrayType(Type.DECIMAL128), false, Type.DECIMAL128, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_repeat", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, new ArrayType(Type.VARCHAR), false, Type.VARCHAR, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_repeat", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, new ArrayType(Type.STRING), false, Type.STRING, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("array_range", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.INT), false, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("sequence", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.INT), false, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("array_range", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.INT), false, Type.INT, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("sequence", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.INT), false, Type.INT, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("array_range", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.INT), false, Type.INT, Type.INT, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("sequence", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.INT), false, Type.INT, Type.INT, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("array_range", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.DATETIMEV2), false, Type.DATETIMEV2, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("sequence", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.DATETIMEV2), false, Type.DATETIMEV2, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("array_range", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.DATETIMEV2), false, Type.DATETIMEV2, Type.DATETIMEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("sequence", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.DATETIMEV2), false, Type.DATETIMEV2, Type.DATETIMEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("array_zip", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.ARRAY, true, new ArrayType(new TemplateType("T")));
        functionSet.addScalarAndVectorizedBuiltin("array_split", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BOOLEAN), false, new ArrayType(Type.BOOLEAN), new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_split", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.TINYINT), false, new ArrayType(Type.TINYINT), new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_split", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.SMALLINT), false, new ArrayType(Type.SMALLINT), new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_split", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.INT), false, new ArrayType(Type.INT), new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_split", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), false, new ArrayType(Type.BIGINT), new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_split", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.LARGEINT), false, new ArrayType(Type.LARGEINT), new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_split", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.FLOAT), false, new ArrayType(Type.FLOAT), new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_split", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DOUBLE), false, new ArrayType(Type.DOUBLE), new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_split", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.VARCHAR), false, new ArrayType(Type.VARCHAR), new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_split", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.STRING), false, new ArrayType(Type.STRING), new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_split", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.MAX_DECIMALV2_TYPE), false, new ArrayType(Type.MAX_DECIMALV2_TYPE), new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_split", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL32), false, new ArrayType(Type.DECIMAL32), new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_split", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL64), false, new ArrayType(Type.DECIMAL64), new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_split", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL128), false, new ArrayType(Type.DECIMAL128), new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_split", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATETIME), false, new ArrayType(Type.DATETIME), new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_split", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATE), false, new ArrayType(Type.DATE), new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_split", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATETIMEV2), false, new ArrayType(Type.DATETIMEV2), new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_split", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATEV2), false, new ArrayType(Type.DATEV2), new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_reverse_split", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BOOLEAN), false, new ArrayType(Type.BOOLEAN), new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_reverse_split", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.TINYINT), false, new ArrayType(Type.TINYINT), new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_reverse_split", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.SMALLINT), false, new ArrayType(Type.SMALLINT), new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_reverse_split", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.INT), false, new ArrayType(Type.INT), new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_reverse_split", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), false, new ArrayType(Type.BIGINT), new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_reverse_split", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.LARGEINT), false, new ArrayType(Type.LARGEINT), new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_reverse_split", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.FLOAT), false, new ArrayType(Type.FLOAT), new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_reverse_split", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DOUBLE), false, new ArrayType(Type.DOUBLE), new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_reverse_split", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.VARCHAR), false, new ArrayType(Type.VARCHAR), new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_reverse_split", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.STRING), false, new ArrayType(Type.STRING), new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_reverse_split", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.MAX_DECIMALV2_TYPE), false, new ArrayType(Type.MAX_DECIMALV2_TYPE), new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_reverse_split", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL32), false, new ArrayType(Type.DECIMAL32), new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_reverse_split", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL64), false, new ArrayType(Type.DECIMAL64), new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_reverse_split", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL128), false, new ArrayType(Type.DECIMAL128), new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_reverse_split", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATETIME), false, new ArrayType(Type.DATETIME), new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_reverse_split", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATE), false, new ArrayType(Type.DATE), new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_reverse_split", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATETIMEV2), false, new ArrayType(Type.DATETIMEV2), new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("array_reverse_split", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATEV2), false, new ArrayType(Type.DATEV2), new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("reverse", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("reverse", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("reverse", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.TINYINT), false, new ArrayType(Type.TINYINT));
        functionSet.addScalarAndVectorizedBuiltin("reverse", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.SMALLINT), false, new ArrayType(Type.SMALLINT));
        functionSet.addScalarAndVectorizedBuiltin("reverse", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.INT), false, new ArrayType(Type.INT));
        functionSet.addScalarAndVectorizedBuiltin("reverse", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), false, new ArrayType(Type.BIGINT));
        functionSet.addScalarAndVectorizedBuiltin("reverse", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.LARGEINT), false, new ArrayType(Type.LARGEINT));
        functionSet.addScalarAndVectorizedBuiltin("reverse", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATETIME), false, new ArrayType(Type.DATETIME));
        functionSet.addScalarAndVectorizedBuiltin("reverse", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATE), false, new ArrayType(Type.DATE));
        functionSet.addScalarAndVectorizedBuiltin("reverse", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATETIMEV2), false, new ArrayType(Type.DATETIMEV2));
        functionSet.addScalarAndVectorizedBuiltin("reverse", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DATEV2), false, new ArrayType(Type.DATEV2));
        functionSet.addScalarAndVectorizedBuiltin("reverse", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.FLOAT), false, new ArrayType(Type.FLOAT));
        functionSet.addScalarAndVectorizedBuiltin("reverse", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DOUBLE), false, new ArrayType(Type.DOUBLE));
        functionSet.addScalarAndVectorizedBuiltin("reverse", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.MAX_DECIMALV2_TYPE), false, new ArrayType(Type.MAX_DECIMALV2_TYPE));
        functionSet.addScalarAndVectorizedBuiltin("reverse", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL32), false, new ArrayType(Type.DECIMAL32));
        functionSet.addScalarAndVectorizedBuiltin("reverse", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL64), false, new ArrayType(Type.DECIMAL64));
        functionSet.addScalarAndVectorizedBuiltin("reverse", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.DECIMAL128), false, new ArrayType(Type.DECIMAL128));
        functionSet.addScalarAndVectorizedBuiltin("reverse", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.VARCHAR), false, new ArrayType(Type.VARCHAR));
        functionSet.addScalarAndVectorizedBuiltin("reverse", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.STRING), false, new ArrayType(Type.STRING));
    }
    private static void initMathBuiltins(FunctionSet functionSet) {
        functionSet.addScalarAndVectorizedBuiltin("abs", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DOUBLE, false, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("abs", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.FLOAT, false, Type.FLOAT);
        functionSet.addScalarAndVectorizedBuiltin("abs", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.LARGEINT, false, Type.LARGEINT);
        functionSet.addScalarAndVectorizedBuiltin("abs", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.LARGEINT, false, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("abs", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.INT, false, Type.SMALLINT);
        functionSet.addScalarAndVectorizedBuiltin("abs", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("abs", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.SMALLINT, false, Type.TINYINT);
        functionSet.addScalarAndVectorizedBuiltin("abs", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.MAX_DECIMALV2_TYPE, false, Type.MAX_DECIMALV2_TYPE);
        functionSet.addScalarAndVectorizedBuiltin("abs", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL32, false, Type.DECIMAL32);
        functionSet.addScalarAndVectorizedBuiltin("abs", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL64, false, Type.DECIMAL64);
        functionSet.addScalarAndVectorizedBuiltin("abs", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL128, false, Type.DECIMAL128);
        functionSet.addScalarAndVectorizedBuiltin("acos", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DOUBLE, false, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("atan", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DOUBLE, false, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("atan2", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DOUBLE, false, Type.DOUBLE, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("asin", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DOUBLE, false, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("bin", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, false, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("cbrt", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DOUBLE, false, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("ceil", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DOUBLE, false, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("ceiling", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DOUBLE, false, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("dceil", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DOUBLE, false, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("ceil", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DOUBLE, false, Type.DOUBLE, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("ceiling", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DOUBLE, false, Type.DOUBLE, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("dceil", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DOUBLE, false, Type.DOUBLE, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("ceil", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL32, false, Type.DECIMAL32);
        functionSet.addScalarAndVectorizedBuiltin("ceiling", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL32, false, Type.DECIMAL32);
        functionSet.addScalarAndVectorizedBuiltin("dceil", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL32, false, Type.DECIMAL32);
        functionSet.addScalarAndVectorizedBuiltin("ceil", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL64, false, Type.DECIMAL64);
        functionSet.addScalarAndVectorizedBuiltin("ceiling", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL64, false, Type.DECIMAL64);
        functionSet.addScalarAndVectorizedBuiltin("dceil", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL64, false, Type.DECIMAL64);
        functionSet.addScalarAndVectorizedBuiltin("ceil", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL128, false, Type.DECIMAL128);
        functionSet.addScalarAndVectorizedBuiltin("ceiling", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL128, false, Type.DECIMAL128);
        functionSet.addScalarAndVectorizedBuiltin("dceil", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL128, false, Type.DECIMAL128);
        functionSet.addScalarAndVectorizedBuiltin("ceil", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL32, false, Type.DECIMAL32, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("dceil", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL32, false, Type.DECIMAL32, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("ceil", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL64, false, Type.DECIMAL64, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("dceil", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL64, false, Type.DECIMAL64, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("ceil", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL128, false, Type.DECIMAL128, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("dceil", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL128, false, Type.DECIMAL128, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("conv", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.BIGINT, Type.TINYINT, Type.TINYINT);
        functionSet.addScalarAndVectorizedBuiltin("conv", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.VARCHAR, Type.TINYINT, Type.TINYINT);
        functionSet.addScalarAndVectorizedBuiltin("conv", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.STRING, Type.TINYINT, Type.TINYINT);
        functionSet.addScalarAndVectorizedBuiltin("cos", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DOUBLE, false, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("cosh", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DOUBLE, false, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("degrees", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DOUBLE, false, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("e", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.DOUBLE, false);
        functionSet.addScalarAndVectorizedBuiltin("exp", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DOUBLE, false, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("dexp", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DOUBLE, false, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("floor", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DOUBLE, false, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("dfloor", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DOUBLE, false, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("floor", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DOUBLE, false, Type.DOUBLE, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("dfloor", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DOUBLE, false, Type.DOUBLE, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("floor", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL32, false, Type.DECIMAL32);
        functionSet.addScalarAndVectorizedBuiltin("dfloor", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL32, false, Type.DECIMAL32);
        functionSet.addScalarAndVectorizedBuiltin("floor", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL32, false, Type.DECIMAL32, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("dfloor", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL32, false, Type.DECIMAL32, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("floor", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL64, false, Type.DECIMAL64);
        functionSet.addScalarAndVectorizedBuiltin("dfloor", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL64, false, Type.DECIMAL64);
        functionSet.addScalarAndVectorizedBuiltin("floor", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL64, false, Type.DECIMAL64, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("dfloor", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL64, false, Type.DECIMAL64, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("floor", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL128, false, Type.DECIMAL128);
        functionSet.addScalarAndVectorizedBuiltin("dfloor", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL128, false, Type.DECIMAL128);
        functionSet.addScalarAndVectorizedBuiltin("floor", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL128, false, Type.DECIMAL128, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("dfloor", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL128, false, Type.DECIMAL128, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("greatest", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.TINYINT, true, Type.TINYINT);
        functionSet.addScalarAndVectorizedBuiltin("greatest", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.SMALLINT, true, Type.SMALLINT);
        functionSet.addScalarAndVectorizedBuiltin("greatest", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.INT, true, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("greatest", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, true, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("greatest", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.LARGEINT, true, Type.LARGEINT);
        functionSet.addScalarAndVectorizedBuiltin("greatest", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.FLOAT, true, Type.FLOAT);
        functionSet.addScalarAndVectorizedBuiltin("greatest", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DOUBLE, true, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("greatest", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.MAX_DECIMALV2_TYPE, true, Type.MAX_DECIMALV2_TYPE);
        functionSet.addScalarAndVectorizedBuiltin("greatest", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL32, true, Type.DECIMAL32);
        functionSet.addScalarAndVectorizedBuiltin("greatest", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL64, true, Type.DECIMAL64);
        functionSet.addScalarAndVectorizedBuiltin("greatest", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL128, true, Type.DECIMAL128);
        functionSet.addScalarAndVectorizedBuiltin("greatest", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATE, true, Type.DATE);
        functionSet.addScalarAndVectorizedBuiltin("greatest", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATEV2, true, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("greatest", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATETIME, true, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("greatest", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATETIMEV2, true, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("greatest", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, true, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("greatest", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, true, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("hex", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, false, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("hex", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("hex", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("ln", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("dlog1", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("log", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, Type.DOUBLE, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("log2", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("log10", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("dlog10", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("least", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.TINYINT, true, Type.TINYINT);
        functionSet.addScalarAndVectorizedBuiltin("least", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.SMALLINT, true, Type.SMALLINT);
        functionSet.addScalarAndVectorizedBuiltin("least", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.INT, true, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("least", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, true, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("least", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.LARGEINT, true, Type.LARGEINT);
        functionSet.addScalarAndVectorizedBuiltin("least", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.FLOAT, true, Type.FLOAT);
        functionSet.addScalarAndVectorizedBuiltin("least", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DOUBLE, true, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("least", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATE, true, Type.DATE);
        functionSet.addScalarAndVectorizedBuiltin("least", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATEV2, true, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("least", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATETIME, true, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("least", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATETIMEV2, true, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("least", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.MAX_DECIMALV2_TYPE, true, Type.MAX_DECIMALV2_TYPE);
        functionSet.addScalarAndVectorizedBuiltin("least", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL32, true, Type.DECIMAL32);
        functionSet.addScalarAndVectorizedBuiltin("least", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL64, true, Type.DECIMAL64);
        functionSet.addScalarAndVectorizedBuiltin("least", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL128, true, Type.DECIMAL128);
        functionSet.addScalarAndVectorizedBuiltin("least", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, true, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("least", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, true, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("mod", true, Function.NullableMode.ALWAYS_NULLABLE, Type.TINYINT, false, Type.TINYINT, Type.TINYINT);
        functionSet.addScalarAndVectorizedBuiltin("mod", true, Function.NullableMode.ALWAYS_NULLABLE, Type.SMALLINT, false, Type.SMALLINT, Type.SMALLINT);
        functionSet.addScalarAndVectorizedBuiltin("mod", true, Function.NullableMode.ALWAYS_NULLABLE, Type.INT, false, Type.INT, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("mod", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BIGINT, false, Type.BIGINT, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("mod", true, Function.NullableMode.ALWAYS_NULLABLE, Type.LARGEINT, false, Type.LARGEINT, Type.LARGEINT);
        functionSet.addScalarAndVectorizedBuiltin("mod", true, Function.NullableMode.ALWAYS_NULLABLE, Type.MAX_DECIMALV2_TYPE, false, Type.MAX_DECIMALV2_TYPE, Type.MAX_DECIMALV2_TYPE);
        functionSet.addScalarAndVectorizedBuiltin("mod", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DECIMAL32, false, Type.DECIMAL32, Type.DECIMAL32);
        functionSet.addScalarAndVectorizedBuiltin("mod", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DECIMAL64, false, Type.DECIMAL64, Type.DECIMAL64);
        functionSet.addScalarAndVectorizedBuiltin("mod", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DECIMAL128, false, Type.DECIMAL128, Type.DECIMAL128);
        functionSet.addScalarAndVectorizedBuiltin("mod", true, Function.NullableMode.ALWAYS_NULLABLE, Type.FLOAT, false, Type.FLOAT, Type.FLOAT);
        functionSet.addScalarAndVectorizedBuiltin("fmod", true, Function.NullableMode.ALWAYS_NULLABLE, Type.FLOAT, false, Type.FLOAT, Type.FLOAT);
        functionSet.addScalarAndVectorizedBuiltin("mod", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, Type.DOUBLE, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("fmod", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, Type.DOUBLE, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("negative", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("negative", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DOUBLE, false, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("negative", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.MAX_DECIMALV2_TYPE, false, Type.MAX_DECIMALV2_TYPE);
        functionSet.addScalarAndVectorizedBuiltin("negative", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL32, false, Type.DECIMAL32);
        functionSet.addScalarAndVectorizedBuiltin("negative", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL64, false, Type.DECIMAL64);
        functionSet.addScalarAndVectorizedBuiltin("negative", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL128, false, Type.DECIMAL128);
        functionSet.addScalarAndVectorizedBuiltin("pi", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.DOUBLE, false);
        functionSet.addScalarAndVectorizedBuiltin("pmod", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BIGINT, false, Type.BIGINT, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("pmod", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, Type.DOUBLE, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("positive", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("positive", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DOUBLE, false, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("positive", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.MAX_DECIMALV2_TYPE, false, Type.MAX_DECIMALV2_TYPE);
        functionSet.addScalarAndVectorizedBuiltin("positive", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL32, false, Type.DECIMAL32);
        functionSet.addScalarAndVectorizedBuiltin("positive", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL64, false, Type.DECIMAL64);
        functionSet.addScalarAndVectorizedBuiltin("positive", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL128, false, Type.DECIMAL128);
        functionSet.addScalarAndVectorizedBuiltin("pow", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DOUBLE, false, Type.DOUBLE, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("power", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DOUBLE, false, Type.DOUBLE, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("dpow", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DOUBLE, false, Type.DOUBLE, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("fpow", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DOUBLE, false, Type.DOUBLE, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("radians", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DOUBLE, false, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("rand", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.DOUBLE, false);
        functionSet.addScalarAndVectorizedBuiltin("random", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.DOUBLE, false);
        functionSet.addScalarAndVectorizedBuiltin("rand", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DOUBLE, false, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("random", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DOUBLE, false, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("rand", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.BIGINT, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("random", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.BIGINT, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("round", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DOUBLE, false, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("dround", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DOUBLE, false, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("round", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DOUBLE, false, Type.DOUBLE, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("dround", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DOUBLE, false, Type.DOUBLE, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("round", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL32, false, Type.DECIMAL32);
        functionSet.addScalarAndVectorizedBuiltin("dround", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL32, false, Type.DECIMAL32);
        functionSet.addScalarAndVectorizedBuiltin("round", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL32, false, Type.DECIMAL32, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("dround", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL32, false, Type.DECIMAL32, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("round", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL64, false, Type.DECIMAL64);
        functionSet.addScalarAndVectorizedBuiltin("dround", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL64, false, Type.DECIMAL64);
        functionSet.addScalarAndVectorizedBuiltin("round", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL64, false, Type.DECIMAL64, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("dround", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL64, false, Type.DECIMAL64, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("round", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL128, false, Type.DECIMAL128);
        functionSet.addScalarAndVectorizedBuiltin("dround", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL128, false, Type.DECIMAL128);
        functionSet.addScalarAndVectorizedBuiltin("round", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL128, false, Type.DECIMAL128, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("dround", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL128, false, Type.DECIMAL128, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("round_bankers", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DOUBLE, false, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("round_bankers", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DOUBLE, false, Type.DOUBLE, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("round_bankers", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL32, false, Type.DECIMAL32);
        functionSet.addScalarAndVectorizedBuiltin("round_bankers", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL32, false, Type.DECIMAL32, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("round_bankers", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL64, false, Type.DECIMAL64);
        functionSet.addScalarAndVectorizedBuiltin("round_bankers", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL64, false, Type.DECIMAL64, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("round_bankers", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL128, false, Type.DECIMAL128);
        functionSet.addScalarAndVectorizedBuiltin("round_bankers", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL128, false, Type.DECIMAL128, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("round_bankers", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DOUBLE, false, Type.DOUBLE, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("round_bankers", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DOUBLE, false, Type.DOUBLE, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("sign", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.TINYINT, false, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("sin", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DOUBLE, false, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("sqrt", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DOUBLE, false, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("dsqrt", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DOUBLE, false, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("tan", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DOUBLE, false, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("tanh", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DOUBLE, false, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("truncate", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DOUBLE, false, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("truncate", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DOUBLE, false, Type.DOUBLE, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("truncate", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL32, false, Type.DECIMAL32, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("truncate", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL64, false, Type.DECIMAL64, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("truncate", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL128, false, Type.DECIMAL128, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("unhex", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("unhex", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, Type.STRING);
    }
    private static void initHashBuiltins(FunctionSet functionSet) {
        functionSet.addScalarAndVectorizedBuiltin("murmur_hash3_32", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.INT, true, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("murmur_hash3_32", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.INT, true, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("murmur_hash3_64", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, true, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("murmur_hash3_64", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, true, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("xxhash_32", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.INT, true, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("xxhash_32", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.INT, true, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("xxhash_64", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, true, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("xxhash_64", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, true, Type.STRING);
    }
    private static void initStructBuiltins(FunctionSet functionSet) {
        functionSet.addScalarAndVectorizedBuiltin("struct", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, new StructType(new TemplateType("TYPES", true)), false, new TemplateType("TYPES", true));
        functionSet.addScalarAndVectorizedBuiltin("named_struct", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.ANY_STRUCT_TYPE, false, new TemplateType("TYPES", true));
        functionSet.addScalarAndVectorizedBuiltin("struct_element", true, Function.NullableMode.ALWAYS_NULLABLE, Type.ANY_ELEMENT_TYPE, false, Type.ANY_STRUCT_TYPE, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("struct_element", true, Function.NullableMode.ALWAYS_NULLABLE, Type.ANY_ELEMENT_TYPE, false, Type.ANY_STRUCT_TYPE, Type.VARCHAR);
    }
    private static void initTimestampBuiltins(FunctionSet functionSet) {
        functionSet.addScalarAndVectorizedBuiltin("unix_timestamp", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.INT, false);
        functionSet.addScalarAndVectorizedBuiltin("unix_timestamp", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.INT, false, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("unix_timestamp", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.INT, false, Type.DATE);
        functionSet.addScalarAndVectorizedBuiltin("unix_timestamp", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DECIMAL64, false, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("unix_timestamp", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.INT, false, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("unix_timestamp", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DECIMAL64, false, Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("unix_timestamp", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DECIMAL64, false, Type.STRING, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("from_unixtime", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("from_unixtime", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.BIGINT, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("from_unixtime", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.BIGINT, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("from_microsecond", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("from_millisecond", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("from_second", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("second_timestamp", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("millisecond_timestamp", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("microsecond_timestamp", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("now", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATETIME, false);
        functionSet.addScalarAndVectorizedBuiltin("current_timestamp", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATETIME, false);
        functionSet.addScalarAndVectorizedBuiltin("localtime", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATETIME, false);
        functionSet.addScalarAndVectorizedBuiltin("localtimestamp", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATETIME, false);
        functionSet.addScalarAndVectorizedBuiltin("now", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATETIMEV2, false, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("current_timestamp", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATETIMEV2, false, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("localtime", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATETIMEV2, false, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("localtimestamp", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATETIMEV2, false, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("curtime", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.TIME, false);
        functionSet.addScalarAndVectorizedBuiltin("current_time", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.TIME, false);
        functionSet.addScalarAndVectorizedBuiltin("curdate", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.DATE, false);
        functionSet.addScalarAndVectorizedBuiltin("current_date", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.DATE, false);
        functionSet.addScalarAndVectorizedBuiltin("utc_timestamp", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.DATETIME, false);
        functionSet.addScalarAndVectorizedBuiltin("timestamp", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("from_days", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATEV2, false, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("from_days", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATE, false, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("last_day", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATE, false, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("last_day", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATE, false, Type.DATE);
        functionSet.addScalarAndVectorizedBuiltin("last_day", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATEV2, false, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("last_day", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATEV2, false, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("to_monday", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATEV2, false, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("to_monday", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATEV2, false, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("to_monday", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATE, false, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("to_monday", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATE, false, Type.DATE);
        functionSet.addScalarAndVectorizedBuiltin("to_days", true, Function.NullableMode.ALWAYS_NULLABLE, Type.INT, false, Type.DATE);
        functionSet.addScalarAndVectorizedBuiltin("date_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("date_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("date_trunc", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("date_trunc", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("date_trunc", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATEV2, false, Type.DATEV2, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("date_trunc", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATE, false, Type.DATE, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("year", true, Function.NullableMode.ALWAYS_NULLABLE, Type.SMALLINT, false, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("month", true, Function.NullableMode.ALWAYS_NULLABLE, Type.TINYINT, false, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("quarter", true, Function.NullableMode.ALWAYS_NULLABLE, Type.TINYINT, false, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("dayofweek", true, Function.NullableMode.ALWAYS_NULLABLE, Type.TINYINT, false, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("weekday", true, Function.NullableMode.ALWAYS_NULLABLE, Type.TINYINT, false, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("day", true, Function.NullableMode.ALWAYS_NULLABLE, Type.TINYINT, false, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("dayofmonth", true, Function.NullableMode.ALWAYS_NULLABLE, Type.TINYINT, false, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("dayofyear", true, Function.NullableMode.ALWAYS_NULLABLE, Type.SMALLINT, false, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("weekofyear", true, Function.NullableMode.ALWAYS_NULLABLE, Type.TINYINT, false, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("yearweek", true, Function.NullableMode.ALWAYS_NULLABLE, Type.INT, false, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("yearweek", true, Function.NullableMode.ALWAYS_NULLABLE, Type.INT, false, Type.DATETIME, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("week", true, Function.NullableMode.ALWAYS_NULLABLE, Type.TINYINT, false, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("week", true, Function.NullableMode.ALWAYS_NULLABLE, Type.TINYINT, false, Type.DATETIME, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("hour", true, Function.NullableMode.ALWAYS_NULLABLE, Type.TINYINT, false, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("minute", true, Function.NullableMode.ALWAYS_NULLABLE, Type.TINYINT, false, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("second", true, Function.NullableMode.ALWAYS_NULLABLE, Type.TINYINT, false, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("makedate", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATE, false, Type.INT, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("years_add", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("years_sub", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("months_add", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("add_months", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("months_sub", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("weeks_add", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("weeks_sub", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("days_add", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("date_add", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("adddate", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("days_sub", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("date_sub", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("subdate", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("hours_add", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("hours_sub", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("minutes_add", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("minutes_sub", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("seconds_add", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("seconds_sub", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("datediff", true, Function.NullableMode.ALWAYS_NULLABLE, Type.INT, false, Type.DATETIME, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("timediff", true, Function.NullableMode.ALWAYS_NULLABLE, Type.TIME, false, Type.DATETIME, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("date_format", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.DATETIME, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("date_format", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.DATE, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("date", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATE, false, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("to_date", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATE, false, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("dayname", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("monthname", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("convert_tz", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("years_diff", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BIGINT, false, Type.DATETIME, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("months_diff", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BIGINT, false, Type.DATETIME, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("weeks_diff", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BIGINT, false, Type.DATETIME, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("days_diff", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BIGINT, false, Type.DATETIME, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("hours_diff", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BIGINT, false, Type.DATETIME, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("minutes_diff", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BIGINT, false, Type.DATETIME, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("seconds_diff", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BIGINT, false, Type.DATETIME, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("year_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("year_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("year_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("year_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.INT, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("year_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("year_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("year_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("year_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.INT, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("month_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("month_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("month_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("month_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.INT, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("month_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("month_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("month_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("month_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.INT, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("week_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("week_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("week_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("week_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.INT, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("week_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("week_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("week_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("week_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.INT, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("day_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("day_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("day_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("day_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.INT, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("day_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("day_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("day_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("day_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.INT, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("hour_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("hour_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("hour_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("hour_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.INT, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("hour_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("hour_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("hour_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("hour_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.INT, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("minute_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("minute_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("minute_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("minute_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.INT, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("minute_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("minute_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("minute_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("minute_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.INT, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("second_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("second_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("second_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("second_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.INT, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("second_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("second_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("second_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("second_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.INT, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("timestamp", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATETIMEV2, false, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("to_days", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.INT, false, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("time_to_sec", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.INT, false, Type.TIME);
        functionSet.addScalarAndVectorizedBuiltin("time_to_sec", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.INT, false, Type.TIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("sec_to_time", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.TIME, false, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("year", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.SMALLINT, false, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("month", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.TINYINT, false, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("quarter", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.TINYINT, false, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("dayofweek", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.TINYINT, false, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("weekday", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.TINYINT, false, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("day", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.TINYINT, false, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("dayofmonth", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.TINYINT, false, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("dayofyear", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.SMALLINT, false, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("weekofyear", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.TINYINT, false, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("yearweek", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.INT, false, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("yearweek", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.INT, false, Type.DATETIMEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("week", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.TINYINT, false, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("week", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.TINYINT, false, Type.DATETIMEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("hour", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.TINYINT, false, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("minute", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.TINYINT, false, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("second", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.TINYINT, false, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("microsecond", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.INT, false, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("year", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.SMALLINT, false, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("month", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.TINYINT, false, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("quarter", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.TINYINT, false, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("dayofweek", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.TINYINT, false, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("weekday", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.TINYINT, false, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("day", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.TINYINT, false, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("dayofmonth", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.TINYINT, false, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("dayofyear", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.SMALLINT, false, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("weekofyear", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.TINYINT, false, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("yearweek", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.INT, false, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("yearweek", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.INT, false, Type.DATEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("week", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.TINYINT, false, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("week", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.TINYINT, false, Type.DATEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("hour", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.TINYINT, false, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("minute", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.TINYINT, false, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("second", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.TINYINT, false, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("years_add", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("years_sub", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("months_add", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("add_months", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("months_sub", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("weeks_add", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("weeks_sub", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("days_add", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("date_add", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("adddate", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("days_sub", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("date_sub", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("subdate", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("hours_add", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("hours_sub", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("minutes_add", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("minutes_sub", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("seconds_add", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("seconds_sub", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("microseconds_add", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("microseconds_sub", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("milliseconds_add", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("milliseconds_sub", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("years_add", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATEV2, false, Type.DATEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("years_sub", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATEV2, false, Type.DATEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("months_add", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATEV2, false, Type.DATEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("add_months", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATEV2, false, Type.DATEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("months_sub", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATEV2, false, Type.DATEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("weeks_add", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATEV2, false, Type.DATEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("weeks_sub", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATEV2, false, Type.DATEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("days_add", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATEV2, false, Type.DATEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("date_add", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATEV2, false, Type.DATEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("adddate", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATEV2, false, Type.DATEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("days_sub", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATEV2, false, Type.DATEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("date_sub", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATEV2, false, Type.DATEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("subdate", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATEV2, false, Type.DATEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("days_add", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATE, false, Type.DATE, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("date_add", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATE, false, Type.DATE, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("adddate", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATE, false, Type.DATE, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("days_sub", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATE, false, Type.DATE, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("date_sub", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATE, false, Type.DATE, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("subdate", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATE, false, Type.DATE, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("hours_add", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATETIMEV2, false, Type.DATEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("hours_sub", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATETIMEV2, false, Type.DATEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("minutes_add", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATETIMEV2, false, Type.DATEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("minutes_sub", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATETIMEV2, false, Type.DATEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("seconds_add", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATETIMEV2, false, Type.DATEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("seconds_sub", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATETIMEV2, false, Type.DATEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("microseconds_add", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATETIMEV2, false, Type.DATEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("microseconds_sub", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATETIMEV2, false, Type.DATEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("milliseconds_add", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATETIMEV2, false, Type.DATEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("milliseconds_sub", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.DATETIMEV2, false, Type.DATEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("datediff", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.INT, false, Type.DATETIMEV2, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("timediff", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.TIMEV2, false, Type.DATETIMEV2, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("datediff", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.INT, false, Type.DATETIMEV2, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("timediff", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.TIMEV2, false, Type.DATETIMEV2, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("datediff", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.INT, false, Type.DATEV2, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("timediff", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.TIMEV2, false, Type.DATEV2, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("datediff", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.INT, false, Type.DATEV2, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("timediff", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.TIMEV2, false, Type.DATEV2, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("str_to_date", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("str_to_date", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.STRING, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("date_format", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.DATETIMEV2, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("date_format", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.DATEV2, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("date", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATEV2, false, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("to_date", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATEV2, false, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("datev2", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATEV2, false, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("to_datev2", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATEV2, false, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("dayname", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, false, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("monthname", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, false, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("dayname", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, false, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("monthname", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, false, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("convert_tz", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("years_diff", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.DATETIMEV2, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("months_diff", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.DATETIMEV2, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("weeks_diff", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.DATETIMEV2, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("days_diff", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.DATETIMEV2, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("hours_diff", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.DATETIMEV2, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("minutes_diff", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.DATETIMEV2, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("seconds_diff", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.DATETIMEV2, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("microseconds_diff", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.DATETIMEV2, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("milliseconds_diff", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.DATETIMEV2, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("years_diff", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.DATEV2, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("months_diff", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.DATEV2, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("weeks_diff", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.DATEV2, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("days_diff", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.DATEV2, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("hours_diff", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.DATEV2, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("minutes_diff", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.DATEV2, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("seconds_diff", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.DATEV2, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("microseconds_diff", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.DATEV2, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("milliseconds_diff", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.DATEV2, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("years_diff", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.DATETIMEV2, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("months_diff", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.DATETIMEV2, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("weeks_diff", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.DATETIMEV2, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("days_diff", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.DATETIMEV2, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("hours_diff", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.DATETIMEV2, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("minutes_diff", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.DATETIMEV2, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("seconds_diff", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.DATETIMEV2, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("microseconds_diff", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.DATETIMEV2, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("milliseconds_diff", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.DATETIMEV2, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("years_diff", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.DATEV2, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("months_diff", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.DATEV2, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("weeks_diff", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.DATEV2, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("days_diff", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.DATEV2, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("hours_diff", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.DATEV2, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("minutes_diff", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.DATEV2, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("seconds_diff", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.DATEV2, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("microseconds_diff", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.DATEV2, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("milliseconds_diff", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.DATEV2, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("year_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("year_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("year_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("year_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.INT, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("year_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("year_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("year_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("year_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.INT, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("month_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("month_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("month_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("month_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.INT, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("month_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("month_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("month_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("month_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.INT, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("week_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("week_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("week_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("week_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.INT, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("week_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("week_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("week_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("week_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.INT, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("day_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("day_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("day_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("day_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.INT, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("day_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("day_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("day_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("day_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.INT, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("hour_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("hour_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("hour_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("hour_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.INT, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("hour_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("hour_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("hour_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("hour_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.INT, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("minute_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("minute_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("minute_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("minute_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.INT, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("minute_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("minute_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("minute_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("minute_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.INT, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("second_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("second_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("second_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("second_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.INT, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("second_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("second_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("second_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("second_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.INT, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("year_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATEV2, false, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("year_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATEV2, false, Type.DATEV2, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("year_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATEV2, false, Type.DATEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("year_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATEV2, false, Type.DATEV2, Type.INT, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("year_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATEV2, false, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("year_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATEV2, false, Type.DATEV2, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("year_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATEV2, false, Type.DATEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("year_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATEV2, false, Type.DATEV2, Type.INT, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("month_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATEV2, false, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("month_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATEV2, false, Type.DATEV2, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("month_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATEV2, false, Type.DATEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("month_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATEV2, false, Type.DATEV2, Type.INT, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("month_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATEV2, false, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("month_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATEV2, false, Type.DATEV2, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("month_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATEV2, false, Type.DATEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("month_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATEV2, false, Type.DATEV2, Type.INT, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("week_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATEV2, false, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("week_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATEV2, false, Type.DATEV2, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("week_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATEV2, false, Type.DATEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("week_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATEV2, false, Type.DATEV2, Type.INT, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("week_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATEV2, false, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("week_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATEV2, false, Type.DATEV2, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("week_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATEV2, false, Type.DATEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("week_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATEV2, false, Type.DATEV2, Type.INT, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("day_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATEV2, false, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("day_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATEV2, false, Type.DATEV2, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("day_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATEV2, false, Type.DATEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("day_floor", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATEV2, false, Type.DATEV2, Type.INT, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("day_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATEV2, false, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("day_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATEV2, false, Type.DATEV2, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("day_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATEV2, false, Type.DATEV2, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("day_ceil", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATEV2, false, Type.DATEV2, Type.INT, Type.DATEV2);
    }
    private static void initQuantileBuiltins(FunctionSet functionSet) {
        functionSet.addScalarAndVectorizedBuiltin("quantile_state_empty", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.QUANTILE_STATE, false);
        functionSet.addScalarAndVectorizedBuiltin("to_quantile_state", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.QUANTILE_STATE, false, Type.DOUBLE, Type.FLOAT);
        functionSet.addScalarAndVectorizedBuiltin("quantile_percent", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.DOUBLE, false, Type.QUANTILE_STATE, Type.FLOAT);
    }
    private static void initMultimatchBuiltins(FunctionSet functionSet) {
        functionSet.addScalarAndVectorizedBuiltin("multi_match", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BOOLEAN, true, Type.STRING);
    }
    private static void initNullalbeBuiltins(FunctionSet functionSet) {
        functionSet.addScalarAndVectorizedBuiltin("nullable", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BOOLEAN, false, Type.BOOLEAN);
        functionSet.addScalarAndVectorizedBuiltin("nullable", true, Function.NullableMode.ALWAYS_NULLABLE, Type.TINYINT, false, Type.TINYINT);
        functionSet.addScalarAndVectorizedBuiltin("nullable", true, Function.NullableMode.ALWAYS_NULLABLE, Type.SMALLINT, false, Type.SMALLINT);
        functionSet.addScalarAndVectorizedBuiltin("nullable", true, Function.NullableMode.ALWAYS_NULLABLE, Type.INT, false, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("nullable", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BIGINT, false, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("nullable", true, Function.NullableMode.ALWAYS_NULLABLE, Type.LARGEINT, false, Type.LARGEINT);
        functionSet.addScalarAndVectorizedBuiltin("nullable", true, Function.NullableMode.ALWAYS_NULLABLE, Type.FLOAT, false, Type.FLOAT);
        functionSet.addScalarAndVectorizedBuiltin("nullable", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("nullable", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATE, false, Type.DATE);
        functionSet.addScalarAndVectorizedBuiltin("nullable", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATEV2, false, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("nullable", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("nullable", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("nullable", true, Function.NullableMode.ALWAYS_NULLABLE, Type.MAX_DECIMALV2_TYPE, false, Type.MAX_DECIMALV2_TYPE);
        functionSet.addScalarAndVectorizedBuiltin("nullable", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DECIMAL32, false, Type.DECIMAL32);
        functionSet.addScalarAndVectorizedBuiltin("nullable", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DECIMAL64, false, Type.DECIMAL64);
        functionSet.addScalarAndVectorizedBuiltin("nullable", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DECIMAL128, false, Type.DECIMAL128);
        functionSet.addScalarAndVectorizedBuiltin("nullable", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("nullable", true, Function.NullableMode.ALWAYS_NULLABLE, Type.STRING, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("nullable", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BITMAP, false, Type.BITMAP);
        functionSet.addScalarAndVectorizedBuiltin("nullable", true, Function.NullableMode.ALWAYS_NULLABLE, Type.JSONB, false, Type.JSONB);
        functionSet.addScalarAndVectorizedBuiltin("nullable", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.BOOLEAN), false, new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("nullable", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.TINYINT), false, new ArrayType(Type.TINYINT));
        functionSet.addScalarAndVectorizedBuiltin("nullable", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.SMALLINT), false, new ArrayType(Type.SMALLINT));
        functionSet.addScalarAndVectorizedBuiltin("nullable", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.INT), false, new ArrayType(Type.INT));
        functionSet.addScalarAndVectorizedBuiltin("nullable", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.BIGINT), false, new ArrayType(Type.BIGINT));
        functionSet.addScalarAndVectorizedBuiltin("nullable", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.LARGEINT), false, new ArrayType(Type.LARGEINT));
        functionSet.addScalarAndVectorizedBuiltin("nullable", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.DATETIME), false, new ArrayType(Type.DATETIME));
        functionSet.addScalarAndVectorizedBuiltin("nullable", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.DATE), false, new ArrayType(Type.DATE));
        functionSet.addScalarAndVectorizedBuiltin("nullable", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.DATETIMEV2), false, new ArrayType(Type.DATETIMEV2));
        functionSet.addScalarAndVectorizedBuiltin("nullable", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.DATEV2), false, new ArrayType(Type.DATEV2));
        functionSet.addScalarAndVectorizedBuiltin("nullable", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.FLOAT), false, new ArrayType(Type.FLOAT));
        functionSet.addScalarAndVectorizedBuiltin("nullable", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.DOUBLE), false, new ArrayType(Type.DOUBLE));
        functionSet.addScalarAndVectorizedBuiltin("nullable", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.MAX_DECIMALV2_TYPE), false, new ArrayType(Type.MAX_DECIMALV2_TYPE));
        functionSet.addScalarAndVectorizedBuiltin("nullable", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.DECIMAL32), false, new ArrayType(Type.DECIMAL32));
        functionSet.addScalarAndVectorizedBuiltin("nullable", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.DECIMAL64), false, new ArrayType(Type.DECIMAL64));
        functionSet.addScalarAndVectorizedBuiltin("nullable", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.DECIMAL128), false, new ArrayType(Type.DECIMAL128));
        functionSet.addScalarAndVectorizedBuiltin("nullable", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.VARCHAR), false, new ArrayType(Type.VARCHAR));
        functionSet.addScalarAndVectorizedBuiltin("nullable", true, Function.NullableMode.ALWAYS_NULLABLE, new ArrayType(Type.STRING), false, new ArrayType(Type.STRING));
    }
    private static void initCompatableBuiltins(FunctionSet functionSet) {
        functionSet.addScalarAndVectorizedBuiltin("md5", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("md5sum", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, true, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("md5", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("md5sum", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, true, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("sm3", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("sm3sum", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, true, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("sm3", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("sm3sum", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, true, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("sha", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("sha", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("sha1", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("sha1", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("sha2", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, false, Type.VARCHAR, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("sha2", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, false, Type.STRING, Type.INT);
    }
    private static void initGeoBuiltins(FunctionSet functionSet) {
        functionSet.addScalarAndVectorizedBuiltin("ST_Point", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.DOUBLE, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("ST_X", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("ST_Y", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("ST_X", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("ST_Y", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("ST_Distance_Sphere", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, Type.DOUBLE, Type.DOUBLE, Type.DOUBLE, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("ST_Angle_Sphere", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, Type.DOUBLE, Type.DOUBLE, Type.DOUBLE, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("ST_Angle", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, Type.VARCHAR, Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("ST_Angle", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, Type.STRING, Type.STRING, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("ST_Azimuth", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("ST_Azimuth", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, Type.STRING, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("ST_Area_Square_Meters", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("ST_Area_Square_Meters", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("ST_Area_Square_Km", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("ST_Area_Square_Km", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("ST_AsText", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("ST_AsWKT", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("ST_AsText", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("ST_AsWKT", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("ST_GeometryFromText", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("ST_GeomFromText", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("ST_GeometryFromText", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("ST_GeomFromText", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("ST_GeometryFromWkb", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("ST_GeomFromWkb", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("ST_GeometryFromWkb", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("ST_GeomFromWkb", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("ST_AsBinary", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("ST_AsBinary", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("ST_LineFromText", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("ST_LineStringFromText", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("ST_LineFromText", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("ST_LineStringFromText", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("ST_Polygon", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("ST_PolyFromText", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("ST_PolygonFromText", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("ST_Polygon", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("ST_PolyFromText", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("ST_PolygonFromText", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("ST_Circle", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.DOUBLE, Type.DOUBLE, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("ST_Contains", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BOOLEAN, false, Type.VARCHAR, Type.VARCHAR);
    }
    private static void initMapBuiltins(FunctionSet functionSet) {
        functionSet.addScalarAndVectorizedBuiltin("map", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, new MapType(new TemplateType("K"), new TemplateType("V")), true, new TemplateType("K"), new TemplateType("V"));
        functionSet.addScalarAndVectorizedBuiltin("element_at", true, Function.NullableMode.ALWAYS_NULLABLE, new TemplateType("V"), false, new MapType(new TemplateType("K"), new TemplateType("V")), new TemplateType("K"));
        functionSet.addScalarAndVectorizedBuiltin("%element_extract%", true, Function.NullableMode.ALWAYS_NULLABLE, new TemplateType("V"), false, new MapType(new TemplateType("K"), new TemplateType("V")), new TemplateType("K"));
        functionSet.addScalarAndVectorizedBuiltin("size", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, new MapType(new TemplateType("K"), new TemplateType("V")));
        functionSet.addScalarAndVectorizedBuiltin("map_size", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, new MapType(new TemplateType("K"), new TemplateType("V")));
        functionSet.addScalarAndVectorizedBuiltin("cardinality", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, new MapType(new TemplateType("K"), new TemplateType("V")));
        functionSet.addScalarAndVectorizedBuiltin("map_contains_key", true, Function.NullableMode.CUSTOM, Type.BOOLEAN, false, new MapType(new TemplateType("K"), new TemplateType("V")), new TemplateType("K"));
        functionSet.addScalarAndVectorizedBuiltin("map_contains_value", true, Function.NullableMode.CUSTOM, Type.BOOLEAN, false, new MapType(new TemplateType("K"), new TemplateType("V")), new TemplateType("V"));
        functionSet.addScalarAndVectorizedBuiltin("map_keys", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(new TemplateType("K")), false, new MapType(new TemplateType("K"), new TemplateType("V")));
        functionSet.addScalarAndVectorizedBuiltin("map_values", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(new TemplateType("V")), false, new MapType(new TemplateType("K"), new TemplateType("V")));
    }
    private static void initSearchBuiltins(FunctionSet functionSet) {
        functionSet.addScalarAndVectorizedBuiltin("multi_search_all_positions", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, new ArrayType(Type.INT), false, Type.STRING, new ArrayType(Type.STRING));
        functionSet.addScalarAndVectorizedBuiltin("multi_match_any", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.TINYINT, false, Type.STRING, new ArrayType(Type.STRING));
        functionSet.addScalarAndVectorizedBuiltin("like", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BOOLEAN, false, Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("rlike", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BOOLEAN, false, Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("regexp", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BOOLEAN, false, Type.VARCHAR, Type.VARCHAR);
    }
    private static void initUrlBuiltins(FunctionSet functionSet) {
        functionSet.addScalarAndVectorizedBuiltin("domain", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("domain_without_www", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("protocol", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("top_level_domain", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("cut_to_first_significant_subdomain", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("first_significant_subdomain", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, Type.STRING);
    }
    private static void initIpBuiltins(FunctionSet functionSet) {
        functionSet.addScalarAndVectorizedBuiltin("ipv4_num_to_string", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.TINYINT);
        functionSet.addScalarAndVectorizedBuiltin("inet_ntoa", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.TINYINT);
        functionSet.addScalarAndVectorizedBuiltin("ipv4_num_to_string", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.SMALLINT);
        functionSet.addScalarAndVectorizedBuiltin("inet_ntoa", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.SMALLINT);
        functionSet.addScalarAndVectorizedBuiltin("ipv4_num_to_string", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("inet_ntoa", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("ipv4_num_to_string", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("inet_ntoa", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("ipv4_string_to_num", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BIGINT, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("ipv4_string_to_num", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BIGINT, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("ipv4_string_to_num_or_default", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BIGINT, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("ipv4_string_to_num_or_default", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BIGINT, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("ipv4_string_to_num_or_null", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BIGINT, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("inet_aton", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BIGINT, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("ipv4_string_to_num_or_null", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BIGINT, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("inet_aton", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BIGINT, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("ipv6_num_to_string", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("inet6_ntoa", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("ipv6_num_to_string", true, Function.NullableMode.ALWAYS_NULLABLE, Type.STRING, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("inet6_ntoa", true, Function.NullableMode.ALWAYS_NULLABLE, Type.STRING, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("ipv6_num_to_string", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.IPV6);
        functionSet.addScalarAndVectorizedBuiltin("inet6_ntoa", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.IPV6);
        functionSet.addScalarAndVectorizedBuiltin("ipv6_string_to_num", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.VARCHAR, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("ipv6_string_to_num", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.STRING, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("ipv6_string_to_num_or_default", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.VARCHAR, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("ipv6_string_to_num_or_default", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.STRING, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("ipv6_string_to_num_or_null", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("inet6_aton", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("ipv6_string_to_num_or_null", true, Function.NullableMode.ALWAYS_NULLABLE, Type.STRING, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("inet6_aton", true, Function.NullableMode.ALWAYS_NULLABLE, Type.STRING, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("is_ipv4_compat", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BOOLEAN, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("is_ipv4_compat", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BOOLEAN, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("is_ipv4_mapped", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BOOLEAN, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("is_ipv4_mapped", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BOOLEAN, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("is_ipv4_string", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BOOLEAN, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("is_ipv4_string", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BOOLEAN, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("is_ipv6_string", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BOOLEAN, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("is_ipv6_string", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BOOLEAN, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("is_ip_address_in_range", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BOOLEAN, false, Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("is_ip_address_in_range", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BOOLEAN, false, Type.STRING, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("ipv4_cidr_to_range", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new StructType(Type.IPV4, Type.IPV4), false, Type.IPV4, Type.SMALLINT);
        functionSet.addScalarAndVectorizedBuiltin("ipv6_cidr_to_range", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new StructType(Type.IPV6, Type.IPV6), false, Type.IPV6, Type.SMALLINT);
        functionSet.addScalarAndVectorizedBuiltin("ipv6_cidr_to_range", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new StructType(Type.IPV6, Type.IPV6), false, Type.VARCHAR, Type.SMALLINT);
        functionSet.addScalarAndVectorizedBuiltin("ipv6_cidr_to_range", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new StructType(Type.IPV6, Type.IPV6), false, Type.STRING, Type.SMALLINT);
        functionSet.addScalarAndVectorizedBuiltin("to_ipv4", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.IPV4, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("to_ipv4", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.IPV4, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("to_ipv4_or_default", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.IPV4, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("to_ipv4_or_default", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.IPV4, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("to_ipv4_or_null", true, Function.NullableMode.ALWAYS_NULLABLE, Type.IPV4, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("to_ipv4_or_null", true, Function.NullableMode.ALWAYS_NULLABLE, Type.IPV4, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("to_ipv6", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.IPV6, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("to_ipv6", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.IPV6, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("to_ipv6_or_default", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.IPV6, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("to_ipv6_or_default", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.IPV6, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("to_ipv6_or_null", true, Function.NullableMode.ALWAYS_NULLABLE, Type.IPV6, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("to_ipv6_or_null", true, Function.NullableMode.ALWAYS_NULLABLE, Type.IPV6, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("ipv4_to_ipv6", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.IPV6, false, Type.IPV4);
        functionSet.addScalarAndVectorizedBuiltin("cut_ipv6", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, Type.IPV6, Type.TINYINT, Type.TINYINT);
        functionSet.addScalarAndVectorizedBuiltin("ipv6_from_uint128_string_or_null", true, Function.NullableMode.ALWAYS_NULLABLE, Type.IPV6, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("ipv6_from_uint128_string_or_null", true, Function.NullableMode.ALWAYS_NULLABLE, Type.IPV6, false, Type.STRING);
    }
    private static void initVariantBuiltins(FunctionSet functionSet) {
        functionSet.addScalarAndVectorizedBuiltin("element_at", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARIANT, false, Type.VARIANT, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("%element_extract%", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARIANT, false, Type.VARIANT, Type.VARCHAR);
    }
    private static void initIgnoreBuiltins(FunctionSet functionSet) {
        functionSet.addScalarAndVectorizedBuiltin("ignore", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BOOLEAN, true, Type.BOOLEAN);
        functionSet.addScalarAndVectorizedBuiltin("ignore", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BOOLEAN, true, Type.TINYINT);
        functionSet.addScalarAndVectorizedBuiltin("ignore", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BOOLEAN, true, Type.SMALLINT);
        functionSet.addScalarAndVectorizedBuiltin("ignore", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BOOLEAN, true, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("ignore", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BOOLEAN, true, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("ignore", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BOOLEAN, true, Type.LARGEINT);
        functionSet.addScalarAndVectorizedBuiltin("ignore", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BOOLEAN, true, Type.FLOAT);
        functionSet.addScalarAndVectorizedBuiltin("ignore", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BOOLEAN, true, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("ignore", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BOOLEAN, true, Type.DATE);
        functionSet.addScalarAndVectorizedBuiltin("ignore", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BOOLEAN, true, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("ignore", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BOOLEAN, true, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("ignore", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BOOLEAN, true, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("ignore", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BOOLEAN, true, Type.MAX_DECIMALV2_TYPE);
        functionSet.addScalarAndVectorizedBuiltin("ignore", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BOOLEAN, true, Type.DECIMAL32);
        functionSet.addScalarAndVectorizedBuiltin("ignore", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BOOLEAN, true, Type.DECIMAL64);
        functionSet.addScalarAndVectorizedBuiltin("ignore", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BOOLEAN, true, Type.DECIMAL128);
        functionSet.addScalarAndVectorizedBuiltin("ignore", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BOOLEAN, true, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("ignore", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BOOLEAN, true, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("ignore", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BOOLEAN, true, Type.BITMAP);
        functionSet.addScalarAndVectorizedBuiltin("ignore", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BOOLEAN, true, Type.JSONB);
        functionSet.addScalarAndVectorizedBuiltin("ignore", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BOOLEAN, true, new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("ignore", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BOOLEAN, true, new ArrayType(Type.TINYINT));
        functionSet.addScalarAndVectorizedBuiltin("ignore", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BOOLEAN, true, new ArrayType(Type.SMALLINT));
        functionSet.addScalarAndVectorizedBuiltin("ignore", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BOOLEAN, true, new ArrayType(Type.INT));
        functionSet.addScalarAndVectorizedBuiltin("ignore", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BOOLEAN, true, new ArrayType(Type.BIGINT));
        functionSet.addScalarAndVectorizedBuiltin("ignore", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BOOLEAN, true, new ArrayType(Type.LARGEINT));
        functionSet.addScalarAndVectorizedBuiltin("ignore", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BOOLEAN, true, new ArrayType(Type.DATETIME));
        functionSet.addScalarAndVectorizedBuiltin("ignore", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BOOLEAN, true, new ArrayType(Type.DATE));
        functionSet.addScalarAndVectorizedBuiltin("ignore", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BOOLEAN, true, new ArrayType(Type.DATETIMEV2));
        functionSet.addScalarAndVectorizedBuiltin("ignore", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BOOLEAN, true, new ArrayType(Type.DATEV2));
        functionSet.addScalarAndVectorizedBuiltin("ignore", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BOOLEAN, true, new ArrayType(Type.FLOAT));
        functionSet.addScalarAndVectorizedBuiltin("ignore", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BOOLEAN, true, new ArrayType(Type.DOUBLE));
        functionSet.addScalarAndVectorizedBuiltin("ignore", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BOOLEAN, true, new ArrayType(Type.MAX_DECIMALV2_TYPE));
        functionSet.addScalarAndVectorizedBuiltin("ignore", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BOOLEAN, true, new ArrayType(Type.DECIMAL32));
        functionSet.addScalarAndVectorizedBuiltin("ignore", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BOOLEAN, true, new ArrayType(Type.DECIMAL64));
        functionSet.addScalarAndVectorizedBuiltin("ignore", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BOOLEAN, true, new ArrayType(Type.DECIMAL128));
        functionSet.addScalarAndVectorizedBuiltin("ignore", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BOOLEAN, true, new ArrayType(Type.VARCHAR));
        functionSet.addScalarAndVectorizedBuiltin("ignore", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BOOLEAN, true, new ArrayType(Type.STRING));
    }
    private static void initNonnullalbeBuiltins(FunctionSet functionSet) {
        functionSet.addScalarAndVectorizedBuiltin("non_nullable", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BOOLEAN, false, Type.BOOLEAN);
        functionSet.addScalarAndVectorizedBuiltin("non_nullable", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.TINYINT, false, Type.TINYINT);
        functionSet.addScalarAndVectorizedBuiltin("non_nullable", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.SMALLINT, false, Type.SMALLINT);
        functionSet.addScalarAndVectorizedBuiltin("non_nullable", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.INT, false, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("non_nullable", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BIGINT, false, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("non_nullable", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.LARGEINT, false, Type.LARGEINT);
        functionSet.addScalarAndVectorizedBuiltin("non_nullable", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.FLOAT, false, Type.FLOAT);
        functionSet.addScalarAndVectorizedBuiltin("non_nullable", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.DOUBLE, false, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("non_nullable", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.DATE, false, Type.DATE);
        functionSet.addScalarAndVectorizedBuiltin("non_nullable", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.DATEV2, false, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("non_nullable", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.DATETIME, false, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("non_nullable", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("non_nullable", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.MAX_DECIMALV2_TYPE, false, Type.MAX_DECIMALV2_TYPE);
        functionSet.addScalarAndVectorizedBuiltin("non_nullable", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.DECIMAL32, false, Type.DECIMAL32);
        functionSet.addScalarAndVectorizedBuiltin("non_nullable", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.DECIMAL64, false, Type.DECIMAL64);
        functionSet.addScalarAndVectorizedBuiltin("non_nullable", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.DECIMAL128, false, Type.DECIMAL128);
        functionSet.addScalarAndVectorizedBuiltin("non_nullable", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.VARCHAR, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("non_nullable", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.STRING, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("non_nullable", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BITMAP, false, Type.BITMAP);
        functionSet.addScalarAndVectorizedBuiltin("non_nullable", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.JSONB, false, Type.JSONB);
        functionSet.addScalarAndVectorizedBuiltin("non_nullable", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, new ArrayType(Type.BOOLEAN), false, new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("non_nullable", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, new ArrayType(Type.TINYINT), false, new ArrayType(Type.TINYINT));
        functionSet.addScalarAndVectorizedBuiltin("non_nullable", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, new ArrayType(Type.SMALLINT), false, new ArrayType(Type.SMALLINT));
        functionSet.addScalarAndVectorizedBuiltin("non_nullable", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, new ArrayType(Type.INT), false, new ArrayType(Type.INT));
        functionSet.addScalarAndVectorizedBuiltin("non_nullable", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, new ArrayType(Type.BIGINT), false, new ArrayType(Type.BIGINT));
        functionSet.addScalarAndVectorizedBuiltin("non_nullable", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, new ArrayType(Type.LARGEINT), false, new ArrayType(Type.LARGEINT));
        functionSet.addScalarAndVectorizedBuiltin("non_nullable", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, new ArrayType(Type.DATETIME), false, new ArrayType(Type.DATETIME));
        functionSet.addScalarAndVectorizedBuiltin("non_nullable", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, new ArrayType(Type.DATE), false, new ArrayType(Type.DATE));
        functionSet.addScalarAndVectorizedBuiltin("non_nullable", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, new ArrayType(Type.DATETIMEV2), false, new ArrayType(Type.DATETIMEV2));
        functionSet.addScalarAndVectorizedBuiltin("non_nullable", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, new ArrayType(Type.DATEV2), false, new ArrayType(Type.DATEV2));
        functionSet.addScalarAndVectorizedBuiltin("non_nullable", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, new ArrayType(Type.FLOAT), false, new ArrayType(Type.FLOAT));
        functionSet.addScalarAndVectorizedBuiltin("non_nullable", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, new ArrayType(Type.DOUBLE), false, new ArrayType(Type.DOUBLE));
        functionSet.addScalarAndVectorizedBuiltin("non_nullable", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, new ArrayType(Type.MAX_DECIMALV2_TYPE), false, new ArrayType(Type.MAX_DECIMALV2_TYPE));
        functionSet.addScalarAndVectorizedBuiltin("non_nullable", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, new ArrayType(Type.DECIMAL32), false, new ArrayType(Type.DECIMAL32));
        functionSet.addScalarAndVectorizedBuiltin("non_nullable", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, new ArrayType(Type.DECIMAL64), false, new ArrayType(Type.DECIMAL64));
        functionSet.addScalarAndVectorizedBuiltin("non_nullable", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, new ArrayType(Type.DECIMAL128), false, new ArrayType(Type.DECIMAL128));
        functionSet.addScalarAndVectorizedBuiltin("non_nullable", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, new ArrayType(Type.VARCHAR), false, new ArrayType(Type.VARCHAR));
        functionSet.addScalarAndVectorizedBuiltin("non_nullable", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, new ArrayType(Type.STRING), false, new ArrayType(Type.STRING));
    }
    private static void initBitBuiltins(FunctionSet functionSet) {
        functionSet.addScalarAndVectorizedBuiltin("bitand", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.TINYINT, false, Type.TINYINT, Type.TINYINT);
        functionSet.addScalarAndVectorizedBuiltin("bitand", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.SMALLINT, false, Type.SMALLINT, Type.SMALLINT);
        functionSet.addScalarAndVectorizedBuiltin("bitand", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.INT, false, Type.INT, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("bitand", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.BIGINT, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("bitand", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.LARGEINT, false, Type.LARGEINT, Type.LARGEINT);
        functionSet.addScalarAndVectorizedBuiltin("bit_count", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.TINYINT, false, Type.TINYINT);
        functionSet.addScalarAndVectorizedBuiltin("bit_count", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.TINYINT, false, Type.SMALLINT);
        functionSet.addScalarAndVectorizedBuiltin("bit_count", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.TINYINT, false, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("bit_count", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.TINYINT, false, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("bit_count", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.SMALLINT, false, Type.LARGEINT);
        functionSet.addScalarAndVectorizedBuiltin("bitor", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.TINYINT, false, Type.TINYINT, Type.TINYINT);
        functionSet.addScalarAndVectorizedBuiltin("bitor", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.SMALLINT, false, Type.SMALLINT, Type.SMALLINT);
        functionSet.addScalarAndVectorizedBuiltin("bitor", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.INT, false, Type.INT, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("bitor", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.BIGINT, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("bitor", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.LARGEINT, false, Type.LARGEINT, Type.LARGEINT);
        functionSet.addScalarAndVectorizedBuiltin("bitxor", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.TINYINT, false, Type.TINYINT, Type.TINYINT);
        functionSet.addScalarAndVectorizedBuiltin("bitxor", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.SMALLINT, false, Type.SMALLINT, Type.SMALLINT);
        functionSet.addScalarAndVectorizedBuiltin("bitxor", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.INT, false, Type.INT, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("bitxor", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.BIGINT, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("bitxor", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.LARGEINT, false, Type.LARGEINT, Type.LARGEINT);
        functionSet.addScalarAndVectorizedBuiltin("bitnot", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.TINYINT, false, Type.TINYINT);
        functionSet.addScalarAndVectorizedBuiltin("bitnot", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.SMALLINT, false, Type.SMALLINT);
        functionSet.addScalarAndVectorizedBuiltin("bitnot", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.INT, false, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("bitnot", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("bitnot", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.LARGEINT, false, Type.LARGEINT);
        functionSet.addScalarAndVectorizedBuiltin("bit_shift_left", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.BIGINT, Type.TINYINT);
        functionSet.addScalarAndVectorizedBuiltin("bit_shift_right", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.BIGINT, Type.TINYINT);
        functionSet.addScalarAndVectorizedBuiltin("bit_test", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.TINYINT, true, Type.TINYINT, Type.TINYINT);
        functionSet.addScalarAndVectorizedBuiltin("bit_test_all", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.TINYINT, false, Type.TINYINT, Type.TINYINT);
        functionSet.addScalarAndVectorizedBuiltin("bit_test", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.TINYINT, true, Type.SMALLINT, Type.SMALLINT);
        functionSet.addScalarAndVectorizedBuiltin("bit_test_all", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.TINYINT, false, Type.SMALLINT, Type.SMALLINT);
        functionSet.addScalarAndVectorizedBuiltin("bit_test", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.TINYINT, true, Type.INT, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("bit_test_all", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.TINYINT, false, Type.INT, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("bit_test", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.TINYINT, true, Type.BIGINT, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("bit_test_all", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.TINYINT, false, Type.BIGINT, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("bit_test", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.TINYINT, true, Type.LARGEINT, Type.LARGEINT);
        functionSet.addScalarAndVectorizedBuiltin("bit_test_all", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.TINYINT, false, Type.LARGEINT, Type.LARGEINT);
    }
    private static void initStringBuiltins(FunctionSet functionSet) {
        functionSet.addScalarAndVectorizedBuiltin("decode_as_varchar", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, false, Type.SMALLINT);
        functionSet.addScalarAndVectorizedBuiltin("decode_as_varchar", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, false, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("decode_as_varchar", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, false, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("decode_as_varchar", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, false, Type.LARGEINT);
        functionSet.addScalarAndVectorizedBuiltin("encode_as_smallint", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.SMALLINT, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("encode_as_int", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.INT, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("encode_as_bigint", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("encode_as_largeint", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.LARGEINT, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("substr", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, false, Type.VARCHAR, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("substring", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, false, Type.VARCHAR, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("substr", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, false, Type.VARCHAR, Type.INT, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("substring", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, false, Type.VARCHAR, Type.INT, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("mask", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, true, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("mask_first_n", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("mask_first_n", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, Type.STRING, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("mask_last_n", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("mask_last_n", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, Type.STRING, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("strleft", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, false, Type.VARCHAR, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("left", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, false, Type.VARCHAR, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("strright", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, false, Type.VARCHAR, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("right", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, false, Type.VARCHAR, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("ends_with", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BOOLEAN, false, Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("starts_with", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BOOLEAN, false, Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("null_or_empty", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BOOLEAN, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("not_null_or_empty", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BOOLEAN, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("space", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, false, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("repeat", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.VARCHAR, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("lpad", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.VARCHAR, Type.INT, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("rpad", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.VARCHAR, Type.INT, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("append_trailing_char_if_absent", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("length", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.INT, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("crc32", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("bit_length", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.INT, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("char_length", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.INT, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("character_length", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.INT, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("lower", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("lcase", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("upper", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("ucase", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("quote", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("auto_partition_name", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, true, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("initcap", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("trim", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, false, Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("trim", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("ltrim", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("ltrim", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, false, Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("rtrim", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("rtrim", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, false, Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("ascii", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.INT, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("instr", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.INT, false, Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("locate", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.INT, false, Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("locate", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.INT, false, Type.VARCHAR, Type.VARCHAR, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("regexp_extract", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.VARCHAR, Type.VARCHAR, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("regexp_replace", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.VARCHAR, Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("regexp_replace_one", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.VARCHAR, Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("regexp_extract_all", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("concat", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, true, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("elt", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, true, Type.INT, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("elt", true, Function.NullableMode.ALWAYS_NULLABLE, Type.STRING, true, Type.INT, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("replace", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, false, Type.VARCHAR, Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("concat_ws", true, Function.NullableMode.CUSTOM, Type.VARCHAR, true, Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("concat_ws", true, Function.NullableMode.CUSTOM, Type.VARCHAR, false, Type.VARCHAR, new ArrayType(Type.VARCHAR));
        functionSet.addScalarAndVectorizedBuiltin("find_in_set", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.INT, false, Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("parse_url", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("parse_url", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.VARCHAR, Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("money_format", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, false, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("money_format", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, false, Type.LARGEINT);
        functionSet.addScalarAndVectorizedBuiltin("money_format", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, false, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("money_format", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, false, Type.MAX_DECIMALV2_TYPE);
        functionSet.addScalarAndVectorizedBuiltin("money_format", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, false, Type.DECIMAL32);
        functionSet.addScalarAndVectorizedBuiltin("money_format", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, false, Type.DECIMAL64);
        functionSet.addScalarAndVectorizedBuiltin("money_format", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, false, Type.DECIMAL128);
        functionSet.addScalarAndVectorizedBuiltin("split_by_string", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.VARCHAR), false, Type.STRING, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("split_by_regexp", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.VARCHAR), false, Type.STRING, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("split_by_regexp", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.VARCHAR), false, Type.STRING, Type.STRING, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("split_part", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.VARCHAR, Type.VARCHAR, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("substring_index", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, false, Type.VARCHAR, Type.VARCHAR, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("extract_url_parameter", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, false, Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("url_decode", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("random_bytes", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, false, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("sub_replace", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.VARCHAR, Type.VARCHAR, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("sub_replace", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.VARCHAR, Type.VARCHAR, Type.INT, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("char", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, true, Type.VARCHAR, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("strcmp", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.INT, false, Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("overlay", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, false, Type.VARCHAR, Type.INT, Type.INT, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("count_substrings", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.INT, false, Type.STRING, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("substr", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, Type.STRING, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("substring", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, Type.STRING, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("substr", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, Type.STRING, Type.INT, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("substring", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, Type.STRING, Type.INT, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("strleft", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, Type.STRING, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("left", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, Type.STRING, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("strright", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, Type.STRING, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("right", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, Type.STRING, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("ends_with", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BOOLEAN, false, Type.STRING, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("starts_with", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BOOLEAN, false, Type.STRING, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("null_or_empty", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BOOLEAN, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("not_null_or_empty", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BOOLEAN, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("space", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("repeat", true, Function.NullableMode.ALWAYS_NULLABLE, Type.STRING, false, Type.STRING, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("lpad", true, Function.NullableMode.ALWAYS_NULLABLE, Type.STRING, false, Type.STRING, Type.INT, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("rpad", true, Function.NullableMode.ALWAYS_NULLABLE, Type.STRING, false, Type.STRING, Type.INT, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("format_round", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("format_round", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, Type.LARGEINT);
        functionSet.addScalarAndVectorizedBuiltin("format_round", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, Type.DOUBLE, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("format_round", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, Type.DECIMAL32, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("format_round", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, Type.DECIMAL64, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("format_round", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, Type.DECIMAL128, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("append_trailing_char_if_absent", true, Function.NullableMode.ALWAYS_NULLABLE, Type.STRING, false, Type.STRING, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("length", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.INT, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("crc32", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("bit_length", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.INT, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("char_length", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.INT, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("character_length", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.INT, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("lower", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("lcase", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("upper", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("ucase", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("quote", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("trim", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("trim", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, Type.STRING, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("ltrim", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("ltrim", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, Type.STRING, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("rtrim", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("rtrim", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, Type.STRING, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("auto_partition_name", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, true, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("ascii", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.INT, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("instr", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.INT, false, Type.STRING, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("locate", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.INT, false, Type.STRING, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("locate", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.INT, false, Type.STRING, Type.STRING, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("regexp_extract", true, Function.NullableMode.ALWAYS_NULLABLE, Type.STRING, false, Type.STRING, Type.STRING, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("regexp_replace", true, Function.NullableMode.ALWAYS_NULLABLE, Type.STRING, false, Type.STRING, Type.STRING, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("regexp_replace_one", true, Function.NullableMode.ALWAYS_NULLABLE, Type.STRING, false, Type.STRING, Type.STRING, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("regexp_extract_all", true, Function.NullableMode.ALWAYS_NULLABLE, Type.STRING, false, Type.STRING, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("concat", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, true, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("replace", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, Type.STRING, Type.STRING, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("concat_ws", true, Function.NullableMode.CUSTOM, Type.STRING, true, Type.STRING, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("find_in_set", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.INT, false, Type.STRING, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("parse_url", true, Function.NullableMode.ALWAYS_NULLABLE, Type.STRING, false, Type.STRING, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("parse_url", true, Function.NullableMode.ALWAYS_NULLABLE, Type.STRING, false, Type.STRING, Type.STRING, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("money_format", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("money_format", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, Type.LARGEINT);
        functionSet.addScalarAndVectorizedBuiltin("money_format", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("money_format", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, Type.MAX_DECIMALV2_TYPE);
        functionSet.addScalarAndVectorizedBuiltin("money_format", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, Type.DECIMAL32);
        functionSet.addScalarAndVectorizedBuiltin("money_format", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, Type.DECIMAL64);
        functionSet.addScalarAndVectorizedBuiltin("money_format", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, Type.DECIMAL128);
        functionSet.addScalarAndVectorizedBuiltin("split_part", true, Function.NullableMode.ALWAYS_NULLABLE, Type.STRING, false, Type.STRING, Type.STRING, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("substring_index", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, Type.STRING, Type.STRING, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("url_decode", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("random_bytes", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("overlay", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, Type.STRING, Type.INT, Type.INT, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("strcmp", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.INT, false, Type.STRING, Type.STRING);
    }
    private static void initAesBuiltins(FunctionSet functionSet) {
        functionSet.addScalarAndVectorizedBuiltin("aes_encrypt", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.VARCHAR, Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("aes_decrypt", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.VARCHAR, Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("aes_encrypt", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.VARCHAR, Type.VARCHAR, Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("aes_decrypt", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.VARCHAR, Type.VARCHAR, Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("aes_encrypt", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.VARCHAR, Type.VARCHAR, Type.VARCHAR, Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("aes_decrypt", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.VARCHAR, Type.VARCHAR, Type.VARCHAR, Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("sm4_encrypt", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.VARCHAR, Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("sm4_decrypt", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.VARCHAR, Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("sm4_encrypt", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.VARCHAR, Type.VARCHAR, Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("sm4_decrypt", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.VARCHAR, Type.VARCHAR, Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("from_base64", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("aes_encrypt", true, Function.NullableMode.ALWAYS_NULLABLE, Type.STRING, false, Type.STRING, Type.STRING, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("aes_decrypt", true, Function.NullableMode.ALWAYS_NULLABLE, Type.STRING, false, Type.STRING, Type.STRING, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("aes_encrypt", true, Function.NullableMode.ALWAYS_NULLABLE, Type.STRING, false, Type.STRING, Type.STRING, Type.STRING, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("aes_decrypt", true, Function.NullableMode.ALWAYS_NULLABLE, Type.STRING, false, Type.STRING, Type.STRING, Type.STRING, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("aes_encrypt", true, Function.NullableMode.ALWAYS_NULLABLE, Type.STRING, false, Type.STRING, Type.STRING, Type.STRING, Type.STRING, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("aes_decrypt", true, Function.NullableMode.ALWAYS_NULLABLE, Type.STRING, false, Type.STRING, Type.STRING, Type.STRING, Type.STRING, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("sm4_encrypt", true, Function.NullableMode.ALWAYS_NULLABLE, Type.STRING, false, Type.STRING, Type.STRING, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("sm4_decrypt", true, Function.NullableMode.ALWAYS_NULLABLE, Type.STRING, false, Type.STRING, Type.STRING, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("sm4_encrypt", true, Function.NullableMode.ALWAYS_NULLABLE, Type.STRING, false, Type.STRING, Type.STRING, Type.STRING, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("sm4_decrypt", true, Function.NullableMode.ALWAYS_NULLABLE, Type.STRING, false, Type.STRING, Type.STRING, Type.STRING, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("from_base64", true, Function.NullableMode.ALWAYS_NULLABLE, Type.STRING, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("to_base64", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("to_base64", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, false, Type.VARCHAR);
    }
    private static void initUuidBuiltins(FunctionSet functionSet) {
        functionSet.addScalarAndVectorizedBuiltin("uuid", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.VARCHAR, false);
        functionSet.addScalarAndVectorizedBuiltin("uuid_numeric", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.LARGEINT, false);
        functionSet.addScalarAndVectorizedBuiltin("uuid_to_int", true, Function.NullableMode.ALWAYS_NULLABLE, Type.LARGEINT, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("uuid_to_int", true, Function.NullableMode.ALWAYS_NULLABLE, Type.LARGEINT, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("int_to_uuid", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, false, Type.LARGEINT);
    }
    private static void initConditionalBuiltins(FunctionSet functionSet) {
        functionSet.addScalarAndVectorizedBuiltin("if", true, Function.NullableMode.CUSTOM, Type.BOOLEAN, false, Type.BOOLEAN, Type.BOOLEAN, Type.BOOLEAN);
        functionSet.addScalarAndVectorizedBuiltin("if", true, Function.NullableMode.CUSTOM, Type.TINYINT, false, Type.BOOLEAN, Type.TINYINT, Type.TINYINT);
        functionSet.addScalarAndVectorizedBuiltin("if", true, Function.NullableMode.CUSTOM, Type.SMALLINT, false, Type.BOOLEAN, Type.SMALLINT, Type.SMALLINT);
        functionSet.addScalarAndVectorizedBuiltin("if", true, Function.NullableMode.CUSTOM, Type.INT, false, Type.BOOLEAN, Type.INT, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("if", true, Function.NullableMode.CUSTOM, Type.BIGINT, false, Type.BOOLEAN, Type.BIGINT, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("if", true, Function.NullableMode.CUSTOM, Type.LARGEINT, false, Type.BOOLEAN, Type.LARGEINT, Type.LARGEINT);
        functionSet.addScalarAndVectorizedBuiltin("if", true, Function.NullableMode.CUSTOM, Type.FLOAT, false, Type.BOOLEAN, Type.FLOAT, Type.FLOAT);
        functionSet.addScalarAndVectorizedBuiltin("if", true, Function.NullableMode.CUSTOM, Type.DOUBLE, false, Type.BOOLEAN, Type.DOUBLE, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("if", true, Function.NullableMode.CUSTOM, Type.DATETIME, false, Type.BOOLEAN, Type.DATETIME, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("if", true, Function.NullableMode.CUSTOM, Type.DATE, false, Type.BOOLEAN, Type.DATE, Type.DATE);
        functionSet.addScalarAndVectorizedBuiltin("if", true, Function.NullableMode.CUSTOM, Type.DATETIMEV2, false, Type.BOOLEAN, Type.DATETIMEV2, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("if", true, Function.NullableMode.CUSTOM, Type.DATEV2, false, Type.BOOLEAN, Type.DATEV2, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("if", true, Function.NullableMode.CUSTOM, Type.MAX_DECIMALV2_TYPE, false, Type.BOOLEAN, Type.MAX_DECIMALV2_TYPE, Type.MAX_DECIMALV2_TYPE);
        functionSet.addScalarAndVectorizedBuiltin("if", true, Function.NullableMode.CUSTOM, Type.DECIMAL32, false, Type.BOOLEAN, Type.DECIMAL32, Type.DECIMAL32);
        functionSet.addScalarAndVectorizedBuiltin("if", true, Function.NullableMode.CUSTOM, Type.DECIMAL64, false, Type.BOOLEAN, Type.DECIMAL64, Type.DECIMAL64);
        functionSet.addScalarAndVectorizedBuiltin("if", true, Function.NullableMode.CUSTOM, Type.DECIMAL128, false, Type.BOOLEAN, Type.DECIMAL128, Type.DECIMAL128);
        functionSet.addScalarAndVectorizedBuiltin("if", true, Function.NullableMode.CUSTOM, Type.BITMAP, false, Type.BOOLEAN, Type.BITMAP, Type.BITMAP);
        functionSet.addScalarAndVectorizedBuiltin("if", true, Function.NullableMode.CUSTOM, Type.HLL, false, Type.BOOLEAN, Type.HLL, Type.HLL);
        functionSet.addScalarAndVectorizedBuiltin("if", true, Function.NullableMode.CUSTOM, Type.JSONB, false, Type.BOOLEAN, Type.JSONB, Type.JSONB);
        functionSet.addScalarAndVectorizedBuiltin("if", true, Function.NullableMode.CUSTOM, Type.VARCHAR, false, Type.BOOLEAN, Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("if", true, Function.NullableMode.CUSTOM, Type.STRING, false, Type.BOOLEAN, Type.STRING, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("if", true, Function.NullableMode.CUSTOM, new ArrayType(Type.BOOLEAN), false, Type.BOOLEAN, new ArrayType(Type.BOOLEAN), new ArrayType(Type.BOOLEAN));
        functionSet.addScalarAndVectorizedBuiltin("if", true, Function.NullableMode.CUSTOM, new ArrayType(Type.TINYINT), false, Type.BOOLEAN, new ArrayType(Type.TINYINT), new ArrayType(Type.TINYINT));
        functionSet.addScalarAndVectorizedBuiltin("if", true, Function.NullableMode.CUSTOM, new ArrayType(Type.SMALLINT), false, Type.BOOLEAN, new ArrayType(Type.SMALLINT), new ArrayType(Type.SMALLINT));
        functionSet.addScalarAndVectorizedBuiltin("if", true, Function.NullableMode.CUSTOM, new ArrayType(Type.INT), false, Type.BOOLEAN, new ArrayType(Type.INT), new ArrayType(Type.INT));
        functionSet.addScalarAndVectorizedBuiltin("if", true, Function.NullableMode.CUSTOM, new ArrayType(Type.BIGINT), false, Type.BOOLEAN, new ArrayType(Type.BIGINT), new ArrayType(Type.BIGINT));
        functionSet.addScalarAndVectorizedBuiltin("if", true, Function.NullableMode.CUSTOM, new ArrayType(Type.LARGEINT), false, Type.BOOLEAN, new ArrayType(Type.LARGEINT), new ArrayType(Type.LARGEINT));
        functionSet.addScalarAndVectorizedBuiltin("if", true, Function.NullableMode.CUSTOM, new ArrayType(Type.FLOAT), false, Type.BOOLEAN, new ArrayType(Type.FLOAT), new ArrayType(Type.FLOAT));
        functionSet.addScalarAndVectorizedBuiltin("if", true, Function.NullableMode.CUSTOM, new ArrayType(Type.DOUBLE), false, Type.BOOLEAN, new ArrayType(Type.DOUBLE), new ArrayType(Type.DOUBLE));
        functionSet.addScalarAndVectorizedBuiltin("if", true, Function.NullableMode.CUSTOM, new ArrayType(Type.DATETIME), false, Type.BOOLEAN, new ArrayType(Type.DATETIME), new ArrayType(Type.DATETIME));
        functionSet.addScalarAndVectorizedBuiltin("if", true, Function.NullableMode.CUSTOM, new ArrayType(Type.DATE), false, Type.BOOLEAN, new ArrayType(Type.DATE), new ArrayType(Type.DATE));
        functionSet.addScalarAndVectorizedBuiltin("if", true, Function.NullableMode.CUSTOM, new ArrayType(Type.DATETIMEV2), false, Type.BOOLEAN, new ArrayType(Type.DATETIMEV2), new ArrayType(Type.DATETIMEV2));
        functionSet.addScalarAndVectorizedBuiltin("if", true, Function.NullableMode.CUSTOM, new ArrayType(Type.DATEV2), false, Type.BOOLEAN, new ArrayType(Type.DATEV2), new ArrayType(Type.DATEV2));
        functionSet.addScalarAndVectorizedBuiltin("if", true, Function.NullableMode.CUSTOM, new ArrayType(Type.MAX_DECIMALV2_TYPE), false, Type.BOOLEAN, new ArrayType(Type.MAX_DECIMALV2_TYPE), new ArrayType(Type.MAX_DECIMALV2_TYPE));
        functionSet.addScalarAndVectorizedBuiltin("if", true, Function.NullableMode.CUSTOM, new ArrayType(Type.VARCHAR), false, Type.BOOLEAN, new ArrayType(Type.VARCHAR), new ArrayType(Type.VARCHAR));
        functionSet.addScalarAndVectorizedBuiltin("if", true, Function.NullableMode.CUSTOM, new ArrayType(Type.STRING), false, Type.BOOLEAN, new ArrayType(Type.STRING), new ArrayType(Type.STRING));
        functionSet.addScalarAndVectorizedBuiltin("nullif", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BOOLEAN, false, Type.BOOLEAN, Type.BOOLEAN);
        functionSet.addScalarAndVectorizedBuiltin("nullif", true, Function.NullableMode.ALWAYS_NULLABLE, Type.TINYINT, false, Type.TINYINT, Type.TINYINT);
        functionSet.addScalarAndVectorizedBuiltin("nullif", true, Function.NullableMode.ALWAYS_NULLABLE, Type.SMALLINT, false, Type.SMALLINT, Type.SMALLINT);
        functionSet.addScalarAndVectorizedBuiltin("nullif", true, Function.NullableMode.ALWAYS_NULLABLE, Type.INT, false, Type.INT, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("nullif", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BIGINT, false, Type.BIGINT, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("nullif", true, Function.NullableMode.ALWAYS_NULLABLE, Type.LARGEINT, false, Type.LARGEINT, Type.LARGEINT);
        functionSet.addScalarAndVectorizedBuiltin("nullif", true, Function.NullableMode.ALWAYS_NULLABLE, Type.FLOAT, false, Type.FLOAT, Type.FLOAT);
        functionSet.addScalarAndVectorizedBuiltin("nullif", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DOUBLE, false, Type.DOUBLE, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("nullif", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIME, false, Type.DATETIME, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("nullif", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATE, false, Type.DATE, Type.DATE);
        functionSet.addScalarAndVectorizedBuiltin("nullif", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("nullif", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DATEV2, false, Type.DATEV2, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("nullif", true, Function.NullableMode.ALWAYS_NULLABLE, Type.MAX_DECIMALV2_TYPE, false, Type.MAX_DECIMALV2_TYPE, Type.MAX_DECIMALV2_TYPE);
        functionSet.addScalarAndVectorizedBuiltin("nullif", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DECIMAL32, false, Type.DECIMAL32, Type.DECIMAL32);
        functionSet.addScalarAndVectorizedBuiltin("nullif", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DECIMAL64, false, Type.DECIMAL64, Type.DECIMAL64);
        functionSet.addScalarAndVectorizedBuiltin("nullif", true, Function.NullableMode.ALWAYS_NULLABLE, Type.DECIMAL128, false, Type.DECIMAL128, Type.DECIMAL128);
        functionSet.addScalarAndVectorizedBuiltin("nullif", true, Function.NullableMode.ALWAYS_NULLABLE, Type.VARCHAR, false, Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("nullif", true, Function.NullableMode.ALWAYS_NULLABLE, Type.STRING, false, Type.STRING, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("is_null_pred", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BOOLEAN, true, new TemplateType("T"));
        functionSet.addScalarAndVectorizedBuiltin("is_not_null_pred", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BOOLEAN, true, new TemplateType("T"));
        functionSet.addScalarAndVectorizedBuiltin("ifnull", true, Function.NullableMode.CUSTOM, Type.BOOLEAN, false, Type.BOOLEAN, Type.BOOLEAN);
        functionSet.addScalarAndVectorizedBuiltin("nvl", true, Function.NullableMode.CUSTOM, Type.BOOLEAN, false, Type.BOOLEAN, Type.BOOLEAN);
        functionSet.addScalarAndVectorizedBuiltin("ifnull", true, Function.NullableMode.CUSTOM, Type.TINYINT, false, Type.TINYINT, Type.TINYINT);
        functionSet.addScalarAndVectorizedBuiltin("nvl", true, Function.NullableMode.CUSTOM, Type.TINYINT, false, Type.TINYINT, Type.TINYINT);
        functionSet.addScalarAndVectorizedBuiltin("ifnull", true, Function.NullableMode.CUSTOM, Type.SMALLINT, false, Type.SMALLINT, Type.SMALLINT);
        functionSet.addScalarAndVectorizedBuiltin("nvl", true, Function.NullableMode.CUSTOM, Type.SMALLINT, false, Type.SMALLINT, Type.SMALLINT);
        functionSet.addScalarAndVectorizedBuiltin("ifnull", true, Function.NullableMode.CUSTOM, Type.INT, false, Type.INT, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("nvl", true, Function.NullableMode.CUSTOM, Type.INT, false, Type.INT, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("ifnull", true, Function.NullableMode.CUSTOM, Type.BIGINT, false, Type.BIGINT, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("nvl", true, Function.NullableMode.CUSTOM, Type.BIGINT, false, Type.BIGINT, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("ifnull", true, Function.NullableMode.CUSTOM, Type.LARGEINT, false, Type.LARGEINT, Type.LARGEINT);
        functionSet.addScalarAndVectorizedBuiltin("nvl", true, Function.NullableMode.CUSTOM, Type.LARGEINT, false, Type.LARGEINT, Type.LARGEINT);
        functionSet.addScalarAndVectorizedBuiltin("ifnull", true, Function.NullableMode.CUSTOM, Type.FLOAT, false, Type.FLOAT, Type.FLOAT);
        functionSet.addScalarAndVectorizedBuiltin("nvl", true, Function.NullableMode.CUSTOM, Type.FLOAT, false, Type.FLOAT, Type.FLOAT);
        functionSet.addScalarAndVectorizedBuiltin("ifnull", true, Function.NullableMode.CUSTOM, Type.DOUBLE, false, Type.DOUBLE, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("nvl", true, Function.NullableMode.CUSTOM, Type.DOUBLE, false, Type.DOUBLE, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("ifnull", true, Function.NullableMode.CUSTOM, Type.DATE, false, Type.DATE, Type.DATE);
        functionSet.addScalarAndVectorizedBuiltin("nvl", true, Function.NullableMode.CUSTOM, Type.DATE, false, Type.DATE, Type.DATE);
        functionSet.addScalarAndVectorizedBuiltin("ifnull", true, Function.NullableMode.CUSTOM, Type.DATETIME, false, Type.DATETIME, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("nvl", true, Function.NullableMode.CUSTOM, Type.DATETIME, false, Type.DATETIME, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("ifnull", true, Function.NullableMode.CUSTOM, Type.DATETIME, false, Type.DATE, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("nvl", true, Function.NullableMode.CUSTOM, Type.DATETIME, false, Type.DATE, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("ifnull", true, Function.NullableMode.CUSTOM, Type.DATETIME, false, Type.DATETIME, Type.DATE);
        functionSet.addScalarAndVectorizedBuiltin("nvl", true, Function.NullableMode.CUSTOM, Type.DATETIME, false, Type.DATETIME, Type.DATE);
        functionSet.addScalarAndVectorizedBuiltin("ifnull", true, Function.NullableMode.CUSTOM, Type.DATEV2, false, Type.DATEV2, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("nvl", true, Function.NullableMode.CUSTOM, Type.DATEV2, false, Type.DATEV2, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("ifnull", true, Function.NullableMode.CUSTOM, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("nvl", true, Function.NullableMode.CUSTOM, Type.DATETIMEV2, false, Type.DATETIMEV2, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("ifnull", true, Function.NullableMode.CUSTOM, Type.MAX_DECIMALV2_TYPE, false, Type.MAX_DECIMALV2_TYPE, Type.MAX_DECIMALV2_TYPE);
        functionSet.addScalarAndVectorizedBuiltin("nvl", true, Function.NullableMode.CUSTOM, Type.MAX_DECIMALV2_TYPE, false, Type.MAX_DECIMALV2_TYPE, Type.MAX_DECIMALV2_TYPE);
        functionSet.addScalarAndVectorizedBuiltin("ifnull", true, Function.NullableMode.CUSTOM, Type.DECIMAL32, false, Type.DECIMAL32, Type.DECIMAL32);
        functionSet.addScalarAndVectorizedBuiltin("nvl", true, Function.NullableMode.CUSTOM, Type.DECIMAL32, false, Type.DECIMAL32, Type.DECIMAL32);
        functionSet.addScalarAndVectorizedBuiltin("ifnull", true, Function.NullableMode.CUSTOM, Type.DECIMAL64, false, Type.DECIMAL64, Type.DECIMAL64);
        functionSet.addScalarAndVectorizedBuiltin("nvl", true, Function.NullableMode.CUSTOM, Type.DECIMAL64, false, Type.DECIMAL64, Type.DECIMAL64);
        functionSet.addScalarAndVectorizedBuiltin("ifnull", true, Function.NullableMode.CUSTOM, Type.DECIMAL128, false, Type.DECIMAL128, Type.DECIMAL128);
        functionSet.addScalarAndVectorizedBuiltin("nvl", true, Function.NullableMode.CUSTOM, Type.DECIMAL128, false, Type.DECIMAL128, Type.DECIMAL128);
        functionSet.addScalarAndVectorizedBuiltin("ifnull", true, Function.NullableMode.CUSTOM, Type.BITMAP, false, Type.BITMAP, Type.BITMAP);
        functionSet.addScalarAndVectorizedBuiltin("nvl", true, Function.NullableMode.CUSTOM, Type.BITMAP, false, Type.BITMAP, Type.BITMAP);
        functionSet.addScalarAndVectorizedBuiltin("ifnull", true, Function.NullableMode.CUSTOM, Type.VARCHAR, false, Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("nvl", true, Function.NullableMode.CUSTOM, Type.VARCHAR, false, Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("ifnull", true, Function.NullableMode.CUSTOM, Type.STRING, false, Type.STRING, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("nvl", true, Function.NullableMode.CUSTOM, Type.STRING, false, Type.STRING, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("coalesce", true, Function.NullableMode.CUSTOM, Type.BOOLEAN, true, Type.BOOLEAN);
        functionSet.addScalarAndVectorizedBuiltin("coalesce", true, Function.NullableMode.CUSTOM, Type.TINYINT, true, Type.TINYINT);
        functionSet.addScalarAndVectorizedBuiltin("coalesce", true, Function.NullableMode.CUSTOM, Type.SMALLINT, true, Type.SMALLINT);
        functionSet.addScalarAndVectorizedBuiltin("coalesce", true, Function.NullableMode.CUSTOM, Type.INT, true, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("coalesce", true, Function.NullableMode.CUSTOM, Type.BIGINT, true, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("coalesce", true, Function.NullableMode.CUSTOM, Type.LARGEINT, true, Type.LARGEINT);
        functionSet.addScalarAndVectorizedBuiltin("coalesce", true, Function.NullableMode.CUSTOM, Type.FLOAT, true, Type.FLOAT);
        functionSet.addScalarAndVectorizedBuiltin("coalesce", true, Function.NullableMode.CUSTOM, Type.DOUBLE, true, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("coalesce", true, Function.NullableMode.CUSTOM, Type.DATETIME, true, Type.DATETIME);
        functionSet.addScalarAndVectorizedBuiltin("coalesce", true, Function.NullableMode.CUSTOM, Type.DATE, true, Type.DATE);
        functionSet.addScalarAndVectorizedBuiltin("coalesce", true, Function.NullableMode.CUSTOM, Type.DATETIMEV2, true, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("coalesce", true, Function.NullableMode.CUSTOM, Type.DATEV2, true, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("coalesce", true, Function.NullableMode.CUSTOM, Type.MAX_DECIMALV2_TYPE, true, Type.MAX_DECIMALV2_TYPE);
        functionSet.addScalarAndVectorizedBuiltin("coalesce", true, Function.NullableMode.CUSTOM, Type.DECIMAL32, true, Type.DECIMAL32);
        functionSet.addScalarAndVectorizedBuiltin("coalesce", true, Function.NullableMode.CUSTOM, Type.DECIMAL64, true, Type.DECIMAL64);
        functionSet.addScalarAndVectorizedBuiltin("coalesce", true, Function.NullableMode.CUSTOM, Type.DECIMAL128, true, Type.DECIMAL128);
        functionSet.addScalarAndVectorizedBuiltin("coalesce", true, Function.NullableMode.CUSTOM, Type.BITMAP, true, Type.BITMAP);
        functionSet.addScalarAndVectorizedBuiltin("coalesce", true, Function.NullableMode.CUSTOM, Type.VARCHAR, true, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("coalesce", true, Function.NullableMode.CUSTOM, Type.STRING, true, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("esquery", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BOOLEAN, false, Type.BOOLEAN, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("esquery", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BOOLEAN, false, Type.TINYINT, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("esquery", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BOOLEAN, false, Type.SMALLINT, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("esquery", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BOOLEAN, false, Type.INT, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("esquery", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BOOLEAN, false, Type.BIGINT, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("esquery", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BOOLEAN, false, Type.LARGEINT, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("esquery", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BOOLEAN, false, Type.FLOAT, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("esquery", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BOOLEAN, false, Type.DOUBLE, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("esquery", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BOOLEAN, false, Type.DATE, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("esquery", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BOOLEAN, false, Type.DATETIME, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("esquery", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BOOLEAN, false, Type.CHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("esquery", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BOOLEAN, false, Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("esquery", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BOOLEAN, false, Type.JSONB, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("esquery", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BOOLEAN, false, Type.MAX_DECIMALV2_TYPE, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("esquery", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BOOLEAN, false, Type.DECIMAL32, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("esquery", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BOOLEAN, false, Type.DECIMAL64, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("esquery", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BOOLEAN, false, Type.DECIMAL128, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("esquery", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BOOLEAN, false, Type.TIME, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("esquery", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BOOLEAN, false, Type.DATEV2, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("esquery", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BOOLEAN, false, Type.DATETIMEV2, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("esquery", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BOOLEAN, false, Type.TIMEV2, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("esquery", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BOOLEAN, false, new ArrayType(new TemplateType("T")), Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("esquery", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BOOLEAN, false, Type.MAP, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("esquery", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BOOLEAN, false, Type.STRING, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("esquery", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BOOLEAN, false, Type.VARIANT, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("g", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BOOLEAN, false, Type.VARCHAR);
    }
    private static void initBitmapBuiltins(FunctionSet functionSet) {
        functionSet.addScalarAndVectorizedBuiltin("to_bitmap", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BITMAP, false, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("to_bitmap", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BITMAP, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("to_bitmap", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BITMAP, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("to_bitmap_with_check", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BITMAP, false, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("to_bitmap_with_check", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BITMAP, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("to_bitmap_with_check", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BITMAP, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("bitmap_hash", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BITMAP, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("bitmap_hash64", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BITMAP, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("bitmap_hash", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BITMAP, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("bitmap_hash64", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BITMAP, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("bitmap_count", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BIGINT, false, Type.BITMAP);
        functionSet.addScalarAndVectorizedBuiltin("bitmap_and_not_count", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.BITMAP, Type.BITMAP);
        functionSet.addScalarAndVectorizedBuiltin("bitmap_andnot_count", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.BITMAP, Type.BITMAP);
        functionSet.addScalarAndVectorizedBuiltin("bitmap_empty", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BITMAP, false);
        functionSet.addScalarAndVectorizedBuiltin("bitmap_or", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BITMAP, true, Type.BITMAP, Type.BITMAP);
        functionSet.addScalarAndVectorizedBuiltin("bitmap_or", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BITMAP, false, Type.BITMAP, Type.BITMAP);
        functionSet.addScalarAndVectorizedBuiltin("bitmap_xor", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BITMAP, true, Type.BITMAP, Type.BITMAP);
        functionSet.addScalarAndVectorizedBuiltin("bitmap_xor", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BITMAP, false, Type.BITMAP, Type.BITMAP);
        functionSet.addScalarAndVectorizedBuiltin("bitmap_xor_count", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, true, Type.BITMAP, Type.BITMAP);
        functionSet.addScalarAndVectorizedBuiltin("bitmap_xor_count", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.BITMAP, Type.BITMAP);
        functionSet.addScalarAndVectorizedBuiltin("bitmap_not", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BITMAP, false, Type.BITMAP, Type.BITMAP);
        functionSet.addScalarAndVectorizedBuiltin("bitmap_and", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BITMAP, true, Type.BITMAP, Type.BITMAP);
        functionSet.addScalarAndVectorizedBuiltin("bitmap_and", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BITMAP, false, Type.BITMAP, Type.BITMAP);
        functionSet.addScalarAndVectorizedBuiltin("bitmap_and_not", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BITMAP, false, Type.BITMAP, Type.BITMAP);
        functionSet.addScalarAndVectorizedBuiltin("bitmap_andnot", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BITMAP, false, Type.BITMAP, Type.BITMAP);
        functionSet.addScalarAndVectorizedBuiltin("bitmap_to_string", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, Type.BITMAP);
        functionSet.addScalarAndVectorizedBuiltin("bitmap_from_string", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BITMAP, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("bitmap_from_string", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BITMAP, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("bitmap_to_base64", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, Type.BITMAP);
        functionSet.addScalarAndVectorizedBuiltin("bitmap_from_base64", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BITMAP, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("bitmap_from_base64", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BITMAP, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("bitmap_from_array", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BITMAP, false, new ArrayType(Type.TINYINT));
        functionSet.addScalarAndVectorizedBuiltin("bitmap_from_array", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BITMAP, false, new ArrayType(Type.SMALLINT));
        functionSet.addScalarAndVectorizedBuiltin("bitmap_from_array", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BITMAP, false, new ArrayType(Type.INT));
        functionSet.addScalarAndVectorizedBuiltin("bitmap_from_array", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BITMAP, false, new ArrayType(Type.BIGINT));
        functionSet.addScalarAndVectorizedBuiltin("bitmap_contains", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BOOLEAN, false, Type.BITMAP, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("bitmap_remove", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BITMAP, false, Type.BITMAP, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("bitmap_has_any", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BOOLEAN, false, Type.BITMAP, Type.BITMAP);
        functionSet.addScalarAndVectorizedBuiltin("bitmap_has_all", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BOOLEAN, false, Type.BITMAP, Type.BITMAP);
        functionSet.addScalarAndVectorizedBuiltin("bitmap_min", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BIGINT, false, Type.BITMAP);
        functionSet.addScalarAndVectorizedBuiltin("bitmap_max", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BIGINT, false, Type.BITMAP);
        functionSet.addScalarAndVectorizedBuiltin("bitmap_subset_in_range", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BITMAP, false, Type.BITMAP, Type.BIGINT, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("bitmap_subset_limit", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BITMAP, false, Type.BITMAP, Type.BIGINT, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("bitmap_and_count", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, true, Type.BITMAP, Type.BITMAP);
        functionSet.addScalarAndVectorizedBuiltin("bitmap_and_count", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.BITMAP, Type.BITMAP);
        functionSet.addScalarAndVectorizedBuiltin("bitmap_or_count", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, true, Type.BITMAP, Type.BITMAP);
        functionSet.addScalarAndVectorizedBuiltin("bitmap_or_count", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BIGINT, false, Type.BITMAP, Type.BITMAP);
        functionSet.addScalarAndVectorizedBuiltin("sub_bitmap", true, Function.NullableMode.ALWAYS_NULLABLE, Type.BITMAP, false, Type.BITMAP, Type.BIGINT, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("bitmap_to_array", true, Function.NullableMode.DEPEND_ON_ARGUMENT, new ArrayType(Type.BIGINT), false, Type.BITMAP);
    }
    private static void initHllBuiltins(FunctionSet functionSet) {
        functionSet.addScalarAndVectorizedBuiltin("hll_cardinality", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BIGINT, false, Type.HLL);
        functionSet.addScalarAndVectorizedBuiltin("hll_empty", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.HLL, false);
        functionSet.addScalarAndVectorizedBuiltin("hll_from_base64", true, Function.NullableMode.ALWAYS_NULLABLE, Type.HLL, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("hll_from_base64", true, Function.NullableMode.ALWAYS_NULLABLE, Type.HLL, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("hll_hash", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.HLL, false, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("hll_hash", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.HLL, false, Type.STRING);
        functionSet.addScalarAndVectorizedBuiltin("hll_to_base64", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.STRING, false, Type.HLL);
    }
    private static void initUtilityBuiltins(FunctionSet functionSet) {
        functionSet.addScalarAndVectorizedBuiltin("convert_to", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.VARCHAR, false, Type.VARCHAR, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("sleep", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.BOOLEAN, false, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("version", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.VARCHAR, false);
        functionSet.addScalarAndVectorizedBuiltin("field", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.INT, true, Type.TINYINT);
        functionSet.addScalarAndVectorizedBuiltin("field", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.INT, true, Type.SMALLINT);
        functionSet.addScalarAndVectorizedBuiltin("field", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.INT, true, Type.INT);
        functionSet.addScalarAndVectorizedBuiltin("field", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.INT, true, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("field", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.INT, true, Type.LARGEINT);
        functionSet.addScalarAndVectorizedBuiltin("field", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.INT, true, Type.FLOAT);
        functionSet.addScalarAndVectorizedBuiltin("field", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.INT, true, Type.DOUBLE);
        functionSet.addScalarAndVectorizedBuiltin("field", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.INT, true, Type.MAX_DECIMALV2_TYPE);
        functionSet.addScalarAndVectorizedBuiltin("field", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.INT, true, Type.DATEV2);
        functionSet.addScalarAndVectorizedBuiltin("field", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.INT, true, Type.DATETIMEV2);
        functionSet.addScalarAndVectorizedBuiltin("field", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.INT, true, Type.VARCHAR);
        functionSet.addScalarAndVectorizedBuiltin("field", true, Function.NullableMode.DEPEND_ON_ARGUMENT, Type.INT, true, Type.STRING);
    }
    private static void initGroupingBuiltins(FunctionSet functionSet) {
        functionSet.addScalarAndVectorizedBuiltin("grouping_id", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BIGINT, false, Type.BIGINT);
        functionSet.addScalarAndVectorizedBuiltin("grouping", true, Function.NullableMode.ALWAYS_NOT_NULLABLE, Type.BIGINT, false, Type.BIGINT);
    }
}