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
287 memcpy(
this, &d,
sizeof(
Datum));
291 #pragma GCC diagnostic push
292 #pragma GCC diagnostic ignored "-Wclass-memaccess"
294 memset(&d, 0,
sizeof(
Datum));
296 #pragma GCC diagnostic pop
312 return (
char *)
m_val;
331 return absl::string_view((
const char *)
m_val,
m_size);
471 size_t len = std::strlen(str);
472 if (len > std::numeric_limits<uint32_t>::max()) {
473 LOG(
kFatal,
"cstring is too long: %lu", len);
508 size_t len = std::strlen(str.get());
509 if (len > std::numeric_limits<uint32_t>::max()) {
510 LOG(
kFatal,
"cstring is too long: %lu", len);
555 if (!bytes.get() ||
isnull) {
603 LOG(
kError,
"unexpected pass-by-value data length %u", size);
631 memcpy(bytes_copy.get(), bytes, size);
723 template<
class DatumImpl>
725 template<
class DatumImpl>
732 namespace datum_impl {
734 template<
class DatumImpl>
766 constexpr absl::string_view
769 ->GetVarlenAsStringView();
799 if (((DatumImpl&)(*
this)).isnull()) {
879 LOG(
kFatal,
"casting NULL datum to a DatumRef");
917 uint32_t total_sz =
MAXALIGN(n *
sizeof(uint32_t));
918 for (
size_t i = 0; i < n; ++i) {
924 auto off =
reinterpret_cast<uint32_t*
>(bytes.get());
926 uint32_t cur_off =
MAXALIGN(n *
sizeof(uint32_t));
927 auto payload =
reinterpret_cast<char*
>(bytes.get());
928 for (
size_t i = 0; i < n; ++i) {
929 if (data[i].m_isvarlen) {
930 memcpy(payload + cur_off, (
const char*) data[i].m_val,
932 cur_off +=
MAXALIGN(data[i].m_size);
933 }
else if (!data[i].m_isnull) {
939 off[i + 1] = cur_off;
941 if (data[i].m_isvarlen) {
945 ASSERT(cur_off == total_sz);
952 template<
class SomeDatum>
955 return *
reinterpret_cast<const uint32_t*
>(d.GetVarlenBytes())
963 template<
class SomeDatum>
970 off =
MAXALIGN(n *
sizeof(uint32_t));
972 off =
reinterpret_cast<const uint32_t*
>(d.GetVarlenBytes())[i]
977 end_off = d.GetVarlenSize();
979 end_off =
reinterpret_cast<const uint32_t*
>(
982 if (end_off == off) {
987 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:826
DatumRef(datum_impl::DatumRep val)
Definition: datum.h:841
DatumRef(const Datum &d)
Definition: datum.h:828
datum_impl::DatumRep m_val
Definition: datum.h:844
constexpr bool isnull() const
Definition: datum.h:836
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:402
uint32_t m_size
The length of the variable-length value of the datum.
Definition: datum.h:716
const Datum & GetThis() const
Returns a constant reference to ‘*this’.
Definition: datum.h:338
Datum(datum_impl::DatumRep value)
Definition: datum.h:662
static Datum FromCString(const char *str, bool isnull)
Definition: datum.h:487
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:566
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:520
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:505
static Datum From(int16_t X)
Returns datum representation for a 16-bit integer.
Definition: datum.h:386
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:421
uint32_t GetVarlenSize() const
Returns the size of the variable-length value of a datum.
Definition: datum.h:319
static Datum From(double X)
Returns datum representation for a double-precision floating point number.
Definition: datum.h:458
static Datum From(char X)
Returns datum representation for a character.
Definition: datum.h:362
bool m_isvarlen
Whether the managed object is a variable-length object that is not a null-terminated string.
Definition: datum.h:710
static Datum From(int8_t X)
Returns datum representation for an 8-bit integer.
Definition: datum.h:370
static Datum From(bool X)
Returns datum representation for a boolean.
Definition: datum.h:354
static Datum From(uint64_t X)
Returns datum representation for an unsigned 64-bit integer.
Definition: datum.h:439
bool m_isowned
Whether the managed object is owned by this Datum.
Definition: datum.h:699
static Datum From(uint8_t X)
Returns datum representation for an 8-bit unsigned integer.
Definition: datum.h:378
datum_impl::DatumRep m_val
The actual value storage.
Definition: datum.h:721
bool HasExternalRef() const
Whether this datum is variable-length but does not own its byte array.
Definition: datum.h:615
absl::string_view GetVarlenAsStringView() const
Definition: datum.h:330
bool isnull() const
Definition: datum.h:303
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:680
static Datum FromNull()
Definition: datum.h:346
Datum Copy() const
Makes a shallow copy of this datum.
Definition: datum.h:643
Datum & operator=(const Datum &)=default
char * GetVarlenBytes() const
Returns the variable-length value of a datum as an array of bytes.
Definition: datum.h:311
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:624
static Datum From(uint16_t X)
Returns datum representation for a 16-bit unsigned integer.
Definition: datum.h:394
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:530
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:580
Datum()
Constructs a Datum with a null value.
Definition: datum.h:655
static Datum From(float X)
Returns datum representation for a single-precision floating point number.
Definition: datum.h:449
bool m_isnull
Whether the value is null.
Definition: datum.h:704
static Datum From(uint32_t X)
Returns datum representation for a 32-bit unsigned integer.
Definition: datum.h:413
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:553
static Datum FromCString(const char *str)
Returns datum representation of a null-terminated string that is not owned by this datum.
Definition: datum.h:470
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:589
static Datum From(int64_t X)
Returns datum representation for a signed 64-bit integer.
Definition: datum.h:430
NullableDatumRef(const NullableDatumRef &)=default
NullableDatumRef(const DatumRef &d)
Definition: datum.h:870
NullableDatumRef & operator=(const NullableDatumRef &)=default
datum_impl::DatumRep m_val
Definition: datum.h:890
NullableDatumRef(const Datum &d)
Definition: datum.h:866
bool m_isnull
Definition: datum.h:889
constexpr bool isnull() const
Definition: datum.h:884
Datum DeepCopy(bool isbyref) const
Returns a new Datum that is a deep copy of the underlying datum.
Definition: datum.h:798
constexpr absl::string_view GetVarlenAsStringView() const
Definition: datum.h:767
constexpr char * GetVarlenBytes() const
Returns the variable-length value of a datum as an array of bytes.
Definition: datum.h:742
constexpr uint32_t GetVarlenSize() const
Returns the length of the variable-length value of a datum.
Definition: datum.h:751
constexpr Datum & GetDatum() const
Returns a reference to the underlying datum if this references one with a variable-length value.
Definition: datum.h:780
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:217
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:906
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:916
constexpr static uint32_t VARLEN_MASK
Definition: datum.h:907
static Datum GetDatum(SomeDatum &&d, size_t i)
Returns the ith Datum of the DataArray stored in d.
Definition: datum.h:965
static size_t GetArrayLength(SomeDatum &&d)
Returns the array length of the DataArray stored in d.
Definition: datum.h:954
#define MAXALIGN(LEN)
Definition: tdb_base.h:334
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:107
#define ASSERT(...)
Definition: tdb_base.h:197
std::unique_ptr< void, AlignedAllocImpl::FreeMem > unique_malloced_ptr
Definition: tdb_base.h:100
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