23#include "utils/fmgrprotos.h"
31#define NS_PER_S INT64CONST(1000000000)
32#define NS_PER_MS INT64CONST(1000000)
33#define NS_PER_US INT64CONST(1000)
34#define US_PER_MS INT64CONST(1000)
41#define PG_UNIX_EPOCH_OFFSET_US \
42 ((int64) (POSTGRES_EPOCH_JDATE - UNIX_EPOCH_JDATE) * SECS_PER_DAY * USECS_PER_SEC)
49#define UUIDV7_MIN_TIMESTAMP (-PG_UNIX_EPOCH_OFFSET_US)
50#define UUIDV7_MAX_TIMESTAMP \
51 (((INT64CONST(1) << 48) - 1) * US_PER_MS - PG_UNIX_EPOCH_OFFSET_US)
68#if defined(__darwin__) || defined(_MSC_VER)
69#define SUBMS_MINIMAL_STEP_BITS 10
71#define SUBMS_MINIMAL_STEP_BITS 12
74#define SUBMS_MINIMAL_STEP_NS ((NS_PER_MS / (1 << SUBMS_MINIMAL_STEP_BITS)) + 1)
109 static const char hex_chars[] =
"0123456789abcdef";
127 if (
i == 4 ||
i == 6 ||
i == 8 ||
i == 10)
130 hi =
uuid->data[
i] >> 4;
131 lo =
uuid->data[
i] & 0x0F;
164 if (src[0] ==
'\0' || src[1] ==
'\0')
174 if (src[0] ==
'-' && (
i % 2) == 1 &&
i <
UUID_LEN - 1)
193 errmsg(
"invalid input syntax for type %s: \"%s\"",
327 uss->input_count = 0;
328 uss->estimating =
true;
379 if (abbr_card > 100000.0)
383 "uuid_abbrev: estimation ends at cardinality %f"
385 abbr_card,
uss->input_count, memtupcount);
386 uss->estimating =
false;
400 "uuid_abbrev: aborting abbreviation at cardinality %f"
401 " below threshold %f after " INT64_FORMAT " values (%d rows)",
402 abbr_card,
uss->input_count / 2000.0 + 0.5,
uss->input_count,
410 " values (%d rows)", abbr_card,
uss->input_count, memtupcount);
430 uss->input_count += 1;
463 if (
uuid->data[
i] > 0)
546 uuid->data[6] = (
uuid->data[6] & 0x0f) | (version << 4);
549 uuid->data[8] = (
uuid->data[8] & 0x3f) | 0x80;
566 errmsg(
"could not generate random values")));
608 ns = tmp.tv_sec *
NS_PER_S + tmp.tv_nsec;
663 errmsg(
"could not generate random values")));
665#if SUBMS_MINIMAL_STEP_BITS == 10
714 errmsg(
"interval out of range for UUID version 7"),
715 errdetail(
"UUID version 7 does not support infinite intervals.")));
739 errmsg(
"timestamp out of range for UUID version 7"),
740 errdetail(
"UUID version 7 supports timestamps from 1970-01-01 to approximately year 10889.")));
755#define GREGORIAN_EPOCH_JDATE INT64CONST(2299161)
771 if ((
uuid->data[8] & 0xc0) != 0x80)
774 version =
uuid->data[6] >> 4;
824 if ((
uuid->data[8] & 0xc0) != 0x80)
827 version =
uuid->data[6] >> 4;
Datum timestamptz_pl_interval(PG_FUNCTION_ARGS)
memcpy(sums, checksumBaseOffsets, sizeof(checksumBaseOffsets))
#define INTERVAL_NOT_FINITE(i)
#define POSTGRES_EPOCH_JDATE
int errcode(int sqlerrcode)
#define ereturn(context, dummy_value,...)
int errdetail(const char *fmt,...) pg_attribute_printf(1
#define ereport(elevel,...)
struct SortSupportData * SortSupport
#define palloc_object(type)
#define PG_RETURN_BYTEA_P(x)
#define DirectFunctionCall2(func, arg1, arg2)
#define PG_GETARG_POINTER(n)
#define PG_RETURN_CSTRING(x)
#define PG_GETARG_CSTRING(n)
#define PG_GETARG_INT64(n)
#define PG_RETURN_INT32(x)
#define PG_RETURN_UINT16(x)
#define PG_RETURN_POINTER(x)
#define PG_RETURN_BOOL(x)
static Datum hash_uint32(uint32 k)
static Datum hash_any_extended(const unsigned char *k, int keylen, uint64 seed)
static Datum hash_any(const unsigned char *k, int keylen)
void initHyperLogLog(hyperLogLogState *cState, uint8 bwidth)
double estimateHyperLogLog(hyperLogLogState *cState)
void addHyperLogLog(hyperLogLogState *cState, uint32 hash)
void pfree(void *pointer)
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
#define DatumBigEndianToNative(x)
static rewind_source * source
static char buf[DEFAULT_XLOG_SEG_SIZE]
void syntax_error(const char *source, int lineno, const char *line, const char *command, const char *msg, const char *more, int column)
bool pg_strong_random(void *buf, size_t len)
static uint32 DatumGetUInt32(Datum X)
static uint64 DatumGetUInt64(Datum X)
struct SkipSupportData * SkipSupport
struct StringInfoData * StringInfo
SkipSupportIncDec decrement
SkipSupportIncDec increment
int(* comparator)(Datum x, Datum y, SortSupport ssup)
Datum(* abbrev_converter)(Datum original, SortSupport ssup)
int(* abbrev_full_comparator)(Datum x, Datum y, SortSupport ssup)
bool(* abbrev_abort)(int memtupcount, SortSupport ssup)
hyperLogLogState abbr_card
int ssup_datum_unsigned_cmp(Datum x, Datum y, SortSupport ssup)
static Datum TimestampTzGetDatum(TimestampTz X)
static Datum IntervalPGetDatum(const Interval *X)
#define PG_GETARG_INTERVAL_P(n)
#define PG_RETURN_TIMESTAMPTZ(x)
static TimestampTz DatumGetTimestampTz(Datum X)
Datum uuid_skipsupport(PG_FUNCTION_ARGS)
Datum uuid_send(PG_FUNCTION_ARGS)
static void string_to_uuid(const char *source, pg_uuid_t *uuid, Node *escontext)
static bool uuid_abbrev_abort(int memtupcount, SortSupport ssup)
#define GREGORIAN_EPOCH_JDATE
Datum uuidv7_interval(PG_FUNCTION_ARGS)
Datum uuid_lt(PG_FUNCTION_ARGS)
Datum uuid_gt(PG_FUNCTION_ARGS)
Datum uuid_larger(PG_FUNCTION_ARGS)
Datum gen_random_uuid(PG_FUNCTION_ARGS)
Datum uuid_recv(PG_FUNCTION_ARGS)
Datum uuid_cmp(PG_FUNCTION_ARGS)
static void uuid_set_version(pg_uuid_t *uuid, unsigned char version)
Datum uuid_le(PG_FUNCTION_ARGS)
#define SUBMS_MINIMAL_STEP_NS
#define UUIDV7_MAX_TIMESTAMP
static int64 get_real_time_ns_ascending(void)
#define PG_UNIX_EPOCH_OFFSET_US
Datum uuid_extract_version(PG_FUNCTION_ARGS)
Datum uuid_hash_extended(PG_FUNCTION_ARGS)
Datum uuid_out(PG_FUNCTION_ARGS)
Datum uuid_ne(PG_FUNCTION_ARGS)
Datum uuid_smaller(PG_FUNCTION_ARGS)
static int uuid_internal_cmp(const pg_uuid_t *arg1, const pg_uuid_t *arg2)
Datum uuid_ge(PG_FUNCTION_ARGS)
static Datum uuid_increment(Relation rel, Datum existing, bool *overflow)
Datum uuid_eq(PG_FUNCTION_ARGS)
static pg_uuid_t * generate_uuidv7(uint64 unix_ts_ms, uint32 sub_ms)
static int uuid_fast_cmp(Datum x, Datum y, SortSupport ssup)
Datum uuid_in(PG_FUNCTION_ARGS)
static Datum uuid_decrement(Relation rel, Datum existing, bool *underflow)
static Datum uuid_abbrev_convert(Datum original, SortSupport ssup)
Datum uuidv7(PG_FUNCTION_ARGS)
Datum uuid_extract_timestamp(PG_FUNCTION_ARGS)
Datum uuid_sortsupport(PG_FUNCTION_ARGS)
static pg_uuid_t * DatumGetUUIDP(Datum X)
#define PG_RETURN_UUID_P(X)
static Datum UUIDPGetDatum(const pg_uuid_t *X)
#define PG_GETARG_UUID_P(X)
int gettimeofday(struct timeval *tp, void *tzp)