On Mon, 2025-08-11 at 17:39 +0800, Japin Li wrote:
>
> 1.
> +static struct
> +{
> + int transfn_oid; /* Transition function's funcoid.
> Arrays are
> + * sorted in ascending order */
> + Oid transtype; /* Transition data type */
> + PGFunction merge_trans; /* Function pointer set required for
> parallel
> + * aggregation for each transfn_oid
> */
> + vci_aggtranstype_kind kind; /* If transtype is INTERNALOID, its
> details */
> +} trans_funcs_table[] = {
> + {F_FLOAT4_ACCUM, 1022, merge_floatX_accum,
> VCI_AGG_NOT_INTERNAL}, /* 208 */
> + {F_FLOAT8_ACCUM, 1022, merge_floatX_accum,
> VCI_AGG_NOT_INTERNAL}, /* 222 */
> + {F_INT8INC, 20, int8pl, VCI_AGG_NOT_INTERNAL}, /* 1833 */
> + {F_NUMERIC_ACCUM, 2281, numeric_combine,
> VCI_AGG_NUMERIC_AGG_STATE}, /* 1834 */
> + {F_INT2_ACCUM, 2281, numeric_poly_combine,
> VCI_AGG_POLY_NUM_AGG_STATE}, /* 1836 */
> + {F_INT4_ACCUM, 2281, numeric_poly_combine,
> VCI_AGG_POLY_NUM_AGG_STATE}, /* 1835 */
> + {F_INT8_ACCUM, 2281, numeric_combine,
> VCI_AGG_NUMERIC_AGG_STATE}, /* 1836 */
> + {F_INT2_SUM, 20, int8pl, VCI_AGG_NOT_INTERNAL}, /* 1840 */
> + {F_INT4_SUM, 20, int8pl, VCI_AGG_NOT_INTERNAL}, /* 1841 */
> + {F_INTERVAL_AVG_COMBINE, 2281, merge_interval_avg_accum,
> VCI_AGG_NOT_INTERNAL}, /* 3325 */
> + {F_INT2_AVG_ACCUM, 1016, merge_intX_accum,
> VCI_AGG_NOT_INTERNAL}, /* 1962 */
> + {F_INT4_AVG_ACCUM, 1016, merge_intX_accum,
> VCI_AGG_NOT_INTERNAL}, /* 1963 */
> + {F_INT8INC_ANY, 20, int8pl, VCI_AGG_NOT_INTERNAL}, /* 2804 */
> + {F_INT8_AVG_ACCUM, 2281, int8_avg_combine,
> VCI_AGG_POLY_AVG_NUM_AGG_STATE}, /* 2746 */
> + {F_NUMERIC_AVG_ACCUM, 2281, numeric_avg_combine,
> VCI_AGG_AVG_NUMERIC_AGG_STATE}, /* 2858 */
> +};
>
> The comments state that this is sorted in ascending order, but the
> code doesn't
> follow that rule. While the current linear search works, a future
> change to
> binary search could cause problems.
>
Hi Japin!
I've looked at the code, vci_set_merge_and_copy_trans_funcs() function
is unused and almost all code of vci_aggmergetranstype.c file including
trans_funcs_table[] can be either removed either replaced with simple
switch-case. Only transfn_oid fields of trans_funcs_table[] were
actually used. Here is my patch made on top of v17.
Peter, what do you think? Is it OK to remove those code?
--
Regards,
Timur Magomedov
From 08bd1cdfe1e0ee41776fe4d439b0febecaca09e8 Mon Sep 17 00:00:00 2001
From: Timur Magomedov <[email protected]>
Date: Wed, 13 Aug 2025 19:04:49 +0300
Subject: [PATCH] Removed vci_set_merge_and_copy_trans_funcs()
The function was unused. Some code that only was used
in this function was removed also.
---
contrib/vci/executor/vci_aggmergetranstype.c | 395 +------------------
contrib/vci/include/postgresql_copy.h | 58 ---
contrib/vci/include/vci_executor.h | 1 -
contrib/vci/include/vci_pg_copy.h | 29 +-
4 files changed, 24 insertions(+), 459 deletions(-)
diff --git a/contrib/vci/executor/vci_aggmergetranstype.c b/contrib/vci/executor/vci_aggmergetranstype.c
index 4c136e8660a..52ac7cb2b05 100644
--- a/contrib/vci/executor/vci_aggmergetranstype.c
+++ b/contrib/vci/executor/vci_aggmergetranstype.c
@@ -36,74 +36,6 @@
#include "postgresql_copy.h"
-static Datum merge_intX_accum(PG_FUNCTION_ARGS);
-static Datum merge_floatX_accum(PG_FUNCTION_ARGS);
-static Datum merge_interval_avg_accum(PG_FUNCTION_ARGS);
-
-static Datum copy_numeric_agg_state(Datum src, bool typByVal, int typLen);
-static Datum copy_numeric_avg_agg_state(Datum src, bool typByVal, int typLen);
-static Datum copy_poly_num_agg_state(Datum src, bool typByVal, int typLen);
-static Datum copy_poly_avg_num_agg_state(Datum src, bool typByVal, int typLen);
-
-/**
- * If Transition data is INTERNALOID, an enum indicating its type
- */
-typedef enum vci_aggtranstype_kind
-{
- VCI_AGG_NOT_INTERNAL, /* not INTERNALOID */
- VCI_AGG_NUMERIC_AGG_STATE, /* INTERNALOID (use NumericAggState struct) */
- VCI_AGG_POLY_NUM_AGG_STATE, /* INTERNALOID (use PolyNumAggState struct) */
- VCI_AGG_POLY_AVG_NUM_AGG_STATE, /* INTERNALOID (use PolyNumAggState
- * without sumx2 struct) */
- VCI_AGG_AVG_NUMERIC_AGG_STATE, /* INTERNALOID (use NumericAggState
- * without sumx2 struct) */
- VCI_AGG_ARRAY_BUILD_STATE, /* INTERNALOID (use ArrayBuildState struct) */
-} vci_aggtranstype_kind;
-
-/**
- * Record information necessary for parallel aggregation for each transition function
- */
-static struct
-{
- int transfn_oid; /* Transition function's funcoid. Arrays are
- * sorted in ascending order */
- Oid transtype; /* Transition data type */
- PGFunction merge_trans; /* Function pointer set required for parallel
- * aggregation for each transfn_oid */
- vci_aggtranstype_kind kind; /* If transtype is INTERNALOID, its details */
-} trans_funcs_table[] = {
- {F_FLOAT4_ACCUM, 1022, merge_floatX_accum, VCI_AGG_NOT_INTERNAL}, /* 208 */
- {F_FLOAT8_ACCUM, 1022, merge_floatX_accum, VCI_AGG_NOT_INTERNAL}, /* 222 */
- {F_INT8INC, 20, int8pl, VCI_AGG_NOT_INTERNAL}, /* 1833 */
- {F_NUMERIC_ACCUM, 2281, numeric_combine, VCI_AGG_NUMERIC_AGG_STATE}, /* 1834 */
- {F_INT2_ACCUM, 2281, numeric_poly_combine, VCI_AGG_POLY_NUM_AGG_STATE}, /* 1836 */
- {F_INT4_ACCUM, 2281, numeric_poly_combine, VCI_AGG_POLY_NUM_AGG_STATE}, /* 1835 */
- {F_INT8_ACCUM, 2281, numeric_combine, VCI_AGG_NUMERIC_AGG_STATE}, /* 1836 */
- {F_INT2_SUM, 20, int8pl, VCI_AGG_NOT_INTERNAL}, /* 1840 */
- {F_INT4_SUM, 20, int8pl, VCI_AGG_NOT_INTERNAL}, /* 1841 */
- {F_INTERVAL_AVG_COMBINE, 2281, merge_interval_avg_accum, VCI_AGG_NOT_INTERNAL}, /* 3325 */
- {F_INT2_AVG_ACCUM, 1016, merge_intX_accum, VCI_AGG_NOT_INTERNAL}, /* 1962 */
- {F_INT4_AVG_ACCUM, 1016, merge_intX_accum, VCI_AGG_NOT_INTERNAL}, /* 1963 */
- {F_INT8INC_ANY, 20, int8pl, VCI_AGG_NOT_INTERNAL}, /* 2804 */
- {F_INT8_AVG_ACCUM, 2281, int8_avg_combine, VCI_AGG_POLY_AVG_NUM_AGG_STATE}, /* 2746 */
- {F_NUMERIC_AVG_ACCUM, 2281, numeric_avg_combine, VCI_AGG_AVG_NUMERIC_AGG_STATE}, /* 2858 */
-};
-
-/**
- * If INTEROID, copy functions, SEND function, RECV function
- */
-static vci_agg_trans_copy_funcs trans_internal_type_funcs_table[] = {
- {datumCopy, NULL, NULL}, /* VCI_AGG_NOT_INTERNAL */
- {copy_numeric_agg_state, numeric_serialize, numeric_deserialize}, /* VCI_AGG_NUMERIC_AGG_STATE
- * */
- {copy_poly_num_agg_state, numeric_poly_serialize, numeric_poly_deserialize}, /* VCI_AGG_NUMERIC_POLY_AGG_STATE
- * */
- {copy_poly_avg_num_agg_state, int8_avg_serialize, int8_avg_deserialize}, /* VCI_AGG_POLY_AVG_NUM_AGG_STATE
- * */
- {copy_numeric_avg_agg_state, numeric_avg_serialize, numeric_avg_deserialize}, /* VCI_AGG_AVG_NUMERIC_AGG_STATE
- * */
-};
-
/**
* Determine if the given aggregation function is a type that can be supported by VCI
*
@@ -166,15 +98,28 @@ vci_is_supported_aggregation(Aggref *aggref)
}
else
{
- int i;
-
- for (i = 0; i < lengthof(trans_funcs_table); i++)
+ switch (transfn_oid)
{
- if (transfn_oid == trans_funcs_table[i].transfn_oid)
- {
+ case F_FLOAT4_ACCUM:
+ case F_FLOAT8_ACCUM:
+ case F_INT8INC:
+ case F_NUMERIC_ACCUM:
+ case F_INT2_ACCUM:
+ case F_INT4_ACCUM:
+ case F_INT8_ACCUM:
+ case F_INT2_SUM:
+ case F_INT4_SUM:
+ case F_INTERVAL_AVG_COMBINE:
+ case F_INT2_AVG_ACCUM:
+ case F_INT4_AVG_ACCUM:
+ case F_INT8INC_ANY:
+ case F_INT8_AVG_ACCUM:
+ case F_NUMERIC_AVG_ACCUM:
ret = true;
break;
- }
+
+ default:
+ break;
}
}
@@ -185,305 +130,3 @@ vci_is_supported_aggregation(Aggref *aggref)
return ret;
}
-
-/**
- * Obtain the merge and copy-related functions for the transition internal state
- * generated by the given transition function.
- *
- * @param[in] transfn_oid specify a transition function
- * @param[out] merge_trans_p set the merge function
- * @param[out] copy_trans_p set the copy function
- * @param[out] send_trans_p set the send function
- * @param[out] recv_trans_p set the recv function
- *
- * @retval true Found the copy and merge function
- * @retval false Not exist
- *
- * @note Output parameters are set only if the return value is true.
- */
-bool
-vci_set_merge_and_copy_trans_funcs(Oid transfn_oid, PGFunction *merge_trans_p, VciCopyDatumFunc *copy_trans_p, PGFunction *send_trans_p, PGFunction *recv_trans_p)
-{
- int i;
-
- for (i = 0; i < lengthof(trans_funcs_table); i++)
- {
- if (transfn_oid == trans_funcs_table[i].transfn_oid)
- {
- vci_aggtranstype_kind kind = trans_funcs_table[i].kind;
-
- *merge_trans_p = trans_funcs_table[i].merge_trans;
- *copy_trans_p = trans_internal_type_funcs_table[kind].copy_trans;
- *send_trans_p = trans_internal_type_funcs_table[kind].send_trans;
- *recv_trans_p = trans_internal_type_funcs_table[kind].recv_trans;
-
- return true;
- }
- }
-
- return false;
-}
-
-static Datum
-merge_intX_accum(PG_FUNCTION_ARGS)
-{
- ArrayType *transarray0 = PG_GETARG_ARRAYTYPE_P(0);
- ArrayType *transarray1 = PG_GETARG_ARRAYTYPE_P(1);
- Int8TransTypeData *transdata0;
- Int8TransTypeData *transdata1;
-
- transdata0 = (Int8TransTypeData *) ARR_DATA_PTR(transarray0);
- transdata1 = (Int8TransTypeData *) ARR_DATA_PTR(transarray1);
-
- transdata0->count += transdata1->count;
- transdata0->sum += transdata1->sum;
-
- PG_RETURN_ARRAYTYPE_P(transarray0);
-}
-
-static Datum
-merge_floatX_accum(PG_FUNCTION_ARGS)
-{
- ArrayType *transarray1 = PG_GETARG_ARRAYTYPE_P(0);
- ArrayType *transarray2 = PG_GETARG_ARRAYTYPE_P(1);
- float8 *transvalues1;
- float8 *transvalues2;
- float8 N1,
- Sx1,
- Sxx1,
- N2,
- Sx2,
- Sxx2,
- tmp,
- N,
- Sx,
- Sxx;
-
- transvalues1 = check_float8_array(transarray1, "merge_floatX_accum", 3);
- transvalues2 = check_float8_array(transarray2, "merge_floatX_accum", 3);
-
- N1 = transvalues1[0];
- Sx1 = transvalues1[1];
- Sxx1 = transvalues1[2];
-
- N2 = transvalues2[0];
- Sx2 = transvalues2[1];
- Sxx2 = transvalues2[2];
-
- /*--------------------
- * The transition values combine using a generalization of the
- * Youngs-Cramer algorithm as follows:
- *
- * N = N1 + N2
- * Sx = Sx1 + Sx2
- * Sxx = Sxx1 + Sxx2 + N1 * N2 * (Sx1/N1 - Sx2/N2)^2 / N;
- *
- * It's worth handling the special cases N1 = 0 and N2 = 0 separately
- * since those cases are trivial, and we then don't need to worry about
- * division-by-zero errors in the general case.
- *--------------------
- */
- if (N1 == 0.0)
- {
- N = N2;
- Sx = Sx2;
- Sxx = Sxx2;
- }
- else if (N2 == 0.0)
- {
- N = N1;
- Sx = Sx1;
- Sxx = Sxx1;
- }
- else
- {
- N = N1 + N2;
- /* Sx = float8_pl(Sx1, Sx2); */
- Sx = Sx1 + Sx2;
- CHECKFLOATVAL(Sx, isinf(Sx1) || isinf(Sx2), true);
- tmp = Sx1 / N1 - Sx2 / N2;
- Sxx = Sxx1 + Sxx2 + N1 * N2 * tmp * tmp / N;
- CHECKFLOATVAL(Sxx, isinf(Sxx1) || isinf(Sxx2), true);
- }
-
- transvalues1[0] = N;
- transvalues1[1] = Sx;
- transvalues1[2] = Sxx;
-
- PG_RETURN_ARRAYTYPE_P(transarray1);
-}
-
-static Datum
-merge_interval_avg_accum(PG_FUNCTION_ARGS)
-{
- IntervalAggState *state1;
- IntervalAggState *state2;
-
- state1 = PG_ARGISNULL(0) ? NULL : (IntervalAggState *) PG_GETARG_POINTER(0);
- state2 = PG_ARGISNULL(1) ? NULL : (IntervalAggState *) PG_GETARG_POINTER(1);
-
-
- /* Create the state data on the first call */
- if (state2 == NULL)
- PG_RETURN_POINTER(state1);
-
- if (state1 == NULL)
- {
- state1 = makeIntervalAggState(fcinfo);
-
- state1->N = state2->N;
- state1->pInfcount = state2->pInfcount;
- state1->nInfcount = state2->nInfcount;
-
- state1->sumX.day = state2->sumX.day;
- state1->sumX.month = state2->sumX.month;
- state1->sumX.time = state2->sumX.time;
-
- PG_RETURN_POINTER(state1);
- }
-
- state1->N += state2->N;
- state1->pInfcount += state2->pInfcount;
- state1->nInfcount += state2->nInfcount;
-
- /* Accumulate finite interval values, if any. */
- if (state2->N > 0)
- finite_interval_pl(&state1->sumX, &state2->sumX, &state1->sumX);
-
- PG_RETURN_POINTER(state1);
-}
-
-/*****************************************************************************/
-/* numeric */
-/*****************************************************************************/
-
-/*
- * Copy an accumulator's state.
- *
- * 'dst' is assumed to be uninitialized beforehand. No attempt is made at
- * freeing old values.
- *
- * copied from src/backend/utils/adt/numeric.c
- */
-static void
-accum_sum_copy(NumericSumAccum *dst, NumericSumAccum *src)
-{
- dst->pos_digits = palloc0(src->ndigits * sizeof(int32));
- dst->neg_digits = palloc0(src->ndigits * sizeof(int32));
-
- memcpy(dst->pos_digits, src->pos_digits, src->ndigits * sizeof(int32));
- memcpy(dst->neg_digits, src->neg_digits, src->ndigits * sizeof(int32));
- dst->num_uncarried = src->num_uncarried;
- dst->ndigits = src->ndigits;
- dst->weight = src->weight;
- dst->dscale = src->dscale;
-}
-
-static Datum
-copy_numeric_agg_state(Datum src, bool typByVal, int typLen)
-{
- NumericAggState *from,
- *to;
-
- from = (NumericAggState *) DatumGetPointer(src);
-
- if (from == NULL)
- return (Datum) NULL;
-
- to = palloc0(sizeof(NumericAggState));
-
- to->calcSumX2 = from->calcSumX2;
- to->agg_context = CurrentMemoryContext;
- to->N = from->N;
- to->NaNcount = from->NaNcount;
- to->pInfcount = from->pInfcount;
- to->nInfcount = from->nInfcount;
- to->maxScale = from->maxScale;
- to->maxScaleCount = from->maxScaleCount;
-
- accum_sum_copy(&to->sumX, &from->sumX);
- accum_sum_copy(&to->sumX2, &from->sumX2);
-
- return PointerGetDatum(to);
-}
-
-static Datum
-copy_numeric_avg_agg_state(Datum src, bool typByVal, int typLen)
-{
- NumericAggState *from,
- *to;
-
- from = (NumericAggState *) DatumGetPointer(src);
-
- if (from == NULL)
- return (Datum) NULL;
-
- to = palloc0(sizeof(NumericAggState));
-
- to->calcSumX2 = from->calcSumX2;
- to->agg_context = CurrentMemoryContext;
- to->N = from->N;
- to->NaNcount = from->NaNcount;
- to->pInfcount = from->pInfcount;
- to->nInfcount = from->nInfcount;
- to->maxScale = from->maxScale;
- to->maxScaleCount = from->maxScaleCount;
-
- accum_sum_copy(&to->sumX, &from->sumX);
-
- return PointerGetDatum(to);
-}
-
-static Datum
-copy_poly_num_agg_state(Datum src, bool typByVal, int typLen)
-{
- PolyNumAggState *from,
- *to;
-
- from = (PolyNumAggState *) DatumGetPointer(src);
-
- if (from == NULL)
- return (Datum) NULL;
-
- to = palloc0(sizeof(PolyNumAggState));
-
- to->calcSumX2 = from->calcSumX2;
- to->N = from->N;
-
-#ifdef HAVE_INT128
- to->sumX = from->sumX;
- to->sumX2 = from->sumX2;
-#else
- to->agg_context = CurrentMemoryContext;
- accum_sum_copy(&to->sumX, &from->sumX);
- accum_sum_copy(&to->sumX2, &from->sumX2);
-#endif
-
- return PointerGetDatum(to);
-}
-
-static Datum
-copy_poly_avg_num_agg_state(Datum src, bool typByVal, int typLen)
-{
- PolyNumAggState *from,
- *to;
-
- from = (PolyNumAggState *) DatumGetPointer(src);
-
- if (from == NULL)
- return (Datum) NULL;
-
- to = palloc0(sizeof(PolyNumAggState));
-
- to->calcSumX2 = from->calcSumX2;
- to->N = from->N;
-
-#ifdef HAVE_INT128
- to->sumX = from->sumX;
-#else
- to->agg_context = CurrentMemoryContext;
- accum_sum_copy(&to->sumX, &from->sumX);
-#endif
-
- return PointerGetDatum(to);
-}
diff --git a/contrib/vci/include/postgresql_copy.h b/contrib/vci/include/postgresql_copy.h
index aec0bb97f9e..aedfe7a3184 100644
--- a/contrib/vci/include/postgresql_copy.h
+++ b/contrib/vci/include/postgresql_copy.h
@@ -60,70 +60,12 @@ check_float8_array(ArrayType *transarray, const char *caller, int n)
return (float8 *) ARR_DATA_PTR(transarray);
}
-/*
- * src/backend/utils/adt/numeric.c
- */
-typedef struct NumericSumAccum
-{
- int ndigits;
- int weight;
- int dscale;
- int num_uncarried;
- bool have_carry_space;
- int32 *pos_digits;
- int32 *neg_digits;
-} NumericSumAccum;
-
-typedef struct NumericAggState
-{
- bool calcSumX2; /* if true, calculate sumX2 */
- MemoryContext agg_context; /* context we're calculating in */
- int64 N; /* count of processed numbers */
- NumericSumAccum sumX; /* sum of processed numbers */
- NumericSumAccum sumX2; /* sum of squares of processed numbers */
- int maxScale; /* maximum scale seen so far */
- int64 maxScaleCount; /* number of values seen with maximum scale */
- /* These counts are *not* included in N! Use NA_TOTAL_COUNT() as needed */
- int64 NaNcount; /* count of NaN values */
- int64 pInfcount; /* count of +Inf values */
- int64 nInfcount; /* count of -Inf values */
-} NumericAggState;
-
typedef struct Int8TransTypeData
{
int64 count;
int64 sum;
} Int8TransTypeData;
-/*
- * Integer data types in general use Numeric accumulators to share code
- * and avoid risk of overflow.
- *
- * However for performance reasons optimized special-purpose accumulator
- * routines are used when possible.
- *
- * On platforms with 128-bit integer support, the 128-bit routines will be
- * used when sum(X) or sum(X*X) fit into 128-bit.
- *
- * For 16 and 32 bit inputs, the N and sum(X) fit into 64-bit so the 64-bit
- * accumulators will be used for SUM and AVG of these data types.
- */
-
-#ifdef HAVE_INT128
-typedef struct Int128AggState
-{
- bool calcSumX2; /* if true, calculate sumX2 */
- int64 N; /* count of processed numbers */
- int128 sumX; /* sum of processed numbers */
- int128 sumX2; /* sum of squares of processed numbers */
-} Int128AggState;
-
-typedef Int128AggState PolyNumAggState;
-#else
-typedef NumericAggState PolyNumAggState;
-#endif
-
-
#ifdef VCI_USE_CMP_FUNC
/*
* interval_relop - is interval1 relop interval2
diff --git a/contrib/vci/include/vci_executor.h b/contrib/vci/include/vci_executor.h
index af9fc539c9b..2f57b85b380 100644
--- a/contrib/vci/include/vci_executor.h
+++ b/contrib/vci/include/vci_executor.h
@@ -857,7 +857,6 @@ typedef struct vci_agg_trans_copy_funcs
} vci_agg_trans_copy_funcs;
extern bool vci_is_supported_aggregation(Aggref *aggref);
-extern bool vci_set_merge_and_copy_trans_funcs(Oid transfn_oid, PGFunction *merge_trans_p, VciCopyDatumFunc *copy_trans_p, PGFunction *send_trans_p, PGFunction *recv_trans_p);
/* ----------------
* vci_gather.c
diff --git a/contrib/vci/include/vci_pg_copy.h b/contrib/vci/include/vci_pg_copy.h
index ff6b465baed..8b0f2860998 100644
--- a/contrib/vci/include/vci_pg_copy.h
+++ b/contrib/vci/include/vci_pg_copy.h
@@ -1,17 +1,17 @@
/*-------------------------------------------------------------------------
*
- * vci_numeric.h
+ * vci_pg_copy.h
* Some useful functions of PostgreSQL
*
* Portions Copyright (c) 2025, PostgreSQL Global Development Group
*
* IDENTIFICATION
- * contrib/vci/include/vci_numeric.h
+ * contrib/vci/include/vci_pg_copy.h
*-------------------------------------------------------------------------
*/
-#ifndef VCI_NUMERIC_H
-#define VCI_NUMERIC_H
+#ifndef VCI_PG_COPY_H
+#define VCI_PG_COPY_H
#include "datatype/timestamp.h"
@@ -54,23 +54,4 @@ typedef struct NumericVar
NumericDigit *digits; /* base-NBASE digits */
} NumericVar;
-/* taken from src/backend/utils/adt/timestamp.c */
-static inline TimeOffset
-interval_cmp_value(const Interval *interval)
-{
- TimeOffset span;
-
- span = interval->time;
-
-#ifdef HAVE_INT64_TIMESTAMP
- span += interval->month * INT64CONST(30) * USECS_PER_DAY;
- span += interval->day * INT64CONST(24) * USECS_PER_HOUR;
-#else
- span += interval->month * ((double) DAYS_PER_MONTH * SECS_PER_DAY);
- span += interval->day * ((double) HOURS_PER_DAY * SECS_PER_HOUR);
-#endif
-
- return span;
-}
-
-#endif /* #ifndef VCI_NUMERIC_H */
+#endif /* #ifndef VCI_PG_COPY_H */
--
2.43.0