1
0
mirror of https://github.com/postgres/postgres.git synced 2025-11-19 13:42:17 +03:00

Add min and max aggregates for bytea type.

Similar to a0f1fce80, although we chose to duplicate logic
rather than invoke byteacmp, primarily to avoid repeat detoasting.

Marat Buharov, Aleksander Alekseev

Discussion: https://postgr.es/m/CAPCEVGXiASjodos4P8pgyV7ixfVn-ZgG9YyiRZRbVqbGmfuDyg@mail.gmail.com
This commit is contained in:
Tom Lane
2024-10-08 13:52:14 -04:00
parent 57f3702471
commit 2d24fd942c
8 changed files with 99 additions and 5 deletions

View File

@@ -3931,6 +3931,44 @@ byteacmp(PG_FUNCTION_ARGS)
PG_RETURN_INT32(cmp);
}
Datum
bytea_larger(PG_FUNCTION_ARGS)
{
bytea *arg1 = PG_GETARG_BYTEA_PP(0);
bytea *arg2 = PG_GETARG_BYTEA_PP(1);
bytea *result;
int len1,
len2;
int cmp;
len1 = VARSIZE_ANY_EXHDR(arg1);
len2 = VARSIZE_ANY_EXHDR(arg2);
cmp = memcmp(VARDATA_ANY(arg1), VARDATA_ANY(arg2), Min(len1, len2));
result = ((cmp > 0) || ((cmp == 0) && (len1 > len2)) ? arg1 : arg2);
PG_RETURN_BYTEA_P(result);
}
Datum
bytea_smaller(PG_FUNCTION_ARGS)
{
bytea *arg1 = PG_GETARG_BYTEA_PP(0);
bytea *arg2 = PG_GETARG_BYTEA_PP(1);
bytea *result;
int len1,
len2;
int cmp;
len1 = VARSIZE_ANY_EXHDR(arg1);
len2 = VARSIZE_ANY_EXHDR(arg2);
cmp = memcmp(VARDATA_ANY(arg1), VARDATA_ANY(arg2), Min(len1, len2));
result = ((cmp < 0) || ((cmp == 0) && (len1 < len2)) ? arg1 : arg2);
PG_RETURN_BYTEA_P(result);
}
Datum
bytea_sortsupport(PG_FUNCTION_ARGS)
{