in query/binder.hpp [316:426]
int bind() {
InputVectorBinderBase<Context, NumVectors, NumUnboundIterators - 1>
nextBinder(context, inputVectors, indexVector, baseCounts, startCount);
InputVector input = inputVectors[NumVectors - NumUnboundIterators];
if (input.Type == VectorPartyInput) {
VectorPartySlice inputVP = input.Vector.VP;
DataType dataType = inputVP.DataType;
uint8_t *basePtr = inputVP.BasePtr;
bool hasDefault = inputVP.DefaultValue.HasDefault;
DefaultValue defaultValue = inputVP.DefaultValue;
uint32_t nullsOffset = inputVP.NullsOffset;
uint32_t valuesOffset = inputVP.ValuesOffset;
uint8_t startingIndex = inputVP.StartingIndex;
uint8_t stepInBytes = getStepInBytes(inputVP.DataType);
uint32_t length = inputVP.Length;
// This macro will bind column type with width > 4 bytes (GeoPoint, UUID
// int64). Since our scratch space is always 4 bytes (int32, uint32,
// float), parent nodes for those wider types must be a root node.
#define BIND_WIDER_COLUMN_INPUT(dataType, defaultValue) \
if (basePtr == nullptr) { \
return nextBinder.bind(thrust::make_constant_iterator( \
thrust::make_tuple<dataType, bool>( \
defaultValue, hasDefault))); \
} \
return nextBinder.bind(make_column_iterator<dataType>( \
indexVector, baseCounts, startCount, basePtr, nullsOffset, \
valuesOffset, length, stepInBytes, startingIndex));
switch (dataType) {
case GeoPoint:
BIND_WIDER_COLUMN_INPUT(GeoPointT, defaultValue.Value.GeoPointVal)
case UUID:
BIND_WIDER_COLUMN_INPUT(UUIDT, defaultValue.Value.UUIDVal)
case Int64:
BIND_WIDER_COLUMN_INPUT(int64_t, defaultValue.Value.Int64Val)
default: break;
}
} else if (input.Type == ForeignColumnInput) {
RecordID *recordIDs = input.Vector.ForeignVP.RecordIDs;
const int32_t numBatches = input.Vector.ForeignVP.NumBatches;
const int32_t baseBatchID = input.Vector.ForeignVP.BaseBatchID;
VectorPartySlice *vpSlices = input.Vector.ForeignVP.Batches;
const int32_t numRecordsInLastBatch =
input.Vector.ForeignVP.NumRecordsInLastBatch;
DataType dataType = input.Vector.ForeignVP.DataType;
bool hasDefault = input.Vector.ForeignVP.DefaultValue.HasDefault;
DefaultValue defaultValueStruct = input.Vector.ForeignVP.DefaultValue;
uint8_t stepInBytes = getStepInBytes(dataType);
#define BIND_WIDER_FOREIGN_COLUMN_INPUT(defaultValue, dataType) { \
ForeignTableIterator<dataType> *vpIters = \
prepareForeignTableIterators(numBatches, vpSlices, stepInBytes, \
hasDefault, defaultValue, context.getStream()); \
int res = nextBinder.bind(RecordIDJoinIterator<dataType>( \
recordIDs, numBatches, baseBatchID, \
vpIters, numRecordsInLastBatch, \
nullptr, 0)); \
deviceFree(vpIters); \
return res; \
}
switch (dataType) {
case UUID: BIND_WIDER_FOREIGN_COLUMN_INPUT(
defaultValueStruct.Value.UUIDVal, UUIDT)
case Int64: BIND_WIDER_FOREIGN_COLUMN_INPUT(
defaultValueStruct.Value.Int64Val, int64_t)
default: break;
}
} else if (input.Type == ArrayVectorPartyInput) {
// Array type can only bind to first argument for BinaryTransformer
ArrayVectorPartySlice inputVP = input.Vector.ArrayVP;
uint8_t *basePtr = inputVP.OffsetLengthVector;
uint32_t length = inputVP.Length;
int valueOffsetAdj = inputVP.ValueOffsetAdj;
#define BIND_ARRAY_COLUMN_INPUT(dataType) \
return nextBinder.bind(make_array_column_iterator<dataType>( \
basePtr, valueOffsetAdj, length));
switch (inputVP.DataType) {
case Bool:
BIND_ARRAY_COLUMN_INPUT(bool)
case Int8:
BIND_ARRAY_COLUMN_INPUT(int8_t)
case Int16:
BIND_ARRAY_COLUMN_INPUT(int16_t)
case Int32:
BIND_ARRAY_COLUMN_INPUT(int32_t)
case Uint8:
BIND_ARRAY_COLUMN_INPUT(uint8_t)
case Uint16:
BIND_ARRAY_COLUMN_INPUT(uint16_t)
case Uint32:
BIND_ARRAY_COLUMN_INPUT(uint32_t)
case Float32:
BIND_ARRAY_COLUMN_INPUT(float_t)
case Int64:
BIND_ARRAY_COLUMN_INPUT(int64_t)
case UUID:
BIND_ARRAY_COLUMN_INPUT(UUIDT)
case GeoPoint:
BIND_ARRAY_COLUMN_INPUT(GeoPointT)
default:
throw std::invalid_argument(
"Unsupported data type for ArrayVectorPartyInput: " +
std::to_string(__LINE__));
}
}
return bindGeneric();
}