34 namespace datum_impl {
37 static_assert(
sizeof(
DatumRep) == 8,
"Pointers are not 64-bit.");
61 template<
class DatumImpl>
70 return (
const char*) &
val();
78 return ((
bool) ((
val()) != 0));
86 return ((
char) (
val()));
94 return ((int8_t) (
val()));
102 return ((uint8_t) (
val()));
110 return ((int16_t) (
val()));
118 return ((uint16_t) (
val()));
126 return ((int32_t) (
val()));
134 return ((uint32_t) (
val()));
150 return (int64_t)
val();
158 return (uint64_t)
val();
182 return ((
void*) (
val()));
191 return reinterpret_cast<T* const
>(
val());
197 return static_cast<const DatumImpl&
>(*this).m_val;
201 template<
class DatumImpl>
202 class DatumRefVarlenGetters;
263 memcpy(
this, &d,
sizeof(
Datum));
269 #pragma GCC diagnostic push
270 #pragma GCC diagnostic ignored "-Wclass-memaccess"
272 memset(&d, 0,
sizeof(
Datum));
274 #pragma GCC diagnostic pop
284 memcpy(
this, &d,
sizeof(
Datum));
288 #pragma GCC diagnostic push
289 #pragma GCC diagnostic ignored "-Wclass-memaccess"
291 memset(&d, 0,
sizeof(
Datum));
293 #pragma GCC diagnostic pop
309 return (
const char *)
m_val;
328 return absl::string_view((
const char *)
m_val,
m_size);
468 size_t len = std::strlen(str);
469 if (len > std::numeric_limits<uint32_t>::max()) {
470 LOG(
kFatal,
"cstring is too long: %lu", len);
505 size_t len = std::strlen(str.get());
506 if (len > std::numeric_limits<uint32_t>::max()) {
507 LOG(
kFatal,
"cstring is too long: %lu", len);
552 if (!bytes.get() ||
isnull) {
600 LOG(
kError,
"unexpected pass-by-value data length %u", size);
628 memcpy(bytes_copy.get(), bytes, size);
720 template<
class DatumImpl>
722 template<
class DatumImpl>
729 namespace datum_impl {
731 template<
class DatumImpl>
738 constexpr
const char*
763 constexpr absl::string_view
766 ->GetVarlenAsStringView();
796 if (((DatumImpl&)(*
this)).isnull()) {
876 LOG(
kFatal,
"casting NULL datum to a DatumRef");
914 uint32_t total_sz =
MAXALIGN(n *
sizeof(uint32_t));
915 for (
size_t i = 0; i < n; ++i) {
921 auto off =
reinterpret_cast<uint32_t*
>(bytes.get());
923 uint32_t cur_off =
MAXALIGN(n *
sizeof(uint32_t));
924 auto payload =
reinterpret_cast<char*
>(bytes.get());
925 for (
size_t i = 0; i < n; ++i) {
926 if (data[i].m_isvarlen) {
927 memcpy(payload + cur_off, (
const char*) data[i].m_val,
929 cur_off +=
MAXALIGN(data[i].m_size);
930 }
else if (!data[i].m_isnull) {
936 off[i + 1] = cur_off;
938 if (data[i].m_isvarlen) {
942 ASSERT(cur_off == total_sz);
949 template<
class SomeDatum>
952 return *
reinterpret_cast<const uint32_t*
>(d.GetVarlenBytes())
960 template<
class SomeDatum>
967 off =
MAXALIGN(n *
sizeof(uint32_t));
969 off =
reinterpret_cast<const uint32_t*
>(d.GetVarlenBytes())[i]
974 end_off = d.GetVarlenSize();
976 end_off =
reinterpret_cast<const uint32_t*
>(
979 if (end_off == off) {
984 reinterpret_cast<const uint32_t*
>(d.GetVarlenBytes())[i]) {
A DatumRef object is a read-only reference to an C++ object of a supported runtime type.
Definition: datum.h:823
DatumRef(datum_impl::DatumRep val)
Definition: datum.h:838
DatumRef(const Datum &d)
Definition: datum.h:825
datum_impl::DatumRep m_val
Definition: datum.h:841
constexpr bool isnull() const
Definition: datum.h:833
DatumRef(const DatumRef &)=default
DatumRef & operator=(const DatumRef &)=default
A Datum stores and possibly manage the memory resource of a read-only value of a plain fixed-length C...
Definition: datum.h:250
static Datum From(int32_t X)
Returns datum representation for a 32-bit integer.
Definition: datum.h:399
uint32_t m_size
The length of the variable-length value of the datum.
Definition: datum.h:713
const Datum & GetThis() const
Returns a constant reference to ‘*this’.
Definition: datum.h:335
Datum(datum_impl::DatumRep value)
Definition: datum.h:659
static Datum FromCString(const char *str, bool isnull)
Definition: datum.h:484
Datum(const Datum &)=default
~Datum()
Definition: datum.h:252
static Datum FromVarlenAsStringView(absl::string_view bytes)
Returns datum representation of a variable-length object stored as an absl::string_view that is not o...
Definition: datum.h:563
static Datum FromVarlenBytes(const char *bytes, uint32_t size)
Returns datum representation of a variable-length object that is not owned by this datum.
Definition: datum.h:517
static Datum FromCString(std::unique_ptr< char[]> str, bool isnull=false)
Returns datum representation of a null-terminated string that is owned by this datum.
Definition: datum.h:502
static Datum From(int16_t X)
Returns datum representation for a 16-bit integer.
Definition: datum.h:383
Datum & operator=(Datum &&d)
Move assignment operator of Datum.
Definition: datum.h:283
static Datum From(void *X)
Returns datum representation for a pointer.
Definition: datum.h:418
uint32_t GetVarlenSize() const
Returns the size of the variable-length value of a datum.
Definition: datum.h:316
static Datum From(double X)
Returns datum representation for a double-precision floating point number.
Definition: datum.h:455
static Datum From(char X)
Returns datum representation for a character.
Definition: datum.h:359
bool m_isvarlen
Whether the managed object is a variable-length object that is not a null-terminated string.
Definition: datum.h:707
static Datum From(int8_t X)
Returns datum representation for an 8-bit integer.
Definition: datum.h:367
static Datum From(bool X)
Returns datum representation for a boolean.
Definition: datum.h:351
static Datum From(uint64_t X)
Returns datum representation for an unsigned 64-bit integer.
Definition: datum.h:436
bool m_isowned
Whether the managed object is owned by this Datum.
Definition: datum.h:696
static Datum From(uint8_t X)
Returns datum representation for an 8-bit unsigned integer.
Definition: datum.h:375
datum_impl::DatumRep m_val
The actual value storage.
Definition: datum.h:718
bool HasExternalRef() const
Whether this datum is variable-length but does not own its byte array.
Definition: datum.h:612
absl::string_view GetVarlenAsStringView() const
Definition: datum.h:327
bool isnull() const
Definition: datum.h:300
const char * GetVarlenBytes() const
Returns the variable-length value of a datum as an array of bytes.
Definition: datum.h:308
Datum(datum_impl::DatumRep value, bool isowned, uint32_t size)
Constructs a Datum with a non-null and non-variable-length value (except for CString).
Definition: datum.h:677
static Datum FromNull()
Definition: datum.h:343
Datum Copy() const
Makes a shallow copy of this datum.
Definition: datum.h:640
Datum & operator=(const Datum &)=default
Datum DeepCopy() const
Returns a deep copy of this datum so that HasExternalRef() == false and the owned value is a copy of ...
Definition: datum.h:621
static Datum From(uint16_t X)
Returns datum representation for a 16-bit unsigned integer.
Definition: datum.h:391
static Datum FromVarlenBytes(const char *bytes, uint32_t size, bool isnull)
Returns datum representation of a variable-length object that is not owned by this datum if isnull is...
Definition: datum.h:527
Datum(Datum &&d)
Move constructor of Datum.
Definition: datum.h:262
static Datum From(T &&X, bool isnull)
This template version of From accepts a second argument isnull and returns a Datum with a null value ...
Definition: datum.h:577
Datum()
Constructs a Datum with a null value.
Definition: datum.h:652
static Datum From(float X)
Returns datum representation for a single-precision floating point number.
Definition: datum.h:446
bool m_isnull
Whether the value is null.
Definition: datum.h:701
static Datum From(uint32_t X)
Returns datum representation for a 32-bit unsigned integer.
Definition: datum.h:410
static Datum FromVarlenBytes(unique_malloced_ptr bytes, uint32_t size, bool isnull=false)
Returns datum representation of a variable-length object that is owned by this datum.
Definition: datum.h:550
static Datum FromCString(const char *str)
Returns datum representation of a null-terminated string that is not owned by this datum.
Definition: datum.h:467
static Datum FromFixedlenBytes(const char *bytes, uint32_t size)
Returns a fixed-length datum that is passed by value by copying its binary representation.
Definition: datum.h:586
static Datum From(int64_t X)
Returns datum representation for a signed 64-bit integer.
Definition: datum.h:427
NullableDatumRef(const NullableDatumRef &)=default
NullableDatumRef(const DatumRef &d)
Definition: datum.h:867
NullableDatumRef & operator=(const NullableDatumRef &)=default
datum_impl::DatumRep m_val
Definition: datum.h:887
NullableDatumRef(const Datum &d)
Definition: datum.h:863
bool m_isnull
Definition: datum.h:886
constexpr bool isnull() const
Definition: datum.h:881
Datum DeepCopy(bool isbyref) const
Returns a new Datum that is a deep copy of the underlying datum.
Definition: datum.h:795
constexpr const char * GetVarlenBytes() const
Returns the variable-length value of a datum as an array of bytes.
Definition: datum.h:739
constexpr absl::string_view GetVarlenAsStringView() const
Definition: datum.h:764
constexpr uint32_t GetVarlenSize() const
Returns the length of the variable-length value of a datum.
Definition: datum.h:748
constexpr Datum & GetDatum() const
Returns a reference to the underlying datum if this references one with a variable-length value.
Definition: datum.h:777
constexpr uint32_t GetUInt32() const
Returns 32-bit unsigned integer value of a datum.
Definition: datum.h:133
constexpr int32_t GetInt32() const
Returns 32-bit integer value of a datum.
Definition: datum.h:125
constexpr float GetFloat() const
Returns single-precision floating point value of a datum.
Definition: datum.h:165
constexpr bool GetBool() const
Returns boolean value of a datum.
Definition: datum.h:77
constexpr double GetDouble() const
Returns double-precision floating point value of a datum.
Definition: datum.h:173
constexpr const DatumRep & val() const
Definition: datum.h:196
constexpr int8_t GetInt8() const
Returns 8-bit integer value of a datum.
Definition: datum.h:93
constexpr uint8_t GetUInt8() const
Returns 8-bit unsigned integer value of a datum.
Definition: datum.h:101
constexpr int64_t GetInt64() const
Returns 64-bit integer value of a datum.
Definition: datum.h:149
constexpr T * GetPointerAs() const
Returns the pointer value of a datum as const T*.
Definition: datum.h:190
constexpr int16_t GetInt16() const
Returns 16-bit integer value of a datum.
Definition: datum.h:109
constexpr uint64_t GetUInt64() const
Returns 64-bit unsigned integer value of a datum.
Definition: datum.h:157
constexpr const char * GetFixedlenBytes() const
Return the pointer to the binary representation of a fixed-length datum that is passed by value.
Definition: datum.h:69
constexpr void * GetPointer() const
Returns pointer value of a datum.
Definition: datum.h:181
constexpr uint16_t GetUInt16() const
Returns 16-bit unsigned integer value of a datum.
Definition: datum.h:117
constexpr char GetChar() const
Returns character value of a datum.
Definition: datum.h:85
constexpr Oid GetOid() const
Returns object identifier value of a datum.
Definition: datum.h:141
#define LOG(level,...)
LOG(LogSeverity level, const char *fmt, ...)
Definition: logging.h:116
uintptr_t DatumRep
Definition: datum.h:36
constexpr LogSeverity kFatal
Definition: logging.h:22
constexpr LogSeverity kError
Definition: logging.h:21
uint32_t Oid
Definition: tdb_base.h:210
DataArray is a plain byte array that can be stored as a Datum itself and stores the data of a few dat...
Definition: datum.h:903
static Datum From(const Datum *data, uint32_t n)
Makes a deep copy of the data and stores them in a data array.
Definition: datum.h:913
constexpr static uint32_t VARLEN_MASK
Definition: datum.h:904
static Datum GetDatum(SomeDatum &&d, size_t i)
Returns the ith Datum of the DataArray stored in d.
Definition: datum.h:962
static size_t GetArrayLength(SomeDatum &&d)
Returns the array length of the DataArray stored in d.
Definition: datum.h:951
#define MAXALIGN(LEN)
Definition: tdb_base.h:327
unique_malloced_ptr unique_aligned_alloc(size_t alignment, size_t size)
Wraps an aligned_alloced'd memory space in a std::unique_ptr.
Definition: tdb_base.h:101
#define ASSERT(...)
Definition: tdb_base.h:190
std::unique_ptr< void, AlignedAllocImpl::FreeMem > unique_malloced_ptr
Definition: tdb_base.h:94
Note from PostgreSQL: Float <-> Datum conversions.
Definition: datum.h:56
double double_v
Definition: datum.h:58
int64_t int64_v
Definition: datum.h:57
Note from PostgreSQL: Float <-> Datum conversions.
Definition: datum.h:45
int32_t int32_v
Definition: datum.h:46
float float_v
Definition: datum.h:47