#!/usr/bin/env python
# encoding: utf-8

# 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 file is copied from
# https://github.com/apache/impala/blob/branch-2.9.0/common/function-registry/impala_functions.py
# and modified by Doris

# This is a list of all the functions that are not auto-generated.
# It contains all the meta data that describes the function.

# The format is:
#   [sql aliases], <return_type>, [<args>], <nullable mode>, [template_types]
#
# 'sql aliases' are the function names that can be used from sql. There must be at least
# one per function.
#
# 'nullable mode' reflects whether the return value of the function is null. See @Function.NullableMode
# for the specific mode and meaning.
#
# 'template_types' is for template function just like C++. It is optional list.
# eg. [['element_at', '%element_extract%'], 'V', ['MAP<K, V>', 'K'], 'ALWAYS_NULLABLE', ['K', 'V']],
#     'K' and 'V' is type template and will be specialized at runtime in FE to match specific args.
#
# 'template_types' support variadic template is now support variadic template.
# eg. [['struct'], 'STRUCT<TYPES>', ['TYPES'], 'ALWAYS_NOT_NULLABLE', ['TYPES...']],
#     Inspired by C++ std::vector::emplace_back() function. 'TYPES...' is variadic template and will
#     be expanded to normal templates at runtime in FE to match variadic args. Please ensure that the
#     variadic template is placed at the last position of all templates.
visible_functions = {
    # Bit and Byte functions
    # For functions corresponding to builtin operators, we can reuse the implementations
    "bit" :[
        [['bitand'], 'TINYINT', ['TINYINT', 'TINYINT'], ''],
        [['bitand'], 'SMALLINT', ['SMALLINT', 'SMALLINT'], ''],
        [['bitand'], 'INT', ['INT', 'INT'], ''],
        [['bitand'], 'BIGINT', ['BIGINT', 'BIGINT'], ''],
        [['bitand'], 'LARGEINT', ['LARGEINT', 'LARGEINT'], ''],

        [['bitor'], 'TINYINT', ['TINYINT', 'TINYINT'], ''],
        [['bitor'], 'SMALLINT', ['SMALLINT', 'SMALLINT'], ''],
        [['bitor'], 'INT', ['INT', 'INT'], ''],
        [['bitor'], 'BIGINT', ['BIGINT', 'BIGINT'], ''],
        [['bitor'], 'LARGEINT', ['LARGEINT', 'LARGEINT'], ''],

        [['bitxor'], 'TINYINT', ['TINYINT', 'TINYINT'], ''],
        [['bitxor'], 'SMALLINT', ['SMALLINT', 'SMALLINT'], ''],
        [['bitxor'], 'INT', ['INT', 'INT'], ''],
        [['bitxor'], 'BIGINT', ['BIGINT', 'BIGINT'], ''],
        [['bitxor'], 'LARGEINT', ['LARGEINT', 'LARGEINT'], ''],

        [['bitnot'], 'TINYINT', ['TINYINT'], ''],
        [['bitnot'], 'SMALLINT', ['SMALLINT'], ''],
        [['bitnot'], 'INT', ['INT'], ''],
        [['bitnot'], 'BIGINT', ['BIGINT'], ''],
        [['bitnot'], 'LARGEINT', ['LARGEINT'], '']
    ],

    # map functions
    "map": [
        [['map'], 'MAP<K, V>', ['K', 'V', '...'], 'ALWAYS_NOT_NULLABLE', ['K', 'V']],
        [['element_at', '%element_extract%'], 'V', ['MAP<K, V>', 'K'], 'ALWAYS_NULLABLE', ['K', 'V']],
        [['size', 'map_size'], 'BIGINT', ['MAP<K, V>'], '', ['K', 'V']],
        [['map_contains_key'], 'BOOLEAN', ['MAP<K, V>', 'K'], 'ALWAYS_NULLABLE', ['K', 'V']],
        [['map_contains_value'], 'BOOLEAN', ['MAP<K, V>', 'V'], 'ALWAYS_NULLABLE', ['K', 'V']],
        #[['map_contains_key_like'], 'BOOLEAN', ['MAP<K, V>', 'K'], '', ['K', 'V']],
        [['map_keys'], 'ARRAY<K>', ['MAP<K, V>'], '', ['K', 'V']],
        [['map_values'], 'ARRAY<V>', ['MAP<K, V>'], '', ['K', 'V']],
    ],

    # struct functions
    "struct": [
        [['struct'], 'STRUCT<TYPES>', ['TYPES'], 'ALWAYS_NOT_NULLABLE', ['TYPES...']],
        [['named_struct'], 'ANY_STRUCT_TYPE', ['TYPES'], 'ALWAYS_NOT_NULLABLE', ['TYPES...']],
        [['struct_element'], 'ANY_ELEMENT_TYPE', ['ANY_STRUCT_TYPE', 'INT'], 'ALWAYS_NULLABLE', ['TYPES...']],
        [['struct_element'], 'ANY_ELEMENT_TYPE', ['ANY_STRUCT_TYPE', 'VARCHAR'], 'ALWAYS_NULLABLE', ['TYPES...']]
    ],

    # array functions
    "array": [
        [['array'], 'ARRAY', ['BOOLEAN', '...'], 'ALWAYS_NOT_NULLABLE'],
        [['array'], 'ARRAY', ['TINYINT', '...'], 'ALWAYS_NOT_NULLABLE'],
        [['array'], 'ARRAY', ['SMALLINT', '...'], 'ALWAYS_NOT_NULLABLE'],
        [['array'], 'ARRAY', ['INT', '...'], 'ALWAYS_NOT_NULLABLE'],
        [['array'], 'ARRAY', ['BIGINT', '...'], 'ALWAYS_NOT_NULLABLE'],
        [['array'], 'ARRAY', ['LARGEINT', '...'], 'ALWAYS_NOT_NULLABLE'],
        [['array'], 'ARRAY', ['DATETIME', '...'], 'ALWAYS_NOT_NULLABLE'],
        [['array'], 'ARRAY', ['DATE', '...'], 'ALWAYS_NOT_NULLABLE'],
        [['array'], 'ARRAY', ['DATETIMEV2', '...'], 'ALWAYS_NOT_NULLABLE'],
        [['array'], 'ARRAY', ['DATEV2', '...'], 'ALWAYS_NOT_NULLABLE'],
        [['array'], 'ARRAY', ['FLOAT', '...'], 'ALWAYS_NOT_NULLABLE'],
        [['array'], 'ARRAY', ['DOUBLE', '...'], 'ALWAYS_NOT_NULLABLE'],
        [['array'], 'ARRAY', ['DECIMALV2', '...'], 'ALWAYS_NOT_NULLABLE'],
        [['array'], 'ARRAY', ['DECIMAL32', '...'], 'ALWAYS_NOT_NULLABLE'],
        [['array'], 'ARRAY', ['DECIMAL64', '...'], 'ALWAYS_NOT_NULLABLE'],
        [['array'], 'ARRAY', ['DECIMAL128', '...'], 'ALWAYS_NOT_NULLABLE'],
        [['array'], 'ARRAY', ['VARCHAR', '...'], 'ALWAYS_NOT_NULLABLE'],
        [['array'], 'ARRAY', ['STRING', '...'], 'ALWAYS_NOT_NULLABLE'],

        [['element_at', '%element_extract%'], 'BOOLEAN', ['ARRAY_BOOLEAN', 'BIGINT'], 'ALWAYS_NULLABLE'],
        [['element_at', '%element_extract%'], 'TINYINT', ['ARRAY_TINYINT', 'BIGINT'], 'ALWAYS_NULLABLE'],
        [['element_at', '%element_extract%'], 'SMALLINT', ['ARRAY_SMALLINT', 'BIGINT'], 'ALWAYS_NULLABLE'],
        [['element_at', '%element_extract%'], 'INT', ['ARRAY_INT', 'BIGINT'], 'ALWAYS_NULLABLE'],
        [['element_at', '%element_extract%'], 'BIGINT', ['ARRAY_BIGINT', 'BIGINT'], 'ALWAYS_NULLABLE'],
        [['element_at', '%element_extract%'], 'LARGEINT', ['ARRAY_LARGEINT', 'BIGINT'], 'ALWAYS_NULLABLE'],
        [['element_at', '%element_extract%'], 'DATETIME', ['ARRAY_DATETIME', 'BIGINT'], 'ALWAYS_NULLABLE'],
        [['element_at', '%element_extract%'], 'DATE', ['ARRAY_DATE', 'BIGINT'], 'ALWAYS_NULLABLE'],
        [['element_at', '%element_extract%'], 'DATETIMEV2', ['ARRAY_DATETIMEV2', 'BIGINT'], 'ALWAYS_NULLABLE'],
        [['element_at', '%element_extract%'], 'DATEV2', ['ARRAY_DATEV2', 'BIGINT'], 'ALWAYS_NULLABLE'],
        [['element_at', '%element_extract%'], 'FLOAT', ['ARRAY_FLOAT', 'BIGINT'], 'ALWAYS_NULLABLE'],
        [['element_at', '%element_extract%'], 'DOUBLE', ['ARRAY_DOUBLE', 'BIGINT'], 'ALWAYS_NULLABLE'],
        [['element_at', '%element_extract%'], 'DECIMALV2', ['ARRAY_DECIMALV2', 'BIGINT'], 'ALWAYS_NULLABLE'],
        [['element_at', '%element_extract%'], 'DECIMAL32', ['ARRAY_DECIMAL32', 'BIGINT'], 'ALWAYS_NULLABLE'],
        [['element_at', '%element_extract%'], 'DECIMAL64', ['ARRAY_DECIMAL64', 'BIGINT'], 'ALWAYS_NULLABLE'],
        [['element_at', '%element_extract%'], 'DECIMAL128', ['ARRAY_DECIMAL128', 'BIGINT'], 'ALWAYS_NULLABLE'],
        [['element_at', '%element_extract%'], 'VARCHAR', ['ARRAY_VARCHAR', 'BIGINT'], 'ALWAYS_NULLABLE'],
        [['element_at', '%element_extract%'], 'STRING', ['ARRAY_STRING', 'BIGINT'], 'ALWAYS_NULLABLE'],

        [['arrays_overlap'], 'BOOLEAN', ['ARRAY_BOOLEAN', 'ARRAY_BOOLEAN'], 'ALWAYS_NULLABLE'],
        [['arrays_overlap'], 'BOOLEAN', ['ARRAY_TINYINT', 'ARRAY_TINYINT'], 'ALWAYS_NULLABLE'],
        [['arrays_overlap'], 'BOOLEAN', ['ARRAY_SMALLINT', 'ARRAY_SMALLINT'], 'ALWAYS_NULLABLE'],
        [['arrays_overlap'], 'BOOLEAN', ['ARRAY_INT', 'ARRAY_INT'], 'ALWAYS_NULLABLE'],
        [['arrays_overlap'], 'BOOLEAN', ['ARRAY_BIGINT', 'ARRAY_BIGINT'], 'ALWAYS_NULLABLE'],
        [['arrays_overlap'], 'BOOLEAN', ['ARRAY_LARGEINT', 'ARRAY_LARGEINT'], 'ALWAYS_NULLABLE'],
        [['arrays_overlap'], 'BOOLEAN', ['ARRAY_DATETIME', 'ARRAY_DATETIME'], 'ALWAYS_NULLABLE'],
        [['arrays_overlap'], 'BOOLEAN', ['ARRAY_DATE', 'ARRAY_DATE'], 'ALWAYS_NULLABLE'],
        [['arrays_overlap'], 'BOOLEAN', ['ARRAY_DATETIMEV2', 'ARRAY_DATETIMEV2'], 'ALWAYS_NULLABLE'],
        [['arrays_overlap'], 'BOOLEAN', ['ARRAY_DATEV2', 'ARRAY_DATEV2'], 'ALWAYS_NULLABLE'],
        [['arrays_overlap'], 'BOOLEAN', ['ARRAY_FLOAT', 'ARRAY_FLOAT'], 'ALWAYS_NULLABLE'],
        [['arrays_overlap'], 'BOOLEAN', ['ARRAY_DOUBLE', 'ARRAY_DOUBLE'], 'ALWAYS_NULLABLE'],
        [['arrays_overlap'], 'BOOLEAN', ['ARRAY_DECIMALV2', 'ARRAY_DECIMALV2'], 'ALWAYS_NULLABLE'],
        [['arrays_overlap'], 'BOOLEAN', ['ARRAY_DECIMAL32', 'ARRAY_DECIMAL32'], 'ALWAYS_NULLABLE'],
        [['arrays_overlap'], 'BOOLEAN', ['ARRAY_DECIMAL64', 'ARRAY_DECIMAL64'], 'ALWAYS_NULLABLE'],
        [['arrays_overlap'], 'BOOLEAN', ['ARRAY_DECIMAL128', 'ARRAY_DECIMAL128'], 'ALWAYS_NULLABLE'],
        [['arrays_overlap'], 'BOOLEAN', ['ARRAY_VARCHAR', 'ARRAY_VARCHAR'], 'ALWAYS_NULLABLE'],
        [['arrays_overlap'], 'BOOLEAN', ['ARRAY_STRING', 'ARRAY_STRING'], 'ALWAYS_NULLABLE'],

        [['array_contains'], 'BOOLEAN', ['ARRAY_BOOLEAN', 'BOOLEAN'], 'ALWAYS_NULLABLE'],
        [['array_contains'], 'BOOLEAN', ['ARRAY_TINYINT', 'TINYINT'], 'ALWAYS_NULLABLE'],
        [['array_contains'], 'BOOLEAN', ['ARRAY_SMALLINT', 'SMALLINT'], 'ALWAYS_NULLABLE'],
        [['array_contains'], 'BOOLEAN', ['ARRAY_INT', 'INT'], 'ALWAYS_NULLABLE'],
        [['array_contains'], 'BOOLEAN', ['ARRAY_BIGINT', 'BIGINT'], 'ALWAYS_NULLABLE'],
        [['array_contains'], 'BOOLEAN', ['ARRAY_LARGEINT', 'LARGEINT'], 'ALWAYS_NULLABLE'],
        [['array_contains'], 'BOOLEAN', ['ARRAY_DATETIME', 'DATETIME'], 'ALWAYS_NULLABLE'],
        [['array_contains'], 'BOOLEAN', ['ARRAY_DATE', 'DATE'], 'ALWAYS_NULLABLE'],
        [['array_contains'], 'BOOLEAN', ['ARRAY_DATETIMEV2', 'DATETIMEV2'], 'ALWAYS_NULLABLE'],
        [['array_contains'], 'BOOLEAN', ['ARRAY_DATEV2', 'DATEV2'], 'ALWAYS_NULLABLE'],
        [['array_contains'], 'BOOLEAN', ['ARRAY_FLOAT', 'FLOAT'], 'ALWAYS_NULLABLE'],
        [['array_contains'], 'BOOLEAN', ['ARRAY_DOUBLE', 'DOUBLE'], 'ALWAYS_NULLABLE'],
        [['array_contains'], 'BOOLEAN', ['ARRAY_DECIMALV2', 'DECIMALV2'], 'ALWAYS_NULLABLE'],
        [['array_contains'], 'BOOLEAN', ['ARRAY_DECIMAL32', 'DECIMAL32'], 'ALWAYS_NULLABLE'],
        [['array_contains'], 'BOOLEAN', ['ARRAY_DECIMAL64', 'DECIMAL64'], 'ALWAYS_NULLABLE'],
        [['array_contains'], 'BOOLEAN', ['ARRAY_DECIMAL128', 'DECIMAL128'], 'ALWAYS_NULLABLE'],
        [['array_contains'], 'BOOLEAN', ['ARRAY_VARCHAR', 'VARCHAR'], 'ALWAYS_NULLABLE'],
        [['array_contains'], 'BOOLEAN', ['ARRAY_STRING', 'STRING'], 'ALWAYS_NULLABLE'],

        [['array_cum_sum'], 'ARRAY_BIGINT',     ['ARRAY_TINYINT'], ''],
        [['array_cum_sum'], 'ARRAY_BIGINT',     ['ARRAY_SMALLINT'], ''],
        [['array_cum_sum'], 'ARRAY_BIGINT',     ['ARRAY_INT'], ''],
        [['array_cum_sum'], 'ARRAY_BIGINT',     ['ARRAY_BIGINT'], ''],
        [['array_cum_sum'], 'ARRAY_LARGEINT',   ['ARRAY_LARGEINT'], ''],
        [['array_cum_sum'], 'ARRAY_DOUBLE',     ['ARRAY_FLOAT'], ''],
        [['array_cum_sum'], 'ARRAY_DOUBLE',     ['ARRAY_DOUBLE'], ''],
        [['array_cum_sum'], 'ARRAY_DECIMALV2',  ['ARRAY_DECIMALV2'], ''],
        [['array_cum_sum'], 'ARRAY_DECIMAL128', ['ARRAY_DECIMAL32'], ''],
        [['array_cum_sum'], 'ARRAY_DECIMAL128', ['ARRAY_DECIMAL64'], ''],
        [['array_cum_sum'], 'ARRAY_DECIMAL128', ['ARRAY_DECIMAL128'], ''],

        [['array_enumerate'], 'ARRAY_BIGINT', ['ARRAY_BOOLEAN'], ''],
        [['array_enumerate'], 'ARRAY_BIGINT', ['ARRAY_TINYINT'], ''],
        [['array_enumerate'], 'ARRAY_BIGINT', ['ARRAY_SMALLINT'], ''],
        [['array_enumerate'], 'ARRAY_BIGINT', ['ARRAY_INT'], ''],
        [['array_enumerate'], 'ARRAY_BIGINT', ['ARRAY_BIGINT'], ''],
        [['array_enumerate'], 'ARRAY_BIGINT', ['ARRAY_LARGEINT'], ''],
        [['array_enumerate'], 'ARRAY_BIGINT', ['ARRAY_DATETIME'], ''],
        [['array_enumerate'], 'ARRAY_BIGINT', ['ARRAY_DATE'], ''],
        [['array_enumerate'], 'ARRAY_BIGINT', ['ARRAY_DATETIMEV2'], ''],
        [['array_enumerate'], 'ARRAY_BIGINT', ['ARRAY_DATEV2'], ''],
        [['array_enumerate'], 'ARRAY_BIGINT', ['ARRAY_FLOAT'], ''],
        [['array_enumerate'], 'ARRAY_BIGINT', ['ARRAY_DOUBLE'], ''],
        [['array_enumerate'], 'ARRAY_BIGINT', ['ARRAY_DECIMALV2'], ''],
        [['array_enumerate'], 'ARRAY_BIGINT', ['ARRAY_DECIMAL32'], ''],
        [['array_enumerate'], 'ARRAY_BIGINT', ['ARRAY_DECIMAL64'], ''],
        [['array_enumerate'], 'ARRAY_BIGINT', ['ARRAY_DECIMAL128'], ''],
        [['array_enumerate'], 'ARRAY_BIGINT', ['ARRAY_VARCHAR'], ''],
        [['array_enumerate'], 'ARRAY_BIGINT', ['ARRAY_STRING'], ''],

        [['array_enumerate_uniq'], 'ARRAY_BIGINT', ['ARRAY_BOOLEAN', '...'], ''],
        [['array_enumerate_uniq'], 'ARRAY_BIGINT', ['ARRAY_TINYINT', '...'], ''],
        [['array_enumerate_uniq'], 'ARRAY_BIGINT', ['ARRAY_SMALLINT', '...'], ''],
        [['array_enumerate_uniq'], 'ARRAY_BIGINT', ['ARRAY_INT', '...'], ''],
        [['array_enumerate_uniq'], 'ARRAY_BIGINT', ['ARRAY_BIGINT', '...'], ''],
        [['array_enumerate_uniq'], 'ARRAY_BIGINT', ['ARRAY_LARGEINT', '...'], ''],
        [['array_enumerate_uniq'], 'ARRAY_BIGINT', ['ARRAY_DATETIME', '...'], ''],
        [['array_enumerate_uniq'], 'ARRAY_BIGINT', ['ARRAY_DATE', '...'], ''],
        [['array_enumerate_uniq'], 'ARRAY_BIGINT', ['ARRAY_DATETIMEV2', '...'], ''],
        [['array_enumerate_uniq'], 'ARRAY_BIGINT', ['ARRAY_DATEV2', '...'], ''],
        [['array_enumerate_uniq'], 'ARRAY_BIGINT', ['ARRAY_FLOAT', '...'], ''],
        [['array_enumerate_uniq'], 'ARRAY_BIGINT', ['ARRAY_DOUBLE', '...'], ''],
        [['array_enumerate_uniq'], 'ARRAY_BIGINT', ['ARRAY_DECIMALV2', '...'], ''],
        [['array_enumerate_uniq'], 'ARRAY_BIGINT', ['ARRAY_DECIMAL32', '...'], ''],
        [['array_enumerate_uniq'], 'ARRAY_BIGINT', ['ARRAY_DECIMAL64', '...'], ''],
        [['array_enumerate_uniq'], 'ARRAY_BIGINT', ['ARRAY_DECIMAL128', '...'], ''],
        [['array_enumerate_uniq'], 'ARRAY_BIGINT', ['ARRAY_VARCHAR', '...'], ''],
        [['array_enumerate_uniq'], 'ARRAY_BIGINT', ['ARRAY_STRING', '...'], ''],

        [['countequal'], 'BIGINT', ['ARRAY_BOOLEAN', 'BOOLEAN'], 'ALWAYS_NULLABLE'],
        [['countequal'], 'BIGINT', ['ARRAY_TINYINT', 'TINYINT'], 'ALWAYS_NULLABLE'],
        [['countequal'], 'BIGINT', ['ARRAY_SMALLINT', 'SMALLINT'], 'ALWAYS_NULLABLE'],
        [['countequal'], 'BIGINT', ['ARRAY_INT', 'INT'], 'ALWAYS_NULLABLE'],
        [['countequal'], 'BIGINT', ['ARRAY_BIGINT', 'BIGINT'], 'ALWAYS_NULLABLE'],
        [['countequal'], 'BIGINT', ['ARRAY_LARGEINT', 'LARGEINT'], 'ALWAYS_NULLABLE'],
        [['countequal'], 'BIGINT', ['ARRAY_DATETIME', 'DATETIME'], 'ALWAYS_NULLABLE'],
        [['countequal'], 'BIGINT', ['ARRAY_DATE', 'DATE'], 'ALWAYS_NULLABLE'],
        [['countequal'], 'BIGINT', ['ARRAY_DATETIMEV2', 'DATETIMEV2'], 'ALWAYS_NULLABLE'],
        [['countequal'], 'BIGINT', ['ARRAY_DATEV2', 'DATEV2'], 'ALWAYS_NULLABLE'],
        [['countequal'], 'BIGINT', ['ARRAY_FLOAT', 'FLOAT'], 'ALWAYS_NULLABLE'],
        [['countequal'], 'BIGINT', ['ARRAY_DOUBLE', 'DOUBLE'], 'ALWAYS_NULLABLE'],
        [['countequal'], 'BIGINT', ['ARRAY_DECIMALV2', 'DECIMALV2'], 'ALWAYS_NULLABLE'],
        [['countequal'], 'BIGINT', ['ARRAY_DECIMAL32', 'DECIMAL32'], 'ALWAYS_NULLABLE'],
        [['countequal'], 'BIGINT', ['ARRAY_DECIMAL64', 'DECIMAL64'], 'ALWAYS_NULLABLE'],
        [['countequal'], 'BIGINT', ['ARRAY_DECIMAL128', 'DECIMAL128'], 'ALWAYS_NULLABLE'],
        [['countequal'], 'BIGINT', ['ARRAY_VARCHAR', 'VARCHAR'], 'ALWAYS_NULLABLE'],
        [['countequal'], 'BIGINT', ['ARRAY_STRING', 'STRING'], 'ALWAYS_NULLABLE'],

        [['array_position'], 'BIGINT', ['ARRAY_BOOLEAN', 'BOOLEAN'], 'ALWAYS_NULLABLE'],
        [['array_position'], 'BIGINT', ['ARRAY_TINYINT', 'TINYINT'], 'ALWAYS_NULLABLE'],
        [['array_position'], 'BIGINT', ['ARRAY_SMALLINT', 'SMALLINT'], 'ALWAYS_NULLABLE'],
        [['array_position'], 'BIGINT', ['ARRAY_INT', 'INT'], 'ALWAYS_NULLABLE'],
        [['array_position'], 'BIGINT', ['ARRAY_BIGINT', 'BIGINT'], 'ALWAYS_NULLABLE'],
        [['array_position'], 'BIGINT', ['ARRAY_LARGEINT', 'LARGEINT'], 'ALWAYS_NULLABLE'],
        [['array_position'], 'BIGINT', ['ARRAY_DATETIME', 'DATETIME'], 'ALWAYS_NULLABLE'],
        [['array_position'], 'BIGINT', ['ARRAY_DATE', 'DATE'], 'ALWAYS_NULLABLE'],
        [['array_position'], 'BIGINT', ['ARRAY_DATETIMEV2', 'DATETIMEV2'], 'ALWAYS_NULLABLE'],
        [['array_position'], 'BIGINT', ['ARRAY_DATEV2', 'DATEV2'], 'ALWAYS_NULLABLE'],
        [['array_position'], 'BIGINT', ['ARRAY_FLOAT', 'FLOAT'], 'ALWAYS_NULLABLE'],
        [['array_position'], 'BIGINT', ['ARRAY_DOUBLE', 'DOUBLE'], 'ALWAYS_NULLABLE'],
        [['array_position'], 'BIGINT', ['ARRAY_DECIMALV2', 'DECIMALV2'], 'ALWAYS_NULLABLE'],
        [['array_position'], 'BIGINT', ['ARRAY_DECIMAL32', 'DECIMAL32'], 'ALWAYS_NULLABLE'],
        [['array_position'], 'BIGINT', ['ARRAY_DECIMAL64', 'DECIMAL64'], 'ALWAYS_NULLABLE'],
        [['array_position'], 'BIGINT', ['ARRAY_DECIMAL128', 'DECIMAL128'], 'ALWAYS_NULLABLE'],
        [['array_position'], 'BIGINT', ['ARRAY_VARCHAR', 'VARCHAR'], 'ALWAYS_NULLABLE'],
        [['array_position'], 'BIGINT', ['ARRAY_STRING', 'STRING'], 'ALWAYS_NULLABLE'],

        [['cardinality', 'size', 'array_size'], 'BIGINT', ['ARRAY'], ''],
        [['array_distinct'], 'ARRAY_BOOLEAN',   ['ARRAY_BOOLEAN'], ''],
        [['array_distinct'], 'ARRAY_TINYINT',   ['ARRAY_TINYINT'], ''],
        [['array_distinct'], 'ARRAY_SMALLINT',  ['ARRAY_SMALLINT'], ''],
        [['array_distinct'], 'ARRAY_INT',       ['ARRAY_INT'], ''],
        [['array_distinct'], 'ARRAY_BIGINT',    ['ARRAY_BIGINT'], ''],
        [['array_distinct'], 'ARRAY_LARGEINT',  ['ARRAY_LARGEINT'], ''],
        [['array_distinct'], 'ARRAY_DATETIME',  ['ARRAY_DATETIME'], ''],
        [['array_distinct'], 'ARRAY_DATE',      ['ARRAY_DATE'], ''],
        [['array_distinct'], 'ARRAY_DATETIMEV2',  ['ARRAY_DATETIMEV2'], ''],
        [['array_distinct'], 'ARRAY_DATEV2',      ['ARRAY_DATEV2'], ''],
        [['array_distinct'], 'ARRAY_FLOAT',     ['ARRAY_FLOAT'], ''],
        [['array_distinct'], 'ARRAY_DOUBLE',    ['ARRAY_DOUBLE'], ''],
        [['array_distinct'], 'ARRAY_DECIMALV2', ['ARRAY_DECIMALV2'], ''],
        [['array_distinct'], 'ARRAY_DECIMAL32', ['ARRAY_DECIMAL32'], ''],
        [['array_distinct'], 'ARRAY_DECIMAL64', ['ARRAY_DECIMAL64'], ''],
        [['array_distinct'], 'ARRAY_DECIMAL128', ['ARRAY_DECIMAL128'], ''],
        [['array_distinct'], 'ARRAY_VARCHAR',   ['ARRAY_VARCHAR'], ''],
        [['array_distinct'], 'ARRAY_STRING',    ['ARRAY_STRING'], ''],

        [['array_difference'], 'ARRAY_SMALLINT',  ['ARRAY_TINYINT'], ''],
        [['array_difference'], 'ARRAY_INT',       ['ARRAY_SMALLINT'], ''],
        [['array_difference'], 'ARRAY_BIGINT',    ['ARRAY_INT'], ''],
        [['array_difference'], 'ARRAY_LARGEINT',  ['ARRAY_BIGINT'], ''],
        [['array_difference'], 'ARRAY_LARGEINT',  ['ARRAY_LARGEINT'], ''],
        [['array_difference'], 'ARRAY_DOUBLE',    ['ARRAY_FLOAT'], ''],
        [['array_difference'], 'ARRAY_DOUBLE',    ['ARRAY_DOUBLE'], ''],
        [['array_difference'], 'ARRAY_DECIMALV2', ['ARRAY_DECIMALV2'], ''],
        [['array_difference'], 'ARRAY_DECIMAL32', ['ARRAY_DECIMAL32'], ''],
        [['array_difference'], 'ARRAY_DECIMAL64', ['ARRAY_DECIMAL64'], ''],
        [['array_difference'], 'ARRAY_DECIMAL128', ['ARRAY_DECIMAL128'], ''],

        [['array_sort'], 'ARRAY_BOOLEAN',   ['ARRAY_BOOLEAN'], ''],
        [['array_sort'], 'ARRAY_TINYINT',   ['ARRAY_TINYINT'], ''],
        [['array_sort'], 'ARRAY_SMALLINT',  ['ARRAY_SMALLINT'], ''],
        [['array_sort'], 'ARRAY_INT',       ['ARRAY_INT'], ''],
        [['array_sort'], 'ARRAY_BIGINT',    ['ARRAY_BIGINT'], ''],
        [['array_sort'], 'ARRAY_LARGEINT',  ['ARRAY_LARGEINT'], ''],
        [['array_sort'], 'ARRAY_DATETIME',  ['ARRAY_DATETIME'], ''],
        [['array_sort'], 'ARRAY_DATE',      ['ARRAY_DATE'], ''],
        [['array_sort'], 'ARRAY_DATETIMEV2',  ['ARRAY_DATETIMEV2'], ''],
        [['array_sort'], 'ARRAY_DATEV2',      ['ARRAY_DATEV2'], ''],
        [['array_sort'], 'ARRAY_FLOAT',     ['ARRAY_FLOAT'], ''],
        [['array_sort'], 'ARRAY_DOUBLE',    ['ARRAY_DOUBLE'], ''],
        [['array_sort'], 'ARRAY_DECIMALV2', ['ARRAY_DECIMALV2'], ''],
        [['array_sort'], 'ARRAY_DECIMAL32', ['ARRAY_DECIMAL32'], ''],
        [['array_sort'], 'ARRAY_DECIMAL64', ['ARRAY_DECIMAL64'], ''],
        [['array_sort'], 'ARRAY_DECIMAL128', ['ARRAY_DECIMAL128'], ''],
        [['array_sort'], 'ARRAY_VARCHAR',   ['ARRAY_VARCHAR'], ''],
        [['array_sort'], 'ARRAY_STRING',    ['ARRAY_STRING'], ''],

        [['array_reverse_sort'], 'ARRAY_BOOLEAN',   ['ARRAY_BOOLEAN'], ''],
        [['array_reverse_sort'], 'ARRAY_TINYINT',   ['ARRAY_TINYINT'], ''],
        [['array_reverse_sort'], 'ARRAY_SMALLINT',  ['ARRAY_SMALLINT'], ''],
        [['array_reverse_sort'], 'ARRAY_INT',       ['ARRAY_INT'], ''],
        [['array_reverse_sort'], 'ARRAY_BIGINT',    ['ARRAY_BIGINT'], ''],
        [['array_reverse_sort'], 'ARRAY_LARGEINT',  ['ARRAY_LARGEINT'], ''],
        [['array_reverse_sort'], 'ARRAY_DATETIME',  ['ARRAY_DATETIME'], ''],
        [['array_reverse_sort'], 'ARRAY_DATE',      ['ARRAY_DATE'], ''],
        [['array_reverse_sort'], 'ARRAY_DATETIMEV2',  ['ARRAY_DATETIMEV2'], ''],
        [['array_reverse_sort'], 'ARRAY_DATEV2',      ['ARRAY_DATEV2'], ''],
        [['array_reverse_sort'], 'ARRAY_FLOAT',     ['ARRAY_FLOAT'], ''],
        [['array_reverse_sort'], 'ARRAY_DOUBLE',    ['ARRAY_DOUBLE'], ''],
        [['array_reverse_sort'], 'ARRAY_DECIMALV2', ['ARRAY_DECIMALV2'], ''],
        [['array_reverse_sort'], 'ARRAY_DECIMAL32', ['ARRAY_DECIMAL32'], ''],
        [['array_reverse_sort'], 'ARRAY_DECIMAL64', ['ARRAY_DECIMAL64'], ''],
        [['array_reverse_sort'], 'ARRAY_DECIMAL128', ['ARRAY_DECIMAL128'], ''],
        [['array_reverse_sort'], 'ARRAY_VARCHAR',   ['ARRAY_VARCHAR'], ''],
        [['array_reverse_sort'], 'ARRAY_STRING',    ['ARRAY_STRING'], ''],

        # array_join takes two params
        [['array_join'], 'STRING',   ['ARRAY_BOOLEAN','VARCHAR'], ''],
        [['array_join'], 'STRING',   ['ARRAY_TINYINT','VARCHAR'], ''],
        [['array_join'], 'STRING',  ['ARRAY_SMALLINT','VARCHAR'], ''],
        [['array_join'], 'STRING',       ['ARRAY_INT','VARCHAR'], ''],
        [['array_join'], 'STRING',    ['ARRAY_BIGINT','VARCHAR'], ''],
        [['array_join'], 'STRING',  ['ARRAY_LARGEINT','VARCHAR'], ''],
        [['array_join'], 'STRING',  ['ARRAY_DATETIME','VARCHAR'], ''],
        [['array_join'], 'STRING',      ['ARRAY_DATE','VARCHAR'], ''],
        [['array_join'], 'STRING',  ['ARRAY_DATETIMEV2','VARCHAR'], ''],
        [['array_join'], 'STRING',      ['ARRAY_DATEV2','VARCHAR'], ''],
        [['array_join'], 'STRING',     ['ARRAY_FLOAT','VARCHAR'], ''],
        [['array_join'], 'STRING',    ['ARRAY_DOUBLE','VARCHAR'], ''],
        [['array_join'], 'STRING', ['ARRAY_DECIMALV2','VARCHAR'], ''],
        [['array_join'], 'STRING', ['ARRAY_DECIMAL32','VARCHAR'], ''],
        [['array_join'], 'STRING', ['ARRAY_DECIMAL64','VARCHAR'], ''],
        [['array_join'], 'STRING', ['ARRAY_DECIMAL128','VARCHAR'], ''],
        [['array_join'], 'STRING',   ['ARRAY_VARCHAR','VARCHAR'], ''],
        [['array_join'], 'STRING',    ['ARRAY_STRING','VARCHAR'], ''],
        # array_join takes three params
        [['array_join'], 'STRING',   ['ARRAY_BOOLEAN','VARCHAR', 'VARCHAR'], ''],
        [['array_join'], 'STRING',   ['ARRAY_TINYINT','VARCHAR', 'VARCHAR'], ''],
        [['array_join'], 'STRING',  ['ARRAY_SMALLINT','VARCHAR', 'VARCHAR'], ''],
        [['array_join'], 'STRING',       ['ARRAY_INT','VARCHAR', 'VARCHAR'], ''],
        [['array_join'], 'STRING',    ['ARRAY_BIGINT','VARCHAR', 'VARCHAR'], ''],
        [['array_join'], 'STRING',  ['ARRAY_LARGEINT','VARCHAR', 'VARCHAR'], ''],
        [['array_join'], 'STRING',  ['ARRAY_DATETIME','VARCHAR', 'VARCHAR'], ''],
        [['array_join'], 'STRING',      ['ARRAY_DATE','VARCHAR', 'VARCHAR'], ''],
        [['array_join'], 'STRING',  ['ARRAY_DATETIMEV2','VARCHAR', 'VARCHAR'], ''],
        [['array_join'], 'STRING',      ['ARRAY_DATEV2','VARCHAR', 'VARCHAR'], ''],
        [['array_join'], 'STRING',     ['ARRAY_FLOAT','VARCHAR', 'VARCHAR'], ''],
        [['array_join'], 'STRING',    ['ARRAY_DOUBLE','VARCHAR', 'VARCHAR'], ''],
        [['array_join'], 'STRING', ['ARRAY_DECIMALV2','VARCHAR', 'VARCHAR'], ''],
        [['array_join'], 'STRING', ['ARRAY_DECIMAL32','VARCHAR', 'VARCHAR'], ''],
        [['array_join'], 'STRING', ['ARRAY_DECIMAL64','VARCHAR', 'VARCHAR'], ''],
        [['array_join'], 'STRING', ['ARRAY_DECIMAL128','VARCHAR', 'VARCHAR'], ''],
        [['array_join'], 'STRING',   ['ARRAY_VARCHAR','VARCHAR', 'VARCHAR'], ''],
        [['array_join'], 'STRING',    ['ARRAY_STRING','VARCHAR', 'VARCHAR'], ''],

        [['array_min'],     'BOOLEAN',  ['ARRAY_BOOLEAN'],  'ALWAYS_NULLABLE'],
        [['array_min'],     'TINYINT',  ['ARRAY_TINYINT'],  'ALWAYS_NULLABLE'],
        [['array_min'],     'SMALLINT', ['ARRAY_SMALLINT'], 'ALWAYS_NULLABLE'],
        [['array_min'],     'INT',      ['ARRAY_INT'],      'ALWAYS_NULLABLE'],
        [['array_min'],     'BIGINT',   ['ARRAY_BIGINT'],   'ALWAYS_NULLABLE'],
        [['array_min'],     'LARGEINT', ['ARRAY_LARGEINT'], 'ALWAYS_NULLABLE'],
        [['array_min'],     'FLOAT',    ['ARRAY_FLOAT'],    'ALWAYS_NULLABLE'],
        [['array_min'],     'DOUBLE',   ['ARRAY_DOUBLE'],   'ALWAYS_NULLABLE'],
        [['array_min'],     'DECIMALV2',['ARRAY_DECIMALV2'], 'ALWAYS_NULLABLE'],
        [['array_min'],     'DECIMAL32',['ARRAY_DECIMAL32'], 'ALWAYS_NULLABLE'],
        [['array_min'],     'DECIMAL64',['ARRAY_DECIMAL64'], 'ALWAYS_NULLABLE'],
        [['array_min'],     'DECIMAL128',['ARRAY_DECIMAL128'], 'ALWAYS_NULLABLE'],
        [['array_min'],     'DATE',     ['ARRAY_DATE'],     'ALWAYS_NULLABLE'],
        [['array_min'],     'DATETIME', ['ARRAY_DATETIME'], 'ALWAYS_NULLABLE'],
        [['array_min'],     'DATEV2',     ['ARRAY_DATEV2'],     'ALWAYS_NULLABLE'],
        [['array_min'],     'DATETIMEV2', ['ARRAY_DATETIMEV2'], 'ALWAYS_NULLABLE'],
        [['array_max'],     'BOOLEAN',  ['ARRAY_BOOLEAN'],  'ALWAYS_NULLABLE'],
        [['array_max'],     'TINYINT',  ['ARRAY_TINYINT'],  'ALWAYS_NULLABLE'],
        [['array_max'],     'SMALLINT', ['ARRAY_SMALLINT'], 'ALWAYS_NULLABLE'],
        [['array_max'],     'INT',      ['ARRAY_INT'],      'ALWAYS_NULLABLE'],
        [['array_max'],     'BIGINT',   ['ARRAY_BIGINT'],   'ALWAYS_NULLABLE'],
        [['array_max'],     'LARGEINT', ['ARRAY_LARGEINT'], 'ALWAYS_NULLABLE'],
        [['array_max'],     'FLOAT',    ['ARRAY_FLOAT'],    'ALWAYS_NULLABLE'],
        [['array_max'],     'DOUBLE',   ['ARRAY_DOUBLE'],   'ALWAYS_NULLABLE'],
        [['array_max'],     'DECIMALV2',['ARRAY_DECIMALV2'], 'ALWAYS_NULLABLE'],
        [['array_max'],     'DECIMAL32',['ARRAY_DECIMAL32'], 'ALWAYS_NULLABLE'],
        [['array_max'],     'DECIMAL64',['ARRAY_DECIMAL64'], 'ALWAYS_NULLABLE'],
        [['array_max'],     'DECIMAL128',['ARRAY_DECIMAL128'], 'ALWAYS_NULLABLE'],
        [['array_max'],     'DATE',     ['ARRAY_DATE'],     'ALWAYS_NULLABLE'],
        [['array_max'],     'DATETIME', ['ARRAY_DATETIME'], 'ALWAYS_NULLABLE'],
        [['array_max'],     'DATEV2',     ['ARRAY_DATEV2'],     'ALWAYS_NULLABLE'],
        [['array_max'],     'DATETIMEV2', ['ARRAY_DATETIMEV2'], 'ALWAYS_NULLABLE'],
        [['array_sum'],     'BIGINT',   ['ARRAY_BOOLEAN'],  'ALWAYS_NULLABLE'],
        [['array_sum'],     'BIGINT',   ['ARRAY_TINYINT'],  'ALWAYS_NULLABLE'],
        [['array_sum'],     'BIGINT',   ['ARRAY_SMALLINT'], 'ALWAYS_NULLABLE'],
        [['array_sum'],     'BIGINT',   ['ARRAY_INT'],      'ALWAYS_NULLABLE'],
        [['array_sum'],     'BIGINT',   ['ARRAY_BIGINT'],   'ALWAYS_NULLABLE'],
        [['array_sum'],     'LARGEINT', ['ARRAY_LARGEINT'], 'ALWAYS_NULLABLE'],
        [['array_sum'],     'DOUBLE',   ['ARRAY_FLOAT'], 'ALWAYS_NULLABLE'],
        [['array_sum'],     'DOUBLE',   ['ARRAY_DOUBLE'],   'ALWAYS_NULLABLE'],
        [['array_sum'],     'DECIMALV2',['ARRAY_DECIMALV2'], 'ALWAYS_NULLABLE'],
        [['array_sum'],     'DECIMAL128',['ARRAY_DECIMAL32'], 'ALWAYS_NULLABLE'],
        [['array_sum'],     'DECIMAL128',['ARRAY_DECIMAL64'], 'ALWAYS_NULLABLE'],
        [['array_sum'],     'DECIMAL128',['ARRAY_DECIMAL128'], 'ALWAYS_NULLABLE'],
        [['array_avg'],     'DOUBLE',   ['ARRAY_BOOLEAN'],  'ALWAYS_NULLABLE'],
        [['array_avg'],     'DOUBLE',   ['ARRAY_TINYINT'],  'ALWAYS_NULLABLE'],
        [['array_avg'],     'DOUBLE',   ['ARRAY_SMALLINT'], 'ALWAYS_NULLABLE'],
        [['array_avg'],     'DOUBLE',   ['ARRAY_INT'],      'ALWAYS_NULLABLE'],
        [['array_avg'],     'DOUBLE',   ['ARRAY_BIGINT'],   'ALWAYS_NULLABLE'],
        [['array_avg'],     'DOUBLE',   ['ARRAY_LARGEINT'], 'ALWAYS_NULLABLE'],
        [['array_avg'],     'DOUBLE',   ['ARRAY_FLOAT'],    'ALWAYS_NULLABLE'],
        [['array_avg'],     'DOUBLE',   ['ARRAY_DOUBLE'],   'ALWAYS_NULLABLE'],
        [['array_avg'],     'DECIMALV2',['ARRAY_DECIMALV2'], 'ALWAYS_NULLABLE'],
        [['array_avg'],     'DECIMAL128',['ARRAY_DECIMAL32'], 'ALWAYS_NULLABLE'],
        [['array_avg'],     'DECIMAL128',['ARRAY_DECIMAL64'], 'ALWAYS_NULLABLE'],
        [['array_avg'],     'DECIMAL128',['ARRAY_DECIMAL128'], 'ALWAYS_NULLABLE'],
        [['array_product'], 'DOUBLE',   ['ARRAY_BOOLEAN'],  'ALWAYS_NULLABLE'],
        [['array_product'], 'DOUBLE',   ['ARRAY_TINYINT'],  'ALWAYS_NULLABLE'],
        [['array_product'], 'DOUBLE',   ['ARRAY_SMALLINT'], 'ALWAYS_NULLABLE'],
        [['array_product'], 'DOUBLE',   ['ARRAY_INT'],      'ALWAYS_NULLABLE'],
        [['array_product'], 'DOUBLE',   ['ARRAY_BIGINT'],   'ALWAYS_NULLABLE'],
        [['array_product'], 'DOUBLE',   ['ARRAY_LARGEINT'], 'ALWAYS_NULLABLE'],
        [['array_product'], 'DOUBLE',   ['ARRAY_FLOAT'],    'ALWAYS_NULLABLE'],
        [['array_product'], 'DOUBLE',   ['ARRAY_DOUBLE'],   'ALWAYS_NULLABLE'],
        [['array_product'], 'DECIMALV2',['ARRAY_DECIMALV2'], 'ALWAYS_NULLABLE'],
        [['array_product'], 'DECIMAL128',['ARRAY_DECIMAL32'], 'ALWAYS_NULLABLE'],
        [['array_product'], 'DECIMAL128',['ARRAY_DECIMAL64'], 'ALWAYS_NULLABLE'],
        [['array_product'], 'DECIMAL128',['ARRAY_DECIMAL128'], 'ALWAYS_NULLABLE'],

        [['array_remove'], 'ARRAY_BOOLEAN',   ['ARRAY_BOOLEAN', 'BOOLEAN'], ''],
        [['array_remove'], 'ARRAY_TINYINT',   ['ARRAY_TINYINT', 'TINYINT'], ''],
        [['array_remove'], 'ARRAY_SMALLINT',  ['ARRAY_SMALLINT', 'SMALLINT'], ''],
        [['array_remove'], 'ARRAY_INT',       ['ARRAY_INT', 'INT'], ''],
        [['array_remove'], 'ARRAY_BIGINT',    ['ARRAY_BIGINT', 'BIGINT'], ''],
        [['array_remove'], 'ARRAY_LARGEINT',  ['ARRAY_LARGEINT', 'LARGEINT'], ''],
        [['array_remove'], 'ARRAY_FLOAT',     ['ARRAY_FLOAT', 'FLOAT'], ''],
        [['array_remove'], 'ARRAY_DOUBLE',    ['ARRAY_DOUBLE', 'DOUBLE'], ''],
        [['array_remove'], 'ARRAY_DECIMALV2', ['ARRAY_DECIMALV2', 'DECIMALV2'], ''],
        [['array_remove'], 'ARRAY_DECIMAL32', ['ARRAY_DECIMAL32', 'DECIMAL32'], ''],
        [['array_remove'], 'ARRAY_DECIMAL64', ['ARRAY_DECIMAL64', 'DECIMAL64'], ''],
        [['array_remove'], 'ARRAY_DECIMAL128', ['ARRAY_DECIMAL128', 'DECIMAL128'], ''],
        [['array_remove'], 'ARRAY_DATETIME',  ['ARRAY_DATETIME', 'DATETIME'], ''],
        [['array_remove'], 'ARRAY_DATE',      ['ARRAY_DATE', 'DATE'], ''],
        [['array_remove'], 'ARRAY_DATETIMEV2',  ['ARRAY_DATETIMEV2', 'DATETIMEV2'], ''],
        [['array_remove'], 'ARRAY_DATEV2',      ['ARRAY_DATEV2', 'DATEV2'], ''],
        [['array_remove'], 'ARRAY_VARCHAR',   ['ARRAY_VARCHAR', 'VARCHAR'], ''],
        [['array_remove'], 'ARRAY_STRING',    ['ARRAY_STRING', 'STRING'], ''],

        [['array_union'], 'ARRAY_BOOLEAN',  ['ARRAY_BOOLEAN', 'ARRAY_BOOLEAN'],  ''],
        [['array_union'], 'ARRAY_TINYINT',  ['ARRAY_TINYINT', 'ARRAY_TINYINT'],  ''],
        [['array_union'], 'ARRAY_SMALLINT', ['ARRAY_SMALLINT', 'ARRAY_SMALLINT'], ''],
        [['array_union'], 'ARRAY_INT',      ['ARRAY_INT', 'ARRAY_INT'], ''],
        [['array_union'], 'ARRAY_BIGINT',   ['ARRAY_BIGINT', 'ARRAY_BIGINT'],   ''],
        [['array_union'], 'ARRAY_LARGEINT', ['ARRAY_LARGEINT', 'ARRAY_LARGEINT'], ''],
        [['array_union'], 'ARRAY_FLOAT',     ['ARRAY_FLOAT', 'ARRAY_FLOAT'],  ''],
        [['array_union'], 'ARRAY_DOUBLE',    ['ARRAY_DOUBLE', 'ARRAY_DOUBLE'], ''],
        [['array_union'], 'ARRAY_DECIMALV2', ['ARRAY_DECIMALV2', 'ARRAY_DECIMALV2'], ''],
        [['array_union'], 'ARRAY_DECIMAL32', ['ARRAY_DECIMAL32', 'ARRAY_DECIMAL32'], ''],
        [['array_union'], 'ARRAY_DECIMAL64', ['ARRAY_DECIMAL64', 'ARRAY_DECIMAL64'], ''],
        [['array_union'], 'ARRAY_DECIMAL128', ['ARRAY_DECIMAL128', 'ARRAY_DECIMAL128'], ''],
        [['array_union'], 'ARRAY_DATETIME',  ['ARRAY_DATETIME', 'ARRAY_DATETIME'], ''],
        [['array_union'], 'ARRAY_DATE',      ['ARRAY_DATE', 'ARRAY_DATE'], ''],
        [['array_union'], 'ARRAY_DATETIMEV2',  ['ARRAY_DATETIMEV2', 'ARRAY_DATETIMEV2'], ''],
        [['array_union'], 'ARRAY_DATEV2',      ['ARRAY_DATEV2', 'ARRAY_DATEV2'], ''],
        [['array_union'], 'ARRAY_VARCHAR',   ['ARRAY_VARCHAR', 'ARRAY_VARCHAR'], ''],
        [['array_union'], 'ARRAY_STRING',    ['ARRAY_STRING', 'ARRAY_STRING'], ''],

        [['array_apply'], 'ARRAY_BOOLEAN',  ['ARRAY_BOOLEAN', 'VARCHAR', 'BOOLEAN'],  ''],
        [['array_apply'], 'ARRAY_TINYINT',  ['ARRAY_TINYINT', 'VARCHAR', 'TINYINT'],  ''],
        [['array_apply'], 'ARRAY_SMALLINT', ['ARRAY_SMALLINT', 'VARCHAR', 'SMALLINT'], ''],
        [['array_apply'], 'ARRAY_INT',      ['ARRAY_INT', 'VARCHAR', 'INT'], ''],
        [['array_apply'], 'ARRAY_BIGINT',   ['ARRAY_BIGINT', 'VARCHAR', 'BIGINT'],   ''],
        [['array_apply'], 'ARRAY_LARGEINT', ['ARRAY_LARGEINT', 'VARCHAR', 'ARRAY_LARGEINT'], ''],
        [['array_apply'], 'ARRAY_FLOAT',     ['ARRAY_FLOAT', 'VARCHAR', 'FLOAT'],  ''],
        [['array_apply'], 'ARRAY_DOUBLE',    ['ARRAY_DOUBLE', 'VARCHAR', 'DOUBLE'], ''],
        [['array_apply'], 'ARRAY_DECIMALV2', ['ARRAY_DECIMALV2', 'VARCHAR', 'DECIMALV2'], ''],
        [['array_apply'], 'ARRAY_DECIMAL32', ['ARRAY_DECIMAL32', 'VARCHAR', 'DECIMAL32'], ''],
        [['array_apply'], 'ARRAY_DECIMAL64', ['ARRAY_DECIMAL64', 'VARCHAR', 'DECIMAL64'], ''],
        [['array_apply'], 'ARRAY_DECIMAL128', ['ARRAY_DECIMAL128', 'VARCHAR', 'DECIMAL128'], ''],
        [['array_apply'], 'ARRAY_DATETIME',  ['ARRAY_DATETIME', 'VARCHAR', 'DATETIME'], ''],
        [['array_apply'], 'ARRAY_DATE',      ['ARRAY_DATE', 'DATE', 'DATE'], ''],
        [['array_apply'], 'ARRAY_DATETIMEV2',  ['ARRAY_DATETIMEV2', 'VARCHAR', 'DATETIMEV2'], ''],
        [['array_apply'], 'ARRAY_DATEV2',      ['ARRAY_DATEV2', 'VARCHAR', 'DATEV2'], ''],

        [['array_concat'], 'ARRAY_BOOLEAN',  ['ARRAY_BOOLEAN', '...'],  ''],
        [['array_concat'], 'ARRAY_TINYINT',  ['ARRAY_TINYINT', '...'],  ''],
        [['array_concat'], 'ARRAY_SMALLINT', ['ARRAY_SMALLINT', '...'], ''],
        [['array_concat'], 'ARRAY_INT',      ['ARRAY_INT', '...'], ''],
        [['array_concat'], 'ARRAY_BIGINT',   ['ARRAY_BIGINT', '...'],   ''],
        [['array_concat'], 'ARRAY_LARGEINT', ['ARRAY_LARGEINT', '...'], ''],
        [['array_concat'], 'ARRAY_FLOAT',     ['ARRAY_FLOAT', '...'],  ''],
        [['array_concat'], 'ARRAY_DOUBLE',    ['ARRAY_DOUBLE', '...'], ''],
        [['array_concat'], 'ARRAY_DECIMALV2', ['ARRAY_DECIMALV2', '...'], ''],
        [['array_concat'], 'ARRAY_DECIMAL32', ['ARRAY_DECIMAL32', '...'], ''],
        [['array_concat'], 'ARRAY_DECIMAL64', ['ARRAY_DECIMAL64', '...'], ''],
        [['array_concat'], 'ARRAY_DECIMAL128', ['ARRAY_DECIMAL128', '...'], ''],
        [['array_concat'], 'ARRAY_DATETIME',  ['ARRAY_DATETIME', '...'], ''],
        [['array_concat'], 'ARRAY_DATE',      ['ARRAY_DATE', '...'], ''],
        [['array_concat'], 'ARRAY_DATETIMEV2',  ['ARRAY_DATETIMEV2', '...'], ''],
        [['array_concat'], 'ARRAY_DATEV2',      ['ARRAY_DATEV2', '...'], ''],
        [['array_concat'], 'ARRAY_VARCHAR',   ['ARRAY_VARCHAR', '...'], ''],
        [['array_concat'], 'ARRAY_STRING',    ['ARRAY_STRING', '...'], ''],

        [['array_except'], 'ARRAY_BOOLEAN',  ['ARRAY_BOOLEAN', 'ARRAY_BOOLEAN'],  ''],
        [['array_except'], 'ARRAY_TINYINT',  ['ARRAY_TINYINT', 'ARRAY_TINYINT'],  ''],
        [['array_except'], 'ARRAY_SMALLINT', ['ARRAY_SMALLINT', 'ARRAY_SMALLINT'], ''],
        [['array_except'], 'ARRAY_INT',      ['ARRAY_INT', 'ARRAY_INT'], ''],
        [['array_except'], 'ARRAY_BIGINT',   ['ARRAY_BIGINT', 'ARRAY_BIGINT'],   ''],
        [['array_except'], 'ARRAY_LARGEINT', ['ARRAY_LARGEINT', 'ARRAY_LARGEINT'], ''],
        [['array_except'], 'ARRAY_FLOAT',     ['ARRAY_FLOAT', 'ARRAY_FLOAT'],  ''],
        [['array_except'], 'ARRAY_DOUBLE',    ['ARRAY_DOUBLE', 'ARRAY_DOUBLE'], ''],
        [['array_except'], 'ARRAY_DECIMALV2', ['ARRAY_DECIMALV2', 'ARRAY_DECIMALV2'], ''],
        [['array_except'], 'ARRAY_DECIMAL32', ['ARRAY_DECIMAL32', 'ARRAY_DECIMAL32'], ''],
        [['array_except'], 'ARRAY_DECIMAL64', ['ARRAY_DECIMAL64', 'ARRAY_DECIMAL64'], ''],
        [['array_except'], 'ARRAY_DECIMAL128', ['ARRAY_DECIMAL128', 'ARRAY_DECIMAL128'], ''],
        [['array_except'], 'ARRAY_DATETIME',  ['ARRAY_DATETIME', 'ARRAY_DATETIME'], ''],
        [['array_except'], 'ARRAY_DATE',      ['ARRAY_DATE', 'ARRAY_DATE'], ''],
        [['array_except'], 'ARRAY_DATETIMEV2',  ['ARRAY_DATETIMEV2', 'ARRAY_DATETIMEV2'], ''],
        [['array_except'], 'ARRAY_DATEV2',      ['ARRAY_DATEV2', 'ARRAY_DATEV2'], ''],
        [['array_except'], 'ARRAY_VARCHAR',   ['ARRAY_VARCHAR', 'ARRAY_VARCHAR'], ''],
        [['array_except'], 'ARRAY_STRING',    ['ARRAY_STRING', 'ARRAY_STRING'], ''],

        [['array_compact'], 'ARRAY_BOOLEAN',   ['ARRAY_BOOLEAN'], ''],
        [['array_compact'], 'ARRAY_TINYINT',   ['ARRAY_TINYINT'], ''],
        [['array_compact'], 'ARRAY_SMALLINT',  ['ARRAY_SMALLINT'], ''],
        [['array_compact'], 'ARRAY_INT',       ['ARRAY_INT'], ''],
        [['array_compact'], 'ARRAY_BIGINT',    ['ARRAY_BIGINT'], ''],
        [['array_compact'], 'ARRAY_LARGEINT',  ['ARRAY_LARGEINT'], ''],
        [['array_compact'], 'ARRAY_DATETIME',  ['ARRAY_DATETIME'], ''],
        [['array_compact'], 'ARRAY_DATE',      ['ARRAY_DATE'], ''],
        [['array_compact'], 'ARRAY_DATETIMEV2',  ['ARRAY_DATETIMEV2'], ''],
        [['array_compact'], 'ARRAY_DATEV2',      ['ARRAY_DATEV2'], ''],
        [['array_compact'], 'ARRAY_FLOAT',     ['ARRAY_FLOAT'], ''],
        [['array_compact'], 'ARRAY_DOUBLE',    ['ARRAY_DOUBLE'], ''],
        [['array_compact'], 'ARRAY_DECIMALV2', ['ARRAY_DECIMALV2'], ''],
        [['array_compact'], 'ARRAY_DECIMAL32', ['ARRAY_DECIMAL32'], ''],
        [['array_compact'], 'ARRAY_DECIMAL64', ['ARRAY_DECIMAL64'], ''],
        [['array_compact'], 'ARRAY_DECIMAL128', ['ARRAY_DECIMAL128'], ''],
        [['array_compact'], 'ARRAY_VARCHAR',   ['ARRAY_VARCHAR'], ''],

        [['array_intersect'], 'ARRAY_BOOLEAN',  ['ARRAY_BOOLEAN', 'ARRAY_BOOLEAN', '...'],  ''],
        [['array_intersect'], 'ARRAY_TINYINT',  ['ARRAY_TINYINT', 'ARRAY_TINYINT', '...'],  ''],
        [['array_intersect'], 'ARRAY_SMALLINT', ['ARRAY_SMALLINT', 'ARRAY_SMALLINT', '...'], ''],
        [['array_intersect'], 'ARRAY_INT',      ['ARRAY_INT', 'ARRAY_INT', '...'], ''],
        [['array_intersect'], 'ARRAY_BIGINT',   ['ARRAY_BIGINT', 'ARRAY_BIGINT', '...'],   ''],
        [['array_intersect'], 'ARRAY_LARGEINT', ['ARRAY_LARGEINT', 'ARRAY_LARGEINT', '...'], ''],
        [['array_intersect'], 'ARRAY_FLOAT',     ['ARRAY_FLOAT', 'ARRAY_FLOAT', '...'],  ''],
        [['array_intersect'], 'ARRAY_DOUBLE',    ['ARRAY_DOUBLE', 'ARRAY_DOUBLE', '...'], ''],
        [['array_intersect'], 'ARRAY_DECIMALV2', ['ARRAY_DECIMALV2', 'ARRAY_DECIMALV2', '...'], ''],
        [['array_intersect'], 'ARRAY_DECIMAL32', ['ARRAY_DECIMAL32', 'ARRAY_DECIMAL32', '...'], ''],
        [['array_intersect'], 'ARRAY_DECIMAL64', ['ARRAY_DECIMAL64', 'ARRAY_DECIMAL64', '...'], ''],
        [['array_intersect'], 'ARRAY_DECIMAL128', ['ARRAY_DECIMAL128', 'ARRAY_DECIMAL128', '...'], ''],
        [['array_intersect'], 'ARRAY_DATETIME',  ['ARRAY_DATETIME', 'ARRAY_DATETIME', '...'], ''],
        [['array_intersect'], 'ARRAY_DATE',      ['ARRAY_DATE', 'ARRAY_DATE', '...'], ''],
        [['array_intersect'], 'ARRAY_DATETIMEV2',  ['ARRAY_DATETIMEV2', 'ARRAY_DATETIMEV2', '...'], ''],
        [['array_intersect'], 'ARRAY_DATEV2',      ['ARRAY_DATEV2', 'ARRAY_DATEV2', '...'], ''],
        [['array_intersect'], 'ARRAY_VARCHAR',   ['ARRAY_VARCHAR', 'ARRAY_VARCHAR', '...'], ''],
        [['array_intersect'], 'ARRAY_STRING',    ['ARRAY_STRING', 'ARRAY_STRING', '...'], ''],

        [['array_slice', '%element_slice%'], 'ARRAY_BOOLEAN', ['ARRAY_BOOLEAN', 'BIGINT'], ''],
        [['array_slice', '%element_slice%'], 'ARRAY_TINYINT', ['ARRAY_TINYINT', 'BIGINT'], ''],
        [['array_slice', '%element_slice%'], 'ARRAY_SMALLINT', ['ARRAY_SMALLINT', 'BIGINT'], ''],
        [['array_slice', '%element_slice%'], 'ARRAY_INT', ['ARRAY_INT', 'BIGINT'], ''],
        [['array_slice', '%element_slice%'], 'ARRAY_BIGINT', ['ARRAY_BIGINT', 'BIGINT'], ''],
        [['array_slice', '%element_slice%'], 'ARRAY_LARGEINT', ['ARRAY_LARGEINT', 'BIGINT'], ''],
        [['array_slice', '%element_slice%'], 'ARRAY_DATETIME', ['ARRAY_DATETIME', 'BIGINT'], ''],
        [['array_slice', '%element_slice%'], 'ARRAY_DATE', ['ARRAY_DATE', 'BIGINT'], ''],
        [['array_slice', '%element_slice%'], 'ARRAY_DATETIMEV2', ['ARRAY_DATETIMEV2', 'BIGINT'], ''],
        [['array_slice', '%element_slice%'], 'ARRAY_DATEV2', ['ARRAY_DATEV2', 'BIGINT'], ''],
        [['array_slice', '%element_slice%'], 'ARRAY_FLOAT', ['ARRAY_FLOAT', 'BIGINT'], ''],
        [['array_slice', '%element_slice%'], 'ARRAY_DOUBLE', ['ARRAY_DOUBLE', 'BIGINT'], ''],
        [['array_slice', '%element_slice%'], 'ARRAY_DECIMALV2', ['ARRAY_DECIMALV2', 'BIGINT'], ''],
        [['array_slice', '%element_slice%'], 'ARRAY_DECIMAL32', ['ARRAY_DECIMAL32', 'BIGINT'], ''],
        [['array_slice', '%element_slice%'], 'ARRAY_DECIMAL64', ['ARRAY_DECIMAL64', 'BIGINT'], ''],
        [['array_slice', '%element_slice%'], 'ARRAY_DECIMAL128', ['ARRAY_DECIMAL128', 'BIGINT'], ''],
        [['array_slice', '%element_slice%'], 'ARRAY_VARCHAR', ['ARRAY_VARCHAR', 'BIGINT'], ''],
        [['array_slice', '%element_slice%'], 'ARRAY_STRING', ['ARRAY_STRING', 'BIGINT'], ''],

        [['array_slice', '%element_slice%'], 'ARRAY_BOOLEAN', ['ARRAY_BOOLEAN', 'BIGINT', 'BIGINT'], ''],
        [['array_slice', '%element_slice%'], 'ARRAY_TINYINT', ['ARRAY_TINYINT', 'BIGINT', 'BIGINT'], ''],
        [['array_slice', '%element_slice%'], 'ARRAY_SMALLINT', ['ARRAY_SMALLINT', 'BIGINT', 'BIGINT'], ''],
        [['array_slice', '%element_slice%'], 'ARRAY_INT', ['ARRAY_INT', 'BIGINT', 'BIGINT'], ''],
        [['array_slice', '%element_slice%'], 'ARRAY_BIGINT', ['ARRAY_BIGINT', 'BIGINT', 'BIGINT'], ''],
        [['array_slice', '%element_slice%'], 'ARRAY_LARGEINT', ['ARRAY_LARGEINT', 'BIGINT', 'BIGINT'], ''],
        [['array_slice', '%element_slice%'], 'ARRAY_DATETIME', ['ARRAY_DATETIME', 'BIGINT', 'BIGINT'], ''],
        [['array_slice', '%element_slice%'], 'ARRAY_DATE', ['ARRAY_DATE', 'BIGINT', 'BIGINT'], ''],
        [['array_slice', '%element_slice%'], 'ARRAY_DATETIMEV2', ['ARRAY_DATETIMEV2', 'BIGINT', 'BIGINT'], ''],
        [['array_slice', '%element_slice%'], 'ARRAY_DATEV2', ['ARRAY_DATEV2', 'BIGINT', 'BIGINT'], ''],
        [['array_slice', '%element_slice%'], 'ARRAY_FLOAT', ['ARRAY_FLOAT', 'BIGINT', 'BIGINT'], ''],
        [['array_slice', '%element_slice%'], 'ARRAY_DOUBLE', ['ARRAY_DOUBLE', 'BIGINT', 'BIGINT'], ''],
        [['array_slice', '%element_slice%'], 'ARRAY_DECIMALV2', ['ARRAY_DECIMALV2', 'BIGINT', 'BIGINT'], ''],
        [['array_slice', '%element_slice%'], 'ARRAY_DECIMAL32', ['ARRAY_DECIMAL32', 'BIGINT', 'BIGINT'], ''],
        [['array_slice', '%element_slice%'], 'ARRAY_DECIMAL64', ['ARRAY_DECIMAL64', 'BIGINT', 'BIGINT'], ''],
        [['array_slice', '%element_slice%'], 'ARRAY_DECIMAL128', ['ARRAY_DECIMAL128', 'BIGINT', 'BIGINT'], ''],
        [['array_slice', '%element_slice%'], 'ARRAY_VARCHAR', ['ARRAY_VARCHAR', 'BIGINT', 'BIGINT'], ''],
        [['array_slice', '%element_slice%'], 'ARRAY_STRING', ['ARRAY_STRING', 'BIGINT', 'BIGINT'], ''],

        [['array_popback'], 'ARRAY_BOOLEAN', ['ARRAY_BOOLEAN'], ''],
        [['array_popback'], 'ARRAY_TINYINT', ['ARRAY_TINYINT'], ''],
        [['array_popback'], 'ARRAY_SMALLINT', ['ARRAY_SMALLINT'], ''],
        [['array_popback'], 'ARRAY_INT', ['ARRAY_INT'], ''],
        [['array_popback'], 'ARRAY_BIGINT', ['ARRAY_BIGINT'], ''],
        [['array_popback'], 'ARRAY_LARGEINT', ['ARRAY_LARGEINT'], ''],
        [['array_popback'], 'ARRAY_DATETIME', ['ARRAY_DATETIME'], ''],
        [['array_popback'], 'ARRAY_DATE', ['ARRAY_DATE'], ''],
        [['array_popback'], 'ARRAY_DATETIMEV2', ['ARRAY_DATETIMEV2'], ''],
        [['array_popback'], 'ARRAY_DATEV2', ['ARRAY_DATEV2'], ''],
        [['array_popback'], 'ARRAY_FLOAT', ['ARRAY_FLOAT'], ''],
        [['array_popback'], 'ARRAY_DOUBLE', ['ARRAY_DOUBLE'], ''],
        [['array_popback'], 'ARRAY_DECIMALV2', ['ARRAY_DECIMALV2'], ''],
        [['array_popback'], 'ARRAY_DECIMAL32', ['ARRAY_DECIMAL32'], ''],
        [['array_popback'], 'ARRAY_DECIMAL64', ['ARRAY_DECIMAL64'], ''],
        [['array_popback'], 'ARRAY_DECIMAL128', ['ARRAY_DECIMAL128'], ''],
        [['array_popback'], 'ARRAY_VARCHAR', ['ARRAY_VARCHAR'], ''],
        [['array_popback'], 'ARRAY_STRING', ['ARRAY_STRING'], ''],

        [['array_popfront'], 'ARRAY_BOOLEAN', ['ARRAY_BOOLEAN'], ''],
        [['array_popfront'], 'ARRAY_TINYINT', ['ARRAY_TINYINT'], ''],
        [['array_popfront'], 'ARRAY_SMALLINT', ['ARRAY_SMALLINT'], ''],
        [['array_popfront'], 'ARRAY_INT', ['ARRAY_INT'], ''],
        [['array_popfront'], 'ARRAY_BIGINT', ['ARRAY_BIGINT'], ''],
        [['array_popfront'], 'ARRAY_LARGEINT', ['ARRAY_LARGEINT'], ''],
        [['array_popfront'], 'ARRAY_DATETIME', ['ARRAY_DATETIME'], ''],
        [['array_popfront'], 'ARRAY_DATE', ['ARRAY_DATE'], ''],
        [['array_popfront'], 'ARRAY_DATETIMEV2', ['ARRAY_DATETIMEV2'], ''],
        [['array_popfront'], 'ARRAY_DATEV2', ['ARRAY_DATEV2'], ''],
        [['array_popfront'], 'ARRAY_FLOAT', ['ARRAY_FLOAT'], ''],
        [['array_popfront'], 'ARRAY_DOUBLE', ['ARRAY_DOUBLE'], ''],
        [['array_popfront'], 'ARRAY_DECIMALV2', ['ARRAY_DECIMALV2'], ''],
        [['array_popfront'], 'ARRAY_DECIMAL32', ['ARRAY_DECIMAL32'], ''],
        [['array_popfront'], 'ARRAY_DECIMAL64', ['ARRAY_DECIMAL64'], ''],
        [['array_popfront'], 'ARRAY_DECIMAL128', ['ARRAY_DECIMAL128'], ''],
        [['array_popfront'], 'ARRAY_VARCHAR', ['ARRAY_VARCHAR'], ''],
        [['array_popfront'], 'ARRAY_STRING', ['ARRAY_STRING'], ''],
        [['array_filter'], 'ARRAY_BOOLEAN',['ARRAY_BOOLEAN', 'ARRAY_BOOLEAN'], ''],
        [['array_filter'], 'ARRAY_TINYINT',['ARRAY_TINYINT', 'ARRAY_BOOLEAN'], ''],
        [['array_filter'], 'ARRAY_SMALLINT',['ARRAY_SMALLINT', 'ARRAY_BOOLEAN'], ''],
        [['array_filter'], 'ARRAY_INT',['ARRAY_INT', 'ARRAY_BOOLEAN'], ''],
        [['array_filter'], 'ARRAY_BIGINT',['ARRAY_BIGINT', 'ARRAY_BOOLEAN'], ''],
        [['array_filter'], 'ARRAY_LARGEINT',['ARRAY_LARGEINT', 'ARRAY_BOOLEAN'], ''],
        [['array_filter'], 'ARRAY_FLOAT',['ARRAY_FLOAT', 'ARRAY_BOOLEAN'], ''],
        [['array_filter'], 'ARRAY_DOUBLE',['ARRAY_DOUBLE', 'ARRAY_BOOLEAN'], ''],
        [['array_filter'], 'ARRAY_VARCHAR',['ARRAY_VARCHAR', 'ARRAY_BOOLEAN'], ''],
        [['array_filter'], 'ARRAY_STRING',['ARRAY_STRING', 'ARRAY_BOOLEAN'], ''],
        [['array_filter'], 'ARRAY_DECIMALV2',['ARRAY_DECIMALV2', 'ARRAY_BOOLEAN'], ''],
        [['array_filter'], 'ARRAY_DECIMAL32',['ARRAY_DECIMAL32', 'ARRAY_BOOLEAN'], ''],
        [['array_filter'], 'ARRAY_DECIMAL64',['ARRAY_DECIMAL64', 'ARRAY_BOOLEAN'], ''],
        [['array_filter'], 'ARRAY_DECIMAL128',['ARRAY_DECIMAL128', 'ARRAY_BOOLEAN'], ''],
        [['array_filter'], 'ARRAY_DATETIME',['ARRAY_DATETIME', 'ARRAY_BOOLEAN'], ''],
        [['array_filter'], 'ARRAY_DATE',['ARRAY_DATE', 'ARRAY_BOOLEAN'], ''],
        [['array_filter'], 'ARRAY_DATETIMEV2',['ARRAY_DATETIMEV2', 'ARRAY_BOOLEAN'], ''],
        [['array_filter'], 'ARRAY_DATEV2',['ARRAY_DATEV2', 'ARRAY_BOOLEAN'], ''],
        [['array_sortby'], 'ARRAY<K>',['ARRAY<K>', 'ARRAY_BOOLEAN'], 'CUSTOM', ['K']],
        [['array_sortby'], 'ARRAY<K>',['ARRAY<K>', 'ARRAY_TINYINT'], 'CUSTOM', ['K']],
        [['array_sortby'], 'ARRAY<K>',['ARRAY<K>', 'ARRAY_SMALLINT'], 'CUSTOM', ['K']],
        [['array_sortby'], 'ARRAY<K>',['ARRAY<K>', 'ARRAY_INT'], 'CUSTOM', ['K']],
        [['array_sortby'], 'ARRAY<K>',['ARRAY<K>', 'ARRAY_BIGINT'], 'CUSTOM', ['K']],
        [['array_sortby'], 'ARRAY<K>',['ARRAY<K>', 'ARRAY_LARGEINT'], 'CUSTOM', ['K']],
        [['array_sortby'], 'ARRAY<K>',['ARRAY<K>', 'ARRAY_FLOAT'], 'CUSTOM', ['K']],
        [['array_sortby'], 'ARRAY<K>',['ARRAY<K>', 'ARRAY_DOUBLE'], 'CUSTOM', ['K']],
        [['array_sortby'], 'ARRAY<K>',['ARRAY<K>', 'ARRAY_VARCHAR'], 'CUSTOM', ['K']],
        [['array_sortby'], 'ARRAY<K>',['ARRAY<K>', 'ARRAY_STRING'], 'CUSTOM', ['K']],
        [['array_sortby'], 'ARRAY<K>',['ARRAY<K>', 'ARRAY_DECIMALV2'], 'CUSTOM', ['K']],
        [['array_sortby'], 'ARRAY<K>',['ARRAY<K>', 'ARRAY_DECIMAL32'], 'CUSTOM', ['K']],
        [['array_sortby'], 'ARRAY<K>',['ARRAY<K>', 'ARRAY_DECIMAL64'], 'CUSTOM', ['K']],
        [['array_sortby'], 'ARRAY<K>',['ARRAY<K>', 'ARRAY_DECIMAL128'], 'CUSTOM', ['K']],
        [['array_sortby'], 'ARRAY<K>',['ARRAY<K>', 'ARRAY_DATETIME'], 'CUSTOM', ['K']],
        [['array_sortby'], 'ARRAY<K>',['ARRAY<K>', 'ARRAY_DATE'], 'CUSTOM', ['K']],
        [['array_sortby'], 'ARRAY<K>',['ARRAY<K>', 'ARRAY_DATETIMEV2'], 'CUSTOM', ['K']],
        [['array_sortby'], 'ARRAY<K>',['ARRAY<K>', 'ARRAY_DATEV2'], 'CUSTOM', ['K']],

        [['array_exists'], 'ARRAY_BOOLEAN', ['ARRAY_BOOLEAN'], ''],
        [['array_exists'], 'ARRAY_BOOLEAN', ['ARRAY_TINYINT'], ''],
        [['array_exists'], 'ARRAY_BOOLEAN', ['ARRAY_SMALLINT'], ''],
        [['array_exists'], 'ARRAY_BOOLEAN', ['ARRAY_INT'], ''],
        [['array_exists'], 'ARRAY_BOOLEAN', ['ARRAY_BIGINT'], ''],
        [['array_exists'], 'ARRAY_BOOLEAN', ['ARRAY_LARGEINT'], ''],
        [['array_exists'], 'ARRAY_BOOLEAN', ['ARRAY_DATETIME'], ''],
        [['array_exists'], 'ARRAY_BOOLEAN', ['ARRAY_DATE'], ''],
        [['array_exists'], 'ARRAY_BOOLEAN', ['ARRAY_DATETIMEV2'], ''],
        [['array_exists'], 'ARRAY_BOOLEAN', ['ARRAY_DATEV2'], ''],
        [['array_exists'], 'ARRAY_BOOLEAN', ['ARRAY_FLOAT'], ''],
        [['array_exists'], 'ARRAY_BOOLEAN', ['ARRAY_DOUBLE'], ''],
        [['array_exists'], 'ARRAY_BOOLEAN', ['ARRAY_DECIMALV2'], ''],
        [['array_exists'], 'ARRAY_BOOLEAN', ['ARRAY_DECIMAL32'], ''],
        [['array_exists'], 'ARRAY_BOOLEAN', ['ARRAY_DECIMAL64'], ''],
        [['array_exists'], 'ARRAY_BOOLEAN', ['ARRAY_DECIMAL128'], ''],
        [['array_exists'], 'ARRAY_BOOLEAN', ['ARRAY_VARCHAR'], ''],
        [['array_exists'], 'ARRAY_BOOLEAN', ['ARRAY_STRING'], ''],

        [['array_first_index'], 'BIGINT', ['ARRAY_BOOLEAN'], 'ALWAYS_NOT_NULLABLE'],
        [['array_last_index'], 'BIGINT', ['ARRAY_BOOLEAN'], 'ALWAYS_NOT_NULLABLE'],
        [['array_count'], 'BIGINT', ['ARRAY_BOOLEAN'], 'ALWAYS_NOT_NULLABLE'],

        [['array_shuffle', 'shuffle'], 'ARRAY_BOOLEAN',   ['ARRAY_BOOLEAN'], ''],
        [['array_shuffle', 'shuffle'], 'ARRAY_TINYINT',   ['ARRAY_TINYINT'], ''],
        [['array_shuffle', 'shuffle'], 'ARRAY_SMALLINT',  ['ARRAY_SMALLINT'], ''],
        [['array_shuffle', 'shuffle'], 'ARRAY_INT',       ['ARRAY_INT'], ''],
        [['array_shuffle', 'shuffle'], 'ARRAY_BIGINT',    ['ARRAY_BIGINT'], ''],
        [['array_shuffle', 'shuffle'], 'ARRAY_LARGEINT',  ['ARRAY_LARGEINT'], ''],
        [['array_shuffle', 'shuffle'], 'ARRAY_DATETIME',  ['ARRAY_DATETIME'], ''],
        [['array_shuffle', 'shuffle'], 'ARRAY_DATE',      ['ARRAY_DATE'], ''],
        [['array_shuffle', 'shuffle'], 'ARRAY_DATETIMEV2',  ['ARRAY_DATETIMEV2'], ''],
        [['array_shuffle', 'shuffle'], 'ARRAY_DATEV2',      ['ARRAY_DATEV2'], ''],
        [['array_shuffle', 'shuffle'], 'ARRAY_FLOAT',     ['ARRAY_FLOAT'], ''],
        [['array_shuffle', 'shuffle'], 'ARRAY_DOUBLE',    ['ARRAY_DOUBLE'], ''],
        [['array_shuffle', 'shuffle'], 'ARRAY_DECIMALV2', ['ARRAY_DECIMALV2'], ''],
        [['array_shuffle', 'shuffle'], 'ARRAY_DECIMAL32', ['ARRAY_DECIMAL32'], ''],
        [['array_shuffle', 'shuffle'], 'ARRAY_DECIMAL64', ['ARRAY_DECIMAL64'], ''],
        [['array_shuffle', 'shuffle'], 'ARRAY_DECIMAL128', ['ARRAY_DECIMAL128'], ''],
        [['array_shuffle', 'shuffle'], 'ARRAY_VARCHAR',   ['ARRAY_VARCHAR'], ''],
        [['array_shuffle', 'shuffle'], 'ARRAY_STRING',    ['ARRAY_STRING'], ''],

        [['array_shuffle', 'shuffle'], 'ARRAY_BOOLEAN',   ['ARRAY_BOOLEAN', 'BIGINT'], ''],
        [['array_shuffle', 'shuffle'], 'ARRAY_TINYINT',   ['ARRAY_TINYINT', 'BIGINT'], ''],
        [['array_shuffle', 'shuffle'], 'ARRAY_SMALLINT',  ['ARRAY_SMALLINT', 'BIGINT'], ''],
        [['array_shuffle', 'shuffle'], 'ARRAY_INT',       ['ARRAY_INT', 'BIGINT'], ''],
        [['array_shuffle', 'shuffle'], 'ARRAY_BIGINT',    ['ARRAY_BIGINT', 'BIGINT'], ''],
        [['array_shuffle', 'shuffle'], 'ARRAY_LARGEINT',  ['ARRAY_LARGEINT', 'BIGINT'], ''],
        [['array_shuffle', 'shuffle'], 'ARRAY_DATETIME',  ['ARRAY_DATETIME', 'BIGINT'], ''],
        [['array_shuffle', 'shuffle'], 'ARRAY_DATE',      ['ARRAY_DATE', 'BIGINT'], ''],
        [['array_shuffle', 'shuffle'], 'ARRAY_DATETIMEV2',  ['ARRAY_DATETIMEV2', 'BIGINT'], ''],
        [['array_shuffle', 'shuffle'], 'ARRAY_DATEV2',      ['ARRAY_DATEV2', 'BIGINT'], ''],
        [['array_shuffle', 'shuffle'], 'ARRAY_FLOAT',     ['ARRAY_FLOAT', 'BIGINT'], ''],
        [['array_shuffle', 'shuffle'], 'ARRAY_DOUBLE',    ['ARRAY_DOUBLE', 'BIGINT'], ''],
        [['array_shuffle', 'shuffle'], 'ARRAY_DECIMALV2', ['ARRAY_DECIMALV2', 'BIGINT'], ''],
        [['array_shuffle', 'shuffle'], 'ARRAY_DECIMAL32', ['ARRAY_DECIMAL32', 'BIGINT'], ''],
        [['array_shuffle', 'shuffle'], 'ARRAY_DECIMAL64', ['ARRAY_DECIMAL64', 'BIGINT'], ''],
        [['array_shuffle', 'shuffle'], 'ARRAY_DECIMAL128', ['ARRAY_DECIMAL128', 'BIGINT'], ''],
        [['array_shuffle', 'shuffle'], 'ARRAY_VARCHAR',   ['ARRAY_VARCHAR', 'BIGINT'], ''],
        [['array_shuffle', 'shuffle'], 'ARRAY_STRING',    ['ARRAY_STRING', 'BIGINT'], ''],

        [['array_pushfront'], 'ARRAY_BOOLEAN',    ['ARRAY_BOOLEAN', 'BOOLEAN'], 'ALWAYS_NULLABLE'],
        [['array_pushfront'], 'ARRAY_TINYINT',    ['ARRAY_TINYINT', 'TINYINT'], 'ALWAYS_NULLABLE'],
        [['array_pushfront'], 'ARRAY_SMALLINT',   ['ARRAY_SMALLINT', 'SMALLINT'], 'ALWAYS_NULLABLE'],
        [['array_pushfront'], 'ARRAY_INT',        ['ARRAY_INT', 'INT'], 'ALWAYS_NULLABLE'],
        [['array_pushfront'], 'ARRAY_BIGINT',     ['ARRAY_BIGINT', 'BIGINT'], 'ALWAYS_NULLABLE'],
        [['array_pushfront'], 'ARRAY_LARGEINT',   ['ARRAY_LARGEINT', 'LARGEINT'], 'ALWAYS_NULLABLE'],
        [['array_pushfront'], 'ARRAY_DATETIME',   ['ARRAY_DATETIME', 'DATETIME'], 'ALWAYS_NULLABLE'],
        [['array_pushfront'], 'ARRAY_DATE',       ['ARRAY_DATE', 'DATE'], 'ALWAYS_NULLABLE'],
        [['array_pushfront'], 'ARRAY_DATETIMEV2', ['ARRAY_DATETIMEV2', 'DATETIMEV2'], 'ALWAYS_NULLABLE'],
        [['array_pushfront'], 'ARRAY_DATEV2',     ['ARRAY_DATEV2', 'DATEV2'], 'ALWAYS_NULLABLE'],
        [['array_pushfront'], 'ARRAY_FLOAT',      ['ARRAY_FLOAT', 'FLOAT'], 'ALWAYS_NULLABLE'],
        [['array_pushfront'], 'ARRAY_DOUBLE',     ['ARRAY_DOUBLE', 'DOUBLE'], 'ALWAYS_NULLABLE'],
        [['array_pushfront'], 'ARRAY_DECIMALV2',  ['ARRAY_DECIMALV2', 'DECIMALV2'], 'ALWAYS_NULLABLE'],
        [['array_pushfront'], 'ARRAY_DECIMAL32',  ['ARRAY_DECIMAL32', 'DECIMAL32'], 'ALWAYS_NULLABLE'],
        [['array_pushfront'], 'ARRAY_DECIMAL64',  ['ARRAY_DECIMAL64', 'DECIMAL64'], 'ALWAYS_NULLABLE'],
        [['array_pushfront'], 'ARRAY_DECIMAL128', ['ARRAY_DECIMAL128', 'DECIMAL128'], 'ALWAYS_NULLABLE'],
        [['array_pushfront'], 'ARRAY_VARCHAR',    ['ARRAY_VARCHAR', 'VARCHAR'], 'ALWAYS_NULLABLE'],
        [['array_pushfront'], 'ARRAY_STRING',     ['ARRAY_STRING', 'STRING'], 'ALWAYS_NULLABLE'],

        [['array_pushback'], 'ARRAY_BOOLEAN',    ['ARRAY_BOOLEAN', 'BOOLEAN'], 'ALWAYS_NULLABLE'],
        [['array_pushback'], 'ARRAY_TINYINT',    ['ARRAY_TINYINT', 'TINYINT'], 'ALWAYS_NULLABLE'],
        [['array_pushback'], 'ARRAY_SMALLINT',   ['ARRAY_SMALLINT', 'SMALLINT'], 'ALWAYS_NULLABLE'],
        [['array_pushback'], 'ARRAY_INT',        ['ARRAY_INT', 'INT'], 'ALWAYS_NULLABLE'],
        [['array_pushback'], 'ARRAY_BIGINT',     ['ARRAY_BIGINT', 'BIGINT'], 'ALWAYS_NULLABLE'],
        [['array_pushback'], 'ARRAY_LARGEINT',   ['ARRAY_LARGEINT', 'LARGEINT'], 'ALWAYS_NULLABLE'],
        [['array_pushback'], 'ARRAY_DATETIME',   ['ARRAY_DATETIME', 'DATETIME'], 'ALWAYS_NULLABLE'],
        [['array_pushback'], 'ARRAY_DATE',       ['ARRAY_DATE', 'DATE'], 'ALWAYS_NULLABLE'],
        [['array_pushback'], 'ARRAY_DATETIMEV2', ['ARRAY_DATETIMEV2', 'DATETIMEV2'], 'ALWAYS_NULLABLE'],
        [['array_pushback'], 'ARRAY_DATEV2',     ['ARRAY_DATEV2', 'DATEV2'], 'ALWAYS_NULLABLE'],
        [['array_pushback'], 'ARRAY_FLOAT',      ['ARRAY_FLOAT', 'FLOAT'], 'ALWAYS_NULLABLE'],
        [['array_pushback'], 'ARRAY_DOUBLE',     ['ARRAY_DOUBLE', 'DOUBLE'], 'ALWAYS_NULLABLE'],
        [['array_pushback'], 'ARRAY_DECIMALV2',  ['ARRAY_DECIMALV2', 'DECIMALV2'], 'ALWAYS_NULLABLE'],
        [['array_pushback'], 'ARRAY_DECIMAL32',  ['ARRAY_DECIMAL32', 'DECIMAL32'], 'ALWAYS_NULLABLE'],
        [['array_pushback'], 'ARRAY_DECIMAL64',  ['ARRAY_DECIMAL64', 'DECIMAL64'], 'ALWAYS_NULLABLE'],
        [['array_pushback'], 'ARRAY_DECIMAL128', ['ARRAY_DECIMAL128', 'DECIMAL128'], 'ALWAYS_NULLABLE'],
        [['array_pushback'], 'ARRAY_VARCHAR',    ['ARRAY_VARCHAR', 'VARCHAR'], 'ALWAYS_NULLABLE'],
        [['array_pushback'], 'ARRAY_STRING',     ['ARRAY_STRING', 'STRING'], 'ALWAYS_NULLABLE'],
    
        [['array_with_constant'], 'ARRAY_BOOLEAN', ['BIGINT', 'BOOLEAN'], 'ALWAYS_NOT_NULLABLE'],
        [['array_with_constant'], 'ARRAY_TINYINT', ['BIGINT', 'TINYINT'], 'ALWAYS_NOT_NULLABLE'],
        [['array_with_constant'], 'ARRAY_SMALLINT', ['BIGINT','SMALLINT'], 'ALWAYS_NOT_NULLABLE'],
        [['array_with_constant'], 'ARRAY_INT', ['BIGINT', 'INT'], 'ALWAYS_NOT_NULLABLE'],
        [['array_with_constant'], 'ARRAY_BIGINT', ['BIGINT', 'BIGINT'], 'ALWAYS_NOT_NULLABLE'],
        [['array_with_constant'], 'ARRAY_LARGEINT', ['BIGINT', 'LARGEINT'], 'ALWAYS_NOT_NULLABLE'],
        [['array_with_constant'], 'ARRAY_DATETIME', ['BIGINT', 'DATETIME'], 'ALWAYS_NOT_NULLABLE'],
        [['array_with_constant'], 'ARRAY_DATE', ['BIGINT', 'DATE'], 'ALWAYS_NOT_NULLABLE'],
        [['array_with_constant'], 'ARRAY_DATETIMEV2', ['BIGINT', 'DATETIMEV2'], 'ALWAYS_NOT_NULLABLE'],
        [['array_with_constant'], 'ARRAY_DATEV2', ['BIGINT', 'DATEV2'], 'ALWAYS_NOT_NULLABLE'],
        [['array_with_constant'], 'ARRAY_FLOAT', ['BIGINT', 'FLOAT'], 'ALWAYS_NOT_NULLABLE'],
        [['array_with_constant'], 'ARRAY_DOUBLE', ['BIGINT', 'DOUBLE'], 'ALWAYS_NOT_NULLABLE'],
        [['array_with_constant'], 'ARRAY_DECIMALV2', ['BIGINT', 'DECIMALV2'], 'ALWAYS_NOT_NULLABLE'],
        [['array_with_constant'], 'ARRAY_DECIMAL32', ['BIGINT', 'DECIMAL32'], 'ALWAYS_NOT_NULLABLE'],
        [['array_with_constant'], 'ARRAY_DECIMAL64', ['BIGINT', 'DECIMAL64'], 'ALWAYS_NOT_NULLABLE'],
        [['array_with_constant'], 'ARRAY_DECIMAL128', ['BIGINT', 'DECIMAL128'], 'ALWAYS_NOT_NULLABLE'],
        [['array_with_constant'], 'ARRAY_VARCHAR', ['BIGINT', 'VARCHAR'], 'ALWAYS_NOT_NULLABLE'],
        [['array_with_constant'], 'ARRAY_STRING', ['BIGINT', 'STRING'], 'ALWAYS_NOT_NULLABLE'],

        [['array_repeat'], 'ARRAY_BOOLEAN', ['BOOLEAN', 'BIGINT'], 'ALWAYS_NOT_NULLABLE'],
        [['array_repeat'], 'ARRAY_TINYINT', ['TINYINT', 'BIGINT'], 'ALWAYS_NOT_NULLABLE'],
        [['array_repeat'], 'ARRAY_SMALLINT', ['SMALLINT', 'BIGINT'], 'ALWAYS_NOT_NULLABLE'],
        [['array_repeat'], 'ARRAY_INT', ['INT', 'BIGINT'], 'ALWAYS_NOT_NULLABLE'],
        [['array_repeat'], 'ARRAY_BIGINT', ['BIGINT', 'BIGINT'], 'ALWAYS_NOT_NULLABLE'],
        [['array_repeat'], 'ARRAY_LARGEINT', ['LARGEINT', 'BIGINT'], 'ALWAYS_NOT_NULLABLE'],
        [['array_repeat'], 'ARRAY_DATETIME', ['DATETIME', 'BIGINT'], 'ALWAYS_NOT_NULLABLE'],
        [['array_repeat'], 'ARRAY_DATE', ['DATE', 'BIGINT'], 'ALWAYS_NOT_NULLABLE'],
        [['array_repeat'], 'ARRAY_DATETIMEV2', ['DATETIMEV2', 'BIGINT'], 'ALWAYS_NOT_NULLABLE'],
        [['array_repeat'], 'ARRAY_DATEV2', ['DATEV2', 'BIGINT'], 'ALWAYS_NOT_NULLABLE'],
        [['array_repeat'], 'ARRAY_FLOAT', ['FLOAT', 'BIGINT'], 'ALWAYS_NOT_NULLABLE'],
        [['array_repeat'], 'ARRAY_DOUBLE', ['DOUBLE', 'BIGINT'], 'ALWAYS_NOT_NULLABLE'],
        [['array_repeat'], 'ARRAY_DECIMALV2', ['DECIMALV2', 'BIGINT'], 'ALWAYS_NOT_NULLABLE'],
        [['array_repeat'], 'ARRAY_DECIMAL32', ['DECIMAL32', 'BIGINT'], 'ALWAYS_NOT_NULLABLE'],
        [['array_repeat'], 'ARRAY_DECIMAL64', ['DECIMAL64', 'BIGINT'], 'ALWAYS_NOT_NULLABLE'],
        [['array_repeat'], 'ARRAY_DECIMAL128', ['DECIMAL128', 'BIGINT'], 'ALWAYS_NOT_NULLABLE'],
        [['array_repeat'], 'ARRAY_VARCHAR', ['VARCHAR', 'BIGINT'], 'ALWAYS_NOT_NULLABLE'],
        [['array_repeat'], 'ARRAY_STRING', ['STRING', 'BIGINT'], 'ALWAYS_NOT_NULLABLE'],

        [['array_range'], 'ARRAY_INT', ['INT'], 'ALWAYS_NULLABLE'],
        [['array_range'], 'ARRAY_INT', ['INT', 'INT'], 'ALWAYS_NULLABLE'],
        [['array_range'], 'ARRAY_INT', ['INT', 'INT', 'INT'], 'ALWAYS_NULLABLE'],

        [['array_zip'], 'ARRAY', ['ARRAY', '...'], ''],


        # reverse function for string builtin
        [['reverse'], 'VARCHAR', ['VARCHAR'], ''],
        # reverse function support the longtext
        [['reverse'], 'STRING', ['STRING'], ''],
        # reverse function support the array type
        [['reverse'], 'ARRAY_TINYINT',   ['ARRAY_TINYINT'], ''],
        [['reverse'], 'ARRAY_SMALLINT',  ['ARRAY_SMALLINT'], ''],
        [['reverse'], 'ARRAY_INT',       ['ARRAY_INT'], ''],
        [['reverse'], 'ARRAY_BIGINT',    ['ARRAY_BIGINT'], ''],
        [['reverse'], 'ARRAY_LARGEINT',  ['ARRAY_LARGEINT'], ''],
        [['reverse'], 'ARRAY_DATETIME',  ['ARRAY_DATETIME'], ''],
        [['reverse'], 'ARRAY_DATE',      ['ARRAY_DATE'], ''],
        [['reverse'], 'ARRAY_DATETIMEV2',  ['ARRAY_DATETIMEV2'], ''],
        [['reverse'], 'ARRAY_DATEV2',      ['ARRAY_DATEV2'], ''],
        [['reverse'], 'ARRAY_FLOAT',     ['ARRAY_FLOAT'], ''],
        [['reverse'], 'ARRAY_DOUBLE',    ['ARRAY_DOUBLE'], ''],
        [['reverse'], 'ARRAY_DECIMALV2', ['ARRAY_DECIMALV2'], ''],
        [['reverse'], 'ARRAY_DECIMAL32', ['ARRAY_DECIMAL32'], ''],
        [['reverse'], 'ARRAY_DECIMAL64', ['ARRAY_DECIMAL64'], ''],
        [['reverse'], 'ARRAY_DECIMAL128', ['ARRAY_DECIMAL128'], ''],
        [['reverse'], 'ARRAY_VARCHAR',   ['ARRAY_VARCHAR'], ''],
        [['reverse'], 'ARRAY_STRING',    ['ARRAY_STRING'], '']
    ],

    # Timestamp functions
    "Timestamp": [
        [['unix_timestamp'], 'INT', [], 'ALWAYS_NOT_NULLABLE'],
        [['unix_timestamp'], 'INT', ['DATETIME'], 'ALWAYS_NULLABLE'],
        [['unix_timestamp'], 'INT', ['DATE'], 'ALWAYS_NULLABLE'],
        [['unix_timestamp'], 'INT', ['DATETIMEV2'], ''],
        [['unix_timestamp'], 'INT', ['DATEV2'], ''],
        [['unix_timestamp'], 'INT', ['VARCHAR', 'VARCHAR'], 'ALWAYS_NULLABLE'],
        [['unix_timestamp'], 'INT', ['STRING', 'STRING'], 'ALWAYS_NULLABLE'],
        [['from_unixtime'], 'VARCHAR', ['INT'], 'ALWAYS_NULLABLE'],
        [['from_unixtime'], 'VARCHAR', ['INT', 'VARCHAR'], 'ALWAYS_NULLABLE'],
        [['from_unixtime'], 'VARCHAR', ['INT', 'STRING'], 'ALWAYS_NULLABLE'],
        [['now', 'current_timestamp', 'localtime', 'localtimestamp'], 'DATETIME', [], 'ALWAYS_NOT_NULLABLE'],
        [['now', 'current_timestamp', 'localtime', 'localtimestamp'], 'DATETIMEV2', ['INT'], 'ALWAYS_NOT_NULLABLE'],
        [['curtime', 'current_time'], 'TIME', [], 'ALWAYS_NOT_NULLABLE'],
        [['curdate', 'current_date'], 'DATE', [], 'ALWAYS_NOT_NULLABLE'],
        [['utc_timestamp'], 'DATETIME', [], 'ALWAYS_NOT_NULLABLE'],
        [['timestamp'], 'DATETIME', ['DATETIME'], 'ALWAYS_NULLABLE'],

        [['from_days'], 'DATE', ['INT'], 'ALWAYS_NULLABLE'],
        [['last_day'], 'DATE', ['DATETIME'], 'ALWAYS_NULLABLE'],
        [['last_day'], 'DATE', ['DATE'], 'ALWAYS_NULLABLE'],
        [['last_day'], 'DATEV2', ['DATETIMEV2'], ''],
        [['last_day'], 'DATEV2', ['DATEV2'], ''],
        [['to_monday'], 'DATEV2', ['DATETIMEV2'], ''],
        [['to_monday'], 'DATEV2', ['DATEV2'], ''],
        [['to_monday'], 'DATE', ['DATETIME'], 'ALWAYS_NULLABLE'],
        [['to_monday'], 'DATE', ['DATE'], 'ALWAYS_NULLABLE'],
        [['to_days'], 'INT', ['DATE'], 'ALWAYS_NULLABLE'],

        [['date_trunc'], 'DATETIME', ['DATETIME', 'VARCHAR'], 'ALWAYS_NULLABLE'],

        [['date_trunc'], 'DATETIMEV2', ['DATETIMEV2', 'VARCHAR'], 'ALWAYS_NULLABLE'],

        [['year'], 'SMALLINT', ['DATETIME'], 'ALWAYS_NULLABLE'],
        [['month'], 'TINYINT', ['DATETIME'], 'ALWAYS_NULLABLE'],
        [['quarter'], 'TINYINT', ['DATETIME'], 'ALWAYS_NULLABLE'],
        [['dayofweek'], 'TINYINT', ['DATETIME'], 'ALWAYS_NULLABLE'],
        [['weekday'], 'TINYINT', ['DATETIME'], 'ALWAYS_NULLABLE'],
        [['day', 'dayofmonth'], 'TINYINT', ['DATETIME'], 'ALWAYS_NULLABLE'],
        [['dayofyear'], 'SMALLINT', ['DATETIME'], 'ALWAYS_NULLABLE'],
        [['weekofyear'], 'TINYINT', ['DATETIME'], 'ALWAYS_NULLABLE'],
        [['yearweek'], 'INT', ['DATETIME'], 'ALWAYS_NULLABLE'],
        [['yearweek'], 'INT', ['DATETIME', 'INT'], 'ALWAYS_NULLABLE'],
        [['week'], 'TINYINT', ['DATETIME'], 'ALWAYS_NULLABLE'],
        [['week'], 'TINYINT', ['DATETIME', 'INT'], 'ALWAYS_NULLABLE'],
        [['hour'], 'TINYINT', ['DATETIME'], 'ALWAYS_NULLABLE'],
        [['minute'], 'TINYINT', ['DATETIME'], 'ALWAYS_NULLABLE'],
        [['second'], 'TINYINT', ['DATETIME'], 'ALWAYS_NULLABLE'],

        [['makedate'], 'DATE', ['INT', 'INT'], 'ALWAYS_NULLABLE'],
        [['years_add'], 'DATETIME', ['DATETIME', 'INT'], 'ALWAYS_NULLABLE'],
        [['years_sub'], 'DATETIME', ['DATETIME', 'INT'], 'ALWAYS_NULLABLE'],
        [['months_add', 'add_months'], 'DATETIME', ['DATETIME', 'INT'], 'ALWAYS_NULLABLE'],
        [['months_sub'], 'DATETIME', ['DATETIME', 'INT'], 'ALWAYS_NULLABLE'],
        [['weeks_add'], 'DATETIME', ['DATETIME', 'INT'], 'ALWAYS_NULLABLE'],
        [['weeks_sub'], 'DATETIME', ['DATETIME', 'INT'], 'ALWAYS_NULLABLE'],
        [['days_add', 'date_add', 'adddate'], 'DATETIME', ['DATETIME', 'INT'], 'ALWAYS_NULLABLE'],
        [['days_sub', 'date_sub', 'subdate'], 'DATETIME', ['DATETIME', 'INT'], 'ALWAYS_NULLABLE'],
        [['hours_add'], 'DATETIME', ['DATETIME', 'INT'], 'ALWAYS_NULLABLE'],
        [['hours_sub'], 'DATETIME', ['DATETIME', 'INT'], 'ALWAYS_NULLABLE'],
        [['minutes_add'], 'DATETIME', ['DATETIME', 'INT'], 'ALWAYS_NULLABLE'],
        [['minutes_sub'], 'DATETIME', ['DATETIME', 'INT'], 'ALWAYS_NULLABLE'],
        [['seconds_add'], 'DATETIME', ['DATETIME', 'INT'], 'ALWAYS_NULLABLE'],
        [['seconds_sub'], 'DATETIME', ['DATETIME', 'INT'], 'ALWAYS_NULLABLE'],
        [['microseconds_add'], 'DATETIME', ['DATETIME', 'INT'], ''],
        [['microseconds_sub'], 'DATETIME', ['DATETIME', 'INT'], ''],

        [['datediff'], 'INT', ['DATETIME', 'DATETIME'], 'ALWAYS_NULLABLE'],
        [['timediff'], 'TIME', ['DATETIME', 'DATETIME'], 'ALWAYS_NULLABLE'],

        [['str_to_date'], 'DATETIME', ['VARCHAR', 'VARCHAR'], 'ALWAYS_NULLABLE'],
        [['str_to_date'], 'DATETIME', ['STRING', 'STRING'], 'ALWAYS_NULLABLE'],
        [['date_format'], 'VARCHAR', ['DATETIME', 'VARCHAR'], 'ALWAYS_NULLABLE'],
        [['date_format'], 'VARCHAR', ['DATE', 'VARCHAR'], 'ALWAYS_NULLABLE'],
        [['date', 'to_date'], 'DATE', ['DATETIME'], 'ALWAYS_NULLABLE'],

        [['dayname'], 'VARCHAR', ['DATETIME'], 'ALWAYS_NULLABLE'],
        [['monthname'], 'VARCHAR', ['DATETIME'], 'ALWAYS_NULLABLE'],

        [['convert_tz'], 'DATETIME', ['DATETIME', 'VARCHAR', 'VARCHAR'], 'ALWAYS_NULLABLE'],

        [['years_diff'], 'BIGINT', ['DATETIME', 'DATETIME'], 'ALWAYS_NULLABLE'],
        [['months_diff'], 'BIGINT', ['DATETIME', 'DATETIME'], 'ALWAYS_NULLABLE'],
        [['weeks_diff'], 'BIGINT', ['DATETIME', 'DATETIME'], 'ALWAYS_NULLABLE'],
        [['days_diff'], 'BIGINT', ['DATETIME', 'DATETIME'], 'ALWAYS_NULLABLE'],
        [['hours_diff'], 'BIGINT', ['DATETIME', 'DATETIME'], 'ALWAYS_NULLABLE'],
        [['minutes_diff'], 'BIGINT', ['DATETIME', 'DATETIME'], 'ALWAYS_NULLABLE'],
        [['seconds_diff'], 'BIGINT', ['DATETIME', 'DATETIME'], 'ALWAYS_NULLABLE'],

        [['year_floor'], 'DATETIME', ['DATETIME'], 'ALWAYS_NULLABLE'],
        [['year_floor'], 'DATETIME', ['DATETIME', 'DATETIME'], 'ALWAYS_NULLABLE'],
        [['year_floor'], 'DATETIME', ['DATETIME', 'INT'], 'ALWAYS_NULLABLE'],
        [['year_floor'], 'DATETIME', ['DATETIME', 'INT', 'DATETIME'], 'ALWAYS_NULLABLE'],
        [['year_ceil'], 'DATETIME', ['DATETIME'], 'ALWAYS_NULLABLE'],
        [['year_ceil'], 'DATETIME', ['DATETIME', 'DATETIME'], 'ALWAYS_NULLABLE'],
        [['year_ceil'], 'DATETIME', ['DATETIME', 'INT'], 'ALWAYS_NULLABLE'],
        [['year_ceil'], 'DATETIME', ['DATETIME', 'INT', 'DATETIME'], 'ALWAYS_NULLABLE'],
        [['month_floor'], 'DATETIME', ['DATETIME'], 'ALWAYS_NULLABLE'],
        [['month_floor'], 'DATETIME', ['DATETIME', 'DATETIME'], 'ALWAYS_NULLABLE'],
        [['month_floor'], 'DATETIME', ['DATETIME', 'INT'], 'ALWAYS_NULLABLE'],
        [['month_floor'], 'DATETIME', ['DATETIME', 'INT', 'DATETIME'], 'ALWAYS_NULLABLE'],
        [['month_ceil'], 'DATETIME', ['DATETIME'], 'ALWAYS_NULLABLE'],
        [['month_ceil'], 'DATETIME', ['DATETIME', 'DATETIME'], 'ALWAYS_NULLABLE'],
        [['month_ceil'], 'DATETIME', ['DATETIME', 'INT'], 'ALWAYS_NULLABLE'],
        [['month_ceil'], 'DATETIME', ['DATETIME', 'INT', 'DATETIME'], 'ALWAYS_NULLABLE'],
        [['week_floor'], 'DATETIME', ['DATETIME'], 'ALWAYS_NULLABLE'],
        [['week_floor'], 'DATETIME', ['DATETIME', 'DATETIME'], 'ALWAYS_NULLABLE'],
        [['week_floor'], 'DATETIME', ['DATETIME', 'INT'], 'ALWAYS_NULLABLE'],
        [['week_floor'], 'DATETIME', ['DATETIME', 'INT', 'DATETIME'], 'ALWAYS_NULLABLE'],
        [['week_ceil'], 'DATETIME', ['DATETIME'], 'ALWAYS_NULLABLE'],
        [['week_ceil'], 'DATETIME', ['DATETIME', 'DATETIME'], 'ALWAYS_NULLABLE'],
        [['week_ceil'], 'DATETIME', ['DATETIME', 'INT'], 'ALWAYS_NULLABLE'],
        [['week_ceil'], 'DATETIME', ['DATETIME', 'INT', 'DATETIME'], 'ALWAYS_NULLABLE'],
        [['day_floor'], 'DATETIME', ['DATETIME'], 'ALWAYS_NULLABLE'],
        [['day_floor'], 'DATETIME', ['DATETIME', 'DATETIME'], 'ALWAYS_NULLABLE'],
        [['day_floor'], 'DATETIME', ['DATETIME', 'INT'], 'ALWAYS_NULLABLE'],
        [['day_floor'], 'DATETIME', ['DATETIME', 'INT', 'DATETIME'], 'ALWAYS_NULLABLE'],
        [['day_ceil'], 'DATETIME', ['DATETIME'], 'ALWAYS_NULLABLE'],
        [['day_ceil'], 'DATETIME', ['DATETIME', 'DATETIME'], 'ALWAYS_NULLABLE'],
        [['day_ceil'], 'DATETIME', ['DATETIME', 'INT'], 'ALWAYS_NULLABLE'],
        [['day_ceil'], 'DATETIME', ['DATETIME', 'INT', 'DATETIME'], 'ALWAYS_NULLABLE'],
        [['hour_floor'], 'DATETIME', ['DATETIME'], 'ALWAYS_NULLABLE'],
        [['hour_floor'], 'DATETIME', ['DATETIME', 'DATETIME'], 'ALWAYS_NULLABLE'],
        [['hour_floor'], 'DATETIME', ['DATETIME', 'INT'], 'ALWAYS_NULLABLE'],
        [['hour_floor'], 'DATETIME', ['DATETIME', 'INT', 'DATETIME'], 'ALWAYS_NULLABLE'],
        [['hour_ceil'], 'DATETIME', ['DATETIME'], 'ALWAYS_NULLABLE'],
        [['hour_ceil'], 'DATETIME', ['DATETIME', 'DATETIME'], 'ALWAYS_NULLABLE'],
        [['hour_ceil'], 'DATETIME', ['DATETIME', 'INT'], 'ALWAYS_NULLABLE'],
        [['hour_ceil'], 'DATETIME', ['DATETIME', 'INT', 'DATETIME'], 'ALWAYS_NULLABLE'],
        [['minute_floor'], 'DATETIME', ['DATETIME'], 'ALWAYS_NULLABLE'],
        [['minute_floor'], 'DATETIME', ['DATETIME', 'DATETIME'], 'ALWAYS_NULLABLE'],
        [['minute_floor'], 'DATETIME', ['DATETIME', 'INT'], 'ALWAYS_NULLABLE'],
        [['minute_floor'], 'DATETIME', ['DATETIME', 'INT', 'DATETIME'], 'ALWAYS_NULLABLE'],
        [['minute_ceil'], 'DATETIME', ['DATETIME'], 'ALWAYS_NULLABLE'],
        [['minute_ceil'], 'DATETIME', ['DATETIME', 'DATETIME'], 'ALWAYS_NULLABLE'],
        [['minute_ceil'], 'DATETIME', ['DATETIME', 'INT'], 'ALWAYS_NULLABLE'],
        [['minute_ceil'], 'DATETIME', ['DATETIME', 'INT', 'DATETIME'], 'ALWAYS_NULLABLE'],
        [['second_floor'], 'DATETIME', ['DATETIME'], 'ALWAYS_NULLABLE'],
        [['second_floor'], 'DATETIME', ['DATETIME', 'DATETIME'], 'ALWAYS_NULLABLE'],
        [['second_floor'], 'DATETIME', ['DATETIME', 'INT'], 'ALWAYS_NULLABLE'],
        [['second_floor'], 'DATETIME', ['DATETIME', 'INT', 'DATETIME'], 'ALWAYS_NULLABLE'],
        [['second_ceil'], 'DATETIME', ['DATETIME'], 'ALWAYS_NULLABLE'],
        [['second_ceil'], 'DATETIME', ['DATETIME', 'DATETIME'], 'ALWAYS_NULLABLE'],
        [['second_ceil'], 'DATETIME', ['DATETIME', 'INT'], 'ALWAYS_NULLABLE'],
        [['second_ceil'], 'DATETIME', ['DATETIME', 'INT', 'DATETIME'], 'ALWAYS_NULLABLE'],

        [['timestamp'], 'DATETIMEV2', ['DATETIMEV2'], ''],

        [['to_days'], 'INT', ['DATEV2'], ''],
        [['time_to_sec'], 'INT', ['TIME'], ''],

        [['year'], 'SMALLINT', ['DATETIMEV2'], ''],
        [['month'], 'TINYINT', ['DATETIMEV2'], ''],
        [['quarter'], 'TINYINT', ['DATETIMEV2'], ''],
        [['dayofweek'], 'TINYINT', ['DATETIMEV2'], ''],
        [['weekday'], 'TINYINT', ['DATETIMEV2'], ''],
        [['day', 'dayofmonth'], 'TINYINT', ['DATETIMEV2'], ''],
        [['dayofyear'], 'SMALLINT', ['DATETIMEV2'], ''],
        [['weekofyear'], 'TINYINT', ['DATETIMEV2'], ''],
        [['yearweek'], 'INT', ['DATETIMEV2'], ''],
        [['yearweek'], 'INT', ['DATETIMEV2', 'INT'], ''],
        [['week'], 'TINYINT', ['DATETIMEV2'], ''],
        [['week'], 'TINYINT', ['DATETIMEV2', 'INT'], ''],
        [['hour'], 'TINYINT', ['DATETIMEV2'], ''],
        [['minute'], 'TINYINT', ['DATETIMEV2'], ''],
        [['second'], 'TINYINT', ['DATETIMEV2'], ''],
        [['microsecond'], 'INT', ['DATETIMEV2'], ''],

        [['year'], 'SMALLINT', ['DATEV2'], ''],
        [['month'], 'TINYINT', ['DATEV2'], ''],
        [['quarter'], 'TINYINT', ['DATEV2'], ''],
        [['dayofweek'], 'TINYINT', ['DATEV2'], ''],
        [['weekday'], 'TINYINT', ['DATEV2'], ''],
        [['day', 'dayofmonth'], 'TINYINT', ['DATEV2'], ''],
        [['dayofyear'], 'SMALLINT', ['DATEV2'], ''],
        [['weekofyear'], 'TINYINT', ['DATEV2'], ''],
        [['yearweek'], 'INT', ['DATEV2'], ''],
        [['yearweek'], 'INT', ['DATEV2', 'INT'], ''],
        [['week'], 'TINYINT', ['DATEV2'], ''],
        [['week'], 'TINYINT', ['DATEV2', 'INT'], ''],
        [['hour'], 'TINYINT', ['DATEV2'], ''],
        [['minute'], 'TINYINT', ['DATEV2'], ''],
        [['second'], 'TINYINT', ['DATEV2'], ''],

        [['years_add'], 'DATETIMEV2', ['DATETIMEV2', 'INT'], ''],
        [['years_sub'], 'DATETIMEV2', ['DATETIMEV2', 'INT'], ''],
        [['months_add', 'add_months'], 'DATETIMEV2', ['DATETIMEV2', 'INT'], ''],
        [['months_sub'], 'DATETIMEV2', ['DATETIMEV2', 'INT'], ''],
        [['weeks_add'], 'DATETIMEV2', ['DATETIMEV2', 'INT'], ''],
        [['weeks_sub'], 'DATETIMEV2', ['DATETIMEV2', 'INT'], ''],
        [['days_add', 'date_add', 'adddate'], 'DATETIMEV2', ['DATETIMEV2', 'INT'], ''],
        [['days_sub', 'date_sub', 'subdate'], 'DATETIMEV2', ['DATETIMEV2', 'INT'], ''],
        [['hours_add'], 'DATETIMEV2', ['DATETIMEV2', 'INT'], ''],
        [['hours_sub'], 'DATETIMEV2', ['DATETIMEV2', 'INT'], ''],
        [['minutes_add'], 'DATETIMEV2', ['DATETIMEV2', 'INT'], ''],
        [['minutes_sub'], 'DATETIMEV2', ['DATETIMEV2', 'INT'], ''],
        [['seconds_add'], 'DATETIMEV2', ['DATETIMEV2', 'INT'], ''],
        [['seconds_sub'], 'DATETIMEV2', ['DATETIMEV2', 'INT'], ''],
        [['microseconds_add'], 'DATETIMEV2', ['DATETIMEV2', 'INT'], ''],
        [['microseconds_sub'], 'DATETIMEV2', ['DATETIMEV2', 'INT'], ''],

        [['years_add'], 'DATEV2', ['DATEV2', 'INT'], ''],
        [['years_sub'], 'DATEV2', ['DATEV2', 'INT'], ''],
        [['months_add', 'add_months'], 'DATEV2', ['DATEV2', 'INT'], ''],
        [['months_sub'], 'DATEV2', ['DATEV2', 'INT'], ''],
        [['weeks_add'], 'DATEV2', ['DATEV2', 'INT'], ''],
        [['weeks_sub'], 'DATEV2', ['DATEV2', 'INT'], ''],
        [['days_add', 'date_add', 'adddate'], 'DATEV2', ['DATEV2', 'INT'], ''],
        [['days_sub', 'date_sub', 'subdate'], 'DATEV2', ['DATEV2', 'INT'], ''],
        [['hours_add'], 'DATETIMEV2', ['DATEV2', 'INT'], ''],
        [['hours_sub'], 'DATETIMEV2', ['DATEV2', 'INT'], ''],
        [['minutes_add'], 'DATETIMEV2', ['DATEV2', 'INT'], ''],
        [['minutes_sub'], 'DATETIMEV2', ['DATEV2', 'INT'], ''],
        [['seconds_add'], 'DATETIMEV2', ['DATEV2', 'INT'], ''],
        [['seconds_sub'], 'DATETIMEV2', ['DATEV2', 'INT'], ''],
        [['microseconds_add'], 'DATETIMEV2', ['DATEV2', 'INT'], ''],
        [['microseconds_sub'], 'DATETIMEV2', ['DATEV2', 'INT'], ''],

        [['datediff'], 'INT', ['DATETIMEV2', 'DATETIMEV2'], ''],
        [['timediff'], 'TIMEV2', ['DATETIMEV2', 'DATETIMEV2'], ''],

        [['datediff'], 'INT', ['DATETIMEV2', 'DATEV2'], ''],
        [['timediff'], 'TIMEV2', ['DATETIMEV2', 'DATEV2'], ''],

        [['datediff'], 'INT', ['DATEV2', 'DATETIMEV2'], ''],
        [['timediff'], 'TIMEV2', ['DATEV2', 'DATETIMEV2'], ''],

        [['datediff'], 'INT', ['DATEV2', 'DATEV2'], ''],
        [['timediff'], 'TIMEV2', ['DATEV2', 'DATEV2'], ''],

        [['date_format'], 'VARCHAR', ['DATETIMEV2', 'VARCHAR'], 'ALWAYS_NULLABLE'],
        [['date_format'], 'VARCHAR', ['DATEV2', 'VARCHAR'], 'ALWAYS_NULLABLE'],
        [['date', 'to_date', 'datev2', 'to_datev2'], 'DATEV2', ['DATETIMEV2'], 'ALWAYS_NULLABLE'],

        [['dayname'], 'VARCHAR', ['DATETIMEV2'], ''],
        [['monthname'], 'VARCHAR', ['DATETIMEV2'], ''],

        [['dayname'], 'VARCHAR', ['DATEV2'], ''],
        [['monthname'], 'VARCHAR', ['DATEV2'], ''],

        [['convert_tz'], 'DATETIMEV2', ['DATETIMEV2', 'VARCHAR', 'VARCHAR'], 'ALWAYS_NULLABLE'],

        [['years_diff'], 'BIGINT', ['DATETIMEV2', 'DATETIMEV2'], ''],
        [['months_diff'], 'BIGINT', ['DATETIMEV2', 'DATETIMEV2'], ''],
        [['weeks_diff'], 'BIGINT', ['DATETIMEV2', 'DATETIMEV2'], ''],
        [['days_diff'], 'BIGINT', ['DATETIMEV2', 'DATETIMEV2'], ''],
        [['hours_diff'], 'BIGINT', ['DATETIMEV2', 'DATETIMEV2'], ''],
        [['minutes_diff'], 'BIGINT', ['DATETIMEV2', 'DATETIMEV2'], ''],
        [['seconds_diff'], 'BIGINT', ['DATETIMEV2', 'DATETIMEV2'], ''],

        [['years_diff'], 'BIGINT', ['DATEV2', 'DATETIMEV2'], ''],
        [['months_diff'], 'BIGINT', ['DATEV2', 'DATETIMEV2'], ''],
        [['weeks_diff'], 'BIGINT', ['DATEV2', 'DATETIMEV2'], ''],
        [['days_diff'], 'BIGINT', ['DATEV2', 'DATETIMEV2'], ''],
        [['hours_diff'], 'BIGINT', ['DATEV2', 'DATETIMEV2'], ''],
        [['minutes_diff'], 'BIGINT', ['DATEV2', 'DATETIMEV2'], ''],
        [['seconds_diff'], 'BIGINT', ['DATEV2', 'DATETIMEV2'], ''],

        [['years_diff'], 'BIGINT', ['DATETIMEV2', 'DATEV2'], ''],
        [['months_diff'], 'BIGINT', ['DATETIMEV2', 'DATEV2'], ''],
        [['weeks_diff'], 'BIGINT', ['DATETIMEV2', 'DATEV2'], ''],
        [['days_diff'], 'BIGINT', ['DATETIMEV2', 'DATEV2'], ''],
        [['hours_diff'], 'BIGINT', ['DATETIMEV2', 'DATEV2'], ''],
        [['minutes_diff'], 'BIGINT', ['DATETIMEV2', 'DATEV2'], ''],
        [['seconds_diff'], 'BIGINT', ['DATETIMEV2', 'DATEV2'], ''],

        [['years_diff'], 'BIGINT', ['DATEV2', 'DATEV2'], ''],
        [['months_diff'], 'BIGINT', ['DATEV2', 'DATEV2'], ''],
        [['weeks_diff'], 'BIGINT', ['DATEV2', 'DATEV2'], ''],
        [['days_diff'], 'BIGINT', ['DATEV2', 'DATEV2'], ''],
        [['hours_diff'], 'BIGINT', ['DATEV2', 'DATEV2'], ''],
        [['minutes_diff'], 'BIGINT', ['DATEV2', 'DATEV2'], ''],
        [['seconds_diff'], 'BIGINT', ['DATEV2', 'DATEV2'], ''],

        [['year_floor'], 'DATETIMEV2', ['DATETIMEV2'], 'ALWAYS_NULLABLE'],
        [['year_floor'], 'DATETIMEV2', ['DATETIMEV2', 'DATETIMEV2'], 'ALWAYS_NULLABLE'],
        [['year_floor'], 'DATETIMEV2', ['DATETIMEV2', 'INT'], 'ALWAYS_NULLABLE'],
        [['year_floor'], 'DATETIMEV2', ['DATETIMEV2', 'INT', 'DATETIMEV2'], 'ALWAYS_NULLABLE'],
        [['year_ceil'], 'DATETIMEV2', ['DATETIMEV2'], 'ALWAYS_NULLABLE'],
        [['year_ceil'], 'DATETIMEV2', ['DATETIMEV2', 'DATETIMEV2'], 'ALWAYS_NULLABLE'],
        [['year_ceil'], 'DATETIMEV2', ['DATETIMEV2', 'INT'], 'ALWAYS_NULLABLE'],
        [['year_ceil'], 'DATETIMEV2', ['DATETIMEV2', 'INT', 'DATETIMEV2'], 'ALWAYS_NULLABLE'],
        [['month_floor'], 'DATETIMEV2', ['DATETIMEV2'], 'ALWAYS_NULLABLE'],
        [['month_floor'], 'DATETIMEV2', ['DATETIMEV2', 'DATETIMEV2'], 'ALWAYS_NULLABLE'],
        [['month_floor'], 'DATETIMEV2', ['DATETIMEV2', 'INT'], 'ALWAYS_NULLABLE'],
        [['month_floor'], 'DATETIMEV2', ['DATETIMEV2', 'INT', 'DATETIMEV2'], 'ALWAYS_NULLABLE'],
        [['month_ceil'], 'DATETIMEV2', ['DATETIMEV2'], 'ALWAYS_NULLABLE'],
        [['month_ceil'], 'DATETIMEV2', ['DATETIMEV2', 'DATETIMEV2'], 'ALWAYS_NULLABLE'],
        [['month_ceil'], 'DATETIMEV2', ['DATETIMEV2', 'INT'], 'ALWAYS_NULLABLE'],
        [['month_ceil'], 'DATETIMEV2', ['DATETIMEV2', 'INT', 'DATETIMEV2'], 'ALWAYS_NULLABLE'],
        [['week_floor'], 'DATETIMEV2', ['DATETIMEV2'], 'ALWAYS_NULLABLE'],
        [['week_floor'], 'DATETIMEV2', ['DATETIMEV2', 'DATETIMEV2'], 'ALWAYS_NULLABLE'],
        [['week_floor'], 'DATETIMEV2', ['DATETIMEV2', 'INT'], 'ALWAYS_NULLABLE'],
        [['week_floor'], 'DATETIMEV2', ['DATETIMEV2', 'INT', 'DATETIMEV2'], 'ALWAYS_NULLABLE'],
        [['week_ceil'], 'DATETIMEV2', ['DATETIMEV2'], 'ALWAYS_NULLABLE'],
        [['week_ceil'], 'DATETIMEV2', ['DATETIMEV2', 'DATETIMEV2'], 'ALWAYS_NULLABLE'],
        [['week_ceil'], 'DATETIMEV2', ['DATETIMEV2', 'INT'], 'ALWAYS_NULLABLE'],
        [['week_ceil'], 'DATETIMEV2', ['DATETIMEV2', 'INT', 'DATETIMEV2'], 'ALWAYS_NULLABLE'],
        [['day_floor'], 'DATETIMEV2', ['DATETIMEV2'], 'ALWAYS_NULLABLE'],
        [['day_floor'], 'DATETIMEV2', ['DATETIMEV2', 'DATETIMEV2'], 'ALWAYS_NULLABLE'],
        [['day_floor'], 'DATETIMEV2', ['DATETIMEV2', 'INT'], 'ALWAYS_NULLABLE'],
        [['day_floor'], 'DATETIMEV2', ['DATETIMEV2', 'INT', 'DATETIMEV2'], 'ALWAYS_NULLABLE'],
        [['day_ceil'], 'DATETIMEV2', ['DATETIMEV2'], 'ALWAYS_NULLABLE'],
        [['day_ceil'], 'DATETIMEV2', ['DATETIMEV2', 'DATETIMEV2'], 'ALWAYS_NULLABLE'],
        [['day_ceil'], 'DATETIMEV2', ['DATETIMEV2', 'INT'], 'ALWAYS_NULLABLE'],
        [['day_ceil'], 'DATETIMEV2', ['DATETIMEV2', 'INT', 'DATETIMEV2'], 'ALWAYS_NULLABLE'],
        [['hour_floor'], 'DATETIMEV2', ['DATETIMEV2'], 'ALWAYS_NULLABLE'],
        [['hour_floor'], 'DATETIMEV2', ['DATETIMEV2', 'DATETIMEV2'], 'ALWAYS_NULLABLE'],
        [['hour_floor'], 'DATETIMEV2', ['DATETIMEV2', 'INT'], 'ALWAYS_NULLABLE'],
        [['hour_floor'], 'DATETIMEV2', ['DATETIMEV2', 'INT', 'DATETIMEV2'], 'ALWAYS_NULLABLE'],
        [['hour_ceil'], 'DATETIMEV2', ['DATETIMEV2'], 'ALWAYS_NULLABLE'],
        [['hour_ceil'], 'DATETIMEV2', ['DATETIMEV2', 'DATETIMEV2'], 'ALWAYS_NULLABLE'],
        [['hour_ceil'], 'DATETIMEV2', ['DATETIMEV2', 'INT'], 'ALWAYS_NULLABLE'],
        [['hour_ceil'], 'DATETIMEV2', ['DATETIMEV2', 'INT', 'DATETIMEV2'], 'ALWAYS_NULLABLE'],
        [['minute_floor'], 'DATETIMEV2', ['DATETIMEV2'], 'ALWAYS_NULLABLE'],
        [['minute_floor'], 'DATETIMEV2', ['DATETIMEV2', 'DATETIMEV2'], 'ALWAYS_NULLABLE'],
        [['minute_floor'], 'DATETIMEV2', ['DATETIMEV2', 'INT'], 'ALWAYS_NULLABLE'],
        [['minute_floor'], 'DATETIMEV2', ['DATETIMEV2', 'INT', 'DATETIMEV2'], 'ALWAYS_NULLABLE'],
        [['minute_ceil'], 'DATETIMEV2', ['DATETIMEV2'], 'ALWAYS_NULLABLE'],
        [['minute_ceil'], 'DATETIMEV2', ['DATETIMEV2', 'DATETIMEV2'], 'ALWAYS_NULLABLE'],
        [['minute_ceil'], 'DATETIMEV2', ['DATETIMEV2', 'INT'], 'ALWAYS_NULLABLE'],
        [['minute_ceil'], 'DATETIMEV2', ['DATETIMEV2', 'INT', 'DATETIMEV2'], 'ALWAYS_NULLABLE'],
        [['second_floor'], 'DATETIMEV2', ['DATETIMEV2'], 'ALWAYS_NULLABLE'],
        [['second_floor'], 'DATETIMEV2', ['DATETIMEV2', 'DATETIMEV2'], 'ALWAYS_NULLABLE'],
        [['second_floor'], 'DATETIMEV2', ['DATETIMEV2', 'INT'], 'ALWAYS_NULLABLE'],
        [['second_floor'], 'DATETIMEV2', ['DATETIMEV2', 'INT', 'DATETIMEV2'], 'ALWAYS_NULLABLE'],
        [['second_ceil'], 'DATETIMEV2', ['DATETIMEV2'], 'ALWAYS_NULLABLE'],
        [['second_ceil'], 'DATETIMEV2', ['DATETIMEV2', 'DATETIMEV2'], 'ALWAYS_NULLABLE'],
        [['second_ceil'], 'DATETIMEV2', ['DATETIMEV2', 'INT'], 'ALWAYS_NULLABLE'],
        [['second_ceil'], 'DATETIMEV2', ['DATETIMEV2', 'INT', 'DATETIMEV2'], 'ALWAYS_NULLABLE'],

        [['year_floor'], 'DATEV2', ['DATEV2'], 'ALWAYS_NULLABLE'],
        [['year_floor'], 'DATEV2', ['DATEV2', 'DATEV2'], 'ALWAYS_NULLABLE'],
        [['year_floor'], 'DATEV2', ['DATEV2', 'INT'], 'ALWAYS_NULLABLE'],
        [['year_floor'], 'DATEV2', ['DATEV2', 'INT', 'DATEV2'], 'ALWAYS_NULLABLE'],
        [['year_ceil'], 'DATEV2', ['DATEV2'], 'ALWAYS_NULLABLE'],
        [['year_ceil'], 'DATEV2', ['DATEV2', 'DATEV2'], 'ALWAYS_NULLABLE'],
        [['year_ceil'], 'DATEV2', ['DATEV2', 'INT'], 'ALWAYS_NULLABLE'],
        [['year_ceil'], 'DATEV2', ['DATEV2', 'INT', 'DATEV2'], 'ALWAYS_NULLABLE'],
        [['month_floor'], 'DATEV2', ['DATEV2'], 'ALWAYS_NULLABLE'],
        [['month_floor'], 'DATEV2', ['DATEV2', 'DATEV2'], 'ALWAYS_NULLABLE'],
        [['month_floor'], 'DATEV2', ['DATEV2', 'INT'], 'ALWAYS_NULLABLE'],
        [['month_floor'], 'DATEV2', ['DATEV2', 'INT', 'DATEV2'], 'ALWAYS_NULLABLE'],
        [['month_ceil'], 'DATEV2', ['DATEV2'], 'ALWAYS_NULLABLE'],
        [['month_ceil'], 'DATEV2', ['DATEV2', 'DATEV2'], 'ALWAYS_NULLABLE'],
        [['month_ceil'], 'DATEV2', ['DATEV2', 'INT'], 'ALWAYS_NULLABLE'],
        [['month_ceil'], 'DATEV2', ['DATEV2', 'INT', 'DATEV2'], 'ALWAYS_NULLABLE'],
        [['week_floor'], 'DATEV2', ['DATEV2'], 'ALWAYS_NULLABLE'],
        [['week_floor'], 'DATEV2', ['DATEV2', 'DATEV2'], 'ALWAYS_NULLABLE'],
        [['week_floor'], 'DATEV2', ['DATEV2', 'INT'], 'ALWAYS_NULLABLE'],
        [['week_floor'], 'DATEV2', ['DATEV2', 'INT', 'DATEV2'], 'ALWAYS_NULLABLE'],
        [['week_ceil'], 'DATEV2', ['DATEV2'], 'ALWAYS_NULLABLE'],
        [['week_ceil'], 'DATEV2', ['DATEV2', 'DATEV2'], 'ALWAYS_NULLABLE'],
        [['week_ceil'], 'DATEV2', ['DATEV2', 'INT'], 'ALWAYS_NULLABLE'],
        [['week_ceil'], 'DATEV2', ['DATEV2', 'INT', 'DATEV2'], 'ALWAYS_NULLABLE'],
        [['day_floor'], 'DATEV2', ['DATEV2'], 'ALWAYS_NULLABLE'],
        [['day_floor'], 'DATEV2', ['DATEV2', 'DATEV2'], 'ALWAYS_NULLABLE'],
        [['day_floor'], 'DATEV2', ['DATEV2', 'INT'], 'ALWAYS_NULLABLE'],
        [['day_floor'], 'DATEV2', ['DATEV2', 'INT', 'DATEV2'], 'ALWAYS_NULLABLE'],
        [['day_ceil'], 'DATEV2', ['DATEV2'], 'ALWAYS_NULLABLE'],
        [['day_ceil'], 'DATEV2', ['DATEV2', 'DATEV2'], 'ALWAYS_NULLABLE'],
        [['day_ceil'], 'DATEV2', ['DATEV2', 'INT'], 'ALWAYS_NULLABLE'],
        [['day_ceil'], 'DATEV2', ['DATEV2', 'INT', 'DATEV2'], 'ALWAYS_NULLABLE']
    ],


    # Math builtin functions
    "Math": [
        [['pi'], 'DOUBLE', [], 'ALWAYS_NOT_NULLABLE'],
        [['e'], 'DOUBLE', [], 'ALWAYS_NOT_NULLABLE'],

        [['abs'], 'DOUBLE', ['DOUBLE'], ''],
        [['abs'], 'FLOAT', ['FLOAT'], ''],
        [['abs'], 'LARGEINT', ['LARGEINT'], ''],
        [['abs'], 'LARGEINT', ['BIGINT'], ''],
        [['abs'], 'INT', ['SMALLINT'], ''],
        [['abs'], 'BIGINT', ['INT'], ''],
        [['abs'], 'SMALLINT', ['TINYINT'], ''],
        [['abs'], 'DECIMALV2', ['DECIMALV2'], ''],
        [['abs'], 'DECIMAL32', ['DECIMAL32'], ''],
        [['abs'], 'DECIMAL64', ['DECIMAL64'], ''],
        [['abs'], 'DECIMAL128', ['DECIMAL128'], ''],

        [['sign'], 'TINYINT', ['DOUBLE'], ''],
        [['sin'], 'DOUBLE', ['DOUBLE'], ''],
        [['asin'], 'DOUBLE', ['DOUBLE'], ''],
        [['cos'], 'DOUBLE', ['DOUBLE'], ''],
        [['acos'], 'DOUBLE', ['DOUBLE'], ''],
        [['tan'], 'DOUBLE', ['DOUBLE'], ''],
        [['atan'], 'DOUBLE', ['DOUBLE'], ''],

        [['ceil', 'ceiling', 'dceil'], 'DOUBLE', ['DOUBLE'], ''],
        [['floor', 'dfloor'], 'DOUBLE', ['DOUBLE'], ''],
        [['round', 'dround'], 'DOUBLE', ['DOUBLE'], ''],
        [['round_bankers'], 'DOUBLE', ['DOUBLE'], ''],
        [['ceil', 'ceiling', 'dceil'], 'DECIMAL32', ['DECIMAL32'], ''],
        [['floor', 'dfloor'], 'DECIMAL32', ['DECIMAL32'], ''],
        [['round', 'dround'], 'DECIMAL32', ['DECIMAL32'], ''],
        [['round_bankers'], 'DECIMAL32', ['DECIMAL32'], ''],
        [['ceil', 'ceiling', 'dceil'], 'DECIMAL64', ['DECIMAL64'], ''],
        [['floor', 'dfloor'], 'DECIMAL64', ['DECIMAL64'], ''],
        [['round', 'dround'], 'DECIMAL64', ['DECIMAL64'], ''],
        [['round_bankers'], 'DECIMAL64', ['DECIMAL64'], ''],
        [['ceil', 'ceiling', 'dceil'], 'DECIMAL128', ['DECIMAL128'], ''],
        [['floor', 'dfloor'], 'DECIMAL128', ['DECIMAL128'], ''],
        [['round', 'dround'], 'DECIMAL128', ['DECIMAL128'], ''],
        [['round_bankers'], 'DECIMAL128', ['DECIMAL128'], ''],
        [['round', 'dround'], 'DOUBLE', ['DOUBLE', 'INT'], ''],
        [['round', 'dround'], 'DECIMAL32', ['DECIMAL32', 'INT'], ''],
        [['round', 'dround'], 'DECIMAL64', ['DECIMAL64', 'INT'], ''],
        [['round', 'dround'], 'DECIMAL128', ['DECIMAL128', 'INT'], ''],
        [['round_bankers', 'round_bankers'], 'DOUBLE', ['DOUBLE', 'INT'], ''],
        [['round_bankers'], 'DECIMAL32', ['DECIMAL32', 'INT'], ''],
        [['round_bankers'], 'DECIMAL64', ['DECIMAL64', 'INT'], ''],
        [['round_bankers'], 'DECIMAL128', ['DECIMAL128', 'INT'], ''],
        [['floor', 'dfloor'], 'DECIMAL32', ['DECIMAL32', 'INT'], ''],
        [['floor', 'dfloor'], 'DECIMAL64', ['DECIMAL64', 'INT'], ''],
        [['floor', 'dfloor'], 'DECIMAL128', ['DECIMAL128', 'INT'], ''],
        [['ceil', 'dceil'], 'DECIMAL32', ['DECIMAL32', 'INT'], ''],
        [['ceil', 'dceil'], 'DECIMAL64', ['DECIMAL64', 'INT'], ''],
        [['ceil', 'dceil'], 'DECIMAL128', ['DECIMAL128', 'INT'], ''],
        [['truncate'], 'DOUBLE', ['DOUBLE', 'INT'], ''],
        [['truncate'], 'DECIMAL32', ['DECIMAL32', 'INT'], ''],
        [['truncate'], 'DECIMAL64', ['DECIMAL64', 'INT'], ''],
        [['truncate'], 'DECIMAL128', ['DECIMAL128', 'INT'], ''],

        [['ln', 'dlog1'], 'DOUBLE', ['DOUBLE'], 'ALWAYS_NULLABLE'],
        [['log'], 'DOUBLE', ['DOUBLE', 'DOUBLE'], 'ALWAYS_NULLABLE'],
        [['log2'], 'DOUBLE', ['DOUBLE'], 'ALWAYS_NULLABLE'],
        [['log10', 'dlog10'], 'DOUBLE', ['DOUBLE'], 'ALWAYS_NULLABLE'],
        [['exp', 'dexp'], 'DOUBLE', ['DOUBLE'], ''],

        [['radians'], 'DOUBLE', ['DOUBLE'], ''],
        [['degrees'], 'DOUBLE', ['DOUBLE'], ''],

        [['sqrt', 'dsqrt'], 'DOUBLE', ['DOUBLE'], ''],
        [['cbrt'], 'DOUBLE', ['DOUBLE'], ''],
        [['pow', 'power', 'dpow', 'fpow'], 'DOUBLE', ['DOUBLE', 'DOUBLE'], ''],

        [['rand', 'random'], 'DOUBLE', [], 'ALWAYS_NOT_NULLABLE'],
        [['rand', 'random'], 'DOUBLE', ['BIGINT'], ''],

        [['bin'], 'VARCHAR', ['BIGINT'], ''],
        [['hex'], 'VARCHAR', ['BIGINT'], ''],
        [['hex'], 'VARCHAR', ['VARCHAR'], ''],
        [['hex'], 'STRING', ['STRING'], ''],
        [['unhex'], 'VARCHAR', ['VARCHAR'], 'ALWAYS_NULLABLE'],
        [['unhex'], 'STRING', ['STRING'], 'ALWAYS_NULLABLE'],

        [['conv'], 'VARCHAR', ['BIGINT', 'TINYINT', 'TINYINT'], 'ALWAYS_NULLABLE'],
        [['conv'], 'VARCHAR', ['VARCHAR', 'TINYINT', 'TINYINT'], 'ALWAYS_NULLABLE'],
        [['conv'], 'VARCHAR', ['STRING', 'TINYINT', 'TINYINT'], 'ALWAYS_NULLABLE'],

        [['pmod'], 'BIGINT', ['BIGINT', 'BIGINT'], 'ALWAYS_NULLABLE'],
        [['pmod'], 'DOUBLE', ['DOUBLE', 'DOUBLE'], 'ALWAYS_NULLABLE'],
        [['mod'], 'TINYINT', ['TINYINT', 'TINYINT'], 'ALWAYS_NULLABLE'],
        [['mod'], 'SMALLINT', ['SMALLINT', 'SMALLINT'], 'ALWAYS_NULLABLE'],
        [['mod'], 'INT', ['INT', 'INT'], 'ALWAYS_NULLABLE'],
        [['mod'], 'BIGINT', ['BIGINT', 'BIGINT'], 'ALWAYS_NULLABLE'],
        [['mod'], 'LARGEINT', ['LARGEINT', 'LARGEINT'], 'ALWAYS_NULLABLE'],
        [['mod'], 'DECIMALV2', ['DECIMALV2', 'DECIMALV2'], 'ALWAYS_NULLABLE'],
        [['mod'], 'DECIMAL32', ['DECIMAL32', 'DECIMAL32'], 'ALWAYS_NULLABLE'],
        [['mod'], 'DECIMAL64', ['DECIMAL64', 'DECIMAL64'], 'ALWAYS_NULLABLE'],
        [['mod'], 'DECIMAL128', ['DECIMAL128', 'DECIMAL128'], 'ALWAYS_NULLABLE'],
        [['mod', 'fmod'], 'FLOAT', ['FLOAT', 'FLOAT'], 'ALWAYS_NULLABLE'],
        [['mod', 'fmod'], 'DOUBLE', ['DOUBLE', 'DOUBLE'], 'ALWAYS_NULLABLE'],

        [['positive'], 'BIGINT', ['BIGINT'], ''],
        [['positive'], 'DOUBLE', ['DOUBLE'], ''],
        [['positive'], 'DECIMALV2', ['DECIMALV2'], ''],
        [['positive'], 'DECIMAL32', ['DECIMAL32'], ''],
        [['positive'], 'DECIMAL64', ['DECIMAL64'], ''],
        [['positive'], 'DECIMAL128', ['DECIMAL128'], ''],
        [['negative'], 'BIGINT', ['BIGINT'], ''],
        [['negative'], 'DOUBLE', ['DOUBLE'], ''],
        [['negative'], 'DECIMALV2', ['DECIMALV2'], ''],
        [['negative'], 'DECIMAL32', ['DECIMAL32'], ''],
        [['negative'], 'DECIMAL64', ['DECIMAL64'], ''],
        [['negative'], 'DECIMAL128', ['DECIMAL128'], ''],

        [['least'], 'TINYINT', ['TINYINT', '...'], ''],
        [['least'], 'SMALLINT', ['SMALLINT', '...'], ''],
        [['least'], 'INT', ['INT', '...'], ''],
        [['least'], 'BIGINT', ['BIGINT', '...'], ''],
        [['least'], 'LARGEINT', ['LARGEINT', '...'], ''],
        [['least'], 'FLOAT', ['FLOAT', '...'], ''],
        [['least'], 'DOUBLE', ['DOUBLE', '...'], ''],
        [['least'], 'DATE', ['DATE', '...'], ''],
        [['least'], 'DATEV2', ['DATEV2', '...'], ''],
        [['least'], 'DATETIME', ['DATETIME', '...'], ''],
        [['least'], 'DATETIMEV2', ['DATETIMEV2', '...'], ''],
        [['least'], 'DECIMALV2', ['DECIMALV2', '...'], ''],
        [['least'], 'DECIMAL32', ['DECIMAL32', '...'], ''],
        [['least'], 'DECIMAL64', ['DECIMAL64', '...'], ''],
        [['least'], 'DECIMAL128', ['DECIMAL128', '...'], ''],
        [['least'], 'VARCHAR', ['VARCHAR', '...'], ''],
        [['least'], 'STRING', ['STRING', '...'], ''],

        [['greatest'], 'TINYINT', ['TINYINT', '...'], ''],
        [['greatest'], 'SMALLINT', ['SMALLINT', '...'], ''],
        [['greatest'], 'INT', ['INT', '...'], ''],
        [['greatest'], 'BIGINT', ['BIGINT', '...'], ''],
        [['greatest'], 'LARGEINT', ['LARGEINT', '...'], ''],
        [['greatest'], 'FLOAT', ['FLOAT', '...'], ''],
        [['greatest'], 'DOUBLE', ['DOUBLE', '...'], ''],
        [['greatest'], 'DECIMALV2', ['DECIMALV2', '...'], ''],
        [['greatest'], 'DECIMAL32', ['DECIMAL32', '...'], ''],
        [['greatest'], 'DECIMAL64', ['DECIMAL64', '...'], ''],
        [['greatest'], 'DECIMAL128', ['DECIMAL128', '...'], ''],
        [['greatest'], 'DATE', ['DATE', '...'], ''],
        [['greatest'], 'DATEV2', ['DATEV2', '...'], ''],
        [['greatest'], 'DATETIME', ['DATETIME', '...'], ''],
        [['greatest'], 'DATETIMEV2', ['DATETIMEV2', '...'], ''],
        [['greatest'], 'VARCHAR', ['VARCHAR', '...'], ''],
        [['greatest'], 'STRING', ['STRING', '...'], '']
    ],

    # Conditional Functions
    # Some of these have empty symbols because the BE special-cases them based on the
    # function name
    "Conditional": [
        [['if'], 'BOOLEAN', ['BOOLEAN', 'BOOLEAN', 'BOOLEAN'], 'CUSTOM'],
        [['if'], 'TINYINT', ['BOOLEAN', 'TINYINT', 'TINYINT'], 'CUSTOM'],
        [['if'], 'SMALLINT', ['BOOLEAN', 'SMALLINT', 'SMALLINT'], 'CUSTOM'],
        [['if'], 'INT', ['BOOLEAN', 'INT', 'INT'], 'CUSTOM'],
        [['if'], 'BIGINT', ['BOOLEAN', 'BIGINT', 'BIGINT'], 'CUSTOM'],
        [['if'], 'LARGEINT', ['BOOLEAN', 'LARGEINT', 'LARGEINT'], 'CUSTOM'],
        [['if'], 'FLOAT', ['BOOLEAN', 'FLOAT', 'FLOAT'], 'CUSTOM'],
        [['if'], 'DOUBLE', ['BOOLEAN', 'DOUBLE', 'DOUBLE'], 'CUSTOM'],
        [['if'], 'DATETIME', ['BOOLEAN', 'DATETIME', 'DATETIME'], 'CUSTOM'],
        [['if'], 'DATE', ['BOOLEAN', 'DATE', 'DATE'], 'CUSTOM'],
        [['if'], 'DATETIMEV2', ['BOOLEAN', 'DATETIMEV2', 'DATETIMEV2'], 'CUSTOM'],
        [['if'], 'DATEV2', ['BOOLEAN', 'DATEV2', 'DATEV2'], 'CUSTOM'],
        [['if'], 'DECIMALV2', ['BOOLEAN', 'DECIMALV2', 'DECIMALV2'], 'CUSTOM'],
        [['if'], 'DECIMAL32', ['BOOLEAN', 'DECIMAL32', 'DECIMAL32'], 'CUSTOM'],
        [['if'], 'DECIMAL64', ['BOOLEAN', 'DECIMAL64', 'DECIMAL64'], 'CUSTOM'],
        [['if'], 'DECIMAL128', ['BOOLEAN', 'DECIMAL128', 'DECIMAL128'], 'CUSTOM'],
        [['if'], 'BITMAP', ['BOOLEAN', 'BITMAP', 'BITMAP'], 'CUSTOM'],
        [['if'], 'HLL', ['BOOLEAN', 'HLL', 'HLL'], 'CUSTOM'],
        # The priority of varchar should be lower than decimal in IS_SUPERTYPE_OF mode.
        [['if'], 'VARCHAR', ['BOOLEAN', 'VARCHAR', 'VARCHAR'], 'CUSTOM'],
        [['if'], 'STRING', ['BOOLEAN', 'STRING', 'STRING'], 'CUSTOM'],
        [['if'], 'ARRAY_BOOLEAN', ['BOOLEAN', 'ARRAY_BOOLEAN', 'ARRAY_BOOLEAN'], 'CUSTOM'],
        [['if'], 'ARRAY_TINYINT', ['BOOLEAN', 'ARRAY_TINYINT', 'ARRAY_TINYINT'], 'CUSTOM'],
        [['if'], 'ARRAY_SMALLINT', ['BOOLEAN', 'ARRAY_SMALLINT', 'ARRAY_SMALLINT'], 'CUSTOM'],
        [['if'], 'ARRAY_INT', ['BOOLEAN', 'ARRAY_INT', 'ARRAY_INT'], 'CUSTOM'],
        [['if'], 'ARRAY_BIGINT', ['BOOLEAN', 'ARRAY_BIGINT', 'ARRAY_BIGINT'], 'CUSTOM'],
        [['if'], 'ARRAY_LARGEINT', ['BOOLEAN', 'ARRAY_LARGEINT', 'ARRAY_LARGEINT'], 'CUSTOM'],
        [['if'], 'ARRAY_FLOAT', ['BOOLEAN', 'ARRAY_FLOAT', 'ARRAY_FLOAT'], 'CUSTOM'],
        [['if'], 'ARRAY_DOUBLE', ['BOOLEAN', 'ARRAY_DOUBLE', 'ARRAY_DOUBLE'], 'CUSTOM'],
        [['if'], 'ARRAY_DATETIME', ['BOOLEAN', 'ARRAY_DATETIME', 'ARRAY_DATETIME'], 'CUSTOM'],
        [['if'], 'ARRAY_DATE', ['BOOLEAN', 'ARRAY_DATE', 'ARRAY_DATE'], 'CUSTOM'],
        [['if'], 'ARRAY_DATETIMEV2', ['BOOLEAN', 'ARRAY_DATETIMEV2', 'ARRAY_DATETIMEV2'], 'CUSTOM'],
        [['if'], 'ARRAY_DATEV2', ['BOOLEAN', 'ARRAY_DATEV2', 'ARRAY_DATEV2'], 'CUSTOM'],
        [['if'], 'ARRAY_DECIMALV2', ['BOOLEAN', 'ARRAY_DECIMALV2', 'ARRAY_DECIMALV2'], 'CUSTOM'],
        [['if'], 'ARRAY_VARCHAR', ['BOOLEAN', 'ARRAY_VARCHAR', 'ARRAY_VARCHAR'], 'CUSTOM'],
        [['if'], 'ARRAY_STRING', ['BOOLEAN', 'ARRAY_STRING', 'ARRAY_STRING'], 'CUSTOM'],

        [['nullif'], 'BOOLEAN', ['BOOLEAN', 'BOOLEAN'], 'ALWAYS_NULLABLE'],
        [['nullif'], 'TINYINT', ['TINYINT', 'TINYINT'], 'ALWAYS_NULLABLE'],
        [['nullif'], 'SMALLINT', ['SMALLINT', 'SMALLINT'], 'ALWAYS_NULLABLE'],
        [['nullif'], 'INT', ['INT', 'INT'], 'ALWAYS_NULLABLE'],
        [['nullif'], 'BIGINT', ['BIGINT', 'BIGINT'], 'ALWAYS_NULLABLE'],
        [['nullif'], 'LARGEINT', ['LARGEINT', 'LARGEINT'], 'ALWAYS_NULLABLE'],
        [['nullif'], 'FLOAT', ['FLOAT', 'FLOAT'], 'ALWAYS_NULLABLE'],
        [['nullif'], 'DOUBLE', ['DOUBLE', 'DOUBLE'], 'ALWAYS_NULLABLE'],
        [['nullif'], 'DATETIME', ['DATETIME', 'DATETIME'], 'ALWAYS_NULLABLE'],
        [['nullif'], 'DATE', ['DATE', 'DATE'], 'ALWAYS_NULLABLE'],
        [['nullif'], 'DATETIMEV2', ['DATETIMEV2', 'DATETIMEV2'], 'ALWAYS_NULLABLE'],
        [['nullif'], 'DATEV2', ['DATEV2', 'DATEV2'], 'ALWAYS_NULLABLE'],
        [['nullif'], 'DECIMALV2', ['DECIMALV2', 'DECIMALV2'], 'ALWAYS_NULLABLE'],
        [['nullif'], 'DECIMAL32', ['DECIMAL32', 'DECIMAL32'], 'ALWAYS_NULLABLE'],
        [['nullif'], 'DECIMAL64', ['DECIMAL64', 'DECIMAL64'], 'ALWAYS_NULLABLE'],
        [['nullif'], 'DECIMAL128', ['DECIMAL128', 'DECIMAL128'], 'ALWAYS_NULLABLE'],
        # The priority of varchar should be lower than decimal in IS_SUPERTYPE_OF mode.
        [['nullif'], 'VARCHAR', ['VARCHAR', 'VARCHAR'], 'ALWAYS_NULLABLE'],
        [['nullif'], 'STRING', ['STRING', 'STRING'], 'ALWAYS_NULLABLE'],

        [['ifnull', 'nvl'], 'BOOLEAN', ['BOOLEAN', 'BOOLEAN'], 'CUSTOM'],
        [['ifnull', 'nvl'], 'TINYINT', ['TINYINT', 'TINYINT'], 'CUSTOM'],
        [['ifnull', 'nvl'], 'SMALLINT', ['SMALLINT', 'SMALLINT'], 'CUSTOM'],
        [['ifnull', 'nvl'], 'INT', ['INT', 'INT'], 'CUSTOM'],
        [['ifnull', 'nvl'], 'BIGINT', ['BIGINT', 'BIGINT'], 'CUSTOM'],
        [['ifnull', 'nvl'], 'LARGEINT', ['LARGEINT', 'LARGEINT'], 'CUSTOM'],
        [['ifnull', 'nvl'], 'FLOAT', ['FLOAT', 'FLOAT'], 'CUSTOM'],
        [['ifnull', 'nvl'], 'DOUBLE', ['DOUBLE', 'DOUBLE'], 'CUSTOM'],
        [['ifnull', 'nvl'], 'DATE', ['DATE', 'DATE'], 'CUSTOM'],
        [['ifnull', 'nvl'], 'DATETIME', ['DATETIME', 'DATETIME'], 'CUSTOM'],
        [['ifnull', 'nvl'], 'DATETIME', ['DATE', 'DATETIME'], 'CUSTOM'],
        [['ifnull', 'nvl'], 'DATETIME', ['DATETIME', 'DATE'], 'CUSTOM'],
        [['ifnull', 'nvl'], 'DATEV2', ['DATEV2', 'DATEV2'], 'CUSTOM'],
        [['ifnull', 'nvl'], 'DATETIMEV2', ['DATETIMEV2', 'DATETIMEV2'], 'CUSTOM'],
        [['ifnull', 'nvl'], 'DECIMALV2', ['DECIMALV2', 'DECIMALV2'], 'CUSTOM'],
        [['ifnull', 'nvl'], 'DECIMAL32', ['DECIMAL32', 'DECIMAL32'], 'CUSTOM'],
        [['ifnull', 'nvl'], 'DECIMAL64', ['DECIMAL64', 'DECIMAL64'], 'CUSTOM'],
        [['ifnull', 'nvl'], 'DECIMAL128', ['DECIMAL128', 'DECIMAL128'], 'CUSTOM'],
        [['ifnull', 'nvl'], 'BITMAP', ['BITMAP', 'BITMAP'], 'CUSTOM'],
        # The priority of varchar should be lower than decimal in IS_SUPERTYPE_OF mode.
        [['ifnull', 'nvl'], 'VARCHAR', ['VARCHAR', 'VARCHAR'], 'CUSTOM'],
        [['ifnull', 'nvl'], 'STRING', ['STRING', 'STRING'], 'CUSTOM'],

        [['coalesce'], 'BOOLEAN', ['BOOLEAN', '...'], 'CUSTOM'],
        [['coalesce'], 'TINYINT', ['TINYINT', '...'], 'CUSTOM'],
        [['coalesce'], 'SMALLINT', ['SMALLINT', '...'], 'CUSTOM'],
        [['coalesce'], 'INT', ['INT', '...'], 'CUSTOM'],
        [['coalesce'], 'BIGINT', ['BIGINT', '...'], 'CUSTOM'],
        [['coalesce'], 'LARGEINT', ['LARGEINT', '...'], 'CUSTOM'],
        [['coalesce'], 'FLOAT', ['FLOAT', '...'], 'CUSTOM'],
        [['coalesce'], 'DOUBLE', ['DOUBLE', '...'], 'CUSTOM'],
        [['coalesce'], 'DATETIME', ['DATETIME', '...'], 'CUSTOM'],
        [['coalesce'], 'DATE', ['DATE', '...'], 'CUSTOM'],
        [['coalesce'], 'DATETIMEV2', ['DATETIMEV2', '...'], 'CUSTOM'],
        [['coalesce'], 'DATEV2', ['DATEV2', '...'], 'CUSTOM'],
        [['coalesce'], 'DECIMALV2', ['DECIMALV2', '...'], 'CUSTOM'],
        [['coalesce'], 'DECIMAL32', ['DECIMAL32', '...'], 'CUSTOM'],
        [['coalesce'], 'DECIMAL64', ['DECIMAL64', '...'], 'CUSTOM'],
        [['coalesce'], 'DECIMAL128', ['DECIMAL128', '...'], 'CUSTOM'],
        [['coalesce'], 'BITMAP', ['BITMAP', '...'], 'CUSTOM'],
        # The priority of varchar should be lower than decimal in IS_SUPERTYPE_OF mode.
        [['coalesce'], 'VARCHAR', ['VARCHAR', '...'], 'CUSTOM'],
        [['coalesce'], 'STRING', ['STRING', '...'], 'CUSTOM'],

        # esquery's first arg is suitable for all types
        [['esquery'], 'BOOLEAN', ['BOOLEAN', 'VARCHAR'], ''],
        [['esquery'], 'BOOLEAN', ['TINYINT', 'VARCHAR'], ''],
        [['esquery'], 'BOOLEAN', ['SMALLINT', 'VARCHAR'], ''],
        [['esquery'], 'BOOLEAN', ['INT', 'VARCHAR'], ''],
        [['esquery'], 'BOOLEAN', ['BIGINT', 'VARCHAR'], ''],
        [['esquery'], 'BOOLEAN', ['LARGEINT', 'VARCHAR'], ''],
        [['esquery'], 'BOOLEAN', ['FLOAT', 'VARCHAR'], ''],
        [['esquery'], 'BOOLEAN', ['DOUBLE', 'VARCHAR'], ''],
        [['esquery'], 'BOOLEAN', ['DATE', 'VARCHAR'], ''],
        [['esquery'], 'BOOLEAN', ['DATETIME', 'VARCHAR'], ''],
        [['esquery'], 'BOOLEAN', ['CHAR', 'VARCHAR'], ''],
        [['esquery'], 'BOOLEAN', ['VARCHAR', 'VARCHAR'], ''],
        [['esquery'], 'BOOLEAN', ['JSONB', 'VARCHAR'], ''],
        [['esquery'], 'BOOLEAN', ['DECIMALV2', 'VARCHAR'], ''],
        [['esquery'], 'BOOLEAN', ['DECIMAL32', 'VARCHAR'], ''],
        [['esquery'], 'BOOLEAN', ['DECIMAL64', 'VARCHAR'], ''],
        [['esquery'], 'BOOLEAN', ['DECIMAL128', 'VARCHAR'], ''],
        [['esquery'], 'BOOLEAN', ['TIME', 'VARCHAR'], ''],
        [['esquery'], 'BOOLEAN', ['DATEV2', 'VARCHAR'], ''],
        [['esquery'], 'BOOLEAN', ['DATETIMEV2', 'VARCHAR'], ''],
        [['esquery'], 'BOOLEAN', ['TIMEV2', 'VARCHAR'], ''],
        [['esquery'], 'BOOLEAN', ['ARRAY', 'VARCHAR'], ''],
        [['esquery'], 'BOOLEAN', ['MAP', 'VARCHAR'], ''],
        [['esquery'], 'BOOLEAN', ['STRING', 'VARCHAR'], ''],
        [['esquery'], 'BOOLEAN', ['VARIANT', 'VARCHAR'], ''],
        # used for accept graph sql
        [['g'], 'BOOLEAN', ['VARCHAR'], '']
    ],

    # String builtin functions
    "String": [
        [['substr', 'substring'], 'VARCHAR', ['VARCHAR', 'INT'], 'ALWAYS_NULLABLE'],
        [['substr', 'substring'], 'VARCHAR', ['VARCHAR', 'INT', 'INT'], 'ALWAYS_NULLABLE'],
        [['mask'], 'STRING', ['STRING', '...'], ''],
        [['mask_first_n'], 'STRING', ['STRING'], ''],
        [['mask_first_n'], 'STRING', ['STRING', 'INT'], ''],
        [['mask_last_n'], 'STRING', ['STRING'], ''],
        [['mask_last_n'], 'STRING', ['STRING', 'INT'], ''],
        [['strleft', 'left'], 'VARCHAR', ['VARCHAR', 'INT'], 'ALWAYS_NULLABLE'],
        [['strright', 'right'], 'VARCHAR', ['VARCHAR', 'INT'], 'ALWAYS_NULLABLE'],
        [['ends_with'], 'BOOLEAN', ['VARCHAR', 'VARCHAR'], ''],
        [['starts_with'], 'BOOLEAN', ['VARCHAR', 'VARCHAR'], ''],
        [['null_or_empty'], 'BOOLEAN', ['VARCHAR'], 'ALWAYS_NOT_NULLABLE'],
        [['not_null_or_empty'], 'BOOLEAN', ['VARCHAR'], 'ALWAYS_NOT_NULLABLE'],
        [['space'], 'VARCHAR', ['INT'], ''],
        [['repeat'], 'VARCHAR', ['VARCHAR', 'INT'], 'ALWAYS_NULLABLE'],
        [['lpad'], 'VARCHAR', ['VARCHAR', 'INT', 'VARCHAR'], 'ALWAYS_NULLABLE'],
        [['rpad'], 'VARCHAR', ['VARCHAR', 'INT', 'VARCHAR'], 'ALWAYS_NULLABLE'],
        [['append_trailing_char_if_absent'], 'VARCHAR', ['VARCHAR', 'VARCHAR'], 'ALWAYS_NULLABLE'],
        [['length'], 'INT', ['VARCHAR'], ''],
        [['bit_length'], 'INT', ['VARCHAR'], ''],

        [['char_length', 'character_length'], 'INT', ['VARCHAR'], ''],
        [['lower', 'lcase'], 'VARCHAR', ['VARCHAR'], ''],
        [['upper', 'ucase'], 'VARCHAR', ['VARCHAR'], ''],
        [['initcap'], 'VARCHAR', ['VARCHAR'], ''],
        [['trim'], 'VARCHAR', ['VARCHAR','VARCHAR'], ''],
        [['trim'], 'VARCHAR', ['VARCHAR'], ''],
        [['ltrim'], 'VARCHAR', ['VARCHAR'], ''],
        [['ltrim'], 'VARCHAR', ['VARCHAR','VARCHAR'], ''],
        [['rtrim'], 'VARCHAR', ['VARCHAR'], ''],
        [['rtrim'], 'VARCHAR', ['VARCHAR','VARCHAR'], ''],
        [['ascii'], 'INT', ['VARCHAR'], ''],
        [['instr'], 'INT', ['VARCHAR', 'VARCHAR'], ''],
        [['locate'], 'INT', ['VARCHAR', 'VARCHAR'], ''],
        [['locate'], 'INT', ['VARCHAR', 'VARCHAR', 'INT'], ''],
        [['regexp_extract'], 'VARCHAR', ['VARCHAR', 'VARCHAR', 'BIGINT'], 'ALWAYS_NULLABLE'],
        [['regexp_replace'], 'VARCHAR', ['VARCHAR', 'VARCHAR', 'VARCHAR'], 'ALWAYS_NULLABLE'],
        [['regexp_replace_one'], 'VARCHAR', ['VARCHAR', 'VARCHAR', 'VARCHAR'], 'ALWAYS_NULLABLE'],
        [['regexp_extract_all'], 'VARCHAR', ['VARCHAR', 'VARCHAR'], 'ALWAYS_NULLABLE'],
        [['concat'], 'VARCHAR', ['VARCHAR', '...'], ''],
        [['elt'], 'VARCHAR', ['INT', 'VARCHAR', '...'], 'ALWAYS_NULLABLE'],
        [['elt'], 'STRING', ['INT', 'STRING', '...'], 'ALWAYS_NULLABLE'],
        [['replace'], 'VARCHAR', ['VARCHAR', 'VARCHAR', 'VARCHAR'], ''],
        [['concat_ws'], 'VARCHAR', ['VARCHAR', 'VARCHAR', '...'], 'CUSTOM'],
        [['concat_ws'], 'VARCHAR', ['VARCHAR', 'ARRAY_VARCHAR'], 'CUSTOM'],
        [['find_in_set'], 'INT', ['VARCHAR', 'VARCHAR'], ''],
        [['parse_url'], 'VARCHAR', ['VARCHAR', 'VARCHAR'], 'ALWAYS_NULLABLE'],
        [['parse_url'], 'VARCHAR', ['VARCHAR', 'VARCHAR', 'VARCHAR'], 'ALWAYS_NULLABLE'],
        [['money_format'], 'VARCHAR', ['BIGINT'], ''],
        [['money_format'], 'VARCHAR', ['LARGEINT'], ''],
        [['money_format'], 'VARCHAR', ['DOUBLE'], ''],
        [['money_format'], 'VARCHAR', ['DECIMALV2'], ''],
        [['money_format'], 'VARCHAR', ['DECIMAL32'], ''],
        [['money_format'], 'VARCHAR', ['DECIMAL64'], ''],
        [['money_format'], 'VARCHAR', ['DECIMAL128'], ''],
        [['split_by_string'],'ARRAY_VARCHAR',['STRING','STRING'], ''],
        [['split_part'], 'VARCHAR', ['VARCHAR', 'VARCHAR', 'INT'], 'ALWAYS_NULLABLE'],
        [['substring_index'], 'VARCHAR', ['VARCHAR', 'VARCHAR', 'INT'], 'ALWAYS_NULLABLE'],
        [['extract_url_parameter'], 'VARCHAR', ['VARCHAR', 'VARCHAR'], ''],

        [['sub_replace'], 'VARCHAR', ['VARCHAR', 'VARCHAR', 'INT'], 'ALWAYS_NULLABLE'],
        [['sub_replace'], 'VARCHAR', ['VARCHAR', 'VARCHAR', 'INT', 'INT'], 'ALWAYS_NULLABLE'],

        [['char'], 'VARCHAR', ['VARCHAR', 'INT', '...'], 'ALWAYS_NULLABLE'],

        [['substr', 'substring'], 'STRING', ['STRING', 'INT'], 'ALWAYS_NULLABLE'],
        [['substr', 'substring'], 'STRING', ['STRING', 'INT', 'INT'], 'ALWAYS_NULLABLE'],
        [['strleft', 'left'], 'STRING', ['STRING', 'INT'], 'ALWAYS_NULLABLE'],
        [['strright', 'right'], 'STRING', ['STRING', 'INT'], 'ALWAYS_NULLABLE'],
        [['ends_with'], 'BOOLEAN', ['STRING', 'STRING'], ''],
        [['starts_with'], 'BOOLEAN', ['STRING', 'STRING'], ''],
        [['null_or_empty'], 'BOOLEAN', ['STRING'], 'ALWAYS_NOT_NULLABLE'],
        [['not_null_or_empty'], 'BOOLEAN', ['STRING'], 'ALWAYS_NOT_NULLABLE'],
        [['space'], 'STRING', ['INT'], ''],
        [['repeat'], 'STRING', ['STRING', 'INT'], 'ALWAYS_NULLABLE'],
        [['lpad'], 'STRING', ['STRING', 'INT', 'STRING'], 'ALWAYS_NULLABLE'],
        [['rpad'], 'STRING', ['STRING', 'INT', 'STRING'], 'ALWAYS_NULLABLE'],
        [['append_trailing_char_if_absent'], 'STRING', ['STRING', 'STRING'], 'ALWAYS_NULLABLE'],
        [['length'], 'INT', ['STRING'], ''],
        [['bit_length'], 'INT', ['STRING'], ''],

        [['char_length', 'character_length'], 'INT', ['STRING'], ''],
        [['lower', 'lcase'], 'STRING', ['STRING'], ''],
        [['upper', 'ucase'], 'STRING', ['STRING'], ''],
        [['trim'], 'STRING', ['STRING'], ''],
        [['trim'], 'STRING', ['STRING','STRING'], ''],
        [['ltrim'], 'STRING', ['STRING'], ''],
        [['ltrim'], 'STRING', ['STRING','STRING'], ''],
        [['rtrim'], 'STRING', ['STRING'], ''],
        [['rtrim'], 'STRING', ['STRING','STRING'], ''],
        [['ascii'], 'INT', ['STRING'], ''],
        [['instr'], 'INT', ['STRING', 'STRING'], ''],
        [['locate'], 'INT', ['STRING', 'STRING'], ''],
        [['locate'], 'INT', ['STRING', 'STRING', 'INT'], ''],
        [['regexp_extract'], 'STRING', ['STRING', 'STRING', 'BIGINT'], 'ALWAYS_NULLABLE'],
        [['regexp_replace'], 'STRING', ['STRING', 'STRING', 'STRING'], 'ALWAYS_NULLABLE'],
        [['regexp_replace_one'], 'STRING', ['STRING', 'STRING', 'STRING'], 'ALWAYS_NULLABLE'],
        [['regexp_extract_all'], 'STRING', ['STRING', 'STRING'], 'ALWAYS_NULLABLE'],
        [['concat'], 'STRING', ['STRING', '...'], ''],
        [['replace'], 'STRING', ['STRING', 'STRING', 'STRING'], ''],
        [['concat_ws'], 'STRING', ['STRING', 'STRING', '...'], 'CUSTOM'],
        [['find_in_set'], 'INT', ['STRING', 'STRING'], ''],
        [['parse_url'], 'STRING', ['STRING', 'STRING'], 'ALWAYS_NULLABLE'],
        [['parse_url'], 'STRING', ['STRING', 'STRING', 'STRING'], 'ALWAYS_NULLABLE'],
        [['money_format'], 'STRING', ['BIGINT'], ''],
        [['money_format'], 'STRING', ['LARGEINT'], ''],
        [['money_format'], 'STRING', ['DOUBLE'], ''],
        [['money_format'], 'STRING', ['DECIMALV2'], ''],
        [['money_format'], 'STRING', ['DECIMAL32'], ''],
        [['money_format'], 'STRING', ['DECIMAL64'], ''],
        [['money_format'], 'STRING', ['DECIMAL128'], ''],
        [['split_part'], 'STRING', ['STRING', 'STRING', 'INT'], 'ALWAYS_NULLABLE'],
        [['substring_index'], 'STRING', ['STRING', 'STRING', 'INT'], 'ALWAYS_NULLABLE']
    ],


    # width_bucket
    "Width_Bucket": [
        [['width_bucket'], 'BIGINT', ['TINYINT','TINYINT','TINYINT','TINYINT'], ''],
        [['width_bucket'], 'BIGINT', ['SMALLINT','SMALLINT','SMALLINT','SMALLINT'], ''],
        [['width_bucket'], 'BIGINT', ['INT','INT','INT','INT'], ''],
        [['width_bucket'], 'BIGINT', ['BIGINT','BIGINT','BIGINT','BIGINT'], ''],
        [['width_bucket'], 'BIGINT', ['FLOAT','FLOAT','FLOAT','BIGINT'], ''],
        [['width_bucket'], 'BIGINT', ['DOUBLE','DOUBLE','DOUBLE','BIGINT'], ''],
        [['width_bucket'], 'BIGINT', ['DECIMAL32','DECIMAL32','DECIMAL32','BIGINT'], ''],
        [['width_bucket'], 'BIGINT', ['DECIMAL64','DECIMAL64','DECIMAL64','BIGINT'], ''],
        [['width_bucket'], 'BIGINT', ['DECIMAL128','DECIMAL128','DECIMAL128','BIGINT'], ''],
        [['width_bucket'], 'BIGINT', ['DECIMALV2','DECIMALV2','DECIMALV2','BIGINT'], ''],
        [['width_bucket'], 'BIGINT', ['DATE','DATE','DATE','BIGINT'], ''],
        [['width_bucket'], 'BIGINT', ['DATEV2','DATEV2','DATEV2','BIGINT'], ''],
        [['width_bucket'], 'BIGINT', ['DATETIME','DATETIME','DATETIME','BIGINT'], ''],
        [['width_bucket'], 'BIGINT', ['DATETIMEV2','DATETIMEV2','DATETIMEV2','BIGINT'], '']
    ],


    # runningdifference
    "RunningDifference": [
        [['running_difference'], 'SMALLINT', ['TINYINT'], ''],
        [['running_difference'], 'INT', ['SMALLINT'], ''],
        [['running_difference'], 'BIGINT', ['INT'], ''],
        [['running_difference'], 'BIGINT', ['BIGINT'], ''],
        [['running_difference'], 'LARGEINT', ['LARGEINT'], ''],
        [['running_difference'], 'DOUBLE', ['FLOAT'], ''],
        [['running_difference'], 'DOUBLE', ['DOUBLE'], ''],
        [['running_difference'], 'DECIMALV2', ['DECIMALV2'], ''],
        [['running_difference'], 'DECIMAL32', ['DECIMAL32'], ''],
        [['running_difference'], 'DECIMAL64', ['DECIMAL64'], ''],
        [['running_difference'], 'DECIMAL128', ['DECIMAL128'], ''],
        [['running_difference'], 'INT', ['DATE'], ''],
        [['running_difference'], 'INT', ['DATEV2'], ''],
        [['running_difference'], 'TIME', ['DATETIME'], ''],
        [['running_difference'], 'TIMEV2', ['DATETIMEV2'], '']
    ],

    # Utility functions
    "Utility": [
        [['convert_to'], 'VARCHAR', ['VARCHAR','VARCHAR'], ''],
        [['sleep'], 'BOOLEAN', ['INT'], ''],
        [['version'], 'VARCHAR', [], 'ALWAYS_NOT_NULLABLE'],
        [['field'], 'INT', ['TINYINT', '...'], ''],
        [['field'], 'INT', ['SMALLINT', '...'], ''],
        [['field'], 'INT', ['INT', '...'], ''],
        [['field'], 'INT', ['BIGINT', '...'], ''],
        [['field'], 'INT', ['LARGEINT', '...'], ''],
        [['field'], 'INT', ['FLOAT', '...'], ''],
        [['field'], 'INT', ['DOUBLE', '...'], ''],
        [['field'], 'INT', ['DECIMALV2', '...'], ''],
        [['field'], 'INT', ['DATEV2', '...'], ''],
        [['field'], 'INT', ['DATETIMEV2', '...'], ''],
        [['field'], 'INT', ['VARCHAR', '...'], ''],
        [['field'], 'INT', ['STRING', '...'], '']
    ],


    # JSON functions
    "Json": [
        [['jsonb_parse'], 'JSONB', ['VARCHAR'], ''],
        [['jsonb_parse_error_to_null'], 'JSONB', ['VARCHAR'], 'ALWAYS_NULLABLE'],
        [['jsonb_parse_error_to_value'], 'JSONB', ['VARCHAR', 'VARCHAR'], ''],
        [['jsonb_parse_error_to_invalid'], 'JSONB', ['VARCHAR'], ''],
        [['jsonb_parse_nullable'], 'JSONB', ['VARCHAR'], 'ALWAYS_NULLABLE'],
        [['jsonb_parse_nullable_error_to_null'], 'JSONB', ['VARCHAR'], 'ALWAYS_NULLABLE'],
        [['jsonb_parse_nullable_error_to_value'], 'JSONB', ['VARCHAR', 'VARCHAR'], 'ALWAYS_NULLABLE'],
        [['jsonb_parse_nullable_error_to_invalid'], 'JSONB', ['VARCHAR'], 'ALWAYS_NULLABLE'],
        [['jsonb_parse_notnull'], 'JSONB', ['VARCHAR'], ''],
        [['jsonb_parse_notnull_error_to_value'], 'JSONB', ['VARCHAR', 'VARCHAR'], ''],
        [['jsonb_parse_notnull_error_to_invalid'], 'JSONB', ['VARCHAR'], ''],

        [['jsonb_exists_path'], 'BOOLEAN', ['JSONB', 'VARCHAR'], ''],
        [['jsonb_exists_path'], 'BOOLEAN', ['JSONB', 'STRING'], ''],
        [['jsonb_type'], 'STRING', ['JSONB', 'STRING'], 'ALWAYS_NULLABLE'],
        [['jsonb_type'], 'STRING', ['JSONB', 'STRING'], 'ALWAYS_NULLABLE'],

        [['jsonb_extract'], 'JSONB', ['JSONB', 'VARCHAR'], 'ALWAYS_NULLABLE'],
        [['jsonb_extract'], 'JSONB', ['JSONB', 'STRING'], 'ALWAYS_NULLABLE'],
        [['jsonb_extract_isnull'], 'BOOLEAN', ['JSONB', 'VARCHAR'], 'ALWAYS_NULLABLE'],
        [['jsonb_extract_isnull'], 'BOOLEAN', ['JSONB', 'STRING'], 'ALWAYS_NULLABLE'],
        [['jsonb_extract_bool'], 'BOOLEAN', ['JSONB', 'VARCHAR'], 'ALWAYS_NULLABLE'],
        [['jsonb_extract_bool'], 'BOOLEAN', ['JSONB', 'STRING'], 'ALWAYS_NULLABLE'],
        [['jsonb_extract_int'], 'INT', ['JSONB', 'VARCHAR'], 'ALWAYS_NULLABLE'],
        [['jsonb_extract_int'], 'INT', ['JSONB', 'STRING'], 'ALWAYS_NULLABLE'],
        [['jsonb_extract_bigint'], 'BIGINT', ['JSONB', 'VARCHAR'], 'ALWAYS_NULLABLE'],
        [['jsonb_extract_bigint'], 'BIGINT', ['JSONB', 'STRING'], 'ALWAYS_NULLABLE'],
        [['jsonb_extract_double'], 'DOUBLE', ['JSONB', 'VARCHAR'], 'ALWAYS_NULLABLE'],
        [['jsonb_extract_double'], 'DOUBLE', ['JSONB', 'STRING'], 'ALWAYS_NULLABLE'],
        [['jsonb_extract_string'], 'STRING', ['JSONB', 'VARCHAR'], 'ALWAYS_NULLABLE'],
        [['jsonb_extract_string'], 'STRING', ['JSONB', 'STRING'], 'ALWAYS_NULLABLE'],

        [['json_parse'], 'JSONB', ['VARCHAR'], ''],
        [['json_parse_error_to_null'], 'JSONB', ['VARCHAR'], 'ALWAYS_NULLABLE'],
        [['json_parse_error_to_value'], 'JSONB', ['VARCHAR', 'VARCHAR'], ''],
        [['json_parse_error_to_invalid'], 'JSONB', ['VARCHAR'], ''],
        [['json_parse_nullable'], 'JSONB', ['VARCHAR'], 'ALWAYS_NULLABLE'],
        [['json_parse_nullable_error_to_null'], 'JSONB', ['VARCHAR'], 'ALWAYS_NULLABLE'],
        [['json_parse_nullable_error_to_value'], 'JSONB', ['VARCHAR', 'VARCHAR'], 'ALWAYS_NULLABLE'],
        [['json_parse_nullable_error_to_invalid'], 'JSONB', ['VARCHAR'], 'ALWAYS_NULLABLE'],
        [['json_parse_notnull'], 'JSONB', ['VARCHAR'], ''],
        [['json_parse_notnull_error_to_value'], 'JSONB', ['VARCHAR', 'VARCHAR'], ''],
        [['json_parse_notnull_error_to_invalid'], 'JSONB', ['VARCHAR'], ''],

        [['json_exists_path'], 'BOOLEAN', ['JSONB', 'VARCHAR'], ''],
        [['json_exists_path'], 'BOOLEAN', ['JSONB', 'STRING'], ''],
        [['json_type'], 'STRING', ['JSONB', 'STRING'], 'ALWAYS_NULLABLE'],
        [['json_type'], 'STRING', ['JSONB', 'STRING'], 'ALWAYS_NULLABLE'],

        [['jsonb_extract'], 'JSONB', ['JSONB', 'VARCHAR'], 'ALWAYS_NULLABLE'],
        [['jsonb_extract'], 'JSONB', ['JSONB', 'STRING'], 'ALWAYS_NULLABLE'],
        [['json_extract_isnull'], 'BOOLEAN', ['JSONB', 'VARCHAR'], 'ALWAYS_NULLABLE'],
        [['json_extract_isnull'], 'BOOLEAN', ['JSONB', 'STRING'], 'ALWAYS_NULLABLE'],
        [['json_extract_bool'], 'BOOLEAN', ['JSONB', 'VARCHAR'], 'ALWAYS_NULLABLE'],
        [['json_extract_bool'], 'BOOLEAN', ['JSONB', 'STRING'], 'ALWAYS_NULLABLE'],
        [['json_extract_int'], 'INT', ['JSONB', 'VARCHAR'], 'ALWAYS_NULLABLE'],
        [['json_extract_int'], 'INT', ['JSONB', 'STRING'], 'ALWAYS_NULLABLE'],
        [['json_extract_bigint'], 'BIGINT', ['JSONB', 'VARCHAR'], 'ALWAYS_NULLABLE'],
        [['json_extract_bigint'], 'BIGINT', ['JSONB', 'STRING'], 'ALWAYS_NULLABLE'],
        [['json_extract_double'], 'DOUBLE', ['JSONB', 'VARCHAR'], 'ALWAYS_NULLABLE'],
        [['json_extract_double'], 'DOUBLE', ['JSONB', 'STRING'], 'ALWAYS_NULLABLE'],
        [['json_extract_string'], 'STRING', ['JSONB', 'VARCHAR'], 'ALWAYS_NULLABLE'],
        [['json_extract_string'], 'STRING', ['JSONB', 'STRING'], 'ALWAYS_NULLABLE'],

        # Json functions
        [['get_json_int'], 'INT', ['VARCHAR', 'VARCHAR'], 'ALWAYS_NULLABLE'],
        [['get_json_double'], 'DOUBLE', ['VARCHAR', 'VARCHAR'], 'ALWAYS_NULLABLE'],
        [['get_json_string'], 'VARCHAR', ['VARCHAR', 'VARCHAR'], 'ALWAYS_NULLABLE'],
        [['get_json_int'], 'INT', ['STRING', 'STRING'], 'ALWAYS_NULLABLE'],
        [['get_json_double'], 'DOUBLE', ['STRING', 'STRING'], 'ALWAYS_NULLABLE'],
        [['get_json_string'], 'STRING', ['STRING', 'STRING'], 'ALWAYS_NULLABLE'],
        [['get_json_bigint'], 'BIGINT', ['VARCHAR', 'VARCHAR'], 'ALWAYS_NULLABLE'],
        [['get_json_bigint'], 'BIGINT', ['STRING', 'STRING'], 'ALWAYS_NULLABLE'],

        [['json_array'], 'VARCHAR', ['VARCHAR', '...'], 'ALWAYS_NOT_NULLABLE'],
        [['json_object'], 'VARCHAR', ['VARCHAR', '...'], 'ALWAYS_NOT_NULLABLE'],
        [['json_quote'], 'VARCHAR', ['VARCHAR'], ''],
        [['json_valid'], 'INT', ['VARCHAR'], 'ALWAYS_NULLABLE'],
        [['json_contains'], 'INT', ['VARCHAR', 'VARCHAR', 'VARCHAR'], 'ALWAYS_NULLABLE'],
        [['json_unquote'], 'VARCHAR', ['VARCHAR'], 'ALWAYS_NULLABLE'],
        [['json_extract'], 'VARCHAR', ['VARCHAR', 'VARCHAR', '...'], '']
    ],


    #hll function
    "Hll": [
        [['hll_cardinality'], 'BIGINT', ['HLL'], 'ALWAYS_NOT_NULLABLE'],
        [['hll_hash'], 'HLL', ['VARCHAR'], 'ALWAYS_NOT_NULLABLE'],
        [['hll_empty'], 'HLL', [], 'ALWAYS_NOT_NULLABLE'],
        [['hll_hash'], 'HLL', ['STRING'], 'ALWAYS_NOT_NULLABLE']
    ],


    #bitmap function
    "Bitmap": [
        [['to_bitmap'], 'BITMAP', ['VARCHAR'], 'ALWAYS_NOT_NULLABLE'],
        [['to_bitmap_with_check'], 'BITMAP', ['VARCHAR'], 'ALWAYS_NOT_NULLABLE'],
        [['to_bitmap'], 'BITMAP', ['STRING'], 'ALWAYS_NOT_NULLABLE'],
        [['to_bitmap_with_check'], 'BITMAP', ['STRING'], 'ALWAYS_NOT_NULLABLE'],
        [['to_bitmap'], 'BITMAP', ['BIGINT'], 'ALWAYS_NOT_NULLABLE'],
        [['to_bitmap_with_check'], 'BITMAP', ['BIGINT'], 'ALWAYS_NOT_NULLABLE'],
        [['bitmap_hash'], 'BITMAP', ['VARCHAR'], 'ALWAYS_NOT_NULLABLE'],
        [['bitmap_hash64'], 'BITMAP', ['VARCHAR'], 'ALWAYS_NOT_NULLABLE'],
        [['bitmap_hash'], 'BITMAP', ['STRING'], 'ALWAYS_NOT_NULLABLE'],
        [['bitmap_hash64'], 'BITMAP', ['STRING'], 'ALWAYS_NOT_NULLABLE'],
        [['bitmap_count'], 'BIGINT', ['BITMAP'], 'ALWAYS_NOT_NULLABLE'],
        [['bitmap_and_not_count'], 'BIGINT', ['BITMAP','BITMAP'], ''],
        [['bitmap_empty'], 'BITMAP', [], 'ALWAYS_NOT_NULLABLE'],
        [['bitmap_or'], 'BITMAP', ['BITMAP','BITMAP','...'], ''],
        [['bitmap_or'], 'BITMAP', ['BITMAP','BITMAP'], ''],
        [['bitmap_xor'], 'BITMAP', ['BITMAP','BITMAP','...'], ''],
        [['bitmap_xor'], 'BITMAP', ['BITMAP','BITMAP'], ''],
        [['bitmap_xor_count'], 'BIGINT', ['BITMAP','BITMAP','...'], ''],
        [['bitmap_xor_count'], 'BIGINT', ['BITMAP','BITMAP'], ''],
        [['bitmap_not'], 'BITMAP', ['BITMAP','BITMAP'], ''],
        [['bitmap_and'], 'BITMAP', ['BITMAP','BITMAP','...'], ''],
        [['bitmap_and'], 'BITMAP', ['BITMAP','BITMAP'], ''],
        [['bitmap_and_not'], 'BITMAP', ['BITMAP','BITMAP'], ''],
        [['bitmap_to_string'], 'STRING', ['BITMAP'], ''],
        [['bitmap_from_string'], 'BITMAP', ['VARCHAR'], 'ALWAYS_NULLABLE'],
        [['bitmap_from_string'], 'BITMAP', ['STRING'], 'ALWAYS_NULLABLE'],
        [['bitmap_from_array'], 'BITMAP', ['ARRAY_TINYINT'], 'ALWAYS_NULLABLE'],
        [['bitmap_from_array'], 'BITMAP', ['ARRAY_SMALLINT'], 'ALWAYS_NULLABLE'],
        [['bitmap_from_array'], 'BITMAP', ['ARRAY_INT'], 'ALWAYS_NULLABLE'],
        [['bitmap_from_array'], 'BITMAP', ['ARRAY_BIGINT'], 'ALWAYS_NULLABLE'],
        [['bitmap_contains'], 'BOOLEAN', ['BITMAP','BIGINT'], ''],
        [['bitmap_has_any'], 'BOOLEAN', ['BITMAP','BITMAP'], ''],
        [['bitmap_has_all'], 'BOOLEAN', ['BITMAP','BITMAP'], ''],
        [['bitmap_min'], 'BIGINT', ['BITMAP'], 'ALWAYS_NULLABLE'],
        [['bitmap_max'], 'BIGINT', ['BITMAP'], 'ALWAYS_NULLABLE'],
        [['bitmap_subset_in_range'], 'BITMAP', ['BITMAP', 'BIGINT', 'BIGINT'], 'ALWAYS_NULLABLE'],
        [['bitmap_subset_limit'], 'BITMAP', ['BITMAP', 'BIGINT', 'BIGINT'], 'ALWAYS_NULLABLE'],
        [['bitmap_and_count'], 'BIGINT', ['BITMAP','BITMAP','...'], ''],
        [['bitmap_and_count'], 'BIGINT', ['BITMAP','BITMAP'], ''],
        [['bitmap_or_count'], 'BIGINT', ['BITMAP','BITMAP','...'], ''],
        [['bitmap_or_count'], 'BIGINT', ['BITMAP','BITMAP'], ''],
        [['sub_bitmap'], 'BITMAP', ['BITMAP', 'BIGINT', 'BIGINT'], 'ALWAYS_NULLABLE'],
        [['bitmap_to_array'], 'ARRAY_BIGINT', ['BITMAP'], '']
    ],


    # quantile_function
    "quantile" : [
        [['to_quantile_state'], 'QUANTILE_STATE', ['VARCHAR', 'FLOAT'], 'ALWAYS_NOT_NULLABLE'],
        [['to_quantile_state'], 'QUANTILE_STATE', ['DOUBLE', 'FLOAT'], 'ALWAYS_NOT_NULLABLE'],
        [['to_quantile_state'], 'QUANTILE_STATE', ['FLOAT', 'FLOAT'], 'ALWAYS_NOT_NULLABLE'],
        [['to_quantile_state'], 'QUANTILE_STATE', ['BIGINT', 'FLOAT'], 'ALWAYS_NOT_NULLABLE'],
        [['quantile_percent'], 'DOUBLE', ['QUANTILE_STATE', 'FLOAT'], 'ALWAYS_NOT_NULLABLE']
    ],

    # hash functions
    "Hash": [
        [['murmur_hash3_32'], 'INT', ['VARCHAR', '...'], ''],
        [['murmur_hash3_32'], 'INT', ['STRING', '...'], ''],
        [['murmur_hash3_64'], 'BIGINT', ['VARCHAR', '...'], ''],
        [['murmur_hash3_64'], 'BIGINT', ['STRING', '...'], '']
    ],

    # aes and base64 function
    "aes": [
        [['aes_encrypt'], 'VARCHAR', ['VARCHAR', 'VARCHAR', 'VARCHAR'], 'ALWAYS_NULLABLE'],
        [['aes_decrypt'], 'VARCHAR', ['VARCHAR', 'VARCHAR', 'VARCHAR'], 'ALWAYS_NULLABLE'],
        [['aes_encrypt'], 'VARCHAR', ['VARCHAR', 'VARCHAR', 'VARCHAR', 'VARCHAR'], 'ALWAYS_NULLABLE'],
        [['aes_decrypt'], 'VARCHAR', ['VARCHAR', 'VARCHAR', 'VARCHAR', 'VARCHAR'], 'ALWAYS_NULLABLE'],
        [['sm4_encrypt'], 'VARCHAR', ['VARCHAR', 'VARCHAR', 'VARCHAR'], 'ALWAYS_NULLABLE'],
        [['sm4_decrypt'], 'VARCHAR', ['VARCHAR', 'VARCHAR', 'VARCHAR'], 'ALWAYS_NULLABLE'],
        [['sm4_encrypt'], 'VARCHAR', ['VARCHAR', 'VARCHAR', 'VARCHAR', 'VARCHAR'], 'ALWAYS_NULLABLE'],
        [['sm4_decrypt'], 'VARCHAR', ['VARCHAR', 'VARCHAR', 'VARCHAR', 'VARCHAR'], 'ALWAYS_NULLABLE'],
        [['from_base64'], 'VARCHAR', ['VARCHAR'], 'ALWAYS_NULLABLE'],
        [['aes_encrypt'], 'STRING', ['STRING', 'STRING', 'STRING'], 'ALWAYS_NULLABLE'],
        [['aes_decrypt'], 'STRING', ['STRING', 'STRING', 'STRING'], 'ALWAYS_NULLABLE'],
        [['aes_encrypt'], 'STRING', ['STRING', 'STRING', 'STRING', 'STRING'], 'ALWAYS_NULLABLE'],
        [['aes_decrypt'], 'STRING', ['STRING', 'STRING', 'STRING', 'STRING'], 'ALWAYS_NULLABLE'],
        [['sm4_encrypt'], 'STRING', ['STRING', 'STRING', 'STRING'], 'ALWAYS_NULLABLE'],
        [['sm4_decrypt'], 'STRING', ['STRING', 'STRING', 'STRING'], 'ALWAYS_NULLABLE'],
        [['sm4_encrypt'], 'STRING', ['STRING', 'STRING', 'STRING', 'STRING'], 'ALWAYS_NULLABLE'],
        [['sm4_decrypt'], 'STRING', ['STRING', 'STRING', 'STRING', 'STRING'], 'ALWAYS_NULLABLE'],
        [['from_base64'], 'STRING', ['STRING'], 'ALWAYS_NULLABLE'],
        [['to_base64'], 'STRING', ['STRING'], 'ALWAYS_NULLABLE'],
        [['to_base64'], 'VARCHAR', ['VARCHAR'], 'ALWAYS_NULLABLE']
    ],

    # for compatable with MySQL
    "Compatable": [
        [['md5'], 'VARCHAR', ['VARCHAR'], ''],
        [['md5sum'], 'VARCHAR', ['VARCHAR', '...'], ''],
        [['md5'], 'VARCHAR', ['STRING'], ''],
        [['md5sum'], 'VARCHAR', ['STRING', '...'], ''],

        [['sm3'], 'VARCHAR', ['VARCHAR'], ''],
        [['sm3sum'], 'VARCHAR', ['VARCHAR', '...'], ''],
        [['sm3'], 'VARCHAR', ['STRING'], ''],
        [['sm3sum'], 'VARCHAR', ['STRING', '...'], ''],
    ],

    # geo functions
    "Geo": [
        [['ST_Point'], 'VARCHAR', ['DOUBLE', 'DOUBLE'], 'ALWAYS_NULLABLE'],
        [['ST_X'], 'DOUBLE', ['VARCHAR'], 'ALWAYS_NULLABLE'],
        [['ST_Y'], 'DOUBLE', ['VARCHAR'], 'ALWAYS_NULLABLE'],
        [['ST_X'], 'DOUBLE', ['STRING'], 'ALWAYS_NULLABLE'],
        [['ST_Y'], 'DOUBLE', ['STRING'], 'ALWAYS_NULLABLE'],

        [['ST_Distance_Sphere'], 'DOUBLE', ['DOUBLE', 'DOUBLE', 'DOUBLE', 'DOUBLE'], 'ALWAYS_NULLABLE'],
        [['ST_Angle_Sphere'], 'DOUBLE', ['DOUBLE', 'DOUBLE', 'DOUBLE', 'DOUBLE'], 'ALWAYS_NULLABLE'],

        [['ST_Angle'], 'DOUBLE', ['VARCHAR','VARCHAR','VARCHAR'], 'ALWAYS_NULLABLE'],
        [['ST_Angle'], 'DOUBLE', ['STRING','STRING','STRING'], 'ALWAYS_NULLABLE'],
        [['ST_Azimuth'], 'DOUBLE', ['VARCHAR','VARCHAR'], 'ALWAYS_NULLABLE'],
        [['ST_Azimuth'], 'DOUBLE', ['STRING','STRING'], 'ALWAYS_NULLABLE'],

        [['ST_Area_Square_Meters'], 'DOUBLE', ['VARCHAR'], 'ALWAYS_NULLABLE'],
        [['ST_Area_Square_Meters'], 'DOUBLE', ['STRING'], 'ALWAYS_NULLABLE'],
        [['ST_Area_Square_Km'], 'DOUBLE', ['VARCHAR'], 'ALWAYS_NULLABLE'],
        [['ST_Area_Square_Km'], 'DOUBLE', ['STRING'], 'ALWAYS_NULLABLE'],

        [['ST_AsText', 'ST_AsWKT'], 'VARCHAR', ['VARCHAR'], 'ALWAYS_NULLABLE'],
        [['ST_AsText', 'ST_AsWKT'], 'VARCHAR', ['STRING'], 'ALWAYS_NULLABLE'],
        [['ST_GeometryFromText', 'ST_GeomFromText'], 'VARCHAR', ['VARCHAR'], 'ALWAYS_NULLABLE'],
        [['ST_GeometryFromText', 'ST_GeomFromText'], 'VARCHAR', ['STRING'], 'ALWAYS_NULLABLE'],

        [['ST_GeometryFromWkb', 'ST_GeomFromWkb'], 'VARCHAR', ['VARCHAR'], 'ALWAYS_NULLABLE'],
        [['ST_GeometryFromWkb', 'ST_GeomFromWkb'], 'VARCHAR', ['STRING'], 'ALWAYS_NULLABLE'],

        [['ST_AsBinary'], 'VARCHAR', ['VARCHAR'], 'ALWAYS_NULLABLE'],
        [['ST_AsBinary'], 'VARCHAR', ['STRING'], 'ALWAYS_NULLABLE'],

        [['ST_LineFromText', 'ST_LineStringFromText'], 'VARCHAR', ['VARCHAR'], 'ALWAYS_NULLABLE'],
        [['ST_LineFromText', 'ST_LineStringFromText'], 'VARCHAR', ['STRING'], 'ALWAYS_NULLABLE'],

        [['ST_Polygon', 'ST_PolyFromText', 'ST_PolygonFromText'], 'VARCHAR', ['VARCHAR'], 'ALWAYS_NULLABLE'],
        [['ST_Polygon', 'ST_PolyFromText', 'ST_PolygonFromText'], 'VARCHAR', ['STRING'], 'ALWAYS_NULLABLE'],

        [['ST_Circle'], 'VARCHAR', ['DOUBLE', 'DOUBLE', 'DOUBLE'], 'ALWAYS_NULLABLE'],

        [['ST_Contains'], 'BOOLEAN', ['VARCHAR', 'VARCHAR'], 'ALWAYS_NULLABLE']
    ],

    # grouping sets functions
    "grouping": [
        [['grouping_id'], 'BIGINT', ['BIGINT'], 'ALWAYS_NOT_NULLABLE'],
        [['grouping'], 'BIGINT', ['BIGINT'], 'ALWAYS_NOT_NULLABLE']
    ],


    # url functions
    "Url": [
        [['domain'], 'STRING', ['STRING'], ''],
        [['domain_without_www'], 'STRING', ['STRING'], ''],
        [['protocol'], 'STRING', ['STRING'], '']
    ],

    # search functions
    "Search": [
        [['multi_search_all_positions'], 'ARRAY_INT', ['STRING', 'ARRAY_STRING'], 'ALWAYS_NOT_NULLABLE'],
        [['multi_match_any'], 'TINYINT', ['STRING', 'ARRAY_STRING'], 'ALWAYS_NOT_NULLABLE'],
        [['like'], 'BOOLEAN', ['VARCHAR', 'VARCHAR'], ''],
        [['rlike'], 'BOOLEAN', ['VARCHAR', 'VARCHAR'], ''],
        [['regexp'], 'BOOLEAN', ['VARCHAR', 'VARCHAR'], '']
    ],

    "UUID": [
        [['uuid'], 'VARCHAR', [], 'ALWAYS_NOT_NULLABLE']
    ],

    "NonNullalbe": [
        [['non_nullable'], 'BOOLEAN', ['BOOLEAN'], 'ALWAYS_NOT_NULLABLE'],
        [['non_nullable'], 'TINYINT', ['TINYINT'], 'ALWAYS_NOT_NULLABLE'],
        [['non_nullable'], 'SMALLINT', ['SMALLINT'], 'ALWAYS_NOT_NULLABLE'],
        [['non_nullable'], 'INT', ['INT'], 'ALWAYS_NOT_NULLABLE'],
        [['non_nullable'], 'BIGINT', ['BIGINT'], 'ALWAYS_NOT_NULLABLE'],
        [['non_nullable'], 'LARGEINT', ['LARGEINT'], 'ALWAYS_NOT_NULLABLE'],
        [['non_nullable'], 'FLOAT', ['FLOAT'], 'ALWAYS_NOT_NULLABLE'],
        [['non_nullable'], 'DOUBLE', ['DOUBLE'], 'ALWAYS_NOT_NULLABLE'],
        [['non_nullable'], 'DATE', ['DATE'], 'ALWAYS_NOT_NULLABLE'],
        [['non_nullable'], 'DATEV2', ['DATEV2'], 'ALWAYS_NOT_NULLABLE'],
        [['non_nullable'], 'DATETIME', ['DATETIME'], 'ALWAYS_NOT_NULLABLE'],
        [['non_nullable'], 'DATETIMEV2', ['DATETIMEV2'], 'ALWAYS_NOT_NULLABLE'],
        [['non_nullable'], 'DECIMALV2', ['DECIMALV2'], 'ALWAYS_NOT_NULLABLE'],
        [['non_nullable'], 'DECIMAL32', ['DECIMAL32'], 'ALWAYS_NOT_NULLABLE'],
        [['non_nullable'], 'DECIMAL64', ['DECIMAL64'], 'ALWAYS_NOT_NULLABLE'],
        [['non_nullable'], 'DECIMAL128', ['DECIMAL128'], 'ALWAYS_NOT_NULLABLE'],
        [['non_nullable'], 'VARCHAR', ['VARCHAR'], 'ALWAYS_NOT_NULLABLE'],
        [['non_nullable'], 'STRING', ['STRING'], 'ALWAYS_NOT_NULLABLE'],
        [['non_nullable'], 'BITMAP', ['BITMAP'], 'ALWAYS_NOT_NULLABLE'],
        [['non_nullable'], 'JSONB', ['JSONB'], 'ALWAYS_NOT_NULLABLE'],
        [['non_nullable'], 'ARRAY_BOOLEAN', ['ARRAY_BOOLEAN'], 'ALWAYS_NOT_NULLABLE'],
        [['non_nullable'], 'ARRAY_TINYINT', ['ARRAY_TINYINT'], 'ALWAYS_NOT_NULLABLE'],
        [['non_nullable'], 'ARRAY_SMALLINT', ['ARRAY_SMALLINT'], 'ALWAYS_NOT_NULLABLE'],
        [['non_nullable'], 'ARRAY_INT', ['ARRAY_INT'], 'ALWAYS_NOT_NULLABLE'],
        [['non_nullable'], 'ARRAY_BIGINT', ['ARRAY_BIGINT'], 'ALWAYS_NOT_NULLABLE'],
        [['non_nullable'], 'ARRAY_LARGEINT', ['ARRAY_LARGEINT'], 'ALWAYS_NOT_NULLABLE'],
        [['non_nullable'], 'ARRAY_DATETIME', ['ARRAY_DATETIME'], 'ALWAYS_NOT_NULLABLE'],
        [['non_nullable'], 'ARRAY_DATE', ['ARRAY_DATE'], 'ALWAYS_NOT_NULLABLE'],
        [['non_nullable'], 'ARRAY_DATETIMEV2', ['ARRAY_DATETIMEV2'], 'ALWAYS_NOT_NULLABLE'],
        [['non_nullable'], 'ARRAY_DATEV2', ['ARRAY_DATEV2'], 'ALWAYS_NOT_NULLABLE'],
        [['non_nullable'], 'ARRAY_FLOAT', ['ARRAY_FLOAT'], 'ALWAYS_NOT_NULLABLE'],
        [['non_nullable'], 'ARRAY_DOUBLE', ['ARRAY_DOUBLE'], 'ALWAYS_NOT_NULLABLE'],
        [['non_nullable'], 'ARRAY_DECIMALV2', ['ARRAY_DECIMALV2'], 'ALWAYS_NOT_NULLABLE'],
        [['non_nullable'], 'ARRAY_DECIMAL32', ['ARRAY_DECIMAL32'], 'ALWAYS_NOT_NULLABLE'],
        [['non_nullable'], 'ARRAY_DECIMAL64', ['ARRAY_DECIMAL64'], 'ALWAYS_NOT_NULLABLE'],
        [['non_nullable'], 'ARRAY_DECIMAL128', ['ARRAY_DECIMAL128'], 'ALWAYS_NOT_NULLABLE'],
        [['non_nullable'], 'ARRAY_VARCHAR', ['ARRAY_VARCHAR'], 'ALWAYS_NOT_NULLABLE'],
        [['non_nullable'], 'ARRAY_STRING', ['ARRAY_STRING'], 'ALWAYS_NOT_NULLABLE']
    ]
}

# Except the following functions, other function will directly return
# null if there is null parameters.
# Functions in this set will handle null values, not just return null.
#
# This set is only used to replace 'functions with null parameters' with NullLiteral
# when applying FoldConstantsRule rules on the FE side.
# TODO(cmy): Are these functions only required to handle null values?
non_null_result_with_null_param_functions = [
    'if',
    'hll_hash',
    'concat_ws',
    'ifnull',
    'nvl',
    'nullif',
    'null_or_empty',
    'not_null_or_empty'
    'coalesce',
    'array',
    'json_array',
    'json_object'
]

# Nondeterministic functions may return different results each time they are called
nondeterministic_functions = [
    'rand',
    'now',
    'current_timestamp',
    'localtime',
    'localtimestamp',
    'curdate',
    'current_date',
    'curtime',
    'current_time',
    'utc_timestamp',
    'uuid'
]
# This is the subset of ALWAYS_NULLABLE
# The function belongs to @null_result_with_one_null_param_functions,
# as long as one parameter is null, the function must return null.
null_result_with_one_null_param_functions = [
    'unix_timestamp',
    'str_to_date',
    'convert_tz',
    'pi',
    'e',
    'divide',
    'int_divide',
    'pmod',
    'mod',
    'fmod',
    'substr',
    'substring',
    'append_trailing_char_if_absent',
    'ST_X',
    'ST_Y',
    'ST_AsText',
    'ST_GeometryFromText',
    'ST_LineFromText',
    'ST_Polygon',
    'ST_Contains'
]

invisible_functions = [
]
