private void initAggregateBuiltins()

in fe/src/main/java/org/apache/impala/catalog/BuiltinsDb.java [979:1781]


  private void initAggregateBuiltins() {
    final String prefix = "_ZN6impala18AggregateFunctions";
    final String initNullString = prefix +
        "14InitNullStringEPN10impala_udf15FunctionContextEPNS1_9StringValE";
    final String initNull = prefix +
        "8InitNullEPN10impala_udf15FunctionContextEPNS1_6AnyValE";
    final String stringValSerializeOrFinalize = prefix +
        "28StringValSerializeOrFinalizeEPN10impala_udf15FunctionContextERKNS1_9StringValE";
    final String stringValGetValue = prefix +
        "17StringValGetValueEPN10impala_udf15FunctionContextERKNS1_9StringValE";

    Db db = this;
    // Count (*)
    db.addBuiltin(AggregateFunction.createBuiltin(db, "count",
        new ArrayList<>(), Type.BIGINT, Type.BIGINT,
        prefix + "8InitZeroIN10impala_udf9BigIntValEEEvPNS2_15FunctionContextEPT_",
        prefix + "15CountStarUpdateEPN10impala_udf15FunctionContextEPNS1_9BigIntValE",
        prefix + "10CountMergeEPN10impala_udf15FunctionContextERKNS1_9BigIntValEPS4_",
        null, null,
        prefix + "15CountStarRemoveEPN10impala_udf15FunctionContextEPNS1_9BigIntValE",
        null, false, true, true));

    for (Type t: Type.getSupportedTypes()) {
      if (t.isNull()) continue; // NULL is handled through type promotion.
      if (t.isScalarType(PrimitiveType.CHAR)) continue; // promoted to STRING
      if (t.isScalarType(PrimitiveType.VARCHAR)) continue; // promoted to STRING

      // Count
      db.addBuiltin(AggregateFunction.createBuiltin(db, "count",
          Lists.newArrayList(t), Type.BIGINT, Type.BIGINT,
          prefix + "8InitZeroIN10impala_udf9BigIntValEEEvPNS2_15FunctionContextEPT_",
          prefix + "11CountUpdateEPN10impala_udf15FunctionContextERKNS1_6AnyValEPNS1_9BigIntValE",
          prefix + "10CountMergeEPN10impala_udf15FunctionContextERKNS1_9BigIntValEPS4_",
          null, null,
          prefix + "11CountRemoveEPN10impala_udf15FunctionContextERKNS1_6AnyValEPNS1_9BigIntValE",
          null, false, true, true));

      // Min
      String minMaxInit = t.isStringType() ? initNullString : initNull;
      String minMaxSerializeOrFinalize = t.isStringType() ?
          stringValSerializeOrFinalize : null;
      String minMaxGetValue = t.isStringType() ? stringValGetValue : null;
      db.addBuiltin(AggregateFunction.createBuiltin(db, "min",
          Lists.newArrayList(t), t, t, minMaxInit,
          prefix + MIN_UPDATE_SYMBOL.get(t),
          prefix + MIN_UPDATE_SYMBOL.get(t),
          minMaxSerializeOrFinalize, minMaxGetValue,
          null, minMaxSerializeOrFinalize, true, true, false));
      // Max
      db.addBuiltin(AggregateFunction.createBuiltin(db, "max",
          Lists.newArrayList(t), t, t, minMaxInit,
          prefix + MAX_UPDATE_SYMBOL.get(t),
          prefix + MAX_UPDATE_SYMBOL.get(t),
          minMaxSerializeOrFinalize, minMaxGetValue,
          null, minMaxSerializeOrFinalize, true, true, false));
    }

    for (Type t: Type.getSupportedTypes()) {
      if (t.isNull()) continue; // NULL is handled through type promotion.
      if (t.isScalarType(PrimitiveType.CHAR)) continue; // promoted to STRING
      if (t.isScalarType(PrimitiveType.VARCHAR)) continue; // promoted to STRING
      if (t.isBinary()) continue; // Only supported for count/min/max

      // Sample
      db.addBuiltin(AggregateFunction.createBuiltin(db, "sample",
          Lists.newArrayList(t), Type.STRING, Type.STRING,
          prefix + SAMPLE_INIT_SYMBOL.get(t),
          prefix + SAMPLE_UPDATE_SYMBOL.get(t),
          prefix + SAMPLE_MERGE_SYMBOL.get(t),
          prefix + SAMPLE_SERIALIZE_SYMBOL.get(t),
          prefix + SAMPLE_FINALIZE_SYMBOL.get(t),
          false, false, true));

      // Approximate median
      db.addBuiltin(AggregateFunction.createBuiltin(db, "appx_median",
          Lists.newArrayList(t), t, Type.STRING,
          prefix + SAMPLE_INIT_SYMBOL.get(t),
          prefix + SAMPLE_UPDATE_SYMBOL.get(t),
          prefix + SAMPLE_MERGE_SYMBOL.get(t),
          prefix + SAMPLE_SERIALIZE_SYMBOL.get(t),
          prefix + APPX_MEDIAN_FINALIZE_SYMBOL.get(t),
          false, false, true));

      // Histogram
      db.addBuiltin(AggregateFunction.createBuiltin(db, "histogram",
          Lists.newArrayList(t), Type.STRING, Type.STRING,
          prefix + SAMPLE_INIT_SYMBOL.get(t),
          prefix + SAMPLE_UPDATE_SYMBOL.get(t),
          prefix + SAMPLE_MERGE_SYMBOL.get(t),
          prefix + SAMPLE_SERIALIZE_SYMBOL.get(t),
          prefix + HISTOGRAM_FINALIZE_SYMBOL.get(t),
          false, false, true));

      // NDV
      // Setup the intermediate type based on the default precision in the template
      // function in the db. This type is useful when the default precision is all
      // needed in the ndv().
      Type defaultHllIntermediateType =
          ScalarType.createFixedUdaIntermediateType(HLL_INTERMEDIATE_SIZE);

      // Single input argument version
      db.addBuiltin(AggregateFunction.createBuiltin(db, "ndv", Lists.newArrayList(t),
          Type.BIGINT, defaultHllIntermediateType,
          prefix + "7HllInitEPN10impala_udf15FunctionContextEPNS1_9StringValE",
          prefix + HLL_UPDATE_SYMBOL.get(t),
          prefix + "8HllMergeEPN10impala_udf15FunctionContextERKNS1_9StringValEPS4_",
          null,
          prefix + "11HllFinalizeEPN10impala_udf15FunctionContextERKNS1_9StringValE",
          true, false, true));

      // Double input argument version, with the unique HllUpdate function symbols.
      // Take an intermediate data type with the default length for now. During the
      // analysis phase, the data type will be resolved to the correct template, based
      // on the the value in the 2nd argument.
      db.addBuiltin(createTemplateAggregateFunctionForNDVWith2Args(
          db, prefix, t, defaultHllIntermediateType));

      // For each type t, populate the hash map of AggregateFunctions with
      // all known intermediate data types.
      List<AggregateFunction> ndvList = new ArrayList<AggregateFunction>();
      for (int size : hll_intermediate_sizes) {
        Type hllIntermediateType = ScalarType.createFixedUdaIntermediateType(size);
        ndvList.add(createTemplateAggregateFunctionForNDVWith2Args(
            db, prefix, t, hllIntermediateType));
      }
      builtinNDVs_.put(t, ndvList);

      // Used in stats computation. Will take a single input argument only.
      db.addBuiltin(AggregateFunction.createBuiltin(db, "ndv_no_finalize",
          Lists.newArrayList(t), Type.STRING, defaultHllIntermediateType,
          prefix + "7HllInitEPN10impala_udf15FunctionContextEPNS1_9StringValE",
          prefix + HLL_UPDATE_SYMBOL.get(t),
          prefix + "8HllMergeEPN10impala_udf15FunctionContextERKNS1_9StringValEPS4_",
          null,
          "_Z20IncrementNdvFinalizePN10impala_udf15FunctionContextERKNS_9StringValE",
          true, false, true));

      // DataSketches HLL
      if (DS_HLL_UPDATE_SYMBOL.containsKey(t)) {
        db.addBuiltin(AggregateFunction.createBuiltin(db, "ds_hll_sketch_and_estimate",
            Lists.newArrayList(t), Type.BIGINT, Type.STRING,
            prefix + "9DsHllInitEPN10impala_udf15FunctionContextEPNS1_9StringValE",
            prefix + DS_HLL_UPDATE_SYMBOL.get(t),
            prefix + "10DsHllMergeEPN10impala_udf15FunctionContextERKNS1_9StringValEPS4_",
            prefix + "14DsHllSerializeEPN10impala_udf15FunctionContextERKNS1_9StringValE",
            prefix + "13DsHllFinalizeEPN10impala_udf15FunctionContextERKNS1_9StringValE",
            true, false, true));

        db.addBuiltin(AggregateFunction.createBuiltin(db, "ds_hll_sketch",
            Lists.newArrayList(t), Type.STRING, Type.STRING,
            prefix + "9DsHllInitEPN10impala_udf15FunctionContextEPNS1_9StringValE",
            prefix + DS_HLL_UPDATE_SYMBOL.get(t),
            prefix + "10DsHllMergeEPN10impala_udf15FunctionContextERKNS1_9StringValEPS4_",
            prefix + "14DsHllSerializeEPN10impala_udf15FunctionContextERKNS1_9StringValE",
            prefix + "19DsHllFinalizeSketchEPN10impala_udf15FunctionContextERKNS1_" +
                "9StringValE", true, false, true));
      } else {
        db.addBuiltin(AggregateFunction.createUnsupportedBuiltin(db,
            "ds_hll_sketch_and_estimate", Lists.newArrayList(t), Type.STRING,
            Type.STRING));
        db.addBuiltin(AggregateFunction.createUnsupportedBuiltin(db, "ds_hll_sketch",
            Lists.newArrayList(t), Type.STRING, Type.STRING));
      }

      // DataSketches CPC
      if (DS_CPC_UPDATE_SYMBOL.containsKey(t)) {
        db.addBuiltin(AggregateFunction.createBuiltin(db, "ds_cpc_sketch_and_estimate",
            Lists.newArrayList(t), Type.BIGINT, Type.STRING,
            prefix + "9DsCpcInitEPN10impala_udf15FunctionContextEPNS1_9StringValE",
            prefix + DS_CPC_UPDATE_SYMBOL.get(t),
            prefix + "10DsCpcMergeEPN10impala_udf15FunctionContextERKNS1_9StringValEPS4_",
            prefix + "14DsCpcSerializeEPN10impala_udf15FunctionContextERKNS1_9StringValE",
            prefix + "13DsCpcFinalizeEPN10impala_udf15FunctionContextERKNS1_9StringValE",
            true, false, true));

        db.addBuiltin(AggregateFunction.createBuiltin(db, "ds_cpc_sketch",
            Lists.newArrayList(t), Type.STRING, Type.STRING,
            prefix + "9DsCpcInitEPN10impala_udf15FunctionContextEPNS1_9StringValE",
            prefix + DS_CPC_UPDATE_SYMBOL.get(t),
            prefix + "10DsCpcMergeEPN10impala_udf15FunctionContextERKNS1_9StringValEPS4_",
            prefix + "14DsCpcSerializeEPN10impala_udf15FunctionContextERKNS1_9StringValE",
            prefix + "19DsCpcFinalizeSketchEPN10impala_udf15FunctionContextERKNS1_" +
                "9StringValE", true, false, true));
      } else {
        db.addBuiltin(AggregateFunction.createUnsupportedBuiltin(db,
            "ds_cpc_sketch_and_estimate", Lists.newArrayList(t), Type.STRING,
            Type.STRING));
        db.addBuiltin(AggregateFunction.createUnsupportedBuiltin(db, "ds_cpc_sketch",
                Lists.newArrayList(t), Type.STRING, Type.STRING));
      }

      // DataSketches Theta
      if (DS_THETA_UPDATE_SYMBOL.containsKey(t)) {
        db.addBuiltin(AggregateFunction.createBuiltin(db, "ds_theta_sketch_and_estimate",
                Lists.newArrayList(t), Type.BIGINT, Type.STRING,
                prefix + "11DsThetaInitEPN10impala_udf15FunctionContextEPNS1_9StringValE",
                prefix + DS_THETA_UPDATE_SYMBOL.get(t),
                prefix + "12DsThetaMergeEPN10impala_udf15FunctionContextERKNS1_9StringValEPS4_",
                prefix + "16DsThetaSerializeEPN10impala_udf15FunctionContextERKNS1_9StringValE",
                prefix + "15DsThetaFinalizeEPN10impala_udf15FunctionContextERKNS1_9StringValE",
                true, false, true));

        db.addBuiltin(AggregateFunction.createBuiltin(db, "ds_theta_sketch",
                Lists.newArrayList(t), Type.STRING, Type.STRING,
                prefix + "11DsThetaInitEPN10impala_udf15FunctionContextEPNS1_9StringValE",
                prefix + DS_THETA_UPDATE_SYMBOL.get(t),
                prefix + "12DsThetaMergeEPN10impala_udf15FunctionContextERKNS1_9StringValEPS4_",
                prefix + "16DsThetaSerializeEPN10impala_udf15FunctionContextERKNS1_9StringValE",
                prefix + "21DsThetaFinalizeSketchEPN10impala_udf15FunctionContextERKNS1_" +
                        "9StringValE", true, false, true));
      } else {
        db.addBuiltin(AggregateFunction.createUnsupportedBuiltin(db,
                "ds_theta_sketch_and_estimate", Lists.newArrayList(t), Type.STRING,
                Type.STRING));
        db.addBuiltin(AggregateFunction.createUnsupportedBuiltin(db, "ds_theta_sketch",
                Lists.newArrayList(t), Type.STRING, Type.STRING));
      }

      // SAMPLED_NDV.
      // Size needs to be kept in sync with SampledNdvState in the BE.
      int NUM_HLL_BUCKETS = 32;
      int size = 16 + NUM_HLL_BUCKETS * (8 + HLL_INTERMEDIATE_SIZE);
      Type sampledIntermediateType = ScalarType.createFixedUdaIntermediateType(size);
      db.addBuiltin(AggregateFunction.createBuiltin(db, "sampled_ndv",
          Lists.newArrayList(t, Type.DOUBLE), Type.BIGINT, sampledIntermediateType,
          prefix + "14SampledNdvInitEPN10impala_udf15FunctionContextEPNS1_9StringValE",
          prefix + SAMPLED_NDV_UPDATE_SYMBOL.get(t),
          prefix + "15SampledNdvMergeEPN10impala_udf15FunctionContextERKNS1_9StringValEPS4_",
          null,
          prefix + "18SampledNdvFinalizeEPN10impala_udf15FunctionContextERKNS1_9StringValE",
          true, false, true));

      db.addBuiltin(AggregateFunction.createBuiltin(db, "aggif",
          Lists.newArrayList(ScalarType.BOOLEAN, t), t, t,
          initNull,
          prefix + AGGIF_UPDATE_SYMBOL.get(t),
          prefix + AGGIF_MERGE_SYMBOL.get(t),
          null,
          prefix + AGGIF_FINALIZE_SYMBOL.get(t),
          true, false, true));

      Type pcIntermediateType =
          ScalarType.createFixedUdaIntermediateType(PC_INTERMEDIATE_SIZE);
      // distinctpc
      db.addBuiltin(AggregateFunction.createBuiltin(db, "distinctpc",
          Lists.newArrayList(t), Type.BIGINT, pcIntermediateType,
          prefix + "6PcInitEPN10impala_udf15FunctionContextEPNS1_9StringValE",
          prefix + PC_UPDATE_SYMBOL.get(t),
          prefix + "7PcMergeEPN10impala_udf15FunctionContextERKNS1_9StringValEPS4_",
          null,
          prefix + "10PcFinalizeEPN10impala_udf15FunctionContextERKNS1_9StringValE",
          false, false, true));

      // distinctpcsa
      db.addBuiltin(AggregateFunction.createBuiltin(db, "distinctpcsa",
          Lists.newArrayList(t), Type.BIGINT, pcIntermediateType,
          prefix + "6PcInitEPN10impala_udf15FunctionContextEPNS1_9StringValE",
          prefix + PCSA_UPDATE_SYMBOL.get(t),
          prefix + "7PcMergeEPN10impala_udf15FunctionContextERKNS1_9StringValEPS4_",
          null,
          prefix + "12PcsaFinalizeEPN10impala_udf15FunctionContextERKNS1_9StringValE",
          false, false, true));

      if (STDDEV_UPDATE_SYMBOL.containsKey(t)) {
        Type stddevIntermediateType =
            ScalarType.createFixedUdaIntermediateType(STDDEV_INTERMEDIATE_SIZE);
        db.addBuiltin(AggregateFunction.createBuiltin(db, "stddev",
            Lists.newArrayList(t), Type.DOUBLE, stddevIntermediateType,
            prefix + "12KnuthVarInitEPN10impala_udf15FunctionContextEPNS1_9StringValE",
            prefix + STDDEV_UPDATE_SYMBOL.get(t),
            prefix + "13KnuthVarMergeEPN10impala_udf15FunctionContextERKNS1_9StringValEPS4_",
            null,
            prefix + "19KnuthStddevFinalizeEPN10impala_udf15FunctionContextERKNS1_9StringValE",
            false, false, false));
        db.addBuiltin(AggregateFunction.createBuiltin(db, "stddev_samp",
            Lists.newArrayList(t), Type.DOUBLE, stddevIntermediateType,
            prefix + "12KnuthVarInitEPN10impala_udf15FunctionContextEPNS1_9StringValE",
            prefix + STDDEV_UPDATE_SYMBOL.get(t),
            prefix + "13KnuthVarMergeEPN10impala_udf15FunctionContextERKNS1_9StringValEPS4_",
            null,
            prefix + "19KnuthStddevFinalizeEPN10impala_udf15FunctionContextERKNS1_9StringValE",
            false, false, false));
        db.addBuiltin(AggregateFunction.createBuiltin(db, "stddev_pop",
            Lists.newArrayList(t), Type.DOUBLE, stddevIntermediateType,
            prefix + "12KnuthVarInitEPN10impala_udf15FunctionContextEPNS1_9StringValE",
            prefix + STDDEV_UPDATE_SYMBOL.get(t),
            prefix + "13KnuthVarMergeEPN10impala_udf15FunctionContextERKNS1_9StringValEPS4_",
            null,
            prefix + "22KnuthStddevPopFinalizeEPN10impala_udf15FunctionContextERKNS1_9StringValE",
            false, false, false));
        db.addBuiltin(AggregateFunction.createBuiltin(db, "variance",
            Lists.newArrayList(t), Type.DOUBLE, stddevIntermediateType,
            prefix + "12KnuthVarInitEPN10impala_udf15FunctionContextEPNS1_9StringValE",
            prefix + STDDEV_UPDATE_SYMBOL.get(t),
            prefix + "13KnuthVarMergeEPN10impala_udf15FunctionContextERKNS1_9StringValEPS4_",
            null,
            prefix + "16KnuthVarFinalizeEPN10impala_udf15FunctionContextERKNS1_9StringValE",
            false, false, false));
        db.addBuiltin(AggregateFunction.createBuiltin(db, "variance_samp",
            Lists.newArrayList(t), Type.DOUBLE, stddevIntermediateType,
            prefix + "12KnuthVarInitEPN10impala_udf15FunctionContextEPNS1_9StringValE",
            prefix + STDDEV_UPDATE_SYMBOL.get(t),
            prefix + "13KnuthVarMergeEPN10impala_udf15FunctionContextERKNS1_9StringValEPS4_",
            null,
            prefix + "16KnuthVarFinalizeEPN10impala_udf15FunctionContextERKNS1_9StringValE",
            false, false, false));
        db.addBuiltin(AggregateFunction.createBuiltin(db, "var_samp",
            Lists.newArrayList(t), Type.DOUBLE, stddevIntermediateType,
            prefix + "12KnuthVarInitEPN10impala_udf15FunctionContextEPNS1_9StringValE",
            prefix + STDDEV_UPDATE_SYMBOL.get(t),
            prefix + "13KnuthVarMergeEPN10impala_udf15FunctionContextERKNS1_9StringValEPS4_",
            null,
            prefix + "16KnuthVarFinalizeEPN10impala_udf15FunctionContextERKNS1_9StringValE",
            false, false, false));
        db.addBuiltin(AggregateFunction.createBuiltin(db, "variance_pop",
            Lists.newArrayList(t), Type.DOUBLE, stddevIntermediateType,
            prefix + "12KnuthVarInitEPN10impala_udf15FunctionContextEPNS1_9StringValE",
            prefix + STDDEV_UPDATE_SYMBOL.get(t),
            prefix + "13KnuthVarMergeEPN10impala_udf15FunctionContextERKNS1_9StringValEPS4_",
            null,
            prefix + "19KnuthVarPopFinalizeEPN10impala_udf15FunctionContextERKNS1_9StringValE",
            false, false, false));
        db.addBuiltin(AggregateFunction.createBuiltin(db, "var_pop",
            Lists.newArrayList(t), Type.DOUBLE, stddevIntermediateType,
            prefix + "12KnuthVarInitEPN10impala_udf15FunctionContextEPNS1_9StringValE",
            prefix + STDDEV_UPDATE_SYMBOL.get(t),
            prefix + "13KnuthVarMergeEPN10impala_udf15FunctionContextERKNS1_9StringValEPS4_",
            null,
            prefix + "19KnuthVarPopFinalizeEPN10impala_udf15FunctionContextERKNS1_9StringValE",
            false, false, false));
      }
    }

    // Sum
    db.addBuiltin(AggregateFunction.createBuiltin(db, "sum",
        Lists.<Type>newArrayList(Type.BIGINT), Type.BIGINT, Type.BIGINT, initNull,
        prefix + "9SumUpdateIN10impala_udf9BigIntValES3_EEvPNS2_15FunctionContextERKT_PT0_",
        prefix + "9SumUpdateIN10impala_udf9BigIntValES3_EEvPNS2_15FunctionContextERKT_PT0_",
        null, null,
        prefix + "9SumRemoveIN10impala_udf9BigIntValES3_EEvPNS2_15FunctionContextERKT_PT0_",
        null, false, true, false));
    db.addBuiltin(AggregateFunction.createBuiltin(db, "sum",
        Lists.<Type>newArrayList(Type.DOUBLE), Type.DOUBLE, Type.DOUBLE, initNull,
        prefix + "9SumUpdateIN10impala_udf9DoubleValES3_EEvPNS2_15FunctionContextERKT_PT0_",
        prefix + "9SumUpdateIN10impala_udf9DoubleValES3_EEvPNS2_15FunctionContextERKT_PT0_",
        null, null,
        prefix + "9SumRemoveIN10impala_udf9DoubleValES3_EEvPNS2_15FunctionContextERKT_PT0_",
        null, false, true, false));
    db.addBuiltin(AggregateFunction.createBuiltin(db, "sum",
        Lists.<Type>newArrayList(Type.DECIMAL), Type.DECIMAL, Type.DECIMAL, initNull,
        prefix + "16SumDecimalUpdateEPN10impala_udf15FunctionContextERKNS1_10DecimalValEPS4_",
        prefix + "15SumDecimalMergeEPN10impala_udf15FunctionContextERKNS1_10DecimalValEPS4_",
        null, null,
        prefix + "16SumDecimalRemoveEPN10impala_udf15FunctionContextERKNS1_10DecimalValEPS4_",
        null, false, true, false));

    // Sum that returns zero on an empty input.
    db.addBuiltin(AggregateFunction.createBuiltin(db, "sum_init_zero",
        Lists.<Type>newArrayList(Type.BIGINT), Type.BIGINT, Type.BIGINT,
        prefix + "8InitZeroIN10impala_udf9BigIntValEEEvPNS2_15FunctionContextEPT_",
        prefix + "9SumUpdateIN10impala_udf9BigIntValES3_EEvPNS2_15FunctionContextERKT_PT0_",
        prefix + "9SumUpdateIN10impala_udf9BigIntValES3_EEvPNS2_15FunctionContextERKT_PT0_",
        null, null,
        prefix + "9SumRemoveIN10impala_udf9BigIntValES3_EEvPNS2_15FunctionContextERKT_PT0_",
        null, false, true, true));

    // Corr()
    db.addBuiltin(AggregateFunction.createBuiltin(db, "corr",
        Lists.<Type>newArrayList(Type.DOUBLE, Type.DOUBLE), Type.DOUBLE, Type.STRING,
        prefix + "8CorrInitEPN10impala_udf15FunctionContextEPNS1_9StringValE",
        prefix + "10CorrUpdateEPN10impala_udf15FunctionContextERKNS1_9DoubleValES6_PNS1_9StringValE",
        prefix + "9CorrMergeEPN10impala_udf15FunctionContextERKNS1_9StringValEPS4_",
        stringValSerializeOrFinalize,
        prefix + "12CorrGetValueEPN10impala_udf15FunctionContextERKNS1_9StringValE",
        prefix + "10CorrRemoveEPN10impala_udf15FunctionContextERKNS1_9DoubleValES6_PNS1_9StringValE",
        prefix + "12CorrFinalizeEPN10impala_udf15FunctionContextERKNS1_9StringValE",
        false, true, false));

    db.addBuiltin(AggregateFunction.createBuiltin(db, "corr",
        Lists.<Type>newArrayList(Type.TIMESTAMP, Type.TIMESTAMP), Type.DOUBLE, Type.STRING,
        prefix + "8CorrInitEPN10impala_udf15FunctionContextEPNS1_9StringValE",
        prefix +
                "19TimestampCorrUpdateEPN10impala_udf15FunctionContextERKNS1_12TimestampValES6_PNS1_9StringValE",
        prefix + "9CorrMergeEPN10impala_udf15FunctionContextERKNS1_9StringValEPS4_",
        stringValSerializeOrFinalize,
        prefix + "12CorrGetValueEPN10impala_udf15FunctionContextERKNS1_9StringValE",
        prefix +
                "19TimestampCorrRemoveEPN10impala_udf15FunctionContextERKNS1_12TimestampValES6_PNS1_9StringValE",
        prefix + "12CorrFinalizeEPN10impala_udf15FunctionContextERKNS1_9StringValE",
        false, true, false));

    // Regr_count()
    db.addBuiltin(AggregateFunction.createBuiltin(db, "regr_count",
        Lists.<Type>newArrayList(Type.DOUBLE, Type.DOUBLE), Type.BIGINT, Type.BIGINT,
        prefix + "8InitZeroIN10impala_udf9BigIntValEEEvPNS2_15FunctionContextEPT_",
        prefix + "15RegrCountUpdateEPN10impala_udf15FunctionContextERKNS1_9DoubleValES6_PNS1_9BigIntValE",
        prefix + "10CountMergeEPN10impala_udf15FunctionContextERKNS1_9BigIntValEPS4_",
        null, null,
        prefix + "15RegrCountRemoveEPN10impala_udf15FunctionContextERKNS1_9DoubleValES6_PNS1_9BigIntValE",
        null, false, true, true));

    db.addBuiltin(AggregateFunction.createBuiltin(db, "regr_count",
        Lists.<Type>newArrayList(Type.TIMESTAMP, Type.TIMESTAMP), Type.BIGINT, Type.BIGINT,
        prefix + "8InitZeroIN10impala_udf9BigIntValEEEvPNS2_15FunctionContextEPT_",
        prefix + "24TimestampRegrCountUpdateEPN10impala_udf15FunctionContextERKNS1_12TimestampValES6_PNS1_9BigIntValE",
        prefix + "10CountMergeEPN10impala_udf15FunctionContextERKNS1_9BigIntValEPS4_",
        null, null,
        prefix + "24TimestampRegrCountRemoveEPN10impala_udf15FunctionContextERKNS1_12TimestampValES6_PNS1_9BigIntValE",
        null, false, true, true));

    // Regr_r2()
    db.addBuiltin(AggregateFunction.createBuiltin(db, "regr_r2",
        Lists.<Type>newArrayList(Type.DOUBLE, Type.DOUBLE), Type.DOUBLE, Type.STRING,
        prefix + "8CorrInitEPN10impala_udf15FunctionContextEPNS1_9StringValE",
        prefix + "10CorrUpdateEPN10impala_udf15FunctionContextERKNS1_9DoubleValES6_PNS1_9StringValE",
        prefix + "9CorrMergeEPN10impala_udf15FunctionContextERKNS1_9StringValEPS4_",
        stringValSerializeOrFinalize,
        prefix + "15Regr_r2GetValueEPN10impala_udf15FunctionContextERKNS1_9StringValE",
        prefix + "10CorrRemoveEPN10impala_udf15FunctionContextERKNS1_9DoubleValES6_PNS1_9StringValE",
        prefix + "15Regr_r2FinalizeEPN10impala_udf15FunctionContextERKNS1_9StringValE",
        false, true, false));

    db.addBuiltin(AggregateFunction.createBuiltin(db, "regr_r2",
        Lists.<Type>newArrayList(Type.TIMESTAMP, Type.TIMESTAMP), Type.DOUBLE, Type.STRING,
        prefix + "8CorrInitEPN10impala_udf15FunctionContextEPNS1_9StringValE",
        prefix +
                "19TimestampCorrUpdateEPN10impala_udf15FunctionContextERKNS1_12TimestampValES6_PNS1_9StringValE",
        prefix + "9CorrMergeEPN10impala_udf15FunctionContextERKNS1_9StringValEPS4_",
        stringValSerializeOrFinalize,
        prefix + "15Regr_r2GetValueEPN10impala_udf15FunctionContextERKNS1_9StringValE",
        prefix +
                "19TimestampCorrRemoveEPN10impala_udf15FunctionContextERKNS1_12TimestampValES6_PNS1_9StringValE",
        prefix + "15Regr_r2FinalizeEPN10impala_udf15FunctionContextERKNS1_9StringValE",
        false, true, false));

    //Regr_slope()
    db.addBuiltin(AggregateFunction.createBuiltin(db, "regr_slope",
        Lists.<Type>newArrayList(Type.DOUBLE, Type.DOUBLE), Type.DOUBLE, Type.STRING,
        prefix + "13RegrSlopeInitEPN10impala_udf15FunctionContextEPNS1_9StringValE",
        prefix + "15RegrSlopeUpdateEPN10impala_udf15FunctionContextERKNS1_9DoubleValES6_PNS1_9StringValE",
        prefix + "14RegrSlopeMergeEPN10impala_udf15FunctionContextERKNS1_9StringValEPS4_",
        stringValSerializeOrFinalize,
        prefix + "17RegrSlopeGetValueEPN10impala_udf15FunctionContextERKNS1_9StringValE",
        prefix + "15RegrSlopeRemoveEPN10impala_udf15FunctionContextERKNS1_9DoubleValES6_PNS1_9StringValE",
        prefix + "17RegrSlopeFinalizeEPN10impala_udf15FunctionContextERKNS1_9StringValE",
        false, true, false));

    db.addBuiltin(AggregateFunction.createBuiltin(db, "regr_slope",
        Lists.<Type>newArrayList(Type.TIMESTAMP, Type.TIMESTAMP), Type.DOUBLE, Type.STRING,
        prefix + "13RegrSlopeInitEPN10impala_udf15FunctionContextEPNS1_9StringValE",
        prefix + "24TimestampRegrSlopeUpdateEPN10impala_udf15FunctionContextERKNS1_12TimestampValES6_PNS1_9StringValE",
        prefix + "14RegrSlopeMergeEPN10impala_udf15FunctionContextERKNS1_9StringValEPS4_",
        stringValSerializeOrFinalize,
        prefix + "17RegrSlopeGetValueEPN10impala_udf15FunctionContextERKNS1_9StringValE",
        prefix + "24TimestampRegrSlopeRemoveEPN10impala_udf15FunctionContextERKNS1_12TimestampValES6_PNS1_9StringValE",
        prefix + "17RegrSlopeFinalizeEPN10impala_udf15FunctionContextERKNS1_9StringValE",
        false, true, false));

    // Regr_intercept()
    db.addBuiltin(AggregateFunction.createBuiltin(db, "regr_intercept",
        Lists.<Type>newArrayList(Type.DOUBLE, Type.DOUBLE), Type.DOUBLE, Type.STRING,
        prefix + "13RegrSlopeInitEPN10impala_udf15FunctionContextEPNS1_9StringValE",
        prefix + "15RegrSlopeUpdateEPN10impala_udf15FunctionContextERKNS1_9DoubleValES6_PNS1_9StringValE",
        prefix + "14RegrSlopeMergeEPN10impala_udf15FunctionContextERKNS1_9StringValEPS4_",
        stringValSerializeOrFinalize,
        prefix + "21RegrInterceptGetValueEPN10impala_udf15FunctionContextERKNS1_9StringValE",
        prefix + "15RegrSlopeRemoveEPN10impala_udf15FunctionContextERKNS1_9DoubleValES6_PNS1_9StringValE",
        prefix + "21RegrInterceptFinalizeEPN10impala_udf15FunctionContextERKNS1_9StringValE",
        false, true, false));

    db.addBuiltin(AggregateFunction.createBuiltin(db, "regr_intercept",
        Lists.<Type>newArrayList(Type.TIMESTAMP, Type.TIMESTAMP), Type.DOUBLE, Type.STRING,
        prefix + "13RegrSlopeInitEPN10impala_udf15FunctionContextEPNS1_9StringValE",
        prefix + "24TimestampRegrSlopeUpdateEPN10impala_udf15FunctionContextERKNS1_12TimestampValES6_PNS1_9StringValE",
        prefix + "14RegrSlopeMergeEPN10impala_udf15FunctionContextERKNS1_9StringValEPS4_",
        stringValSerializeOrFinalize,
        prefix + "21RegrInterceptGetValueEPN10impala_udf15FunctionContextERKNS1_9StringValE",
        prefix + "24TimestampRegrSlopeRemoveEPN10impala_udf15FunctionContextERKNS1_12TimestampValES6_PNS1_9StringValE",
        prefix + "21RegrInterceptFinalizeEPN10impala_udf15FunctionContextERKNS1_9StringValE",
        false, true, false));

    // Covar_samp()
    db.addBuiltin(AggregateFunction.createBuiltin(db, "covar_samp",
        Lists.<Type>newArrayList(Type.DOUBLE, Type.DOUBLE), Type.DOUBLE, Type.STRING,
        prefix + "9CovarInitEPN10impala_udf15FunctionContextEPNS1_9StringValE",
        prefix + "11CovarUpdateEPN10impala_udf15FunctionContextERKNS1_9DoubleValES6_PNS1_9StringValE",
        prefix + "10CovarMergeEPN10impala_udf15FunctionContextERKNS1_9StringValEPS4_",
        stringValSerializeOrFinalize,
        prefix + "19CovarSampleGetValueEPN10impala_udf15FunctionContextERKNS1_9StringValE",
        prefix + "11CovarRemoveEPN10impala_udf15FunctionContextERKNS1_9DoubleValES6_PNS1_9StringValE",
        prefix + "19CovarSampleFinalizeEPN10impala_udf15FunctionContextERKNS1_9StringValE",
        false, true, false));

    db.addBuiltin(AggregateFunction.createBuiltin(db, "covar_samp",
        Lists.<Type>newArrayList(Type.TIMESTAMP, Type.TIMESTAMP), Type.DOUBLE, Type.STRING,
        prefix + "9CovarInitEPN10impala_udf15FunctionContextEPNS1_9StringValE",
        prefix +
                "20TimestampCovarUpdateEPN10impala_udf15FunctionContextERKNS1_12TimestampValES6_PNS1_9StringValE",
        prefix + "10CovarMergeEPN10impala_udf15FunctionContextERKNS1_9StringValEPS4_",
        stringValSerializeOrFinalize,
        prefix + "19CovarSampleGetValueEPN10impala_udf15FunctionContextERKNS1_9StringValE",
        prefix +
                "20TimestampCovarRemoveEPN10impala_udf15FunctionContextERKNS1_12TimestampValES6_PNS1_9StringValE",
        prefix + "19CovarSampleFinalizeEPN10impala_udf15FunctionContextERKNS1_9StringValE",
        false, true, false));

    // Covar_pop()
    db.addBuiltin(AggregateFunction.createBuiltin(db, "covar_pop",
        Lists.<Type>newArrayList(Type.DOUBLE, Type.DOUBLE), Type.DOUBLE, Type.STRING,
        prefix + "9CovarInitEPN10impala_udf15FunctionContextEPNS1_9StringValE",
        prefix + "11CovarUpdateEPN10impala_udf15FunctionContextERKNS1_9DoubleValES6_PNS1_9StringValE",
        prefix + "10CovarMergeEPN10impala_udf15FunctionContextERKNS1_9StringValEPS4_",
        stringValSerializeOrFinalize,
        prefix + "23CovarPopulationGetValueEPN10impala_udf15FunctionContextERKNS1_9StringValE",
        prefix + "11CovarRemoveEPN10impala_udf15FunctionContextERKNS1_9DoubleValES6_PNS1_9StringValE",
        prefix + "23CovarPopulationFinalizeEPN10impala_udf15FunctionContextERKNS1_9StringValE",
        false, true, false));

    db.addBuiltin(AggregateFunction.createBuiltin(db, "covar_pop",
        Lists.<Type>newArrayList(Type.TIMESTAMP, Type.TIMESTAMP), Type.DOUBLE, Type.STRING,
        prefix + "9CovarInitEPN10impala_udf15FunctionContextEPNS1_9StringValE",
        prefix +
                "20TimestampCovarUpdateEPN10impala_udf15FunctionContextERKNS1_12TimestampValES6_PNS1_9StringValE",
        prefix + "10CovarMergeEPN10impala_udf15FunctionContextERKNS1_9StringValEPS4_",
        stringValSerializeOrFinalize,
        prefix + "23CovarPopulationGetValueEPN10impala_udf15FunctionContextERKNS1_9StringValE",
        prefix +
                "20TimestampCovarRemoveEPN10impala_udf15FunctionContextERKNS1_12TimestampValES6_PNS1_9StringValE",
        prefix + "23CovarPopulationFinalizeEPN10impala_udf15FunctionContextERKNS1_9StringValE",
        false, true, false));

    // Avg
    Type avgIntermediateType =
        ScalarType.createFixedUdaIntermediateType(AVG_INTERMEDIATE_SIZE);
    Type decimalAvgIntermediateType =
        ScalarType.createFixedUdaIntermediateType(DECIMAL_AVG_INTERMEDIATE_SIZE);
    db.addBuiltin(AggregateFunction.createBuiltin(db, "avg",
        Lists.<Type>newArrayList(Type.BIGINT), Type.DOUBLE, avgIntermediateType,
        prefix + "7AvgInitEPN10impala_udf15FunctionContextEPNS1_9StringValE",
        prefix + "9AvgUpdateIN10impala_udf9BigIntValEEEvPNS2_15FunctionContextERKT_PNS2_9StringValE",
        prefix + "8AvgMergeEPN10impala_udf15FunctionContextERKNS1_9StringValEPS4_",
        null,
        prefix + "11AvgGetValueEPN10impala_udf15FunctionContextERKNS1_9StringValE",
        prefix + "9AvgRemoveIN10impala_udf9BigIntValEEEvPNS2_15FunctionContextERKT_PNS2_9StringValE",
        prefix + "11AvgFinalizeEPN10impala_udf15FunctionContextERKNS1_9StringValE",
        false, true, false));
    db.addBuiltin(AggregateFunction.createBuiltin(db, "avg",
        Lists.<Type>newArrayList(Type.DOUBLE), Type.DOUBLE, avgIntermediateType,
        prefix + "7AvgInitEPN10impala_udf15FunctionContextEPNS1_9StringValE",
        prefix + "9AvgUpdateIN10impala_udf9DoubleValEEEvPNS2_15FunctionContextERKT_PNS2_9StringValE",
        prefix + "8AvgMergeEPN10impala_udf15FunctionContextERKNS1_9StringValEPS4_",
        null,
        prefix + "11AvgGetValueEPN10impala_udf15FunctionContextERKNS1_9StringValE",
        prefix + "9AvgRemoveIN10impala_udf9DoubleValEEEvPNS2_15FunctionContextERKT_PNS2_9StringValE",
        prefix + "11AvgFinalizeEPN10impala_udf15FunctionContextERKNS1_9StringValE",
        false, true, false));
    db.addBuiltin(AggregateFunction.createBuiltin(db, "avg",
        Lists.<Type>newArrayList(Type.DECIMAL), Type.DECIMAL, decimalAvgIntermediateType,
        prefix + "14DecimalAvgInitEPN10impala_udf15FunctionContextEPNS1_9StringValE",
        prefix + "16DecimalAvgUpdateEPN10impala_udf15FunctionContextERKNS1_10DecimalValEPNS1_9StringValE",
        prefix + "15DecimalAvgMergeEPN10impala_udf15FunctionContextERKNS1_9StringValEPS4_",
        null,
        prefix + "18DecimalAvgGetValueEPN10impala_udf15FunctionContextERKNS1_9StringValE",
        prefix + "16DecimalAvgRemoveEPN10impala_udf15FunctionContextERKNS1_10DecimalValEPNS1_9StringValE",
        prefix + "18DecimalAvgFinalizeEPN10impala_udf15FunctionContextERKNS1_9StringValE",
        false, true, false));
    // Avg(Timestamp)
    db.addBuiltin(AggregateFunction.createBuiltin(db, "avg",
        Lists.<Type>newArrayList(Type.TIMESTAMP), Type.TIMESTAMP, avgIntermediateType,
        prefix + "7AvgInitEPN10impala_udf15FunctionContextEPNS1_9StringValE",
        prefix + "18TimestampAvgUpdateEPN10impala_udf15FunctionContextERKNS1_12TimestampValEPNS1_9StringValE",
        prefix + "8AvgMergeEPN10impala_udf15FunctionContextERKNS1_9StringValEPS4_",
        null,
        prefix + "20TimestampAvgGetValueEPN10impala_udf15FunctionContextERKNS1_9StringValE",
        prefix + "18TimestampAvgRemoveEPN10impala_udf15FunctionContextERKNS1_12TimestampValEPNS1_9StringValE",
        prefix + "20TimestampAvgFinalizeEPN10impala_udf15FunctionContextERKNS1_9StringValE",
        false, true, false));

    // Group_concat(string)
    db.addBuiltin(AggregateFunction.createBuiltin(db, "group_concat",
        Lists.<Type>newArrayList(Type.STRING), Type.STRING, Type.STRING, initNullString,
        prefix +
            "18StringConcatUpdateEPN10impala_udf15FunctionContextERKNS1_9StringValEPS4_",
        prefix +
            "17StringConcatMergeEPN10impala_udf15FunctionContextERKNS1_9StringValEPS4_",
        stringValSerializeOrFinalize,
        prefix +
            "20StringConcatFinalizeEPN10impala_udf15FunctionContextERKNS1_9StringValE",
        false, false, false));
    // Group_concat(string, string)
    db.addBuiltin(AggregateFunction.createBuiltin(db, "group_concat",
        Lists.<Type>newArrayList(Type.STRING, Type.STRING), Type.STRING, Type.STRING,
        initNullString,
        prefix +
            "18StringConcatUpdateEPN10impala_udf15FunctionContextERKNS1_9StringValES6_PS4_",
        prefix +
            "17StringConcatMergeEPN10impala_udf15FunctionContextERKNS1_9StringValEPS4_",
        stringValSerializeOrFinalize,
        prefix +
            "20StringConcatFinalizeEPN10impala_udf15FunctionContextERKNS1_9StringValE",
        false, false, false));

    // analytic functions
    // Rank
    Type rankIntermediateType =
        ScalarType.createFixedUdaIntermediateType(RANK_INTERMEDIATE_SIZE);
    db.addBuiltin(AggregateFunction.createAnalyticBuiltin(db, "rank",
        Lists.<Type>newArrayList(), Type.BIGINT, rankIntermediateType,
        prefix + "8RankInitEPN10impala_udf15FunctionContextEPNS1_9StringValE",
        prefix + "10RankUpdateEPN10impala_udf15FunctionContextEPNS1_9StringValE",
        null,
        prefix + "12RankGetValueEPN10impala_udf15FunctionContextERNS1_9StringValE",
        prefix + "12RankFinalizeEPN10impala_udf15FunctionContextERNS1_9StringValE"));
    // Dense rank
    db.addBuiltin(AggregateFunction.createAnalyticBuiltin(db, "dense_rank",
        Lists.<Type>newArrayList(), Type.BIGINT, rankIntermediateType,
        prefix + "8RankInitEPN10impala_udf15FunctionContextEPNS1_9StringValE",
        prefix + "15DenseRankUpdateEPN10impala_udf15FunctionContextEPNS1_9StringValE",
        null,
        prefix + "17DenseRankGetValueEPN10impala_udf15FunctionContextERNS1_9StringValE",
        prefix + "12RankFinalizeEPN10impala_udf15FunctionContextERNS1_9StringValE"));
    db.addBuiltin(AggregateFunction.createAnalyticBuiltin(
        db, "row_number", new ArrayList<Type>(), Type.BIGINT, Type.BIGINT,
        prefix + "8InitZeroIN10impala_udf9BigIntValEEEvPNS2_15FunctionContextEPT_",
        prefix + "15CountStarUpdateEPN10impala_udf15FunctionContextEPNS1_9BigIntValE",
        prefix + "10CountMergeEPN10impala_udf15FunctionContextERKNS1_9BigIntValEPS4_",
        null, null));

    // DataSketches HLL sketch
    db.addBuiltin(AggregateFunction.createBuiltin(db, "ds_kll_sketch",
        Lists.<Type>newArrayList(Type.FLOAT), Type.STRING, Type.STRING,
        prefix + "9DsKllInitEPN10impala_udf15FunctionContextEPNS1_9StringValE",
        prefix + "11DsKllUpdateEPN10impala_udf15FunctionContextERKNS1_8FloatValEPNS1_" +
            "9StringValE",
        prefix + "10DsKllMergeEPN10impala_udf15FunctionContextERKNS1_9StringValEPS4_",
        prefix + "14DsKllSerializeEPN10impala_udf15FunctionContextERKNS1_9StringValE",
        prefix + "19DsKllFinalizeSketchEPN10impala_udf15FunctionContextERKNS1_" +
            "9StringValE", true, false, true));

    // DataSketches KLL union
    db.addBuiltin(AggregateFunction.createBuiltin(db, "ds_kll_union",
        Lists.<Type>newArrayList(Type.STRING), Type.STRING, Type.STRING,
        prefix + "14DsKllUnionInitEPN10impala_udf15FunctionContextEPNS1_9StringValE",
        prefix +
            "16DsKllUnionUpdateEPN10impala_udf15FunctionContextERKNS1_9StringValEPS4_",
        prefix +
            "15DsKllUnionMergeEPN10impala_udf15FunctionContextERKNS1_9StringValEPS4_",
        prefix +
            "19DsKllUnionSerializeEPN10impala_udf15FunctionContextERKNS1_9StringValE",
        prefix +
            "18DsKllUnionFinalizeEPN10impala_udf15FunctionContextERKNS1_9StringValE",
        true, false, true));

    // The following 3 functions are never directly executed because they get rewritten
    db.addBuiltin(AggregateFunction.createAnalyticBuiltin(
        db, "percent_rank", Lists.<Type>newArrayList(), Type.DOUBLE, Type.STRING));
    db.addBuiltin(AggregateFunction.createAnalyticBuiltin(
        db, "cume_dist", Lists.<Type>newArrayList(), Type.DOUBLE, Type.STRING));
    db.addBuiltin(AggregateFunction.createAnalyticBuiltin(
        db, "ntile", Lists.<Type>newArrayList(Type.BIGINT), Type.BIGINT, Type.STRING));

    // DataSketches HLL union
    db.addBuiltin(AggregateFunction.createBuiltin(db, "ds_hll_union",
        Lists.<Type>newArrayList(Type.STRING), Type.STRING, Type.STRING,
        prefix + "14DsHllUnionInitEPN10impala_udf15FunctionContextEPNS1_9StringValE",
        prefix +
            "16DsHllUnionUpdateEPN10impala_udf15FunctionContextERKNS1_9StringValEPS4_",
        prefix +
            "15DsHllUnionMergeEPN10impala_udf15FunctionContextERKNS1_9StringValEPS4_",
        prefix +
            "19DsHllUnionSerializeEPN10impala_udf15FunctionContextERKNS1_9StringValE",
        prefix +
            "18DsHllUnionFinalizeEPN10impala_udf15FunctionContextERKNS1_9StringValE",
        true, false, true));

    // DataSketches CPC union
    db.addBuiltin(AggregateFunction.createBuiltin(db, "ds_cpc_union",
        Lists.<Type>newArrayList(Type.STRING), Type.STRING, Type.STRING,
        prefix + "14DsCpcUnionInitEPN10impala_udf15FunctionContextEPNS1_9StringValE",
        prefix +
            "16DsCpcUnionUpdateEPN10impala_udf15FunctionContextERKNS1_9StringValEPS4_",
        prefix +
            "15DsCpcUnionMergeEPN10impala_udf15FunctionContextERKNS1_9StringValEPS4_",
        prefix +
            "19DsCpcUnionSerializeEPN10impala_udf15FunctionContextERKNS1_9StringValE",
        prefix +
            "18DsCpcUnionFinalizeEPN10impala_udf15FunctionContextERKNS1_9StringValE",
        true, false, true));

    // DataSketches Theta union
    db.addBuiltin(AggregateFunction.createBuiltin(db, "ds_theta_union",
        Lists.<Type>newArrayList(Type.STRING), Type.STRING, Type.STRING,
        prefix + "16DsThetaUnionInitEPN10impala_udf15FunctionContextEPNS1_9StringValE",
        prefix +
            "18DsThetaUnionUpdateEPN10impala_udf15FunctionContextERKNS1_9StringValEPS4_",
        prefix +
            "17DsThetaUnionMergeEPN10impala_udf15FunctionContextERKNS1_9StringValEPS4_",
        prefix +
            "21DsThetaUnionSerializeEPN10impala_udf15FunctionContextERKNS1_9StringValE",
        prefix +
            "20DsThetaUnionFinalizeEPN10impala_udf15FunctionContextERKNS1_9StringValE",
        true, false, true));

    // DataSketches Theta intersect
    db.addBuiltin(AggregateFunction.createBuiltin(db, "ds_theta_intersect",
        Lists.<Type>newArrayList(Type.STRING), Type.STRING, Type.STRING,
        prefix + "20DsThetaIntersectInitEPN10impala_udf15FunctionContextEPNS1_9StringValE",
        prefix +
            "22DsThetaIntersectUpdateEPN10impala_udf15FunctionContextERKNS1_9StringValEPS4_",
        prefix +
            "21DsThetaIntersectMergeEPN10impala_udf15FunctionContextERKNS1_9StringValEPS4_",
        prefix +
            "25DsThetaIntersectSerializeEPN10impala_udf15FunctionContextERKNS1_9StringValE",
        prefix +
            "24DsThetaIntersectFinalizeEPN10impala_udf15FunctionContextERKNS1_9StringValE",
        true, false, true));

    for (Type t: Type.getSupportedTypes()) {
      if (t.isNull()) continue; // NULL is handled through type promotion.
      if (t.isScalarType(PrimitiveType.CHAR)) continue; // promoted to STRING
      if (t.isScalarType(PrimitiveType.VARCHAR)) continue; // promoted to STRING
      // BINARY is not supported for analytic functions.
      if (t.isBinary()) continue;
      db.addBuiltin(AggregateFunction.createAnalyticBuiltin(
          db, "first_value", Lists.newArrayList(t), t, t,
          t.isStringType() ? initNullString : initNull,
          prefix + FIRST_VALUE_UPDATE_SYMBOL.get(t),
          null,
          t == Type.STRING ? stringValGetValue : null,
          t == Type.STRING ? stringValSerializeOrFinalize : null));
      // Implements FIRST_VALUE for some windows that require rewrites during planning.
      db.addBuiltin(AggregateFunction.createAnalyticBuiltin(
          db, "first_value_rewrite", Lists.newArrayList(t, Type.BIGINT), t, t,
          t.isStringType() ? initNullString : initNull,
          prefix + FIRST_VALUE_REWRITE_UPDATE_SYMBOL.get(t),
          null,
          t == Type.STRING ? stringValGetValue : null,
          t == Type.STRING ? stringValSerializeOrFinalize : null,
          false));
      db.addBuiltin(AggregateFunction.createAnalyticBuiltin(
          db, "first_value_ignore_nulls", Lists.newArrayList(t), t, t,
          t.isStringType() ? initNullString : initNull,
          prefix + FIRST_VALUE_IGNORE_NULLS_UPDATE_SYMBOL.get(t),
          null,
          t == Type.STRING ? stringValGetValue : null,
          t == Type.STRING ? stringValSerializeOrFinalize : null,
          false));

      db.addBuiltin(AggregateFunction.createAnalyticBuiltin(
          db, "last_value", Lists.newArrayList(t), t, t,
          t.isStringType() ? initNullString : initNull,
          prefix + UPDATE_VAL_SYMBOL.get(t),
          prefix + LAST_VALUE_REMOVE_SYMBOL.get(t),
          t == Type.STRING ? stringValGetValue : null,
          t == Type.STRING ? stringValSerializeOrFinalize : null));

      db.addBuiltin(AggregateFunction.createAnalyticBuiltin(
          db, "last_value_ignore_nulls", Lists.newArrayList(t), t, Type.STRING,
          prefix + LAST_VALUE_IGNORE_NULLS_INIT_SYMBOL.get(t),
          prefix + LAST_VALUE_IGNORE_NULLS_UPDATE_SYMBOL.get(t),
          prefix + LAST_VALUE_IGNORE_NULLS_REMOVE_SYMBOL.get(t),
          prefix + LAST_VALUE_IGNORE_NULLS_GET_VALUE_SYMBOL.get(t),
          prefix + LAST_VALUE_IGNORE_NULLS_FINALIZE_SYMBOL.get(t),
          false));

      db.addBuiltin(AggregateFunction.createAnalyticBuiltin(
          db, "lag", Lists.newArrayList(t, Type.BIGINT, t), t, t,
          prefix + OFFSET_FN_INIT_SYMBOL.get(t),
          prefix + OFFSET_FN_UPDATE_SYMBOL.get(t),
          null,
          t == Type.STRING ? stringValGetValue : null,
          t == Type.STRING ? stringValSerializeOrFinalize : null));
      db.addBuiltin(AggregateFunction.createAnalyticBuiltin(
          db, "lead", Lists.newArrayList(t, Type.BIGINT, t), t, t,
          prefix + OFFSET_FN_INIT_SYMBOL.get(t),
          prefix + OFFSET_FN_UPDATE_SYMBOL.get(t),
          null,
          t == Type.STRING ? stringValGetValue : null,
          t == Type.STRING ? stringValSerializeOrFinalize : null));

      // lead() and lag() the default offset and the default value should be
      // rewritten to call the overrides that take all parameters.
      db.addBuiltin(AggregateFunction.createAnalyticBuiltin(
            db, "lag", Lists.newArrayList(t), t, t));
      db.addBuiltin(AggregateFunction.createAnalyticBuiltin(
            db, "lag", Lists.newArrayList(t, Type.BIGINT), t, t));
      db.addBuiltin(AggregateFunction.createAnalyticBuiltin(
            db, "lead", Lists.newArrayList(t), t, t));
      db.addBuiltin(AggregateFunction.createAnalyticBuiltin(
            db, "lead", Lists.newArrayList(t, Type.BIGINT), t, t));
    }

    // Grouping ID functions for grouping sets. These are rewritten during analysis.
    db.addBuiltin(AggregateFunction.createRewrittenBuiltin(db, "grouping_id",
        Collections.<Type>emptyList(), Type.BIGINT, /*ignoresDistinct=*/ true,
        /*isAnalyticFn=*/ false, /*returnsNonNullOnEmpty=*/ true));
    // grouping() can take any grouping expression as input.
    for (Type t: Type.getSupportedTypes()) {
      db.addBuiltin(AggregateFunction.createRewrittenBuiltin(db, "grouping",
          Lists.newArrayList(t), Type.TINYINT, /*ignoresDistinct=*/ true,
          /*isAnalyticFn=*/ false, /*returnsNonNullOnEmpty=*/ true));
    }
  }